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

            Line data    Source code
       1              : ! ***********************************************************************
       2              : !
       3              : !   Copyright (C) 2010-2019  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 pgstar_mixing_Ds
      21              : 
      22              :       use star_private_def
      23              :       use const_def, only: dp, rayleigh_taylor_mixing, minimum_mixing
      24              :       use pgstar_support
      25              :       use pgstar_trho_profile
      26              :       use star_pgstar
      27              : 
      28              :       implicit none
      29              : 
      30              :       contains
      31              : 
      32            0 :       subroutine Mixing_plot(id, device_id, ierr)
      33              :          integer, intent(in) :: id, device_id
      34              :          integer, intent(out) :: ierr
      35              : 
      36              :          type (star_info), pointer :: s
      37              : 
      38              :          ierr = 0
      39            0 :          call get_star_ptr(id, s, ierr)
      40            0 :          if (ierr /= 0) return
      41              : 
      42            0 :          call pgslct(device_id)
      43            0 :          call pgbbuf()
      44            0 :          call pgeras()
      45              : 
      46              :          call do_Mixing_plot(s, id, device_id, &
      47              :             s% pg% Mixing_xleft, s% pg% Mixing_xright, &
      48              :             s% pg% Mixing_ybot, s% pg% Mixing_ytop, .false., &
      49            0 :             s% pg% Mixing_title, s% pg% Mixing_txt_scale, ierr)
      50              : 
      51            0 :          call pgebuf()
      52              : 
      53              :       end subroutine Mixing_plot
      54              : 
      55              : 
      56            0 :       subroutine do_Mixing_plot(s, id, device_id, &
      57              :             winxmin, winxmax, winymin, winymax, subplot, &
      58              :             title, txt_scale, ierr)
      59              :          type (star_info), pointer :: s
      60              :          integer, intent(in) :: id, device_id
      61              :          real, intent(in) :: winxmin, winxmax, winymin, winymax
      62              :          logical, intent(in) :: subplot
      63              :          character (len=*), intent(in) :: title
      64              :          real, intent(in) :: txt_scale
      65              :          integer, intent(out) :: ierr
      66              :          call do_Mixing_panel(s, id, device_id, &
      67              :             winxmin, winxmax, winymin, winymax, subplot, title, txt_scale, &
      68              :             s% pg% Mixing_xaxis_name, s% pg% Mixing_xmin, s% pg% Mixing_xmax, &
      69              :             s% pg% Mixing_xaxis_reversed, s% pg% Mixing_ymin, s% pg% Mixing_ymax, &
      70            0 :             .false., .true., ierr)
      71            0 :       end subroutine do_Mixing_plot
      72              : 
      73              : 
      74            0 :       subroutine do_Mixing_panel(s, id, device_id, &
      75              :             winxmin, winxmax, winymin, winymax, subplot, title, txt_scale, &
      76              :             xaxis_name, xmin, xmax, xaxis_reversed, ymin, ymax, &
      77              :             panel_flag, xaxis_numeric_labels_flag, ierr)
      78              :          type (star_info), pointer :: s
      79              :          integer, intent(in) :: id, device_id
      80              :          real, intent(in) :: &
      81              :             winxmin, winxmax, winymin, winymax, xmin, xmax, ymin, ymax
      82              :          character (len=*), intent(in) :: title, xaxis_name
      83              :          real, intent(in) :: txt_scale
      84              :          logical, intent(in) :: subplot, &
      85              :             xaxis_reversed, panel_flag, xaxis_numeric_labels_flag
      86              :          integer, intent(out) :: ierr
      87              :          call MixDs_plot(s, device_id, &
      88              :             s% pg% Mixing_win_flag, s% pg% Mixing_file_flag, &
      89              :             s% pg% do_Mixing_win, s% pg% do_Mixing_file, &
      90              :             s% pg% id_Mixing_win, s% pg% id_Mixing_file, s% pg% Mixing_file_interval, &
      91              :             s% pg% Mixing_file_dir, s% pg% Mixing_file_prefix, &
      92              :             s% pg% show_Mixing_annotation1, s% pg% show_Mixing_annotation2, &
      93              :             s% pg% show_Mixing_annotation3, &
      94              :             xaxis_name, xmin, xmax, xaxis_reversed, &
      95              :             ymin, ymax, s% pg% Mixing_dymin, &
      96              :             s% pg% Mixing_win_width, s% pg% Mixing_win_aspect_ratio, &
      97              :             s% pg% prev_Mixing_win_width, s% pg% prev_Mixing_win_ratio, &
      98              :             s% pg% Mixing_file_width, s% pg% Mixing_file_aspect_ratio, &
      99              :             s% pg% prev_Mixing_file_width, s% pg% prev_Mixing_file_ratio, &
     100              :             winxmin, winxmax, winymin, winymax, subplot, title, txt_scale, &
     101            0 :             panel_flag, xaxis_numeric_labels_flag, ierr)
     102            0 :       end subroutine do_Mixing_panel
     103              : 
     104              : 
     105              : 
     106            0 :       subroutine MixDs_plot(s, device_id, &
     107              :             MixDs_win_flag, MixDs_file_flag, &
     108              :             do_MixDs_win, do_MixDs_file, &
     109              :             id_MixDs_win, id_MixDs_file, MixDs_file_interval, &
     110              :             MixDs_file_dir, MixDs_file_prefix, &
     111              :             show_MixDs_annotation1, show_MixDs_annotation2, show_MixDs_annotation3, &
     112              :             MixDs_xaxis_name, MixDs_xmin, MixDs_xmax, MixDs_xaxis_reversed, &
     113              :             MixDs_ymin, MixDs_ymax, MixDs_dymin, &
     114              :             MixDs_win_width, MixDs_win_aspect_ratio, &
     115              :             prev_MixDs_win_width, prev_MixDs_win_ratio, &
     116              :             MixDs_file_width, MixDs_file_aspect_ratio, &
     117              :             prev_MixDs_file_width, prev_MixDs_file_ratio, &
     118              :             winxmin, winxmax, winymin, winymax, subplot, title, txt_scale, &
     119              :             panel_flag, xaxis_numeric_labels_flag, ierr)
     120              : 
     121              :          use utils_lib
     122              : 
     123              :          type (star_info), pointer :: s
     124              :          integer, intent(in) :: device_id
     125              :          logical, intent(in) :: MixDs_win_flag, MixDs_file_flag
     126              :          logical, intent(in) :: do_MixDs_win, do_MixDs_file
     127              :          integer, intent(in) :: id_MixDs_win, id_MixDs_file, MixDs_file_interval
     128              :          character (len=strlen), intent(in) :: MixDs_file_dir, MixDs_file_prefix
     129              :          logical, intent(in) :: show_MixDs_annotation1, show_MixDs_annotation2, show_MixDs_annotation3
     130              :          character (len=*), intent(in) :: MixDs_xaxis_name, title
     131              :          real, intent(in) :: &
     132              :             MixDs_xmin, MixDs_xmax, &
     133              :             MixDs_ymin, MixDs_ymax, MixDs_dymin, &
     134              :             MixDs_win_width, MixDs_win_aspect_ratio, &
     135              :             prev_MixDs_win_width, prev_MixDs_win_ratio, &
     136              :             MixDs_file_width, MixDs_file_aspect_ratio, &
     137              :             prev_MixDs_file_width, prev_MixDs_file_ratio
     138              :          real, intent(in) :: winxmin, winxmax, winymin, winymax, txt_scale
     139              :          logical, intent(in) :: subplot, &
     140              :             MixDs_xaxis_reversed, panel_flag, xaxis_numeric_labels_flag
     141              :          integer, intent(out) :: ierr
     142              : 
     143            0 :          real :: chScale, xmargin
     144            0 :          real :: xmin, xmax, xleft, xright, dx, ymin, ymax, ymin2, ymax2, dy, &
     145            0 :             legend_xmin, legend_xmax, legend_ymin, legend_ymax
     146              :          integer :: grid_min, grid_max, npts, nz, number_of_legend_lines
     147              :          real, allocatable, dimension(:) :: &
     148              :             xvec, yvec, y_conv, y_left, y_sc, y_ovr, y_th, y_min_mix, y_RTI_mix
     149              : 
     150              :          include 'formats'
     151            0 :          ierr = 0
     152              : 
     153            0 :          xmargin = 0
     154              : 
     155            0 :          chScale = txt_scale
     156              : 
     157            0 :          nz = s% nz
     158              :          allocate (xvec(nz), yvec(nz), y_conv(nz), y_left(nz), &
     159            0 :             y_sc(nz), y_ovr(nz), y_th(nz), y_min_mix(nz), y_RTI_mix(nz))
     160              : 
     161              :          call set_xaxis_bounds( &
     162              :             s, MixDs_xaxis_name, MixDs_xmin, MixDs_xmax, &
     163              :             MixDs_xaxis_reversed, xmargin, &
     164              :             xvec, xmin, xmax, xleft, xright, dx, &
     165            0 :             grid_min, grid_max, npts, ierr)
     166            0 :          if (ierr /= 0) return
     167              : 
     168            0 :          legend_xmin = winxmax
     169            0 :          legend_xmax = min(1.0, winxmax + (winxmax - winxmin)/5)
     170            0 :          legend_ymin = winymin
     171            0 :          legend_ymax = winymax
     172              : 
     173            0 :          call pgsave
     174            0 :          call pgsch(txt_scale)
     175            0 :          call plot(ierr)
     176            0 :          if (ierr == 0) call show_annotations(s, &
     177            0 :             show_MixDs_annotation1, show_MixDs_annotation2, show_MixDs_annotation3)
     178            0 :          call pgunsa
     179              : 
     180            0 :          deallocate(xvec, yvec, y_conv, y_left, y_sc, y_ovr, y_th, y_min_mix, y_RTI_mix)
     181              : 
     182              :          contains
     183              : 
     184              : 
     185            0 :          subroutine plot(ierr)
     186              :             use pgstar_colors
     187              :             integer, intent(out) :: ierr
     188              : 
     189              :             integer :: lw, lw_sav
     190            0 :             real :: val
     191              :             integer :: k, cnt
     192              :             logical :: rotation
     193              :             real(dp) :: &
     194            0 :                D_visc_factor, &
     195            0 :                D_DSI_factor, &
     196            0 :                D_SH_factor, &
     197            0 :                D_SSI_factor, &
     198            0 :                D_ES_factor, &
     199            0 :                D_GSF_factor, &
     200            0 :                D_ST_factor
     201              : 
     202              :             include 'formats'
     203            0 :             ierr = 0
     204              : 
     205            0 :             rotation = s% rotation_flag
     206              : 
     207            0 :             lw = 8
     208            0 :             call pgqlw(lw_sav)
     209              : 
     210            0 :             if (.not. panel_flag) then
     211            0 :                call pgsvp(winxmin, winxmax, winymin, winymax)
     212            0 :                if (.not. subplot) then
     213            0 :                   call show_model_number_pgstar(s)
     214            0 :                   call show_age_pgstar(s)
     215              :                end if
     216            0 :                call show_title_pgstar(s, title)
     217            0 :                call pgsci(clr_Foreground)
     218            0 :                call show_xaxis_name(s,MixDs_xaxis_name,ierr)
     219            0 :                if (ierr /= 0) return
     220              :             end if
     221              : 
     222            0 :             y_conv(:) = -100
     223            0 :             y_left(:) = -100
     224            0 :             y_sc(:) = -100
     225            0 :             y_ovr(:) = -100
     226            0 :             y_th(:) = -100
     227            0 :             y_RTI_mix(:) = -100
     228            0 :             y_min_mix(:) = -100
     229            0 :             do k=grid_min, grid_max
     230            0 :                val = safe_log10(s% D_mix_non_rotation(k))
     231            0 :                select case (s% mixing_type(k))
     232              :                   case (convective_mixing)
     233            0 :                      y_conv(k) = val
     234              :                   case (leftover_convective_mixing)
     235            0 :                      y_left(k) = val
     236              :                   case (semiconvective_mixing)
     237            0 :                      y_sc(k) = val
     238              :                   case (overshoot_mixing)
     239            0 :                      y_ovr(k) = val
     240              :                   case (thermohaline_mixing)
     241            0 :                      y_th(k) = val
     242              :                   case (rayleigh_taylor_mixing)
     243            0 :                      y_RTI_mix(k) = val
     244              :                   case (minimum_mixing)
     245            0 :                      y_min_mix(k) = val
     246              :                end select
     247              :             end do
     248              : 
     249            0 :             if (MixDs_ymax /= -101) then
     250            0 :                ymax = MixDs_ymax
     251              :             else
     252            0 :                ymax = max(18.0,maxval(y_conv(grid_min:grid_max)))
     253            0 :                ymax2 = max(18.0,maxval(y_left(grid_min:grid_max)))
     254            0 :                if (ymax2 > ymax) ymax = ymax2
     255            0 :                ymax2 = max(18.0,maxval(y_sc(grid_min:grid_max)))
     256            0 :                if (ymax2 > ymax) ymax = ymax2
     257            0 :                ymax2 = max(18.0,maxval(y_ovr(grid_min:grid_max)))
     258            0 :                if (ymax2 > ymax) ymax = ymax2
     259            0 :                ymax2 = max(18.0,maxval(y_th(grid_min:grid_max)))
     260            0 :                if (ymax2 > ymax) ymax = ymax2
     261            0 :                ymax2 = max(18.0,maxval(y_RTI_mix(grid_min:grid_max)))
     262            0 :                if (ymax2 > ymax) ymax = ymax2
     263            0 :                ymax2 = max(18.0,maxval(y_min_mix(grid_min:grid_max)))
     264            0 :                if (ymax2 > ymax) ymax = ymax2
     265            0 :                if (rotation) then
     266            0 :                   ymax2 = max(18.0,real(safe_log10(maxval(s% D_visc(grid_min:grid_max))),kind=kind(ymax2)))
     267            0 :                   if (ymax2 > ymax) ymax = ymax2
     268            0 :                   ymax2 = max(18.0,real(safe_log10(maxval(s% D_DSI(grid_min:grid_max))),kind=kind(ymax2)))
     269            0 :                   if (ymax2 > ymax) ymax = ymax2
     270            0 :                   ymax2 = max(18.0,real(safe_log10(maxval(s% D_SH(grid_min:grid_max))),kind=kind(ymax2)))
     271            0 :                   if (ymax2 > ymax) ymax = ymax2
     272            0 :                   ymax2 = max(18.0,real(safe_log10(maxval(s% D_SSI(grid_min:grid_max))),kind=kind(ymax2)))
     273            0 :                   if (ymax2 > ymax) ymax = ymax2
     274            0 :                   ymax2 = max(18.0,real(safe_log10(maxval(s% D_ES(grid_min:grid_max))),kind=kind(ymax2)))
     275            0 :                   if (ymax2 > ymax) ymax = ymax2
     276            0 :                   ymax2 = max(18.0,real(safe_log10(maxval(s% D_GSF(grid_min:grid_max))),kind=kind(ymax2)))
     277            0 :                   if (ymax2 > ymax) ymax = ymax2
     278            0 :                   ymax2 = max(18.0,real(safe_log10(maxval(s% D_ST(grid_min:grid_max))),kind=kind(ymax2)))
     279            0 :                   if (ymax2 > ymax) ymax = ymax2
     280            0 :                   if (s% D_omega_flag) then
     281            0 :                      ymax2 = max(18.0,real(safe_log10(maxval(s% D_omega(grid_min:grid_max))),kind=kind(ymax2)))
     282            0 :                      if (ymax2 > ymax) ymax = ymax2
     283              :                   end if
     284              :                end if
     285              :             end if
     286              : 
     287            0 :             if (MixDs_ymin /= -101) then
     288            0 :                ymin = MixDs_ymin
     289              :             else
     290            0 :                ymin = max(0.0,minval(y_conv(grid_min:grid_max)))
     291            0 :                ymin2 = max(0.0,minval(y_left(grid_min:grid_max)))
     292            0 :                if (ymin2 < ymin) ymin = ymin2
     293            0 :                ymin2 = max(0.0,minval(y_sc(grid_min:grid_max)))
     294            0 :                if (ymin2 < ymin) ymin = ymin2
     295            0 :                ymin2 = max(0.0,minval(y_ovr(grid_min:grid_max)))
     296            0 :                if (ymin2 < ymin) ymin = ymin2
     297            0 :                ymin2 = max(0.0,minval(y_th(grid_min:grid_max)))
     298            0 :                if (ymin2 < ymin) ymin = ymin2
     299            0 :                ymin2 = max(0.0,minval(y_RTI_mix(grid_min:grid_max)))
     300            0 :                if (ymin2 < ymin) ymin = ymin2
     301            0 :                ymin2 = max(0.0,minval(y_min_mix(grid_min:grid_max)))
     302            0 :                if (ymin2 < ymin) ymin = ymin2
     303            0 :                if (rotation) then
     304            0 :                   ymin2 = max(0.0,real(safe_log10(minval(s% D_visc(grid_min:grid_max))),kind=kind(ymin2)))
     305            0 :                   if (ymin2 < ymin) ymin = ymin2
     306            0 :                   ymin2 = max(0.0,real(safe_log10(minval(s% D_DSI(grid_min:grid_max))),kind=kind(ymin2)))
     307            0 :                   if (ymin2 < ymin) ymin = ymin2
     308            0 :                   ymin2 = max(0.0,real(safe_log10(minval(s% D_SH(grid_min:grid_max))),kind=kind(ymin2)))
     309            0 :                   if (ymin2 < ymin) ymin = ymin2
     310            0 :                   ymin2 = max(0.0,real(safe_log10(minval(s% D_SSI(grid_min:grid_max))),kind=kind(ymin2)))
     311            0 :                   if (ymin2 < ymin) ymin = ymin2
     312            0 :                   ymin2 = max(0.0,real(safe_log10(minval(s% D_ES(grid_min:grid_max))),kind=kind(ymin2)))
     313            0 :                   if (ymin2 < ymin) ymin = ymin2
     314            0 :                   ymin2 = max(0.0,real(safe_log10(minval(s% D_GSF(grid_min:grid_max))),kind=kind(ymin2)))
     315            0 :                   if (ymin2 < ymin) ymin = ymin2
     316            0 :                   ymin2 = max(0.0,real(safe_log10(minval(s% D_ST(grid_min:grid_max))),kind=kind(ymin2)))
     317            0 :                   if (ymin2 < ymin) ymin = ymin2
     318            0 :                   if (s% D_omega_flag) then
     319            0 :                      ymin2 = max(0.0,real(safe_log10(minval(s% D_omega(grid_min:grid_max))),kind=kind(ymin2)))
     320            0 :                      if (ymin2 < ymin) ymin = ymin2
     321              :                   end if
     322              :                end if
     323              :             end if
     324              : 
     325            0 :             dy = ymax-ymin
     326            0 :             if (MixDs_dymin /= -101) dy = MixDs_dymin
     327            0 :             ymax = ymax + 0.05*dy
     328            0 :             ymin = ymin - 0.05*dy
     329              : 
     330            0 :             call pgswin(xleft, xright, ymin, ymax)
     331              : 
     332            0 :             call pgsci(clr_Foreground)
     333            0 :             if (xaxis_numeric_labels_flag) then
     334            0 :                call show_box_pgstar(s,'BCNST','BCNSTV')
     335              :             else
     336            0 :                call show_box_pgstar(s,'BCST','BCNSTV')
     337              :             end if
     338            0 :             call show_left_yaxis_label_pgstar(s,'log D (cm\u2\d s\u-1\d)')
     339              : 
     340            0 :             call pgsch(txt_scale*s% pg% Mixing_legend_txt_scale_factor)
     341              : 
     342            0 :             if (rotation) then
     343              : 
     344            0 :                if (s% D_omega_flag) then
     345              : 
     346            0 :                   do k=grid_min, grid_max
     347            0 :                      yvec(k) = safe_log10(s% D_mix_rotation(k))
     348              :                   end do
     349            0 :                   call pgsci(clr_rotation)
     350            0 :                   call pgslw(lw)
     351            0 :                   call pgline(npts, xvec(grid_min:grid_max), yvec(grid_min:grid_max))
     352            0 :                   call pgslw(lw_sav)
     353              : 
     354            0 :                else if (.not. s% pg% Mixing_show_rotation_details) then
     355              : 
     356            0 :                   do k=grid_min, grid_max
     357              :                      yvec(k) = safe_log10( &
     358              :                         s% D_DSI_factor  * s% D_DSI(k)  + &
     359              :                         s% D_SH_factor   * s% D_SH(k)   + &
     360              :                         s% D_SSI_factor  * s% D_SSI(k)  + &
     361              :                         s% D_ES_factor   * s% D_ES(k)   + &
     362              :                         s% D_GSF_factor  * s% D_GSF(k)  + &
     363            0 :                         s% D_ST_factor   * s% D_ST(k))
     364              :                   end do
     365            0 :                   call pgsci(clr_rotation)
     366            0 :                   call pgslw(lw)
     367            0 :                   call pgline(npts, xvec(grid_min:grid_max), yvec(grid_min:grid_max))
     368            0 :                   call pgslw(lw_sav)
     369              : 
     370              :                end if
     371              : 
     372            0 :                if (s% pg% Mixing_show_rotation_details) then
     373              : 
     374            0 :                   D_DSI_factor = s% D_DSI_factor
     375            0 :                   D_SH_factor = s% D_SH_factor
     376            0 :                   D_SSI_factor = s% D_SSI_factor
     377            0 :                   D_ES_factor = s% D_ES_factor
     378            0 :                   D_GSF_factor = s% D_GSF_factor
     379            0 :                   D_ST_factor = s% D_ST_factor
     380            0 :                   D_visc_factor = s% D_visc_factor
     381              : 
     382            0 :                   do k=grid_min, grid_max
     383            0 :                      yvec(k) = safe_log10(D_ST_factor*s% D_ST(k))
     384              :                   end do
     385            0 :                   call pgsci(clr_IndianRed)
     386            0 :                   call pgslw(lw)
     387            0 :                   call pgline(npts, xvec(grid_min:grid_max), yvec(grid_min:grid_max))
     388            0 :                   call pgslw(lw_sav)
     389              : 
     390            0 :                   do k=grid_min, grid_max
     391            0 :                      yvec(k) = safe_log10(D_visc_factor*s% D_visc(k))
     392              :                   end do
     393            0 :                   call pgsci(clr_Silver)
     394            0 :                   call pgslw(lw)
     395            0 :                   call pgline(npts, xvec(grid_min:grid_max), yvec(grid_min:grid_max))
     396            0 :                   call pgslw(lw_sav)
     397              : 
     398            0 :                   do k=grid_min, grid_max
     399            0 :                      yvec(k) = safe_log10(D_DSI_factor*s% D_DSI(k))
     400              :                   end do
     401            0 :                   call pgsci(clr_Goldenrod)
     402            0 :                   call pgslw(lw)
     403            0 :                   call pgline(npts, xvec(grid_min:grid_max), yvec(grid_min:grid_max))
     404            0 :                   call pgslw(lw_sav)
     405              : 
     406            0 :                   do k=grid_min, grid_max
     407            0 :                      yvec(k) = safe_log10(D_SH_factor*s% D_SH(k))
     408              :                   end do
     409            0 :                   call pgsci(clr_Lilac)
     410            0 :                   call pgslw(lw)
     411            0 :                   call pgline(npts, xvec(grid_min:grid_max), yvec(grid_min:grid_max))
     412            0 :                   call pgslw(lw_sav)
     413              : 
     414            0 :                   do k=grid_min, grid_max
     415            0 :                      yvec(k) = safe_log10(D_SSI_factor*s% D_SSI(k))
     416              :                   end do
     417            0 :                   call pgsci(clr_Coral)
     418            0 :                   call pgslw(lw)
     419            0 :                   call pgline(npts, xvec(grid_min:grid_max), yvec(grid_min:grid_max))
     420            0 :                   call pgslw(lw_sav)
     421              : 
     422            0 :                   do k=grid_min, grid_max
     423            0 :                      yvec(k) = safe_log10(D_ES_factor*s% D_ES(k))
     424              :                   end do
     425            0 :                   call pgsci(clr_FireBrick)
     426              :                   !call show_right_yaxis_label_pgmtxt_pgstar(s,0.6,0.5,'ES',1.5)
     427            0 :                   call pgslw(lw)
     428            0 :                   call pgline(npts, xvec(grid_min:grid_max), yvec(grid_min:grid_max))
     429            0 :                   call pgslw(lw_sav)
     430              : 
     431            0 :                   do k=grid_min, grid_max
     432            0 :                      yvec(k) = safe_log10(D_GSF_factor*s% D_GSF(k))
     433              :                   end do
     434            0 :                   call pgsci(clr_MediumSlateBlue)
     435            0 :                   call pgslw(lw)
     436            0 :                   call pgline(npts, xvec(grid_min:grid_max), yvec(grid_min:grid_max))
     437            0 :                   call pgslw(lw_sav)
     438              : 
     439              :                end if
     440              : 
     441              :             end if
     442              : 
     443            0 :             call pgsci(clr_convection)
     444            0 :             call pgslw(lw)
     445            0 :             call pgline(npts, xvec(grid_min:grid_max), y_conv(grid_min:grid_max))
     446            0 :             call pgslw(lw_sav)
     447              : 
     448            0 :             call pgsci(clr_leftover_convection)
     449            0 :             call pgslw(lw)
     450            0 :             call pgline(npts, xvec(grid_min:grid_max), y_left(grid_min:grid_max))
     451            0 :             call pgslw(lw_sav)
     452              : 
     453            0 :             call pgsci(clr_semiconvection)
     454            0 :             call pgslw(lw)
     455            0 :             call pgline(npts, xvec(grid_min:grid_max), y_sc(grid_min:grid_max))
     456            0 :             call pgslw(lw_sav)
     457              : 
     458            0 :             call pgsci(clr_thermohaline)
     459            0 :             call pgslw(lw)
     460            0 :             call pgline(npts, xvec(grid_min:grid_max), y_th(grid_min:grid_max))
     461            0 :             call pgslw(lw_sav)
     462              : 
     463            0 :             call pgsci(clr_overshoot)
     464            0 :             call pgslw(lw)
     465            0 :             call pgline(npts, xvec(grid_min:grid_max), y_ovr(grid_min:grid_max))
     466            0 :             call pgslw(lw_sav)
     467              : 
     468            0 :             if (s% RTI_flag) then
     469            0 :                call pgsci(clr_rayleigh_taylor)
     470            0 :                call pgslw(lw)
     471            0 :                call pgline(npts, xvec(grid_min:grid_max), y_RTI_mix(grid_min:grid_max))
     472            0 :                call pgslw(lw_sav)
     473              :             end if
     474              : 
     475            0 :             call pgsci(clr_minimum)
     476            0 :             call pgslw(lw)
     477            0 :             call pgline(npts, xvec(grid_min:grid_max), y_min_mix(grid_min:grid_max))
     478            0 :             call pgslw(lw_sav)
     479              : 
     480              :             ! now do legend lines
     481              : 
     482            0 :             call pgsave
     483            0 :             call pgsvp(legend_xmin, legend_xmax, legend_ymin, legend_ymax)
     484            0 :             call pgswin(0.0, 1.0, ymin, ymax)
     485            0 :             number_of_legend_lines = 6
     486            0 :             if (rotation .and. s% pg% Mixing_show_rotation_details) &
     487            0 :                   number_of_legend_lines = number_of_legend_lines + 7
     488            0 :             cnt = 1
     489              :             cnt = mixing_line_legend(cnt, clr_convection, &
     490            0 :                lw, lw_sav, txt_scale, 'convection')
     491              :             cnt = mixing_line_legend(cnt, clr_overshoot, &
     492            0 :                lw, lw_sav, txt_scale, 'overshooting')
     493            0 :             if (s% alpha_semiconvection > 0) then
     494              :                cnt = mixing_line_legend(cnt, clr_semiconvection, &
     495            0 :                   lw, lw_sav, txt_scale, 'semiconvection')
     496              :             end if
     497            0 :             if (s% thermohaline_coeff > 0) then
     498              :                cnt = mixing_line_legend(cnt, clr_thermohaline, &
     499            0 :                   lw, lw_sav, txt_scale, 'thermohaline')
     500              :             end if
     501            0 :             if (rotation) then
     502            0 :                if (s% D_omega_flag) then
     503              :                   cnt = mixing_line_legend(cnt, clr_rotation, &
     504            0 :                      lw, lw_sav, txt_scale, 'D_mix_rotation')
     505              :                else
     506              :                   cnt = mixing_line_legend(cnt, clr_rotation, &
     507            0 :                      lw, lw_sav, txt_scale, 'rotation')
     508              :                end if
     509              :             end if
     510            0 :             if (s% RTI_flag) then
     511              :                cnt = mixing_line_legend(cnt, clr_rayleigh_taylor, &
     512            0 :                   lw, lw_sav, txt_scale, 'RTI')
     513              :             end if
     514            0 :             if (rotation .and. s% pg% Mixing_show_rotation_details) then
     515              :                cnt = mixing_line_legend(cnt, clr_IndianRed, &
     516            0 :                   lw, lw_sav, txt_scale, 'ST')
     517              :                cnt = mixing_line_legend(cnt, clr_Silver, &
     518            0 :                   lw, lw_sav, txt_scale, 'visc')
     519              :                cnt = mixing_line_legend(cnt, clr_Goldenrod, &
     520            0 :                   lw, lw_sav, txt_scale, 'DSI')
     521              :                cnt = mixing_line_legend(cnt, clr_Lilac, &
     522            0 :                   lw, lw_sav, txt_scale, 'SH')
     523              :                cnt = mixing_line_legend(cnt, clr_Coral, &
     524            0 :                   lw, lw_sav, txt_scale, 'SSI')
     525              :                cnt = mixing_line_legend(cnt, clr_FireBrick, &
     526            0 :                   lw, lw_sav, txt_scale, 'ES')
     527              :                cnt = mixing_line_legend(cnt, clr_MediumSlateBlue, &
     528            0 :                   lw, lw_sav, txt_scale, 'GSF')
     529              :             end if
     530              : 
     531            0 :             call pgunsa
     532              : 
     533            0 :             call show_pgstar_decorator(s%id,s% pg% mixing_use_decorator,s% pg% mixing_pgstar_decorator, 0, ierr)
     534              : 
     535              :          end subroutine plot
     536              : 
     537              : 
     538            0 :          integer function mixing_line_legend( &
     539              :                cnt, clr, lw, lw_sav, txt_scale, str)
     540              :             use pgstar_colors, only: clr_Foreground
     541              :             integer, intent(in) :: cnt, clr, lw, lw_sav
     542              :             real, intent(in) :: txt_scale
     543              :             character (len=*), intent(in) :: str
     544            0 :             real :: dx, dyline, ypos, xpts(2), ypts(2)
     545            0 :             call pgsci(clr)
     546            0 :             dx = 0.1
     547            0 :             dyline = (ymax-ymin)/number_of_legend_lines
     548            0 :             ypos = ymax - cnt*dyline
     549            0 :             xpts(1) = 1.3*dx
     550            0 :             xpts(2) = xpts(1) + 2.3*dx
     551            0 :             ypts = ypos + dyline*0.1
     552            0 :             call pgslw(lw)
     553            0 :             call pgline(2, xpts, ypts)
     554            0 :             call pgslw(lw_sav)
     555            0 :             call pgsci(clr_Foreground)
     556            0 :             call pgsch(txt_scale*s% pg% Mixing_legend_txt_scale_factor)
     557            0 :             call pgptxt(xpts(2) + dx, ypos, 0.0, 0.0, trim(str))
     558            0 :             mixing_line_legend = cnt + 1
     559            0 :          end function mixing_line_legend
     560              : 
     561              :       end subroutine MixDs_plot
     562              : 
     563              :       end module pgstar_mixing_Ds
        

Generated by: LCOV version 2.0-1