GCC Code Coverage Report


Directory: src/fortran/lib/
File: mod_geom_utils.f90
Date: 2025-06-15 07:27:34
Exec Total Coverage
Lines: 65 76 85.5%
Functions: 0 0 -%
Branches: 179 314 57.0%

Line Branch Exec Source
1 module raffle__geom_utils
2 !! Module to contain all geometry-manipulation related procedures
3 !!
4 !! This module contains procedures that are used to manipulate the geometry
5 !! of the system. The geometry type used is defined in the geom_rw module.
6 use raffle__constants, only: pi,real32
7 use raffle__geom_rw, only: basis_type
8 use raffle__misc_linalg, only: modu, get_angle
9 implicit none
10
11
12 private
13
14 public :: basis_merge
15
16
17 contains
18
19 !###############################################################################
20 6 function basis_merge(basis1,basis2,length,map1,map2, mask1, mask2) &
21 result(output)
22 !! Merge two supplied bases
23 !!
24 !! Merge two bases assuming that the lattice is the same
25 implicit none
26
27 ! Arguments
28 type(basis_type) :: output
29 !! Output merged basis.
30 class(basis_type), intent(in) :: basis1, basis2
31 !! Input bases to merge.
32 integer, intent(in), optional :: length
33 !! Number of dimensions for atomic positions (default 3).
34 integer, allocatable, dimension(:,:,:), optional, intent(inout) :: map1,map2
35 !! Maps for atoms in the two bases.
36 logical, intent(in), optional :: mask1, mask2
37 !! Mask for atoms in the two bases.
38
39 ! Local variables
40 integer :: i, j, k, itmp, dim
41 !! Loop counters.
42 logical :: lmap
43 !! Boolean for map presence.
44 6 integer, allocatable, dimension(:) :: match
45 !! Array to match species.
46 6 integer, allocatable, dimension(:,:,:) :: new_map
47 !! New map for merged basis.
48
49
50
51 !---------------------------------------------------------------------------
52 ! set up number of species
53 !---------------------------------------------------------------------------
54 6 dim=3
55 if(present(length)) dim=length
56
57
7/14
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 6 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 6 times.
6 allocate(match(basis2%nspec))
58
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 6 times.
15 match=0
59 6 output%nspec=basis1%nspec
60
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 6 times.
15 do i = 1, basis2%nspec
61
6/6
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 5 taken 6 times.
18 if(.not.any(basis2%spec(i)%name.eq.basis1%spec(:)%name))then
62 3 output%nspec=output%nspec+1
63 end if
64 end do
65
13/24
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 6 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 6 times.
✓ Branch 17 taken 9 times.
✓ Branch 18 taken 6 times.
✓ Branch 19 taken 9 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✓ Branch 22 taken 9 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 9 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 9 times.
15 allocate(output%spec(output%nspec))
66
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
12 output%spec(:basis1%nspec)%num=basis1%spec(:)%num
67
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
12 output%spec(:basis1%nspec)%name=basis1%spec(:)%name
68
69
70 write(output%sysname,'(A,"+",A)') &
71
2/4
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
6 trim(basis1%sysname),trim(basis2%sysname)
72 6 k=basis1%nspec
73
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 6 times.
15 spec1check: do i = 1, basis2%nspec
74
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 3 times.
12 do j = 1, basis1%nspec
75
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 3 times.
12 if(basis2%spec(i)%name.eq.basis1%spec(j)%name)then
76 6 output%spec(j)%num=output%spec(j)%num+basis2%spec(i)%num
77 6 match(i)=j
78 6 cycle spec1check
79 end if
80 end do
81 3 k=k+1
82 3 match(i)=k
83 3 output%spec(k)%num=basis2%spec(i)%num
84 9 output%spec(k)%name=basis2%spec(i)%name
85 end do spec1check
86
87
88 !---------------------------------------------------------------------------
89 ! if map is present, sets up new map
90 !---------------------------------------------------------------------------
91 6 lmap = .false.
92
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if_map: if(present(map1).and.present(map2))then
93 if(all(map1.eq.-1)) exit if_map
94 lmap = .true.
95 allocate(new_map(&
96 output%nspec,&
97 maxval(output%spec(:)%num,dim=1),2))
98 new_map = 0
99 end if if_map
100
101
102 !---------------------------------------------------------------------------
103 ! set up atoms in merged basis
104 !---------------------------------------------------------------------------
105
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
12 do i = 1, basis1%nspec
106
9/16
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 6 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 6 times.
✓ Branch 17 taken 64 times.
✓ Branch 18 taken 6 times.
70 allocate(output%spec(i)%atom_mask(output%spec(i)%num), source = .true.)
107
7/14
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 6 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 6 times.
6 allocate(output%spec(i)%atom_idx(output%spec(i)%num))
108
9/18
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 6 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 6 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 6 times.
6 allocate(output%spec(i)%atom(output%spec(i)%num,dim))
109
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
6 if(allocated(basis1%spec(i)%atom_mask)) &
110
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 3 times.
27 output%spec(i)%atom_mask(1:basis1%spec(i)%num) = basis1%spec(i)%atom_mask
111
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
6 if(allocated(basis1%spec(i)%atom_idx))then
112
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 3 times.
27 output%spec(i)%atom_idx(1:basis1%spec(i)%num) = basis1%spec(i)%atom_idx
113 else
114
5/6
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 3 times.
15 output%spec(i)%atom_idx(1:basis1%spec(i)%num) = [(i,i=1,basis1%spec(i)%num)]
115 end if
116
4/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 192 times.
✓ Branch 3 taken 18 times.
216 output%spec(i)%atom(:,:)=0._real32
117
4/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 90 times.
✓ Branch 3 taken 18 times.
114 output%spec(i)%atom(1:basis1%spec(i)%num,:3) = basis1%spec(i)%atom(:,:3)
118
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
6 if(lmap) new_map(i,:basis1%spec(i)%num,:) = map1(i,:basis1%spec(i)%num,:)
119
4/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 28 times.
✓ Branch 3 taken 5 times.
40 if(present(mask1)) output%spec(i)%atom_mask(1:basis1%spec(i)%num) = mask1
120 end do
121
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 6 times.
15 do i = 1, basis2%nspec
122
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 6 times.
15 if(match(i).gt.basis1%nspec)then
123 allocate(output%spec(match(i))%atom_mask(output%spec(match(i))%num), &
124
9/16
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 3 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 3 times.
✓ Branch 16 taken 3 times.
✓ Branch 17 taken 3 times.
6 source = .true.)
125
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if(allocated(basis2%spec(i)%atom_mask)) &
126 output%spec(match(i))%atom_mask(:) = basis2%spec(i)%atom_mask(:)
127
7/14
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
3 allocate(output%spec(match(i))%atom_idx(output%spec(match(i))%num))
128
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if(allocated(basis2%spec(i)%atom_idx))then
129 output%spec(match(i))%atom_idx(:) = &
130 basis2%spec(i)%atom_idx(:) + basis1%natom
131 else
132 output%spec(match(i))%atom_idx(:) = &
133
5/6
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 5 taken 3 times.
9 [(i,i=1,basis2%spec(i)%num)]
134 end if
135
9/18
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
3 allocate(output%spec(match(i))%atom(output%spec(match(i))%num,dim))
136
4/4
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 9 times.
21 output%spec(match(i))%atom(:,:)=0._real32
137
4/4
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 9 times.
21 output%spec(match(i))%atom(:,:3)=basis2%spec(i)%atom(:,:3)
138
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if(lmap) new_map(match(i),:basis2%spec(i)%num,:) = &
139 map2(i,:basis2%spec(i)%num,:)
140
4/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 2 times.
5 if(present(mask2)) output%spec(match(i))%atom_mask(:) = mask2
141 else
142 6 itmp=basis1%spec(match(i))%num
143
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
6 if(allocated(basis2%spec(i)%atom_mask)) &
144 output%spec(match(i))%atom_mask(itmp+1:basis2%spec(i)%num+itmp) = &
145
2/2
✓ Branch 0 taken 28 times.
✓ Branch 1 taken 3 times.
31 basis2%spec(i)%atom_mask(:)
146
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
6 if(allocated(basis2%spec(i)%atom_idx))then
147 output%spec(match(i))%atom_idx(itmp+1:basis2%spec(i)%num+itmp) = &
148
2/2
✓ Branch 0 taken 28 times.
✓ Branch 1 taken 3 times.
31 basis2%spec(i)%atom_idx(:) + basis1%natom
149 else
150 output%spec(match(i))%atom_idx(itmp+1:basis2%spec(i)%num+itmp) = &
151
5/6
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 3 times.
15 [(i,i=1,basis2%spec(i)%num)]
152 end if
153 output%spec(match(i))%atom(itmp+1:basis2%spec(i)%num+itmp,:3) = &
154
4/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 102 times.
✓ Branch 3 taken 18 times.
126 basis2%spec(i)%atom(:,:3)
155
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if(lmap) new_map(match(i),itmp+1:basis2%spec(i)%num+itmp,:) = &
156 map2(i,:basis2%spec(i)%num,:)
157
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1 times.
6 if(present(mask2)) &
158 output%spec(match(i))%atom_mask( &
159 itmp+1:basis2%spec(i)%num+itmp &
160
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 5 times.
37 ) = mask2
161 end if
162 end do
163
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 6 times.
15 output%natom=sum(output%spec(:)%num)
164
165
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6 if(lmap) call move_alloc(new_map,map1)
166
167
9/12
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 54 times.
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 6 times.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
102 end function basis_merge
168 !###############################################################################
169
170 end module raffle__geom_utils
171