MFIX  2016-1
qmomk_tools_mod.f
Go to the documentation of this file.
1 !vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvC
2 ! C
3 ! Module name: QMOMK_TOOLS C
4 ! Purpose: Helper functions for QMOMK implementation C
5 ! C
6 ! Author: Alberto Passalacqua Date: C
7 ! Reviewer: Date: C
8 ! C
9 !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^C
10 
11 #include "version.inc"
12 
14 
15  IMPLICIT NONE
16 
17  PRIVATE
18 
19  PUBLIC :: det3
20  PUBLIC :: inv3
21  PUBLIC :: diag3
22  PUBLIC :: cholesky3
23  PUBLIC :: transpose3
24  PUBLIC :: multiplymatrix3
25 
26 CONTAINS
27 
28  SUBROUTINE det3 (A, det)
29 
30  IMPLICIT NONE
31 
32  DOUBLE PRECISION, INTENT(IN), DIMENSION(3,3) :: A
33  DOUBLE PRECISION, INTENT(OUT) :: det
34 
35  det = a(1,1)*a(2,2)*a(3,3) + a(1,2)*a(2,3)*a(3,1) + a(1,3)*a(2,1)*a(2,3) &
36  - a(3,1)*a(2,2)*a(1,3) - a(3,2)*a(2,3)*a(1,1) - a(3,3)*a(2,1)*a(1,2)
37 
38  END SUBROUTINE det3
39 
40  SUBROUTINE inv3 (A, B)
41 
42  IMPLICIT none
43 
44  DOUBLE PRECISION, INTENT(IN), DIMENSION(3,3) :: A
45  DOUBLE PRECISION, iNTENT(OUT), DIMENSION(3,3) :: B
46 
47  DOUBLE PRECISION :: detA;
48 
49  CALL det3(a, deta)
50 
51  IF (deta == 0.d0) THEN
52  print *,'QMOMK: Null determinant in matrix'
53  error_stop
54  END IF
55 
56  b(1,1) = (a(3,3)*a(2,2) - a(3,2)*a(2,3))/deta
57  b(1,2) = -(a(3,3)*a(1,2) - a(3,2)*a(1,3))/deta
58  b(1,3) = (a(2,3)*a(1,2) - a(2,2)*a(1,3))/deta
59 
60  b(2,1) = -(a(3,3)*a(2,1) - a(3,1)*a(2,3))/deta
61  b(2,2) = (a(3,3)*a(1,1) - a(3,1)*a(1,3))/deta
62  b(2,3) = -(a(2,3)*a(1,1) - a(2,1)*a(1,3))/deta
63 
64  b(3,1) = (a(3,2)*a(2,1) - a(3,1)*a(2,2))/deta
65  b(3,2) = -(a(3,2)*a(1,1) - a(3,1)*a(1,2))/deta
66  b(3,3) = (a(2,2)*a(1,1) - a(2,1)*a(1,2))/deta
67  END SUBROUTINE inv3
68 
69  SUBROUTINE diag3 (a, b, c, mat)
70 
71  IMPLICIT NONE
72 
73  INTEGER :: i, j
74  DOUBLE PRECISION, INTENT(IN) :: a, b, c
75  DOUBLE PRECISION, INTENT(OUT), DIMENSION(3,3) :: mat
76 
77  DO i = 1, 3
78  DO j = 1, 3
79  mat(i,j) = 0.d0
80  END DO
81  END DO
82 
83  mat(1,1) = a
84  mat(2,2) = b
85  mat(3,3) = c
86  END SUBROUTINE diag3
87 
88  SUBROUTINE cholesky3 (A, L)
89 
90  IMPLICIT NONE
91 
92  DOUBLE PRECISION, INTENT(IN), DIMENSION(3,3) :: A
93  DOUBLE PRECISION, INTENT(OUT), DIMENSION(3,3) :: L
94 
95  INTEGER :: i, j
96 
97  DO i = 1, 3
98  DO j = 1, 3
99  l(i,j) = 0.d0
100  END DO
101  END DO
102 
103  l(1,1) = sqrt(a(1,1))
104  IF (l(1,1) == 0.d0) THEN
105  print *,'Impossible to find Cholesky decomposition.'
106  error_stop
107  ELSE
108  l(2,1) = a(2,1)/l(1,1)
109  l(2,2) = sqrt(a(2,2) - (l(2,1))**2)
110  l(3,1) = a(3,1)/l(1,1)
111 
112  IF (l(2,2) == 0.d0) THEN
113  print *,'Impossible to find Cholesky decomposition.'
114  error_stop
115  ELSE
116  l(3,2) = (a(3,2) - l(3,1)*l(2,1))/l(2,2)
117  l(3,3) = sqrt(a(3,3) - (l(3,1))**2 - (l(3,2))**2)
118  END IF
119  END IF
120  END SUBROUTINE cholesky3
121 
122  SUBROUTINE transpose3 (A, T)
124  IMPLICIT NONE
125 
126  DOUBLE PRECISION, INTENT(IN), DIMENSION(3,3) :: A
127  DOUBLE PRECISION, INTENT(OUT), DIMENSION(3,3) :: T
128 
129  INTEGER :: i, j
130 
131  DO i = 1, 3
132  DO j = 1, 3
133  t(i,j) = a(j,i)
134  END DO
135  END DO
136 
137  END SUBROUTINE transpose3
138 
139  SUBROUTINE multiplymatrix3 (A, B, P)
141  IMPLICIT NONE
142 
143  DOUBLE PRECISION, INTENT(IN), DIMENSION(3,3) :: A
144  DOUBLE PRECISION, INTENT(IN), DIMENSION(3,3) :: B
145  DOUBLE PRECISION, INTENT(OUT), DIMENSION(3,3) :: P
146 
147  INTEGER :: i, j, k
148  DOUBLE PRECISION ::sum
149 
150  sum = 0.d0
151 
152  DO i = 1, 3
153  DO j = 1, 3
154  DO k = 1, 3
155  sum = sum + a(i,k)*b(k,j)
156  END DO
157  p(i,j) = sum
158  sum = 0.d0
159  END DO
160  END DO
161  END SUBROUTINE multiplymatrix3
162 
163 END MODULE qmomk_tools
subroutine, public diag3(a, b, c, mat)
subroutine, public inv3(A, B)
subroutine, public cholesky3(A, L)
subroutine, public transpose3(A, T)
subroutine, public det3(A, det)
subroutine, public multiplymatrix3(A, B, P)