ADflow  v1.0
ADflow is a finite volume RANS solver tailored for gradient-based aerodynamic design optimization.
surfaceUtils.F90
Go to the documentation of this file.
2 
3 contains
4 
5  subroutine getsurfacesize(sizeNode, sizeCell, famList, n, includeZipper)
6  ! Compute the number of points that will be returned from getForces
7  ! or getForcePoints
8  use constants
9  use blockpointers, only: bcdata, ndom, nbocos
10  use utils, only: setpointers
11  use sorting, only: faminlist
12  use surfacefamilies, only: bcfamgroups
14 
15  implicit none
16 
17  integer(kind=intType), intent(out) :: sizeNode, sizeCell
18  logical, intent(in) :: includeZipper
19  integer(kind=intType) :: nn, mm, i, j, iimax, shp(1)
20  integer(kind=intType) :: iBeg, iEnd, jBeg, jEnd, iBCGroup
21  integer(kind=intType), intent(in) :: n, famList(n)
22  type(zippermesh), pointer :: zipper
23  logical :: BCGroupNeeded
24  sizenode = 0_inttype
25  sizecell = 0_inttype
26 
27  domains: do nn = 1, ndom
28  call setpointers(nn, 1_inttype, 1_inttype)
29  bocos: do mm = 1, nbocos
30  ! Check if this surface should be included or not:
31  faminclude: if (faminlist(bcdata(mm)%famID, famlist)) then
32 
33  jbeg = bcdata(mm)%jnBeg; jend = bcdata(mm)%jnEnd
34  ibeg = bcdata(mm)%inBeg; iend = bcdata(mm)%inEnd
35  sizenode = sizenode + (iend - ibeg + 1) * (jend - jbeg + 1)
36 
37  ! If we don't care about blanking, it's easy:
38  blanking: if (.not. includezipper) then
39  sizecell = sizecell + (iend - ibeg) * (jend - jbeg)
40  else
41  ! Otherwise we have to consider the iBlank
42  do j = jbeg + 1, jend
43  do i = ibeg + 1, iend
44  if (bcdata(mm)%iBlank(i, j) == 1) then
45  sizecell = sizecell + 1
46  end if
47  end do
48  end do
49  end if blanking
50  end if faminclude
51  end do bocos
52  end do domains
53 
54  ! We know must consider additional nodes that are required by the
55  ! zipper mesh triangles on the root proc.
56 
57  ! No overset or we don't want to include the zipper, return immediately
58  if (.not. oversetpresent .or. .not. includezipper) then
59  return
60  end if
61 
62  ! If there are zipper meshes, we must include the nodes that the
63  ! zipper triangles will use.
64  do ibcgroup = 1, nfamexchange
65  bcgroupneeded = .false.
66  bcgroupfamloop: do j = 1, size(bcfamgroups(ibcgroup)%famList)
67  if (faminlist(bcfamgroups(ibcgroup)%famList(j), famlist)) then
68  bcgroupneeded = .true.
69  exit bcgroupfamloop
70  end if
71  end do bcgroupfamloop
72 
73  if (.not. bcgroupneeded) then
74  cycle
75  end if
76 
77  ! Pointer for easier reading.
78  zipper => zippermeshes(ibcgroup)
79 
80  ! If we don't have a zipper for this BCGroup, just keep going.
81  if (.not. zipper%allocated) then
82  cycle
83  end if
84 
85  ! Include the total extra number of nodes. Not necessairly all
86  ! nodes are needed, but they will be returned anyway.
87  sizenode = sizenode + size(zipper%indices)
88 
89  ! Include the extra number of cells. Not necessairly all cells
90  ! are needed, but here we have to check indvidually.
91 
92  do i = 1, size(zipper%fam)
93  if (faminlist(zipper%fam(i), famlist)) then
94  sizecell = sizecell + 1
95  end if
96  end do
97  end do
98 
99  end subroutine getsurfacesize
100 
101  subroutine getsurfaceconnectivity(conn, cgnsBlockID, ncell, famList, nFamList, includeZipper)
102  ! Return the connectivity list for the each of the patches
103  ! cgnsBlockID is the domain number of the CGNS file that each face patch corresponds to.
104  ! the zipper mesh patches will have cgnsBlockID = -1
105  use constants
107  use utils, only: setpointers
108  use sorting, only: faminlist
109  use surfacefamilies, only: bcfamgroups
111 
112  implicit none
113 
114  ! Input/Output
115  integer(kind=intType), intent(in) :: ncell
116  integer(kind=intType), intent(inout) :: conn(4 * ncell), cgnsBlockID(ncell)
117  integer(kind=intType), intent(in) :: nFamList, famList(nFamList)
118  logical, intent(in) :: includeZipper
119 
120  ! Working
121  integer(kind=intType) :: nn, mm, cellCount, nodeCount, ni, nj, i, j
122  integer(kind=intType) :: iBeg, iEnd, jBeg, jEnd, iBCGroup
123  logical regularOrdering, BCGroupNeeded
124  type(zippermesh), pointer :: zipper
125  cellcount = 0
126  nodecount = 0
127 
128  ! Initialize all cgns IDs to -1. This will take care of the zipper meshes IDs, which should
129  ! be -1 since they do not belong to the CGNS file.
130  cgnsblockid = -1
131 
132  domains: do nn = 1, ndom
133  call setpointers(nn, 1_inttype, 1_inttype)
134  bocos: do mm = 1, nbocos
135  faminclude: if (faminlist(bcdata(mm)%famID, famlist)) then
136 
137  jbeg = bcdata(mm)%jnBeg; jend = bcdata(mm)%jnEnd
138  ibeg = bcdata(mm)%inBeg; iend = bcdata(mm)%inEnd
139 
140  ni = iend - ibeg + 1
141  nj = jend - jbeg + 1
142 
143  ! We want to ensure that all the normals of the faces are
144  ! consistent. To ensure this, we enforce that all normals
145  ! are "into" the domain. Therefore we must treat difference
146  ! faces of a block differently. For example for an iLow
147  ! face, when looping over j-k in the regular way, results
148  ! in in a domain inward pointing normal for iLow but
149  ! outward pointing normal for iHigh. The same is true for
150  ! kMin and kMax. However, it is reverse for the J-faces:
151  ! This is becuase the way the pointers are extracted i then
152  ! k is the reverse of what "should" be for consistency. The
153  ! other two, the pointers are cyclic consistent: i,j->k,
154  ! j,k (wrap) ->i, but for the j-direction is is i,k->j when
155  ! to be consistent with the others it should be
156  ! k,i->j. Hope that made sense.
157 
158  select case (bcfaceid(mm))
159  case (imin, jmax, kmin)
160  regularordering = .true.
161  case default
162  regularordering = .false.
163  end select
164 
165  ! Now this can be reversed *again* if we have a block that
166  ! is left handed.
167  if (.not. righthanded) then
168  regularordering = .not. (regularordering)
169  end if
170 
171  if (regularordering) then
172  ! Do regular ordering.
173 
174  ! Loop over generic face size...Note we are doing zero
175  ! based ordering!
176 
177  ! This cartoon of a generic cell might help:
178  !
179  ! i, j+1 +-----+ i+1, j+1
180  ! n4 | | n3
181  ! +-----+
182  ! i,j i+1, j
183  ! n1 n2
184  !
185 
186  do j = 0, nj - 2
187  do i = 0, ni - 2
188  if (.not. includezipper .or. bcdata(mm)%iBlank(i + ibeg + 1, j + jbeg + 1) == 1) then
189  conn(4 * cellcount + 1) = nodecount + (j) * ni + i + 1! n1
190  conn(4 * cellcount + 2) = nodecount + (j) * ni + i + 1 + 1! n2
191  conn(4 * cellcount + 3) = nodecount + (j + 1) * ni + i + 1 + 1! n3
192  conn(4 * cellcount + 4) = nodecount + (j + 1) * ni + i + 1! n4
193 
194  ! Assign the corresponding block IDs.
195  ! Remember that nbkGlobal is the CGNS ID of the current domain,
196  ! and this is set when we call setPointers.
197  cgnsblockid(cellcount + 1) = nbkglobal
198 
199  cellcount = cellcount + 1
200  end if
201  end do
202  end do
203  else
204  ! Do reverse ordering:
205  do j = 0, nj - 2
206  do i = 0, ni - 2
207  if (.not. includezipper .or. bcdata(mm)%iBlank(i + ibeg + 1, j + jbeg + 1) == 1) then
208  conn(4 * cellcount + 1) = nodecount + (j) * ni + i + 1! n1
209  conn(4 * cellcount + 2) = nodecount + (j + 1) * ni + i + 1! n4
210  conn(4 * cellcount + 3) = nodecount + (j + 1) * ni + i + 1 + 1! n3
211  conn(4 * cellcount + 4) = nodecount + (j) * ni + i + 1 + 1! n2
212 
213  ! Assign the corresponding block IDs.
214  ! Remember that nbkGlobal is the CGNS ID of the current domain,
215  ! and this is set when we call setPointers.
216  cgnsblockid(cellcount + 1) = nbkglobal
217 
218  cellcount = cellcount + 1
219  end if
220  end do
221  end do
222  end if
223  nodecount = nodecount + ni * nj
224  end if faminclude
225  end do bocos
226  end do domains
227 
228  ! We know must consider additional connectivity required by the
229  ! zipper mesh triangles on the root proc
230 
231  ! No overset or don't want zipper return immediately
232  if (.not. oversetpresent .or. .not. includezipper) then
233  return
234  end if
235 
236  ! If there are zipper meshes, we must include the nodes that the
237  ! zipper triangles will use.
238  bcgrouploop: do ibcgroup = 1, nfamexchange
239 
240  bcgroupneeded = .false.
241  bcgroupfamloop: do i = 1, size(bcfamgroups(ibcgroup)%famList)
242  if (faminlist(bcfamgroups(ibcgroup)%famList(i), famlist)) then
243  bcgroupneeded = .true.
244  exit bcgroupfamloop
245  end if
246  end do bcgroupfamloop
247 
248  if (.not. bcgroupneeded) then
249  cycle
250  end if
251 
252  ! Pointer for easier reading.
253  zipper => zippermeshes(ibcgroup)
254 
255  ! If the zipper isn't done yet, don't do anything
256  if (.not. zipper%allocated) then
257  cycle
258  end if
259 
260  ! Include the extra number of cells. Not necessairly all cells
261  ! are needed, but ehre we have to check indvidually.
262 
263  do i = 1, size(zipper%fam)
264  if (faminlist(zipper%fam(i), famlist)) then
265  ! This triangle should be included. Note that we use
266  ! degenerate quads for the triangles.
267  conn(4 * cellcount + 1) = nodecount + zipper%conn(1, i)
268  conn(4 * cellcount + 2) = nodecount + zipper%conn(2, i)
269  conn(4 * cellcount + 3) = nodecount + zipper%conn(3, i)
270  conn(4 * cellcount + 4) = nodecount + zipper%conn(3, i)
271  cellcount = cellcount + 1
272  end if
273  end do
274  end do bcgrouploop
275 
276  end subroutine getsurfaceconnectivity
277 
278  subroutine getsurfacefamily(elemFam, ncell, famList, nFamList, includeZipper)
279 
280  use constants
281  use blockpointers, only: ndom, nbocos, bcdata
282  use utils, only: setpointers
283  use sorting, only: faminlist
284  use surfacefamilies, only: bcfamgroups
286  implicit none
287 
288  ! Input/Output
289  integer(kind=intType), intent(in) :: ncell
290  integer(kind=intType), intent(inout) :: elemFam(nCell)
291  integer(kind=intType), intent(in) :: nFamList, famList(nFamList)
292  logical, intent(in) :: includeZipper
293 
294  ! Working
295  integer(kind=intType) :: nn, mm, cellCount, nodeCount, ni, nj, i, j
296  integer(kind=intType) :: iBeg, iEnd, jBeg, jEnd, iBCGroup
297  logical BCGroupNeeded
298  type(zippermesh), pointer :: zipper
299 
300  cellcount = 0
301  nodecount = 0
302 
303  domains: do nn = 1, ndom
304  call setpointers(nn, 1_inttype, 1_inttype)
305  bocos: do mm = 1, nbocos
306  faminclude: if (faminlist(bcdata(mm)%famID, famlist)) then
307 
308  jbeg = bcdata(mm)%jnBeg; jend = bcdata(mm)%jnEnd
309  ibeg = bcdata(mm)%inBeg; iend = bcdata(mm)%inEnd
310 
311  ni = iend - ibeg + 1
312  nj = jend - jbeg + 1
313  do j = 0, nj - 2
314  do i = 0, ni - 2
315  if (.not. includezipper .or. bcdata(mm)%iBlank(i + ibeg + 1, j + jbeg + 1) == 1) then
316  cellcount = cellcount + 1
317  elemfam(cellcount) = bcdata(mm)%famID
318  end if
319  end do
320  end do
321  nodecount = nodecount + ni * nj
322  end if faminclude
323  end do bocos
324  end do domains
325 
326  ! We know must consider additional elements quired by the zipper
327  ! mesh triangles on the root proc
328 
329  ! No overset or don't want zipper
330  if (.not. oversetpresent .or. .not. includezipper) then
331  return
332  end if
333 
334  ! If there are zipper meshes, we must include the nodes that the
335  ! zipper triangles will use.
336  bcgrouploop: do ibcgroup = 1, nfamexchange
337 
338  bcgroupneeded = .false.
339  bcgroupfamloop: do i = 1, size(bcfamgroups(ibcgroup)%famList)
340  if (faminlist(bcfamgroups(ibcgroup)%famList(i), famlist)) then
341  bcgroupneeded = .true.
342  exit bcgroupfamloop
343  end if
344  end do bcgroupfamloop
345 
346  if (.not. bcgroupneeded) then
347  cycle
348  end if
349 
350  ! Pointer for easier reading.
351  zipper => zippermeshes(ibcgroup)
352 
353  ! If the zipper isn't done yet, don't do anything
354  if (.not. zipper%allocated) then
355  cycle
356  end if
357 
358  ! Include the extra number of cells. Not necessairly all cells
359  ! are needed, but ehre we have to check indvidually.
360 
361  do i = 1, size(zipper%fam)
362  if (faminlist(zipper%fam(i), famlist)) then
363  ! This triangle should be included. Note that we use
364  ! degenerate quads for the triangles.
365  cellcount = cellcount + 1
366  elemfam(cellcount) = zipper%fam(i)
367  end if
368  end do
369  end do bcgrouploop
370  end subroutine getsurfacefamily
371 
372  subroutine getsurfacepoints(points, npts, sps_in, famList, nFamList, includeZipper)
373  use constants
374  use communication, only: myid
375  use blockpointers, only: ndom, bcdata, nbocos, x, bcfaceid, il, jl, kl
376  use bcpointers, only: xx
379  use sorting, only: faminlist
380  use utils, only: setpointers, echk, setbcpointers
381 #include <petsc/finclude/petsc.h>
382  use petsc
383  implicit none
384 
385  !
386  ! Local variables.
387  !
388  integer(kind=intType), intent(in) :: npts, sps_in
389  real(kind=realtype), intent(inout) :: points(3, npts)
390  integer(kind=intType), intent(in) :: nFamList, famList(nFamList)
391  logical, intent(in) :: includeZipper
392 
393  integer(kind=intType) :: mm, nn, i, j, ii, sps, iDim, jj, ierr
394  integer(kind=intType) :: iBeg, iEnd, jBeg, jEnd, iBCGroup
395  type(zippermesh), pointer :: zipper
396  type(familyexchange), pointer :: exch
397  logical :: BCGroupNeeded
398  real(kind=realtype), dimension(:), pointer :: localptr
399  sps = sps_in
400 
401  ii = 0
402  domains: do nn = 1, ndom
403  call setpointers(nn, 1_inttype, sps)
404 
405  ! Loop over the number of boundary subfaces of this block.
406  bocos: do mm = 1, nbocos
407 
408  faminclude: if (faminlist(bcdata(mm)%famID, famlist)) then
409 
410  ! NODE Based
411  jbeg = bcdata(mm)%jnBeg; jend = bcdata(mm)%jnEnd
412  ibeg = bcdata(mm)%inBeg; iend = bcdata(mm)%inEnd
413 
414  do j = jbeg, jend ! This is a node loop
415  do i = ibeg, iend ! This is a node loop
416  ii = ii + 1
417  select case (bcfaceid(mm))
418 
419  case (imin)
420  points(:, ii) = x(1, i, j, :)
421  case (imax)
422  points(:, ii) = x(il, i, j, :)
423  case (jmin)
424  points(:, ii) = x(i, 1, j, :)
425  case (jmax)
426  points(:, ii) = x(i, jl, j, :)
427  case (kmin)
428  points(:, ii) = x(i, j, 1, :)
429  case (kmax)
430  points(:, ii) = x(i, j, kl, :)
431  end select
432  end do
433  end do
434  end if faminclude
435  end do bocos
436  end do domains
437 
438  ! No overset or not zipper, return
439  if (.not. oversetpresent .or. .not. includezipper) then
440  return
441  end if
442 
443  ! If there are zipper meshes, we must include the nodes that the
444  ! zipper triangles will use.
445  do ibcgroup = 1, nfamexchange
446 
447  zipper => zippermeshes(ibcgroup)
448 
449  if (.not. zipper%allocated) then
450  cycle
451  end if
452 
453  exch => bcfamexchange(ibcgroup, sps)
454  bcgroupneeded = .false.
455  bcgroupfamloop: do i = 1, size(bcfamgroups(ibcgroup)%famList)
456  if (faminlist(bcfamgroups(ibcgroup)%famList(i), famlist)) then
457  bcgroupneeded = .true.
458  exit bcgroupfamloop
459  end if
460  end do bcgroupfamloop
461 
462  if (.not. bcgroupneeded) then
463  cycle
464  end if
465 
466  ! Now we know we *actually* need something from this BCGroup.
467 
468  ! Loop over each dimension individually since we have a scalar
469  ! scatter.
470  dimloop: do idim = 1, 3
471 
472  call vecgetarrayf90(exch%nodeValLocal, localptr, ierr)
473  call echk(ierr, __file__, __line__)
474  localptr = zero
475 
476  ! jj is the running counter through the pointer array.
477  jj = 0
478  do nn = 1, ndom
479  call setpointers(nn, 1_inttype, sps)
480  do mm = 1, nbocos
481  faminclude2: if (faminlist(bcdata(mm)%famID, exch%famList)) then
482  ibeg = bcdata(mm)%inBeg; iend = bcdata(mm)%inEnd
483  jbeg = bcdata(mm)%jnBeg; jend = bcdata(mm)%jnEnd
484  call setbcpointers(mm, .true.)
485  do j = jbeg, jend
486  do i = ibeg, iend
487  jj = jj + 1
488  localptr(jj) = xx(i + 1, j + 1, idim)
489  end do
490  end do
491  end if faminclude2
492  end do
493  end do
494 
495  ! Restore the pointer
496  call vecrestorearrayf90(exch%nodeValLocal, localptr, ierr)
497  call echk(ierr, __file__, __line__)
498 
499  ! Now scatter this to the zipper
500  call vecscatterbegin(zipper%scatter, exch%nodeValLocal, &
501  zipper%localVal, insert_values, scatter_forward, ierr)
502  call echk(ierr, __file__, __line__)
503 
504  call vecscatterend(zipper%scatter, exch%nodeValLocal, &
505  zipper%localVal, insert_values, scatter_forward, ierr)
506  call echk(ierr, __file__, __line__)
507 
508  ! The values we need are precisely what is in zipper%localVal
509  call vecgetarrayf90(zipper%localVal, localptr, ierr)
510  call echk(ierr, __file__, __line__)
511 
512  ! Just copy the received data into the points array. Only root proc.
513  if (myid == 0) then
514  points(idim, ii + 1:ii + size(localptr)) = localptr
515  end if
516  ! The values we need are precisely what is in zipper%localVal
517  call vecrestorearrayf90(zipper%localVal, localptr, ierr)
518  call echk(ierr, __file__, __line__)
519 
520  end do dimloop
521 
522  ! Increcment the running ii counter.
523  ii = ii + size(localptr)
524 
525  end do
526  end subroutine getsurfacepoints
527 
528  subroutine mapvector(vec1, n1, famList1, nf1, vec2, n2, famList2, nf2, includeZipper, nDim)
529 
530  ! Map one vector, vec1 of size (3,n1) defined on family list 'famList1' onto
531  ! vector, vec2, of size (3, n2) defined on family list 'famList2'
532 
533  ! This operation is actually pretty fast since it just requires a
534  ! single copy of surface-based data.
535  use constants
536  use blockpointers, onlY: ndom, flowdoms
537  use sorting, only: faminlist
538  use surfacefamilies, only: bcfamgroups
540 
541  implicit none
542 
543  ! Input/Output
544  integer(kind=intType) :: n1, n2, nf1, nf2, nDim
545  integer(kind=intType), intent(in) :: famList1(nf1), famList2(nf2)
546  real(kind=realtype), intent(in) :: vec1(ndim, n1)
547  real(kind=realtype), intent(inout) :: vec2(ndim, n2)
548  logical, intent(in) :: includeZipper
549 
550  ! Working
551  integer(kind=intType) :: i, k, ii, jj, nn, mm, iSize
552  integer(kind=intType) :: iBeg, iEnd, jBeg, jEnd, famID, iBCGroup
553  logical :: fam1Included, fam2Included
554  type(zippermesh), pointer :: zipper
555  logical :: BCGroupNeeed
556  ii = 0
557  jj = 0
558  domains: do nn = 1, ndom
559  ! Don't set pointers for speed
560 
561  ! Loop over the number of boundary subfaces of this block.
562  bocos: do mm = 1, flowdoms(nn, 1, 1)%nBocos
563  famid = flowdoms(nn, 1, 1)%BCdata(mm)%famID
564 
565  fam1included = faminlist(famid, famlist1)
566  fam2included = faminlist(famid, famlist2)
567 
568  jbeg = flowdoms(nn, 1, 1)%bcData(mm)%jnBeg
569  jend = flowdoms(nn, 1, 1)%bcData(mm)%jnEnd
570 
571  ibeg = flowdoms(nn, 1, 1)%bcData(mm)%inBeg
572  iend = flowdoms(nn, 1, 1)%bcData(mm)%inEnd
573  isize = (iend - ibeg + 1) * (jend - jbeg + 1)
574 
575  if (fam1included .and. fam2included) then
576  ! The two lists overlap so copy:
577  do k = 1, isize
578  vec2(:, k + jj) = vec1(:, k + ii)
579  end do
580  end if
581 
582  ! Finally increment the counters if the face had been inclded
583  if (fam1included) then
584  ii = ii + isize
585  end if
586 
587  if (fam2included) then
588  jj = jj + isize
589  end if
590 
591  end do bocos
592  end do domains
593 
594  ! As with the rest of the code we have to account for the zipper
595  ! mesh on the root proc.
596 
597  ! We know must consider additional nodes that are required by the
598  ! zipper mesh triangles on the root proc.
599 
600  ! No overset or don't want to include zipper, return immediately
601  if (.not. oversetpresent .or. .not. includezipper) then
602  return
603  end if
604 
605  ! If there are zipper meshes, we must include the nodes that the
606  ! zipper triangles will use.
607  bcgrouploop: do ibcgroup = 1, nfamexchange
608 
609  zipper => zippermeshes(ibcgroup)
610 
611  fam1included = .false.
612  fam2included = .false.
613  bcgroupfamloop: do i = 1, size(bcfamgroups(ibcgroup)%famList)
614  if (faminlist(bcfamgroups(ibcgroup)%famList(i), famlist1)) then
615  fam1included = .true.
616  end if
617  if (faminlist(bcfamgroups(ibcgroup)%famList(i), famlist2)) then
618  fam2included = .true.
619  end if
620  end do bcgroupfamloop
621 
622  ! This is the total number of nodes that this BCGroup has. It
623  ! is not further broken down by family group.
624  isize = size(zipper%indices)
625 
626  if (fam1included .and. fam2included) then
627  ! The two lists overlap so copy:
628  do k = 1, isize
629  if (k + ii <= n1) then
630  vec2(:, k + jj) = vec1(:, k + ii)
631  end if
632  end do
633  end if
634 
635  ! Finally increment the counters if this BCGroup had been included.
636  if (fam1included) then
637  ii = ii + isize
638  end if
639 
640  if (fam2included) then
641  jj = jj + isize
642  end if
643  end do bcgrouploop
644 
645  end subroutine mapvector
646 
647  subroutine getwalllist(wallList, nWallList, nFamTotal)
648 
649  ! Python wrapped utility function to return the list of families
650  ! that are walls to Python since we need that information in
651  ! Python for a few default values.
652 
653  use constants
654  use surfacefamilies, only: bcfamgroups
655  implicit none
656 
657  integer(kind=intType), intent(in) :: nFamtotal
658  integer(kind=intType), dimension(nFamTotal), intent(out) :: wallList
659  integer(kind=intType), intent(out) :: nWallList
660 
661  nwalllist = size(bcfamgroups(ibcgroupwalls)%famList)
662  walllist(1:nwalllist) = bcfamgroups(ibcgroupwalls)%famList
663 
664  end subroutine getwalllist
665 
666 end module surfaceutils
Definition: BCData.F90:1
real(kind=realtype), dimension(:, :, :), pointer xx
Definition: BCPointers.F90:16
integer(kind=inttype) jl
logical righthanded
integer(kind=inttype) nbkglobal
integer(kind=inttype), dimension(:), pointer bcfaceid
integer(kind=inttype) nbocos
real(kind=realtype), dimension(:, :, :, :), pointer x
integer(kind=inttype) kl
integer(kind=inttype) il
real(kind=realtype), parameter zero
Definition: constants.F90:71
integer(kind=inttype), parameter imax
Definition: constants.F90:293
integer(kind=inttype), parameter kmin
Definition: constants.F90:296
integer(kind=inttype), parameter jmax
Definition: constants.F90:295
integer(kind=inttype), parameter nfamexchange
Definition: constants.F90:317
integer(kind=inttype), parameter imin
Definition: constants.F90:292
integer(kind=inttype), parameter ibcgroupwalls
Definition: constants.F90:309
integer(kind=inttype), parameter kmax
Definition: constants.F90:297
integer(kind=inttype), parameter jmin
Definition: constants.F90:294
type(zippermesh), dimension(nfamexchange), target zippermeshes
Definition: overset.F90:376
logical oversetpresent
Definition: overset.F90:373
logical function faminlist(famID, famList)
Definition: sorting.F90:7
type(bcgrouptype), dimension(nfamexchange) bcfamgroups
type(familyexchange), dimension(:, :), allocatable, target bcfamexchange
subroutine mapvector(vec1, n1, famList1, nf1, vec2, n2, famList2, nf2, includeZipper, nDim)
subroutine getsurfacesize(sizeNode, sizeCell, famList, n, includeZipper)
Definition: surfaceUtils.F90:6
subroutine getsurfacefamily(elemFam, ncell, famList, nFamList, includeZipper)
subroutine getsurfacepoints(points, npts, sps_in, famList, nFamList, includeZipper)
subroutine getwalllist(wallList, nWallList, nFamTotal)
subroutine getsurfaceconnectivity(conn, cgnsBlockID, ncell, famList, nFamList, includeZipper)
Definition: utils.F90:1
subroutine setbcpointers(nn, spatialPointers)
Definition: utils.F90:882
subroutine echk(errorcode, file, line)
Definition: utils.F90:5722
subroutine setpointers(nn, mm, ll)
Definition: utils.F90:3237