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

Generated by: LCOV version 2.0-1