ADflow  v1.0
ADflow is a finite volume RANS solver tailored for gradient-based aerodynamic design optimization.
actuatorRegion.F90
Go to the documentation of this file.
2 
3  use constants
6  implicit none
7 
8 contains
9 
10  subroutine computeactuatorregionvolume(nn, iRegion)
11  use blockpointers, only: ndom, vol
12  implicit none
13 
14  ! Inputs
15  integer(kind=intType), intent(in) :: nn, iRegion
16 
17  ! Working
18  integer(kind=intType) :: iii
19  integer(kind=intType) :: i, j, k
20 
21  ! Loop over the region for this block
22  do iii = actuatorregions(iregion)%blkPtr(nn - 1) + 1, actuatorregions(iregion)%blkPtr(nn)
23  i = actuatorregions(iregion)%cellIDs(1, iii)
24  j = actuatorregions(iregion)%cellIDs(2, iii)
25  k = actuatorregions(iregion)%cellIDs(3, iii)
26 
27  ! Sum the volume of each cell within the region on this proc
28  actuatorregions(iregion)%volLocal = actuatorregions(iregion)%volLocal + vol(i, j, k)
29  end do
30 
31  end subroutine computeactuatorregionvolume
32 
33  ! ----------------------------------------------------------------------
34  ! |
35  ! No Tapenade Routine below this line |
36  ! |
37  ! ----------------------------------------------------------------------
38 
39 #ifndef USE_TAPENADE
40  subroutine addactuatorregion(pts, conn, axis1, axis2, famName, famID, &
41  thrust, torque, heat, relaxStart, relaxEnd, nPts, nConn)
42  ! Add a user-supplied integration surface.
43 
45  use constants
48  use adtutils, only: stack
49  use adtdata
50  use blockpointers, only: x, il, jl, kl, ndom, iblank, vol
51  use adjointvars, only: ncellslocal
52  use utils, only: setpointers, echk
53  implicit none
54 
55  ! Input variables
56  integer(kind=intType), intent(in) :: nPts, nConn, famID
57  real(kind=realtype), dimension(3, nPts), intent(in), target :: pts
58  integer(kind=intType), dimension(4, nConn), intent(in), target :: conn
59  real(kind=realtype), intent(in), dimension(3) :: axis1, axis2
60  character(len=*) :: famName
61  real(kind=realtype) :: thrust, torque, heat, relaxstart, relaxend
62 
63  ! Working variables
64  integer(kind=intType) :: i, j, k, nn, iDim, cellID, intInfo(3), sps, level, iii, ierr
65  real(kind=realtype) :: dstar, frac, vollocal
66  type(actuatorregiontype), pointer :: region
67  real(kind=realtype), dimension(3) :: minx, maxx, v1, v2, v3, xcen, axisvec
68  type(adttype) :: adt
69  real(kind=realtype) :: axisvecnorm
70  real(kind=realtype), dimension(:, :), allocatable :: norm
71  integer(kind=intType), dimension(:), allocatable :: normcount
72  integer(kind=intType), dimension(:, :), pointer :: tmp
73 
74  ! ADT Type required data
75  integer(kind=intType), dimension(:), pointer :: frontleaves, frontleavesnew
76  type(adtbboxtargettype), dimension(:), pointer :: BB
77  real(kind=realtype) :: coor(4), uvw(5)
78  real(kind=realtype) :: dummy(3, 2)
79 
82  print *, "Error: Exceeded the maximum number of actuatorDiskRegions. "&
83  &"Increase nActuatorDiskRegionsMax"
84  stop
85  end if
86 
87  ! Save the input information
89  region%famName = famname
90  region%famID = famid
91  region%torque = torque
92  region%heat = heat
93  region%relaxStart = relaxstart
94  region%relaxEnd = relaxend
95  ! We use the axis to define the direction of F. Since we are
96  ! dealing with rotating machinary, it is pretty good approximation
97  ! to assume that the thrust is going to be in the direction of the
98  ! axis.
99  axisvec = axis2 - axis1
100  axisvecnorm = sqrt((axisvec(1)**2 + axisvec(2)**2 + axisvec(3)**2))
101  if (axisvecnorm < 1e-12) then
102  print *, "Error: Axis cannot be determined by the supplied points. They are too close"
103  stop
104  end if
105 
106  axisvec = axisvec / axisvecnorm
107 
108  region%force = axisvec * thrust
109  region%axisVec = axisvec
110 
111  allocate (region%blkPtr(0:ndom))
112  region%blkPtr(0) = 0
113 
114  ! Next thing we need to do is to figure out if any of our cells
115  ! are inside the actuator disk region. If so we will save them in
116  ! the actuatorRegionType data structure
117 
118  ! Since this is effectively a wall-distance calc it gets super
119  ! costly for the points far away. Luckly, we can do a fairly
120  ! simple shortcut: Just compute the bounding box of the region and
121  ! use that as the "already found" distance in the cloest point
122  ! search. This will eliminate all the points further away
123  ! immediately and this should be sufficiently fast.
124 
125  ! So...compute that bounding box:
126  do idim = 1, 3
127  minx(idim) = minval(pts(idim, :))
128  maxx(idim) = maxval(pts(idim, :))
129  end do
130 
131  ! Get the max distance. This should be quite conservative.
132  dstar = (maxx(1) - minx(1))**2 + (maxx(2) - minx(2))**2 + (maxx(3) - minx(3))**2
133 
134  ! Now build the tree.
135  call buildserialquad(size(conn, 2), size(pts, 2), pts, conn, adt)
136 
137  ! Compute the (averaged) unique nodal vectors:
138  allocate (norm(3, size(pts, 2)), normcount(size(pts, 2)))
139 
140  norm = zero
141  normcount = 0
142 
143  do i = 1, size(conn, 2)
144 
145  ! Compute cross product normal and normalize
146  v1 = pts(:, conn(3, i)) - pts(:, conn(1, i))
147  v2 = pts(:, conn(4, i)) - pts(:, conn(2, i))
148 
149  v3(1) = (v1(2) * v2(3) - v1(3) * v2(2))
150  v3(2) = (v1(3) * v2(1) - v1(1) * v2(3))
151  v3(3) = (v1(1) * v2(2) - v1(2) * v2(1))
152  v3 = v3 / sqrt(v3(1)**2 + v3(2)**2 + v3(3)**2)
153 
154  ! Add to each of the four pts and increment the number added
155  do j = 1, 4
156  norm(:, conn(j, i)) = norm(:, conn(j, i)) + v3
157  normcount(conn(j, i)) = normcount(conn(j, i)) + 1
158  end do
159  end do
160 
161  ! Now just divide by the norm count
162  do i = 1, size(pts, 2)
163  norm(:, i) = norm(:, i) / normcount(i)
164  end do
165 
166  ! Norm count is no longer needed
167  deallocate (normcount)
168 
169  ! Allocate the extra data the tree search requires.
170  allocate (stack(100), bb(20), frontleaves(25), frontleavesnew(25))
171 
172  ! Allocate sufficient space for the maximum possible number of cellIDs
173  allocate (region%cellIDs(3, ncellslocal(1)))
174 
175  ! Now search for all the coordinate. Note that We have explictly
176  ! set sps to 1 becuase it is only implemented for single grid.
177  sps = 1
178  level = 1
179 
180  do nn = 1, ndom
181  call setpointers(nn, level, sps)
182  do k = 2, kl
183  do j = 2, jl
184  do i = 2, il
185  ! Only check real cells
186  if (iblank(i, j, k) == 1) then
187  ! Compute the cell center
188  xcen = eighth * (x(i - 1, j - 1, k - 1, :) + x(i, j - 1, k - 1, :) &
189  + x(i - 1, j, k - 1, :) + x(i, j, k - 1, :) &
190  + x(i - 1, j - 1, k, :) + x(i, j - 1, k, :) &
191  + x(i - 1, j, k, :) + x(i, j, k, :))
192 
193  ! The current point to search for and continually
194  ! reset the "closest point already found" variable.
195  coor(1:3) = xcen
196  coor(4) = dstar
197  intinfo(3) = 0
198  call mindistancetreesearchsinglepoint(adt, coor, intinfo, &
199  uvw, dummy, 0, bb, frontleaves, frontleavesnew)
200  cellid = intinfo(3)
201  if (cellid > 0) then
202  ! Now check if this was successful or now:
203  if (checkinside()) then
204  ! Whoohoo! We are inside the region. Add this cell
205  ! to the list.
206  region%nCellIDs = region%nCellIDs + 1
207  region%cellIDs(:, region%nCellIDs) = (/i, j, k/)
208  end if
209  end if
210  end if
211  end do
212  end do
213  end do
214  ! Since we're doing all the blocks in order, simply store the
215  ! current counter into blkPtr which gives up the range of cells
216  ! we have found on this block
217  region%blkPtr(nn) = region%nCellIDs
218 
219  end do
220 
221  ! Resize the cellIDs to the correct size now that we know the
222  ! correct exact number.
223  tmp => region%cellIDs
224  allocate (region%cellIDs(3, region%nCellIDs))
225  region%cellIDs = tmp(:, 1:region%nCellIDs)
226  deallocate (tmp)
227 
228  ! Now go back and generate the total volume of the the cells we've flagged
229  vollocal = zero
230 
231  do nn = 1, ndom
232  call setpointers(nn, level, sps)
233 
234  ! Loop over the region for this block
235  do iii = region%blkPtr(nn - 1) + 1, region%blkPtr(nn)
236  i = region%cellIDs(1, iii)
237  j = region%cellIDs(2, iii)
238  k = region%cellIDs(3, iii)
239  vollocal = vollocal + vol(i, j, k)
240  end do
241  end do
242 
243  call mpi_allreduce(vollocal, region%volume, 1, adflow_real, &
244  mpi_sum, adflow_comm_world, ierr)
245  call echk(ierr, __file__, __line__)
246 
247  ! Final memory cleanup
248  deallocate (stack, norm, frontleaves, frontleavesnew, bb)
249  call destroyserialquad(adt)
250  contains
251 
252  function checkinside()
253 
254  implicit none
255  logical :: checkinside
256  integer(kind=intType) :: jj
257  real(kind=realtype) :: shp(4), xp(3), normal(3), v1(3), dp
258 
259  ! bi-linear shape functions (CCW ordering)
260  shp(1) = (one - uvw(1)) * (one - uvw(2))
261  shp(2) = (uvw(1)) * (one - uvw(2))
262  shp(3) = (uvw(1)) * (uvw(2))
263  shp(4) = (one - uvw(1)) * (uvw(2))
264 
265  xp = zero
266  normal = zero
267  do jj = 1, 4
268  xp = xp + shp(jj) * pts(:, conn(jj, cellid))
269  normal = normal + shp(jj) * norm(:, conn(jj, cellid))
270  end do
271 
272  ! Compute the dot product of normal with cell center
273  ! (stored in coor) with the point on the surface.
274  v1 = coor(1:3) - xp
275  dp = normal(1) * v1(1) + normal(2) * v1(2) + normal(3) * v1(3)
276 
277  if (dp < zero) then
278  checkinside = .true.
279  else
280  checkinside = .false.
281  end if
282  end function checkinside
283  end subroutine addactuatorregion
284 
285  subroutine writeactuatorregions(fileName)
286 
287  ! This a (mostly) debug routine that is used to verify to the user
288  ! the that the cells that the user thinks should be specified as
289  ! being inside the actuator region actually are. We will dump a
290  ! hex unstructured ascii tecplot file with all the zones we
291  ! found. We won't be super concerned about efficiency here.
292 
293  use constants
294  use utils, only: echk, pointreduce, setpointers
296  use blockpointers, only: x, ndom
297  use commonformats, only: sci12
298  implicit none
299 
300  ! Input
301  character(len=*) :: fileName
302 
303  ! Working
304  integer(kind=intType) :: iRegion, nn, i, j, k, ii, jj, kk, iii, kkk, iDim
305  integer(kind=intType) :: level, sps, iProc, ierr, totalCount, offset, nUnique
306  integer(kind=intType), dimension(:), allocatable :: sizesProc, cumSizesProc
307  real(kind=realtype), dimension(:), allocatable :: pts, allpts
308  real(kind=realtype), dimension(:, :), allocatable :: tmp, uniquepts
309  real(kind=realtype), parameter :: tol = 1e-8
310  integer(kind=intType), dimension(:), allocatable :: conn, allConn, link
311  character(80) :: zoneName
312  type(actuatorregiontype), pointer :: region
313 
314  ! Before we start the main region loop the root procesoor has to
315  ! open up the tecplot file and write the header
316 
317  if (myid == 0) then
318  open (unit=101, file=trim(filename), form='formatted')
319  write (101, *) 'TITLE = "Actuator Regions"'
320  write (101, *) 'Variables = "CoordinateX", "CoordinateY", "CoordinateZ"'
321  end if
322 
323  ! Region Loop
324  regionloop: do iregion = 1, nactuatorregions
325 
326  ! Only for the finest grid level.
327  level = 1
328  sps = 1
329 
330  ! Do an allgather with the number of actuator cells on each
331  ! processor so that everyone knows the sizes and can compute the offsets,
332  region => actuatorregions(iregion)
333 
334  allocate (sizesproc(nproc), cumsizesproc(0:nproc))
335 
336  call mpi_allgather(region%nCellIDs, 1, adflow_integer, sizesproc, 1, &
337  adflow_integer, adflow_comm_world, ierr)
338  call echk(ierr, __file__, __line__)
339 
340  cumsizesproc(0) = 0
341  do iproc = 1, nproc
342  cumsizesproc(iproc) = cumsizesproc(iproc - 1) + sizesproc(iproc)
343  end do
344 
345  ! Fill up our own nodes/conn with the nodes we have here.
346  allocate (conn(8 * region%nCellIDs), pts(24 * region%nCellIDs))
347 
348  kkk = 0
349  do nn = 1, ndom
350  call setpointers(nn, level, sps)
351  ! Loop over the ranges for this block
352  do iii = region%blkPtr(nn - 1) + 1, region%blkPtr(nn)
353 
354  ! Carful with the conn values! They need to be in counter clock wise ordering!
355  offset = (iii - 1) * 8 + cumsizesproc(myid) * 8
356  conn((iii - 1) * 8 + 1) = 1 + offset
357  conn((iii - 1) * 8 + 2) = 2 + offset
358  conn((iii - 1) * 8 + 3) = 4 + offset
359  conn((iii - 1) * 8 + 4) = 3 + offset
360  conn((iii - 1) * 8 + 5) = 5 + offset
361  conn((iii - 1) * 8 + 6) = 6 + offset
362  conn((iii - 1) * 8 + 7) = 8 + offset
363  conn((iii - 1) * 8 + 8) = 7 + offset
364 
365  ! Add in the 24 values for the nodal coordinates in coordinate
366  ! ordering. Do all the coordinates interlaced
367  do kk = -1, 0
368  do jj = -1, 0
369  do ii = -1, 0
370  do idim = 1, 3
371  i = region%cellIDs(1, iii)
372  j = region%cellIDs(2, iii)
373  k = region%cellIDs(3, iii)
374  kkk = kkk + 1
375  pts(kkk) = x(i + ii, j + jj, k + kk, idim)
376  end do
377  end do
378  end do
379  end do
380  end do
381  end do
382 
383  ! Now that we've filled up our array, we can allocate the total
384  ! space we need on the root proc and it
385  if (myid == 0) then
386  totalcount = sum(sizesproc)
387  allocate (allconn(8 * totalcount), allpts(24 * totalcount))
388  end if
389 
390  ! Perform the two gatherV's
391  call mpi_gatherv(pts, region%nCellIDs * 24, adflow_real, &
392  allpts, 24 * sizesproc, 24 * cumsizesproc, adflow_real, &
393  0, adflow_comm_world, ierr)
394  call echk(ierr, __file__, __line__)
395 
396  call mpi_gatherv(conn, region%nCellIDs * 8, adflow_integer, &
397  allconn, 8 * sizesproc, 8 * cumsizesproc, adflow_integer, &
398  0, adflow_comm_world, ierr)
399  call echk(ierr, __file__, __line__)
400 
401  ! We can deallocate all the per-proc memory now
402  deallocate (sizesproc, cumsizesproc, pts, conn)
403 
404  if (myid == 0) then
405 
406  ! Now the poor root processor dumps everything out to a
407  ! file. To help cut down on the already bloated file size,
408  ! we'll point reduce it which will help tecplot display them
409  ! better as well.
410 
411  allocate (tmp(3, totalcount * 8))
412  do i = 1, totalcount * 8
413  do idim = 1, 3
414  tmp(idim, i) = allpts((i - 1) * 3 + idim)
415  end do
416  end do
417  deallocate (allpts)
418  allocate (uniquepts(3, totalcount * 8), link(totalcount * 8))
419 
420  ! Get unique set of nodes.
421  call pointreduce(tmp, totalcount * 8, tol, uniquepts, link, nunique)
422 
423  write (zonename, "(a,a,a)") 'Zone T="', trim(region%famName), ' Region"'
424  write (101, *) trim(zonename)
425  write (101, *) "Nodes = ", nunique, " Elements= ", totalcount, " ZONETYPE=FEBRICK"
426  write (101, *) "DATAPACKING=BLOCK, VARLOCATION=([1,2,3]=NODAL, [4]=CELLCENTERED)"
427 
428  ! Write all the coordinates...this is horrendously slow...
429  do idim = 1, 3
430  do i = 1, nunique
431  write (101, sci12) uniquepts(idim, i)
432  end do
433  end do
434 
435  ! Write out the connectivity
436  do i = 1, totalcount
437  do j = 1, 8
438  write (101, "(I8)", advance='no') link(allconn((i - 1) * 8 + j))
439  end do
440  write (101, "(1x)")
441  end do
442 
443  ! Ditch the memory only allocated on this proc
444  deallocate (allconn, link, tmp, uniquepts)
445  end if
446  end do regionloop
447 
448  ! Close the output file on the root proc
449  if (myid == 0) then
450  close (101)
451  end if
452  end subroutine writeactuatorregions
453 
454  subroutine integrateactuatorregions(localValues, famList, sps)
455  !--------------------------------------------------------------
456  ! Manual Differentiation Warning: Modifying this routine requires
457  ! modifying the hand-written forward and reverse routines.
458  ! --------------------------------------------------------------
459 
460  ! Perform volume integrals over the actuator region.
461  use constants
462  use blockpointers, only: vol, dw, w, ndom
463  use flowvarrefstate, only: pref, uref
464  use utils, only: setpointers
465  use sorting, only: faminlist
466  use residuals, only: sourceterms_block
468  use communication
469  ! Input/output Variables
470  real(kind=realtype), dimension(nLocalValues), intent(inout) :: localvalues
471  integer(kind=intType), dimension(:), intent(in) :: famList
472  integer(kind=intType), intent(in) :: sps
473 
474  ! Working
475  integer(kind=intType) :: nn, iRegion
476  real(kind=realtype) :: plocal, plocald
477  ! Zero the accumulation variable. We comptue flow power across
478  ! 'all' actuaor zones. The famInclude is used to section out which
479  ! one we want.
480  plocal = zero
481 
482  domainloop: do nn = 1, ndom
483  call setpointers(nn, 1, sps)
484 
485  ! Loop over each region
486  regionloop: do iregion = 1, nactuatorregions
487 
488  ! Check if this needs to be included:
489  faminclude: if (faminlist(actuatorregions(iregion)%famID, famlist)) then
490 
491  ! If so, call the regular sourceTerms_block routine
492  call sourceterms_block(nn, .false., iregion, plocal)
493 
494  end if faminclude
495  end do regionloop
496  end do domainloop
497 
498  ! Add in the contribution from this processor.
499  localvalues(ipower) = localvalues(ipower) + plocal
500 
501  end subroutine integrateactuatorregions
502 #ifndef USE_COMPLEX
503  subroutine integrateactuatorregions_d(localValues, localValuesd, famList, sps)
504  !--------------------------------------------------------------
505  ! Manual Differentiation Warning: Modifying this routine requires
506  ! modifying the hand-written forward and reverse routines.
507  ! --------------------------------------------------------------
508 
509  ! Perform volume integrals over the actuator region.
510  use constants
511  use blockpointers, only: vol, dw, w, ndom
512  use flowvarrefstate, only: pref, uref
513  use utils, only: setpointers_d
514  use sorting, only: faminlist
517 
518  ! Input/output Variables
519  real(kind=realtype), dimension(nLocalValues), intent(inout) :: localvalues, localvaluesd
520  integer(kind=intType), dimension(:), intent(in) :: famList
521  integer(kind=intType), intent(in) :: sps
522 
523  ! Working
524  integer(kind=intType) :: nn, iRegion
525  real(kind=realtype) :: plocal, plocald
526 
527  ! Zero the accumulation variable. We comptue flow power across
528  ! 'all' actuaor zones. The famInclude is used to section out which
529  ! one we want.
530  plocal = zero
531  plocald = zero
532 
533  domainloop: do nn = 1, ndom
534  call setpointers_d(nn, 1, sps)
535 
536  ! Loop over each region
537  regionloop: do iregion = 1, nactuatorregions
538 
539  ! Check if this needs to be included:
540  faminclude: if (faminlist(actuatorregions(iregion)%famID, famlist)) then
541 
542  ! If so, call the regular sourceTerms_block routine
543  call sourceterms_block_d(nn, .false., iregion, plocal, plocald)
544 
545  end if faminclude
546  end do regionloop
547  end do domainloop
548 
549  ! Add in the contribution from this processor.
550  localvalues(ipower) = localvalues(ipower) + plocal
551  localvaluesd(ipower) = localvaluesd(ipower) + plocald
552 
553  end subroutine integrateactuatorregions_d
554 
555  subroutine integrateactuatorregions_b(localValues, localValuesd, famList, sps)
556  !--------------------------------------------------------------
557  ! Manual Differentiation Warning: Modifying this routine requires
558  ! modifying the hand-written forward and reverse routines.
559  ! --------------------------------------------------------------
560 
561  ! Perform volume integrals over the actuator region.
562  use constants
563  use blockpointers, only: vol, dw, w, ndom
564  use flowvarrefstate, only: pref, uref
565  use utils, only: setpointers_b
566  use sorting, only: faminlist
569 
570  ! Input/output Variables
571  real(kind=realtype), dimension(nLocalValues), intent(inout) :: localvalues, localvaluesd
572  integer(kind=intType), dimension(:), intent(in) :: famList
573  integer(kind=intType), intent(in) :: sps
574 
575  ! Working
576  integer(kind=intType) :: nn, iRegion
577  real(kind=realtype) :: plocal, plocald
578 
579  ! Zero the accumulation variable. We comptue flow power across
580  ! 'all' actuaor zones. The famInclude is used to section out which
581  ! one we want.
582  plocal = zero
583  plocald = zero
584 
585  ! Pull out the seed
586  plocald = localvaluesd(ipower)
587 
588  domainloop: do nn = 1, ndom
589  call setpointers_b(nn, 1, sps)
590 
591  ! Loop over each region
592  regionloop: do iregion = 1, nactuatorregions
593 
594  ! Check if this needs to be included:
595  faminclude: if (faminlist(actuatorregions(iregion)%famID, famlist)) then
596 
597  ! If so, call the regular sourceTerms_block routine
598  call sourceterms_block_b(nn, .false., iregion, plocal, plocald)
599 
600  end if faminclude
601  end do regionloop
602  end do domainloop
603  end subroutine integrateactuatorregions_b
604 
605 #endif
606 #endif
607 end module actuatorregion
subroutine checkinside()
subroutine addactuatorregion(pts, conn, axis1, axis2, famName, famID, thrust, torque, heat, relaxStart, relaxEnd, nPts, nConn)
subroutine writeactuatorregions(fileName)
subroutine computeactuatorregionvolume(nn, iRegion)
subroutine integrateactuatorregions_d(localValues, localValuesd, famList, sps)
subroutine integrateactuatorregions_b(localValues, localValuesd, famList, sps)
subroutine integrateactuatorregions(localValues, famList, sps)
type(actuatorregiontype), dimension(nactuatorregionsmax), target actuatorregions
integer(kind=inttype), parameter nactuatorregionsmax
integer(kind=inttype) nactuatorregions
integer(kind=inttype), dimension(maxlevels) ncellslocal
Definition: ADjointVars.F90:40
subroutine destroyserialquad(ADT)
Definition: adtBuild.F90:1404
subroutine buildserialquad(nQuad, nNodes, coor, quadsConn, ADT)
Definition: adtBuild.F90:1278
subroutine mindistancetreesearchsinglepoint(ADT, coor, intInfo, uvw, arrDonor, nInterpol, BB, frontLeaves, frontLeavesNew)
integer(kind=inttype), dimension(:), pointer stack
Definition: adtUtils.F90:20
integer(kind=inttype) jl
real(kind=realtype), dimension(:, :, :, :), pointer w
integer(kind=inttype), dimension(:, :, :), pointer iblank
real(kind=realtype), dimension(:, :, :, :), pointer dw
real(kind=realtype), dimension(:, :, :), pointer vol
real(kind=realtype), dimension(:, :, :, :), pointer x
integer(kind=inttype) kl
integer(kind=inttype) il
character(len=maxstringlen) sci12
integer adflow_comm_world
real(kind=realtype), parameter zero
Definition: constants.F90:71
real(kind=realtype), parameter eighth
Definition: constants.F90:84
integer(kind=inttype), parameter ipower
Definition: constants.F90:455
real(kind=realtype), parameter one
Definition: constants.F90:72
real(kind=realtype) uref
real(kind=realtype) pref
subroutine sourceterms_block_b(nn, res, iregion, plocal, plocald)
subroutine sourceterms_block_d(nn, res, iregion, plocal, plocald)
subroutine sourceterms_block(nn, res, iRegion, pLocal)
Definition: residuals.F90:349
logical function faminlist(famID, famList)
Definition: sorting.F90:7
Definition: utils.F90:1
subroutine setpointers_d(nn, level, sps)
Definition: utils.F90:3564
subroutine pointreduce(pts, N, tol, uniquePts, link, nUnique)
Definition: utils.F90:4170
subroutine echk(errorcode, file, line)
Definition: utils.F90:5722
subroutine setpointers_b(nn, level, sps)
Definition: utils.F90:3553
subroutine setpointers(nn, mm, ll)
Definition: utils.F90:3237