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
|