LCOV - code coverage report
Current view: top level - math - matmul.f (source / functions) Hit Total Coverage
Test: combined.info Lines: 14 44 31.8 %
Date: 2019-09-08 04:53:50 Functions: 1 5 20.0 %

          Line data    Source code
       1             :       MODULE m_matmul
       2             : !
       3             : ! makes a matrix-matrix multiplication for 3x3 matrices A and B
       4             : ! whereby      A       B
       5             : !            integer  integer  ... matmul1
       6             : !            real     real     ... matmul2
       7             : !            integer  real     ... matmul3
       8             : ! additionally, integer rotation matrices + nonsymmorphic 
       9             : ! translations can be multiplied in matmul4
      10             : !
      11             :       CONTAINS
      12             : !--------------------------------------------------------
      13           0 :       SUBROUTINE matmul1 (ma,mb,mc)
      14             : 
      15             :       IMPLICIT NONE
      16             :       INTEGER, INTENT (IN) :: ma(3,3)
      17             :       INTEGER, INTENT (IN) :: mb(3,3)
      18             :       INTEGER, INTENT (OUT):: mc(3,3)
      19             : 
      20             :       INTEGER :: i,j,k
      21             : 
      22             :       INTEGER x
      23           0 :       DO i=1,3
      24           0 :          DO k=1,3
      25             :          x = 0
      26           0 :             DO j=1,3
      27           0 :                x = x + ma(i,j)*mb(j,k)
      28             :             ENDDO
      29           0 :          mc(i,k) = x
      30             :          END DO
      31             :       END DO
      32             : 
      33           0 :       END SUBROUTINE matmul1
      34             : !--------------------------------------------------------
      35           0 :       SUBROUTINE matmul2 (a,b,c)
      36             : 
      37             :       IMPLICIT NONE
      38             :       REAL,    INTENT (IN) :: a(3,3)
      39             :       REAL,    INTENT (IN) :: b(3,3)
      40             :       REAL,    INTENT (OUT):: c(3,3)
      41             : 
      42             :       INTEGER :: i,j,k
      43             :       REAL x
      44           0 :       DO i=1,3
      45           0 :          DO k=1,3
      46             :          x=0.e0
      47           0 :             DO j=1,3
      48           0 :                x = x + a(i,j)*b(j,k)
      49             :             ENDDO
      50           0 :          c(i,k) = x
      51             :          END DO
      52             :       END DO
      53             : 
      54           0 :       END SUBROUTINE matmul2
      55             : !--------------------------------------------------------
      56           0 :       SUBROUTINE matmul3 (ma,b,c)
      57             : 
      58             :       IMPLICIT NONE
      59             :       INTEGER, INTENT (IN) :: ma(3,3)
      60             :       REAL,    INTENT (IN) ::  b(3,3)
      61             :       REAL,    INTENT (OUT)::  c(3,3)
      62             : 
      63             :       INTEGER :: i,j,k
      64             :       REAL x
      65           0 :       DO i=1,3
      66           0 :          DO k=1,3
      67             :          x=0.e0
      68           0 :             DO j=1,3
      69           0 :                x = x + ma(i,j)*b(j,k)
      70             :             ENDDO
      71           0 :          c(i,k) = x
      72             :          END DO
      73             :       END DO
      74             : 
      75           0 :       END SUBROUTINE matmul3
      76             : !--------------------------------------------------------
      77           0 :       SUBROUTINE matmul3r (ma,b,c)
      78             : 
      79             :       REAL, INTENT (IN) :: ma(3,3)
      80             :       REAL, INTENT (IN) ::  b(3,3)
      81             :       REAL, INTENT (OUT)::  c(3,3)
      82             : 
      83             :       INTEGER :: i,j,k
      84             :       REAL x
      85           0 :       DO i=1,3
      86           0 :          DO k=1,3
      87             :          x=0.e0
      88           0 :             DO j=1,3
      89           0 :                x = x + ma(i,j)*b(j,k)
      90             :             ENDDO
      91           0 :          c(i,k) = x
      92             :          END DO
      93             :       END DO
      94           0 :       RETURN
      95             :       END SUBROUTINE matmul3r
      96             : !--------------------------------------------------------
      97         176 :       SUBROUTINE matmul4 (ma,ta,mb,tb,mc,tc)
      98             : 
      99             :       IMPLICIT NONE
     100             :       INTEGER, INTENT (IN) :: ma(3,3),mb(3,3)
     101             :       REAL,    INTENT (IN) :: ta(3),tb(3)
     102             :       INTEGER, INTENT (OUT):: mc(3,3)
     103             :       REAL,    INTENT (OUT):: tc(3)
     104             : 
     105             :       INTEGER :: i,j,k
     106             :       REAL x,xa(4,4),xb(4,4),xc(4,4)
     107             : 
     108         176 :       xa(:,:) = 0.0 ; xa(4,4) = 1.0 ; xb(:,:) = xa(:,:)
     109         704 :       xa(1:3,1:3) = real(ma(1:3,1:3)) ; xa(1:3,4) = ta(:) 
     110         704 :       xb(1:3,1:3) = real(mb(1:3,1:3)) ; xb(1:3,4) = tb(:)
     111        1584 :       DO i=1,4
     112        6512 :          DO k=1,4
     113             :          x=0.e0
     114       25344 :             DO j=1,4
     115       14080 :                x = x + xa(i,j)*xb(j,k)
     116             :             ENDDO
     117        3520 :          xc(i,k) = x
     118             :          END DO
     119             :       END DO
     120         704 :       mc(1:3,1:3) = nint(xc(1:3,1:3)) ; tc(:) = xc(1:3,4) 
     121        1232 :       DO i = 1,3
     122         704 :         IF (tc(i).GT.1.0) THEN
     123           0 :           tc(i) = tc(i) - int(tc(i))
     124         528 :         ELSEIF (tc(i).LT.0.0) THEN
     125           0 :           tc(i) = tc(i) + int(tc(i)) + 1
     126             :         ENDIF
     127             :       ENDDO
     128             : 
     129         176 :       END SUBROUTINE matmul4
     130             : 
     131             :       END MODULE m_matmul

Generated by: LCOV version 1.13