24 logical,
intent(in) :: partitionOnly
45 if (partitiononly)
then
83 "Deallocation failure for fileIDs, gridFiles &
126 integer(kind=intType) :: ii, nn, restartID
128 character(len=7) :: integerString
129 character(len=maxStringLen) :: tmpName
151 call terminate(
"determineGridFileNames", &
152 "Memory allocation failure for fileIDs &
189 call terminate(
"determineGridFileNames", &
190 "Memory allocation failure for fileIDs &
200 read (
gridfile(ii + 1:), *) restartid
208 call terminate(
"determineGridFileNames", &
209 "Memory allocation failure for fileIDs &
213 write (integerstring,
"(i6)") restartid - nn + 1
214 integerstring = adjustl(integerstring)
220 else testmultipleunsteady
230 call terminate(
"determineGridFileNames", &
231 "Memory allocation failure for fileIDs &
236 end if testmultipleunsteady
241 open (unit=21, file=
gridfiles(nn), status=
"old", iostat=ierr)
255 call terminate(
"determineGridFileNames", &
256 "Grid file(s) could not be opened")
292 call terminate(
"determineGridFileNames", &
293 "Memory allocation failure for fileIDs &
306 write (integerstring,
"(i6)") nn
307 integerstring = adjustl(integerstring)
308 tmpname =
gridfile(:ii)//trim(integerstring)
310 open (unit=21, file=tmpname, status=
"old", iostat=ierr)
326 call terminate(
"determineGridFileNames", &
327 "Memory allocation failure for fileIDs &
334 write (integerstring,
"(i6)") nn
335 integerstring = adjustl(integerstring)
358 call terminate(
"determineGridFileNames", &
359 "Memory allocation failure for fileIDs &
364 end if testmultiplets
389 character(len=maxCGNSNameLen),
dimension(cgnsNDom) :: zoneNames
391 integer(kind=intType),
dimension(cgnsNDom) :: zoneNumbers
393 integer(kind=intType) :: i, j, k, ii
419 if (zonenumbers(ii) /= -1) &
421 "Error occurs only when two identical zone &
443 "donor name not found in sorted zone names")
445 cgnsdoms(i)%conn1to1(j)%donorBlock = zonenumbers(ii)
451 do j = 1,
cgnsdoms(i)%nNonMatchAbutting
455 do k = 1,
cgnsdoms(i)%connNonMatchAbutting(j)%nDonorBlocks
458 cgnsdoms(i)%connNonMatchAbutting(j)%donorNames(k), zonenames)
461 "donor name not found in sorted zone names")
463 cgnsdoms(i)%connNonMatchAbutting(j)%donorBlocks(k) = &
501 integer(kind=intType) :: ii, jj, mm, nn
502 integer(kind=intType) :: nSlidingFam, nSlidingBC, nSliding
503 integer(kind=intType) :: nDomainFam, nDomainBC
505 integer(kind=intType),
dimension(:),
allocatable :: famSlidingID
506 integer(kind=intType),
dimension(:, :),
allocatable :: bcSlidingID
507 integer(kind=intType),
dimension(:),
allocatable :: orID
509 character(len=maxStringLen) :: errorMessage
511 character(len=maxCGNSNameLen),
dimension(:),
allocatable :: &
513 character(len=maxCGNSNameLen),
dimension(:),
allocatable :: &
516 logical :: validInterface
532 nslidingfam = nslidingfam + 1
536 ndomainfam = ndomainfam + 1
543 if (
cgnsdoms(nn)%bocoInfo(mm)%actualFace .and. &
544 cgnsdoms(nn)%bocoInfo(mm)%familyID == 0)
then
546 select case (
cgnsdoms(nn)%bocoInfo(mm)%BCType)
548 nslidingbc = nslidingbc + 1
552 ndomainbc = ndomainbc + 1
566 call terminate(
"determineInterfaceIDs", &
567 "Domain interfaces are not allowed in &
575 nsliding = nslidingfam + nslidingbc
576 if (mod(nsliding, 2) == 1)
then
578 call terminate(
"determineInterfaceIDs", &
579 "Odd number of sliding mesh families found")
587 namessliding(nsliding), namessorted(nsliding), &
588 orid(nsliding), famslidingid(nslidingfam), &
589 bcslidingid(2, nslidingbc), stat=ierr)
591 call terminate(
"determineInterfaceIDs", &
592 "Memory allocation failure for names, IDs")
607 famslidingid(ii) = nn
625 if (
cgnsdoms(nn)%bocoInfo(mm)%actualFace .and. &
626 cgnsdoms(nn)%bocoInfo(mm)%familyID == 0)
then
628 select case (
cgnsdoms(nn)%bocoInfo(mm)%BCType)
631 namessliding(ii) =
cgnsdoms(nn)%bocoInfo(mm)%bocoName
632 bcslidingid(:, ii - nslidingfam) = (/nn, mm/)
649 namessorted(ii) = namessliding(ii)
663 if (orid(mm) /= -1)
then
667 write (errormessage,
stringspace)
"Family name", trim(namessliding(ii)),
"occurs more than once."
669 call terminate(
"determineInterfaceIDs", errormessage)
686 call terminate(
"determineInterfaceIDs", &
687 "Memory allocation failure for famIDsSliding")
709 validinterface = .true.
710 if (len_trim(namessorted(nn)) /= len_trim(namessorted(mm))) &
711 validinterface = .false.
713 jj = len_trim(namessorted(nn)) - 2
715 validinterface = .false.
716 else if (namessorted(nn) (:jj) /= namessorted(mm) (:jj))
then
717 validinterface = .false.
723 if (.not. validinterface)
then
724 write (errormessage,
stringspace)
"Family names", trim(namessliding(nn)),
"and", &
725 trim(namessliding(mm)),
"do not form a valid sliding mesh interface"
727 call terminate(
"determineInterfaceIDs", errormessage)
736 if (orid(mm) > nslidingfam)
then
737 jj = bcslidingid(2, orid(mm))
738 mm = bcslidingid(1, orid(mm))
739 cgnsdoms(mm)%bocoInfo(jj)%slidingID = -ii
741 mm = famslidingid(orid(mm))
745 if (orid(nn) > nslidingfam)
then
746 jj = bcslidingid(2, orid(nn))
747 nn = bcslidingid(1, orid(nn))
748 cgnsdoms(nn)%bocoInfo(jj)%slidingID = ii
750 nn = famslidingid(orid(nn))
762 if (
cgnsdoms(nn)%bocoInfo(mm)%actualFace .and. &
763 cgnsdoms(nn)%bocoInfo(mm)%familyID > 0 .and. &
766 cgnsdoms(nn)%bocoInfo(mm)%slidingID = &
775 deallocate (namessliding, namessorted, orid, &
776 famslidingid, bcslidingid, stat=ierr)
778 call terminate(
"determineInterfaceIDs", &
779 "Deallocation failure for names, IDs")
802 integer(kind=intType) :: i, j, k, l, m, n, cgnsId, sps
806 domains:
do n = 1,
ndom
813 allocate (
flowdoms(n, 1, sps)%iblank(0:i, 0:j, 0:k), &
814 flowdoms(n, 1, sps)%forcedRecv(0:i, 0:j, 0:k), &
815 flowdoms(n, 1, sps)%status(0:i, 0:j, 0:k), &
819 "Memory allocation failure for iblank")
852 real(kind=realtype),
parameter :: tol = 1.e-5_realtype
857 integer(kind=intType) :: nn
859 real(kind=realtype) :: tt, omega
860 real(kind=realtype) :: timeperiod
862 logical :: timeDetermined
872 timedetermined = .false.
880 timedetermined = .true.
891 if (timedetermined)
then
895 timedetermined = .true.
907 if (timedetermined)
then
911 timedetermined = .true.
923 if (timedetermined)
then
927 timedetermined = .true.
939 if (timedetermined)
then
943 timedetermined = .true.
955 if (timedetermined)
then
959 timedetermined = .true.
970 if (timedetermined)
then
974 timedetermined = .true.
999 if (timedetermined)
then
1015 testrotating:
if (
sections(nn)%rotating)
then
1020 omega = sqrt(
sections(nn)%rotRate(1)**2 &
1024 tt =
two *
pi / omega
1029 if (timedetermined)
then
1031 tt = abs(tt - timeperiod) / timeperiod
1035 "Rotational frequencies of the rotating &
1036 §ions are not identical.")
1045 timedetermined = .true.
1061 if (timedetermined)
return
1068 "Not possible to determine the periodic time &
1069 &for the time spectral method")
1090 real(kind=realtype),
intent(in) :: t1, t2
1094 integer(kind=intType),
parameter :: nmax = 100
1095 real(kind=realtype),
parameter :: tol = 1.e-5_realtype
1100 integer(kind=intType) :: n1, n2
1101 real(kind=realtype) :: tt1, tt2, tt, ratio
1126 "No common time periodic time found. &
1127 &Problem may not be periodic")
1156 integer(kind=intType) :: nn
1157 real(kind=realtype) :: tmp, theta, costheta, sintheta
1159 real(kind=realtype),
dimension(3) :: xt, yt, zt
1173 call terminate(
"timeRotMatricesSpectral", &
1174 "Memory allocation failure for &
1175 &rotMatrixSpectral")
1185 testunity:
if (.not.
sections(nn)%rotating .or. &
1218 if (abs(xt(2)) < 0.707107_realtype)
then
1230 tmp = xt(1) * yt(1) + xt(2) * yt(2) + xt(3) * yt(3)
1231 yt(1) = yt(1) - tmp * xt(1)
1232 yt(2) = yt(2) - tmp * xt(2)
1233 yt(3) = yt(3) - tmp * xt(3)
1237 tmp =
one / sqrt(yt(1)**2 + yt(2)**2 + yt(3)**2)
1244 zt(1) = xt(2) * yt(3) - xt(3) * yt(2)
1245 zt(2) = xt(3) * yt(1) - xt(1) * yt(3)
1246 zt(3) = xt(1) * yt(2) - xt(2) * yt(1)
1251 costheta = cos(theta)
1252 sintheta = sin(theta)
1267 + costheta * (yt(1) * yt(1) + zt(1) * zt(1))
1269 + costheta * (yt(1) * yt(2) + zt(1) * zt(2)) &
1270 - sintheta * (yt(1) * zt(2) - yt(2) * zt(1))
1272 + costheta * (yt(1) * yt(3) + zt(1) * zt(3)) &
1273 - sintheta * (yt(1) * zt(3) - yt(3) * zt(1))
1276 + costheta * (yt(1) * yt(2) + zt(1) * zt(2)) &
1277 + sintheta * (yt(1) * zt(2) - yt(2) * zt(1))
1279 + costheta * (yt(2) * yt(2) + zt(2) * zt(2))
1281 + costheta * (yt(2) * yt(3) + zt(2) * zt(3)) &
1282 - sintheta * (yt(2) * zt(3) - yt(3) * zt(2))
1285 + costheta * (yt(1) * yt(3) + zt(1) * zt(3)) &
1286 + sintheta * (yt(1) * zt(3) - yt(3) * zt(1))
1288 + costheta * (yt(2) * yt(3) + zt(2) * zt(3)) &
1289 + sintheta * (yt(2) * zt(3) - yt(3) * zt(2))
1291 + costheta * (yt(3) * yt(3) + zt(3) * zt(3))
1321 integer(kind=intType) :: nn, ll, i, j, k
1322 integer(kind=intType) :: il, jl, kl
1324 real(kind=realtype),
dimension(nSections) :: dt, t
1366 flowdoms(nn, 1, ll)%x(i, j, k, 1) =
flowdoms(nn, 1, 1)%x(i, j, k, 1)
1367 flowdoms(nn, 1, ll)%x(i, j, k, 2) =
flowdoms(nn, 1, 1)%x(i, j, k, 2)
1368 flowdoms(nn, 1, ll)%x(i, j, k, 3) =
flowdoms(nn, 1, 1)%x(i, j, k, 3)
1379 t(nn) = (ll - 1) * dt(nn)
1409 allocate (
iovar(nn, 1)%w(il, jl, kl, 3), stat=ierr)
1411 call terminate(
"fineGridSpectralCoor", &
1412 "Memory allocation failure for &
1418 iovar(nn, 1)%w(i, j, k, 1) =
flowdoms(nn, 1, 1)%x(i, j, k, 1)
1419 iovar(nn, 1)%w(i, j, k, 2) =
flowdoms(nn, 1, 1)%x(i, j, k, 2)
1420 iovar(nn, 1)%w(i, j, k, 3) =
flowdoms(nn, 1, 1)%x(i, j, k, 3)
1446 t(nn) = (ll - 1) * dt(nn)
1459 iovar(nn, ll)%w(i, j, k, 1) =
iovar(nn, ll)%w(i, j, k, 1) &
1461 iovar(nn, ll)%w(i, j, k, 2) =
iovar(nn, ll)%w(i, j, k, 2) &
1463 iovar(nn, ll)%w(i, j, k, 3) =
iovar(nn, ll)%w(i, j, k, 3) &
1466 flowdoms(nn, 1, 1)%x(i, j, k, 1) =
iovar(nn, 1)%w(i, j, k, 1)
1467 flowdoms(nn, 1, 1)%x(i, j, k, 2) =
iovar(nn, 1)%w(i, j, k, 2)
1468 flowdoms(nn, 1, 1)%x(i, j, k, 3) =
iovar(nn, 1)%w(i, j, k, 3)
1475 end do spectralloopread
1489 call terminate(
"fineGridSpectralCoor", &
1490 "Arti should do this interpolation stuff")
1496 deallocate (
iovar(nn, ll)%w, stat=ierr)
1498 call terminate(
"fineGridSpectralCoor", &
1499 "Deallocation failure for IOVar%w")
1533 integer(kind=intType),
intent(in) :: sps
1535 real(kind=realtype),
dimension(*),
intent(in) :: dtadvance
1539 integer(kind=intType) :: i, j, k, nn
1541 real(kind=realtype) :: displx, disply, displz
1542 real(kind=realtype) :: tnew, told
1543 real(kind=realtype) :: anglex, angley, anglez, dx, dy, dz
1544 real(kind=realtype) :: xix, xiy, xiz, etax, etay, etaz
1545 real(kind=realtype) :: zetax, zetay, zetaz, xp, yp, zp, t
1546 real(kind=realtype) :: phi, cosphi, sinphi, eta, zeta
1548 real(kind=realtype),
dimension(3) :: rotationpoint
1549 real(kind=realtype),
dimension(3, 3) :: rotationmatrix
1562 told = tnew - dtadvance(1)
1572 blockloop:
do nn = 1,
ndom
1591 xp =
x(i, j, k, 1) - rotationpoint(1)
1592 yp =
x(i, j, k, 2) - rotationpoint(2)
1593 zp =
x(i, j, k, 3) - rotationpoint(3)
1598 x(i, j, k, 1) = rotationmatrix(1, 1) * xp &
1599 + rotationmatrix(1, 2) * yp &
1600 + rotationmatrix(1, 3) * zp + rotationpoint(1)
1601 x(i, j, k, 2) = rotationmatrix(2, 1) * xp &
1602 + rotationmatrix(2, 2) * yp &
1603 + rotationmatrix(2, 3) * zp + rotationpoint(2)
1604 x(i, j, k, 3) = rotationmatrix(3, 1) * xp &
1605 + rotationmatrix(3, 2) * yp &
1606 + rotationmatrix(3, 3) * zp + rotationpoint(3)
1616 x(i, j, k, 1) =
x(i, j, k, 1) + displx
1617 x(i, j, k, 2) =
x(i, j, k, 2) + disply
1618 x(i, j, k, 3) =
x(i, j, k, 3) + displz
1640 t =
one / max(
eps, sqrt(anglex**2 + angley**2 + anglez**2))
1649 phi = xix * anglex + xiy * angley + xiz * anglez
1668 t = dx * xix + dy * xiy + dz * xiz
1676 etax =
x(i, j, k, 1) - xp
1677 etay =
x(i, j, k, 2) - yp
1678 etaz =
x(i, j, k, 3) - zp
1680 eta = sqrt(etax**2 + etay**2 + etaz**2)
1691 zetax = xiy * etaz - xiz * etay
1692 zetay = xiz * etax - xix * etaz
1693 zetaz = xix * etay - xiy * etax
1702 x(i, j, k, 1) = xp + eta * etax + zeta * zetax
1703 x(i, j, k, 2) = yp + eta * etay + zeta * zetay
1704 x(i, j, k, 3) = zp + eta * etaz + zeta * zetaz
1738 integer(kind=intType) :: nn, mm
1739 integer(kind=intType) :: il, jl, kl, ie, je, ke
1744 blockloop:
do nn = 1,
ndom
1761 allocate (
flowdoms(nn, 1, mm)%x(0:ie, 0:je, 0:ke, 3), stat=ierr)
1764 "Memory allocation failure for flowDoms%x")
1772 "Memory allocation failure for flowDoms%xInit")
1788 "Memory allocation failure for xOld")
1794 allocate (
flowdoms(nn, 1, 1)%xALE(0:ie, 0:je, 0:ke, 3), &
1798 "Memory allocation failure for xALE")
1808 "Memory allocation failure for IOVar")
1822 iovar(nn, 1)%pointerOffset = 0
1835 iovar(nn, 1)%pointerOffset = 0
1839 iovar(nn, mm)%pointerOffset = 0
1840 iovar(nn, mm)%w =>
flowdoms(nn, 1, 1)%xOld(mm - 1, 1:, 1:, 1:, :)
1871 iovar(nn, 1)%pointerOffset = 0
1875 iovar(nn, mm)%pointerOffset = 0
1876 allocate (
iovar(nn, mm)%w(il, jl, kl, 3), stat=ierr)
1879 "Memory allocation failure for &
1899 iovar(nn, mm)%pointerOffset = 0
1904 end if testallociovar
1921 integer(kind=intType),
intent(in) :: np
1922 integer(kind=intType) :: nproc_save
1923 real(kind=realtype),
intent(out) :: load_inbalance, face_inbalance
1938 load_inbalance =
ubvec(1)
1939 face_inbalance =
ubvec(2)
1963 real(kind=realtype),
parameter :: threshold = 0.1_realtype
1969 integer(kind=intType) :: nn, mm, ii, jj
1970 integer(kind=intType) :: nLevel, nSlices, slideID
1971 integer(kind=intType),
dimension(cgnsNDom) :: sectionID, sorted
1972 integer(kind=intType),
dimension(cgnsNsliding, 2) :: secSliding
1974 real(kind=realtype) :: costheta, cosphi, cospsi
1975 real(kind=realtype) :: sintheta, sinphi, sinpsi
1976 real(kind=realtype) :: r11, r12, r13, r21, r22, r23
1977 real(kind=realtype) :: r31, r32, r33
1978 real(kind=realtype) :: d1, d2, a1, a0, lamr, lami, angle, dangle
1980 logical :: situationChanged
1990 loophighestblock:
do
1994 situationchanged = .false.
2008 ii =
cgnsdoms(nn)%conn1to1(mm)%donorBlock
2009 if (sectionid(ii) > sectionid(nn))
then
2010 sectionid(nn) = sectionid(ii)
2011 situationchanged = .true.
2022 if (.not. situationchanged)
exit
2024 end do loophighestblock
2029 sorted(nn) = sectionid(nn)
2039 if (sorted(nn) > sorted(
nsections))
then
2053 mm =
flowdoms(nn, 1, 1)%cgnsBlockID
2057 if (mm == 0)
call terminate(
"determineSections", &
2058 "Entry not found in sorted.")
2066 flowdoms(nn, ii, jj)%sectionID = mm
2077 "Memory allocation failure for sections.")
2101 if (ii == 0)
call terminate(
"determineSections", &
2102 "Entry not found in sorted.")
2115 if (
cgnsdoms(nn)%conn1to1(mm)%periodic)
exit
2139 costheta = cos(
cgnsdoms(nn)%conn1to1(mm)%rotationAngles(1))
2140 sintheta = sin(
cgnsdoms(nn)%conn1to1(mm)%rotationAngles(1))
2142 cosphi = cos(
cgnsdoms(nn)%conn1to1(mm)%rotationAngles(2))
2143 sinphi = sin(
cgnsdoms(nn)%conn1to1(mm)%rotationAngles(2))
2145 cospsi = cos(
cgnsdoms(nn)%conn1to1(mm)%rotationAngles(3))
2146 sinpsi = sin(
cgnsdoms(nn)%conn1to1(mm)%rotationAngles(3))
2148 r11 = cosphi * cospsi
2149 r21 = cosphi * sinpsi
2152 r12 = sintheta * sinphi * cospsi - costheta * sinpsi
2153 r22 = sintheta * sinphi * sinpsi + costheta * cospsi
2154 r32 = sintheta * cosphi
2156 r13 = costheta * sinphi * cospsi + sintheta * sinpsi
2157 r23 = costheta * sinphi * sinpsi - sintheta * cospsi
2158 r33 = costheta * cosphi
2164 cgnsdoms(nn)%conn1to1(mm)%rotationCenter
2166 cgnsdoms(nn)%conn1to1(mm)%translation
2183 d2 = -r11 - r22 - r33
2184 d1 = r11 * r22 + r11 * r33 + r22 * r33 - r12 * r21 - r13 * r31 - r23 * r32
2197 lami = sqrt(abs(a1 * a1 -
four * a0))
2204 angle = atan2(lami, lamr)
2209 nslices = nint(
two *
pi / angle)
2215 dangle = abs(180.0_realtype * (
two *
pi - nslices * angle) /
pi)
2217 if (dangle >= threshold)
then
2220 "Periodic angle not a integer divide of &
2240 if (
cgnsdoms(nn)%rotatingFrameSpecified)
then
2259 if (
cgnsdoms(nn)%bocoInfo(mm)%actualFace .and. &
2265 slideid = abs(
cgnsdoms(nn)%bocoInfo(mm)%slidingID)
2271 if (secsliding(slideid, 1) == 0)
then
2272 secsliding(slideid, 1) = ii
2273 else if (secsliding(slideid, 1) /= ii)
then
2274 secsliding(slideid, 2) = ii
2288 mm = secsliding(ii, 1)
2289 nn = secsliding(ii, 2)
2293 if ((.not.
sections(mm)%rotating) .and. &
2294 (.not.
sections(nn)%rotating))
then
2297 "Encountered sliding interface between &
2298 &two non-rotating sections")
2305 if (.not.
sections(mm)%rotating)
then
2313 if (.not.
sections(nn)%rotating)
then
integer(kind=inttype) ndom
type(blocktype), dimension(:, :, :), allocatable, target flowdoms
integer(kind=inttype) nbkglobal
integer(kind=inttype) sectionid
real(kind=realtype), dimension(:, :, :, :), pointer x
type(cgnsblockinfotype), dimension(:), allocatable cgnsdoms
integer(kind=inttype), dimension(:, :), allocatable famidssliding
integer(kind=inttype) cgnsndomaininterfaces
integer(kind=inttype), dimension(:, :), allocatable bcidsdomaininterfaces
type(cgnsfamilytype), dimension(:), allocatable cgnsfamilies
integer(kind=inttype) cgnsnfamilies
integer(kind=inttype) cgnsnsliding
integer(kind=inttype), dimension(:), allocatable famidsdomaininterfaces
integer(kind=inttype) cgnsndom
integer adflow_comm_world
integer(kind=inttype), parameter domaininterfacep
integer(kind=inttype), parameter slidinginterface
real(kind=realtype), parameter zero
integer(kind=inttype), parameter domaininterfacerhouvw
integer(kind=inttype), parameter domaininterfacerho
real(kind=realtype), parameter four
real(kind=realtype), parameter pi
real(kind=realtype), parameter eps
integer(kind=inttype), parameter timespectral
integer(kind=inttype), parameter unsteady
real(kind=realtype), parameter one
integer(kind=inttype), parameter domaininterfacetotal
integer(kind=inttype), parameter steady
real(kind=realtype), parameter two
integer(kind=inttype), parameter domaininterfaceall
integer(kind=inttype), parameter externalflow
subroutine check1to1subfaces
type(iotype), dimension(:, :), allocatable iovar
integer(kind=inttype) noldlevels
integer(kind=inttype) currentlevel
subroutine loadbalancegrid
subroutine blockdistribution
real(kind=realtype) timeunsteady
real(kind=realtype) timeunsteadyrestart
subroutine determineneighborids
subroutine determineinterfaceids
subroutine timeperiodspectral
subroutine checkpartitioning(np, load_inbalance, face_inbalance)
subroutine updatecoorfinemesh(dtAdvance, sps)
subroutine initfinegridiblank
subroutine partitionandreadgrid(partitionOnly)
subroutine determinegridfilenames
subroutine determinesections
subroutine timerotmatricesspectral
subroutine alloccoorfinegrid
real(kind=realtype) function commontimespectral(t1, t2)
subroutine finegridspectralcoor
integer(kind=inttype) ngridsread
character(len=maxstringlen), dimension(:), allocatable gridfiles
integer, dimension(:), allocatable fileids
subroutine readblocksizes
integer(kind=inttype) nsections
type(sectiontype), dimension(:), allocatable sections
integer(kind=inttype) function bsearchstrings(key, base)
subroutine qsortstrings(arr, nn)
subroutine qsortintegers(arr, nn)
integer(kind=inttype) function bsearchintegers(key, base)
subroutine rotmatrixrigidbody(tNew, tOld, rotationMatrix, rotationPoint)
subroutine setpointers(nn, mm, ll)
subroutine terminate(routineName, errorMessage)