diff options
Diffstat (limited to 'src/matinv.F90')
-rw-r--r-- | src/matinv.F90 | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/matinv.F90 b/src/matinv.F90 index 4b6d8ec..e6fc6a3 100644 --- a/src/matinv.F90 +++ b/src/matinv.F90 @@ -8,11 +8,53 @@ module matinv implicit none private + public calc_posinv3 + public calc_syminv3 public calc_inv3 + + public calc_syminv4 public calc_inv4 contains + subroutine calc_posinv3 (g3, gu3) + CCTK_REAL, intent(in) :: g3(3,3) + CCTK_REAL, intent(out) :: gu3(3,3) + CCTK_REAL :: tmp(3,3) + integer :: info + character :: msg*1000 + + tmp = g3 + gu3 = delta3 + call posv ('u', 3, 3, tmp, 3, gu3, 3, info) + + if (info /= 0) then + write (msg, '("Error in call to POSV, info=",i4)') info + call CCTK_WARN (0, trim(msg)) + end if + end subroutine calc_posinv3 + + subroutine calc_syminv3 (g3, gu3) + CCTK_REAL, intent(in) :: g3(3,3) + CCTK_REAL, intent(out) :: gu3(3,3) + CCTK_REAL :: tmp(3,3) + integer :: ipiv(3) + integer :: info + character :: msg*1000 + + integer, parameter :: lwork = 1000 + CCTK_REAL :: work(lwork) + + tmp = g3 + gu3 = delta3 + call sysv ('u', 3, 3, tmp, 3, ipiv, gu3, 3, work, lwork, info) + + if (info /= 0) then + write (msg, '("Error in call to SYSV, info=",i4)') info + call CCTK_WARN (0, trim(msg)) + end if + end subroutine calc_syminv3 + subroutine calc_inv3 (g3, gu3) CCTK_REAL, intent(in) :: g3(3,3) CCTK_REAL, intent(out) :: gu3(3,3) @@ -31,6 +73,29 @@ contains end if end subroutine calc_inv3 + + + subroutine calc_syminv4 (g4, gu4) + CCTK_REAL, intent(in) :: g4(0:3,0:3) + CCTK_REAL, intent(out) :: gu4(0:3,0:3) + CCTK_REAL :: tmp(0:3,0:3) + integer :: ipiv(0:3) + integer :: info + character :: msg*1000 + + integer, parameter :: lwork = 1000 + CCTK_REAL :: work(lwork) + + tmp = g4 + gu4 = delta4 + call sysv ('u', 4, 4, tmp, 4, ipiv, gu4, 4, work, lwork, info) + + if (info /= 0) then + write (msg, '("Error in call to SYSV, info=",i4)') info + call CCTK_WARN (0, trim(msg)) + end if + end subroutine calc_syminv4 + subroutine calc_inv4 (g4, gu4) CCTK_REAL, intent(in) :: g4(0:3,0:3) CCTK_REAL, intent(out) :: gu4(0:3,0:3) |