5 SUBROUTINE rhs_3x3(mesh, vv_3_LA, mode, rhs_in, vb_145, vb_236, opt_tensor, opt_tensor_scaln_bdy)
8 #include "petsc/finclude/petsc.h" 13 INTEGER,
INTENT(IN) :: mode
14 REAL(KIND=8),
DIMENSION(mesh%dom_me*mesh%gauss%l_G,6),
INTENT(IN) :: rhs_in
15 REAL(KIND=8),
DIMENSION(3,mesh%dom_me*mesh%gauss%l_G,6),
INTENT(IN),
OPTIONAL :: opt_tensor
16 REAL(KIND=8),
DIMENSION(:,:),
INTENT(IN),
OPTIONAL :: opt_tensor_scaln_bdy
17 REAL(KIND=8),
DIMENSION(3*mesh%gauss%n_w) :: v145_loc, v236_loc
18 INTEGER,
DIMENSION(3*mesh%gauss%n_w) :: idxm
19 INTEGER,
DIMENSION(3*mesh%gauss%n_ws) :: idxms
20 INTEGER,
DIMENSION(mesh%gauss%n_w) :: j_loc
21 INTEGER,
DIMENSION(mesh%gauss%n_ws) :: js_loc
22 REAL(KIND=8),
DIMENSION(mesh%gauss%k_d,mesh%gauss%n_w) :: dw_loc
23 REAL(KIND=8),
DIMENSION(3,6) :: tensor_loc
24 REAL(KIND=8),
DIMENSION(6) :: smb, f_tensor
25 INTEGER :: m, l, i, ni, index, nw, ix, ki, iglob,
type, k, ms, ls, indexs, nws
28 petscerrorcode :: ierr
30 CALL vecset(vb_145, 0.d0, ierr)
31 CALL vecset(vb_236, 0.d0, ierr)
41 iglob = vv_3_la%loc_to_glob(ki,i)
49 DO l = 1, mesh%gauss%l_G
51 dw_loc = mesh%gauss%dw(:,:,l,m)
54 ray = sum(mesh%rr(1,j_loc)*mesh%gauss%ww(:,l))
56 IF (
PRESENT(opt_tensor))
THEN 59 tensor_loc(k,type) = opt_tensor(k,index,type)
63 f_tensor(1) = (-mode*tensor_loc(1,4) + tensor_loc(2,3))/ray
64 f_tensor(2) = (mode*tensor_loc(1,3) + tensor_loc(2,4))/ray
65 f_tensor(3) = (-tensor_loc(1,3) - mode*tensor_loc(2,4))/ray
66 f_tensor(4) = (-tensor_loc(1,4) + mode*tensor_loc(2,3))/ray
67 f_tensor(5) = -tensor_loc(3,4)*mode/ray
68 f_tensor(6) = tensor_loc(3,3)*mode/ray
73 smb = (rhs_in(index,:)+f_tensor)*ray*mesh%gauss%rj(l,m)
78 v145_loc(ix) = v145_loc(ix) + mesh%gauss%ww(ni,l)*smb(1)
79 v236_loc(ix) = v236_loc(ix) + mesh%gauss%ww(ni,l)*smb(2)
85 v145_loc(ix) = v145_loc(ix) + mesh%gauss%ww(ni,l)*smb(4)
86 v236_loc(ix) = v236_loc(ix) + mesh%gauss%ww(ni,l)*smb(3)
92 v145_loc(ix) = v145_loc(ix) + mesh%gauss%ww(ni,l)*smb(5)
93 v236_loc(ix) = v236_loc(ix) + mesh%gauss%ww(ni,l)*smb(6)
96 IF (
PRESENT(opt_tensor))
THEN 100 v145_loc(ix) = v145_loc(ix) &
101 + (dw_loc(1,ni)*tensor_loc(1,1) + dw_loc(2,ni)*tensor_loc(1,5))*ray*mesh%gauss%rj(l,m)
102 v236_loc(ix) = v236_loc(ix) &
103 + (dw_loc(1,ni)*tensor_loc(1,2) + dw_loc(2,ni)*tensor_loc(1,6))*ray*mesh%gauss%rj(l,m)
108 v145_loc(ix) = v145_loc(ix) &
109 + (dw_loc(1,ni)*tensor_loc(2,2) + dw_loc(2,ni)*tensor_loc(2,6))*ray*mesh%gauss%rj(l,m)
110 v236_loc(ix) = v236_loc(ix) &
111 + (dw_loc(1,ni)*tensor_loc(2,1) + dw_loc(2,ni)*tensor_loc(2,5))*ray*mesh%gauss%rj(l,m)
116 v145_loc(ix) = v145_loc(ix) &
117 + (dw_loc(1,ni)*tensor_loc(3,1) + dw_loc(2,ni)*tensor_loc(3,5))*ray*mesh%gauss%rj(l,m)
118 v236_loc(ix) = v236_loc(ix) &
119 + (dw_loc(1,ni)*tensor_loc(3,2) + dw_loc(2,ni)*tensor_loc(3,6))*ray*mesh%gauss%rj(l,m)
124 CALL vecsetvalues(vb_145, 3*nw, idxm, v145_loc, add_values, ierr)
125 CALL vecsetvalues(vb_236, 3*nw, idxm, v236_loc, add_values, ierr)
129 IF (
PRESENT(opt_tensor_scaln_bdy))
THEN 130 nws = mesh%gauss%n_ws
132 DO ms = 1, mesh%dom_mes
133 js_loc = mesh%jjs(:,ms)
138 iglob = vv_3_la%loc_to_glob(ki,i)
146 DO ls = 1, mesh%gauss%l_Gs
150 ray = sum(mesh%rr(1,js_loc)*mesh%gauss%wws(:,ls))
153 IF (ray.LT.1.d-10) cycle
155 smb(:) = opt_tensor_scaln_bdy(indexs,:)*ray*mesh%gauss%rjs(ls,ms)
160 v145_loc(ix) = v145_loc(ix) + mesh%gauss%wws(ni,ls)*smb(1)
161 v236_loc(ix) = v236_loc(ix) + mesh%gauss%wws(ni,ls)*smb(2)
167 v145_loc(ix) = v145_loc(ix) + mesh%gauss%wws(ni,ls)*smb(4)
168 v236_loc(ix) = v236_loc(ix) + mesh%gauss%wws(ni,ls)*smb(3)
174 v145_loc(ix) = v145_loc(ix) + mesh%gauss%wws(ni,ls)*smb(5)
175 v236_loc(ix) = v236_loc(ix) + mesh%gauss%wws(ni,ls)*smb(6)
180 CALL vecsetvalues(vb_145, 3*nws, idxms, v145_loc, add_values, ierr)
181 CALL vecsetvalues(vb_236, 3*nws, idxms, v236_loc, add_values, ierr)
185 CALL vecassemblybegin(vb_145,ierr)
186 CALL vecassemblyend(vb_145,ierr)
187 CALL vecassemblybegin(vb_236,ierr)
188 CALL vecassemblyend(vb_236,ierr)
192 SUBROUTINE rhs_3x3_art_comp(mesh, vv_3_LA, mode, rhs_in, vb_145, vb_236, opt_tensor, opt_grad_div)
195 #include "petsc/finclude/petsc.h" 200 INTEGER,
INTENT(IN) :: mode
201 REAL(KIND=8),
DIMENSION(mesh%dom_me*mesh%gauss%l_G,6),
INTENT(IN) :: rhs_in
202 REAL(KIND=8),
DIMENSION(3,mesh%dom_me*mesh%gauss%l_G,6),
INTENT(IN),
OPTIONAL :: opt_tensor
203 REAL(KIND=8),
DIMENSION(mesh%dom_me*mesh%gauss%l_G,2),
INTENT(IN),
OPTIONAL :: opt_grad_div
204 REAL(KIND=8),
DIMENSION(3*mesh%gauss%n_w) :: v145_loc, v236_loc
205 INTEGER,
DIMENSION(3*mesh%gauss%n_w) :: idxm
206 INTEGER,
DIMENSION(mesh%gauss%n_w) :: j_loc
207 REAL(KIND=8),
DIMENSION(mesh%gauss%k_d,mesh%gauss%n_w) :: dw_loc
208 REAL(KIND=8),
DIMENSION(3,6) :: tensor_loc
209 REAL(KIND=8),
DIMENSION(2) :: div_loc
210 REAL(KIND=8),
DIMENSION(6) :: smb, f_tensor, f_div
211 INTEGER :: m, l, i, ni, index, nw, ix, ki, iglob,
type, k
213 vec :: vb_145, vb_236
214 petscerrorcode :: ierr
216 CALL vecset(vb_145, 0.d0, ierr)
217 CALL vecset(vb_236, 0.d0, ierr)
221 DO m = 1, mesh%dom_me
227 iglob = vv_3_la%loc_to_glob(ki,i)
235 DO l = 1, mesh%gauss%l_G
237 dw_loc = mesh%gauss%dw(:,:,l,m)
240 ray = sum(mesh%rr(1,j_loc)*mesh%gauss%ww(:,l))
242 IF (
PRESENT(opt_tensor))
THEN 245 tensor_loc(k,type) = opt_tensor(k,index,type)
249 f_tensor(1) = (-mode*tensor_loc(1,4) + tensor_loc(2,3))/ray
250 f_tensor(2) = (mode*tensor_loc(1,3) + tensor_loc(2,4))/ray
251 f_tensor(3) = (-tensor_loc(1,3) - mode*tensor_loc(2,4))/ray
252 f_tensor(4) = (-tensor_loc(1,4) + mode*tensor_loc(2,3))/ray
253 f_tensor(5) = -tensor_loc(3,4)*mode/ray
254 f_tensor(6) = tensor_loc(3,3)*mode/ray
259 IF (
PRESENT(opt_grad_div))
THEN 261 div_loc(type) = opt_grad_div(index,type)
264 f_div(1) = div_loc(1)/ray
265 f_div(2) = div_loc(2)/ray
266 f_div(3) = -mode*div_loc(2)/ray
267 f_div(4) = mode*div_loc(1)/ray
274 smb = (rhs_in(index,:)+f_tensor+f_div)*ray*mesh%gauss%rj(l,m)
279 v145_loc(ix) = v145_loc(ix) + mesh%gauss%ww(ni,l)*smb(1)
280 v236_loc(ix) = v236_loc(ix) + mesh%gauss%ww(ni,l)*smb(2)
286 v145_loc(ix) = v145_loc(ix) + mesh%gauss%ww(ni,l)*smb(4)
287 v236_loc(ix) = v236_loc(ix) + mesh%gauss%ww(ni,l)*smb(3)
293 v145_loc(ix) = v145_loc(ix) + mesh%gauss%ww(ni,l)*smb(5)
294 v236_loc(ix) = v236_loc(ix) + mesh%gauss%ww(ni,l)*smb(6)
297 IF (
PRESENT(opt_tensor))
THEN 301 v145_loc(ix) = v145_loc(ix) &
302 + (dw_loc(1,ni)*tensor_loc(1,1) + dw_loc(2,ni)*tensor_loc(1,5))*ray*mesh%gauss%rj(l,m)
303 v236_loc(ix) = v236_loc(ix) &
304 + (dw_loc(1,ni)*tensor_loc(1,2) + dw_loc(2,ni)*tensor_loc(1,6))*ray*mesh%gauss%rj(l,m)
309 v145_loc(ix) = v145_loc(ix) &
310 + (dw_loc(1,ni)*tensor_loc(2,2) + dw_loc(2,ni)*tensor_loc(2,6))*ray*mesh%gauss%rj(l,m)
311 v236_loc(ix) = v236_loc(ix) &
312 + (dw_loc(1,ni)*tensor_loc(2,1) + dw_loc(2,ni)*tensor_loc(2,5))*ray*mesh%gauss%rj(l,m)
317 v145_loc(ix) = v145_loc(ix) &
318 + (dw_loc(1,ni)*tensor_loc(3,1) + dw_loc(2,ni)*tensor_loc(3,5))*ray*mesh%gauss%rj(l,m)
319 v236_loc(ix) = v236_loc(ix) &
320 + (dw_loc(1,ni)*tensor_loc(3,2) + dw_loc(2,ni)*tensor_loc(3,6))*ray*mesh%gauss%rj(l,m)
324 IF (
PRESENT(opt_grad_div))
THEN 328 v145_loc(ix) = v145_loc(ix) &
329 + (dw_loc(1,ni)*div_loc(1))*ray*mesh%gauss%rj(l,m)
330 v236_loc(ix) = v236_loc(ix) &
331 + (dw_loc(1,ni)*div_loc(2))*ray*mesh%gauss%rj(l,m)
337 v145_loc(ix) = v145_loc(ix) &
338 + (dw_loc(2,ni)*div_loc(1))*ray*mesh%gauss%rj(l,m)
339 v236_loc(ix) = v236_loc(ix) &
340 + (dw_loc(2,ni)*div_loc(2))*ray*mesh%gauss%rj(l,m)
346 CALL vecsetvalues(vb_145, 3*nw, idxm, v145_loc, add_values, ierr)
347 CALL vecsetvalues(vb_236, 3*nw, idxm, v236_loc, add_values, ierr)
352 CALL vecassemblybegin(vb_145,ierr)
353 CALL vecassemblyend(vb_145,ierr)
354 CALL vecassemblybegin(vb_236,ierr)
355 CALL vecassemblyend(vb_236,ierr)
subroutine rhs_3x3_art_comp(mesh, vv_3_LA, mode, rhs_in, vb_145, vb_236, opt_tensor, opt_grad_div)
subroutine rhs_3x3(mesh, vv_3_LA, mode, rhs_in, vb_145, vb_236, opt_tensor, opt_tensor_scaln_bdy)