SFEMaNS  version 5.3
Reference documentation for SFEMaNS
dir_nodes_petsc.f90
Go to the documentation of this file.
1 !
2 !Authors: Jean-Luc Guermond, Franky Luddens, Copyright 2011
3 !
5 
6 CONTAINS
7 !-------------------------------------------------------------------------------
8  SUBROUTINE dir_axis_nodes_parallel(mesh, js_d)
10  IMPLICIT NONE
11  TYPE(mesh_type) :: mesh
12  INTEGER, DIMENSION(:), POINTER :: js_d
13  LOGICAL, DIMENSION(mesh%dom_np) :: virgin
14  INTEGER:: nn, ms, n, p, n_D, nws
15  REAL(kind=8) :: eps=1.d-10
16 
17  nws = SIZE(mesh%jjs,1)
18  nn=0
19  virgin=.true.
20  DO ms = 1, mesh%dom_mes
21  IF (maxval(abs(mesh%rr(1,mesh%jjs(:,ms)))).GT.eps) cycle
22  DO n = 1, nws
23  p = mesh%jjs(n,ms)
24  IF (p>mesh%dom_np) cycle
25  IF (virgin(p)) THEN
26  virgin(p)=.false.
27  nn = nn + 1
28  END IF
29  END DO
30  END DO
31  n_d = nn
32  ALLOCATE(js_d(n_d))
33  IF (n_d==0) RETURN
34 
35  nn=0
36  virgin=.true.
37  DO ms = 1, mesh%dom_mes
38  IF (maxval(abs(mesh%rr(1,mesh%jjs(:,ms)))).GT.eps) cycle
39  DO n = 1, nws
40  p = mesh%jjs(n,ms)
41  IF (p>mesh%dom_np) cycle
42  IF (virgin(p)) THEN
43  virgin(p)=.false.
44  nn = nn + 1
45  js_d(nn) = mesh%jjs(n,ms)
46  END IF
47  END DO
48  END DO
49 
50  END SUBROUTINE dir_axis_nodes_parallel
51 
52  SUBROUTINE dirichlet_nodes_parallel(mesh, list_dirichlet_sides, js_d)
54  IMPLICIT NONE
55  TYPE(mesh_type) :: mesh
56  INTEGER, DIMENSION(:), INTENT(IN) :: list_dirichlet_sides
57  INTEGER, DIMENSION(:), POINTER :: js_d
58  LOGICAL, DIMENSION(:), POINTER :: virgin
59  INTEGER:: nn, ms, n, p, n_D, nws
60 
61  IF (SIZE(list_dirichlet_sides)==0) THEN
62  ALLOCATE(js_d(0))
63  RETURN
64  END IF
65 
66  nws = SIZE(mesh%jjs,1)
67  nn=0
68  ALLOCATE(virgin(mesh%dom_np))
69  virgin=.true.
70  DO ms = 1, mesh%dom_mes
71  IF (minval(abs(mesh%sides(ms)-list_dirichlet_sides))/=0) cycle
72  DO n = 1, nws
73  p = mesh%jjs(n,ms)
74  IF (p>mesh%dom_np) cycle
75  IF (virgin(p)) THEN
76  virgin(p)=.false.
77  nn = nn + 1
78  END IF
79  END DO
80  END DO
81  n_d = nn
82  ALLOCATE(js_d(n_d))
83  nn=0
84  virgin=.true.
85  DO ms = 1, mesh%dom_mes
86  IF (minval(abs(mesh%sides(ms)-list_dirichlet_sides))/=0) cycle
87  DO n = 1, nws
88  p = mesh%jjs(n,ms)
89  IF (p>mesh%dom_np) cycle
90  IF (virgin(p)) THEN
91  virgin(p)=.false.
92  nn = nn + 1
93  js_d(nn) = mesh%jjs(n,ms)
94  END IF
95  END DO
96  END DO
97  DEALLOCATE(virgin)
98  END SUBROUTINE dirichlet_nodes_parallel
99 
100  SUBROUTINE dirichlet_nodes_local(mesh, list_dirichlet_sides, js_d)
102  USE my_util
103  IMPLICIT NONE
104  TYPE(mesh_type) :: mesh
105  INTEGER, DIMENSION(:), INTENT(IN) :: list_dirichlet_sides
106  INTEGER, DIMENSION(:), POINTER :: js_d
107  LOGICAL, DIMENSION(:), POINTER :: virgin
108  INTEGER:: nn, ms, n, p, n_D, nws
109 
110  IF (SIZE(list_dirichlet_sides)==0) THEN
111  ALLOCATE(js_d(0))
112  RETURN
113  END IF
114 
115  nws = SIZE(mesh%jjs,1)
116  nn=0
117  ALLOCATE(virgin(mesh%np))
118  virgin=.true.
119  DO ms = 1, mesh%dom_mes
120  IF (minval(abs(mesh%sides(ms)-list_dirichlet_sides))/=0) cycle
121  DO n = 1, nws
122  p = mesh%jjs(n,ms)
123  IF (p>mesh%np) CALL error_petsc('BUG in dirichlet_nodes_local')
124  IF (virgin(p)) THEN
125  virgin(p)=.false.
126  nn = nn + 1
127  END IF
128  END DO
129  END DO
130  n_d = nn
131  ALLOCATE(js_d(n_d))
132  nn=0
133  virgin=.true.
134  DO ms = 1, mesh%dom_mes
135  IF (minval(abs(mesh%sides(ms)-list_dirichlet_sides))/=0) cycle
136  DO n = 1, nws
137  p = mesh%jjs(n,ms)
138  IF (p>mesh%np) CALL error_petsc('BUG in dirichlet_nodes_local')
139  IF (virgin(p)) THEN
140  virgin(p)=.false.
141  nn = nn + 1
142  js_d(nn) = mesh%jjs(n,ms)
143  END IF
144  END DO
145  END DO
146  DEALLOCATE(virgin)
147  END SUBROUTINE dirichlet_nodes_local
148 
149  SUBROUTINE dirichlet_m_parallel(matrix,glob_js_D)
150 #include "petsc/finclude/petsc.h"
151  use petsc
152  IMPLICIT NONE
153  INTEGER, DIMENSION(:), INTENT(IN) :: glob_js_D
154  INTEGER :: n_D
155  INTEGER, DIMENSION(:), POINTER :: bubu_test
156  mat :: matrix
157  petscerrorcode :: ierr
158  n_d = SIZE(glob_js_d)
159  ALLOCATE(bubu_test(n_d))
160  IF (n_d/=0) THEN
161  bubu_test = glob_js_d-1
162  END IF
163 !!$ CALL MatZeroRows(matrix, n_D, glob_js_D-1, 1.d0, ierr)
164  !CALL MatZeroRows(matrix, n_D, bubu_test, 1.d0, PETSC_NULL_OBJECT, PETSC_NULL_OBJECT, ierr) !petsc.3.7.
165  CALL matzerorows(matrix, n_d, bubu_test, 1.d0, petsc_null_vec, petsc_null_vec, ierr) !petsc.3.8.4
166  CALL matassemblybegin(matrix,mat_final_assembly,ierr)
167  CALL matassemblyend(matrix,mat_final_assembly,ierr)
168 
169  DEALLOCATE(bubu_test)
170  END SUBROUTINE dirichlet_m_parallel
171 
172  SUBROUTINE dirichlet_rhs(js_D,bs_D,b)
174 #include "petsc/finclude/petsc.h"
175  USE petsc
176  IMPLICIT NONE
177  INTEGER, DIMENSION(:) :: js_D
178  REAL(KIND=8), DIMENSION(:) :: bs_D
179  INTEGER :: n_D
180  vec :: b
181  petscerrorcode :: ierr
182  n_d = SIZE(js_d)
183  IF (n_d/=0) THEN
184  CALL vecsetvalues(b, n_d, js_d, bs_d, insert_values, ierr)
185  END IF
186  CALL vecassemblybegin(b,ierr)
187  CALL vecassemblyend(b,ierr)
188 
189  END SUBROUTINE dirichlet_rhs
190 
191  SUBROUTINE vector_glob_js_d(vv_mesh, list_mode, vv_3_LA, vv_list_dirichlet_sides, vv_js_D, vv_mode_global_js_D)
193  IMPLICIT NONE
194  TYPE(mesh_type), INTENT(IN) :: vv_mesh
195  INTEGER, DIMENSION(:), INTENT(IN) :: list_mode
196  TYPE(petsc_csr_la), INTENT(IN) :: vv_3_LA
197  TYPE(dyn_int_line), DIMENSION(3), INTENT(IN) :: vv_list_dirichlet_sides
198  TYPE(dyn_int_line), DIMENSION(:), POINTER :: vv_mode_global_js_D
199  TYPE(dyn_int_line), DIMENSION(3), INTENT(OUT):: vv_js_D
200  INTEGER, DIMENSION(:), POINTER :: vv_js_axis_D
201  INTEGER :: k, m_max_c, i, n1, n2, n3, n123, nalloc, nx
202  m_max_c = SIZE(list_mode)
203 
204  DO k = 1, 3
205  CALL dirichlet_nodes_parallel(vv_mesh, vv_list_dirichlet_sides(k)%DIL, vv_js_d(k)%DIL)
206  END DO
207  CALL dir_axis_nodes_parallel(vv_mesh, vv_js_axis_d)
208 
209  ALLOCATE(vv_mode_global_js_d(m_max_c))
210  DO i = 1, m_max_c
211  n1 = SIZE(vv_js_d(1)%DIL)
212  n2 = SIZE(vv_js_d(2)%DIL)
213  n3 = SIZE(vv_js_d(3)%DIL)
214  nx = SIZE(vv_js_axis_d)
215  n123 = n1+n2+n3
216  IF (list_mode(i)==0) THEN
217  nalloc = n123 + 2*nx
218  ELSE IF (list_mode(i)==1) THEN
219  nalloc = n123 + nx
220  ELSE
221  nalloc = n123 + 3*nx
222  END IF
223  ALLOCATE(vv_mode_global_js_d(i)%DIL(nalloc))
224  vv_mode_global_js_d(i)%DIL(1:n1) = vv_3_la%loc_to_glob(1,vv_js_d(1)%DIL)
225  vv_mode_global_js_d(i)%DIL(n1+1:n1+n2) = vv_3_la%loc_to_glob(2,vv_js_d(2)%DIL)
226  vv_mode_global_js_d(i)%DIL(n1+n2+1:n123) = vv_3_la%loc_to_glob(3,vv_js_d(3)%DIL)
227 
228  IF (list_mode(i)==0 .AND. nx>0) THEN
229  vv_mode_global_js_d(i)%DIL(n123+1:n123+nx) = vv_3_la%loc_to_glob(1,vv_js_axis_d)
230  vv_mode_global_js_d(i)%DIL(n123+nx+1:) = vv_3_la%loc_to_glob(2,vv_js_axis_d)
231  ELSE IF (list_mode(i)==1 .AND. nx>0) THEN
232  vv_mode_global_js_d(i)%DIL(n123+1:) = vv_3_la%loc_to_glob(3,vv_js_axis_d)
233  ELSE IF (list_mode(i).GE.2 .AND. nx>0) THEN
234  vv_mode_global_js_d(i)%DIL(n123+1:n123+nx) = vv_3_la%loc_to_glob(1,vv_js_axis_d)
235  vv_mode_global_js_d(i)%DIL(n123+nx+1:n123+2*nx)= vv_3_la%loc_to_glob(2,vv_js_axis_d)
236  vv_mode_global_js_d(i)%DIL(n123+2*nx+1:) = vv_3_la%loc_to_glob(3,vv_js_axis_d)
237  END IF
238  END DO
239 
240  END SUBROUTINE vector_glob_js_d
241 
242  SUBROUTINE vector_without_bc_glob_js_d(vv_mesh, list_mode, vv_3_LA, vv_mode_global_js_D)
244  IMPLICIT NONE
245  TYPE(mesh_type), INTENT(IN) :: vv_mesh
246  INTEGER, DIMENSION(:), INTENT(IN) :: list_mode
247  TYPE(petsc_csr_la), INTENT(IN) :: vv_3_LA
248  TYPE(dyn_int_line), DIMENSION(:), POINTER :: vv_mode_global_js_D
249  INTEGER, DIMENSION(:), POINTER :: vv_js_axis_D
250  INTEGER :: m_max_c, i, nalloc, nx
251 
252  m_max_c = SIZE(list_mode)
253  CALL dir_axis_nodes_parallel(vv_mesh, vv_js_axis_d)
254  ALLOCATE(vv_mode_global_js_d(m_max_c))
255  DO i = 1, m_max_c
256  nx = SIZE(vv_js_axis_d)
257  IF (list_mode(i)==0) THEN
258  nalloc = 2*nx
259  ELSE IF (list_mode(i)==1) THEN
260  nalloc = nx
261  ELSE
262  nalloc = 3*nx
263  END IF
264  ALLOCATE(vv_mode_global_js_d(i)%DIL(nalloc))
265 
266  IF (list_mode(i)==0 .AND. nx>0) THEN
267  vv_mode_global_js_d(i)%DIL(1:nx) = vv_3_la%loc_to_glob(1,vv_js_axis_d)
268  vv_mode_global_js_d(i)%DIL(nx+1:) = vv_3_la%loc_to_glob(2,vv_js_axis_d)
269  ELSE IF (list_mode(i)==1 .AND. nx>0) THEN
270  vv_mode_global_js_d(i)%DIL = vv_3_la%loc_to_glob(3,vv_js_axis_d)
271  ELSE IF (list_mode(i).GE.2 .AND. nx>0) THEN
272  vv_mode_global_js_d(i)%DIL(1:nx) = vv_3_la%loc_to_glob(1,vv_js_axis_d)
273  vv_mode_global_js_d(i)%DIL(nx+1:2*nx)= vv_3_la%loc_to_glob(2,vv_js_axis_d)
274  vv_mode_global_js_d(i)%DIL(2*nx+1:) = vv_3_la%loc_to_glob(3,vv_js_axis_d)
275  END IF
276  END DO
277 
278  END SUBROUTINE vector_without_bc_glob_js_d
279 
280 
281  SUBROUTINE scalar_with_bc_glob_js_d(pp_mesh, list_mode, pp_1_LA, pp_js_D, pp_mode_global_js_D)
283  IMPLICIT NONE
284  TYPE(mesh_type), INTENT(IN) :: pp_mesh
285  INTEGER, DIMENSION(:), INTENT(IN) :: list_mode
286  TYPE(petsc_csr_la), INTENT(IN) :: pp_1_LA
287  TYPE(dyn_int_line), DIMENSION(:), POINTER :: pp_mode_global_js_D
288  INTEGER, DIMENSION(:), INTENT(IN) :: pp_js_D
289  INTEGER, DIMENSION(:), POINTER :: pp_js_axis_D
290  INTEGER :: m_max_c, i, n, nalloc, nx
291 
292  m_max_c = SIZE(list_mode)
293  CALL dir_axis_nodes_parallel(pp_mesh, pp_js_axis_d)
294 
295  ALLOCATE(pp_mode_global_js_d(m_max_c))
296  DO i = 1, m_max_c
297  n = SIZE(pp_js_d)
298  nx = SIZE(pp_js_axis_d)
299  IF (list_mode(i)==0) THEN
300  nalloc = n
301  ELSE
302  nalloc = n + nx
303  END IF
304 
305  ALLOCATE(pp_mode_global_js_d(i)%DIL(nalloc))
306  pp_mode_global_js_d(i)%DIL(1:n) = pp_1_la%loc_to_glob(1,pp_js_d)
307 
308  IF (list_mode(i).GE.1 .AND. nx>0) THEN
309  pp_mode_global_js_d(i)%DIL(n+1:n+nx) = pp_1_la%loc_to_glob(1,pp_js_axis_d)
310  END IF
311  END DO
312  END SUBROUTINE scalar_with_bc_glob_js_d
313 
314 
315  SUBROUTINE scalar_without_glob_js_d(pp_mesh, list_mode, pp_1_LA, pp_mode_global_js_D)
317  IMPLICIT NONE
318  TYPE(mesh_type), INTENT(IN) :: pp_mesh
319  INTEGER, DIMENSION(:), INTENT(IN) :: list_mode
320  TYPE(petsc_csr_la), INTENT(IN) :: pp_1_LA
321  TYPE(dyn_int_line), DIMENSION(:), POINTER :: pp_mode_global_js_D
322  INTEGER, DIMENSION(:), POINTER :: pp_js_axis_D
323  INTEGER :: m_max_c, i, nalloc, nx
324 
325  m_max_c = SIZE(list_mode)
326  CALL dir_axis_nodes_parallel(pp_mesh, pp_js_axis_d)
327  ALLOCATE(pp_mode_global_js_d(m_max_c))
328  DO i = 1, m_max_c
329  nx = SIZE(pp_js_axis_d)
330  IF (list_mode(i)==0) THEN
331  nalloc = 0
332  ELSE
333  nalloc = nx
334  END IF
335  ALLOCATE(pp_mode_global_js_d(i)%DIL(nalloc))
336  IF (list_mode(i).GE.1 .AND. nx>0) THEN
337  pp_mode_global_js_d(i)%DIL = pp_1_la%loc_to_glob(1,pp_js_axis_d)
338  END IF
339  END DO
340  END SUBROUTINE scalar_without_glob_js_d
341 END MODULE dir_nodes_petsc
subroutine dir_axis_nodes_parallel(mesh, js_d)
subroutine vector_without_bc_glob_js_d(vv_mesh, list_mode, vv_3_LA, vv_mode_global_js_D)
subroutine error_petsc(string)
Definition: my_util.f90:16
subroutine scalar_with_bc_glob_js_d(pp_mesh, list_mode, pp_1_LA, pp_js_D, pp_mode_global_js_D)
subroutine dirichlet_nodes_local(mesh, list_dirichlet_sides, js_d)
subroutine dirichlet_rhs(js_D, bs_D, b)
subroutine dirichlet_nodes_parallel(mesh, list_dirichlet_sides, js_d)
subroutine vector_glob_js_d(vv_mesh, list_mode, vv_3_LA, vv_list_dirichlet_sides, vv_js_D, vv_mode_global_js_D)
subroutine dirichlet_m_parallel(matrix, glob_js_D)
subroutine scalar_without_glob_js_d(pp_mesh, list_mode, pp_1_LA, pp_mode_global_js_D)