36
37
38
39
40
41
42
43
44
48 use element_mod , only :nixs
49
50
51
52#include "implicit_f.inc"
53
54
55
56#include "vect01_c.inc"
57#include "com04_c.inc"
58
59
60
61 INTEGER, INTENT(IN) :: IXS(NIXS,NUMELS)
62 my_real,
INTENT(IN) :: x(3,numnod)
63 INTEGER, INTENT(IN) :: ITRIMAT
64 TYPE(t_ale_connectivity), INTENT(IN) :: ALE_CONNECT
65
66
67
68 INTEGER :: I, II, KK, IAD2, LGTH
69 my_real :: xk, yk, zk, xl, yl, zl, xf, yf, zf
71 my_real :: mat(3, 3), rhs(3), sol(3)
72 INTEGER :: VOIS_ID
73 INTEGER :: FACE_TO_NODE_LOCAL_ID(6, 4)
74 my_real ::
norm(3), a(3), b(3), c(3), surf, surf1, surf2
75 TYPE(t_segvar) :: SEGVAR
76
77
78
79
80
81 face_to_node_local_id(1, 1) = 1 ; face_to_node_local_id(1, 2) = 4
82 face_to_node_local_id(1, 3) = 3 ; face_to_node_local_id(1, 4) = 2
83
84 face_to_node_local_id(2, 1) = 3 ; face_to_node_local_id(2, 2) = 4
85 face_to_node_local_id(2, 3) = 8 ; face_to_node_local_id(2, 4) = 7
86
87 face_to_node_local_id(3, 1) = 5 ; face_to_node_local_id(3, 2) = 6
88 face_to_node_local_id(3, 3) = 7 ; face_to_node_local_id(3, 4) = 8
89
90 face_to_node_local_id(4, 1) = 1 ; face_to_node_local_id(4, 2) = 2
91 face_to_node_local_id(4, 3) = 6 ; face_to_node_local_id(4, 4) = 5
92
93 face_to_node_local_id(5, 1) = 2 ; face_to_node_local_id(5, 2) = 3
94 face_to_node_local_id(5, 3) = 7 ; face_to_node_local_id(5, 4) = 6
95
96 face_to_node_local_id(6, 1) = 1 ; face_to_node_local_id(6, 2) = 5
97 face_to_node_local_id(6, 3) = 8 ; face_to_node_local_id(6, 4) = 4
98
99 DO i = lft, llt
100 ii = i + nft
101
102 mat(1:3, 1:3) = zero ; rhs(1:3) = zero
103
108
109 iad2 = ale_connect%ee_connect%iad_connect(ii)
110 lgth = ale_connect%ee_connect%iad_connect(ii+1)-iad2
111 DO kk = 1, lgth
112 vois_id = ale_connect%ee_connect%connected(iad2 + kk - 1)
113
114 IF (vois_id > 0) THEN
115
120 ELSE
121 IF(vois_id == 0) THEN
122 vall = valk
123 ELSE
124
125 vall = segvar%PHASE_ALPHA(itrimat,-vois_id)
126 ENDIF
127 xf = zero
128 yf = zero
129 zf = zero
130
131 a(1:3) = x(1:3, ixs(face_to_node_local_id(kk, 1) + 1, ii))
132 b(1:3) = x(1:3, ixs(face_to_node_local_id(kk, 2) + 1, ii))
133 c(1:3) = x(1:3, ixs(face_to_node_local_id(kk, 3) + 1, ii))
134
135 norm(1) = (b(2) - a(2)) * (c(3) - a(3)) - (b(3) - a(3)) * (c(2) - a(2))
136 norm(2) = (b(3) - a(3)) * (c(1) - a(1)) - (b(1) - a(1)) * (c(3) - a(3))
137 norm(3) = (b(1) - a(1)) * (c(2) - a(2)) - (b(2) - a(2)) * (c(1) - a(1))
138
140 xf = surf1 * third * (a(1) + b(1) + c(1))
141 yf = surf1 * third * (a(2) + b(2) + c(2))
142 zf = surf1 * third * (a(3) + b(3) + c(3))
143
144 a(1:3) = x(1:3, ixs(face_to_node_local_id(kk, 1) + 1, ii))
145 b(1:3) = x(1:3, ixs(face_to_node_local_id(kk, 3) + 1, ii))
146 c(1:3) = x(1:3, ixs(face_to_node_local_id(kk, 4) + 1, ii))
147
148 norm(1) = (b(2) - a(2)) * (c(3) - a(3)) - (b(3) - a(3)) * (c(2) - a(2))
149 norm(2) = (b(3) - a(3)) * (c(1) - a(1)) - (b(1) - a(1)) * (c(3) - a(3))
150 norm(3) = (b(1) - a(1)) * (c(2) - a(2)) - (b(2) - a(2)) * (c(1) - a(1))
151
153 xf = xf + surf2 * third * (a(1) + b(1) + c(1))
154 yf = yf + surf2 * third * (a(2) + b(2) + c(2))
155 zf = zf + surf2 * third * (a(3) + b(3) + c(3))
156
157 surf = surf1 + surf2
158 xf = xf / surf
159 yf = yf / surf
160 zf = zf / surf
161
162
163
164
165
166
167
171 ENDIF
172
173
174 rhs(1) = rhs(1) + (valk - vall) * (xl - xk)
175 rhs(2) = rhs(2) + (valk - vall) * (yl - yk)
176 rhs(3) = rhs(3) + (valk - vall) * (zl - zk)
177 mat(1, 1) = mat(1, 1) + (xl - xk) * (xl - xk)
178 mat(1, 2) = mat(1, 2) + (xl - xk) * (yl - yk)
179 mat(1, 3) = mat(1, 3) + (xl - xk) * (zl - zk)
180 mat(2, 1) = mat(2, 1) + (yl - yk) * (xl - xk)
181 mat(2, 2) = mat(2, 2) + (yl - yk) * (yl - yk)
182 mat(2, 3) = mat(2, 3) + (yl - yk) * (zl - zk)
183 mat(3, 1) = mat(3, 1) + (zl - zk) * (xl - xk)
184 mat(3, 2) = mat(3, 2) + (zl - zk) * (yl - yk)
185 mat(3, 3) = mat(3, 3) + (zl - zk) * (zl - zk)
186 ENDDO
187
188 CALL cg(3, mat, rhs, sol, 3, em10)
189
190
194 ENDDO
195
subroutine cg(dim, mat, rhs, sol, max_iter, tol)
norm(diag(diag(diag(inv(mat))) -id.SOL), 2) % destroy mumps instance id.JOB
type(alemuscl_buffer_) alemuscl_buffer