FE-Project
Loading...
Searching...
No Matches
scale_meshutil_3d.F90
Go to the documentation of this file.
1!-------------------------------------------------------------------------------
2!> module FElib / Mesh / utility for 3D mesh
3!!
4!! @par Description
5!! A module to provide subroutines for generating 3D mesh
6!!
7!! @author Yuta Kawai, Team SCALE
8!<
9!-------------------------------------------------------------------------------
10#include "scaleFElib.h"
12 !-----------------------------------------------------------------------------
13 !
14 !++ used modules
15 !
16 use scale_precision
17
18 !-----------------------------------------------------------------------------
19 implicit none
20 private
21
22 !-----------------------------------------------------------------------------
23 !
24 !++ Public procedure
25 !
31
32contains
33
34!OCL SERIAL
35 subroutine meshutil3d_gencubedomain( pos_v, EToV, &
36 Ke_x, xmin, xmax, Ke_y, ymin, ymax, Ke_z, zmin, zmax, &
37 Fz )
38
39 implicit none
40
41 integer, intent(in) :: ke_x
42 real(rp), intent(in) :: xmin, xmax
43 integer, intent(in) :: ke_y
44 real(rp), intent(in) :: ymin, ymax
45 integer, intent(in) :: ke_z
46 real(rp), intent(in) :: zmin, zmax
47 real(rp), intent(in), optional :: fz(ke_z+1)
48
49 real(rp), intent(out) :: pos_v((ke_x+1)*(ke_y+1)*(ke_z+1),3)
50 integer, intent(out) :: etov(ke_x*ke_y*ke_z,8)
51
52 integer :: i, j, k
53 integer :: n
54 integer :: nvx, nvy, nvz
55 !-----------------------------------------------------------------------------
56
57 nvx = ke_x + 1
58 nvy = ke_y + 1
59 nvz = ke_z + 1
60
61 !$omp parallel private(i,j,k,n)
62
63 !$omp do collapse(2)
64 do k=1, nvz
65 do j=1, nvy
66 do i=1, nvx
67 n = i + ( j - 1 ) * nvx + ( k - 1 ) *nvx*nvy
68 pos_v(n,1) = ( xmax - xmin ) * dble(i - 1)/dble(nvx - 1) + xmin
69 pos_v(n,2) = ( ymax - ymin ) * dble(j - 1)/dble(nvy - 1) + ymin
70 if ( present(fz) ) then
71 pos_v(n,3) = fz(k)
72 else
73 pos_v(n,3) = (zmax - zmin)*dble(k - 1)/dble(nvz - 1) + zmin
74 end if
75 end do
76 end do
77 end do
78
79 !$omp do collapse(2)
80 do k=1, ke_z
81 do j=1, ke_y
82 do i=1, ke_x
83 n = i + (j-1)*ke_x + (k-1)*ke_x*ke_y
84 etov(n,1:4) = (k-1)*nvx*nvy + (j-1)*nvx + &
85 & (/ i, i+1, &
86 & i + nvx, i+1 + nvx /)
87 etov(n,5:8) = k *nvx*nvy + (j-1)*nvx + &
88 & (/ i, i+1, &
89 & i + nvx, i+1 + nvx /)
90 end do
91 end do
92 end do
93
94 !$omp end parallel
95
96 !---
97 !!$
98 !!$ write(*,*) "-- vx, vy --"
99 !!$ do j=1, NvY
100 !!$ do i=1, NvX
101 !!$ n = i + (j-1)*NvY
102 !!$ write(*,*) i, j, " :", mesh%vx(n), mesh%vy(n)
103 !!$ end do
104 !!$ end do
105 !!$
106 !!$ write(*,*) "-- EToV --"
107 !!$ do j=1, Ke_y
108 !!$ do i=1, Ke_x
109 !!$ n = i + (j-1)*Ke_y
110 !!$ write(*,*) i, j, " :", mesh%EToV(n,:)
111 !!$ end do
112 !!$ end do
113
114 return
115 end subroutine meshutil3d_gencubedomain
116
117!OCL SERIAL
118 subroutine meshutil3d_genconnectivity( EToE, EToF, &
119 EToV, Ne, Nfaces )
120
122 implicit none
123
124 integer, intent(in) :: ne
125 integer, intent(in) :: nfaces
126 integer, intent(out) :: etoe(ne, nfaces)
127 integer, intent(out) :: etof(ne, nfaces)
128 integer, intent(in) :: etov(ne,8)
129
130 integer :: nodes(ne*nfaces,4)
131 integer(kind=8) :: face_ids(ne*nfaces)
132 integer :: ke
133 integer :: f
134 integer :: n
135 integer :: nnodes
136 integer :: nnodes_row
137 integer :: matchl(2,3), matchr(2,3)
138
139 real(rp) :: etoe_1d(ne*nfaces)
140 real(rp) :: etof_1d(ne*nfaces)
141
142 integer :: spnodetonode(3,ne*nfaces)
143 integer :: spnodetonoderowtmp(3,ne*nfaces)
144 integer :: sort_indx(ne*nfaces)
145 integer(kind=8) :: sorted_faceid(ne*nfaces)
146
147 real(rp) :: vtmp(4)
148
149 !-----------------------------------------------------------------------------
150
151 nnodes = maxval( etov )
152 nnodes_row = size(nodes,1)
153
154 !---------
155 do ke=1, ne
156 nodes(ke ,:) = etov(ke,(/ 1, 2, 6, 5 /))
157 nodes(ke+ne ,:) = etov(ke,(/ 2, 4, 8, 6 /))
158 nodes(ke+2*ne,:) = etov(ke,(/ 4, 3, 7, 8 /))
159 nodes(ke+3*ne,:) = etov(ke,(/ 3, 1, 5, 7 /))
160 nodes(ke+4*ne,:) = etov(ke,(/ 1, 3, 4, 2 /))
161 nodes(ke+5*ne,:) = etov(ke,(/ 5, 6, 8, 7 /))
162 end do
163
164 ! Sort
165 do n=1, nnodes_row
166 vtmp(:) = nodes(n,:)
167 call bubblesort( vtmp )
168 nodes(n,:) = vtmp(:)
169 ! write(*,*) n, ":", nodes(n,:)
170 end do
171 nodes = nodes - 1
172 !---------
173
174 do ke=1, ne
175 etoe(ke,:) = ke
176 etof(ke,:) = (/ 1, 2, 3, 4, 5, 6 /)
177 end do
178
179 face_ids(:) = nodes(:,1) * nnodes**3 + nodes(:,2) * nnodes**2 &
180 + nodes(:,3) * nnodes + nodes(:,4) + 1
181
182 do f=1, nfaces
183 do ke=1, ne
184 n = ke + (f-1)*ne
185 spnodetonode(:,n) = (/ n, etoe(ke,f), etof(ke,f) /)
186 sorted_faceid(n) = face_ids(n)
187 sort_indx(n) = n
188 ! write(*,*) "face_id, n, EToE, EToF:", spNodeToNode(:,n)
189 end do
190 end do
191
192 !- sort row
193 call quicksort_exec_with_idx( ne*nfaces, sorted_faceid, sort_indx )
194 spnodetonoderowtmp(:,:) = spnodetonode(:,:)
195
196 do n=1, nnodes_row
197 spnodetonode(:,n) = spnodetonoderowtmp(:,sort_indx(n))
198 ! write(*,'(a,4i10)') "(sorted) face_id, n, EToE, EToF:", spNodeToNode(:,n)
199 end do
200
201 etoe_1d(:) = -1
202 etof_1d(:) = -1
203 do n=1, nnodes_row-1
204 if ( sorted_faceid(n) - sorted_faceid(n+1) == 0 ) then
205 matchl(:,:) = transpose( spnodetonode(:,(/ n, n+1 /)) )
206 matchr(:,:) = transpose( spnodetonode(:,(/ n+1, n /)) )
207
208 etoe_1d(matchl(:,1)) = matchr(:,2)
209 etof_1d(matchl(:,1)) = matchr(:,3)
210 end if
211 end do
212
213 do f=1, nfaces
214 do ke=1, ne
215 n = ke + (f-1)*ne
216 if ( etoe_1d(n) /= -1 ) then
217 etoe(ke,f) = etoe_1d(n)
218 etof(ke,f) = etof_1d(n)
219 end if
220 end do
221 end do
222
223 !-------------------
224
225! write(*,*) "EToE------"
226! do k=1, mesh%Ne
227! write(*,*) "k=", k, ":", mesh%EToE(k,:)
228! end do
229! write(*,*) "EToF------"
230! do k=1, mesh%Ne
231! write(*,*) "k=", k, ":", mesh%EToF(k,:)
232! end do
233
234 return
235 end subroutine meshutil3d_genconnectivity
236
237!OCL SERIAL
238 subroutine bubblesort( array )
239 implicit none
240 real(rp), intent(inout) :: array(:)
241
242 integer :: i, j, n
243 real(rp) :: t
244 !--------------------
245
246 n = size(array)
247 do i=1, n-1
248 do j=i+1,n
249 t = array(i)
250 if(t > array(j)) then
251 array(i) = array(j)
252 array(j) = t
253 end if
254 end do
255 end do
256
257 return
258 end subroutine bubblesort
259
260!OCL SERIAL
261 subroutine meshutil3d_buildinteriormap( VMapM, VMapP, MapM, MapP, &
262 pos_en, pos_ev, EtoE, EtoF, EtoV, Fmask_h, Fmask_v, &
263 Ne, Nv, Np, Nfp_h, Nfp_v, NfpTot, Nfaces_h, Nfaces_v, Nfaces)
264
265 implicit none
266
267 integer, intent(in) :: ne
268 integer, intent(in) :: nv
269 integer, intent(in) :: np
270 integer, intent(in) :: nfp_h
271 integer, intent(in) :: nfp_v
272 integer, intent(in) :: nfptot
273 integer, intent(in) :: nfaces_h
274 integer, intent(in) :: nfaces_v
275 integer, intent(in) :: nfaces
276
277 integer, intent(out) :: vmapm(nfptot,ne)
278 integer, intent(out) :: vmapp(nfptot,ne)
279 integer, intent(out) :: mapm(nfptot,ne)
280 integer, intent(out) :: mapp(nfptot,ne)
281
282 real(rp), intent(in) :: pos_en(np,ne,3)
283 real(rp), intent(in) :: pos_ev(nv,3)
284 integer, intent(in) :: etoe(ne,nfaces)
285 integer, intent(in) :: etof(ne,nfaces)
286 integer, intent(in) :: etov(ne,nv)
287 integer, intent(in) :: fmask_h(nfp_h,nfaces_h)
288 integer, intent(in) :: fmask_v(nfp_v,nfaces_v)
289
290 integer :: ke, ke1, ke2
291 integer :: f, f1, f2
292 integer :: p
293 integer :: n
294 integer :: i
295 integer :: idp, idm
296 integer :: v1, v2
297 integer :: nodeids(np,ne)
298 real(rp) :: r_h(nfp_h,nfp_h,3,2)
299 real(rp) :: r_v(nfp_v,nfp_v,3,2)
300 real(rp) :: dist_h(nfp_h,nfp_h)
301 real(rp) :: dist_v(nfp_v,nfp_v)
302 real(rp) :: x(np*ne), y(np*ne), z(np*ne)
303
304 integer :: vmapm_h(nfp_h,nfaces_h,ne)
305 integer :: vmapp_h(nfp_h,nfaces_h,ne)
306 integer :: vmapm_v(nfp_v,nfaces_v,ne)
307 integer :: vmapp_v(nfp_v,nfaces_v,ne)
308 integer :: mapm_h(nfp_h,nfaces_h,ne)
309 integer :: mapp_h(nfp_h,nfaces_h,ne)
310 integer :: mapm_v(nfp_v,nfaces_v,ne)
311 integer :: mapp_v(nfp_v,nfaces_v,ne)
312
313 integer :: mindist_indx(1)
314 !-----------------------------------------------------------------------------
315
316 !$omp parallel private(ke,f,p,n)
317
318 !$omp do
319 do ke=1, ne
320 do p=1, np
321 n = p + (ke-1)*np
322 nodeids(p,ke) = n
323 x(n) = pos_en(p,ke,1)
324 y(n) = pos_en(p,ke,2)
325 z(n) = pos_en(p,ke,3)
326 end do
327 end do
328 !$omp end do
329
330 !$omp do
331 do ke=1, ne
332 do f=1, nfaces_h
333 do p=1, nfp_h
334 n = p + (f-1)*nfp_h + (ke-1)*nfptot
335 mapm_h(p,f,ke) = n
336 mapp_h(p,f,ke) = n
337 vmapm_h(p,f,ke) = nodeids(fmask_h(p,f),ke)
338 end do
339 end do
340 do f=1, nfaces_v
341 do p=1, nfp_v
342 n = p + nfaces_h*nfp_h + (f-1)*nfp_v + (ke-1)*nfptot
343 mapm_v(p,f,ke) = n
344 mapp_v(p,f,ke) = n
345 vmapm_v(p,f,ke) = nodeids(fmask_v(p,f),ke)
346 end do
347 end do
348 end do
349 !$omp end do
350
351 !$omp workshare
352 vmapp_h(:,:,:) = -1
353 vmapp_v(:,:,:) = -1
354 !$omp end workshare
355 !$omp end parallel
356
357 !$omp parallel private( &
358 !$omp ke1, f1, ke2, f2, v1, v2, &
359 !$omp r_h, r_v, dist_h, dist_v, mindist_indx, idP, idM )
360
361 !$omp do
362 do ke1=1, ne
363 do f1=1, nfaces_h
364 ke2 = etoe(ke1,f1); f2 = etof(ke1,f1)
365
366 v1 = etov(ke1,f1); v2 = etov(ke1,1+mod(f1,nfaces_h))
367
368 r_h(:,:,1,1) = spread( x(vmapm_h(:,f1,ke1)), 2, nfp_h )
369 r_h(:,:,1,2) = spread( x(vmapm_h(:,f2,ke2)), 1, nfp_h )
370 r_h(:,:,2,1) = spread( y(vmapm_h(:,f1,ke1)), 2, nfp_h )
371 r_h(:,:,2,2) = spread( y(vmapm_h(:,f2,ke2)), 1, nfp_h )
372 r_h(:,:,3,1) = spread( z(vmapm_h(:,f1,ke1)), 2, nfp_h )
373 r_h(:,:,3,2) = spread( z(vmapm_h(:,f2,ke2)), 1, nfp_h )
374
375 dist_h(:,:) = (r_h(:,:,1,1) - r_h(:,:,1,2))**2 &
376 + (r_h(:,:,2,1) - r_h(:,:,2,2))**2 &
377 + (r_h(:,:,3,1) - r_h(:,:,3,2))**2
378 do idm=1, nfp_h
379 mindist_indx(:) = minloc(dist_h(idm,:))
380 idp = mindist_indx(1)
381 vmapp_h(idm,f1,ke1) = vmapm_h(idp,f2,ke2)
382 mapp_h(idm,f1,ke1) = idp + (f2-1)*nfp_h + (ke2-1)*nfptot
383 end do
384 end do
385 end do
386 !omp end do
387
388 !$omp do
389 do ke1=1, ne
390 do f1=1, nfaces_v
391 ke2 = etoe(ke1,nfaces_h+f1); f2 = etof(ke1,nfaces_h+f1) - nfaces_h
392
393 v1 = etov(ke1,1); v2 = etov(ke1,nfaces_h+1)
394
395 r_v(:,:,1,1) = spread( x(vmapm_v(:,f1,ke1)), 2, nfp_v )
396 r_v(:,:,1,2) = spread( x(vmapm_v(:,f2,ke2)), 1, nfp_v )
397 r_v(:,:,2,1) = spread( y(vmapm_v(:,f1,ke1)), 2, nfp_v )
398 r_v(:,:,2,2) = spread( y(vmapm_v(:,f2,ke2)), 1, nfp_v )
399 r_v(:,:,3,1) = spread( z(vmapm_v(:,f1,ke1)), 2, nfp_v )
400 r_v(:,:,3,2) = spread( z(vmapm_v(:,f2,ke2)), 1, nfp_v )
401
402 dist_v(:,:) = (r_v(:,:,1,1) - r_v(:,:,1,2))**2 &
403 + (r_v(:,:,2,1) - r_v(:,:,2,2))**2 &
404 + (r_v(:,:,3,1) - r_v(:,:,3,2))**2
405 do idm=1, nfp_v
406 mindist_indx(:) = minloc(dist_v(idm,:))
407 idp = mindist_indx(1)
408 vmapp_v(idm,f1,ke1) = vmapm_v(idp,f2,ke2)
409 mapp_v(idm,f1,ke1) = idp + nfaces_h*nfp_h + (f2-1)*nfp_v + (ke2-1)*nfptot
410 end do
411 end do
412 end do
413 !omp end do
414 !$omp end parallel
415
416 !$omp parallel do private(ke,f,n,i)
417 do ke=1, ne
418 do f=1, nfaces_h
419 do n=1, nfp_h
420 i = n + (f-1)*nfp_h
421 vmapm(i,ke) = vmapm_h(n,f,ke)
422 mapm(i,ke) = mapm_h(n,f,ke)
423 vmapp(i,ke) = vmapp_h(n,f,ke)
424 mapp(i,ke) = mapp_h(n,f,ke)
425 end do
426 end do
427 do f=1, nfaces_v
428 do n=1, nfp_v
429 i = n + nfaces_h*nfp_h + (f-1)*nfp_v
430 vmapm(i,ke) = vmapm_v(n,f,ke)
431 mapm(i,ke) = mapm_v(n,f,ke)
432 vmapp(i,ke) = vmapp_v(n,f,ke)
433 mapp(i,ke) = mapp_v(n,f,ke)
434 end do
435 end do
436 end do
437
438 !-----
439 ! mapB_counter = 0
440 ! do k=1,mesh%Ne
441 ! do f=1,elem%Nfaces
442 ! do p=1,elem%Nfp
443 ! n = p + (f-1)*elem%Nfp + (k-1)*elem%Nfp*elem%Nfaces
444 ! if (mesh%VMapM(p,f,k) == mesh%VMapP(p,f,k)) then
445 ! mapB_counter = mapB_counter + 1
446 ! mapB_tmp(mapB_counter) = n
447 !
448 ! vmapB_tmp(mapB_counter) = mesh%VMapM(p,f,k)
449 ! mesh%VMapP(p,f,k) = elem%Np*mesh%NeE + mapB_counter
450 ! end if
451 ! end do
452 ! end do
453 ! end do
454 !
455 ! allocate( mesh%mapB(mapB_counter) )
456 ! allocate( mesh%vmapB(mapB_counter) )
457 ! mesh%mapB(:) = mapB_tmp(1:mapB_counter)
458 ! mesh%vmapB(:) = vmapB_tmp(1:mapB_counter)
459
460 !-------
461 ! write(*,*) "Build MapInfo: "
462 ! do k=mesh%NeS,mesh%NeE
463 ! write(*,*) "k=", k, "---"
464 ! write(*,*) " VMapM:", mesh%VMapM(:,:,k)
465 ! write(*,*) " VMapP:", mesh%VMapP(:,:,k)
466 ! end do
467
468 ! write(*,*) "mapB:", mesh%mapB(:)
469 ! write(*,*) "vmapB:", mesh%vmapB(:)
470
471 return
472 end subroutine meshutil3d_buildinteriormap
473
474!OCL SERIAL
475 subroutine meshutil3d_genpatchboundarymap( VMapB, MapB, VMapP, &
476 pos_en, xmin, xmax, ymin, ymax, zmin, zmax, &
477 Fmask_h, Fmask_v, Ne, Nv, Np, Nfp_h, Nfp_v, NfpTot, Nfaces_h, Nfaces_v, Nfaces )
478
479 implicit none
480
481 integer, intent(in) :: ne
482 integer, intent(in) :: nv
483 integer, intent(in) :: np
484 integer, intent(in) :: nfp_h
485 integer, intent(in) :: nfp_v
486 integer, intent(in) :: nfptot
487 integer, intent(in) :: nfaces_h
488 integer, intent(in) :: nfaces_v
489 integer, intent(in) :: nfaces
490
491 integer, intent(inout), allocatable :: vmapb(:)
492 integer, intent(inout), allocatable :: mapb(:)
493 integer, intent(inout) :: vmapp(nfptot,ne)
494
495 real(rp), intent(in) :: pos_en(np,ne,3)
496 real(rp), intent(in) :: xmin, xmax
497 real(rp), intent(in) :: ymin, ymax
498 real(rp), intent(in) :: zmin, zmax
499 integer, intent(in) :: fmask_h(nfp_h,nfaces_h)
500 integer, intent(in) :: fmask_v(nfp_v,nfaces_v)
501
502 integer :: ke, n
503 integer :: b
504 integer :: f
505 integer :: i, j
506 real(rp) :: x, y, z
507
508 real(rp), parameter :: node_tol = 1.0e-12_rp
509
510 integer :: elemids_h(nfp_h*ne,nfaces_h)
511 real(rp) :: ordinfo_h(nfp_h*ne,nfaces_h)
512 integer :: faceids_h(nfp_h*ne,nfaces_h)
513 integer :: counterb_h(nfaces_h)
514
515 integer :: elemids_v(nfp_v*ne,nfaces_v)
516 real(rp) :: ordinfo_v(nfp_v*ne,nfaces_v)
517 integer :: faceids_v(nfp_v*ne,nfaces_v)
518 integer :: counterb_v(nfaces_v)
519
520 integer :: mapb_counter
521 real(rp) :: rdomx, rdomy, rdomz
522 !-----------------------------------------------------------------------------
523
524 counterb_h(:) = 0
525 counterb_v(:) = 0
526
527 rdomx = 1.0_rp/(xmax - xmin)
528 rdomy = 1.0_rp/(ymax - ymin)
529 rdomz = 1.0_rp/abs(zmax - zmin)
530
531 do ke=1, ne
532 do f=1, nfaces_h
533 x = sum(pos_en(fmask_h(:,f),ke,1)) / dble(nfp_h)
534 y = sum(pos_en(fmask_h(:,f),ke,2)) / dble(nfp_h)
535
536 call eval_domain_boundary( &
537 elemids_h, ordinfo_h, faceids_h, counterb_h, & ! (inout)
538 1, y, ymin, x, ke, f, rdomy ) ! (in)
539 call eval_domain_boundary( &
540 elemids_h, ordinfo_h, faceids_h, counterb_h, & ! (inout)
541 2, x, xmax, y, ke, f, rdomx ) ! (in)
542 call eval_domain_boundary( &
543 elemids_h, ordinfo_h, faceids_h, counterb_h, & ! (inout)
544 3, y, ymax, x, ke, f, rdomy ) ! (in)
545 call eval_domain_boundary( &
546 elemids_h, ordinfo_h, faceids_h, counterb_h, & ! (inout)
547 4, x, xmin, y, ke, f, rdomx ) ! (in)
548 end do
549 do f=1, nfaces_v
550 x = sum(pos_en(fmask_v(:,f),ke,1)) / dble(nfp_v)
551 z = sum(pos_en(fmask_v(:,f),ke,3)) / dble(nfp_v)
552
553 call eval_domain_boundary( &
554 elemids_v, ordinfo_v, faceids_v, counterb_v, & ! (inout)
555 1, z, zmin, x, ke, f, rdomz ) ! (in)
556 call eval_domain_boundary( &
557 elemids_v, ordinfo_v, faceids_v, counterb_v, & ! (inout)
558 2, z, zmax, x, ke, f, rdomz ) ! (in)
559 end do
560 end do
561
562
563 allocate( mapb(sum(counterb_h(:)*nfp_h)+sum(counterb_v(:)*nfp_v)) )
564 allocate( vmapb(size(mapb)) )
565
566 mapb_counter = 1
567 do b = 1, nfaces_h
568 ! write(*,*) "LocalMesh boundary ID:", b
569 ! write(*,*) counterB_h(b)
570 ! write(*,*) ordInfo_h(1:counterB_h(1),b)
571 ! write(*,*) elemIds_h(1:counterB_h(1),b)
572 ! write(*,*) faceIds_h(1:counterB_h(1),b)
573
574 do i=1, counterb_h(b)
575 ke = elemids_h(i,b); f = faceids_h(i,b)
576 do j=1, nfp_h
577 n = j + (f-1)*nfp_h
578 vmapp(n,ke) = np*ne + mapb_counter
579 vmapb(mapb_counter) = fmask_h(j,f) + (ke-1)*np
580 mapb_counter = mapb_counter + 1
581 end do
582 end do
583 end do
584
585 do b = 1, nfaces_v
586 do i=1, counterb_v(b)
587 ke = elemids_v(i,b); f = faceids_v(i,b)
588 do j=1, nfp_v
589 n = j + nfp_h*nfaces_h + nfp_v*(f-1)
590 vmapp(n,ke) = np*ne + mapb_counter
591 vmapb(mapb_counter) = fmask_v(j,f) + (ke-1)*np
592 mapb_counter = mapb_counter + 1
593 end do
594 end do
595 end do
596
597 ! write(*,*) "VMapP:-----"
598 ! do b=1, 4
599 ! do i=1, counterB(b)
600 ! k = elemIds(i,b); f = faceIDs(i,b)
601 ! write(*,*) "bid=", b, ":", mesh%VmapP(:,f,k)
602 ! end do
603 ! end do
604 ! write(*,*) "-----"
605 ! write(*,*) "VMapB:", mesh%VmapB(:)
606 ! write(*,*) "NeA=", mesh%NeA
607
608 return
609
610 contains
611!OCL SERIAL
612 subroutine eval_domain_boundary( &
613 elemIDs, ordInfo, faceIDs, counterB, &
614 domb_id, r, rbc, ord_info, k_, f_, normalized_fac )
615 implicit none
616
617 integer, intent(inout) :: elemids(:,:)
618 real(rp), intent(inout) :: ordinfo(:,:)
619 integer, intent(inout) :: counterb(:)
620 integer, intent(inout) :: faceids(:,:)
621 integer, intent(in) :: domb_id
622 real(rp), intent(in) :: r
623 real(rp), intent(in) :: rbc
624 real(rp), intent(in) :: ord_info
625 integer, intent(in) :: k_, f_
626 real(rp), intent(in) :: normalized_fac
627 !-------------------------------------------------------------
628
629 if ( abs(r - rbc)*normalized_fac < node_tol ) then
630 counterb(domb_id) = counterb(domb_id) + 1
631 ordinfo(counterb(domb_id),domb_id) = ord_info
632 elemids(counterb(domb_id),domb_id) = k_
633 faceids(counterb(domb_id),domb_id) = f_
634 end if
635
636 return
637 end subroutine eval_domain_boundary
638 end subroutine meshutil3d_genpatchboundarymap
639
640!OCL SERIAL
642 panelID_table, pi_table, pj_table, pk_table, &
643 tileID_map, tileFaceID_map, tilePanelID_map, &
644 Ntile, NtileFace, NtileVertex, &
645 isPeriodicX, isPeriodicY, isPeriodicZ, &
646 Ne_x, Ne_y, Ne_z )
647
648 ! use scale_prc, only: PRC_isMaster
649 implicit none
650
651 integer, intent(in) :: ntile
652 integer, intent(in) :: ntileface
653 integer, intent(in) :: ntilevertex
654 integer, intent(out) :: panelid_table(ntile)
655 integer, intent(out) :: pi_table(ntile)
656 integer, intent(out) :: pj_table(ntile)
657 integer, intent(out) :: pk_table(ntile)
658 integer, intent(out) :: tileid_map(ntileface,ntile)
659 integer, intent(out) :: tilefaceid_map(ntileface,ntile)
660 integer, intent(out) :: tilepanelid_map(ntileface,ntile)
661 logical, intent(in) :: isperiodicx
662 logical, intent(in) :: isperiodicy
663 logical, intent(in) :: isperiodicz
664 integer, intent(in) :: ne_x
665 integer, intent(in) :: ne_y
666 integer, intent(in) :: ne_z
667
668 integer :: ntileperpanel
669 integer :: nv_x, nv_y, nv_z
670 integer, allocatable :: nodesid_3d(:,:,:)
671 integer, allocatable :: etov(:,:)
672 integer, allocatable :: etoe(:,:)
673 integer, allocatable :: etof(:,:)
674 integer :: i, j, k, f
675 integer :: tileid, tileid_r
676 integer :: counter
677
678 !-----------------------------------------------------------------------------
679
680 ntileperpanel = ntile/1
681
682 nv_x = ne_x + 1
683 nv_y = ne_y + 1
684 nv_z = ne_z + 1
685
686 allocate( nodesid_3d(nv_x,nv_y,nv_z) )
687 allocate( etov(ntile,ntilevertex), etoe(ntile,ntileface), etof(ntile,ntileface) )
688
689 counter = 0
690 do k = 1, nv_z
691 do j = 1, nv_y
692 do i = 1, nv_x
693 counter = counter + 1
694 nodesid_3d(i,j,k) = counter
695 end do
696 end do
697 end do
698
699
700 !----
701
702 tileid = 0
703 do k = 1, ne_z
704 do j = 1, ne_y
705 do i = 1, ne_x
706 tileid = tileid + 1
707 panelid_table(tileid) = 1
708 pi_table(tileid) = i; pj_table(tileid) = j; pk_table(tileid) = k
709 etov(tileid,:) = (/ nodesid_3d(i,j ,k ), nodesid_3d(i+1,j ,k ), &
710 nodesid_3d(i,j+1,k ), nodesid_3d(i+1,j+1,k ), &
711 nodesid_3d(i,j ,k+1), nodesid_3d(i+1,j ,k+1), &
712 nodesid_3d(i,j+1,k+1), nodesid_3d(i+1,j+1,k+1) /)
713 end do
714 end do
715 end do
716
717 call meshutil3d_genconnectivity( etoe, etof, &
718 etov, ntile, ntileface )
719 tileid_map(:,:) = transpose(etoe)
720 tilefaceid_map(:,:) = transpose(etof)
721
722 do tileid=1, ntile
723 do f=1, ntileface
724 tileid_r = tileid_map(f,tileid)
725 tilepanelid_map(f,tileid) = panelid_table(tileid_r)
726 end do
727 end do
728
729 if (isperiodicx) then
730 do tileid=1, ntile
731 if (pi_table(tileid) == 1 .and. tilefaceid_map(4,tileid) == 4) then
732 tileid_map(4,tileid) = ne_x + (pj_table(tileid) - 1)*ne_x + (pk_table(tileid) - 1)*ne_x*ne_y
733 tilefaceid_map(4,tileid) = 2
734 end if
735 if (pi_table(tileid) == ne_x .and. tilefaceid_map(2,tileid) == 2) then
736 tileid_map(2,tileid) = 1 + (pj_table(tileid) - 1)*ne_x + (pk_table(tileid) - 1)*ne_x*ne_y
737 tilefaceid_map(2,tileid) = 4
738 end if
739 end do
740 end if
741
742 if (isperiodicy) then
743 do tileid=1, ntile
744 if (pj_table(tileid) == 1 .and. tilefaceid_map(1,tileid) == 1) then
745 tileid_map(1,tileid) = pi_table(tileid) + (ne_y - 1)*ne_x + (pk_table(tileid) - 1)*ne_x*ne_y
746 tilefaceid_map(1,tileid) = 3
747 end if
748 if (pj_table(tileid) == ne_y .and. tilefaceid_map(3,tileid) == 3) then
749 tileid_map(3,tileid) = pi_table(tileid) + (pk_table(tileid) - 1)*ne_x*ne_y
750 tilefaceid_map(3,tileid) = 1
751 end if
752 end do
753 end if
754
755 if (isperiodicz) then
756 do tileid=1, ntile
757 if (pk_table(tileid) == 1 .and. tilefaceid_map(5,tileid) == 5) then
758 tileid_map(5,tileid) = pi_table(tileid) + (pj_table(tileid) - 1)*ne_x + (ne_z - 1)*ne_x*ne_y
759 tilefaceid_map(5,tileid) = 6
760 end if
761 if (pk_table(tileid) == ne_z .and. tilefaceid_map(6,tileid) == 6) then
762 tileid_map(6,tileid) = pi_table(tileid) + (pj_table(tileid) - 1)*ne_x
763 tilefaceid_map(6,tileid) = 5
764 end if
765 end do
766 end if
767
768 return
769
770 !--
771 ! if (PRC_isMaster) then
772 ! write(*,*) "TotTile", Ntile
773 ! do tileID = 1, Ntile
774 ! write(*,*) "tileID:", tileID, ", EtoV:", EtoV(tileID,:)
775 ! end do
776 ! write(*,*) "-----------"
777 ! do tileID = 1, Ntile
778 ! write(*,*) "tileID:", tileID, ", EtoE:", EtoE(tileID,:)
779 ! end do
780 ! write(*,*) "-----------"
781 ! do tileID = 1, Ntile
782 ! write(*,*) "tileID:", tileID, ", EtoF:", EtoF(tileID,:)
783 ! end do
784 ! end if
785
786 end subroutine meshutil3d_buildglobalmap
787
788end module scale_meshutil_3d
module FElib / Mesh / utility for 3D mesh
subroutine, public meshutil3d_buildglobalmap(panelid_table, pi_table, pj_table, pk_table, tileid_map, tilefaceid_map, tilepanelid_map, ntile, ntileface, ntilevertex, isperiodicx, isperiodicy, isperiodicz, ne_x, ne_y, ne_z)
subroutine, public meshutil3d_buildinteriormap(vmapm, vmapp, mapm, mapp, pos_en, pos_ev, etoe, etof, etov, fmask_h, fmask_v, ne, nv, np, nfp_h, nfp_v, nfptot, nfaces_h, nfaces_v, nfaces)
subroutine, public meshutil3d_genconnectivity(etoe, etof, etov, ne, nfaces)
subroutine, public meshutil3d_gencubedomain(pos_v, etov, ke_x, xmin, xmax, ke_y, ymin, ymax, ke_z, zmin, zmax, fz)
subroutine, public meshutil3d_genpatchboundarymap(vmapb, mapb, vmapp, pos_en, xmin, xmax, ymin, ymax, zmin, zmax, fmask_h, fmask_v, ne, nv, np, nfp_h, nfp_v, nfptot, nfaces_h, nfaces_v, nfaces)
Module common / sort algorithm.