GCC Code Coverage Report


Directory: src/athena/
File: src/athena/athena_diffstruc_extd_sub_kipf.f90
Date: 2026-04-15 16:08:59
Exec Total Coverage
Lines: 60 65 92.3%
Functions: 0 0 -%
Branches: 262 474 55.3%

Line Branch Exec Source
1 submodule (athena__diffstruc_extd) athena__diffstruc_extd_submodule_msgpass_kipf
2 !! Submodule containing implementations for extended diffstruc array operations
3
4 contains
5
6 !###############################################################################
7
2/4
✓ Branch 0 taken 19 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 19 times.
✗ Branch 3 not taken.
19 module function kipf_propagate(vertex_features, adj_ia, adj_ja) result(c)
8 !! Propagate values from one autodiff array to another
9 implicit none
10
11 ! Arguments
12 class(array_type), intent(in), target :: vertex_features
13 !! Vertex feature tensor
14 integer, dimension(:), intent(in) :: adj_ia
15 !! CSR row pointers
16 integer, dimension(:,:), intent(in) :: adj_ja
17 !! CSR neighbour and edge lookup indices
18 type(array_type), pointer :: c
19 !! Propagated node feature tensor
20
21 ! Local variables
22 integer :: v, w
23 !! Vertex and adjacency traversal indices
24 real(real32) :: coeff
25 !! Symmetric normalisation coefficient per edge
26
27 19 c => vertex_features%create_result()
28 ! propagate 1D array by using shape to swap dimensions
29 19 do concurrent(v = 1:size(vertex_features%val,2))
30
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 78 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 78 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 78 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 78 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 78 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 78 times.
✓ Branch 18 taken 420 times.
✓ Branch 19 taken 78 times.
498 c%val(:,v) = 0._real32
31
8/12
✓ Branch 0 taken 78 times.
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 78 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 78 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 78 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 78 times.
✓ Branch 14 taken 184 times.
✓ Branch 15 taken 78 times.
359 do w = adj_ia(v), adj_ia(v+1)-1
32
33 ! if( adj_ja(2,w) .eq. 0 )then
34 ! coeff = 1._real32
35 ! !else
36 ! ! coeff = edge_weights(adj_ja(2,w))
37 ! end if
38 !coeff = coeff * ( &
39 coeff = ( &
40
2/4
✗ Branch 1 not taken.
✓ Branch 2 taken 184 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 184 times.
368 ( adj_ia(v+1) - adj_ia(v) ) * &
41
6/12
✗ Branch 1 not taken.
✓ Branch 2 taken 184 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 184 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 184 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 184 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 184 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 184 times.
736 ( adj_ia( adj_ja(1,w) + 1 ) - adj_ia( adj_ja(1,w) ) ) &
42
6/12
✗ Branch 0 not taken.
✓ Branch 1 taken 184 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 184 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 184 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 184 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 184 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 184 times.
1104 ) ** ( -0.5_real32 )
43
44
27/50
✗ Branch 0 not taken.
✓ Branch 1 taken 184 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 184 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 184 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 184 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 184 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 184 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 184 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 184 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 184 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 184 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 184 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 184 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 184 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 184 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 184 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 184 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 184 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 184 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 184 times.
✓ Branch 56 taken 1018 times.
✓ Branch 57 taken 184 times.
✗ Branch 58 not taken.
✓ Branch 59 taken 184 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 184 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 184 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 184 times.
✓ Branch 70 taken 1018 times.
✓ Branch 71 taken 184 times.
2298 c%val(:,v) = c%val(:,v) + coeff * [ vertex_features%val(:, adj_ja(1, w)) ]
45 end do
46 end do
47
48
7/14
✗ Branch 0 not taken.
✓ Branch 1 taken 19 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 19 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 19 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 19 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 19 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 97 times.
✓ Branch 16 taken 19 times.
116 c%indices = adj_ia
49
12/24
✗ Branch 0 not taken.
✓ Branch 1 taken 19 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 19 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 19 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 19 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 19 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 19 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 19 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 19 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 184 times.
✓ Branch 27 taken 19 times.
✓ Branch 28 taken 368 times.
✓ Branch 29 taken 184 times.
571 c%adj_ja = adj_ja
50 19 c%get_partial_left => get_partial_kipf_propagate_left
51 19 c%get_partial_left_val => get_partial_kipf_propagate_left_val
52
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 11 times.
19 if(vertex_features%requires_grad)then
53 8 c%requires_grad = .true.
54 8 c%is_forward = vertex_features%is_forward
55 8 c%operation = 'kipf_propagate'
56 8 c%left_operand => vertex_features
57 8 c%owns_left_operand = vertex_features%is_temporary
58 end if
59 19 end function kipf_propagate
60 !-------------------------------------------------------------------------------
61 1 function get_partial_kipf_propagate_left(this, upstream_grad) result(output)
62 !! Gradient of kipf_propagate with respect to vertex features.
63 implicit none
64
65 ! Arguments
66 class(array_type), intent(inout) :: this
67 !! Forward result node containing saved operands
68 type(array_type), intent(in) :: upstream_grad
69 !! Upstream gradient tensor
70 type(array_type) :: output
71 !! Gradient tensor for left operand
72
73 output = reverse_kipf_propagate( upstream_grad, &
74 this%indices, this%adj_ja, &
75 2 num_features = [ &
76 2 this%left_operand%shape(1), this%right_operand%shape(1) &
77 ], &
78 num_elements = [ &
79 size(this%left_operand%val,2), size(this%right_operand%val,2) &
80 ] &
81
7/10
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 1 times.
5 )
82
83
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
2 end function get_partial_kipf_propagate_left
84 !-------------------------------------------------------------------------------
85
2/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 pure subroutine get_partial_kipf_propagate_left_val(this, upstream_grad, output)
86 !! In-place value gradient for kipf_propagate left operand.
87 implicit none
88
89 ! Arguments
90 class(array_type), intent(in) :: this
91 !! Forward result node containing saved operands
92 real(real32), dimension(:,:), intent(in) :: upstream_grad
93 !! Upstream gradient values
94 real(real32), dimension(:,:), intent(out) :: output
95 !! Output gradient values for left operand
96
97 ! Local variables
98 integer :: v, w, i
99 !! Loop indices
100
101
10/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✓ Branch 18 taken 2 times.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 4 times.
✓ Branch 21 taken 2 times.
7 output = 0._real32
102
6/12
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
1 do concurrent(v=1:size(upstream_grad,2))
103
8/12
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 2 times.
5 do w = this%indices(v), this%indices(v+1)-1
104
6/12
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
4 do concurrent(i = 1:size(upstream_grad,1))
105
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 4 times.
16 output(i,this%adj_ja(1,w)) = output(i,this%adj_ja(1,w)) + &
106
18/34
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 4 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 4 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 4 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 4 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 4 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 4 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 4 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 4 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 4 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 4 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 4 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 4 times.
18 upstream_grad(i, v)
107 end do
108 end do
109 end do
110
111 1 end subroutine get_partial_kipf_propagate_left_val
112 !###############################################################################
113
114
115 !###############################################################################
116 1 function reverse_kipf_propagate( &
117
2/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 a, adj_ia, adj_ja, num_features, num_elements &
118 ) result(c)
119 !! Reverse propagate values from one autodiff array to another
120 implicit none
121
122 ! Arguments
123 class(array_type), intent(in), target :: a
124 !! Upstream tensor to reverse-propagate
125 integer, dimension(:), intent(in) :: adj_ia
126 !! CSR row pointers
127 integer, dimension(:,:), intent(in) :: adj_ja
128 !! CSR neighbour and edge lookup indices
129 integer, dimension(2), intent(in) :: num_features, num_elements
130 !! Output feature and element counts
131 type(array_type), pointer :: c
132 !! Reverse-propagated tensor
133
134 ! Local variables
135 integer :: v, w
136 !! Loop indices
137
138 c => a%create_result(array_shape=[ &
139 num_features(1), num_elements(1) &
140
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
3 ])
141
4/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 2 times.
7 c%val = 0.0_real32
142 1 do concurrent(v=1:num_elements(1))
143
8/12
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 2 times.
5 do w = adj_ia(v), adj_ia(v+1)-1
144
4/8
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
4 c%val(:,adj_ja(1,w)) = c%val(:,adj_ja(1,w)) + &
145
26/48
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 2 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 2 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 2 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 2 times.
✓ Branch 41 taken 4 times.
✓ Branch 42 taken 2 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 2 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 2 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✓ Branch 53 taken 4 times.
✓ Branch 54 taken 2 times.
16 [ a%val(:, v) ]
146 end do
147 end do
148
149
7/14
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✓ Branch 16 taken 1 times.
4 c%indices = adj_ia
150
12/24
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 2 times.
✓ Branch 27 taken 1 times.
✓ Branch 28 taken 4 times.
✓ Branch 29 taken 2 times.
7 c%adj_ja = adj_ja
151 1 c%get_partial_left => get_partial_left_reverse_kipf_propagate
152 1 c%get_partial_left_val => get_partial_left_reverse_kipf_propagate_val
153
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if(a%requires_grad)then
154 c%requires_grad = .true.
155 c%is_forward = a%is_forward
156 c%operation = 'reverse_kipf_propagate'
157 c%left_operand => a
158 c%owns_left_operand = a%is_temporary
159 end if
160 1 end function reverse_kipf_propagate
161 !-------------------------------------------------------------------------------
162 1 function get_partial_left_reverse_kipf_propagate( &
163 this, upstream_grad &
164 1 ) result(output)
165 implicit none
166 ! Arguments
167 class(array_type), intent(inout) :: this
168 !! Forward result node containing saved operands
169 type(array_type), intent(in) :: upstream_grad
170 !! Upstream gradient tensor
171 type(array_type) :: output
172 !! Gradient tensor for left operand
173
174 output = kipf_propagate( upstream_grad, &
175 this%indices, this%adj_ja &
176 1 )
177
178 2 end function get_partial_left_reverse_kipf_propagate
179 !-------------------------------------------------------------------------------
180 1 pure subroutine get_partial_left_reverse_kipf_propagate_val( &
181
2/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 this, upstream_grad, output &
182 )
183 implicit none
184
185 ! Arguments
186 class(array_type), intent(in) :: this
187 !! Forward result node containing saved operands
188 real(real32), dimension(:,:), intent(in) :: upstream_grad
189 !! Upstream gradient values
190 real(real32), dimension(:,:), intent(out) :: output
191 !! Output gradient values for left operand
192
193 ! Local variables
194 integer :: v, w, i
195 !! Loop indices
196
10/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✓ Branch 18 taken 2 times.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 4 times.
✓ Branch 21 taken 2 times.
7 output = 0._real32
197
6/12
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
1 do concurrent(v=1:size(upstream_grad,2))
198
8/12
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 2 times.
5 do w = this%indices(v), this%indices(v+1)-1
199
6/12
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
4 do concurrent(i = 1:size(upstream_grad,1))
200
4/8
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 4 times.
16 output(i,this%adj_ja(1,w)) = output(i,this%adj_ja(1,w)) + &
201
18/34
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 4 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 4 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 4 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 4 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 4 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 4 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 4 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 4 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 4 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 4 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 4 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 4 times.
18 upstream_grad(i, v)
202 end do
203 end do
204 end do
205
206 1 end subroutine get_partial_left_reverse_kipf_propagate_val
207 !###############################################################################
208
209 end submodule athena__diffstruc_extd_submodule_msgpass_kipf
210