GCC Code Coverage Report


Directory: ./
File: src/diag/diag_albert.f90
Date: 2026-10-22 05:02:02
Coverage Exec Excl Total
Lines: 100.0% 90 0 90
Functions: 100.0% 3 0 3
Branches: 52.1% 146 0 280

Line Branch Exec Source
1 #ifdef USE_FORTPLOT
2 module diag_albert
3 !> Diagnostic routines for Albert canonical coordinate system
4 !> Provides contour plots of vector potential and magnetic field strength
5
6 use, intrinsic :: iso_fortran_env, only: dp => real64
7 use fortplot, only: figure_t
8 use field_can_albert, only: Aph_of_xc, hth_of_xc, hph_of_xc, Bmod_of_xc, &
9 n_r, n_th, n_phi, xmin, xmax
10
11 implicit none
12 private
13
14 public :: plot_albert_contours, make_albert_contour
15
16 contains
17
18 1 subroutine plot_albert_contours()
19 !> Generate contour plots of Aph_of_xc, hth_of_xc, hph_of_xc, and Bmod_of_xc
20 !> over theta and phi for three radial slices (inner, middle, outer)
21
22 integer :: i_r_inner, i_r_middle, i_r_outer
23 real(dp), dimension(:), allocatable :: th_array, ph_array
24 real(dp), dimension(:,:), allocatable :: contour_data
25 character(len=100) :: filename
26 character(len=80) :: plot_title_str
27 real(dp) :: s_inner, s_middle, s_outer
28 integer :: i_th, i_ph
29
30 ! Define radial slice indices - inner (25%), middle (50%), outer (75%)
31 1 i_r_inner = max(1, n_r / 4)
32 1 i_r_middle = n_r / 2
33 1 i_r_outer = max(1, 3 * n_r / 4)
34
35 ! Calculate corresponding s values
36 s_inner = xmin(1) + (xmax(1) - xmin(1)) * real(i_r_inner - 1, dp) / &
37 1 real(n_r - 1, dp)
38 s_middle = xmin(1) + (xmax(1) - xmin(1)) * real(i_r_middle - 1, dp) / &
39 1 real(n_r - 1, dp)
40 s_outer = xmin(1) + (xmax(1) - xmin(1)) * real(i_r_outer - 1, dp) / &
41 1 real(n_r - 1, dp)
42
43 ! Allocate coordinate arrays
44
6/12
✗ Branch 0 not taken.
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
3 allocate(th_array(n_th))
45
6/12
✗ Branch 0 not taken.
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
3 allocate(ph_array(n_phi))
46
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✓ Branch 6 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 time.
4 allocate(contour_data(n_th, n_phi))
47
48 ! Create coordinate arrays
49
2/2
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 3 times.
4 do i_th = 1, n_th
50 th_array(i_th) = xmin(2) + (xmax(2) - xmin(2)) * &
51 4 real(i_th - 1, dp) / real(n_th - 1, dp)
52 end do
53
54
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 time.
6 do i_ph = 1, n_phi
55 ph_array(i_ph) = xmin(3) + (xmax(3) - xmin(3)) * &
56 6 real(i_ph - 1, dp) / real(n_phi - 1, dp)
57 end do
58
59 ! Generate contour plots for each radial slice and field component
60 ! Order: Aph, hth, hph, Bmod for each radial slice
61
62 ! Inner slice - Aph_of_xc contour
63
7/14
✓ Branch 0 taken 1 time.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 5 times.
✓ Branch 11 taken 1 time.
✓ Branch 12 taken 15 times.
✓ Branch 13 taken 5 times.
22 contour_data = Aph_of_xc(i_r_inner, :, :)
64 1 filename = "albert_Aph_inner_contour.png"
65 write(plot_title_str, '(A,F5.3,A)') &
66 1 "Aph_of_xc contour at s=", s_inner, " (Albert)"
67
68 call save_albert_contour(th_array, ph_array, contour_data, &
69
2/4
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
1 trim(filename), trim(plot_title_str))
70
71 ! Inner slice - hth_of_xc contour
72
7/14
✓ Branch 0 taken 1 time.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 5 times.
✓ Branch 11 taken 1 time.
✓ Branch 12 taken 15 times.
✓ Branch 13 taken 5 times.
22 contour_data = hth_of_xc(i_r_inner, :, :)
73 1 filename = "albert_hth_inner_contour.png"
74 write(plot_title_str, '(A,F5.3,A)') &
75 1 "hth_of_xc contour at s=", s_inner, " (Albert)"
76
77 call save_albert_contour(th_array, ph_array, contour_data, &
78
2/4
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
1 trim(filename), trim(plot_title_str))
79
80 ! Inner slice - hph_of_xc contour
81
7/14
✓ Branch 0 taken 1 time.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 5 times.
✓ Branch 11 taken 1 time.
✓ Branch 12 taken 15 times.
✓ Branch 13 taken 5 times.
22 contour_data = hph_of_xc(i_r_inner, :, :)
82 1 filename = "albert_hph_inner_contour.png"
83 write(plot_title_str, '(A,F5.3,A)') &
84 1 "hph_of_xc contour at s=", s_inner, " (Albert)"
85
86 call save_albert_contour(th_array, ph_array, contour_data, &
87
2/4
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
1 trim(filename), trim(plot_title_str))
88
89 ! Inner slice - Bmod_of_xc contour
90
7/14
✓ Branch 0 taken 1 time.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 5 times.
✓ Branch 11 taken 1 time.
✓ Branch 12 taken 15 times.
✓ Branch 13 taken 5 times.
22 contour_data = Bmod_of_xc(i_r_inner, :, :)
91 1 filename = "albert_Bmod_inner_contour.png"
92 write(plot_title_str, '(A,F5.3,A)') &
93 1 "Bmod_of_xc contour at s=", s_inner, " (Albert)"
94
95 call save_albert_contour(th_array, ph_array, contour_data, &
96
2/4
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
1 trim(filename), trim(plot_title_str))
97
98 ! Middle slice - Aph_of_xc contour
99
7/14
✓ Branch 0 taken 1 time.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 5 times.
✓ Branch 11 taken 1 time.
✓ Branch 12 taken 15 times.
✓ Branch 13 taken 5 times.
22 contour_data = Aph_of_xc(i_r_middle, :, :)
100 1 filename = "albert_Aph_middle_contour.png"
101 write(plot_title_str, '(A,F5.3,A)') &
102 1 "Aph_of_xc contour at s=", s_middle, " (Albert)"
103
104 call save_albert_contour(th_array, ph_array, contour_data, &
105
2/4
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
1 trim(filename), trim(plot_title_str))
106
107 ! Middle slice - hth_of_xc contour
108
7/14
✓ Branch 0 taken 1 time.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 5 times.
✓ Branch 11 taken 1 time.
✓ Branch 12 taken 15 times.
✓ Branch 13 taken 5 times.
22 contour_data = hth_of_xc(i_r_middle, :, :)
109 1 filename = "albert_hth_middle_contour.png"
110 write(plot_title_str, '(A,F5.3,A)') &
111 1 "hth_of_xc contour at s=", s_middle, " (Albert)"
112
113 call save_albert_contour(th_array, ph_array, contour_data, &
114
2/4
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
1 trim(filename), trim(plot_title_str))
115
116 ! Middle slice - hph_of_xc contour
117
7/14
✓ Branch 0 taken 1 time.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 5 times.
✓ Branch 11 taken 1 time.
✓ Branch 12 taken 15 times.
✓ Branch 13 taken 5 times.
22 contour_data = hph_of_xc(i_r_middle, :, :)
118 1 filename = "albert_hph_middle_contour.png"
119 write(plot_title_str, '(A,F5.3,A)') &
120 1 "hph_of_xc contour at s=", s_middle, " (Albert)"
121
122 call save_albert_contour(th_array, ph_array, contour_data, &
123
2/4
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
1 trim(filename), trim(plot_title_str))
124
125 ! Middle slice - Bmod_of_xc contour
126
7/14
✓ Branch 0 taken 1 time.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 5 times.
✓ Branch 11 taken 1 time.
✓ Branch 12 taken 15 times.
✓ Branch 13 taken 5 times.
22 contour_data = Bmod_of_xc(i_r_middle, :, :)
127 1 filename = "albert_Bmod_middle_contour.png"
128 write(plot_title_str, '(A,F5.3,A)') &
129 1 "Bmod_of_xc contour at s=", s_middle, " (Albert)"
130
131 call save_albert_contour(th_array, ph_array, contour_data, &
132
2/4
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
1 trim(filename), trim(plot_title_str))
133
134 ! Outer slice - Aph_of_xc contour
135
7/14
✓ Branch 0 taken 1 time.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 5 times.
✓ Branch 11 taken 1 time.
✓ Branch 12 taken 15 times.
✓ Branch 13 taken 5 times.
22 contour_data = Aph_of_xc(i_r_outer, :, :)
136 1 filename = "albert_Aph_outer_contour.png"
137 write(plot_title_str, '(A,F5.3,A)') &
138 1 "Aph_of_xc contour at s=", s_outer, " (Albert)"
139
140 call save_albert_contour(th_array, ph_array, contour_data, &
141
2/4
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
1 trim(filename), trim(plot_title_str))
142
143 ! Outer slice - hth_of_xc contour
144
7/14
✓ Branch 0 taken 1 time.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 5 times.
✓ Branch 11 taken 1 time.
✓ Branch 12 taken 15 times.
✓ Branch 13 taken 5 times.
22 contour_data = hth_of_xc(i_r_outer, :, :)
145 1 filename = "albert_hth_outer_contour.png"
146 write(plot_title_str, '(A,F5.3,A)') &
147 1 "hth_of_xc contour at s=", s_outer, " (Albert)"
148
149 call save_albert_contour(th_array, ph_array, contour_data, &
150
2/4
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
1 trim(filename), trim(plot_title_str))
151
152 ! Outer slice - hph_of_xc contour
153
7/14
✓ Branch 0 taken 1 time.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 5 times.
✓ Branch 11 taken 1 time.
✓ Branch 12 taken 15 times.
✓ Branch 13 taken 5 times.
22 contour_data = hph_of_xc(i_r_outer, :, :)
154 1 filename = "albert_hph_outer_contour.png"
155 write(plot_title_str, '(A,F5.3,A)') &
156 1 "hph_of_xc contour at s=", s_outer, " (Albert)"
157
158 call save_albert_contour(th_array, ph_array, contour_data, &
159
2/4
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
1 trim(filename), trim(plot_title_str))
160
161 ! Outer slice - Bmod_of_xc contour
162
7/14
✓ Branch 0 taken 1 time.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 5 times.
✓ Branch 11 taken 1 time.
✓ Branch 12 taken 15 times.
✓ Branch 13 taken 5 times.
22 contour_data = Bmod_of_xc(i_r_outer, :, :)
163 1 filename = "albert_Bmod_outer_contour.png"
164 write(plot_title_str, '(A,F5.3,A)') &
165 1 "Bmod_of_xc contour at s=", s_outer, " (Albert)"
166
167 call save_albert_contour(th_array, ph_array, contour_data, &
168
2/4
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 time.
✗ Branch 6 not taken.
1 trim(filename), trim(plot_title_str))
169
170 ! Cleanup
171
3/6
✗ Branch 0 not taken.
✓ Branch 1 taken 1 time.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
1 deallocate(th_array, ph_array, contour_data)
172
173 1 print *, "Albert coordinate diagnostic plots generated successfully!"
174 1 print *, "Files created:"
175 1 print *, " Inner slice:"
176 1 print *, " albert_Aph_inner_contour.png, albert_hth_inner_contour.png"
177 1 print *, " albert_hph_inner_contour.png, albert_Bmod_inner_contour.png"
178 1 print *, " Middle slice:"
179 1 print *, " albert_Aph_middle_contour.png, albert_hth_middle_contour.png"
180 1 print *, " albert_hph_middle_contour.png, albert_Bmod_middle_contour.png"
181 1 print *, " Outer slice:"
182 1 print *, " albert_Aph_outer_contour.png, albert_hth_outer_contour.png"
183 1 print *, " albert_hph_outer_contour.png, albert_Bmod_outer_contour.png"
184
185 1 end subroutine plot_albert_contours
186
187
188
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 26 times.
26 subroutine make_albert_contour(theta, phi, data, plot_title, fig)
189 ! data follows the Albert field convention: data(theta_index, phi_index).
190 real(dp), contiguous, intent(in) :: theta(:), phi(:)
191 real(dp), intent(in) :: data(:, :)
192 character(len=*), intent(in) :: plot_title
193 type(figure_t), intent(inout) :: fig
194 real(dp), allocatable :: image_data(:, :)
195
196 26 call fig%initialize(width=1000, height=800)
197 26 call fig%set_xlabel('theta')
198 26 call fig%set_ylabel('phi')
199 26 call fig%set_title(plot_title)
200 26 call fig%grid(enabled=.true.)
201 ! Fortplot stores grid values in image order: z(phi_index, theta_index).
202
4/4
✓ Branch 0 taken 78 times.
✓ Branch 1 taken 26 times.
✓ Branch 2 taken 384 times.
✓ Branch 3 taken 78 times.
488 image_data = transpose(data)
203 26 call fig%add_contour(theta, phi, image_data)
204 26 call fig%colorbar()
205
1/2
✓ Branch 0 taken 26 times.
✗ Branch 1 not taken.
26 end subroutine make_albert_contour
206
207
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
12 subroutine save_albert_contour(theta, phi, data, filename, plot_title)
208 real(dp), contiguous, intent(in) :: theta(:), phi(:)
209 real(dp), intent(in) :: data(:, :)
210 character(len=*), intent(in) :: filename, plot_title
211
4/4
✓ Branch 0 taken 120 times.
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 120 times.
✓ Branch 3 taken 360 times.
492 type(figure_t) :: fig
212
213 12 call make_albert_contour(theta, phi, data, plot_title, fig)
214 12 call fig%savefig(filename)
215 12 end subroutine save_albert_contour
216
217 end module diag_albert
218 #else
219 module diag_albert
220 implicit none
221 private
222 public :: plot_albert_contours
223 contains
224 subroutine plot_albert_contours()
225 print *, "Warning: plot_albert_contours requires fortplot "// &
226 "(disabled for this build)"
227 end subroutine plot_albert_contours
228 end module diag_albert
229 #endif
230