xref: /phasta/phSolver/common/readnblk.f (revision 98d6580a8ecca5add329d7adadb1985835e1e604)
159599516SKenneth E. Jansenc  readnblk.f (pronounce "Reed and Block Dot Eff") contains:
259599516SKenneth E. Jansenc
359599516SKenneth E. Jansenc    module readarrays ("Red Arrays") -- contains the arrays that
459599516SKenneth E. Jansenc     are read in from binary files but not immediately blocked
559599516SKenneth E. Jansenc     through pointers.
659599516SKenneth E. Jansenc
759599516SKenneth E. Jansenc    subroutine readnblk ("Reed and Block") -- allocates space for
859599516SKenneth E. Jansenc     and reads data to be contained in module readarrays.  Reads
959599516SKenneth E. Jansenc     all remaining data and blocks them with pointers.
1059599516SKenneth E. Jansenc
1159599516SKenneth E. Jansen      module readarrays
1259599516SKenneth E. Jansen
1359599516SKenneth E. Jansen      real*8, allocatable :: point2x(:,:)
1459599516SKenneth E. Jansen      real*8, allocatable :: qold(:,:)
1559599516SKenneth E. Jansen      real*8, allocatable :: uold(:,:)
1659599516SKenneth E. Jansen      real*8, allocatable :: acold(:,:)
1759599516SKenneth E. Jansen      integer, allocatable :: iBCtmp(:)
1859599516SKenneth E. Jansen      real*8, allocatable :: BCinp(:,:)
1959599516SKenneth E. Jansen
2059599516SKenneth E. Jansen      integer, allocatable :: point2ilwork(:)
2117860365SKenneth E. Jansen!      integer, allocatable :: fncorp(:)
2217860365SKenneth E. Jansen      integer, allocatable :: twodncorp(:,:)
2359599516SKenneth E. Jansen      integer, allocatable :: nBC(:)
2459599516SKenneth E. Jansen      integer, allocatable :: point2iper(:)
259a6935e5SKenneth E. Jansen      integer, target, allocatable :: point2ifath(:)
269a6935e5SKenneth E. Jansen      integer, target, allocatable :: point2nsons(:)
2759599516SKenneth E. Jansen
2859599516SKenneth E. Jansen      end module
2959599516SKenneth E. Jansen
3059599516SKenneth E. Jansen      subroutine readnblk
31e5afe575SCameron Smith      use iso_c_binding
3259599516SKenneth E. Jansen      use readarrays
3317860365SKenneth E. Jansen      use fncorpmod
34e5afe575SCameron Smith      use phio
35*520c014cSCameron Smith      use phiotimer
369071d3baSCameron Smith      use phstr
37ab645d52SCameron Smith      use syncio
38ab645d52SCameron Smith      use posixio
39ab645d52SCameron Smith      use streamio
4059599516SKenneth E. Jansen      include "common.h"
4102ce253eSCameron Smith
429a6935e5SKenneth E. Jansen      real*8, target, allocatable :: xread(:,:), qread(:,:), acread(:,:)
439a6935e5SKenneth E. Jansen      real*8, target, allocatable :: uread(:,:)
449a6935e5SKenneth E. Jansen      real*8, target, allocatable :: BCinpread(:,:)
45266200f9SCameron Smith      real*8 :: iotime
469a6935e5SKenneth E. Jansen      integer, target, allocatable :: iperread(:), iBCtmpread(:)
479a6935e5SKenneth E. Jansen      integer, target, allocatable :: ilworkread(:), nBCread(:)
48513954efSKenneth E. Jansen      integer, target, allocatable :: fncorpread(:)
49513954efSKenneth E. Jansen      integer fncorpsize
50513954efSKenneth E. Jansen      character*10 cname2, cname2nd
5159599516SKenneth E. Jansen      character*8 mach2
5259599516SKenneth E. Jansen      character*30 fmt1
5359599516SKenneth E. Jansen      character*255 fname1,fnamer,fnamelr
5459599516SKenneth E. Jansen      character*255 warning
5559599516SKenneth E. Jansen      integer igeomBAK, ibndc, irstin, ierr
569a6935e5SKenneth E. Jansen      integer, target :: intfromfile(50) ! integers read from headers
579f4aafb6SCameron Smith      integer :: descriptor, descriptorG, GPID, color, nfields
5859599516SKenneth E. Jansen      integer ::  numparts, nppf
5959599516SKenneth E. Jansen      integer :: ierr_io, numprocs, itmp, itmp2
60ade0e30fSCameron Smith      integer :: ignored
61d7abaf6cSCameron Smith      integer :: fileFmt
62e8a3eca4SCameron Smith      integer :: readstep
6359599516SKenneth E. Jansen      character*255 fname2, temp2
6459599516SKenneth E. Jansen      character*64 temp1
65e5afe575SCameron Smith      type(c_ptr) :: handle
66e5afe575SCameron Smith      character(len=1024) :: dataInt, dataDbl
67e5afe575SCameron Smith      dataInt = c_char_'integer'//c_null_char
68e5afe575SCameron Smith      dataDbl = c_char_'double'//c_null_char
6959599516SKenneth E. Jansenc
7059599516SKenneth E. Jansenc.... determine the step number to start with
7159599516SKenneth E. Jansenc
72e8a3eca4SCameron Smith      irstart=0
73e8a3eca4SCameron Smith      if (myrank.eq.master) then
7459599516SKenneth E. Jansen        open(unit=72,file='numstart.dat',status='old')
7559599516SKenneth E. Jansen        read(72,*) irstart
7659599516SKenneth E. Jansen        close(72)
77e8a3eca4SCameron Smith      endif
78df382577SCameron Smith      call drvAllreduceMaxInt(irstart,readstep)
79e8a3eca4SCameron Smith      irstart=readstep
8059599516SKenneth E. Jansen      lstep=irstart ! in case restart files have no fields
8159599516SKenneth E. Jansen
8259599516SKenneth E. Jansen      fname1='geombc.dat'
8359599516SKenneth E. Jansen      fname1= trim(fname1)  // cname2(myrank+1)
8459599516SKenneth E. Jansen
8559599516SKenneth E. Jansen      itmp=1
8659599516SKenneth E. Jansen      if (irstart .gt. 0) itmp = int(log10(float(irstart)))+1
8759599516SKenneth E. Jansen      write (fmt1,"('(''restart.'',i',i1,',1x)')") itmp
8859599516SKenneth E. Jansen      write (fnamer,fmt1) irstart
8959599516SKenneth E. Jansen      fnamer = trim(fnamer) // cname2(myrank+1)
9059599516SKenneth E. Jansenc
9159599516SKenneth E. Jansenc.... open input files
9259599516SKenneth E. Jansenc.... input the geometry parameters
9359599516SKenneth E. Jansenc
9459599516SKenneth E. Jansen      numparts = numpe !This is the common settings. Beware if you try to compute several parts per process
9559599516SKenneth E. Jansen
9659599516SKenneth E. Jansen      itwo=2
9759599516SKenneth E. Jansen      ione=1
9859599516SKenneth E. Jansen      ieleven=11
9959599516SKenneth E. Jansen      itmp = int(log10(float(myrank+1)))+1
10059599516SKenneth E. Jansen
101266200f9SCameron Smith      iotime = TMRC()
1029f4aafb6SCameron Smith      if( input_mode .eq. -1 ) then
103a486e66cSCameron Smith        call streamio_setup_read(fhandle, geomRestartStream)
1049f4aafb6SCameron Smith      else if( input_mode .eq. 0 ) then
105ab645d52SCameron Smith        call posixio_setup(fhandle, c_char_'r')
1069f4aafb6SCameron Smith      else if( input_mode .ge. 1 ) then
107ab645d52SCameron Smith        call syncio_setup_read(nsynciofiles, fhandle)
1082efdc748SKenneth E. Jansen      end if
109a93de25bSCameron Smith      call phio_constructName(fhandle,
110d7abaf6cSCameron Smith     &        c_char_'geombc' // char(0), fname1)
111*520c014cSCameron Smith      call phastaio_setfile(GEOMBC_READ)
112d7abaf6cSCameron Smith      call phio_openfile(fname1, fhandle);
11359599516SKenneth E. Jansen
114d5d2f64dSCameron Smith      call phio_readheader(fhandle,c_char_'number of nodes' // char(0),
115e5afe575SCameron Smith     & c_loc(numnp),ione, dataInt, iotype)
11659599516SKenneth E. Jansen
117d5d2f64dSCameron Smith      call phio_readheader(fhandle,c_char_'number of modes' // char(0),
118e5afe575SCameron Smith     & c_loc(nshg),ione, dataInt, iotype)
11959599516SKenneth E. Jansen
120d5d2f64dSCameron Smith      call phio_readheader(fhandle,
121e5afe575SCameron Smith     &  c_char_'number of interior elements' // char(0),
122e5afe575SCameron Smith     &  c_loc(numel),ione, dataInt, iotype)
12359599516SKenneth E. Jansen
124d5d2f64dSCameron Smith      call phio_readheader(fhandle,
125e5afe575SCameron Smith     &  c_char_'number of boundary elements' // char(0),
126e5afe575SCameron Smith     &  c_loc(numelb),ione, dataInt, iotype)
12759599516SKenneth E. Jansen
128d5d2f64dSCameron Smith      call phio_readheader(fhandle,
129e5afe575SCameron Smith     &  c_char_'maximum number of element nodes' // char(0),
130e5afe575SCameron Smith     &  c_loc(nen),ione, dataInt, iotype)
13159599516SKenneth E. Jansen
132d5d2f64dSCameron Smith      call phio_readheader(fhandle,
133e5afe575SCameron Smith     &  c_char_'number of interior tpblocks' // char(0),
134e5afe575SCameron Smith     &  c_loc(nelblk),ione, dataInt, iotype)
13559599516SKenneth E. Jansen
136d5d2f64dSCameron Smith      call phio_readheader(fhandle,
137e5afe575SCameron Smith     & c_char_'number of boundary tpblocks' // char(0),
138e5afe575SCameron Smith     & c_loc(nelblb),ione, dataInt, iotype)
13959599516SKenneth E. Jansen
140d5d2f64dSCameron Smith      call phio_readheader(fhandle,
141e5afe575SCameron Smith     & c_char_'number of nodes with Dirichlet BCs' // char(0),
142e5afe575SCameron Smith     & c_loc(numpbc),ione, dataInt, iotype)
14359599516SKenneth E. Jansen
144d5d2f64dSCameron Smith      call phio_readheader(fhandle,
145e5afe575SCameron Smith     & c_char_'number of shape functions' // char(0),
146e5afe575SCameron Smith     & c_loc(ntopsh),ione, dataInt, iotype)
14759599516SKenneth E. Jansenc
14859599516SKenneth E. Jansenc.... calculate the maximum number of boundary element nodes
14959599516SKenneth E. Jansenc
15059599516SKenneth E. Jansen      nenb = 0
15159599516SKenneth E. Jansen      do i = 1, melCat
15259599516SKenneth E. Jansen         if (nen .eq. nenCat(i,nsd)) nenb = max(nenCat(i,nsd-1), nenb)
15359599516SKenneth E. Jansen      enddo
15459599516SKenneth E. Jansen      if (myrank == master) then
15559599516SKenneth E. Jansen         if (nenb .eq. 0) call error ('input   ','nen     ',nen)
15659599516SKenneth E. Jansen      endif
15759599516SKenneth E. Jansenc
15859599516SKenneth E. Jansenc.... setup some useful constants
15959599516SKenneth E. Jansenc
16059599516SKenneth E. Jansen      I3nsd  = nsd / 3          ! nsd=3 integer flag
16159599516SKenneth E. Jansen      E3nsd  = float(I3nsd)     ! nsd=3 real    flag
16259599516SKenneth E. Jansen      if(matflg(1,1).lt.0) then
16359599516SKenneth E. Jansen         nflow = nsd + 1
16459599516SKenneth E. Jansen      else
16559599516SKenneth E. Jansen         nflow = nsd + 2
16659599516SKenneth E. Jansen      endif
16759599516SKenneth E. Jansen      ndof   = nsd + 2
16859599516SKenneth E. Jansen      nsclr=impl(1)/100
16959599516SKenneth E. Jansen      ndof=ndof+nsclr           ! number of sclr transport equations to solve
17059599516SKenneth E. Jansen
17159599516SKenneth E. Jansen      ndofBC = ndof + I3nsd     ! dimension of BC array
17259599516SKenneth E. Jansen      ndiBCB = 2                ! dimension of iBCB array
17359599516SKenneth E. Jansen      ndBCB  = ndof + 1         ! dimension of BCB array
17459599516SKenneth E. Jansen      nsymdf = (ndof*(ndof + 1)) / 2 ! symm. d.o.f.'s
17559599516SKenneth E. Jansenc
17659599516SKenneth E. Jansenc.... ----------------------> Communication tasks <--------------------
17759599516SKenneth E. Jansenc
17859599516SKenneth E. Jansen      if(numpe > 1) then
179d5d2f64dSCameron Smith         call phio_readheader(fhandle,
180e5afe575SCameron Smith     &    c_char_'size of ilwork array' // char(0),
181e5afe575SCameron Smith     &    c_loc(nlwork),ione, dataInt, iotype)
18259599516SKenneth E. Jansen
183d5d2f64dSCameron Smith         call phio_readheader(fhandle,
184e5afe575SCameron Smith     &    c_char_'ilwork' //char(0),
185e5afe575SCameron Smith     &    c_loc(nlwork),ione, dataInt, iotype)
18659599516SKenneth E. Jansen
18759599516SKenneth E. Jansen         allocate( point2ilwork(nlwork) )
18859599516SKenneth E. Jansen         allocate( ilworkread(nlwork) )
189d5d2f64dSCameron Smith         call phio_readdatablock(fhandle, c_char_'ilwork' // char(0),
190bc62cfd4SCameron Smith     &      c_loc(ilworkread), nlwork, dataInt , iotype)
19159599516SKenneth E. Jansen
19259599516SKenneth E. Jansen         point2ilwork = ilworkread
19359599516SKenneth E. Jansen         call ctypes (point2ilwork)
194513954efSKenneth E. Jansen
195ec121c45SKenneth E. Jansen       if((usingPETSc.eq.1).or.(svLSFlag.eq.1)) then
196513954efSKenneth E. Jansen         fncorpsize = nshg
197513954efSKenneth E. Jansen         allocate(fncorp(fncorpsize))
198513954efSKenneth E. Jansen         call gen_ncorp(fncorp, ilworkread, nlwork, fncorpsize)
199513954efSKenneth E. Jansen!
200513954efSKenneth E. Jansen! the  following code finds the global range of the owned nodes
201513954efSKenneth E. Jansen!
202513954efSKenneth E. Jansen         maxowned=0
203513954efSKenneth E. Jansen         minowned=maxval(fncorp)
204513954efSKenneth E. Jansen         do i = 1,nshg
205513954efSKenneth E. Jansen            if(fncorp(i).gt.0) then  ! don't consider remote copies
206513954efSKenneth E. Jansen               maxowned=max(maxowned,fncorp(i))
207513954efSKenneth E. Jansen               minowned=min(minowned,fncorp(i))
208513954efSKenneth E. Jansen            endif
209513954efSKenneth E. Jansen         enddo
210513954efSKenneth E. Jansen!
211513954efSKenneth E. Jansen!  end of global range code
212513954efSKenneth E. Jansen!
213513954efSKenneth E. Jansen         call commuInt(fncorp, point2ilwork, 1, 'out')
214513954efSKenneth E. Jansen         ncorpsize = fncorpsize
215513954efSKenneth E. Jansen       endif
216ec121c45SKenneth E. Jansen       if(svLSFlag.eq.1) then
217ec121c45SKenneth E. Jansen         allocate(ltg(ncorpsize))
218ec121c45SKenneth E. Jansen         ltg(:)=fncorp(:)
219ec121c45SKenneth E. Jansen       endif
220f538fcd7SKenneth E. Jansen      else  !serial
221c90fc7c7SKenneth E. Jansen       if((usingPETSc.eq.1)) then
222c90fc7c7SKenneth E. Jansen         fncorpsize = nshg
223c90fc7c7SKenneth E. Jansen         allocate(fncorp(fncorpsize))
224c90fc7c7SKenneth E. Jansen         maxowned=nshg
225c90fc7c7SKenneth E. Jansen         minowned=1
226c90fc7c7SKenneth E. Jansen         iownnodes=nshg
227c90fc7c7SKenneth E. Jansen           do i =1,nshg
228c90fc7c7SKenneth E. Jansen             fncorp(i)=i
229c90fc7c7SKenneth E. Jansen           enddo
230c90fc7c7SKenneth E. Jansen       endif
231c90fc7c7SKenneth E. Jansen       if((svLSFlag.eq.1)) then
232ec121c45SKenneth E. Jansen           allocate(ltg(nshg))
233ec121c45SKenneth E. Jansen           do i =1,nshg
234ec121c45SKenneth E. Jansen             ltg(i)=i
235ec121c45SKenneth E. Jansen           enddo
236c90fc7c7SKenneth E. Jansen       endif
23759599516SKenneth E. Jansen       nlwork=1
23859599516SKenneth E. Jansen       allocate( point2ilwork(1))
23959599516SKenneth E. Jansen       nshg0 = nshg
24059599516SKenneth E. Jansen      endif
24159599516SKenneth E. Jansen
242ec121c45SKenneth E. Jansen
24359599516SKenneth E. Jansen      itwo=2
24459599516SKenneth E. Jansen
245d5d2f64dSCameron Smith      call phio_readheader(fhandle,
246e5afe575SCameron Smith     & c_char_'co-ordinates' // char(0),
247e5afe575SCameron Smith     & c_loc(intfromfile),itwo, dataDbl, iotype)
24859599516SKenneth E. Jansen      numnp=intfromfile(1)
24959599516SKenneth E. Jansen      allocate( point2x(numnp,nsd) )
25059599516SKenneth E. Jansen      allocate( xread(numnp,nsd) )
25159599516SKenneth E. Jansen      ixsiz=numnp*nsd
252d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
253bc62cfd4SCameron Smith     & c_char_'co-ordinates' // char(0),
254bc62cfd4SCameron Smith     & c_loc(xread),ixsiz, dataDbl, iotype)
25559599516SKenneth E. Jansen      point2x = xread
256513954efSKenneth E. Jansen
257513954efSKenneth E. Jansenc..............................for Duct
258513954efSKenneth E. Jansen      if(istretchOutlet.eq.1)then
259513954efSKenneth E. Jansen
260513954efSKenneth E. Jansenc...geometry6
261513954efSKenneth E. Jansen        if(iDuctgeometryType .eq. 6) then
262513954efSKenneth E. Jansen          xmaxn = 1.276
263513954efSKenneth E. Jansen          xmaxo = 0.848
264513954efSKenneth E. Jansen          xmin  = 0.42
265513954efSKenneth E. Jansenc...geometry8
266513954efSKenneth E. Jansen        elseif(iDuctgeometryType .eq. 8)then
267513954efSKenneth E. Jansen          xmaxn=1.6*4.5*0.0254+0.85*1.5
268513954efSKenneth E. Jansen          xmaxo=1.6*4.5*0.0254+0.85*1.0
269513954efSKenneth E. Jansen          xmin =1.6*4.5*0.0254+0.85*0.5
270513954efSKenneth E. Jansen        endif
271513954efSKenneth E. Jansenc...
272513954efSKenneth E. Jansen        alpha=(xmaxn-xmaxo)/(xmaxo-xmin)**2
273513954efSKenneth E. Jansen        where (point2x(:,1) .ge. xmin)
274513954efSKenneth E. Jansenc..... N=# of current elements from .42 to exit(~40)
275513954efSKenneth E. Jansenc..... (x_mx-x_mn)/N=.025
276513954efSKenneth E. Jansenc..... alpha=3    3*.025=.075
277513954efSKenneth E. Jansen           point2x(:,1)=point2x(:,1)+
278513954efSKenneth E. Jansen     &     alpha*(point2x(:,1)-xmin)**2
279513954efSKenneth E. Jansenc..... ftn to stretch x at exit
280513954efSKenneth E. Jansen        endwhere
281513954efSKenneth E. Jansen      endif
282513954efSKenneth E. Jansen
28359599516SKenneth E. Jansenc
28459599516SKenneth E. Jansenc.... read in and block out the connectivity
28559599516SKenneth E. Jansenc
2860f541e5dSKenneth E. Jansen      if( input_mode .eq. -1 ) then
28759599516SKenneth E. Jansen        call genblk (IBKSIZ)
2880f541e5dSKenneth E. Jansen      else if( input_mode .eq. 0 ) then
2890f541e5dSKenneth E. Jansen        call genblkPosix (IBKSIZ)
2900f541e5dSKenneth E. Jansen      else if( input_mode .ge. 1 ) then
291ab5b07a4SKenneth E. Jansen        call genblkSyncIO (IBKSIZ)
2920f541e5dSKenneth E. Jansen      end if
29359599516SKenneth E. Jansenc
29459599516SKenneth E. Jansenc.... read the boundary condition mapping array
29559599516SKenneth E. Jansenc
29659599516SKenneth E. Jansen      ione=1
297d5d2f64dSCameron Smith      call phio_readheader(fhandle,
298e5afe575SCameron Smith     & c_char_'bc mapping array' // char(0),
299e5afe575SCameron Smith     & c_loc(nshg),ione, dataInt, iotype)
30059599516SKenneth E. Jansen
30159599516SKenneth E. Jansen      allocate( nBC(nshg) )
30259599516SKenneth E. Jansen
30359599516SKenneth E. Jansen      allocate( nBCread(nshg) )
30459599516SKenneth E. Jansen
305d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
306bc62cfd4SCameron Smith     & c_char_'bc mapping array' // char(0),
307bc62cfd4SCameron Smith     & c_loc(nBCread), nshg, dataInt, iotype)
30859599516SKenneth E. Jansen
30959599516SKenneth E. Jansen      nBC=nBCread
31059599516SKenneth E. Jansenc
31159599516SKenneth E. Jansenc.... read the temporary iBC array
31259599516SKenneth E. Jansenc
31359599516SKenneth E. Jansen      ione=1
314d5d2f64dSCameron Smith      call phio_readheader(fhandle,
315e5afe575SCameron Smith     & c_char_'bc codes array' // char(0),
316e5afe575SCameron Smith     & c_loc(numpbc),ione, dataInt, iotype)
31759599516SKenneth E. Jansen
31859599516SKenneth E. Jansen      if ( numpbc > 0 ) then
31959599516SKenneth E. Jansen        allocate( iBCtmp(numpbc) )
32059599516SKenneth E. Jansen        allocate( iBCtmpread(numpbc) )
32159599516SKenneth E. Jansen      else
32259599516SKenneth E. Jansen        allocate( iBCtmp(1) )
32359599516SKenneth E. Jansen        allocate( iBCtmpread(1) )
32459599516SKenneth E. Jansen      endif
325d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
326bc62cfd4SCameron Smith     & c_char_'bc codes array' // char(0),
327bc62cfd4SCameron Smith     & c_loc(iBCtmpread), numpbc, dataInt, iotype)
32859599516SKenneth E. Jansen
32959599516SKenneth E. Jansen      if ( numpbc > 0 ) then
33059599516SKenneth E. Jansen         iBCtmp=iBCtmpread
33159599516SKenneth E. Jansen      else  ! sometimes a partition has no BC's
33259599516SKenneth E. Jansen         deallocate( iBCtmpread)
33359599516SKenneth E. Jansen         iBCtmp=0
33459599516SKenneth E. Jansen      endif
33559599516SKenneth E. Jansenc
33659599516SKenneth E. Jansenc.... read boundary condition data
33759599516SKenneth E. Jansenc
33859599516SKenneth E. Jansen      ione=1
339d5d2f64dSCameron Smith      call phio_readheader(fhandle,
340e5afe575SCameron Smith     & c_char_'boundary condition array' // char(0),
341e5afe575SCameron Smith     & c_loc(intfromfile),ione, dataDbl, iotype)
34259599516SKenneth E. Jansen
34359599516SKenneth E. Jansen      if ( numpbc > 0 ) then
34459599516SKenneth E. Jansen         allocate( BCinp(numpbc,ndof+7) )
34559599516SKenneth E. Jansen         nsecondrank=intfromfile(1)/numpbc
34659599516SKenneth E. Jansen         allocate( BCinpread(numpbc,nsecondrank) )
34759599516SKenneth E. Jansen         iBCinpsiz=intfromfile(1)
34859599516SKenneth E. Jansen      else
34959599516SKenneth E. Jansen         allocate( BCinp(1,ndof+7) )
35059599516SKenneth E. Jansen         allocate( BCinpread(0,0) ) !dummy
35159599516SKenneth E. Jansen         iBCinpsiz=intfromfile(1)
35259599516SKenneth E. Jansen      endif
35359599516SKenneth E. Jansen
354d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
355bc62cfd4SCameron Smith     & c_char_'boundary condition array' // char(0),
356bc62cfd4SCameron Smith     & c_loc(BCinpread), iBCinpsiz, dataDbl, iotype)
35759599516SKenneth E. Jansen
35859599516SKenneth E. Jansen      if ( numpbc > 0 ) then
35959599516SKenneth E. Jansen         BCinp(:,1:(ndof+7))=BCinpread(:,1:(ndof+7))
36059599516SKenneth E. Jansen      else  ! sometimes a partition has no BC's
36159599516SKenneth E. Jansen         deallocate(BCinpread)
36259599516SKenneth E. Jansen         BCinp=0
36359599516SKenneth E. Jansen      endif
36459599516SKenneth E. Jansenc
36559599516SKenneth E. Jansenc.... read periodic boundary conditions
36659599516SKenneth E. Jansenc
36759599516SKenneth E. Jansen      ione=1
368d5d2f64dSCameron Smith      call phio_readheader(fhandle,
369e5afe575SCameron Smith     & c_char_'periodic masters array' // char(0),
370e5afe575SCameron Smith     & c_loc(nshg), ione, dataInt, iotype)
37159599516SKenneth E. Jansen      allocate( point2iper(nshg) )
37259599516SKenneth E. Jansen      allocate( iperread(nshg) )
373d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
374bc62cfd4SCameron Smith     & c_char_'periodic masters array' // char(0),
375bc62cfd4SCameron Smith     & c_loc(iperread), nshg, dataInt, iotype)
37659599516SKenneth E. Jansen      point2iper=iperread
37759599516SKenneth E. Jansenc
37859599516SKenneth E. Jansenc.... generate the boundary element blocks
37959599516SKenneth E. Jansenc
3800f541e5dSKenneth E. Jansen      if( input_mode .eq. -1 ) then
3810f541e5dSKenneth E. Jansen        call genbkb (IBKSIZ)
3820f541e5dSKenneth E. Jansen      else if( input_mode .eq. 0 ) then
3830f541e5dSKenneth E. Jansen        call genbkbPosix (IBKSIZ)
3840f541e5dSKenneth E. Jansen      else if( input_mode .ge. 1 ) then
385ab5b07a4SKenneth E. Jansen        call genbkbSyncIO (IBKSIZ)
3860f541e5dSKenneth E. Jansen      end if
38759599516SKenneth E. Jansenc
38859599516SKenneth E. Jansenc  Read in the nsons and ifath arrays if needed
38959599516SKenneth E. Jansenc
39059599516SKenneth E. Jansenc  There is a fundamental shift in the meaning of ifath based on whether
39159599516SKenneth E. Jansenc  there exist homogenous directions in the flow.
39259599516SKenneth E. Jansenc
39359599516SKenneth E. Jansenc  HOMOGENOUS DIRECTIONS EXIST:  Here nfath is the number of inhomogenous
39459599516SKenneth E. Jansenc  points in the TOTAL mesh.  That is to say that each partition keeps a
39559599516SKenneth E. Jansenc  link to  ALL inhomogenous points.  This link is furthermore not to the
39659599516SKenneth E. Jansenc  sms numbering but to the original structured grid numbering.  These
39759599516SKenneth E. Jansenc  inhomogenous points are thought of as fathers, with their sons being all
39859599516SKenneth E. Jansenc  the points in the homogenous directions that have this father's
39959599516SKenneth E. Jansenc  inhomogeneity.  The array ifath takes as an arguement the sms numbering
40059599516SKenneth E. Jansenc  and returns as a result the father.
40159599516SKenneth E. Jansenc
40259599516SKenneth E. Jansenc  In this case nsons is the number of sons that each father has and ifath
40359599516SKenneth E. Jansenc  is an array which tells the
40459599516SKenneth E. Jansenc
40559599516SKenneth E. Jansenc  NO HOMOGENOUS DIRECTIONS.  In this case the mesh would grow to rapidly
40659599516SKenneth E. Jansenc  if we followed the above strategy since every partition would index its
40759599516SKenneth E. Jansenc  points to the ENTIRE mesh.  Furthermore, there would never be a need
40859599516SKenneth E. Jansenc  to average to a node off processor since there is no spatial averaging.
40959599516SKenneth E. Jansenc  Therefore, to properly account for this case we must recognize it and
41059599516SKenneth E. Jansenc  inerrupt certain actions (i.e. assembly of the average across partitions).
41159599516SKenneth E. Jansenc  This case is easily identified by noting that maxval(nsons) =1 (i.e. no
41259599516SKenneth E. Jansenc  father has any sons).  Reiterating to be clear, in this case ifath does
41359599516SKenneth E. Jansenc  not point to a global numbering but instead just points to itself.
41459599516SKenneth E. Jansenc
41559599516SKenneth E. Jansen      nfath=1  ! some architectures choke on a zero or undeclared
41659599516SKenneth E. Jansen                 ! dimension variable.  This sets it to a safe, small value.
41759599516SKenneth E. Jansen      if(((iLES .lt. 20) .and. (iLES.gt.0))
41859599516SKenneth E. Jansen     &                   .or. (itwmod.gt.0)  ) then ! don't forget same
41959599516SKenneth E. Jansen                                                    ! conditional in proces.f
42059599516SKenneth E. Jansen                                                    ! needed for alloc
42159599516SKenneth E. Jansen         ione=1
42259599516SKenneth E. Jansen         if(nohomog.gt.0) then
423d5d2f64dSCameron Smith            call phio_readheader(fhandle,
424e5afe575SCameron Smith     &       c_char_'number of father-nodes' // char(0),
425e5afe575SCameron Smith     &       c_loc(nfath), ione, dataInt, iotype)
42659599516SKenneth E. Jansen
427d5d2f64dSCameron Smith            call phio_readheader(fhandle,
428e5afe575SCameron Smith     &       c_char_'number of son-nodes for each father' // char(0),
429e5afe575SCameron Smith     &       c_loc(nfath), ione, dataInt, iotype)
43059599516SKenneth E. Jansen
43159599516SKenneth E. Jansen            allocate (point2nsons(nfath))
43259599516SKenneth E. Jansen
433d5d2f64dSCameron Smith            call phio_readdatablock(fhandle,
434bc62cfd4SCameron Smith     &       c_char_'number of son-nodes for each father' // char(0),
435bc62cfd4SCameron Smith     &       c_loc(point2nsons),nfath, dataInt, iotype)
43659599516SKenneth E. Jansen
437d5d2f64dSCameron Smith            call phio_readheader(fhandle,
438e5afe575SCameron Smith     &       c_char_'keyword ifath' // char(0),
439e5afe575SCameron Smith     &       c_loc(nshg), ione, dataInt, iotype);
44059599516SKenneth E. Jansen
44159599516SKenneth E. Jansen            allocate (point2ifath(nshg))
44259599516SKenneth E. Jansen
443d5d2f64dSCameron Smith            call phio_readdatablock(fhandle,
444bc62cfd4SCameron Smith     &       c_char_'keyword ifath' // char(0),
445bc62cfd4SCameron Smith     &       c_loc(point2ifath), nshg, dataInt, iotype)
44659599516SKenneth E. Jansen
44759599516SKenneth E. Jansen            nsonmax=maxval(point2nsons)
44859599516SKenneth E. Jansen         else  ! this is the case where there is no homogeneity
44959599516SKenneth E. Jansen               ! therefore ever node is a father (too itself).  sonfath
45059599516SKenneth E. Jansen               ! (a routine in NSpre) will set this up but this gives
45159599516SKenneth E. Jansen               ! you an option to avoid that.
45259599516SKenneth E. Jansen            nfath=nshg
45359599516SKenneth E. Jansen            allocate (point2nsons(nfath))
45459599516SKenneth E. Jansen            point2nsons=1
45559599516SKenneth E. Jansen            allocate (point2ifath(nshg))
45659599516SKenneth E. Jansen            do i=1,nshg
45759599516SKenneth E. Jansen               point2ifath(i)=i
45859599516SKenneth E. Jansen            enddo
45959599516SKenneth E. Jansen            nsonmax=1
46059599516SKenneth E. Jansen         endif
46159599516SKenneth E. Jansen      else
46259599516SKenneth E. Jansen         allocate (point2nsons(1))
46359599516SKenneth E. Jansen         allocate (point2ifath(1))
46459599516SKenneth E. Jansen      endif
46559599516SKenneth E. Jansen
466d7abaf6cSCameron Smith      call phio_closefile(fhandle);
467266200f9SCameron Smith      iotime = TMRC() - iotime
468266200f9SCameron Smith      if (myrank.eq.master) then
469266200f9SCameron Smith        write(*,*) 'time to read geombc (seconds)', iotime
470266200f9SCameron Smith      endif
471266200f9SCameron Smith
47259599516SKenneth E. Jansenc.... Read restart files
473266200f9SCameron Smith      iotime = TMRC()
4749f4aafb6SCameron Smith      if( input_mode .eq. -1 ) then
475a486e66cSCameron Smith        call streamio_setup_read(fhandle, geomRestartStream)
4769f4aafb6SCameron Smith      else if( input_mode .eq. 0 ) then
477d7abaf6cSCameron Smith        call posixio_setup(fhandle, c_char_'r')
4789f4aafb6SCameron Smith      else if( input_mode .ge. 1 ) then
479d7abaf6cSCameron Smith        call syncio_setup_read(nsynciofiles, fhandle)
480d7abaf6cSCameron Smith      end if
481a93de25bSCameron Smith      call phio_constructName(fhandle,
482d7abaf6cSCameron Smith     &        c_char_'restart' // char(0), fnamer)
4839071d3baSCameron Smith      call phstr_appendInt(fnamer, irstart)
4849071d3baSCameron Smith      call phstr_appendStr(fnamer, c_char_'.'//c_null_char)
485*520c014cSCameron Smith      call phastaio_setfile(RESTART_READ)
486d7abaf6cSCameron Smith      call phio_openfile(fnamer, fhandle);
48759599516SKenneth E. Jansen
48859599516SKenneth E. Jansen      ithree=3
48959599516SKenneth E. Jansen
49059599516SKenneth E. Jansen      itmp = int(log10(float(myrank+1)))+1
49159599516SKenneth E. Jansen
49259599516SKenneth E. Jansen      intfromfile=0
493d5d2f64dSCameron Smith      call phio_readheader(fhandle,
494e5afe575SCameron Smith     & c_char_'solution' // char(0),
495e5afe575SCameron Smith     & c_loc(intfromfile), ithree, dataInt, iotype)
49659599516SKenneth E. Jansenc
49759599516SKenneth E. Jansenc.... read the values of primitive variables into q
49859599516SKenneth E. Jansenc
49959599516SKenneth E. Jansen      allocate( qold(nshg,ndof) )
50059599516SKenneth E. Jansen      if(intfromfile(1).ne.0) then
50159599516SKenneth E. Jansen         nshg2=intfromfile(1)
50259599516SKenneth E. Jansen         ndof2=intfromfile(2)
50359599516SKenneth E. Jansen         lstep=intfromfile(3)
50459599516SKenneth E. Jansen         if(ndof2.ne.ndof) then
50559599516SKenneth E. Jansen
50659599516SKenneth E. Jansen         endif
50759599516SKenneth E. Jansen        if (nshg2 .ne. nshg)
50859599516SKenneth E. Jansen     &        call error ('restar  ', 'nshg   ', nshg)
50959599516SKenneth E. Jansen         allocate( qread(nshg,ndof2) )
51059599516SKenneth E. Jansen         iqsiz=nshg*ndof2
511d5d2f64dSCameron Smith         call phio_readdatablock(fhandle,
512bc62cfd4SCameron Smith     &    c_char_'solution' // char(0),
513bc62cfd4SCameron Smith     &    c_loc(qread),iqsiz, dataDbl,iotype)
51459599516SKenneth E. Jansen         qold(:,1:ndof)=qread(:,1:ndof)
51559599516SKenneth E. Jansen         deallocate(qread)
51659599516SKenneth E. Jansen      else
51759599516SKenneth E. Jansen         if (myrank.eq.master) then
51859599516SKenneth E. Jansen            if (matflg(1,1).eq.0) then ! compressible
51959599516SKenneth E. Jansen               warning='Solution is set to zero (with p and T to one)'
52059599516SKenneth E. Jansen            else
52159599516SKenneth E. Jansen               warning='Solution is set to zero'
52259599516SKenneth E. Jansen            endif
52359599516SKenneth E. Jansen            write(*,*) warning
52459599516SKenneth E. Jansen         endif
52559599516SKenneth E. Jansen         qold=zero
52659599516SKenneth E. Jansen         if (matflg(1,1).eq.0) then ! compressible
52759599516SKenneth E. Jansen            qold(:,1)=one ! avoid zero pressure
52859599516SKenneth E. Jansen            qold(:,nflow)=one ! avoid zero temperature
52959599516SKenneth E. Jansen         endif
53059599516SKenneth E. Jansen      endif
53159599516SKenneth E. Jansen
53259599516SKenneth E. Jansen      intfromfile=0
533d5d2f64dSCameron Smith      call phio_readheader(fhandle,
534e5afe575SCameron Smith     & c_char_'time derivative of solution' // char(0),
535e5afe575SCameron Smith     & c_loc(intfromfile), ithree, dataInt, iotype)
53659599516SKenneth E. Jansen      allocate( acold(nshg,ndof) )
53759599516SKenneth E. Jansen      if(intfromfile(1).ne.0) then
53859599516SKenneth E. Jansen         nshg2=intfromfile(1)
53959599516SKenneth E. Jansen         ndof2=intfromfile(2)
54059599516SKenneth E. Jansen         lstep=intfromfile(3)
54159599516SKenneth E. Jansen
54259599516SKenneth E. Jansen         if (nshg2 .ne. nshg)
54359599516SKenneth E. Jansen     &        call error ('restar  ', 'nshg   ', nshg)
54459599516SKenneth E. Jansen         allocate( acread(nshg,ndof2) )
54559599516SKenneth E. Jansen         acread=zero
54659599516SKenneth E. Jansen         iacsiz=nshg*ndof2
547d5d2f64dSCameron Smith         call phio_readdatablock(fhandle,
548bc62cfd4SCameron Smith     &    c_char_'time derivative of solution' // char(0),
549bc62cfd4SCameron Smith     &    c_loc(acread), iacsiz, dataDbl,iotype)
55059599516SKenneth E. Jansen         acold(:,1:ndof)=acread(:,1:ndof)
55159599516SKenneth E. Jansen         deallocate(acread)
55259599516SKenneth E. Jansen      else
55359599516SKenneth E. Jansen         if (myrank.eq.master) then
55459599516SKenneth E. Jansen            warning='Time derivative of solution is set to zero (SAFE)'
55559599516SKenneth E. Jansen            write(*,*) warning
55659599516SKenneth E. Jansen         endif
55759599516SKenneth E. Jansen         acold=zero
55859599516SKenneth E. Jansen      endif
55959599516SKenneth E. Jansencc
56059599516SKenneth E. Jansencc.... read the header and check it against the run data
56159599516SKenneth E. Jansencc
56259599516SKenneth E. Jansen      if (ideformwall.eq.1) then
56359599516SKenneth E. Jansen
56459599516SKenneth E. Jansen          intfromfile=0
565d5d2f64dSCameron Smith          call phio_readheader(fhandle,
566e5afe575SCameron Smith     &     c_char_'displacement' // char(0),
567e5afe575SCameron Smith     &     c_loc(intfromfile), ithree, dataInt, iotype)
56859599516SKenneth E. Jansen
56959599516SKenneth E. Jansen         nshg2=intfromfile(1)
57059599516SKenneth E. Jansen         ndisp=intfromfile(2)
57159599516SKenneth E. Jansen         lstep=intfromfile(3)
57259599516SKenneth E. Jansen         if(ndisp.ne.nsd) then
57359599516SKenneth E. Jansen            warning='WARNING ndisp not equal nsd'
57459599516SKenneth E. Jansen            write(*,*) warning , ndisp
57559599516SKenneth E. Jansen         endif
57659599516SKenneth E. Jansen         if (nshg2 .ne. nshg)
57759599516SKenneth E. Jansen     &        call error ('restar  ', 'nshg   ', nshg)
57859599516SKenneth E. Jansenc
57959599516SKenneth E. Jansenc.... read the values of primitive variables into uold
58059599516SKenneth E. Jansenc
58159599516SKenneth E. Jansen         allocate( uold(nshg,nsd) )
58259599516SKenneth E. Jansen         allocate( uread(nshg,nsd) )
58359599516SKenneth E. Jansen
58459599516SKenneth E. Jansen         iusiz=nshg*nsd
58559599516SKenneth E. Jansen
586d5d2f64dSCameron Smith         call phio_readdatablock(fhandle,
587bc62cfd4SCameron Smith     &    c_char_'displacement' // char(0),
588bc62cfd4SCameron Smith     &    c_loc(uread), iusiz, dataDbl, iotype)
58959599516SKenneth E. Jansen
59059599516SKenneth E. Jansen         uold(:,1:nsd)=uread(:,1:nsd)
59159599516SKenneth E. Jansen       else
59259599516SKenneth E. Jansen         allocate( uold(nshg,nsd) )
59359599516SKenneth E. Jansen         uold(:,1:nsd) = zero
59459599516SKenneth E. Jansen       endif
59559599516SKenneth E. Jansenc
59659599516SKenneth E. Jansenc.... close c-binary files
59759599516SKenneth E. Jansenc
598d7abaf6cSCameron Smith      call phio_closefile(fhandle)
599266200f9SCameron Smith      iotime = TMRC() - iotime
600266200f9SCameron Smith      if (myrank.eq.master) then
601266200f9SCameron Smith        write(*,*) 'time to read restart (seconds)', iotime
602266200f9SCameron Smith      endif
60359599516SKenneth E. Jansen
60459599516SKenneth E. Jansen      deallocate(xread)
60559599516SKenneth E. Jansen      if ( numpbc > 0 )  then
60659599516SKenneth E. Jansen         deallocate(bcinpread)
60759599516SKenneth E. Jansen         deallocate(ibctmpread)
60859599516SKenneth E. Jansen      endif
60959599516SKenneth E. Jansen      deallocate(iperread)
61059599516SKenneth E. Jansen      if(numpe.gt.1)
61159599516SKenneth E. Jansen     &     deallocate(ilworkread)
61259599516SKenneth E. Jansen      deallocate(nbcread)
61359599516SKenneth E. Jansen
61459599516SKenneth E. Jansen      return
61559599516SKenneth E. Jansen 994  call error ('input   ','opening ', igeomBAK)
61659599516SKenneth E. Jansen 995  call error ('input   ','opening ', igeomBAK)
61759599516SKenneth E. Jansen 997  call error ('input   ','end file', igeomBAK)
61859599516SKenneth E. Jansen 998  call error ('input   ','end file', igeomBAK)
61959599516SKenneth E. Jansen      end
62059599516SKenneth E. Jansenc
62159599516SKenneth E. Jansenc No longer called but kept around in case....
62259599516SKenneth E. Jansenc
62359599516SKenneth E. Jansen      subroutine genpzero(iBC)
62459599516SKenneth E. Jansen
62559599516SKenneth E. Jansen      use pointer_data
62659599516SKenneth E. Jansen      include "common.h"
62759599516SKenneth E. Jansen      integer iBC(nshg)
62859599516SKenneth E. Jansenc
62959599516SKenneth E. Jansenc....  check to see if any of the nodes have a dirichlet pressure
63059599516SKenneth E. Jansenc
63159599516SKenneth E. Jansen      pzero=1
63259599516SKenneth E. Jansen      if (any(btest(iBC,2))) pzero=0
63359599516SKenneth E. Jansen      do iblk = 1, nelblb
63459599516SKenneth E. Jansen         npro = lcblkb(1,iblk+1)-lcblkb(1,iblk)
63559599516SKenneth E. Jansen         do i=1, npro
63659599516SKenneth E. Jansen            iBCB1=miBCB(iblk)%p(i,1)
63759599516SKenneth E. Jansenc
63859599516SKenneth E. Jansenc.... check to see if any of the nodes have a Neumann pressure
63959599516SKenneth E. Jansenc     but not periodic (note that
64059599516SKenneth E. Jansenc
64159599516SKenneth E. Jansen            if(btest(iBCB1,1)) pzero=0
64259599516SKenneth E. Jansen         enddo
64359599516SKenneth E. Jansenc
64459599516SKenneth E. Jansenc.... share results with other processors
64559599516SKenneth E. Jansenc
64659599516SKenneth E. Jansen         pzl=pzero
64759599516SKenneth E. Jansen         if (numpe .gt. 1)
64859599516SKenneth E. Jansen     &        call MPI_ALLREDUCE (pzl, pzero, 1,
64959599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_MIN, MPI_COMM_WORLD,ierr)
65059599516SKenneth E. Jansen      enddo
65159599516SKenneth E. Jansen      return
65259599516SKenneth E. Jansen      end
653