FE-Project
Loading...
Searching...
No Matches
scale_meshutil_3d Module Reference

module FElib / Mesh / utility for 3D mesh More...

Functions/Subroutines

subroutine, public meshutil3d_gencubedomain (pos_v, etov, ke_x, xmin, xmax, ke_y, ymin, ymax, ke_z, zmin, zmax, fz)
subroutine, public meshutil3d_genconnectivity (etoe, etof, etov, ne, nfaces)
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_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)
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)

Detailed Description

module FElib / Mesh / utility for 3D mesh

Description
A module to provide subroutines for generating 3D mesh
Author
Yuta Kawai, Team SCALE

Function/Subroutine Documentation

◆ meshutil3d_gencubedomain()

subroutine, public scale_meshutil_3d::meshutil3d_gencubedomain ( real(rp), dimension((ke_x+1)*(ke_y+1)*(ke_z+1),3), intent(out) pos_v,
integer, dimension(ke_x*ke_y*ke_z,8), intent(out) etov,
integer, intent(in) ke_x,
real(rp), intent(in) xmin,
real(rp), intent(in) xmax,
integer, intent(in) ke_y,
real(rp), intent(in) ymin,
real(rp), intent(in) ymax,
integer, intent(in) ke_z,
real(rp), intent(in) zmin,
real(rp), intent(in) zmax,
real(rp), dimension(ke_z+1), intent(in), optional fz )

Definition at line 35 of file scale_meshutil_3d.F90.

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

Referenced by scale_mesh_cubedom3d::meshcubedom3d_init().

◆ meshutil3d_genconnectivity()

subroutine, public scale_meshutil_3d::meshutil3d_genconnectivity ( integer, dimension(ne, nfaces), intent(out) etoe,
integer, dimension(ne, nfaces), intent(out) etof,
integer, dimension(ne,8), intent(in) etov,
integer, intent(in) ne,
integer, intent(in) nfaces )

Definition at line 118 of file scale_meshutil_3d.F90.

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
Module common / sort algorithm.

Referenced by scale_mesh_cubedom3d::meshcubedom3d_init(), meshutil3d_buildglobalmap(), and scale_meshutil_cubedsphere3d::meshutilcubedsphere3d_buildglobalmap().

◆ meshutil3d_buildinteriormap()

subroutine, public scale_meshutil_3d::meshutil3d_buildinteriormap ( integer, dimension(nfptot,ne), intent(out) vmapm,
integer, dimension(nfptot,ne), intent(out) vmapp,
integer, dimension(nfptot,ne), intent(out) mapm,
integer, dimension(nfptot,ne), intent(out) mapp,
real(rp), dimension(np,ne,3), intent(in) pos_en,
real(rp), dimension(nv,3), intent(in) pos_ev,
integer, dimension(ne,nfaces), intent(in) etoe,
integer, dimension(ne,nfaces), intent(in) etof,
integer, dimension(ne,nv), intent(in) etov,
integer, dimension(nfp_h,nfaces_h), intent(in) fmask_h,
integer, dimension(nfp_v,nfaces_v), intent(in) fmask_v,
integer, intent(in) ne,
integer, intent(in) nv,
integer, intent(in) np,
integer, intent(in) nfp_h,
integer, intent(in) nfp_v,
integer, intent(in) nfptot,
integer, intent(in) nfaces_h,
integer, intent(in) nfaces_v,
integer, intent(in) nfaces )

Definition at line 261 of file scale_meshutil_3d.F90.

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

Referenced by scale_mesh_cubedom3d::meshcubedom3d_init().

◆ meshutil3d_genpatchboundarymap()

subroutine, public scale_meshutil_3d::meshutil3d_genpatchboundarymap ( integer, dimension(:), intent(inout), allocatable vmapb,
integer, dimension(:), intent(inout), allocatable mapb,
integer, dimension(nfptot,ne), intent(inout) vmapp,
real(rp), dimension(np,ne,3), intent(in) pos_en,
real(rp), intent(in) xmin,
real(rp), intent(in) xmax,
real(rp), intent(in) ymin,
real(rp), intent(in) ymax,
real(rp), intent(in) zmin,
real(rp), intent(in) zmax,
integer, dimension(nfp_h,nfaces_h), intent(in) fmask_h,
integer, dimension(nfp_v,nfaces_v), intent(in) fmask_v,
integer, intent(in) ne,
integer, intent(in) nv,
integer, intent(in) np,
integer, intent(in) nfp_h,
integer, intent(in) nfp_v,
integer, intent(in) nfptot,
integer, intent(in) nfaces_h,
integer, intent(in) nfaces_v,
integer, intent(in) nfaces )

Definition at line 475 of file scale_meshutil_3d.F90.

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

Referenced by scale_mesh_cubedom3d::meshcubedom3d_init().

◆ meshutil3d_buildglobalmap()

subroutine, public scale_meshutil_3d::meshutil3d_buildglobalmap ( integer, dimension(ntile), intent(out) panelid_table,
integer, dimension(ntile), intent(out) pi_table,
integer, dimension(ntile), intent(out) pj_table,
integer, dimension(ntile), intent(out) pk_table,
integer, dimension(ntileface,ntile), intent(out) tileid_map,
integer, dimension(ntileface,ntile), intent(out) tilefaceid_map,
integer, dimension(ntileface,ntile), intent(out) tilepanelid_map,
integer, intent(in) ntile,
integer, intent(in) ntileface,
integer, intent(in) ntilevertex,
logical, intent(in) isperiodicx,
logical, intent(in) isperiodicy,
logical, intent(in) isperiodicz,
integer, intent(in) ne_x,
integer, intent(in) ne_y,
integer, intent(in) ne_z )

Definition at line 641 of file scale_meshutil_3d.F90.

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

References meshutil3d_genconnectivity().

Referenced by scale_mesh_cubedom3d::meshcubedom3d_init().