@@ -37,12 +37,12 @@ module stdlib_specialmatrices
3737
3838 !--> Symmetric Tridiagonal matrices
3939 #:for k1, t1, s1 in (KINDS_TYPES)
40- type, public :: symtridiagonal_${s1}$_type
40+ type, extends(tridiagonal_${s1}$_type), public :: symtridiagonal_${s1}$_type
4141 !! Base type to define a `symtridiagonal` matrix.
4242 private
43- ${t1}$, allocatable :: dv(:), ev(:)
44- integer(ilp) :: n
43+ #:if t1.startswith('real')
4544 logical(lk) :: is_posdef
45+ #:endif
4646 end type
4747 #:endfor
4848
@@ -238,16 +238,7 @@ module stdlib_specialmatrices
238238 #:for k1, t1, s1 in (KINDS_TYPES)
239239 #:for rank in RANKS
240240 module subroutine spmv_tridiag_${rank}$d_${s1}$(A, x, y, alpha, beta, op)
241- type(tridiagonal_${s1}$_type), intent(in) :: A
242- ${t1}$, intent(in), contiguous, target :: x${ranksuffix(rank)}$
243- ${t1}$, intent(inout), contiguous, target :: y${ranksuffix(rank)}$
244- real(${k1}$), intent(in), optional :: alpha
245- real(${k1}$), intent(in), optional :: beta
246- character(1), intent(in), optional :: op
247- end subroutine
248-
249- module subroutine spmv_symtridiag_${rank}$d_${s1}$(A, x, y, alpha, beta, op)
250- type(symtridiagonal_${s1}$_type), intent(in) :: A
241+ class(tridiagonal_${s1}$_type), intent(in) :: A
251242 ${t1}$, intent(in), contiguous, target :: x${ranksuffix(rank)}$
252243 ${t1}$, intent(inout), contiguous, target :: y${ranksuffix(rank)}$
253244 real(${k1}$), intent(in), optional :: alpha
@@ -271,19 +262,11 @@ module stdlib_specialmatrices
271262 #:for k1, t1, s1 in (KINDS_TYPES)
272263 pure module function tridiagonal_to_dense_${s1}$(A) result(B)
273264 !! Convert a `tridiagonal` matrix to its dense representation.
274- type (tridiagonal_${s1}$_type), intent(in) :: A
265+ class (tridiagonal_${s1}$_type), intent(in) :: A
275266 !! Input Tridiagonal matrix.
276267 ${t1}$, allocatable :: B(:, :)
277268 !! Corresponding dense matrix.
278269 end function
279-
280- pure module function symtridiagonal_to_dense_${s1}$(A) result(B)
281- !! Convert a `symtridiagonal` matrix to its dense representation.
282- type(symtridiagonal_${s1}$_type), intent(in) :: A
283- !! Input SymTridiagonal matrix.
284- ${t1}$, allocatable :: B(:, :)
285- !! Corresponding dense matrix.
286- end function
287270 #:endfor
288271 end interface
289272
@@ -293,15 +276,9 @@ module stdlib_specialmatrices
293276 !! [Specifications](../page/specs/stdlib_specialmatrices.html#transpose)
294277 #:for k1, t1, s1 in (KINDS_TYPES)
295278 pure module function transpose_tridiagonal_${s1}$(A) result(B)
296- type (tridiagonal_${s1}$_type), intent(in) :: A
279+ class (tridiagonal_${s1}$_type), intent(in) :: A
297280 !! Input matrix.
298- type(tridiagonal_${s1}$_type) :: B
299- end function
300-
301- pure module function transpose_symtridiagonal_${s1}$(A) result(B)
302- type(symtridiagonal_${s1}$_type), intent(in) :: A
303- !! Input matrix.
304- type(symtridiagonal_${s1}$_type) :: B
281+ class(tridiagonal_${s1}$_type), allocatable :: B
305282 end function
306283 #:endfor
307284 end interface
@@ -313,15 +290,9 @@ module stdlib_specialmatrices
313290 !! [Specifications](../page/specs/stdlib_specialmatrices.html#hermitian)
314291 #:for k1, t1, s1 in (KINDS_TYPES)
315292 pure module function hermitian_tridiagonal_${s1}$(A) result(B)
316- type(tridiagonal_${s1}$_type), intent(in) :: A
317- !! Input matrix.
318- type(tridiagonal_${s1}$_type) :: B
319- end function
320-
321- pure module function hermitian_symtridiagonal_${s1}$(A) result(B)
322- type(symtridiagonal_${s1}$_type), intent(in) :: A
293+ class(tridiagonal_${s1}$_type), intent(in) :: A
323294 !! Input matrix.
324- type(symtridiagonal_ ${s1}$_type) :: B
295+ class(tridiagonal_ ${s1}$_type), allocatable :: B
325296 end function
326297 #:endfor
327298 end interface
@@ -339,24 +310,13 @@ module stdlib_specialmatrices
339310 #:for k1, t1, s1 in (KINDS_TYPES)
340311 pure module function scalar_multiplication_tridiagonal_${s1}$(alpha, A) result(B)
341312 ${t1}$, intent(in) :: alpha
342- type (tridiagonal_${s1}$_type), intent(in) :: A
343- type (tridiagonal_${s1}$_type) :: B
313+ class (tridiagonal_${s1}$_type), intent(in) :: A
314+ class (tridiagonal_${s1}$_type), allocatable :: B
344315 end function
345316 pure module function scalar_multiplication_bis_tridiagonal_${s1}$(A, alpha) result(B)
346- type(tridiagonal_${s1}$_type), intent(in) :: A
347- ${t1}$, intent(in) :: alpha
348- type(tridiagonal_${s1}$_type) :: B
349- end function
350-
351- pure module function scalar_multiplication_symtridiagonal_${s1}$(alpha, A) result(B)
317+ class(tridiagonal_${s1}$_type), intent(in) :: A
352318 ${t1}$, intent(in) :: alpha
353- type(symtridiagonal_${s1}$_type), intent(in) :: A
354- type(symtridiagonal_${s1}$_type) :: B
355- end function
356- pure module function scalar_multiplication_bis_symtridiagonal_${s1}$(A, alpha) result(B)
357- type(symtridiagonal_${s1}$_type), intent(in) :: A
358- ${t1}$, intent(in) :: alpha
359- type(symtridiagonal_${s1}$_type) :: B
319+ class(tridiagonal_${s1}$_type), allocatable :: B
360320 end function
361321 #:endfor
362322 end interface
@@ -367,15 +327,9 @@ module stdlib_specialmatrices
367327 !! [Specifications](../page/specs/stdlib_specialmatrices.html#operators)
368328 #:for k1, t1, s1 in (KINDS_TYPES)
369329 pure module function matrix_add_tridiagonal_${s1}$(A, B) result(C)
370- type(tridiagonal_${s1}$_type), intent(in) :: A
371- type(tridiagonal_${s1}$_type), intent(in) :: B
372- type(tridiagonal_${s1}$_type) :: C
373- end function
374-
375- pure module function matrix_add_symtridiagonal_${s1}$(A, B) result(C)
376- type(symtridiagonal_${s1}$_type), intent(in) :: A
377- type(symtridiagonal_${s1}$_type), intent(in) :: B
378- type(symtridiagonal_${s1}$_type) :: C
330+ class(tridiagonal_${s1}$_type), intent(in) :: A
331+ class(tridiagonal_${s1}$_type), intent(in) :: B
332+ class(tridiagonal_${s1}$_type), allocatable :: C
379333 end function
380334 #:endfor
381335 end interface
@@ -386,15 +340,9 @@ module stdlib_specialmatrices
386340 !! [Specifications](../page/specs/stdlib_specialmatrices.html#operators)
387341 #:for k1, t1, s1 in (KINDS_TYPES)
388342 pure module function matrix_sub_tridiagonal_${s1}$(A, B) result(C)
389- type(tridiagonal_${s1}$_type), intent(in) :: A
390- type(tridiagonal_${s1}$_type), intent(in) :: B
391- type(tridiagonal_${s1}$_type) :: C
392- end function
393-
394- pure module function matrix_sub_symtridiagonal_${s1}$(A, B) result(C)
395- type(symtridiagonal_${s1}$_type), intent(in) :: A
396- type(symtridiagonal_${s1}$_type), intent(in) :: B
397- type(symtridiagonal_${s1}$_type) :: C
343+ class(tridiagonal_${s1}$_type), intent(in) :: A
344+ class(tridiagonal_${s1}$_type), intent(in) :: B
345+ class(tridiagonal_${s1}$_type), allocatable :: C
398346 end function
399347 #:endfor
400348 end interface
0 commit comments