Branch data Line data Source code
1 : : !!****m* ABINIT/m_spmat_lil
2 : : !! NAME
3 : : !! m_spmat_lil
4 : : !!
5 : : !! FUNCTION
6 : : !! This module contains the a LIL(list of linked list) format of sparse matrix.
7 : : !! It is useful for constructing sparse matrix, but not efficient for calculation. Use this to construct and then convert it to other format (COO, CSR...)
8 : : !! Datatypes:
9 : : !! LIL_mat_t: LIL matrix
10 : : !!
11 : : !! Subroutines:
12 : : !! TODO: add this when F2003 doc style is determined.
13 : : !!
14 : : !!
15 : : !! COPYRIGHT
16 : : !! Copyright (C) 2001-2026 ABINIT group (hexu)
17 : : !! This file is distributed under the terms of the
18 : : !! GNU General Public License, see ~abinit/COPYING
19 : : !! or http://www.gnu.org/copyleft/gpl.txt .
20 : : !! For the initials of contributors, see ~abinit/doc/developers/contributors.txt .
21 : : !!
22 : : !! SOURCE
23 : :
24 : :
25 : : #if defined HAVE_CONFIG_H
26 : : #include "config.h"
27 : : #endif
28 : : #include "abi_common.h"
29 : :
30 : : module m_spmat_lil
31 : : use defs_basis
32 : : use m_abicore
33 : : use m_errors
34 : : use m_xmpi
35 : : use m_spmat_base, only: base_mat2d_t
36 : : use m_abicore
37 : : use m_linked_list
38 : : implicit none
39 : : !!***
40 : :
41 : : private
42 : :
43 : : ! linked list type sparse matrix
44 : : ! a array of rows, each row is a linked list.
45 : : ! used for constructing sparse matrix. Not to do calculations.
46 : : type,public, extends(base_mat2d_t):: LIL_mat_t
47 : : type(llist), allocatable :: rows(:)
48 : : contains
49 : : procedure :: initialize => lil_mat_t_initialize
50 : : procedure :: finalize => lil_mat_t_finalize
51 : : procedure :: insert => lil_mat_t_insert
52 : : procedure :: add_entry
53 : : procedure :: get_nnz => lil_mat_t_get_nnz
54 : : !procedure :: print => LIL_mat_t_print
55 : : end type LIL_mat_t
56 : :
57 : : contains
58 : : !------------------ LIL ---------------------
59 [ - + ]: 2 : subroutine LIL_mat_t_initialize(self, mshape)
60 : : class(LIL_mat_t) , intent(inout):: self
61 : : integer, intent(in):: mshape(:)
62 [ - + ]: 2 : if (size(mshape)/=2) stop 1
63 : 2 : self%ndim=2
64 : 2 : self%nrow=mshape(1)
65 : 2 : self%ncol=mshape(2)
66 [ - + + - : 1302 : ABI_MALLOC(self%rows, (self%nrow))
+ - + - -
+ - + - +
+ + ]
67 [ - + - + ]: 2 : ABI_MALLOC(self%mshape, (2))
68 [ + + ]: 6 : self%mshape(:)=mshape(:)
69 : 2 : end subroutine LIL_mat_t_initialize
70 : :
71 : 2 : subroutine LIL_mat_t_finalize(self)
72 : : class(LIL_mat_t) , intent(inout):: self
73 : : integer :: i
74 [ + - ]: 2 : if (allocated(self%rows)) then
75 [ + + ]: 1298 : do i=1, self%nrow, 1
76 : 1298 : call llist_finalize(self%rows(i))
77 : : end do
78 [ - + ]: 2 : ABI_FREE(self%rows)
79 : : endif
80 : 2 : self%ncol=0
81 : 2 : self%nrow=0
82 [ + - ]: 2 : ABI_SFREE(self%mshape)
83 : 2 : end subroutine LIL_mat_t_finalize
84 : :
85 : 0 : subroutine LIL_mat_t_insert(self, irow, icol, val, mode)
86 : : class(LIL_mat_t) , intent(inout):: self
87 : : integer, intent(in):: irow, icol, mode
88 : : real(dp), intent(in):: val
89 [ # # ]: 0 : if(abs(val)>tiny(0.0d0)) then
90 : 0 : call llist_sorted_insert(self%rows(irow), icol, val, mode)
91 : : end if
92 : 0 : end subroutine LIL_mat_t_insert
93 : :
94 : 33696 : subroutine add_entry(self, ind, val)
95 : : class(LIL_mat_t) , intent(inout):: self
96 : : integer, intent(in):: ind(self%ndim)
97 : : real(dp), intent(in):: val
98 [ + - ]: 33696 : if(abs(val)>tiny(0.0d0)) then
99 : 33696 : call llist_sorted_insert(self%rows(ind(1)), ind(2), val, mode=1)
100 : : end if
101 : 33696 : end subroutine add_entry
102 : :
103 : :
104 : : ! subroutine LIL_mat_t_print(self, mat)
105 : : !
106 : : ! class(LIL_mat_t) , intent(inout)::self
107 : : ! real(dp), intent(out):: mat(self%nrow,self%ncol)
108 : : ! integer:: irow, icol
109 : : ! real(dp):: val
110 : : ! mat(:,:)=0.0d0
111 : : ! do irow=1, self%nrow
112 : : ! call llist_iter_restart(self%rows(irow))
113 : : ! do while(associated(self%rows(irow)%iter))
114 : : ! !print*, "Irow: " ,irow, "Icol: ", self%rows(irow)%iter%i, " val: ", self%rows(irow)%iter%val
115 : : ! !TODO print with wrtout
116 : : ! self%rows(irow)%iter=>self%rows(irow)%iter%next
117 : : ! enddo
118 : : ! enddo
119 : : ! end subroutine LIL_mat_t_print
120 : : !
121 : :
122 : 2 : function LIL_mat_t_get_nnz(ll) result(nnz)
123 : :
124 : : class(LIL_mat_t), intent(in)::ll
125 : : integer ::nnz, irow
126 : 2 : nnz=0
127 [ + + ]: 1298 : do irow=1, ll%nrow
128 : 1298 : nnz=nnz+ll%rows(irow)%length
129 : : enddo
130 : 2 : end function LIL_mat_t_get_nnz
131 : :
132 : :
133 [ # # # # : 0 : end module m_spmat_lil
# # # # #
# # # ]
|