LCOV - code coverage report
Current view: top level - mtx/private - my_lapack95.f90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 13.5 % 970 131
Test Date: 2025-05-08 18:23:42 Functions: 41.7 % 24 10

            Line data    Source code
       1              :    ! ***********************************************************************
       2              : !
       3              : !   copyright (c) 2012  The MESA Team
       4              : !
       5              : !   This program is free software: you can redistribute it and/or modify
       6              : !   it under the terms of the GNU Lesser General Public License
       7              : !   as published by the Free Software Foundation,
       8              : !   either version 3 of the License, or (at your option) any later version.
       9              : !
      10              : !   This program is distributed in the hope that it will be useful,
      11              : !   but WITHOUT ANY WARRANTY; without even the implied warranty of
      12              : !   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
      13              : !   See the GNU Lesser General Public License for more details.
      14              : !
      15              : !   You should have received a copy of the GNU Lesser General Public License
      16              : !   along with this program. If not, see <https://www.gnu.org/licenses/>.
      17              : !
      18              : ! ***********************************************************************
      19              : 
      20              :       module my_lapack95
      21              : 
      22              :       use const_def, only: dp
      23              :       use utils_lib, only: mesa_error
      24              :       implicit none
      25              :       integer, parameter :: fltp = dp
      26              : 
      27              :       contains
      28              : 
      29            7 :       subroutine my_gemv(m,n,a,lda,x,y)  ! y = y - a*x
      30              :          integer :: lda,m,n
      31              :          real(fltp) :: a(:,:)  ! (lda,*)
      32              :          real(fltp) :: x(:), y(:)
      33            7 :          real(fltp) :: tmp
      34              :          real(fltp), parameter :: zero=0
      35              :          ! trans = 'n'
      36              :          ! alpha = -1
      37              :          ! beta = 1
      38              :          ! incx = 1
      39              :          ! incy = 1
      40              :          integer :: j, i
      41          182 :          do j = 1,n
      42          175 :             tmp = x(j)
      43          182 :             if (tmp/=zero) then
      44         4550 :                do i = 1,m
      45         4550 :                   y(i) = y(i) - tmp*a(i,j)
      46              :                end do
      47              :             end if
      48              :          end do
      49            7 :       end subroutine my_gemv
      50              : 
      51              : 
      52           14 :       subroutine my_gemv_mv(m,n,a,x,b,z,y)  ! y = y - a*x - b*z
      53              :          integer :: m, n
      54              :          real(fltp) :: a(:,:), b(:,:)
      55              :          real(fltp) :: x(:), z(:), y(:)
      56           14 :          real(fltp) :: tmp_x, tmp_z
      57              :          real(fltp), parameter :: zero=0
      58              :          integer :: j, i
      59          364 :          do j = 1,n
      60          350 :             tmp_x = x(j)
      61          350 :             tmp_z = z(j)
      62          364 :             if (tmp_x/=zero) then
      63          350 :                if (tmp_z /= zero) then
      64         9100 :                   do i = 1,m
      65         9100 :                      y(i) = y(i) - tmp_x*a(i,j) - tmp_z*b(i,j)
      66              :                   end do
      67              :                else
      68            0 :                   do i = 1,m
      69            0 :                      y(i) = y(i) - tmp_x*a(i,j)
      70              :                   end do
      71              :                end if
      72            0 :             else if (tmp_z /= zero) then
      73            0 :                do i = 1,m
      74            0 :                   y(i) = y(i) - tmp_z*b(i,j)
      75              :                end do
      76              :             end if
      77              :          end do
      78           14 :       end subroutine my_gemv_mv
      79              : 
      80              : 
      81           61 :       subroutine my_gemv_p1(m,n,a,lda,x,y)  ! y = y + a*x
      82              :          integer :: lda,m,n
      83              :          real(fltp) :: a(:,:)  ! (lda,*)
      84              :          real(fltp) :: x(:), y(:)
      85           61 :          real(fltp) :: tmp
      86              :          real(fltp), parameter :: zero=0
      87              :          ! trans = 'n'
      88              :          ! alpha = -1
      89              :          ! beta = 1
      90              :          ! incx = 1
      91              :          ! incy = 1
      92              :          integer :: j, i
      93         1586 :          do j = 1,n
      94         1525 :             tmp = x(j)
      95         1586 :             if (tmp/=zero) then
      96        39650 :                do i = 1,m
      97        39650 :                   y(i) = y(i) + tmp*a(i,j)
      98              :                end do
      99              :             end if
     100              :          end do
     101           61 :       end subroutine my_gemv_p1
     102              : 
     103              : 
     104           16 :       subroutine my_gemv_p_mv(m,n,a,x,b,z,y)  ! y = y + a*x + b*z
     105              :          integer :: m, n
     106              :          real(fltp) :: a(:,:), b(:,:)
     107              :          real(fltp) :: x(:), z(:), y(:)
     108           16 :          real(fltp) :: tmp_x, tmp_z
     109              :          real(fltp), parameter :: zero=0
     110              :          integer :: j, i
     111          416 :          do j = 1,n
     112          400 :             tmp_x = x(j)
     113          400 :             tmp_z = z(j)
     114          416 :             if (tmp_x/=zero) then
     115          400 :                if (tmp_z /= zero) then
     116        10400 :                   do i = 1,m
     117        10400 :                      y(i) = y(i) + tmp_x*a(i,j) + tmp_z*b(i,j)
     118              :                   end do
     119              :                else
     120            0 :                   do i = 1,m
     121            0 :                      y(i) = y(i) + tmp_x*a(i,j)
     122              :                   end do
     123              :                end if
     124            0 :             else if (tmp_z /= zero) then
     125            0 :                do i = 1,m
     126            0 :                   y(i) = y(i) + tmp_z*b(i,j)
     127              :                end do
     128              :             end if
     129              :          end do
     130           16 :       end subroutine my_gemv_p_mv
     131              : 
     132              : 
     133            0 :       subroutine my_gemm(m,n,k,a,lda,b,ldb,c,ldc)  ! c := c - a*b
     134              :          integer, intent(in) :: k,lda,ldb,ldc,m,n
     135              :          real(fltp), dimension(:,:) :: a, b, c  ! a(lda,*),b(ldb,*),c(ldc,*)
     136            0 :          real(fltp) :: tmp
     137              :          real(fltp), parameter :: zero=0
     138              :          integer :: j, i, l
     139              :          ! transa = 'n'
     140              :          ! transb = 'n'
     141              :          ! alpha = -1
     142              :          ! beta = 1
     143              :          ! assumes other args are valid
     144            0 :          do j = 1,n
     145            0 :             do l = 1,k
     146            0 :                tmp = b(l,j)
     147            0 :                if (tmp /= zero) then
     148            0 :                   do i = 1,m
     149            0 :                      c(i,j) = c(i,j) - tmp*a(i,l)
     150              :                   end do
     151              :                end if
     152              :             end do
     153              :          end do
     154            0 :       end subroutine my_gemm
     155              : 
     156              : 
     157           42 :       subroutine my_gemm_p1(m,n,k,a,lda,b,ldb,c,ldc)  ! c := c + a*b
     158              :          integer, intent(in) :: k,lda,ldb,ldc,m,n
     159              :          real(fltp), dimension(:,:) :: a, b, c  ! a(lda,*),b(ldb,*),c(ldc,*)
     160           42 :          real(fltp) :: tmp
     161              :          real(fltp), parameter :: zero=0
     162              :          integer :: j, i, l
     163              :          ! transa = 'n'
     164              :          ! transb = 'n'
     165              :          ! alpha = 1
     166              :          ! beta = 1
     167              :          ! assumes other args are valid
     168         1092 :          do j = 1,n
     169        27342 :             do l = 1,k
     170        26250 :                tmp = b(l,j)
     171        27300 :                if (tmp /= zero) then
     172        57876 :                   do i = 1,m
     173        57876 :                      c(i,j) = c(i,j) + tmp*a(i,l)
     174              :                   end do
     175              :                end if
     176              :             end do
     177              :          end do
     178           42 :       end subroutine my_gemm_p1
     179              : 
     180              : 
     181           14 :       subroutine my_gemm_plus_mm(m,n,k,a,b,d,e,c)  ! c := c + a*b + d*e
     182              :          integer, intent(in) :: k,m,n
     183              :          real(fltp), dimension(:,:) :: a, b, c, d, e
     184           14 :          real(fltp) :: tmp_b, tmp_e
     185              :          real(fltp), parameter :: zero=0
     186              :          integer :: j, i, l
     187          364 :          do j = 1,n
     188         9114 :             do l = 1,k
     189         8750 :                tmp_b = b(l,j)
     190         8750 :                tmp_e = e(l,j)
     191         9100 :                if (tmp_b /= zero) then
     192          742 :                   if (tmp_e /= zero) then
     193        14196 :                      do i = 1,m
     194        14196 :                         c(i,j) = c(i,j) + tmp_b*a(i,l) + tmp_e*d(i,l)
     195              :                      end do
     196              :                   else
     197         5096 :                      do i = 1,m
     198         5096 :                         c(i,j) = c(i,j) + tmp_b*a(i,l)
     199              :                      end do
     200              :                   end if
     201         8008 :                else if (tmp_e /= zero) then
     202         5096 :                   do i = 1,m
     203         5096 :                      c(i,j) = c(i,j) + tmp_e*d(i,l)
     204              :                   end do
     205              :                end if
     206              :             end do
     207              :          end do
     208           14 :       end subroutine my_gemm_plus_mm
     209              : 
     210              : 
     211            0 :       subroutine my_gemm0(m,n,k,a,lda,b,ldb,c,ldc)
     212              :          ! c := -a*b
     213              :          integer, intent(in) :: k,lda,ldb,ldc,m,n
     214              :          real(fltp), dimension(:,:) :: a, b, c  ! a(lda,*),b(ldb,*),c(ldc,*)
     215              :          integer :: j, i
     216              :          real(fltp), parameter :: zero=0
     217              :          include 'formats'
     218              :          ! transa = 'n'
     219              :          ! transb = 'n'
     220              :          ! alpha = -1
     221              :          ! beta = 0
     222              :          ! assumes other args are valid
     223            0 :          do j=1,n
     224            0 :             do i=1,m
     225            0 :                c(i,j) = zero
     226              :             end do
     227              :          end do
     228            0 :          call my_gemm(m,n,k,a,lda,b,ldb,c,ldc)
     229            0 :       end subroutine my_gemm0
     230              : 
     231              : 
     232           35 :       subroutine my_gemm0_p1(m,n,k,a,lda,b,ldb,c,ldc)
     233              :          ! c := -a*b
     234              :          integer, intent(in) :: k,lda,ldb,ldc,m,n
     235              :          real(fltp), dimension(:,:) :: a, b, c  ! a(lda,*),b(ldb,*),c(ldc,*)
     236              :          integer :: j, i
     237              :          real(fltp), parameter :: zero=0
     238              :          include 'formats'
     239              :          ! transa = 'n'
     240              :          ! transb = 'n'
     241              :          ! alpha = -1
     242              :          ! beta = 0
     243              :          ! assumes other args are valid
     244          910 :          do j=1,n
     245        22785 :             do i=1,m
     246        22750 :                c(i,j) = zero
     247              :             end do
     248              :          end do
     249           35 :          call my_gemm_p1(m,n,k,a,lda,b,ldb,c,ldc)
     250           35 :       end subroutine my_gemm0_p1
     251              : 
     252              : 
     253           20 :       subroutine my_getf2(m, a, lda, ipiv, sfmin, info)
     254              :          integer :: info, lda, m
     255              :          integer :: ipiv(:)
     256              :          real(fltp) :: a(:,:)
     257              :          real(fltp) :: sfmin
     258              :          real(fltp), parameter :: one=1, zero=0
     259              :          integer :: i, j, jp, ii, jj, n, mm
     260           20 :          real(fltp) :: tmp, da
     261           20 :          if (m == 4) then
     262            0 :             call my_getf2_4_by_4(a, lda, ipiv, sfmin, info)
     263            0 :             return
     264           20 :          else if (m == 5) then
     265            0 :             call my_getf2_5_by_5(a, lda, ipiv, sfmin, info)
     266            0 :             return
     267              :          end if
     268          520 :          do j = 1, m
     269          500 :             info = 0
     270         7000 :             jp = j - 1 + maxloc(abs(a(j:lda,j)),dim=1)
     271          500 :             ipiv( j ) = jp
     272          500 :             if( a( jp, j )/=zero ) then
     273          500 :                if( jp/=j ) then  ! swap a(j,:) and a(jp,:)
     274            0 :                   do i=1,m
     275            0 :                      tmp = a(j,i)
     276            0 :                      a(j,i) = a(jp,i)
     277            0 :                      a(jp,i) = tmp
     278              :                   end do
     279              :                end if
     280          500 :                if( j<m ) then
     281          480 :                   if( abs(a( j, j )) >= sfmin ) then
     282          480 :                      da = one / a( j, j )
     283          480 :                      n = m-j
     284          480 :                      mm = mod(n,5)
     285          480 :                      if (mm /= 0) then
     286         1400 :                         do i = 1,mm
     287         1400 :                            a(j+i,j) = da*a(j+i,j)
     288              :                         end do
     289              :                      end if
     290          480 :                      if (n >= 5) then
     291          400 :                         do i = mm + 1,n,5
     292         1000 :                            a(j+i,j) = da*a(j+i,j)
     293         1000 :                            a(j+i+1,j) = da*a(j+i+1,j)
     294         1000 :                            a(j+i+2,j) = da*a(j+i+2,j)
     295         1000 :                            a(j+i+3,j) = da*a(j+i+3,j)
     296         1000 :                            a(j+i+4,j) = da*a(j+i+4,j)
     297              :                         end do
     298              :                      end if
     299              :                   else  ! no scale
     300            0 :                     do i = 1, m-j
     301            0 :                        a( j+i, j ) = a( j+i, j ) / a( j, j )
     302              :                     end do
     303              :                   end if
     304              :                end if
     305              :             else if( info==0 ) then
     306            0 :                info = j
     307              :             end if
     308          520 :             if( j<m ) then
     309              :                !call dger( m-j, m-j, -one, a( j+1, j ), 1, a( j, j+1 ), lda, a( j+1, j+1 ), lda )
     310         6480 :                do jj = j+1, m
     311       104480 :                   do ii = j+1, m
     312       104000 :                      a(ii,jj) = a(ii,jj) - a(ii,j)*a(j,jj)
     313              :                   end do
     314              :                end do
     315              :             end if
     316              :          end do
     317              :       end subroutine my_getf2
     318              : 
     319              : 
     320            0 :       subroutine my_getf2_4_by_4(a, lda, ipiv, sfmin, info)
     321              :          integer :: info, lda  !  m=4
     322              :          integer :: ipiv(:)
     323              :          real(fltp) :: a(:,:)
     324              :          real(fltp) :: sfmin
     325              :          real(fltp), parameter :: one=1, zero=0
     326              :          integer :: jp
     327            0 :          real(fltp) :: tmp, da
     328            0 :          info = 0
     329              : 
     330            0 :          jp = maxloc(abs(a(1:lda,1)),dim=1)
     331            0 :          ipiv( 1 ) = jp
     332            0 :          if( a( jp, 1 )/=zero ) then
     333            0 :             if( jp/=1 ) then  ! swap a(1,:) and a(jp,:)
     334            0 :                tmp = a(1,1)
     335            0 :                a(1,1) = a(jp,1)
     336            0 :                a(jp,1) = tmp
     337            0 :                tmp = a(1,2)
     338            0 :                a(1,2) = a(jp,2)
     339            0 :                a(jp,2) = tmp
     340            0 :                tmp = a(1,3)
     341            0 :                a(1,3) = a(jp,3)
     342            0 :                a(jp,3) = tmp
     343            0 :                tmp = a(1,4)
     344            0 :                a(1,4) = a(jp,4)
     345            0 :                a(jp,4) = tmp
     346              :             end if
     347            0 :             if( abs(a( 1, 1 )) >= sfmin ) then
     348            0 :                da = one / a( 1, 1 )
     349            0 :                a(2,1) = da*a(2,1)
     350            0 :                a(3,1) = da*a(3,1)
     351            0 :                a(4,1) = da*a(4,1)
     352              :             else  ! no scale
     353            0 :                a( 2, 1 ) = a( 2, 1 ) / a( 1, 1 )
     354            0 :                a( 3, 1 ) = a( 3, 1 ) / a( 1, 1 )
     355            0 :                a( 4, 1 ) = a( 4, 1 ) / a( 1, 1 )
     356              :             end if
     357              :          else if( info==0 ) then
     358            0 :             info = 1
     359              :          end if
     360            0 :          a(2,2) = a(2,2) - a(2,1)*a(1,2)
     361            0 :          a(3,2) = a(3,2) - a(3,1)*a(1,2)
     362            0 :          a(4,2) = a(4,2) - a(4,1)*a(1,2)
     363            0 :          a(2,3) = a(2,3) - a(2,1)*a(1,3)
     364            0 :          a(3,3) = a(3,3) - a(3,1)*a(1,3)
     365            0 :          a(4,3) = a(4,3) - a(4,1)*a(1,3)
     366            0 :          a(2,4) = a(2,4) - a(2,1)*a(1,4)
     367            0 :          a(3,4) = a(3,4) - a(3,1)*a(1,4)
     368            0 :          a(4,4) = a(4,4) - a(4,1)*a(1,4)
     369              : 
     370            0 :          jp = 1 + maxloc(abs(a(2:lda,2)),dim=1)
     371            0 :          ipiv( 2 ) = jp
     372            0 :          if( a( jp, 2 )/=zero ) then
     373            0 :             if( jp/=2 ) then  ! swap a(2,:) and a(jp,:)
     374            0 :                tmp = a(2,1)
     375            0 :                a(2,1) = a(jp,1)
     376            0 :                a(jp,1) = tmp
     377            0 :                tmp = a(2,2)
     378            0 :                a(2,2) = a(jp,2)
     379            0 :                a(jp,2) = tmp
     380            0 :                tmp = a(2,3)
     381            0 :                a(2,3) = a(jp,3)
     382            0 :                a(jp,3) = tmp
     383            0 :                tmp = a(2,4)
     384            0 :                a(2,4) = a(jp,4)
     385            0 :                a(jp,4) = tmp
     386              :             end if
     387            0 :             if( abs(a( 2, 2 )) >= sfmin ) then
     388            0 :                da = one / a( 2, 2 )
     389            0 :                a(3,2) = da*a(3,2)
     390            0 :                a(4,2) = da*a(4,2)
     391              :             else  ! no scale
     392            0 :                a( 3, 2 ) = a( 3, 2 ) / a( 2, 2 )
     393            0 :                a( 4, 2 ) = a( 4, 2 ) / a( 2, 2 )
     394              :             end if
     395            0 :          else if( info==0 ) then
     396            0 :             info = 2
     397              :          end if
     398            0 :          a(3,3) = a(3,3) - a(3,2)*a(2,3)
     399            0 :          a(4,3) = a(4,3) - a(4,2)*a(2,3)
     400            0 :          a(3,4) = a(3,4) - a(3,2)*a(2,4)
     401            0 :          a(4,4) = a(4,4) - a(4,2)*a(2,4)
     402              : 
     403            0 :          jp = 2 + maxloc(abs(a(3:lda,3)),dim=1)
     404            0 :          ipiv( 3 ) = jp
     405            0 :          if( a( jp, 3 )/=zero ) then
     406            0 :             if( jp/=3 ) then  ! swap a(3,:) and a(jp,:)
     407            0 :                tmp = a(3,1)
     408            0 :                a(3,1) = a(jp,1)
     409            0 :                a(jp,1) = tmp
     410            0 :                tmp = a(3,2)
     411            0 :                a(3,2) = a(jp,2)
     412            0 :                a(jp,2) = tmp
     413            0 :                tmp = a(3,3)
     414            0 :                a(3,3) = a(jp,3)
     415            0 :                a(jp,3) = tmp
     416            0 :                tmp = a(3,4)
     417            0 :                a(3,4) = a(jp,4)
     418            0 :                a(jp,4) = tmp
     419              :             end if
     420            0 :             if( abs(a( 3, 3 )) >= sfmin ) then
     421            0 :                da = one / a( 3, 3 )
     422            0 :                a(4,3) = da*a(4,3)
     423              :             else  ! no scale
     424            0 :                a( 4, 3 ) = a( 4, 3 ) / a( 3, 3 )
     425              :             end if
     426            0 :          else if( info==0 ) then
     427            0 :             info = 3
     428              :          end if
     429            0 :          a(4,4) = a(4,4) - a(4,3)*a(3,4)
     430              : 
     431            0 :          jp = 3 + maxloc(abs(a(4:lda,4)),dim=1)
     432            0 :          ipiv( 4 ) = jp
     433            0 :          if( a( jp, 4 )/=zero ) then
     434            0 :             if( jp/=4 ) then  ! swap a(4,:) and a(jp,:)
     435            0 :                tmp = a(4,1)
     436            0 :                a(4,1) = a(jp,1)
     437            0 :                a(jp,1) = tmp
     438            0 :                tmp = a(4,2)
     439            0 :                a(4,2) = a(jp,2)
     440            0 :                a(jp,2) = tmp
     441            0 :                tmp = a(4,3)
     442            0 :                a(4,3) = a(jp,3)
     443            0 :                a(jp,3) = tmp
     444            0 :                tmp = a(4,4)
     445            0 :                a(4,4) = a(jp,4)
     446            0 :                a(jp,4) = tmp
     447              :             end if
     448            0 :          else if( info==0 ) then
     449            0 :             info = 4
     450              :          end if
     451              : 
     452            0 :       end subroutine my_getf2_4_by_4
     453              : 
     454              : 
     455            0 :       subroutine my_getf2_5_by_5(a, lda, ipiv, sfmin, info)
     456              :          integer :: info, lda  !  m=5
     457              :          integer :: ipiv(:)
     458              :          real(fltp) :: a(:,:)
     459              :          real(fltp) :: sfmin
     460              :          real(fltp), parameter :: one=1, zero=0
     461              :          integer :: jp
     462            0 :          real(fltp) :: tmp, da
     463            0 :          info = 0
     464            0 :          jp = maxloc(abs(a(1:lda,1)),dim=1)
     465            0 :          ipiv( 1 ) = jp
     466            0 :          if( a( jp, 1 )/=zero ) then
     467            0 :             if( jp/=1 ) then  ! swap a(1,:) and a(jp,:)
     468            0 :                tmp = a(1,1)
     469            0 :                a(1,1) = a(jp,1)
     470            0 :                a(jp,1) = tmp
     471            0 :                tmp = a(1,2)
     472            0 :                a(1,2) = a(jp,2)
     473            0 :                a(jp,2) = tmp
     474            0 :                tmp = a(1,3)
     475            0 :                a(1,3) = a(jp,3)
     476            0 :                a(jp,3) = tmp
     477            0 :                tmp = a(1,4)
     478            0 :                a(1,4) = a(jp,4)
     479            0 :                a(jp,4) = tmp
     480            0 :                tmp = a(1,5)
     481            0 :                a(1,5) = a(jp,5)
     482            0 :                a(jp,5) = tmp
     483              :             end if
     484            0 :             if( abs(a( 1, 1 )) >= sfmin ) then
     485            0 :                da = one / a( 1, 1 )
     486            0 :                a(2,1) = da*a(2,1)
     487            0 :                a(3,1) = da*a(3,1)
     488            0 :                a(4,1) = da*a(4,1)
     489            0 :                a(5,1) = da*a(5,1)
     490              :             else  ! no scale
     491            0 :                a( 2, 1 ) = a( 2, 1 ) / a( 1, 1 )
     492            0 :                a( 3, 1 ) = a( 3, 1 ) / a( 1, 1 )
     493            0 :                a( 4, 1 ) = a( 4, 1 ) / a( 1, 1 )
     494            0 :                a( 5, 1 ) = a( 5, 1 ) / a( 1, 1 )
     495              :             end if
     496              :          else if( info==0 ) then
     497            0 :             info = 1
     498              :          end if
     499            0 :          a(2,2) = a(2,2) - a(2,1)*a(1,2)
     500            0 :          a(3,2) = a(3,2) - a(3,1)*a(1,2)
     501            0 :          a(4,2) = a(4,2) - a(4,1)*a(1,2)
     502            0 :          a(5,2) = a(5,2) - a(5,1)*a(1,2)
     503            0 :          a(2,3) = a(2,3) - a(2,1)*a(1,3)
     504            0 :          a(3,3) = a(3,3) - a(3,1)*a(1,3)
     505            0 :          a(4,3) = a(4,3) - a(4,1)*a(1,3)
     506            0 :          a(5,3) = a(5,3) - a(5,1)*a(1,3)
     507            0 :          a(2,4) = a(2,4) - a(2,1)*a(1,4)
     508            0 :          a(3,4) = a(3,4) - a(3,1)*a(1,4)
     509            0 :          a(4,4) = a(4,4) - a(4,1)*a(1,4)
     510            0 :          a(5,4) = a(5,4) - a(5,1)*a(1,4)
     511            0 :          a(2,5) = a(2,5) - a(2,1)*a(1,5)
     512            0 :          a(3,5) = a(3,5) - a(3,1)*a(1,5)
     513            0 :          a(4,5) = a(4,5) - a(4,1)*a(1,5)
     514            0 :          a(5,5) = a(5,5) - a(5,1)*a(1,5)
     515              : 
     516            0 :          jp = 1 + maxloc(abs(a(2:lda,2)),dim=1)
     517            0 :          ipiv( 2 ) = jp
     518            0 :          if( a( jp, 2 )/=zero ) then
     519            0 :             if( jp/=2 ) then  ! swap a(2,:) and a(jp,:)
     520            0 :                tmp = a(2,1)
     521            0 :                a(2,1) = a(jp,1)
     522            0 :                a(jp,1) = tmp
     523            0 :                tmp = a(2,2)
     524            0 :                a(2,2) = a(jp,2)
     525            0 :                a(jp,2) = tmp
     526            0 :                tmp = a(2,3)
     527            0 :                a(2,3) = a(jp,3)
     528            0 :                a(jp,3) = tmp
     529            0 :                tmp = a(2,4)
     530            0 :                a(2,4) = a(jp,4)
     531            0 :                a(jp,4) = tmp
     532            0 :                tmp = a(2,5)
     533            0 :                a(2,5) = a(jp,5)
     534            0 :                a(jp,5) = tmp
     535              :             end if
     536            0 :             if( abs(a( 2, 2 )) >= sfmin ) then
     537            0 :                da = one / a( 2, 2 )
     538            0 :                a(3,2) = da*a(3,2)
     539            0 :                a(4,2) = da*a(4,2)
     540            0 :                a(5,2) = da*a(5,2)
     541              :             else  ! no scale
     542            0 :                a( 3, 2 ) = a( 3, 2 ) / a( 2, 2 )
     543            0 :                a( 4, 2 ) = a( 4, 2 ) / a( 2, 2 )
     544            0 :                a( 5, 2 ) = a( 5, 2 ) / a( 2, 2 )
     545              :             end if
     546            0 :          else if( info==0 ) then
     547            0 :             info = 2
     548              :          end if
     549            0 :          a(3,3) = a(3,3) - a(3,2)*a(2,3)
     550            0 :          a(4,3) = a(4,3) - a(4,2)*a(2,3)
     551            0 :          a(5,3) = a(5,3) - a(5,2)*a(2,3)
     552            0 :          a(3,4) = a(3,4) - a(3,2)*a(2,4)
     553            0 :          a(4,4) = a(4,4) - a(4,2)*a(2,4)
     554            0 :          a(5,4) = a(5,4) - a(5,2)*a(2,4)
     555            0 :          a(3,5) = a(3,5) - a(3,2)*a(2,5)
     556            0 :          a(4,5) = a(4,5) - a(4,2)*a(2,5)
     557            0 :          a(5,5) = a(5,5) - a(5,2)*a(2,5)
     558              : 
     559            0 :          jp = 2 + maxloc(abs(a(3:lda,3)),dim=1)
     560            0 :          ipiv( 3 ) = jp
     561            0 :          if( a( jp, 3 )/=zero ) then
     562            0 :             if( jp/=3 ) then  ! swap a(3,:) and a(jp,:)
     563            0 :                tmp = a(3,1)
     564            0 :                a(3,1) = a(jp,1)
     565            0 :                a(jp,1) = tmp
     566            0 :                tmp = a(3,2)
     567            0 :                a(3,2) = a(jp,2)
     568            0 :                a(jp,2) = tmp
     569            0 :                tmp = a(3,3)
     570            0 :                a(3,3) = a(jp,3)
     571            0 :                a(jp,3) = tmp
     572            0 :                tmp = a(3,4)
     573            0 :                a(3,4) = a(jp,4)
     574            0 :                a(jp,4) = tmp
     575            0 :                tmp = a(3,5)
     576            0 :                a(3,5) = a(jp,5)
     577            0 :                a(jp,5) = tmp
     578              :             end if
     579            0 :             if( abs(a( 3, 3 )) >= sfmin ) then
     580            0 :                da = one / a( 3, 3 )
     581            0 :                a(4,3) = da*a(4,3)
     582            0 :                a(5,3) = da*a(5,3)
     583              :             else  ! no scale
     584            0 :                a( 4, 3 ) = a( 4, 3 ) / a( 3, 3 )
     585            0 :                a( 4, 3 ) = a( 4, 3 ) / a( 3, 3 )
     586              :             end if
     587            0 :          else if( info==0 ) then
     588            0 :             info = 3
     589              :          end if
     590            0 :          a(4,4) = a(4,4) - a(4,3)*a(3,4)
     591            0 :          a(5,4) = a(5,4) - a(5,3)*a(3,4)
     592            0 :          a(4,5) = a(4,5) - a(4,3)*a(3,5)
     593            0 :          a(5,5) = a(5,5) - a(5,3)*a(3,5)
     594              : 
     595            0 :          jp = 3 + maxloc(abs(a(4:lda,4)),dim=1)
     596            0 :          ipiv( 4 ) = jp
     597            0 :          if( a( jp, 4 )/=zero ) then
     598            0 :             if( jp/=4 ) then  ! swap a(4,:) and a(jp,:)
     599            0 :                tmp = a(4,1)
     600            0 :                a(4,1) = a(jp,1)
     601            0 :                a(jp,1) = tmp
     602            0 :                tmp = a(4,2)
     603            0 :                a(4,2) = a(jp,2)
     604            0 :                a(jp,2) = tmp
     605            0 :                tmp = a(4,3)
     606            0 :                a(4,3) = a(jp,3)
     607            0 :                a(jp,3) = tmp
     608            0 :                tmp = a(4,4)
     609            0 :                a(4,4) = a(jp,4)
     610            0 :                a(jp,4) = tmp
     611            0 :                tmp = a(4,5)
     612            0 :                a(4,5) = a(jp,5)
     613            0 :                a(jp,5) = tmp
     614              :             end if
     615            0 :             if( abs(a( 4, 4 )) >= sfmin ) then
     616            0 :                da = one / a( 4, 4 )
     617            0 :                a(5,4) = da*a(5,4)
     618              :             else  ! no scale
     619            0 :               a( 5, 4 ) = a( 5, 4 ) / a( 4, 4 )
     620              :             end if
     621            0 :          else if( info==0 ) then
     622            0 :             info = 4
     623              :          end if
     624            0 :          a(5,5) = a(5,5) - a(5,4)*a(4,5)
     625              : 
     626            0 :          jp = 4 + maxloc(abs(a(5:lda,5)),dim=1)
     627            0 :          ipiv( 5 ) = jp
     628            0 :          if( a( jp, 5 )/=zero ) then
     629            0 :             if( jp/=5 ) then  ! swap a(5,:) and a(jp,:)
     630            0 :                tmp = a(5,1)
     631            0 :                a(5,1) = a(jp,1)
     632            0 :                a(jp,1) = tmp
     633            0 :                tmp = a(5,2)
     634            0 :                a(5,2) = a(jp,2)
     635            0 :                a(jp,2) = tmp
     636            0 :                tmp = a(5,3)
     637            0 :                a(5,3) = a(jp,3)
     638            0 :                a(jp,3) = tmp
     639            0 :                tmp = a(5,4)
     640            0 :                a(5,4) = a(jp,4)
     641            0 :                a(jp,4) = tmp
     642            0 :                tmp = a(5,5)
     643            0 :                a(5,5) = a(jp,5)
     644            0 :                a(jp,5) = tmp
     645              :             end if
     646            0 :          else if( info==0 ) then
     647            0 :             info = 5
     648              :          end if
     649              : 
     650            0 :       end subroutine my_getf2_5_by_5
     651              : 
     652              : 
     653           58 :       subroutine my_laswp( n,   a, lda,  k1, k2, ipiv,  incx )
     654              :          integer :: incx, k1, k2, lda, n
     655              :          integer :: ipiv(:)
     656              :          real(fltp) :: a(:,:)  ! a( lda, * )
     657              :          integer :: i, i1, i2, inc, ip, ix, ix0, j, k, n32
     658           58 :          real(fltp) :: temp
     659              :          ! interchange row i with row ipiv(i) for each of rows k1 through k2.
     660           58 :          if( incx>0 ) then
     661           58 :             ix0 = k1
     662           58 :             i1 = k1
     663           58 :             i2 = k2
     664           58 :             inc = 1
     665            0 :          else if( incx<0 ) then
     666            0 :             ix0 = 1 + ( 1-k2 )*incx
     667            0 :             i1 = k2
     668            0 :             i2 = k1
     669            0 :             inc = -1
     670              :          else
     671              :             return
     672              :          end if
     673           58 :          n32 = ( n / 32 )*32
     674           58 :          if( n32/=0 ) then
     675            0 :             do j = 1, n32, 32
     676            0 :                ix = ix0
     677            0 :                do i = i1, i2, inc
     678            0 :                   ip = ipiv( ix )
     679            0 :                   if( ip/=i ) then
     680            0 :                      do k = j, j + 31
     681            0 :                         temp = a( i, k )
     682            0 :                         a( i, k ) = a( ip, k )
     683            0 :                         a( ip, k ) = temp
     684              :                      end do
     685              :                   end if
     686            0 :                   ix = ix + incx
     687              :                end do
     688              :             end do
     689              :          end if
     690           58 :          if( n32/=n ) then
     691           58 :             n32 = n32 + 1
     692           58 :             ix = ix0
     693           58 :             do i = i1, i2, inc
     694         1450 :                ip = ipiv( ix )
     695         1450 :                if( ip/=i ) then
     696            0 :                   do k = n32, n
     697            0 :                      temp = a( i, k )
     698            0 :                      a( i, k ) = a( ip, k )
     699            0 :                      a( ip, k ) = temp
     700              :                   end do
     701              :                end if
     702         1450 :                ix = ix + incx
     703              :             end do
     704              :          end if
     705              :       end subroutine my_laswp
     706              : 
     707              : 
     708            0 :       subroutine my_laswp_4_by_1( a, lda, ipiv )
     709              :          ! n == 1, k1 == 1, k2 == 4, incx == 1
     710              :          integer :: lda
     711              :          integer :: ipiv(:)
     712              :          real(fltp) :: a(:,:)  ! a( lda, * )
     713              :          integer :: ip
     714            0 :          real(fltp) :: temp
     715              :          ! interchange row i with row ipiv(i) for each of rows k1 through k2.
     716            0 :          ip = ipiv( 1 )
     717            0 :          if( ip/=1 ) then
     718            0 :             temp = a( 1, 1 )
     719            0 :             a( 1, 1 ) = a( ip, 1 )
     720            0 :             a( ip, 1 ) = temp
     721              :          end if
     722            0 :          ip = ipiv( 2 )
     723            0 :          if( ip/=2 ) then
     724            0 :             temp = a( 2, 1 )
     725            0 :             a( 2, 1 ) = a( ip, 1 )
     726            0 :             a( ip, 1 ) = temp
     727              :          end if
     728            0 :          ip = ipiv( 3 )
     729            0 :          if( ip/=3 ) then
     730            0 :             temp = a( 3, 1 )
     731            0 :             a( 3, 1 ) = a( ip, 1 )
     732            0 :             a( ip, 1 ) = temp
     733              :          end if
     734            0 :          ip = ipiv( 4 )
     735            0 :          if( ip/=4 ) then
     736            0 :             temp = a( 4, 1 )
     737            0 :             a( 4, 1 ) = a( ip, 1 )
     738            0 :             a( ip, 1 ) = temp
     739              :          end if
     740            0 :       end subroutine my_laswp_4_by_1
     741              : 
     742              : 
     743            0 :       subroutine my_laswp_5_by_1( a, lda, ipiv )
     744              :          ! n == 1, k1 == 1, k2 == 5, incx == 1
     745              :          integer :: lda
     746              :          integer :: ipiv(:)
     747              :          real(fltp) :: a(:,:)  ! a( lda, * )
     748              :          integer :: ip
     749            0 :          real(fltp) :: temp
     750              :          ! interchange row i with row ipiv(i) for each of rows k1 through k2.
     751            0 :          ip = ipiv( 1 )
     752            0 :          if( ip/=1 ) then
     753            0 :             temp = a( 1, 1 )
     754            0 :             a( 1, 1 ) = a( ip, 1 )
     755            0 :             a( ip, 1 ) = temp
     756              :          end if
     757            0 :          ip = ipiv( 2 )
     758            0 :          if( ip/=2 ) then
     759            0 :             temp = a( 2, 1 )
     760            0 :             a( 2, 1 ) = a( ip, 1 )
     761            0 :             a( ip, 1 ) = temp
     762              :          end if
     763            0 :          ip = ipiv( 3 )
     764            0 :          if( ip/=3 ) then
     765            0 :             temp = a( 3, 1 )
     766            0 :             a( 3, 1 ) = a( ip, 1 )
     767            0 :             a( ip, 1 ) = temp
     768              :          end if
     769            0 :          ip = ipiv( 4 )
     770            0 :          if( ip/=4 ) then
     771            0 :             temp = a( 4, 1 )
     772            0 :             a( 4, 1 ) = a( ip, 1 )
     773            0 :             a( ip, 1 ) = temp
     774              :          end if
     775            0 :          ip = ipiv( 5 )
     776            0 :          if( ip/=5 ) then
     777            0 :             temp = a( 5, 1 )
     778            0 :             a( 5, 1 ) = a( ip, 1 )
     779            0 :             a( ip, 1 ) = temp
     780              :          end if
     781            0 :       end subroutine my_laswp_5_by_1
     782              : 
     783              : 
     784            0 :       subroutine my_laswp_4_by_4( a, lda, ipiv )
     785              :          integer :: lda
     786              :          integer :: ipiv(:)
     787              :          real(fltp) :: a(:,:)  ! a( lda, * )
     788            0 :          real(fltp) :: temp
     789              :          integer :: ip
     790              :          ! interchange row i with row ipiv(i) for each of rows 1 through 4.
     791            0 :          ip = ipiv( 1 )
     792            0 :          if( ip/=1 ) then
     793            0 :             temp = a( 1, 1 )
     794            0 :             a( 1, 1 ) = a( ip, 1 )
     795            0 :             a( ip, 1 ) = temp
     796            0 :             temp = a( 1, 2 )
     797            0 :             a( 1, 2 ) = a( ip, 2 )
     798            0 :             a( ip, 2 ) = temp
     799            0 :             temp = a( 1, 3 )
     800            0 :             a( 1, 3 ) = a( ip, 3 )
     801            0 :             a( ip, 3 ) = temp
     802            0 :             temp = a( 1, 4 )
     803            0 :             a( 1, 4 ) = a( ip, 4 )
     804            0 :             a( ip, 4 ) = temp
     805              :          end if
     806            0 :          ip = ipiv( 2 )
     807            0 :          if( ip/=2 ) then
     808            0 :             temp = a( 2, 1 )
     809            0 :             a( 2, 1 ) = a( ip, 1 )
     810            0 :             a( ip, 1 ) = temp
     811            0 :             temp = a( 2, 2 )
     812            0 :             a( 2, 2 ) = a( ip, 2 )
     813            0 :             a( ip, 2 ) = temp
     814            0 :             temp = a( 2, 3 )
     815            0 :             a( 2, 3 ) = a( ip, 3 )
     816            0 :             a( ip, 3 ) = temp
     817            0 :             temp = a( 2, 4 )
     818            0 :             a( 2, 4 ) = a( ip, 4 )
     819            0 :             a( ip, 4 ) = temp
     820              :          end if
     821            0 :          ip = ipiv( 3 )
     822            0 :          if( ip/=3 ) then
     823            0 :             temp = a( 3, 1 )
     824            0 :             a( 3, 1 ) = a( ip, 1 )
     825            0 :             a( ip, 1 ) = temp
     826            0 :             temp = a( 3, 2 )
     827            0 :             a( 3, 2 ) = a( ip, 2 )
     828            0 :             a( ip, 2 ) = temp
     829            0 :             temp = a( 3, 3 )
     830            0 :             a( 3, 3 ) = a( ip, 3 )
     831            0 :             a( ip, 3 ) = temp
     832            0 :             temp = a( 3, 4 )
     833            0 :             a( 3, 4 ) = a( ip, 4 )
     834            0 :             a( ip, 4 ) = temp
     835              :          end if
     836            0 :          ip = ipiv( 4 )
     837            0 :          if( ip/=4 ) then
     838            0 :             temp = a( 4, 1 )
     839            0 :             a( 4, 1 ) = a( ip, 1 )
     840            0 :             a( ip, 1 ) = temp
     841            0 :             temp = a( 4, 2 )
     842            0 :             a( 4, 2 ) = a( ip, 2 )
     843            0 :             a( ip, 2 ) = temp
     844            0 :             temp = a( 4, 3 )
     845            0 :             a( 4, 3 ) = a( ip, 3 )
     846            0 :             a( ip, 3 ) = temp
     847            0 :             temp = a( 4, 4 )
     848            0 :             a( 4, 4 ) = a( ip, 4 )
     849            0 :             a( ip, 4 ) = temp
     850              :          end if
     851            0 :       end subroutine my_laswp_4_by_4
     852              : 
     853              : 
     854            0 :       subroutine my_laswp_5_by_5( a, lda, ipiv )
     855              :          integer :: lda
     856              :          integer :: ipiv(:)
     857              :          real(fltp) :: a(:,:)  ! a( lda, * )
     858            0 :          real(fltp) :: temp
     859              :          integer :: ip
     860              :          ! interchange row i with row ipiv(i) for each of rows 1 through 5.
     861            0 :          ip = ipiv( 1 )
     862            0 :          if( ip/=1 ) then
     863            0 :             temp = a( 1, 1 )
     864            0 :             a( 1, 1 ) = a( ip, 1 )
     865            0 :             a( ip, 1 ) = temp
     866            0 :             temp = a( 1, 2 )
     867            0 :             a( 1, 2 ) = a( ip, 2 )
     868            0 :             a( ip, 2 ) = temp
     869            0 :             temp = a( 1, 3 )
     870            0 :             a( 1, 3 ) = a( ip, 3 )
     871            0 :             a( ip, 3 ) = temp
     872            0 :             temp = a( 1, 4 )
     873            0 :             a( 1, 4 ) = a( ip, 4 )
     874            0 :             a( ip, 4 ) = temp
     875            0 :             temp = a( 1, 5 )
     876            0 :             a( 1, 5 ) = a( ip, 5 )
     877            0 :             a( ip, 5 ) = temp
     878              :          end if
     879            0 :          ip = ipiv( 2 )
     880            0 :          if( ip/=2 ) then
     881            0 :             temp = a( 2, 1 )
     882            0 :             a( 2, 1 ) = a( ip, 1 )
     883            0 :             a( ip, 1 ) = temp
     884            0 :             temp = a( 2, 2 )
     885            0 :             a( 2, 2 ) = a( ip, 2 )
     886            0 :             a( ip, 2 ) = temp
     887            0 :             temp = a( 2, 3 )
     888            0 :             a( 2, 3 ) = a( ip, 3 )
     889            0 :             a( ip, 3 ) = temp
     890            0 :             temp = a( 2, 4 )
     891            0 :             a( 2, 4 ) = a( ip, 4 )
     892            0 :             a( ip, 4 ) = temp
     893            0 :             temp = a( 2, 5 )
     894            0 :             a( 2, 5 ) = a( ip, 5 )
     895            0 :             a( ip, 5 ) = temp
     896              :          end if
     897            0 :          ip = ipiv( 3 )
     898            0 :          if( ip/=3 ) then
     899            0 :             temp = a( 3, 1 )
     900            0 :             a( 3, 1 ) = a( ip, 1 )
     901            0 :             a( ip, 1 ) = temp
     902            0 :             temp = a( 3, 2 )
     903            0 :             a( 3, 2 ) = a( ip, 2 )
     904            0 :             a( ip, 2 ) = temp
     905            0 :             temp = a( 3, 3 )
     906            0 :             a( 3, 3 ) = a( ip, 3 )
     907            0 :             a( ip, 3 ) = temp
     908            0 :             temp = a( 3, 4 )
     909            0 :             a( 3, 4 ) = a( ip, 4 )
     910            0 :             a( ip, 4 ) = temp
     911            0 :             temp = a( 3, 5 )
     912            0 :             a( 3, 5 ) = a( ip, 5 )
     913            0 :             a( ip, 5 ) = temp
     914              :          end if
     915            0 :          ip = ipiv( 4 )
     916            0 :          if( ip/=4 ) then
     917            0 :             temp = a( 4, 1 )
     918            0 :             a( 4, 1 ) = a( ip, 1 )
     919            0 :             a( ip, 1 ) = temp
     920            0 :             temp = a( 4, 2 )
     921            0 :             a( 4, 2 ) = a( ip, 2 )
     922            0 :             a( ip, 2 ) = temp
     923            0 :             temp = a( 4, 3 )
     924            0 :             a( 4, 3 ) = a( ip, 3 )
     925            0 :             a( ip, 3 ) = temp
     926            0 :             temp = a( 4, 4 )
     927            0 :             a( 4, 4 ) = a( ip, 4 )
     928            0 :             a( ip, 4 ) = temp
     929            0 :             temp = a( 4, 5 )
     930            0 :             a( 4, 5 ) = a( ip, 5 )
     931            0 :             a( ip, 5 ) = temp
     932              :          end if
     933            0 :          ip = ipiv( 5 )
     934            0 :          if( ip/=5 ) then
     935            0 :             temp = a( 5, 1 )
     936            0 :             a( 5, 1 ) = a( ip, 1 )
     937            0 :             a( ip, 1 ) = temp
     938            0 :             temp = a( 5, 2 )
     939            0 :             a( 5, 2 ) = a( ip, 2 )
     940            0 :             a( ip, 2 ) = temp
     941            0 :             temp = a( 5, 3 )
     942            0 :             a( 5, 3 ) = a( ip, 3 )
     943            0 :             a( ip, 3 ) = temp
     944            0 :             temp = a( 5, 4 )
     945            0 :             a( 5, 4 ) = a( ip, 4 )
     946            0 :             a( ip, 4 ) = temp
     947            0 :             temp = a( 5, 5 )
     948            0 :             a( 5, 5 ) = a( ip, 5 )
     949            0 :             a( ip, 5 ) = temp
     950              :          end if
     951            0 :       end subroutine my_laswp_5_by_5
     952              : 
     953              : 
     954           58 :       subroutine my_getrs( n, nrhs, a, lda, ipiv, b, ldb, info )
     955              :          integer :: info, lda, ldb, n, nrhs
     956              :          integer, pointer :: ipiv(:)
     957              :          real(fltp), pointer :: a(:,:), b(:,:)  ! a( lda, * ), b( ldb, * )
     958              :          real(fltp), parameter :: one=1, zero=0
     959              :          integer :: i, j, k
     960           58 :          info = 0
     961              : 
     962           58 :          if (nrhs == 1) then
     963           20 :             if (n == 4) then
     964            0 :                call my_getrs_4_by_1( a, lda, ipiv, b, ldb, info )
     965            0 :                return
     966              :             end if
     967           20 :             if (n == 5) then
     968            0 :                call my_getrs_5_by_1( a, lda, ipiv, b, ldb, info )
     969            0 :                return
     970              :             end if
     971           38 :          else if (nrhs == 4 .and. n == 4) then
     972            0 :             call my_getrs_4_by_4( a, lda, ipiv, b, ldb, info )
     973            0 :             return
     974           38 :          else if (nrhs == 5 .and. n == 5) then
     975            0 :             call my_getrs_5_by_5( a, lda, ipiv, b, ldb, info )
     976            0 :             return
     977              :          end if
     978              : 
     979           58 :          call my_laswp(nrhs, b, ldb, 1, n, ipiv, 1 )
     980              :          !call dtrsm( 'left', 'lower', 'no transpose', 'unit', n, nrhs, one, a, lda, b, ldb )
     981         1028 :          do j = 1,nrhs
     982        25278 :             do k = 1,n
     983        25220 :                if (b(k,j)/=zero) then
     984        31567 :                   do i = k + 1,n
     985        31567 :                      b(i,j) = b(i,j) - b(k,j)*a(i,k)
     986              :                   end do
     987              :                end if
     988              :             end do
     989              :          end do
     990              :          !call dtrsm( 'left', 'upper', 'no transpose', 'non-unit', n, nrhs, one, a, lda, b, ldb )
     991         1028 :          do j = 1,nrhs
     992        25278 :             do k = n,1,-1
     993        25220 :                if (b(k,j)/=zero) then
     994         2514 :                   b(k,j) = b(k,j)/a(k,k)
     995        23562 :                   do i = 1,k - 1
     996        23562 :                      b(i,j) = b(i,j) - b(k,j)*a(i,k)
     997              :                   end do
     998              :                end if
     999              :             end do
    1000              :          end do
    1001              : 
    1002              :       end subroutine my_getrs
    1003              : 
    1004              : 
    1005            0 :       subroutine my_getrs_5_by_5( a, lda, ipiv, b, ldb, info )
    1006              :          integer :: info, lda, ldb  ! , n=5, nrhs=5
    1007              :          integer, pointer :: ipiv(:)
    1008              :          real(fltp), pointer :: a(:,:), b(:,:)  ! a( lda, * ), b( ldb, * )
    1009              :          real(fltp), parameter :: zero=0
    1010              : 
    1011            0 :          info = 0
    1012              : 
    1013              :          !call my_laswp(5, b, ldb, 1, 5, ipiv, 1 )
    1014            0 :          call my_laswp_5_by_5( b, ldb, ipiv )
    1015              : 
    1016            0 :          b(2,1) = b(2,1) - b(1,1)*a(2,1)
    1017            0 :          b(3,1) = b(3,1) - b(1,1)*a(3,1)
    1018            0 :          b(4,1) = b(4,1) - b(1,1)*a(4,1)
    1019            0 :          b(5,1) = b(5,1) - b(1,1)*a(5,1)
    1020            0 :          b(3,1) = b(3,1) - b(2,1)*a(3,2)
    1021            0 :          b(4,1) = b(4,1) - b(2,1)*a(4,2)
    1022            0 :          b(5,1) = b(5,1) - b(2,1)*a(5,2)
    1023            0 :          b(4,1) = b(4,1) - b(3,1)*a(4,3)
    1024            0 :          b(5,1) = b(5,1) - b(3,1)*a(5,3)
    1025            0 :          b(5,1) = b(5,1) - b(4,1)*a(5,4)
    1026              : 
    1027            0 :          b(2,2) = b(2,2) - b(1,2)*a(2,1)
    1028            0 :          b(3,2) = b(3,2) - b(1,2)*a(3,1)
    1029            0 :          b(4,2) = b(4,2) - b(1,2)*a(4,1)
    1030            0 :          b(5,2) = b(5,2) - b(1,2)*a(5,1)
    1031            0 :          b(3,2) = b(3,2) - b(2,2)*a(3,2)
    1032            0 :          b(4,2) = b(4,2) - b(2,2)*a(4,2)
    1033            0 :          b(5,2) = b(5,2) - b(2,2)*a(5,2)
    1034            0 :          b(4,2) = b(4,2) - b(3,2)*a(4,3)
    1035            0 :          b(5,2) = b(5,2) - b(3,2)*a(5,3)
    1036            0 :          b(5,2) = b(5,2) - b(4,2)*a(5,4)
    1037              : 
    1038            0 :          b(2,3) = b(2,3) - b(1,3)*a(2,1)
    1039            0 :          b(3,3) = b(3,3) - b(1,3)*a(3,1)
    1040            0 :          b(4,3) = b(4,3) - b(1,3)*a(4,1)
    1041            0 :          b(5,3) = b(5,3) - b(1,3)*a(5,1)
    1042            0 :          b(3,3) = b(3,3) - b(2,3)*a(3,2)
    1043            0 :          b(4,3) = b(4,3) - b(2,3)*a(4,2)
    1044            0 :          b(5,3) = b(5,3) - b(2,3)*a(5,2)
    1045            0 :          b(4,3) = b(4,3) - b(3,3)*a(4,3)
    1046            0 :          b(5,3) = b(5,3) - b(3,3)*a(5,3)
    1047            0 :          b(5,3) = b(5,3) - b(4,3)*a(5,4)
    1048              : 
    1049            0 :          b(2,4) = b(2,4) - b(1,4)*a(2,1)
    1050            0 :          b(3,4) = b(3,4) - b(1,4)*a(3,1)
    1051            0 :          b(4,4) = b(4,4) - b(1,4)*a(4,1)
    1052            0 :          b(5,4) = b(5,4) - b(1,4)*a(5,1)
    1053            0 :          b(3,4) = b(3,4) - b(2,4)*a(3,2)
    1054            0 :          b(4,4) = b(4,4) - b(2,4)*a(4,2)
    1055            0 :          b(5,4) = b(5,4) - b(2,4)*a(5,2)
    1056            0 :          b(4,4) = b(4,4) - b(3,4)*a(4,3)
    1057            0 :          b(5,4) = b(5,4) - b(3,4)*a(5,3)
    1058            0 :          b(5,4) = b(5,4) - b(4,4)*a(5,4)
    1059              : 
    1060            0 :          b(2,5) = b(2,5) - b(1,5)*a(2,1)
    1061            0 :          b(3,5) = b(3,5) - b(1,5)*a(3,1)
    1062            0 :          b(4,5) = b(4,5) - b(1,5)*a(4,1)
    1063            0 :          b(5,5) = b(5,5) - b(1,5)*a(5,1)
    1064            0 :          b(3,5) = b(3,5) - b(2,5)*a(3,2)
    1065            0 :          b(4,5) = b(4,5) - b(2,5)*a(4,2)
    1066            0 :          b(5,5) = b(5,5) - b(2,5)*a(5,2)
    1067            0 :          b(4,5) = b(4,5) - b(3,5)*a(4,3)
    1068            0 :          b(5,5) = b(5,5) - b(3,5)*a(5,3)
    1069            0 :          b(5,5) = b(5,5) - b(4,5)*a(5,4)
    1070              : 
    1071              :          !call dtrsm( 'left', 'upper', 'no transpose', 'non-unit', n, nrhs, one, a, lda, b, ldb )
    1072            0 :          b(5,1) = b(5,1)/a(5,5)
    1073            0 :          b(1,1) = b(1,1) - b(5,1)*a(1,5)
    1074            0 :          b(2,1) = b(2,1) - b(5,1)*a(2,5)
    1075            0 :          b(3,1) = b(3,1) - b(5,1)*a(3,5)
    1076            0 :          b(4,1) = b(4,1) - b(5,1)*a(4,5)
    1077            0 :          b(4,1) = b(4,1)/a(4,4)
    1078            0 :          b(1,1) = b(1,1) - b(4,1)*a(1,4)
    1079            0 :          b(2,1) = b(2,1) - b(4,1)*a(2,4)
    1080            0 :          b(3,1) = b(3,1) - b(4,1)*a(3,4)
    1081            0 :          b(3,1) = b(3,1)/a(3,3)
    1082            0 :          b(1,1) = b(1,1) - b(3,1)*a(1,3)
    1083            0 :          b(2,1) = b(2,1) - b(3,1)*a(2,3)
    1084            0 :          b(2,1) = b(2,1)/a(2,2)
    1085            0 :          b(1,1) = b(1,1) - b(2,1)*a(1,2)
    1086            0 :          b(1,1) = b(1,1)/a(1,1)
    1087              : 
    1088            0 :          b(5,2) = b(5,2)/a(5,5)
    1089            0 :          b(1,2) = b(1,2) - b(5,2)*a(1,5)
    1090            0 :          b(2,2) = b(2,2) - b(5,2)*a(2,5)
    1091            0 :          b(3,2) = b(3,2) - b(5,2)*a(3,5)
    1092            0 :          b(4,2) = b(4,2) - b(5,2)*a(4,5)
    1093            0 :          b(4,2) = b(4,2)/a(4,4)
    1094            0 :          b(1,2) = b(1,2) - b(4,2)*a(1,4)
    1095            0 :          b(2,2) = b(2,2) - b(4,2)*a(2,4)
    1096            0 :          b(3,2) = b(3,2) - b(4,2)*a(3,4)
    1097            0 :          b(3,2) = b(3,2)/a(3,3)
    1098            0 :          b(1,2) = b(1,2) - b(3,2)*a(1,3)
    1099            0 :          b(2,2) = b(2,2) - b(3,2)*a(2,3)
    1100            0 :          b(2,2) = b(2,2)/a(2,2)
    1101            0 :          b(1,2) = b(1,2) - b(2,2)*a(1,2)
    1102            0 :          b(1,2) = b(1,2)/a(1,1)
    1103              : 
    1104            0 :          b(5,3) = b(5,3)/a(5,5)
    1105            0 :          b(1,3) = b(1,3) - b(5,3)*a(1,5)
    1106            0 :          b(2,3) = b(2,3) - b(5,3)*a(2,5)
    1107            0 :          b(3,3) = b(3,3) - b(5,3)*a(3,5)
    1108            0 :          b(4,3) = b(4,3) - b(5,3)*a(4,5)
    1109            0 :          b(4,3) = b(4,3)/a(4,4)
    1110            0 :          b(1,3) = b(1,3) - b(4,3)*a(1,4)
    1111            0 :          b(2,3) = b(2,3) - b(4,3)*a(2,4)
    1112            0 :          b(3,3) = b(3,3) - b(4,3)*a(3,4)
    1113            0 :          b(3,3) = b(3,3)/a(3,3)
    1114            0 :          b(1,3) = b(1,3) - b(3,3)*a(1,3)
    1115            0 :          b(2,3) = b(2,3) - b(3,3)*a(2,3)
    1116            0 :          b(2,3) = b(2,3)/a(2,2)
    1117            0 :          b(1,3) = b(1,3) - b(2,3)*a(1,2)
    1118            0 :          b(1,3) = b(1,3)/a(1,1)
    1119              : 
    1120            0 :          b(5,4) = b(5,4)/a(5,5)
    1121            0 :          b(1,4) = b(1,4) - b(5,4)*a(1,5)
    1122            0 :          b(2,4) = b(2,4) - b(5,4)*a(2,5)
    1123            0 :          b(3,4) = b(3,4) - b(5,4)*a(3,5)
    1124            0 :          b(4,4) = b(4,4) - b(5,4)*a(4,5)
    1125            0 :          b(4,4) = b(4,4)/a(4,4)
    1126            0 :          b(1,4) = b(1,4) - b(4,4)*a(1,4)
    1127            0 :          b(2,4) = b(2,4) - b(4,4)*a(2,4)
    1128            0 :          b(3,4) = b(3,4) - b(4,4)*a(3,4)
    1129            0 :          b(3,4) = b(3,4)/a(3,3)
    1130            0 :          b(1,4) = b(1,4) - b(3,4)*a(1,3)
    1131            0 :          b(2,4) = b(2,4) - b(3,4)*a(2,3)
    1132            0 :          b(2,4) = b(2,4)/a(2,2)
    1133            0 :          b(1,4) = b(1,4) - b(2,4)*a(1,2)
    1134            0 :          b(1,4) = b(1,4)/a(1,1)
    1135              : 
    1136            0 :          b(5,5) = b(5,5)/a(5,5)
    1137            0 :          b(1,5) = b(1,5) - b(5,5)*a(1,5)
    1138            0 :          b(2,5) = b(2,5) - b(5,5)*a(2,5)
    1139            0 :          b(3,5) = b(3,5) - b(5,5)*a(3,5)
    1140            0 :          b(4,5) = b(4,5) - b(5,5)*a(4,5)
    1141            0 :          b(4,5) = b(4,5)/a(4,4)
    1142            0 :          b(1,5) = b(1,5) - b(4,5)*a(1,4)
    1143            0 :          b(2,5) = b(2,5) - b(4,5)*a(2,4)
    1144            0 :          b(3,5) = b(3,5) - b(4,5)*a(3,4)
    1145            0 :          b(3,5) = b(3,5)/a(3,3)
    1146            0 :          b(1,5) = b(1,5) - b(3,5)*a(1,3)
    1147            0 :          b(2,5) = b(2,5) - b(3,5)*a(2,3)
    1148            0 :          b(2,5) = b(2,5)/a(2,2)
    1149            0 :          b(1,5) = b(1,5) - b(2,5)*a(1,2)
    1150            0 :          b(1,5) = b(1,5)/a(1,1)
    1151              : 
    1152            0 :       end subroutine my_getrs_5_by_5
    1153              : 
    1154              : 
    1155            0 :       subroutine my_getrs_5_by_1( a, lda, ipiv, b, ldb, info )
    1156              :          integer :: info, lda, ldb  ! , n=5, nrhs=1
    1157              :          integer, pointer :: ipiv(:)
    1158              :          real(fltp), pointer :: a(:,:), b(:,:)  ! a( lda, * ), b( ldb, * )
    1159              :          real(fltp), parameter :: zero=0
    1160            0 :          info = 0
    1161            0 :          call my_laswp_5_by_1( b, ldb, ipiv )
    1162              :          !call dtrsm( 'left', 'lower', 'no transpose', 'unit', n, nrhs, one, a, lda, b, ldb )
    1163            0 :          b(2,1) = b(2,1) - b(1,1)*a(2,1)
    1164            0 :          b(3,1) = b(3,1) - b(1,1)*a(3,1)
    1165            0 :          b(4,1) = b(4,1) - b(1,1)*a(4,1)
    1166            0 :          b(5,1) = b(5,1) - b(1,1)*a(5,1)
    1167            0 :          b(3,1) = b(3,1) - b(2,1)*a(3,2)
    1168            0 :          b(4,1) = b(4,1) - b(2,1)*a(4,2)
    1169            0 :          b(5,1) = b(5,1) - b(2,1)*a(5,2)
    1170            0 :          b(4,1) = b(4,1) - b(3,1)*a(4,3)
    1171            0 :          b(5,1) = b(5,1) - b(3,1)*a(5,3)
    1172            0 :          b(5,1) = b(5,1) - b(4,1)*a(5,4)
    1173              : 
    1174              :          !call dtrsm( 'left', 'upper', 'no transpose', 'non-unit', n, nrhs, one, a, lda, b, ldb )
    1175            0 :          b(5,1) = b(5,1)/a(5,5)
    1176            0 :          b(1,1) = b(1,1) - b(5,1)*a(1,5)
    1177            0 :          b(2,1) = b(2,1) - b(5,1)*a(2,5)
    1178            0 :          b(3,1) = b(3,1) - b(5,1)*a(3,5)
    1179            0 :          b(4,1) = b(4,1) - b(5,1)*a(4,5)
    1180            0 :          b(4,1) = b(4,1)/a(4,4)
    1181            0 :          b(1,1) = b(1,1) - b(4,1)*a(1,4)
    1182            0 :          b(2,1) = b(2,1) - b(4,1)*a(2,4)
    1183            0 :          b(3,1) = b(3,1) - b(4,1)*a(3,4)
    1184            0 :          b(3,1) = b(3,1)/a(3,3)
    1185            0 :          b(1,1) = b(1,1) - b(3,1)*a(1,3)
    1186            0 :          b(2,1) = b(2,1) - b(3,1)*a(2,3)
    1187            0 :          b(2,1) = b(2,1)/a(2,2)
    1188            0 :          b(1,1) = b(1,1) - b(2,1)*a(1,2)
    1189            0 :          b(1,1) = b(1,1)/a(1,1)
    1190              : 
    1191            0 :       end subroutine my_getrs_5_by_1
    1192              : 
    1193              : 
    1194            0 :       subroutine my_getrs_4_by_4( a, lda, ipiv, b, ldb, info )
    1195              :          integer :: info, lda, ldb  ! , n=4, nrhs=4
    1196              :          integer, pointer :: ipiv(:)
    1197              :          real(fltp), pointer :: a(:,:), b(:,:)  ! a( lda, * ), b( ldb, * )
    1198              :          real(fltp), parameter :: zero=0
    1199            0 :          info = 0
    1200              : 
    1201            0 :          call my_laswp_4_by_4( b, ldb, ipiv )
    1202              : 
    1203              :          !call dtrsm( 'left', 'lower', 'no transpose', 'unit', n, nrhs, one, a, lda, b, ldb )
    1204            0 :          b(2,1) = b(2,1) - b(1,1)*a(2,1)
    1205            0 :          b(3,1) = b(3,1) - b(1,1)*a(3,1)
    1206            0 :          b(4,1) = b(4,1) - b(1,1)*a(4,1)
    1207            0 :          b(3,1) = b(3,1) - b(2,1)*a(3,2)
    1208            0 :          b(4,1) = b(4,1) - b(2,1)*a(4,2)
    1209            0 :          b(4,1) = b(4,1) - b(3,1)*a(4,3)
    1210              : 
    1211            0 :          b(2,2) = b(2,2) - b(1,2)*a(2,1)
    1212            0 :          b(3,2) = b(3,2) - b(1,2)*a(3,1)
    1213            0 :          b(4,2) = b(4,2) - b(1,2)*a(4,1)
    1214            0 :          b(3,2) = b(3,2) - b(2,2)*a(3,2)
    1215            0 :          b(4,2) = b(4,2) - b(2,2)*a(4,2)
    1216            0 :          b(4,2) = b(4,2) - b(3,2)*a(4,3)
    1217              : 
    1218            0 :          b(2,3) = b(2,3) - b(1,3)*a(2,1)
    1219            0 :          b(3,3) = b(3,3) - b(1,3)*a(3,1)
    1220            0 :          b(4,3) = b(4,3) - b(1,3)*a(4,1)
    1221            0 :          b(3,3) = b(3,3) - b(2,3)*a(3,2)
    1222            0 :          b(4,3) = b(4,3) - b(2,3)*a(4,2)
    1223            0 :          b(4,3) = b(4,3) - b(3,3)*a(4,3)
    1224              : 
    1225            0 :          b(2,4) = b(2,4) - b(1,4)*a(2,1)
    1226            0 :          b(3,4) = b(3,4) - b(1,4)*a(3,1)
    1227            0 :          b(4,4) = b(4,4) - b(1,4)*a(4,1)
    1228            0 :          b(3,4) = b(3,4) - b(2,4)*a(3,2)
    1229            0 :          b(4,4) = b(4,4) - b(2,4)*a(4,2)
    1230            0 :          b(4,4) = b(4,4) - b(3,4)*a(4,3)
    1231              : 
    1232              :          !call dtrsm( 'left', 'upper', 'no transpose', 'non-unit', n, nrhs, one, a, lda, b, ldb )
    1233            0 :          b(4,1) = b(4,1)/a(4,4)
    1234            0 :          b(1,1) = b(1,1) - b(4,1)*a(1,4)
    1235            0 :          b(2,1) = b(2,1) - b(4,1)*a(2,4)
    1236            0 :          b(3,1) = b(3,1) - b(4,1)*a(3,4)
    1237            0 :          b(3,1) = b(3,1)/a(3,3)
    1238            0 :          b(1,1) = b(1,1) - b(3,1)*a(1,3)
    1239            0 :          b(2,1) = b(2,1) - b(3,1)*a(2,3)
    1240            0 :          b(2,1) = b(2,1)/a(2,2)
    1241            0 :          b(1,1) = b(1,1) - b(2,1)*a(1,2)
    1242            0 :          b(1,1) = b(1,1)/a(1,1)
    1243              : 
    1244            0 :          b(4,2) = b(4,2)/a(4,4)
    1245            0 :          b(1,2) = b(1,2) - b(4,2)*a(1,4)
    1246            0 :          b(2,2) = b(2,2) - b(4,2)*a(2,4)
    1247            0 :          b(3,2) = b(3,2) - b(4,2)*a(3,4)
    1248            0 :          b(3,2) = b(3,2)/a(3,3)
    1249            0 :          b(1,2) = b(1,2) - b(3,2)*a(1,3)
    1250            0 :          b(2,2) = b(2,2) - b(3,2)*a(2,3)
    1251            0 :          b(2,2) = b(2,2)/a(2,2)
    1252            0 :          b(1,2) = b(1,2) - b(2,2)*a(1,2)
    1253            0 :          b(1,2) = b(1,2)/a(1,1)
    1254              : 
    1255            0 :          b(4,3) = b(4,3)/a(4,4)
    1256            0 :          b(1,3) = b(1,3) - b(4,3)*a(1,4)
    1257            0 :          b(2,3) = b(2,3) - b(4,3)*a(2,4)
    1258            0 :          b(3,3) = b(3,3) - b(4,3)*a(3,4)
    1259            0 :          b(3,3) = b(3,3)/a(3,3)
    1260            0 :          b(1,3) = b(1,3) - b(3,3)*a(1,3)
    1261            0 :          b(2,3) = b(2,3) - b(3,3)*a(2,3)
    1262            0 :          b(2,3) = b(2,3)/a(2,2)
    1263            0 :          b(1,3) = b(1,3) - b(2,3)*a(1,2)
    1264            0 :          b(1,3) = b(1,3)/a(1,1)
    1265              : 
    1266            0 :          b(4,4) = b(4,4)/a(4,4)
    1267            0 :          b(1,4) = b(1,4) - b(4,4)*a(1,4)
    1268            0 :          b(2,4) = b(2,4) - b(4,4)*a(2,4)
    1269            0 :          b(3,4) = b(3,4) - b(4,4)*a(3,4)
    1270            0 :          b(3,4) = b(3,4)/a(3,3)
    1271            0 :          b(1,4) = b(1,4) - b(3,4)*a(1,3)
    1272            0 :          b(2,4) = b(2,4) - b(3,4)*a(2,3)
    1273            0 :          b(2,4) = b(2,4)/a(2,2)
    1274            0 :          b(1,4) = b(1,4) - b(2,4)*a(1,2)
    1275            0 :          b(1,4) = b(1,4)/a(1,1)
    1276              : 
    1277            0 :       end subroutine my_getrs_4_by_4
    1278              : 
    1279              : 
    1280            0 :       subroutine my_getrs_4_by_1( a, lda, ipiv, b, ldb, info )
    1281              :          integer :: info, lda, ldb  ! , n=4, nrhs=1
    1282              :          integer, pointer :: ipiv(:)
    1283              :          real(fltp), pointer :: a(:,:), b(:,:)  ! a( lda, * ), b( ldb, * )
    1284              :          real(fltp), parameter :: zero=0
    1285              : 
    1286            0 :          info = 0
    1287            0 :          call my_laswp_4_by_1( b, ldb, ipiv )
    1288              : 
    1289              :          !call dtrsm( 'left', 'lower', 'no transpose', 'unit', n, nrhs, one, a, lda, b, ldb )
    1290            0 :          b(2,1) = b(2,1) - b(1,1)*a(2,1)
    1291            0 :          b(3,1) = b(3,1) - b(1,1)*a(3,1)
    1292            0 :          b(4,1) = b(4,1) - b(1,1)*a(4,1)
    1293            0 :          b(3,1) = b(3,1) - b(2,1)*a(3,2)
    1294            0 :          b(4,1) = b(4,1) - b(2,1)*a(4,2)
    1295            0 :          b(4,1) = b(4,1) - b(3,1)*a(4,3)
    1296              : 
    1297              :          !call dtrsm( 'left', 'upper', 'no transpose', 'non-unit', n, nrhs, one, a, lda, b, ldb )
    1298            0 :          b(4,1) = b(4,1)/a(4,4)
    1299            0 :          b(1,1) = b(1,1) - b(4,1)*a(1,4)
    1300            0 :          b(2,1) = b(2,1) - b(4,1)*a(2,4)
    1301            0 :          b(3,1) = b(3,1) - b(4,1)*a(3,4)
    1302            0 :          b(3,1) = b(3,1)/a(3,3)
    1303            0 :          b(1,1) = b(1,1) - b(3,1)*a(1,3)
    1304            0 :          b(2,1) = b(2,1) - b(3,1)*a(2,3)
    1305            0 :          b(2,1) = b(2,1)/a(2,2)
    1306            0 :          b(1,1) = b(1,1) - b(2,1)*a(1,2)
    1307            0 :          b(1,1) = b(1,1)/a(1,1)
    1308              : 
    1309            0 :       end subroutine my_getrs_4_by_1
    1310              : 
    1311              : 
    1312            0 :       subroutine my_getrs_dbg( n, nrhs, a, lda, ipiv, b, ldb, info )
    1313              :          integer :: info, lda, ldb, n, nrhs
    1314              :          integer, pointer :: ipiv(:)
    1315              :          real(fltp), pointer :: a(:,:), b(:,:)  ! a( lda, * ), b( ldb, * )
    1316              :          real(fltp), parameter :: one=1, zero=0
    1317              :          integer :: i, j, k
    1318            0 :          info = 0
    1319            0 :          call my_laswp_dbg(nrhs, b, ldb, 1, n, ipiv, 1 )
    1320              :          !call dtrsm( 'left', 'lower', 'no transpose', 'unit', n, nrhs, one, a, lda, b, ldb )
    1321            0 :          do j = 1,nrhs
    1322            0 :             do k = 1,n
    1323            0 :                if (b(k,j)/=zero) then
    1324            0 :                   do i = k + 1,n
    1325            0 :                      b(i,j) = b(i,j) - b(k,j)*a(i,k)
    1326              :                   end do
    1327              :                end if
    1328              :             end do
    1329              :          end do
    1330              :          !call dtrsm( 'left', 'upper', 'no transpose', 'non-unit', n, nrhs, one, a, lda, b, ldb )
    1331            0 :          do j = 1,nrhs
    1332            0 :             do k = n,1,-1
    1333            0 :                if (b(k,j)/=zero) then
    1334            0 :                   b(k,j) = b(k,j)/a(k,k)
    1335            0 :                   do i = 1,k - 1
    1336            0 :                      b(i,j) = b(i,j) - b(k,j)*a(i,k)
    1337              :                   end do
    1338              :                end if
    1339              :             end do
    1340              :          end do
    1341            0 :       end subroutine my_getrs_dbg
    1342              : 
    1343              : 
    1344            0 :       subroutine my_laswp_dbg( n,   a, lda,  k1, k2, ipiv,  incx )
    1345              :          integer :: incx, k1, k2, lda, n
    1346              :          integer :: ipiv(:)
    1347              :          real(fltp) :: a(:,:)  ! a( lda, * )
    1348              :          integer :: i, i1, i2, inc, ip, ix, ix0, j, k, n32
    1349            0 :          real(fltp) :: temp
    1350              :          include 'formats'
    1351            0 :          write(*,2) 'n', n
    1352            0 :          write(*,2) 'incx', incx
    1353            0 :          write(*,2) 'k1', k1
    1354            0 :          write(*,2) 'k2', k2
    1355            0 :          do j = 1, n
    1356            0 :             write(*,3) 'ipiv(j)', j, ipiv(j)
    1357              :          end do
    1358              :          ! interchange row i with row ipiv(i) for each of rows k1 through k2.
    1359            0 :          if( incx>0 ) then
    1360            0 :             ix0 = k1
    1361            0 :             i1 = k1
    1362            0 :             i2 = k2
    1363            0 :             inc = 1
    1364            0 :          else if( incx<0 ) then
    1365            0 :             ix0 = 1 + ( 1-k2 )*incx
    1366            0 :             i1 = k2
    1367            0 :             i2 = k1
    1368            0 :             inc = -1
    1369              :          else
    1370            0 :             return
    1371              :          end if
    1372            0 :          n32 = ( n / 32 )*32
    1373            0 :          if( n32/=0 ) then
    1374            0 :             do j = 1, n32, 32
    1375            0 :                ix = ix0
    1376            0 :                do i = i1, i2, inc
    1377            0 :                   ip = ipiv( ix )
    1378            0 :                   if( ip/=i ) then
    1379            0 :                      do k = j, j + 31
    1380            0 :                         temp = a( i, k )
    1381            0 :                         a( i, k ) = a( ip, k )
    1382            0 :                         a( ip, k ) = temp
    1383              :                      end do
    1384              :                   end if
    1385            0 :                   ix = ix + incx
    1386              :                end do
    1387              :             end do
    1388              :          end if
    1389            0 :          if( n32/=n ) then
    1390            0 :             n32 = n32 + 1
    1391            0 :             ix = ix0
    1392            0 :             do i = i1, i2, inc
    1393            0 :                ip = ipiv( ix )
    1394              : 
    1395              : 
    1396            0 :                if (ip == 0) then
    1397              : 
    1398            0 :                   stop 'my_lapack95  ip == 0'
    1399              : 
    1400              :                end if
    1401              : 
    1402            0 :                if( ip/=i ) then
    1403            0 :                   do k = n32, n
    1404            0 :                      temp = a( i, k )
    1405            0 :                      a( i, k ) = a( ip, k )
    1406            0 :                      a( ip, k ) = temp
    1407              :                   end do
    1408              :                end if
    1409            0 :                ix = ix + incx
    1410              :             end do
    1411              :          end if
    1412              :       end subroutine my_laswp_dbg
    1413              : 
    1414              :       end module my_lapack95
        

Generated by: LCOV version 2.0-1