SFEMaNS  version 4.1 (work in progress)
Reference documentation for SFEMaNS
 All Classes Files Functions Variables Groups Pages
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)
9  USE def_type_mesh
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)
53  USE def_type_mesh
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)
101  USE def_type_mesh
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  IMPLICIT NONE
151  INTEGER, DIMENSION(:), INTENT(IN) :: glob_js_d
152  INTEGER :: n_d
153  INTEGER, DIMENSION(:), POINTER :: bubu_test
154 #include "petsc/finclude/petsc.h"
155  mat :: matrix
156  petscerrorcode :: ierr
157  n_d = SIZE(glob_js_d)
158  ALLOCATE(bubu_test(n_d))
159  IF (n_d/=0) THEN
160  bubu_test = glob_js_d-1
161  END IF
162 !!$ CALL MatZeroRows(matrix, n_D, glob_js_D-1, 1.d0, ierr)
163  CALL matzerorows(matrix, n_d, bubu_test, 1.d0, petsc_null_object, petsc_null_object, ierr)
164  CALL matassemblybegin(matrix,mat_final_assembly,ierr)
165  CALL matassemblyend(matrix,mat_final_assembly,ierr)
166 
167  DEALLOCATE(bubu_test)
168  END SUBROUTINE dirichlet_m_parallel
169 
170  SUBROUTINE dirichlet_rhs(js_D,bs_D,b)
171  USE def_type_mesh
172  IMPLICIT NONE
173  INTEGER, DIMENSION(:) :: js_d
174  REAL(KIND=8), DIMENSION(:) :: bs_d
175  INTEGER :: n_d
176 #include "petsc/finclude/petsc.h"
177  vec :: b
178  petscerrorcode :: ierr
179  n_d = SIZE(js_d)
180  IF (n_d/=0) THEN
181  CALL vecsetvalues(b, n_d, js_d, bs_d, insert_values, ierr)
182  END IF
183  CALL vecassemblybegin(b,ierr)
184  CALL vecassemblyend(b,ierr)
185 
186  END SUBROUTINE dirichlet_rhs
187 
188  SUBROUTINE vector_glob_js_d(vv_mesh, list_mode, vv_3_LA, vv_list_dirichlet_sides, vv_js_D, vv_mode_global_js_D)
189  USE def_type_mesh
190  IMPLICIT NONE
191  TYPE(mesh_type), INTENT(IN) :: vv_mesh
192  INTEGER, DIMENSION(:), INTENT(IN) :: list_mode
193  TYPE(petsc_csr_la), INTENT(IN) :: vv_3_la
194  TYPE(dyn_int_line), DIMENSION(3), INTENT(IN) :: vv_list_dirichlet_sides
195  TYPE(dyn_int_line), DIMENSION(:), POINTER :: vv_mode_global_js_d
196  TYPE(dyn_int_line), DIMENSION(3), INTENT(OUT):: vv_js_d
197  INTEGER, DIMENSION(:), POINTER :: vv_js_axis_d
198  INTEGER :: k, m_max_c, i, n1, n2, n3, n123, nalloc, nx
199  m_max_c = SIZE(list_mode)
200 
201  DO k = 1, 3
202  CALL dirichlet_nodes_parallel(vv_mesh, vv_list_dirichlet_sides(k)%DIL, vv_js_d(k)%DIL)
203  END DO
204  CALL dir_axis_nodes_parallel(vv_mesh, vv_js_axis_d)
205 
206  ALLOCATE(vv_mode_global_js_d(m_max_c))
207  DO i = 1, m_max_c
208  n1 = SIZE(vv_js_d(1)%DIL)
209  n2 = SIZE(vv_js_d(2)%DIL)
210  n3 = SIZE(vv_js_d(3)%DIL)
211  nx = SIZE(vv_js_axis_d)
212  n123 = n1+n2+n3
213  IF (list_mode(i)==0) THEN
214  nalloc = n123 + 2*nx
215  ELSE IF (list_mode(i)==1) THEN
216  nalloc = n123 + nx
217  ELSE
218  nalloc = n123 + 3*nx
219  END IF
220  ALLOCATE(vv_mode_global_js_d(i)%DIL(nalloc))
221  vv_mode_global_js_d(i)%DIL(1:n1) = vv_3_la%loc_to_glob(1,vv_js_d(1)%DIL)
222  vv_mode_global_js_d(i)%DIL(n1+1:n1+n2) = vv_3_la%loc_to_glob(2,vv_js_d(2)%DIL)
223  vv_mode_global_js_d(i)%DIL(n1+n2+1:n123) = vv_3_la%loc_to_glob(3,vv_js_d(3)%DIL)
224 
225  IF (list_mode(i)==0 .AND. nx>0) THEN
226  vv_mode_global_js_d(i)%DIL(n123+1:n123+nx) = vv_3_la%loc_to_glob(1,vv_js_axis_d)
227  vv_mode_global_js_d(i)%DIL(n123+nx+1:) = vv_3_la%loc_to_glob(2,vv_js_axis_d)
228  ELSE IF (list_mode(i)==1 .AND. nx>0) THEN
229  vv_mode_global_js_d(i)%DIL(n123+1:) = vv_3_la%loc_to_glob(3,vv_js_axis_d)
230  ELSE IF (list_mode(i).GE.2 .AND. nx>0) THEN
231  vv_mode_global_js_d(i)%DIL(n123+1:n123+nx) = vv_3_la%loc_to_glob(1,vv_js_axis_d)
232  vv_mode_global_js_d(i)%DIL(n123+nx+1:n123+2*nx)= vv_3_la%loc_to_glob(2,vv_js_axis_d)
233  vv_mode_global_js_d(i)%DIL(n123+2*nx+1:) = vv_3_la%loc_to_glob(3,vv_js_axis_d)
234  END IF
235  END DO
236 
237  END SUBROUTINE vector_glob_js_d
238 
239  SUBROUTINE vector_without_bc_glob_js_d(vv_mesh, list_mode, vv_3_LA, vv_mode_global_js_D)
240  USE def_type_mesh
241  IMPLICIT NONE
242  TYPE(mesh_type), INTENT(IN) :: vv_mesh
243  INTEGER, DIMENSION(:), INTENT(IN) :: list_mode
244  TYPE(petsc_csr_la), INTENT(IN) :: vv_3_la
245  TYPE(dyn_int_line), DIMENSION(:), POINTER :: vv_mode_global_js_d
246  INTEGER, DIMENSION(:), POINTER :: vv_js_axis_d
247  INTEGER :: m_max_c, i, nalloc, nx
248 
249  m_max_c = SIZE(list_mode)
250  CALL dir_axis_nodes_parallel(vv_mesh, vv_js_axis_d)
251  ALLOCATE(vv_mode_global_js_d(m_max_c))
252  DO i = 1, m_max_c
253  nx = SIZE(vv_js_axis_d)
254  IF (list_mode(i)==0) THEN
255  nalloc = 2*nx
256  ELSE IF (list_mode(i)==1) THEN
257  nalloc = nx
258  ELSE
259  nalloc = 3*nx
260  END IF
261  ALLOCATE(vv_mode_global_js_d(i)%DIL(nalloc))
262 
263  IF (list_mode(i)==0 .AND. nx>0) THEN
264  vv_mode_global_js_d(i)%DIL(1:nx) = vv_3_la%loc_to_glob(1,vv_js_axis_d)
265  vv_mode_global_js_d(i)%DIL(nx+1:) = vv_3_la%loc_to_glob(2,vv_js_axis_d)
266  ELSE IF (list_mode(i)==1 .AND. nx>0) THEN
267  vv_mode_global_js_d(i)%DIL = vv_3_la%loc_to_glob(3,vv_js_axis_d)
268  ELSE IF (list_mode(i).GE.2 .AND. nx>0) THEN
269  vv_mode_global_js_d(i)%DIL(1:nx) = vv_3_la%loc_to_glob(1,vv_js_axis_d)
270  vv_mode_global_js_d(i)%DIL(nx+1:2*nx)= vv_3_la%loc_to_glob(2,vv_js_axis_d)
271  vv_mode_global_js_d(i)%DIL(2*nx+1:) = vv_3_la%loc_to_glob(3,vv_js_axis_d)
272  END IF
273  END DO
274 
275  END SUBROUTINE vector_without_bc_glob_js_d
276 
277 
278  SUBROUTINE scalar_with_bc_glob_js_d(pp_mesh, list_mode, pp_1_LA, pp_js_D, pp_mode_global_js_D)
279  USE def_type_mesh
280  IMPLICIT NONE
281  TYPE(mesh_type), INTENT(IN) :: pp_mesh
282  INTEGER, DIMENSION(:), INTENT(IN) :: list_mode
283  TYPE(petsc_csr_la), INTENT(IN) :: pp_1_la
284  TYPE(dyn_int_line), DIMENSION(:), POINTER :: pp_mode_global_js_d
285  INTEGER, DIMENSION(:), INTENT(IN) :: pp_js_d
286  INTEGER, DIMENSION(:), POINTER :: pp_js_axis_d
287  INTEGER :: m_max_c, i, n, nalloc, nx
288 
289  m_max_c = SIZE(list_mode)
290  CALL dir_axis_nodes_parallel(pp_mesh, pp_js_axis_d)
291 
292  ALLOCATE(pp_mode_global_js_d(m_max_c))
293  DO i = 1, m_max_c
294  n = SIZE(pp_js_d)
295  nx = SIZE(pp_js_axis_d)
296  IF (list_mode(i)==0) THEN
297  nalloc = n
298  ELSE
299  nalloc = n + nx
300  END IF
301 
302  ALLOCATE(pp_mode_global_js_d(i)%DIL(nalloc))
303  pp_mode_global_js_d(i)%DIL(1:n) = pp_1_la%loc_to_glob(1,pp_js_d)
304 
305  IF (list_mode(i).GE.1 .AND. nx>0) THEN
306  pp_mode_global_js_d(i)%DIL(n+1:n+nx) = pp_1_la%loc_to_glob(1,pp_js_axis_d)
307  END IF
308  END DO
309  END SUBROUTINE scalar_with_bc_glob_js_d
310 
311 
312  SUBROUTINE scalar_glob_js_d(pp_mesh, list_mode, pp_1_LA, pp_mode_global_js_D)
313  USE def_type_mesh
314  IMPLICIT NONE
315  TYPE(mesh_type), INTENT(IN) :: pp_mesh
316  INTEGER, DIMENSION(:), INTENT(IN) :: list_mode
317  TYPE(petsc_csr_la), INTENT(IN) :: pp_1_la
318  TYPE(dyn_int_line), DIMENSION(:), POINTER :: pp_mode_global_js_d
319  INTEGER, DIMENSION(:), POINTER :: pp_js_axis_d
320  INTEGER :: m_max_c, i, nalloc, nx
321 
322  m_max_c = SIZE(list_mode)
323  CALL dir_axis_nodes_parallel(pp_mesh, pp_js_axis_d)
324  ALLOCATE(pp_mode_global_js_d(m_max_c))
325  DO i = 1, m_max_c
326  nx = SIZE(pp_js_axis_d)
327  IF (list_mode(i)==0) THEN
328  nalloc = 0
329  ELSE
330  nalloc = nx
331  END IF
332  ALLOCATE(pp_mode_global_js_d(i)%DIL(nalloc))
333  IF (list_mode(i).GE.1 .AND. nx>0) THEN
334  pp_mode_global_js_d(i)%DIL = pp_1_la%loc_to_glob(1,pp_js_axis_d)
335  END IF
336  END DO
337  END SUBROUTINE scalar_glob_js_d
338 END MODULE dir_nodes_petsc
subroutine dirichlet_rhs(js_D, bs_D, b)
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 scalar_glob_js_d(pp_mesh, list_mode, pp_1_LA, pp_mode_global_js_D)
subroutine dirichlet_nodes_parallel(mesh, list_dirichlet_sides, js_d)
subroutine dirichlet_m_parallel(matrix, glob_js_D)
subroutine dir_axis_nodes_parallel(mesh, js_d)
subroutine dirichlet_nodes_local(mesh, list_dirichlet_sides, js_d)
subroutine error_petsc(string)
Definition: my_util.f90:15
subroutine scalar_with_bc_glob_js_d(pp_mesh, list_mode, pp_1_LA, pp_js_D, pp_mode_global_js_D)
subroutine vector_without_bc_glob_js_d(vv_mesh, list_mode, vv_3_LA, vv_mode_global_js_D)