function c_build_tridiag_block(Nblock,Nsize,sub,diag,over) result(Amat)
integer :: Nblock
integer :: Nsize
complex(8),dimension(Nblock*Nsize,Nblock*Nsize) :: Amat
complex(8),dimension(Nblock-1,Nsize,Nsize) :: sub
complex(8),dimension(Nblock,Nsize,Nsize) :: diag
complex(8),dimension(Nblock-1,Nsize,Nsize),optional :: over
complex(8),dimension(Nblock-1,Nsize,Nsize) :: over_
integer :: i,j,iblock,is,js
over_=sub;if(present(over))over_=over
!
Amat=0d0
!
do iblock=1,Nblock-1
do i=1,Nsize
do j=1,Nsize
is = i + (iblock-1)*Nsize
js = j + (iblock-1)*Nsize
Amat(Nsize+is,js) = Sub(iblock,i,j)
Amat(is,js) = Diag(iblock,i,j)
Amat(is,Nsize+js) = Over_(iblock,i,j)
enddo
enddo
enddo
do i=1,Nsize
do j=1,Nsize
is = i + (Nblock-1)*Nsize
js = j + (Nblock-1)*Nsize
Amat(is,js) = Diag(Nblock,i,j)
enddo
enddo
end function c_build_tridiag_block