LCOV - code coverage report
Current view: top level - star/private - rsp_relax_env.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 734 0
Test Date: 2025-05-08 18:23:42 Functions: 0.0 % 2 0

            Line data    Source code
       1              : ! ***********************************************************************
       2              : !
       3              : !   Copyright (C) 2018-2019  Radek Smolec & The MESA Team
       4              : !
       5              : !   This program is free software: you can redistribute it and/or modify
       6              : !   it under the terms of the GNU Lesser General Public License
       7              : !   as published by the Free Software Foundation,
       8              : !   either version 3 of the License, or (at your option) any later version.
       9              : !
      10              : !   This program is distributed in the hope that it will be useful,
      11              : !   but WITHOUT ANY WARRANTY; without even the implied warranty of
      12              : !   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
      13              : !   See the GNU Lesser General Public License for more details.
      14              : !
      15              : !   You should have received a copy of the GNU Lesser General Public License
      16              : !   along with this program. If not, see <https://www.gnu.org/licenses/>.
      17              : !
      18              : ! ***********************************************************************
      19              : 
      20              :       module rsp_relax_env
      21              :       use star_def, only: star_info
      22              :       use utils_lib, only: is_bad, mesa_error
      23              :       use const_def, only: dp, crad
      24              :       use eos_lib, only: Radiation_Pressure
      25              :       use rsp_def
      26              :       use rsp_eval_eos_and_kap, only: X, Y, Z
      27              :       use rsp_lina, only: mesa_eos_kap
      28              : 
      29              :       implicit none
      30              : 
      31              :       private
      32              :       public :: EOP, RELAX_ENV
      33              : 
      34              :       contains
      35              : 
      36            0 :       subroutine EOP(s,k,T,P,V,E,CP,QQ,SVEL,OP,ierr)
      37              :       use rsp_eval_eos_and_kap, only: &
      38              :          eval1_mesa_Rho_given_PT, eval1_gamma_PT_getRho
      39              :       type (star_info), pointer :: s
      40              :       integer, intent(out) :: ierr
      41            0 :       real(dp) :: T,V,P1,DPV,E,OP,F2,P,SVEL,CP,QQ
      42            0 :       real(dp) :: DU1,DU2,DU3,DU4,DU5,DU6,DU7,DU8,DU9
      43              :       integer :: k,i
      44              : 
      45            0 :       real(dp) :: R,A,PRECEQ,rho_guess,rho,Prad,P_test
      46              :       data R,A/8.317d7,7.5641d-15/
      47              :       data PRECEQ/5.d-13/
      48              : 
      49            0 :       if(P<=0.d0) GOTO 100  !negative pressure, stop
      50              : 
      51            0 :       ierr = 0
      52            0 :       Prad = Radiation_Pressure(T)
      53            0 :       if (P <= Prad) then
      54            0 :          write(*,*) 'P <= Prad', k, P, Prad, T
      55            0 :          ierr = -1
      56            0 :          return
      57              :          call mesa_error(__FILE__,__LINE__,'EOP')
      58              :       end if
      59            0 :       rho_guess = eval1_gamma_PT_getRho(s, 0, P, T, ierr)
      60            0 :       if (ierr /= 0) then
      61            0 :          write(*,*) 'eval1_gamma_PT_getRho failed', k
      62            0 :          write(*,*) 'P', P
      63            0 :          write(*,*) 'T', T
      64            0 :          ierr = -1
      65            0 :          return
      66              :          call mesa_error(__FILE__,__LINE__,'EOP')
      67              :       end if
      68            0 :       call eval1_mesa_Rho_given_PT(s, 0, P, T, rho_guess, rho, ierr)
      69            0 :       if (ierr /= 0) then
      70            0 :          write(*,*) 'eval1_mesa_Rho_given_PT failed', k
      71            0 :          write(*,*) 'P', P
      72            0 :          write(*,*) 'T', T
      73            0 :          write(*,*) 'rho_guess', rho_guess
      74            0 :          ierr = -1
      75            0 :          return
      76              :          call mesa_error(__FILE__,__LINE__,'EOP')
      77              :       end if
      78            0 :       V = 1d0/rho  ! initial guess to be improved below
      79              : 
      80              :          !write(*,*) 'eval1_mesa_Rho_given_PT', k
      81              :          !write(*,*) 'P', P
      82              :          !write(*,*) 'T', T
      83              :          !write(*,*) 'rho_guess', rho_guess
      84              :          !write(*,*) 'V', 0, V
      85              : 
      86            0 :       I=0
      87              :       !     NEWTON-RAPHSON ITERATION (TO MAKE P1->P)
      88            0 :  1    I=I+1
      89              :       call mesa_eos_kap(s,0, &
      90              :         T,V,P1,DPV,DU1,E,DU2,DU3,CP,DU4,DU5,QQ,DU6,DU7,OP &
      91            0 :            ,DU8,DU9,ierr)
      92            0 :       if (ierr /= 0) return
      93            0 :       if(I>25) GOTO 2  !no convergence, stop
      94            0 :       F2=P1/P-1.d0
      95            0 :       V=V-F2*P/DPV
      96            0 :       if (is_bad(V)) then
      97            0 :          write(*,*) 'V', V
      98            0 :          write(*,*) 'F2', F2
      99            0 :          write(*,*) 'DPV', DPV
     100            0 :          write(*,*) 'P', P
     101            0 :          write(*,*) 'EOP I', I
     102            0 :          ierr = -1
     103            0 :          return
     104              :          stop
     105              :       end if
     106              : 
     107              :          !write(*,*) 'V', I, V
     108              : 
     109            0 :       if(abs(F2)<PRECEQ) GOTO 3
     110            0 :       GOTO 1
     111              :  3    continue
     112              :        if (abs(P - P_test) > 1d-10*P) then
     113              :        end if
     114            0 :       return
     115              : 
     116            0 :  2    write(*,*) 'NO CONVERGENCE IN EOP; T,P= ',T,P
     117            0 :          ierr = -1
     118            0 :          return
     119            0 :       stop
     120            0 :  100  write(*,*) 'NEGATIVE OR ZERO PRESSURE IN EOP'
     121            0 :          ierr = -1
     122            0 :          return
     123              :       stop
     124            0 :       end subroutine EOP
     125              : 
     126              : 
     127            0 :       subroutine RELAX_ENV(s, L0, TH0, TE, NZT, NZN, &
     128            0 :          M, DM, DM_BAR, R, Vol, T, Et, ierr)
     129            0 :       use star_utils, only: rand
     130              :       type (star_info), pointer :: s
     131              :       integer, intent(in) :: NZN, NZT
     132              :       real(dp), intent(in) :: L0, TH0, TE
     133              :       real(dp), intent(inout), dimension(:) :: &
     134              :          M, DM, DM_BAR, R, Vol, T, Et
     135              :       integer, intent(out) :: ierr
     136              : 
     137              :       logical, parameter :: RSP_eddi = .true.  ! use Eddington approx at surface
     138              : 
     139              :       real(dp), allocatable, dimension(:) :: &
     140            0 :          E, P, Lr, Lc, Hp_face, Y_face, K, CPS, QQS, &
     141            0 :          dC_dr_in,dC_dr_00,dC_dr_out,dC_dT_00,dC_dT_out, &
     142            0 :          dC_dw_00,dC_dr_in2,dC_dT_in, &
     143            0 :          DPV,dP_dT_00,DEV,dE_dT_00,dK_dV_00, &
     144            0 :          dK_dT_00,DVR,DVRM, &
     145            0 :          CPV, dCp_dT_00, QQV,dQQ_dT_00, &
     146            0 :          dP_dr_00, dCp_dr_00, dQQ_dr_00, &
     147            0 :          dP_dr_in,dCp_dr_in,dQQ_dr_in, &
     148            0 :          dHp_dr_in,dHp_dr_out,dHp_dr_00,dHp_dT_00,dHp_dT_out, &
     149            0 :          dY_dr_in,dY_dr_00,dY_dr_out,dY_dT_00, &
     150            0 :          dY_dT_out, &
     151            0 :          PII,dPII_dr_in,dPII_dr_00,dPII_dr_out, &
     152            0 :          dPII_dT_00,dPII_dT_out,DPIIZ0, &
     153            0 :          dsrc_dr_in,dsrc_dr_00,dsrc_dr_out,dsrc_dT_00, &
     154            0 :          dsrc_dT_out,dsrc_dw_00,SOURCE, &
     155            0 :          d_damp_dr_in,d_damp_dr_00,d_damp_dr_out,d_damp_dT_00, &
     156            0 :          d_damp_dT_out,d_damp_dw_00,DAMP, &
     157            0 :          dsrc_dr_in2,dsrc_dT_in,d_damp_dr_in2,d_damp_dT_in, &
     158            0 :          d_dampR_dr_in,d_dampR_dr_00,d_dampR_dr_out,d_dampR_dT_00, &
     159            0 :          d_dampR_dT_out,d_dampR_dw_00,DAMPR, &
     160            0 :          d_dampR_dr_in2,d_dampR_dT_in, &
     161            0 :          DLCXM,DLCX0,DLCXP,DLCY0, &
     162            0 :          DLCYP,DLCZ0,DLCZP, &
     163            0 :          DLTXM,DLTX0,DLTXP,DLTY0, &
     164            0 :          DLTYP,DLTZ0,DLTZP,Lt, &
     165            0 :          PTURB,dPtrb_dw_00,dPtrb_dr_00,dPtrb_dr_in
     166              : 
     167            0 :       real(dp) :: T1,DLR,DLRP,DLRM,DLT,DLTP,DLMR,DLMRP,DLMRM,DLMT,DLMTP
     168            0 :       real(dp) :: W_00,W_out,BW,BK,T2,T3,DLK,DLKP,SVEL,T_0
     169            0 :       real(dp) :: POM3,POM2,POM
     170              :       integer :: I,J,IW,IR,IC, IMAXR, IMAXW, IMAXC
     171            0 :       real(dp) :: MAXR,MAXW,MAXC,PB,PPB,ELB,ELMB
     172              : 
     173              :       integer :: INFO,II,ITROUBC,ITROUBT,IZIP
     174            0 :       real(dp) :: XXR,XXC,XXT,EZH,DXH,DXXC,DXXT,DXKC,DXKT, &
     175            0 :          IGR1,IGR1XM,IGR1X0,IGR1XP,IGR1Y0,IGR1YP, &
     176            0 :          IGR2,IGR2XM,IGR2X0,IGR2XP,IGR2Y0,IGR2YP
     177              : 
     178            0 :       real(dp) :: FFXM,FFX0,FFXP,FFY0,FFYP,FF
     179            0 :       real(dp) :: GGXM,GGX0,GGXP,GGY0,GGYP,GG,GPF
     180            0 :       real(dp) :: EFL02
     181              : 
     182            0 :       real(dp) :: POM4,DXXR,TEM1,TEMI,TEMM
     183              : 
     184            0 :       real(dp) :: TT,dmN,dmNL,TNL,DDT,MSTAR,PRECR
     185            0 :       real(dp) :: RINNER,ROUTER,TINNER,MENVEL
     186              :       integer :: IOP,NEGFLU
     187              :       logical :: ending
     188              : 
     189            0 :       real(dp) :: SUMM,AONE,HAHA
     190            0 :       real(dp) :: AAA(100),AAP(100),AAT(100)
     191            0 :       real(dp) :: AALFA, AALFAP, AALFAT
     192              :       integer :: ICAA, ICAP, ICAT
     193              :       integer :: NDIVAA, NDIVAP, NDIVAT, dmN_cnt, max_dmN_cnt
     194              :       logical :: ok_to_adjust_mass, ok_to_adjust_Tsurf
     195            0 :       real(dp) :: EDFAC, Psurf, CFIDDLE, FSUB, EMR, ELR
     196            0 :       real(dp) :: PREC1
     197              : 
     198            0 :       real(dp) :: XX_max, XX_max_val, XX_max_dx
     199              :       integer :: i_XX_max, var_XX_max, n, op_err
     200              : 
     201              :       !write(*,*) 'RELAX_ENV'
     202            0 :       EFL02 = EFL0*EFL0
     203            0 :       FSUB = s% RSP_dq_1_factor
     204            0 :       EMR = s% RSP_mass
     205            0 :       ELR = s% RSP_L
     206              : 
     207            0 :       n = NZN+1
     208              :       allocate( &
     209              :          E(n), P(n), Lr(n), Lc(n), Hp_face(n), Y_face(n), K(n), CPS(n), QQS(n), &
     210              :          dC_dr_in(n),dC_dr_00(n),dC_dr_out(n),dC_dT_00(n),dC_dT_out(n), &
     211              :          dC_dw_00(n),dC_dr_in2(n),dC_dT_in(n), &
     212              :          DPV(n),dP_dT_00(n),DEV(n),dE_dT_00(n),dK_dV_00(n), &
     213              :          dK_dT_00(n),DVR(n),DVRM(n), &
     214              :          CPV(n), dCp_dT_00(n), QQV(n),dQQ_dT_00(n), &
     215              :          dP_dr_00(n), dCp_dr_00(n), dQQ_dr_00(n), &
     216              :          dP_dr_in(n),dCp_dr_in(n),dQQ_dr_in(n), &
     217              :          dHp_dr_in(n),dHp_dr_out(n),dHp_dr_00(n),dHp_dT_00(n),dHp_dT_out(n), &
     218              :          dY_dr_in(n),dY_dr_00(n),dY_dr_out(n),dY_dT_00(n), &
     219              :          dY_dT_out(n), &
     220              :          PII(n),dPII_dr_in(n),dPII_dr_00(n),dPII_dr_out(n), &
     221              :          dPII_dT_00(n),dPII_dT_out(n),DPIIZ0(n), &
     222              :          dsrc_dr_in(n),dsrc_dr_00(n),dsrc_dr_out(n),dsrc_dT_00(n), &
     223              :          dsrc_dT_out(n),dsrc_dw_00(n),SOURCE(n), &
     224              :          d_damp_dr_in(n),d_damp_dr_00(n),d_damp_dr_out(n),d_damp_dT_00(n), &
     225              :          d_damp_dT_out(n),d_damp_dw_00(n),DAMP(n), &
     226              :          dsrc_dr_in2(n),dsrc_dT_in(n),d_damp_dr_in2(n),d_damp_dT_in(n), &
     227              :          d_dampR_dr_in(n),d_dampR_dr_00(n),d_dampR_dr_out(n),d_dampR_dT_00(n), &
     228              :          d_dampR_dT_out(n),d_dampR_dw_00(n),DAMPR(n), &
     229              :          d_dampR_dr_in2(n),d_dampR_dT_in(n), &
     230              :          DLCXM(n),DLCX0(n),DLCXP(n),DLCY0(n), &
     231              :          DLCYP(n),DLCZ0(n),DLCZP(n), &
     232              :          DLTXM(n),DLTX0(n),DLTXP(n),DLTY0(n), &
     233              :          DLTYP(n),DLTZ0(n),DLTZP(n),Lt(n), &
     234            0 :          PTURB(n),dPtrb_dw_00(n),dPtrb_dr_00(n),dPtrb_dr_in(n))
     235              : 
     236              : !     STORE SOME VALUES FOR FURTHER COMPARISON
     237            0 :       MSTAR  = M(NZN)
     238            0 :       TINNER = T(1)
     239            0 :       RINNER = s% R_center  ! R0
     240            0 :       ROUTER = R(NZN)
     241            0 :       MENVEL = MSTAR-M(1)+dm(1)
     242              : 
     243            0 :       TNL = 0d0
     244              : 
     245            0 :       if (s% RSP_use_Prad_for_Psurf) then
     246              :          if(.not.RSP_eddi) then  !     EXACT GREY RELATION
     247              :             T_0= pow(sqrt(3.d0)/4.d0,0.25d0)*TE  !0.811194802d0*TE
     248              :          else  !     EDDINGTON APPROXIMATION
     249            0 :             T_0= pow(0.5d0, 0.25d0)*TE  ! T_0= pow(1.0d0/2.d0,0.25d0)*TE
     250              :          end if
     251            0 :          Psurf = crad*T_0*T_0*T_0*T_0/3d0
     252              :       else
     253              :          Psurf = 0d0
     254              :       end if
     255              : 
     256            0 :       ending=.false.
     257            0 :       if (s% RSP_trace_RSP_build_model) &
     258            0 :          write(*,*) '*** relax envelope ***'
     259              : 
     260            0 :       NEGFLU=0
     261            0 :       NDIVAA = 20  ! s% RSP_NDIVAA
     262            0 :       NDIVAP = 20  ! s% RSP_NDIVAP
     263            0 :       NDIVAT = 20  ! s% RSP_NDIVAT
     264            0 :       ok_to_adjust_mass = .true.  ! s% RSP_ok_to_adjust_mass
     265            0 :       ok_to_adjust_Tsurf = .true.  ! s% RSP_ok_to_adjust_Tsurf
     266            0 :       dmN_cnt = 0
     267            0 :       max_dmN_cnt = s% RSP_relax_max_tries
     268            0 :       PREC1 = s% RSP_relax_dm_tolerance
     269              : 
     270              : !     SUMM IS ZONE OF THE ENVELOPE UP TO ANCHOR
     271              : !     (NOT CHANGED IN THE ITERATIONS)
     272            0 :       SUMM=0.d0
     273            0 :       do I=1,NZN-NZT+1
     274            0 :          SUMM=SUMM+dm(I)
     275              :       end do
     276              : 
     277              : !     IF BOTH ALFAP NAD ALFAT /= 0, IT IS NECESSARY TO ITERATE WITHOUT
     278              : !     TURBULENT FLUX, WITH TURBULENT PRESSURE ONLY, AND AFTER
     279              : !     CONVERGENCE TURBULENT FLUX IS ITERATED
     280            0 :       AALFA = -1  ! turn off ALFA relax
     281            0 :       if (AALFA <= 0d0) AALFA = ALFA
     282            0 :       AALFAT = ALFAT
     283            0 :       AALFAP = ALFAP
     284            0 :       ALFAT  = 0.d0
     285            0 :       ALFAP  = 0.d0
     286              : 
     287              : !     SET ALFA TO ITERATE
     288            0 :       do I=1,NDIVAA
     289            0 :          AAA(I)=ALFA+(AALFA-ALFA)*I/dble(NDIVAA)
     290              :       end do
     291            0 :       ICAA=1
     292              : 
     293              : !     SET ITERATIONS FOR ALFAP
     294            0 :       if(AALFAP/=0.d0)then
     295            0 :          do I=1,NDIVAP
     296            0 :             AAP(I)=AALFAP*I/dble(NDIVAP)
     297              :          end do
     298              :          ICAP=1
     299              :       end if
     300              : 
     301              : !     SET ITERATIONS FOR ALFAT
     302            0 :       if(AALFAT/=0.d0)then
     303            0 :          do I=1,NDIVAT
     304            0 :             AAT(I)=AALFAT*I/dble(NDIVAT)
     305              :          end do
     306              :          ICAT=1
     307              :       end if
     308              : !-
     309            0 :       PRECR = 1.d-10  !PRECISION FOR NEWTON-RHAPSON ITERATIONS
     310            0 :       DXH = 0.01d0   !UNDERCORRECTION FOR NEWTON-RHAPSON CORRECTIONS
     311            0 :       DDT = -dm(NZN)/1000.d0  !INITIAL CHANGE IN OUTER ZONE MASS
     312              : 
     313            0 :       IOP = 0
     314              : 
     315              :  999  continue
     316              : 
     317            0 :       IZIP = 0
     318            0 :       if(IOP==0) GOTO 100
     319              : 
     320              : !------ MASS TRICKS ---
     321              : !     dmN = dm(NZN) ! THIS IS NOT WORKING IF FSUB/=1
     322            0 :       dmN = dm(NZN-1)  !THIS IS WORKING FOR ALL FSUB VALUES
     323              : 
     324            0 :       TT  = T(NZN-NZT+1)-TH0
     325              : 
     326            0 :       if(IOP==1) GOTO 24
     327              : 
     328            0 :       DDT = TT*(dmN-dmNL)/(TT-TNL)
     329              :       !if (is_bad(DDT)) then
     330              :       !   write(*,*) 'DDT', DDT
     331              :       !   write(*,*) 'TT-TNL', TT-TNL
     332              :       !   write(*,*) 'dmN-dmNL', dmN-dmNL
     333              :       !   write(*,*) 'TT', TT
     334              :       !   write(*,*) 'TNL', TNL
     335              :       !   write(*,*) 'dmNL', dmNL
     336              :       !   write(*,*) 'dmN', dmN
     337              :       !   call mesa_error(__FILE__,__LINE__,'failed in RELAX_ENV')
     338              :       !end if
     339            0 :       CFIDDLE=0.1d0
     340            0 :       if(abs(DDT/dmN)>CFIDDLE) DDT=CFIDDLE*dmN*(DDT/abs(DDT))
     341              : 
     342              : !     CHECK IF ALFA ITERATION IS FINISHED
     343            0 :       if(abs(DDT/dmN)<PREC1.and.ALFA/=AALFA) then
     344            0 :          ALFA=AAA(ICAA)
     345            0 :          ICAA=ICAA+1
     346              : !        APPLY ARTIFICIAL ZONE MASS CHANGE TO ALLOW ITERATIONS
     347            0 :          DDT = -dm(NZN)/100000.d0
     348            0 :          write(*,*) 'ALFA =',ALFA
     349            0 :          GOTO 24
     350              :       end if
     351            0 :       if(abs(DDT/dmN)<PREC1.and.ICAA==NDIVAA+1)then
     352            0 :          write(*,*) '***** ALFA ITERATION FINISHED *****'
     353            0 :          write(*,*) 'final ALFA =', ALFA, s% RSP_alfa
     354            0 :          dmN_cnt = 0
     355            0 :          NDIVAA=-99
     356              :       end if
     357              : 
     358            0 :       if (s% RSP_relax_alfap_before_alfat) then
     359              : 
     360              :          ! CHECK IF ALFAP ITERATION IS FINISHED
     361            0 :          if(abs(DDT/dmN)<PREC1.and.ALFAP/=AALFAP) then
     362            0 :             ALFAP=AAP(ICAP)
     363            0 :             ICAP=ICAP+1
     364              :             ! APPLY ARTIFICIAL ZONE MASS CHANGE TO ALLOW ITERATIONS
     365            0 :             DDT = -dm(NZN)/100000.d0
     366            0 :             write(*,*) 'ALFAP=',ALFAP
     367            0 :             GOTO 24
     368              :          end if
     369            0 :          if(abs(DDT/dmN)<PREC1.and.ICAP==NDIVAP+1)then
     370            0 :             write(*,*) '***** ALFAP ITERATION FINISHED *****'
     371            0 :             dmN_cnt = 0
     372            0 :             NDIVAP=-99
     373              :          end if
     374              : 
     375              :          ! CHECK IF ALFAT ITERATION IS FINISHED
     376            0 :          if(abs(DDT/dmN)<PREC1.and.ALFAT/=AALFAT) then
     377            0 :             ALFAT=AAT(ICAT)
     378            0 :             ICAT=ICAT+1
     379              :             ! APPLY ARTIFICIAL ZONE MASS CHANGE TO ALLOW ITERATIONS
     380            0 :             DDT = -dm(NZN)/100000.d0
     381            0 :             write(*,*) 'ALFAT =',ALFAT
     382            0 :             GOTO 24
     383              :          end if
     384            0 :          if(abs(DDT/dmN)<PREC1.and.ICAT==NDIVAT+1)then
     385            0 :             write(*,*) '***** ALFAT ITERATION FINISHED *****'
     386            0 :             dmN_cnt = 0
     387            0 :             NDIVAT=-99
     388              :          end if
     389              : 
     390              :       else
     391              : 
     392              :          ! CHECK IF ALFAT ITERATION IS FINISHED
     393            0 :          if(abs(DDT/dmN)<PREC1.and.ALFAT/=AALFAT) then
     394            0 :             ALFAT=AAT(ICAT)
     395            0 :             ICAT=ICAT+1
     396              :             ! APPLY ARTIFICIAL ZONE MASS CHANGE TO ALLOW ITERATIONS
     397            0 :             DDT = -dm(NZN)/100000.d0
     398            0 :             write(*,*) 'ALFAT =',ALFAT
     399            0 :             GOTO 24
     400              :          end if
     401            0 :          if(abs(DDT/dmN)<PREC1.and.ICAT==NDIVAT+1)then
     402            0 :             write(*,*) '***** ALFAT ITERATION FINISHED *****'
     403            0 :             dmN_cnt = 0
     404            0 :             NDIVAT=-99
     405              :          end if
     406              : 
     407              :          ! CHECK IF ALFAP ITERATION IS FINISHED
     408            0 :          if(abs(DDT/dmN)<PREC1.and.ALFAP/=AALFAP) then
     409            0 :             ALFAP=AAP(ICAP)
     410            0 :             ICAP=ICAP+1
     411              :             ! APPLY ARTIFICIAL ZONE MASS CHANGE TO ALLOW ITERATIONS
     412            0 :             DDT = -dm(NZN)/100000.d0
     413            0 :             write(*,*) 'ALFAP=',ALFAP
     414            0 :             GOTO 24
     415              :          end if
     416            0 :          if(abs(DDT/dmN)<PREC1.and.ICAP==NDIVAP+1)then
     417            0 :             write(*,*) '***** ALFAP ITERATION FINISHED *****'
     418            0 :             dmN_cnt = 0
     419            0 :             NDIVAP=-99
     420              :          end if
     421              : 
     422              :       end if
     423              : 
     424            0 :       if(abs(DDT/dmN)<PREC1) then
     425            0 :          if(NEGFLU>=1)then
     426            0 :             if (NEGFLU==2)then
     427              :                !write(*,*) '*** ENVELOPE IS RELAXED ***'
     428              :                ending=.true.
     429              :                GOTO 100
     430              :             end if
     431              :             !write(*,*) 'NEGATIVE FLUX IS ON'
     432            0 :             DDT = -dm(NZN)/100000.d0
     433            0 :             NEGFLU=2
     434            0 :             GOTO 24
     435              :          end if
     436              :          !write(*,*) 'NEGATIVE FLUX WITHOUT Z-DERIV. IS ON'
     437            0 :          DDT = -dm(NZN)/100000.d0
     438            0 :          NEGFLU=1
     439            0 :          GOTO 24
     440              :       end if
     441              : 
     442              :       !write(*,*) 'abs(DDT/dmN), PREC1', DDT, dmN, abs(DDT/dmN), PREC1
     443              : 
     444              :       if(abs(DDT/dmN)<PREC1) then
     445              :          !write(*,*) '*** ENVELOPE IS RELAXED ***'
     446              :          ending=.true.
     447              :          GOTO 100
     448              :       end if
     449              : 
     450            0 :       if (dmN_cnt >= max_dmN_cnt) then
     451            0 :          write(*,*) 'RELAX_ENV has reached max num allowed tries for outer dm', max_dmN_cnt
     452            0 :          ierr = -1
     453            0 :          return
     454              :          call mesa_error(__FILE__,__LINE__)
     455              :       end if
     456              : 
     457            0 :  24   TNL  = TT
     458            0 :       dmNL = dmN
     459            0 :       dmN_cnt = dmN_cnt + 1
     460              : 
     461            0 :       if (s% RSP_relax_adjust_inner_mass_distribution) then
     462              : 
     463            0 :          dmN  = dmN-DDT
     464              : 
     465              :          if(IOP>=1) then
     466              :    !        CALCULATE HAHA - ZONE MASS RATIO BELOW ANCHOR
     467              :    !        TOTAL MASS BELOW ANCHOR: SUMM, FIRST ZONE MASS: AONE
     468            0 :             AONE=dmN
     469            0 :             HAHA=1.01d0
     470            0 :             do I=1,100
     471            0 :                POM=1.d0/(NZN-NZT+1)*dlog10(1.d0-SUMM/AONE*(1.d0-HAHA))
     472            0 :                if(dabs(HAHA-10.d0**POM)<1d-10) GOTO 22
     473            0 :                HAHA=10.d0**POM
     474              :             end do
     475            0 :             write(*,*) 'NO CONVERGENCE IN RELAX_ENV ITERATION FOR H'
     476            0 :             stop
     477              :  22      continue
     478            0 :             HAHA=10.d0**POM
     479              :    !        SET NEW MASS DISTRIBUTION
     480            0 :             do I=NZN,1,-1
     481            0 :                if(I==NZN) then
     482              :    !              SPECIAL DEFINITIONS FOR THE OUTER ZONE
     483            0 :                   M(I)=MSTAR
     484            0 :                   dm(I)=dmN*FSUB
     485            0 :                   dm_bar(I)=dm(I)*0.5d0
     486              :                else
     487            0 :                   if(I>=NZN-NZT+1) dm(I)=dmN  !DEFINITION DOWN TO ANCHOR
     488            0 :                   if(I<NZN-NZT+1.and.ok_to_adjust_mass)  &
     489            0 :                                      dm(I)=AONE*pow(HAHA,(NZN-NZT+1)-I)
     490            0 :                   dm_bar(I)=(dm(I)+dm(I+1))*0.5d0
     491            0 :                   M(I)=M(I+1)-dm(I+1)
     492              :                end if
     493              :             end do
     494              :          end if
     495              : 
     496              :       end if
     497              : 
     498              :  100  continue
     499              : 
     500            0 :       do II=1,8000
     501              : 
     502              : !     LOOP 1 .. EOS
     503            0 :       !$OMP PARALLEL DO PRIVATE(I,T1,POM,EDFAC,op_err) SCHEDULE(dynamic,2)
     504              :       do I=2,NZN
     505              :          T1=P43/dm(I)
     506              :          Vol(I)=T1*(R(I)**3-R(I-1)**3)
     507              :          DVRM(I) = -3.d0*T1*R(I-1)**2
     508              :          DVR(I)  =  3.d0*T1*R(I)**2
     509              : 
     510              :          if(I==NZN.and.ok_to_adjust_Tsurf)then
     511              :             if(RSP_eddi)then
     512              :                EDFAC=1.d0/2.d0
     513              :             else
     514              :                EDFAC=sqrt(3.d0)/4.d0
     515              :             end if
     516              :             POM=(EDFAC*L0/(4.d0*PI*SIG*R(NZN)**2))**0.25d0
     517              :             T(NZN)=POM
     518              :          end if
     519              : 
     520              :          call mesa_eos_kap(s,0, &
     521              :            T(I),Vol(I),P(I),DPV(I),dP_dT_00(I),E(I), &
     522              :            DEV(I),dE_dT_00(I),CPS(I),CPV(I),dCp_dT_00(I), &
     523              :            QQS(I),QQV(I),dQQ_dT_00(I),K(I),dK_dV_00(I),dK_dT_00(I),op_err)
     524              :          if (op_err /= 0) ierr = op_err
     525              :          if (ierr /= 0) cycle
     526              :          if (is_bad(dQQ_dT_00(I))) then
     527              :             write(*,*) 'dQQ_dT_00(I)', i, dQQ_dT_00(I)
     528              :             write(*,*) 'QQS(I)', i, QQS(I)
     529              :             write(*,*) 'T(I)', i, T(I)
     530              :             write(*,*) 'Vol(I)', i, Vol(I)
     531              :             stop
     532              :          end if
     533              : 
     534              :          dP_dr_00(I)  = DPV(I)*DVR(I)
     535              :          dP_dr_in(I) = DPV(I)*DVRM(I)
     536              :          dCp_dr_00(I)  = CPV(I)*DVR(I)
     537              :          dCp_dr_in(I) = CPV(I)*DVRM(I)
     538              :          dQQ_dr_00(I)  = QQV(I)*DVR(I)
     539              :          dQQ_dr_in(I) = QQV(I)*DVRM(I)
     540              :       end do
     541              :       !$OMP END PARALLEL DO
     542            0 :       if (ierr /= 0) return
     543              : 
     544              : !     FIRST ZONE, CALCULATION OF R0 AND EOS
     545            0 :       P(1)=P(2)+G*M(1)*dm_bar(1)/(P4*R(1)**4)
     546              : !     WITH GIVEN T AND P ITERATE FOR V AND CALCULATE ITS DERIVATIVES
     547            0 :       call EOP(s,0,T(1),P(1),Vol(1),E(1),CPS(1),QQS(1),SVEL,K(1),ierr)
     548            0 :       if (ierr /= 0) return
     549            0 :       s% R_center=pow(R(1)**3-3.d0*Vol(1)*dm(1)/P4,1.d0/3.d0)
     550            0 :       T1=P43/dm(1)
     551            0 :       DVRM(1) = -3.d0*T1*s% R_center**2
     552            0 :       DVR(1)  =  3.d0*T1*R(1)**2
     553              : !     CALCULATE EOS FOR THE FIRST ZONE TO OBTAIN DERIVATIVES
     554              :       call mesa_eos_kap(s,0, &
     555              :            T(1),Vol(1),P(1),DPV(1),dP_dT_00(1),E(1), &
     556              :            DEV(1),dE_dT_00(1),CPS(1),CPV(1),dCp_dT_00(1), &
     557            0 :            QQS(1),QQV(1),dQQ_dT_00(1),K(1),dK_dV_00(1),dK_dT_00(1),ierr)
     558            0 :       if (ierr /= 0) return
     559              :        !write(*,*) '1st zone T V P',T(1),Vol(1),P(1)
     560              : 
     561            0 :       dP_dr_00(1)  = DPV(1)*DVR(1)
     562            0 :       dP_dr_in(1) = DPV(1)*DVRM(1)
     563            0 :       dCp_dr_00(1)  = CPV(1)*DVR(1)
     564            0 :       dCp_dr_in(1) = CPV(1)*DVRM(1)
     565            0 :       dQQ_dr_00(1)  = QQV(1)*DVR(1)
     566            0 :       dQQ_dr_in(1) = QQV(1)*DVRM(1)
     567              : 
     568              : !     SET E_T (NOW =w) BELOW AND ABOVE BOUNDARIES
     569              : !     w = EFL02 BELOW IBOTOM, INSREAD OF =0 BETTER, BECAUSE OF
     570              : !     TURBULENT FLUX, NEAR THE IBOTOM
     571            0 :       Et(NZN) = 0.d0
     572            0 :       do I=1,IBOTOM
     573            0 :          Et(I) = 0.d0
     574              :       end do
     575              : 
     576            0 :       do I=1,NZN-1
     577            0 :          POM=  (R(I)**2)/(2.d0*G*M(I))
     578            0 :          Hp_face(I)=POM*(P(I)*Vol(I)+P(I+1)*Vol(I+1))
     579            0 :          dHp_dr_in(I)=POM*(P(I)*DVRM(I)+Vol(I)*dP_dr_in(I))
     580              :          dHp_dr_00(I)=2.d0*Hp_face(I)/R(I)+POM*(P(I)*DVR(I)+Vol(I)*dP_dr_00(I) &
     581            0 :                    +P(I+1)*DVRM(I+1)+Vol(I+1)*dP_dr_in(I+1))
     582            0 :          dHp_dr_out(I)=POM*(P(I+1)*DVR(I+1)+Vol(I+1)*dP_dr_00(I+1))
     583            0 :          dHp_dT_00(I)=POM*Vol(I)*dP_dT_00(I)
     584            0 :          dHp_dT_out(I)=POM*Vol(I+1)*dP_dT_00(I+1)
     585              :       end do
     586            0 :       POM=(R(NZN)**2)/(2.d0*G*M(NZN))
     587            0 :       Hp_face(NZN)=POM*P(NZN)*Vol(NZN)
     588            0 :       dHp_dr_in(NZN)=POM*(P(NZN)*DVRM(NZN)+Vol(NZN)*dP_dr_in(NZN))
     589              :       dHp_dr_00(NZN)=2.d0*Hp_face(NZN)/R(NZN)+POM* &
     590            0 :                   (P(NZN)*DVR(NZN)+Vol(NZN)*dP_dr_00(NZN))
     591            0 :       dHp_dr_out(NZN)=0.d0
     592            0 :       dHp_dT_00(NZN)=POM*Vol(NZN)*dP_dT_00(NZN)
     593            0 :       dHp_dT_out(NZN)=0.d0
     594              : 
     595            0 :       do I=1,NZN-1
     596            0 :          POM=0.5d0*(QQS(I)/CPS(I)+QQS(I+1)/CPS(I+1))
     597            0 :          POM2=0.5d0*(P(I+1)-P(I))
     598              :          IGR1=0.5d0*(QQS(I)/CPS(I)+QQS(I+1)/CPS(I+1))*(P(I+1)-P(I)) &
     599            0 :               -(dlog(T(I+1))-dlog(T(I)))
     600              :          IGR1X0=POM2*((dQQ_dr_00(I)-QQS(I)/CPS(I)*dCp_dr_00(I))/CPS(I)+ &
     601              :                  (dQQ_dr_in(I+1)-QQS(I+1)/CPS(I+1)*dCp_dr_in(I+1))/CPS(I+1)) &
     602            0 :                +POM*(dP_dr_in(I+1)-dP_dr_00(I))
     603              :          IGR1XM=POM2*(dQQ_dr_in(I)-QQS(I)/CPS(I)*dCp_dr_in(I))/CPS(I) &
     604            0 :                 +POM*(-dP_dr_in(I))
     605              :          IGR1XP=POM2*(dQQ_dr_00(I+1)-QQS(I+1)/CPS(I+1)*dCp_dr_00(I+1))/CPS(I+1) &
     606            0 :                 +POM*(dP_dr_00(I+1))
     607              :          IGR1Y0=POM2*(dQQ_dT_00(I)-QQS(I)/CPS(I)*dCp_dT_00(I))/CPS(I) &
     608            0 :                 +POM*(-dP_dT_00(I))+1.d0/T(I)
     609              :          IGR1YP=POM2*(dQQ_dT_00(I+1)-QQS(I+1)/CPS(I+1)*dCp_dT_00(I+1))/CPS(I+1) &
     610            0 :                 +POM*(dP_dT_00(I+1))-1.d0/T(I+1)
     611              : 
     612            0 :          POM=2.d0/(Vol(I)+Vol(I+1))
     613            0 :          POM2=8.d0*PI*(R(I)**2)/dm_bar(I)*Hp_face(I)
     614            0 :          IGR2=4.d0*PI*(R(I)**2)*Hp_face(I)*POM/dm_bar(I)
     615              :          IGR2X0=2.d0*IGR2/R(I)+IGR2/Hp_face(I)*dHp_dr_00(I) &
     616            0 :                -POM2/(Vol(I)+Vol(I+1))**2*(DVR(I)+DVRM(I+1))
     617              :          IGR2XM=-POM2/(Vol(I)+Vol(I+1))**2*DVRM(I)    &
     618            0 :                +IGR2/Hp_face(I)*dHp_dr_in(I)
     619              :          IGR2XP=-POM2/(Vol(I)+Vol(I+1))**2*DVR(I+1) &
     620            0 :                +IGR2/Hp_face(I)*dHp_dr_out(I)
     621            0 :          IGR2Y0=IGR2/Hp_face(I)*dHp_dT_00(I)
     622            0 :          IGR2YP=IGR2/Hp_face(I)*dHp_dT_out(I)
     623              : 
     624            0 :          Y_face(I)=IGR1*IGR2
     625            0 :          dY_dr_00(I)=IGR1*IGR2X0+IGR2*IGR1X0
     626            0 :          dY_dr_in(I)=IGR1*IGR2XM+IGR2*IGR1XM
     627            0 :          dY_dr_out(I)=IGR1*IGR2XP+IGR2*IGR1XP
     628            0 :          dY_dT_00(I)=IGR1*IGR2Y0+IGR2*IGR1Y0
     629            0 :          dY_dT_out(I)=IGR1*IGR2YP+IGR2*IGR1YP
     630              :       end do
     631              : 
     632              : !     PROTECT FROM 'ALWAYS ZERO' SOLUTION WHEN (Y>0)
     633              : !     (SEEMS UNNECESSARY)
     634            0 :       do I=IBOTOM+1,NZN-1
     635              : !         if((Y_face(I)+Y_face(I-1))>0.d0.and.Et(I)==0.d0)
     636              : !     x                    Et(I)=1.d+6!1.d-6
     637            0 :          if(ALFA==0.d0) Et(I)=0.d0
     638              :       end do
     639              : 
     640            0 :       do I=1,NZN-1
     641              :          POM=sqrt(2.d0/3.d0)*0.5d0
     642              :          FF=POM*((E(I)  +P(I)  *Vol(I)  )/T(I) &
     643            0 :               +(E(I+1)+P(I+1)*Vol(I+1))/T(I+1))
     644            0 :          FFY0=POM*(dE_dT_00(I)+dP_dT_00(I)*Vol(I)-(E(I)+P(I)*Vol(I))/T(I))/T(I)
     645              :          FFYP=POM*(dE_dT_00(I+1)+dP_dT_00(I+1)*Vol(I+1)-(E(I+1)+P(I+1)*Vol(I+1)) &
     646            0 :             /T(I+1))/T(I+1)
     647            0 :          FFXP=POM* ((DEV(I+1)+P(I+1))*DVR(I+1)+Vol(I+1)*dP_dr_00(I+1))/T(I+1)
     648              :          FFX0=POM*(((DEV(I)  +P(I)  )*DVR(I)  +Vol(I)  *dP_dr_00(I)  )/T(I)+ &
     649              :               ((DEV(I+1)+P(I+1))*DVRM(I+1)+Vol(I+1)*dP_dr_in(I+1)) &
     650            0 :               /T(I+1))
     651            0 :          FFXM=POM* ((DEV(I)  +P(I)  )*DVRM(I) +Vol(I)*dP_dr_in(I))/T(I)
     652              : 
     653            0 :          POM=ALFAS*ALFA
     654            0 :          POM2=0.5d0*(CPS(I)+CPS(I+1))
     655            0 :          GG=POM*POM2*Y_face(I)
     656            0 :          GGXM=POM*(POM2*dY_dr_in(I)+Y_face(I)*0.5d0*dCp_dr_in(I))
     657            0 :          GGX0=POM*(POM2*dY_dr_00(I)+Y_face(I)*0.5d0*(dCp_dr_00(I)+dCp_dr_in(I+1)))
     658            0 :          GGXP=POM*(POM2*dY_dr_out(I)+Y_face(I)*0.5d0*dCp_dr_00(I+1))
     659            0 :          GGY0=POM*(POM2*dY_dT_00(I)+Y_face(I)*0.5d0*dCp_dT_00(I))
     660            0 :          GGYP=POM*(POM2*dY_dT_out(I)+Y_face(I)*0.5d0*dCp_dT_00(I+1))
     661            0 :          GPF=GG/FF
     662              : 
     663              : !        corelation PI defined without e_t
     664            0 :          POM=1.d0
     665              : 
     666            0 :          PII(I)=POM*GG
     667            0 :          DPIIZ0(I)=0.d0
     668            0 :          dPII_dr_00(I)=POM*GGX0
     669            0 :          dPII_dr_in(I)=POM*GGXM
     670            0 :          dPII_dr_out(I)=POM*GGXP
     671            0 :          dPII_dT_00(I)=POM*GGY0
     672            0 :          dPII_dT_out(I)=POM*GGYP
     673              :       end do
     674              : 
     675            0 :       do I=IBOTOM+1,NZN-1
     676              : !        SOURCE TERM
     677            0 :          POM=0.5d0*(PII(I)/Hp_face(I)+PII(I-1)/Hp_face(I-1))
     678            0 :          POM2=T(I)*P(I)*QQS(I)/CPS(I)
     679            0 :          POM3=sqrt(Et(I))
     680            0 :          SOURCE(I)=POM*POM2*POM3
     681            0 :          TEM1=POM2*POM3*0.5d0
     682            0 :          TEMI=-PII(I)/Hp_face(I)**2
     683            0 :          TEMM=-PII(I-1)/Hp_face(I-1)**2
     684              : 
     685              :          ! X -> w
     686              :          ! Y -> T
     687              :          ! Z -> R
     688              : 
     689              :          dsrc_dr_out(I)= TEM1*(dPII_dr_out(I)/Hp_face(I) &
     690            0 :                          +TEMI*dHp_dr_out(I))
     691              :          dsrc_dr_00(I)= TEM1*(dPII_dr_00(I)/Hp_face(I)+dPII_dr_out(I-1)/Hp_face(I-1) &
     692            0 :                          +TEMI*dHp_dr_00(I)+TEMM*dHp_dr_out(I-1))
     693              :          dsrc_dr_in(I)= TEM1*(dPII_dr_in(I)/Hp_face(I)+dPII_dr_00(I-1)/Hp_face(I-1) &
     694            0 :                          +TEMI*dHp_dr_in(I)+TEMM*dHp_dr_00(I-1))
     695              :          dsrc_dr_in2(I)=TEM1*(dPII_dr_in(I-1)/Hp_face(I-1) &
     696            0 :                          +TEMM*dHp_dr_in(I-1))
     697              : 
     698              :          dsrc_dT_out(I)= TEM1*(dPII_dT_out(I)/Hp_face(I) &
     699            0 :                          +TEMI*dHp_dT_out(I))
     700              :          dsrc_dT_00(I)= TEM1*(dPII_dT_00(I)/Hp_face(I)+dPII_dT_out(I-1)/Hp_face(I-1) &
     701            0 :                          +TEMI*dHp_dT_00(I)+TEMM*dHp_dT_out(I-1))
     702              :          dsrc_dT_in(I)= TEM1*(dPII_dT_00(I-1)/Hp_face(I-1) &
     703            0 :                          +TEMM*dHp_dT_00(I-1))
     704              : 
     705            0 :          dsrc_dw_00(I)= POM*POM2*0.5d0/sqrt(Et(I))
     706              : 
     707            0 :          POM=POM*POM3
     708              : 
     709              :          dsrc_dT_00(I)=dsrc_dT_00(I)+ &
     710              :             POM/CPS(I)*(P(I)*QQS(I)+T(I)*QQS(I)*dP_dT_00(I)+T(I)*P(I)*dQQ_dT_00(I) &
     711            0 :                             -T(I)*P(I)*QQS(I)/CPS(I)*dCp_dT_00(I))
     712              :          dsrc_dr_00(I)=dsrc_dr_00(I)+ &
     713              :                POM*T(I)/CPS(I)*(QQS(I)*dP_dr_00(I)+P(I)*dQQ_dr_00(I) &
     714            0 :                            -P(I)*QQS(I)/CPS(I)*dCp_dr_00(I))
     715              :          dsrc_dr_in(I)=dsrc_dr_in(I)+ &
     716              :                 POM*T(I)/CPS(I)*(QQS(I)*dP_dr_in(I)+P(I)*dQQ_dr_in(I) &
     717            0 :                             -P(I)*QQS(I)/CPS(I)*dCp_dr_in(I))
     718              : 
     719              : !       SOURCE TERM ALWAYS POSITIVE
     720              : !       THIS IS FORMULATION USED IN BUDAPEST-FLORIDA CODE
     721              : !       IT REQUIRES E_T AS MAIN VARIABLE - OTHERWISE CONVERGENCE
     722              : !       IS EXTREMELY SLOW, AND POSSIBLE ONLY IF LOW ACCURACY
     723              : !       FOR CONVERGENCE CONDITION, DXXC< 1d-2 - 1.d-4, IS SET
     724              : !        if(SOURCE(I)<=0.d0)then
     725              : !           SOURCE(I) = 0.d0
     726              : !           dsrc_dr_out(I) = 0.d0
     727              : !           dsrc_dr_00(I) = 0.d0
     728              : !           dsrc_dr_in(I) = 0.d0
     729              : !           dsrc_dr_in2(I)= 0.d0
     730              : !           dsrc_dT_out(I) = 0.d0
     731              : !           dsrc_dT_in(I) = 0.d0
     732              : !           dsrc_dT_00(I) = 0.d0
     733              : !           dsrc_dw_00(I) = 0.d0
     734              : !        end if
     735              : 
     736              : !        DAMP TERM
     737            0 :          POM=(CEDE/ALFA)*(Et(I)**1.5d0-EFL02**1.5d0)
     738            0 :          POM2=0.5d0*(Hp_face(I)+Hp_face(I-1))
     739            0 :          DAMP(I)=POM/POM2
     740            0 :          TEM1=-0.5d0*POM/POM2**2
     741            0 :          d_damp_dr_out(I) =TEM1*dHp_dr_out(I)
     742            0 :          d_damp_dr_00(I) =TEM1*(dHp_dr_00(I)+dHp_dr_out(I-1))
     743            0 :          d_damp_dr_in(I) =TEM1*(dHp_dr_in(I)+dHp_dr_00(I-1))
     744            0 :          d_damp_dr_in2(I)=TEM1*(dHp_dr_in(I-1))
     745            0 :          d_damp_dT_00(I) =TEM1*(dHp_dT_00(I)+dHp_dT_out(I-1))
     746            0 :          d_damp_dT_out(I) =TEM1*dHp_dT_out(I)
     747            0 :          d_damp_dT_in(I) =TEM1*dHp_dT_00(I-1)
     748            0 :          d_damp_dw_00(I) =1.5d0*(CEDE/ALFA)/POM2*sqrt(Et(I))
     749              : 
     750              : !        RADIATIVE DAMP TERM
     751            0 :          if(GAMMAR==0.d0)then
     752            0 :             DAMPR(I)   = 0.d0
     753            0 :             d_dampR_dr_out(I) = 0.d0
     754            0 :             d_dampR_dr_00(I) = 0.d0
     755            0 :             d_dampR_dr_in(I) = 0.d0
     756            0 :             d_dampR_dr_in2(I)= 0.d0
     757            0 :             d_dampR_dT_out(I) = 0.d0
     758            0 :             d_dampR_dT_in(I) = 0.d0
     759            0 :             d_dampR_dT_00(I) = 0.d0
     760            0 :             d_dampR_dw_00(I) = 0.d0
     761              :          else
     762            0 :             POM=(GAMMAR**2)/(ALFA**2)*4.d0*SIG
     763            0 :             POM2=T(I)**3*Vol(I)**2/(CPS(I)*K(I))
     764            0 :             POM3=Et(I)
     765            0 :             POM4=0.5d0*(Hp_face(I)**2+Hp_face(I-1)**2)
     766            0 :             DAMPR(I)=POM*POM2*POM3/POM4
     767            0 :             TEM1=-DAMPR(I)/POM4
     768            0 :             d_dampR_dr_out(I) =TEM1*(Hp_face(I)*dHp_dr_out(I))
     769              :             d_dampR_dr_00(I) =TEM1*(Hp_face(I)*dHp_dr_00(I) &
     770            0 :                              +Hp_face(I-1)*dHp_dr_out(I-1))
     771              :             d_dampR_dr_in(I) =TEM1*(Hp_face(I)*dHp_dr_in(I) &
     772            0 :                              +Hp_face(I-1)*dHp_dr_00(I-1))
     773            0 :             d_dampR_dr_in2(I)=TEM1*(Hp_face(I-1)*dHp_dr_in(I-1))
     774            0 :             d_dampR_dT_out(I) =TEM1*(Hp_face(I)*dHp_dT_out(I))
     775              :             d_dampR_dT_00(I) =TEM1*(Hp_face(I)*dHp_dT_00(I) &
     776            0 :                              +Hp_face(I-1)*dHp_dT_out(I-1))
     777            0 :             d_dampR_dT_in(I) =TEM1*(Hp_face(I-1)*dHp_dT_00(I-1))
     778              : 
     779            0 :             d_dampR_dw_00(I)=POM*POM2/POM4
     780              : 
     781            0 :             TEM1=POM*POM3/POM4
     782              :             d_dampR_dr_00(I)=d_dampR_dr_00(I) &
     783              :                      +TEM1*T(I)**3*(2.d0*Vol(I)*DVR(I) &
     784              :                     -Vol(I)**2*( 1.d0/CPS(I)*dCp_dr_00(I) &
     785              :                                  +1.d0/K(I)*dK_dV_00(I)*DVR(I))) &
     786            0 :                       /(CPS(I)*K(I))
     787              : 
     788              :             d_dampR_dr_in(I)=d_dampR_dr_in(I) &
     789              :                     +TEM1*T(I)**3*(2.d0*Vol(I)*DVRM(I) &
     790              :                     -Vol(I)**2*( 1.d0/CPS(I)*dCp_dr_in(I) &
     791              :                                  +1.d0/K(I)*dK_dV_00(I)*DVRM(I))) &
     792            0 :                       /(CPS(I)*K(I))
     793              : 
     794              :             d_dampR_dT_00(I)=d_dampR_dT_00(I) &
     795              :                           +TEM1*Vol(I)**2*(3.d0*T(I)**2 &
     796              :                           -T(I)**3*( 1.d0/CPS(I)*dCp_dT_00(I) &
     797              :                                        +1.d0/K(I)*dK_dT_00(I))) &
     798            0 :                          /(CPS(I)*K(I))
     799              : 
     800              :          end if
     801              : 
     802            0 :          dC_dr_00(I) =dsrc_dr_00(I) -d_damp_dr_00(I) -d_dampR_dr_00(I)
     803            0 :          dC_dr_out(I) =dsrc_dr_out(I) -d_damp_dr_out(I) -d_dampR_dr_out(I)
     804            0 :          dC_dr_in(I) =dsrc_dr_in(I) -d_damp_dr_in(I) -d_dampR_dr_in(I)
     805            0 :          dC_dr_in2(I)=dsrc_dr_in2(I)-d_damp_dr_in2(I)-d_dampR_dr_in2(I)
     806            0 :          dC_dT_in(I) =dsrc_dT_in(I) -d_damp_dT_in(I) -d_dampR_dT_in(I)
     807            0 :          dC_dT_00(I) =dsrc_dT_00(I) -d_damp_dT_00(I) -d_dampR_dT_00(I)
     808            0 :          dC_dT_out(I) =dsrc_dT_out(I) -d_damp_dT_out(I) -d_dampR_dT_out(I)
     809            0 :          dC_dw_00(I) =dsrc_dw_00(I) -d_damp_dw_00(I) -d_dampR_dw_00(I)
     810              :       end do
     811              : 
     812            0 :       do I=1,NZN
     813              : !        CONVECTIVE LUMINOSITY
     814            0 :          if(I<IBOTOM.or.I>=NZN.or.alfa==0d0) then
     815            0 :             Lc(I)=0.d0
     816            0 :             DLCX0(I)=0.d0
     817            0 :             DLCXM(I)=0.d0
     818            0 :             DLCXP(I)=0.d0
     819            0 :             DLCY0(I)=0.d0
     820            0 :             DLCYP(I)=0.d0
     821            0 :             DLCZ0(I)=0.d0
     822            0 :             DLCZP(I)=0.d0
     823              :          else
     824              :             POM=4.d0*PI*(R(I)**2)*(T(I)/Vol(I)+T(I+1)/Vol(I+1))*0.5d0* &
     825            0 :                (ALFAC/ALFAS)
     826            0 :             POM3=(sqrt(Et(I))+sqrt(Et(I+1)))*0.5d0
     827            0 :             Lc(I)=POM*PII(I)*POM3
     828            0 :             DLCZ0(I)=0d0
     829            0 :             DLCZP(I)=0d0
     830            0 :             if (Et(I) /= 0d0) DLCZ0(I)=POM*PII(I)*0.25d0/sqrt(Et(I))
     831            0 :             if (Et(I+1) /= 0d0) DLCZP(I)=POM*PII(I)*0.25d0/sqrt(Et(I+1))
     832            0 :             POM2=4.d0*PI*(R(I)**2)*PII(I)*0.5d0*(ALFAC/ALFAS)*POM3
     833            0 :             POM=POM*POM3
     834              :             DLCX0(I)=POM*dPII_dr_00(I)+2.d0*Lc(I)/R(I) &
     835              :                             -POM2*(T(I)  /(Vol(I)**2  )*DVR(I)+ &
     836            0 :                                    T(I+1)/(Vol(I+1)**2)*DVRM(I+1))
     837            0 :             DLCXM(I)=POM*dPII_dr_in(I)-POM2*T(I)  /(Vol(I)**2  )*DVRM(I)
     838            0 :             DLCXP(I)=POM*dPII_dr_out(I)-POM2*T(I+1)/(Vol(I+1)**2)*DVR(I+1)
     839            0 :             DLCY0(I)=POM*dPII_dT_00(I)+POM2/Vol(I)
     840            0 :             DLCYP(I)=POM*dPII_dT_out(I)+POM2/Vol(I+1)
     841              : 
     842            0 :             if(I==IBOTOM) DLCZ0(I)=0.d0
     843            0 :             if(I==NZN-1)  DLCZP(I)=0.d0
     844              : 
     845            0 :             if(NEGFLU==0.and.PII(I)<0.d0)then
     846            0 :                Lc(I)=0.d0
     847            0 :                DLCX0(I)=0.d0
     848            0 :                DLCXM(I)=0.d0
     849            0 :                DLCXP(I)=0.d0
     850            0 :                DLCY0(I)=0.d0
     851            0 :                DLCYP(I)=0.d0
     852            0 :                DLCZ0(I)=0.d0
     853            0 :                DLCZP(I)=0.d0
     854              :             end if
     855            0 :             if(NEGFLU==1.and.PII(I)<0.d0)then
     856            0 :                if(II>300)then
     857            0 :                   DLCZ0(I)=0.d0
     858            0 :                   DLCZP(I)=0.d0
     859              :                end if
     860              :             end if
     861              :          end if
     862              : 
     863              : !        TURBULENT LUMINOSITY
     864              :          if(I<IBOTOM.or.I>=NZN.or. &
     865            0 :             ALFAT==0.d0.or.ALFA==0.d0)then
     866            0 :             Lt(I)=0.d0
     867            0 :             DLTX0(I)=0.d0
     868            0 :             DLTXM(I)=0.d0
     869            0 :             DLTXP(I)=0.d0
     870            0 :             DLTY0(I)=0.d0
     871            0 :             DLTYP(I)=0.d0
     872            0 :             DLTZ0(I)=0.d0
     873            0 :             DLTZP(I)=0.d0
     874              :          else
     875            0 :             POM=-2.d0/3.d0*ALFA*ALFAT*(4.d0*PI*(R(I)**2))**2
     876            0 :             POM2=Hp_face(I)*(1.d0/Vol(I)**2+1.d0/Vol(I+1)**2)*0.5d0
     877            0 :             POM3=(Et(I+1)**1.5d0-Et(I)**1.5d0)/dm_bar(I)
     878            0 :             Lt(I)=POM*POM2*POM3
     879            0 :             if (is_bad(Lt(I))) then
     880            0 :                write(*,*) 'Lt(I)', I, Lt(I)
     881            0 :                write(*,*) 'POM', I, POM
     882            0 :                write(*,*) 'POM2', I, POM2
     883            0 :                write(*,*) 'POM3', I, POM3
     884            0 :                stop
     885              :             end if
     886              :             DLTX0(I)=4.d0*Lt(I)/R(I) &
     887              :                  +Lt(I)/POM2*Hp_face(I)*(-1.d0/Vol(I)**3*DVR(I) &
     888              :                                         -1.d0/Vol(I+1)**3*DVRM(I+1))  &
     889            0 :                  +Lt(I)/Hp_face(I)*dHp_dr_00(I)
     890              : 
     891              :             DLTXM(I)=Lt(I)/POM2*Hp_face(I)*(-1.d0/Vol(I)**3*DVRM(I)) &
     892            0 :                     +Lt(I)/Hp_face(I)*dHp_dr_in(I)
     893              :             DLTXP(I)=Lt(I)/POM2*Hp_face(I)*(-1.d0/Vol(I+1)**3*DVR(I+1)) &
     894            0 :                     +Lt(I)/Hp_face(I)*dHp_dr_out(I)
     895            0 :             DLTY0(I)=Lt(I)/Hp_face(I)*dHp_dT_00(I)
     896            0 :             DLTYP(I)=Lt(I)/Hp_face(I)*dHp_dT_out(I)
     897            0 :             DLTZ0(I)=-POM*POM2*1.5d0*sqrt(Et(I)  )/dm_bar(I)
     898            0 :             DLTZP(I)= POM*POM2*1.5d0*sqrt(Et(I+1))/dm_bar(I)
     899              :          end if
     900              :       end do
     901              : 
     902              : !     TURBULENT PRESSURE (ZONE)
     903            0 :       do I=IBOTOM+1,NZN-1
     904            0 :          if(ALFAP==0.d0)then
     905            0 :             PTURB(I) = 0.d0
     906            0 :             dPtrb_dw_00(I) = 0.d0
     907            0 :             dPtrb_dr_00(I) = 0.d0
     908            0 :             dPtrb_dr_in(I) = 0.d0
     909              :          else
     910            0 :             PTURB(I) =  ALFAP*Et(I)/Vol(I)
     911            0 :             dPtrb_dw_00(I) =  ALFAP/Vol(I)
     912            0 :             TEM1=-ALFAP*Et(I)/Vol(I)**2
     913            0 :             dPtrb_dr_00(I) = TEM1*DVR(I)
     914            0 :             dPtrb_dr_in(I) = TEM1*DVRM(I)
     915              :          end if
     916              :       end do
     917              : 
     918            0 :       do I=1,IBOTOM
     919            0 :          PTURB(I)= 0.d0
     920            0 :          dPtrb_dw_00(I)= 0.d0
     921            0 :          dPtrb_dr_00(I)= 0.d0
     922            0 :          dPtrb_dr_in(I)= 0.d0
     923            0 :          dC_dr_00(I) = 0.d0
     924            0 :          dC_dr_out(I) = 0.d0
     925            0 :          dC_dr_in(I) = 0.d0
     926            0 :          dC_dr_in2(I)= 0.d0
     927            0 :          dC_dT_in(I) = 0.d0
     928            0 :          dC_dT_00(I) = 0.d0
     929            0 :          dC_dT_out(I) = 0.d0
     930            0 :          dC_dw_00(I) = 0.d0
     931              :       end do
     932            0 :       do I=1,IBOTOM-1
     933            0 :          DLCX0(I)= 0.d0
     934            0 :          DLCXM(I)= 0.d0
     935            0 :          DLCXP(I)= 0.d0
     936            0 :          DLCY0(I)= 0.d0
     937            0 :          DLCYP(I)= 0.d0
     938            0 :          DLCZ0(I)= 0.d0
     939            0 :          DLCZP(I)= 0.d0
     940            0 :          DLTX0(I)= 0.d0
     941            0 :          DLTXM(I)= 0.d0
     942            0 :          DLTXP(I)= 0.d0
     943            0 :          DLTY0(I)= 0.d0
     944            0 :          DLTYP(I)= 0.d0
     945            0 :          DLTZ0(I)= 0.d0
     946            0 :          DLTZP(I)= 0.d0
     947              :       end do
     948            0 :       PTURB(NZN)= 0.d0
     949            0 :       dPtrb_dw_00(NZN)= 0.d0
     950            0 :       dPtrb_dr_00(NZN)= 0.d0
     951            0 :       dPtrb_dr_in(NZN)= 0.d0
     952            0 :       DLCX0(NZN)= 0.d0
     953            0 :       DLCXM(NZN)= 0.d0
     954            0 :       DLCXP(NZN)= 0.d0
     955            0 :       DLCY0(NZN)= 0.d0
     956            0 :       DLCYP(NZN)= 0.d0
     957            0 :       DLCZ0(NZN)= 0.d0
     958            0 :       DLCZP(NZN)= 0.d0
     959            0 :       DLTX0(NZN)= 0.d0
     960            0 :       DLTXM(NZN)= 0.d0
     961            0 :       DLTXP(NZN)= 0.d0
     962            0 :       DLTY0(NZN)= 0.d0
     963            0 :       DLTYP(NZN)= 0.d0
     964            0 :       DLTZ0(NZN)= 0.d0
     965            0 :       DLTZP(NZN)= 0.d0
     966            0 :       dC_dr_00(NZN) = 0.d0
     967            0 :       dC_dr_out(NZN) = 0.d0
     968            0 :       dC_dr_in(NZN) = 0.d0
     969            0 :       dC_dr_in2(NZN)= 0.d0
     970            0 :       dC_dT_in(NZN) = 0.d0
     971            0 :       dC_dT_00(NZN) = 0.d0
     972            0 :       dC_dT_out(NZN) = 0.d0
     973            0 :       dC_dw_00(NZN) = 0.d0
     974              : 
     975            0 :       if(ALFA==0.d0) then     !RADIATIVE CASE
     976            0 :          SOURCE(I) = 0.d0
     977            0 :          DAMP(I)   = 0.d0
     978            0 :          DAMPR(I)  = 0.d0
     979            0 :          dC_dr_00(I)   = 0.d0
     980            0 :          dC_dr_out(I)   = 0.d0
     981            0 :          dC_dr_in(I)   = 0.d0
     982            0 :          dC_dr_in2(I)  = 0.d0
     983            0 :          dC_dT_in(I)   = 0.d0
     984            0 :          dC_dT_00(I)   = 0.d0
     985            0 :          dC_dT_out(I)   = 0.d0
     986            0 :          dC_dw_00(I)   = 0.d0
     987              :       end if
     988              : 
     989              : 
     990              : !     INITIALIZE HD(11,3*NZN)
     991            0 :       do I=1,3*NZN
     992            0 :          do J=1,11
     993            0 :             HD(J,I)=0.d0
     994              :          end do
     995              :       end do
     996              : 
     997              : !     LOOP 2 .. LUM PLUGS
     998              :       DLR  =  0.d0
     999            0 :       DLRP =  0.d0
    1000            0 :       DLRM =  0.d0
    1001            0 :       DLT  =  0.d0
    1002            0 :       DLTP =  0.d0
    1003            0 :       DLR  =  0.d0  !!-1.d0
    1004            0 :       do 5 I=1,NZN
    1005            0 :          IR = 3+3*(I-1)
    1006            0 :          IC = 2+3*(I-1)
    1007            0 :          IW = 1+3*(I-1)
    1008              : !        SET LUM(I-1)
    1009            0 :          DLMR  = DLR
    1010            0 :          DLMRP = DLRP
    1011            0 :          DLMRM = DLRM
    1012            0 :          DLMT  = DLT
    1013            0 :          DLMTP = DLTP
    1014            0 :          if(I==NZN) GOTO 6
    1015              : !        Lr(I)=Eq. A.4, Stellingwerf 1975, Appendix A
    1016              : !        CALC LUM(I)
    1017            0 :          W_00=T(I)**4
    1018            0 :          W_out=T(I+1)**4
    1019            0 :          BW=dlog(W_out/W_00)
    1020            0 :          BK=dlog(K(I+1)/K(I))
    1021            0 :          T1=-CL*R(I)**4/dm_bar(I)
    1022            0 :          T2=(W_out/K(I+1)-W_00/K(I))/(1.d0-BK/BW)
    1023            0 :          Lr(I)=T1*T2
    1024            0 :          T3=T1/(BW-BK)
    1025            0 :          DLK=  (T3/K(I))  *(W_00*BW/K(I)  -T2)  !dL(i)/dK(i)
    1026            0 :          DLKP=-(T3/K(I+1))*(W_out*BW/K(I+1)-T2)  !dL(i)/dK(i+1)
    1027            0 :          DLRP= DLKP*dK_dV_00(I+1)*DVR(I+1)
    1028            0 :          DLRM= DLK *dK_dV_00(I)  *DVRM(I)
    1029            0 :          DLR= 4.d0*T1*T2/R(I)+DLK*dK_dV_00(I)*DVR(I)+DLKP*dK_dV_00(I+1)*DVRM(I+1)
    1030            0 :          DLTP=4.d0*(T3/T(I+1))*(W_out*BW/K(I+1)-T2*BK/BW)+DLKP*dK_dT_00(I+1)
    1031            0 :          DLT=-4.d0*(T3/T(I))*(W_00*BW/K(I)-T2*BK/BW)+DLK*dK_dT_00(I)
    1032            0 :          GOTO 7
    1033              : !        OUTER LUM BOUNDARY CONDITION
    1034              :  6       continue
    1035            0 :          Lr(I)=L0
    1036            0 :          DLT  = 4.d0*L0/T(I)  !L=4piR^2sigT^4
    1037            0 :          DLR  = 2.d0*L0/R(I)  !L=4piR^2sigT^4
    1038            0 :          DLRM = 0.d0
    1039            0 :          DLRP = 0.d0
    1040            0 :          DLTP = 0.d0
    1041              :  7       continue
    1042              : !        CALC ENERGY EQUATION(I)
    1043            0 :          HR(IW)    = -(Lr(I)/L0+Lc(I)/L0+Lt(I)/L0-1.d0)
    1044              :          !write(*,*) 'energy', I, HR(IW)
    1045            0 :          if (is_bad(HR(IW))) then
    1046            0 :             write(*,*) 'L0', I, L0
    1047            0 :             write(*,*) 'Lt(I)', I, Lt(I)
    1048            0 :             write(*,*) 'Lc(I)', I, Lc(I)
    1049            0 :             write(*,*) 'Lr(I)', I, Lr(I)
    1050            0 :             stop
    1051              :          end if
    1052            0 :          HD(6,IW)  = (DLT +DLCY0(I)+DLTY0(I))/L0     !Y(i)
    1053            0 :          HD(9,IW)  = (DLTP+DLCYP(I)+DLTYP(I))/L0     !Y(i+1)
    1054            0 :          HD(5,IW)  = (DLRM+DLCXM(I)+DLTXM(I))/L0     !X(i-1)
    1055            0 :          HD(8,IW)  = (DLR +DLCX0(I)+DLTX0(I))/L0     !X(i)
    1056            0 :          HD(11,IW) = (DLRP+DLCXP(I)+DLTXP(I))/L0     !X(i+1)
    1057            0 :          HD(7,IW)  = (     DLCZ0(I)+DLTZ0(I))/L0     !Z(i)
    1058            0 :          HD(10,IW) = (     DLCZP(I)+DLTZP(I))/L0     !Z(i+1)
    1059              : !        CALC MOMEMTUM EQUATION(I)
    1060            0 :          T1=-P4*(R(I)**2)/dm_bar(I)
    1061            0 :          if(I==NZN) then
    1062            0 :             HR(IR) = -T1*(Psurf-P(I)-PTURB(I))+G*M(I)/R(I)**2
    1063              :          else
    1064            0 :             HR(IR)=-T1*(P(I+1)-P(I)+PTURB(I+1)-PTURB(I))+G*M(I)/R(I)**2
    1065              :          end if
    1066              :          !write(*,*) 'momentum', I, HR(IR)
    1067            0 :          HD(3,IR) = +T1*(-dP_dr_in(I)-dPtrb_dr_in(I))  !X(i-1)
    1068            0 :          HD(4,IR) = +T1*(-dP_dT_00(I))            !Y(i)
    1069              : 
    1070            0 :          HD(2,IR) = 0.d0                     !Z(i-1)
    1071            0 :          HD(5,IR) = +T1*(-dPtrb_dw_00(I))          !Z(i)
    1072            0 :          HD(8,IR) = +T1*(dPtrb_dw_00(I+1))         !Z(i+1)
    1073              : 
    1074            0 :          if(I==NZN) GOTO 111
    1075              :          HD(6,IR) = +T1*(dP_dr_in(I+1)-dP_dr_00(I)+dPtrb_dr_in(I+1)-dPtrb_dr_00(I))+ &
    1076            0 :                     4.d0*G*M(I)/(R(I)**3)    !X(i)
    1077            0 :          HD(7,IR) = +T1*(dP_dT_00(I+1))           !Y(i+1)
    1078            0 :          HD(9,IR) = +T1*(dP_dr_00(I+1)+dPtrb_dr_00(I+1))  !X(i+1)
    1079            0 :          GOTO 112
    1080            0 :  111     HD(7,IR)=  0.d0
    1081            0 :          HD(9,IR)=  0.d0
    1082            0 :          HD(6,IR)= +T1*(-dP_dr_00(I))+4.d0*G*M(I)/(R(I)**3)
    1083              :  112     continue
    1084              : 
    1085              : !        CALC CONVECTIVE ENERGY EQUATION
    1086            0 :          if(I<=IBOTOM.or.I==NZN.or.ALFA==0.d0)then
    1087            0 :             do J=1,11
    1088            0 :                HD(J,IC)=0.d0
    1089              :             end do
    1090            0 :             HD(6,IC)=1.d0
    1091            0 :             HR(IC)=0.d0
    1092              :          else
    1093            0 :             T1=-1.d0/dm(I)
    1094            0 :             HR(IC)= -(T1*(Lt(I)-Lt(I-1))+SOURCE(I)-DAMP(I)-DAMPR(I))
    1095              :             !write(*,*) 'conv energy', I, HR(IC)
    1096            0 :             if (is_bad(HR(IC))) then
    1097            0 :                write(*,*) 'Lt(I', I, Lt(I)
    1098            0 :                write(*,*) 'Lt(I-1)', I-1, Lt(I-1)
    1099            0 :                write(*,*) 'SOURCE(I)', I, SOURCE(I)
    1100            0 :                write(*,*) 'DAMP(I)', I, DAMP(I)
    1101            0 :                write(*,*) 'DAMPR(I)', I, DAMPR(I)
    1102            0 :                stop
    1103              :             end if
    1104            0 :             HD(3,IC)  =          +T1*(        -DLTZ0(I-1))  !Z(i-1)
    1105            0 :             HD(6,IC)  = dC_dw_00(I) +T1*(DLTZ0(I)-DLTZP(I-1))  !Z(i)
    1106            0 :             HD(9,IC)  =          +T1*(DLTZP(I))             !Z(i+1)
    1107            0 :             HD(1,IC)  = dC_dr_in2(I)+T1*(        -DLTXM(I-1))  !X(i-2)
    1108            0 :             HD(4,IC)  = dC_dr_in(I) +T1*(DLTXM(I)-DLTX0(I-1))  !X(i-1)
    1109            0 :             HD(7,IC)  = dC_dr_00(I) +T1*(DLTX0(I)-DLTXP(I-1))  !X(i)
    1110            0 :             HD(10,IC) = dC_dr_out(I) +T1*(DLTXP(I))             !X(i+1)
    1111            0 :             HD(2,IC)  = dC_dT_in(I) +T1*(        -DLTY0(I-1))  !Y(i-1)
    1112            0 :             HD(5,IC)  = dC_dT_00(I) +T1*(DLTY0(I)-DLTYP(I-1))  !Y(i)
    1113            0 :             HD(8,IC)  = dC_dT_out(I) +T1*(DLTYP(I))             !Y(i+1)
    1114              :          end if
    1115              : 
    1116              : !        SET ANCHOR T(NZN)=CONST
    1117            0 :          if(I==NZN) then
    1118            0 :             do j=1,11
    1119            0 :                HD(J,IW) = 0.d0
    1120              :             end do
    1121              : !           SET dT(NZN)=0
    1122            0 :             HD(6,IW) = 1.d0
    1123            0 :             HR(IW)   = 0.d0
    1124              : !           SET DERIVATIVES d(*)/dT(NZN)=0 IN ZONE/ITERFACE NZN
    1125            0 :             HD(4,IR) = 0.d0
    1126            0 :             HD(5,IC) = 0.d0
    1127              :          end if
    1128            0 :          if(I==NZN-1)then
    1129              : !           SET DERIVATIVES d(*)/dT(NZN)=0 IN ZONE/ITERFACE NZN-1
    1130            0 :             HD(9,IW)  = 0.d0
    1131            0 :             HD(7,IR)  = 0.d0
    1132            0 :             HD(8,IC)  = 0.d0
    1133              :          end if
    1134              : 
    1135            0 :   5   continue
    1136              : 
    1137            0 :       if(ending) GOTO 889
    1138              : 
    1139            0 :       do J=1,5     !translate hd into band storage of LAPACK/LINPACK
    1140            0 :          do I=1,3*NZN+1
    1141            0 :             ABB(J,I)=0.0d0
    1142              :          end do
    1143              :       end do
    1144            0 :       do J=1,5
    1145            0 :          do I=1,3*NZN+1-J
    1146            0 :             ABB(11-J,I+J)=HD(6+J,I)  !upper diagonals
    1147            0 :             ABB(11+J,I)=HD(6-J,I+J)  !lower diagonals
    1148              :          end do
    1149              :       end do
    1150            0 :       do I=1,3*NZN+1
    1151            0 :          ABB(11,I)=HD(6,I)
    1152              :       end do
    1153              : 
    1154              : !-    LAPACK
    1155            0 :       call DGBTRF(3*NZN,3*NZN,5,5,ABB,LD_ABB,IPVT,INFO)
    1156            0 :       if(INFO/=0) then
    1157            0 :          write(*,*) 'hyd: LAPACK/dgbtrf problem no., iter.',INFO,II
    1158            0 :          open(61,file='x.dat',status='unknown')
    1159            0 :          write(61,'(F6.3,tr2,f8.2,tr2,f7.2,tr2,d9.3)')EMR,ELR,TE-0.5d0, &
    1160            0 :               gam
    1161            0 :          close(61)
    1162            0 :          open(61,file='logic.dat',status='unknown')
    1163            0 :          write(61,'(I1)') 3
    1164            0 :          close(61)
    1165            0 :          stop
    1166              :       end if
    1167            0 :       call DGBTRS('n',3*NZN,5,5,1,ABB,LD_ABB,IPVT,HR,3*NZN,INFO)
    1168            0 :       if(INFO/=0) then
    1169            0 :          write(*,*) 'hyd: LAPACK/dgbtrs problem no., iter.',INFO,II
    1170            0 :          stop
    1171              :       end if
    1172              : !-
    1173            0 :       do I=1,3*NZN,1
    1174            0 :          DX(I) = HR(I)
    1175              :       end do
    1176              : 
    1177            0 :       EZH = 1.d0
    1178            0 :       XXR = 0.d0
    1179            0 :       XXT = 0.d0
    1180            0 :       XXC = 0.d0
    1181            0 :          XX_max = 0
    1182            0 :          XX_max_val = 0
    1183            0 :          XX_max_dx = 0
    1184            0 :          i_XX_max = 0
    1185            0 :          var_XX_max = 0
    1186            0 :       do I=2,NZN
    1187            0 :          IR = 3+3*(I-1)
    1188            0 :          IC = IR-1
    1189            0 :          IW = IR-2
    1190            0 :          if(Et(I)>(1.d-20)*EFL02) XXC=dabs(DX(IC)/Et(I))
    1191            0 :          XXR=((DX(IR-3)-DX(IR))/(R(I)-R(I-1)))/DXH
    1192            0 :          XXT=dabs(DX(IW)/T(I))/DXH
    1193              : 
    1194              :          if (XXC > XX_max) then
    1195              :             XX_max = XXC
    1196              :             XX_max_val = Et(I)
    1197              :             XX_max_dx = DX(IC)
    1198              :             i_XX_max = i
    1199              :             var_XX_max = 1
    1200              :          end if
    1201              :          if (XXR > XX_max) then
    1202              :             XX_max = XXR
    1203              :             XX_max_val = R(I)
    1204              :             XX_max_dx = DX(IR)
    1205              :             i_XX_max = i
    1206              :             var_XX_max = 2
    1207              :          end if
    1208              :          if (XXT > XX_max) then
    1209              :             XX_max = XXT
    1210              :             XX_max_val = T(I)
    1211              :             XX_max_dx = DX(IW)
    1212              :             i_XX_max = i
    1213              :             var_XX_max = 3
    1214              :          end if
    1215              : 
    1216            0 :          EZH=1.d0/dmax1(1.d0/EZH,XXR,XXT,XXC)
    1217              :       end do
    1218              : 
    1219            0 :       DXXR = 0.d0
    1220            0 :       DXXT = 0.d0
    1221            0 :       DXXC = 0.d0
    1222            0 :       ITROUBT = 0
    1223            0 :       ITROUBC = 0
    1224              : !     It seems that for BL Her models fixed undercorrection factor works best
    1225            0 :       do I=1,NZN
    1226            0 :          IW=1+3*(I-1)
    1227            0 :          IR=IW+2
    1228            0 :          IC=IW+1
    1229            0 :          T(I)      = T(I)     +EZH*DX(IW)/2d0
    1230            0 :          R(I)      = R(I)     +EZH*DX(IR)/2d0
    1231            0 :          Et(I) = Et(I)+EZH*DX(IC)/2d0
    1232            0 :          if(Et(I)<=0.d0) then
    1233            0 :             Et(I)=EFL02*1d-4*rand(s)
    1234              :          end if
    1235            0 :          DXKT=DXXT
    1236            0 :          DXKC=DXXC
    1237            0 :          DXXR=dmax1(DXXR,dabs(DX(IR)/R(I)))
    1238            0 :          DXXT=dmax1(DXXT,dabs(DX(IW)/T(I)))
    1239            0 :          if(Et(I)>(1.d-20)*EFL02)  &
    1240            0 :             DXXC=dmax1(DXXC,dabs(DX(IC)/Et(I)))
    1241            0 :          if(DXXC>DXKC) ITROUBC=I
    1242            0 :          if(DXXT>DXKT) ITROUBT=I
    1243              :       end do
    1244              :       !write(*,*) 'apply corr', II,dabs(DXXC),dabs(DXXR),dabs(DXXT),ITROUBC, &
    1245              :       !      Et(ITROUBC),EZH
    1246              :       !call mesa_error(__FILE__,__LINE__,'debug')
    1247              :       !write(*,*) 'DXXC/PRECR', ITROUBC, DXXC/PRECR, DXXC
    1248            0 :       if(dabs(DXXC)<PRECR.and.dabs(DXXR)<PRECR.and. &
    1249            0 :          dabs(DXXT)<PRECR) then
    1250            0 :          IZIP=1
    1251            0 :          IOP=IOP+1
    1252            0 :          GOTO 999
    1253              :       end if
    1254              : 
    1255              :       end do
    1256              : 
    1257            0 :       write(*,'(A)')
    1258            0 :       write(*,*) ' NO CONVERGENCE IN RELAX_ENV, ITERATION: ',II
    1259            0 :       write(*,*) ' try increasing RSP_relax_dm_tolerance', s% RSP_relax_dm_tolerance
    1260            0 :       write(*,'(A)')
    1261            0 :       ierr = -1
    1262            0 :       return
    1263            0 :       stop
    1264              : 
    1265              :  889  continue
    1266              : 
    1267              : 
    1268              :       !MAXFLUXD=-2d10
    1269              :       !do I=1,NZN
    1270              :       !   if(abs(HR(1+3*(I-1)))>MAXFLUXD) &
    1271              :       !      MAXFLUXD=abs(HR(1+3*(I-1)))
    1272              :       !end do
    1273              :       !write(*,*) 'MAXFLUXD= ',MAXFLUXD
    1274              : 
    1275            0 :       POM=MSTAR-M(1)+dm(1)
    1276            0 :       if (s% RSP_trace_RSP_build_model) then
    1277            0 :          write(*,*) ' inner temper. rel. diff',(T(1)-TINNER)/TINNER
    1278            0 :          write(*,*) '  inner radius rel. diff',(R(1)-RINNER)/RINNER
    1279            0 :          write(*,*) '  outer radius rel. diff',(R(NZN)-ROUTER)/ROUTER
    1280            0 :          write(*,*) ' envelope mass rel. diff',(POM-MENVEL)/MENVEL
    1281              :       end if
    1282              :  222  format(A,d14.8)
    1283              :       if (.false.) then
    1284              :          MAXR=-1d0
    1285              :          MAXW=-1d0
    1286              :          MAXC=-1d0
    1287              :          write(*,*) 'static structure check'
    1288              :          !open(15,file='ss_lin.dat',status='unknown')
    1289              :          do J=1,NZN
    1290              :             IR=4+3*(J-1)
    1291              :             IW=2+3*(J-1)
    1292              :             PB=P(J)+PTURB(J)
    1293              :             if (J == NZN) then
    1294              :                PPB = 0
    1295              :             else
    1296              :                PPB=P(J+1)+PTURB(J+1)
    1297              :             end if
    1298              :             T1=P4*(R(J)**2)
    1299              :             T2=(PPB-PB)/dm_bar(J)
    1300              :             T3=G*M(J)/(R(J)**2)
    1301              :             if (dabs((T3+T1*T2)/T3)>MAXR)then
    1302              :                MAXR=dabs((T3+T1*T2)/T3)
    1303              :                IMAXR=J
    1304              :             end if
    1305              :             ELB=Lc(J)+Lr(J)+Lt(J)
    1306              :             if (J == 1) then
    1307              :                ELMB=0
    1308              :             else
    1309              :                ELMB=Lc(J-1)+Lr(J-1)+Lt(J-1)
    1310              :             end if
    1311              :             if (dabs((ELB-L0)/L0)>MAXW)then
    1312              :                MAXW=dabs((ELB-L0)/L0)
    1313              :                IMAXW=J
    1314              :             end if
    1315              :             if (J > IBOTOM .and. J < NZN) then
    1316              :                ELB=Lt(J)
    1317              :                ELMB=Lt(J-1)
    1318              :                T1=(ELB-ELMB)/dm(J)
    1319              :                T2=SOURCE(J)-DAMP(J)-DAMPR(J)
    1320              :                if ((T2/=0.d0).and.(T1/=0.d0))then
    1321              :                   if (dabs(T1-T2)/max(T1,T2)>MAXC)then
    1322              :                      MAXC=dabs(T1-T2)/max(T1,T2)
    1323              :                      IMAXC=J
    1324              :                   end if
    1325              :                end if
    1326              :             end if
    1327              :          end do
    1328              :          if (MAXR/=-1d0)write(*,*) 'MAX DIFFERENCE R: ',MAXR,' ZONE: ',IMAXR
    1329              :          if (MAXW/=-1d0)write(*,*) 'MAX DIFFERENCE W: ',MAXW,' ZONE: ',IMAXW
    1330              :          if (MAXC/=-1d0)write(*,*) 'MAX DIFFERENCE C: ',MAXC,' ZONE: ',IMAXC
    1331              :       end if
    1332              :       return
    1333            0 :       end subroutine RELAX_ENV
    1334              : 
    1335              :       end module rsp_relax_env
        

Generated by: LCOV version 2.0-1