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
|