xref: /phasta/phSolver/common/readnblk.f (revision c90fc7c7f5fb24b2f895d35b0e3ed7ab47e91476)
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
359071d3baSCameron Smith      use phstr
36ab645d52SCameron Smith      use syncio
37ab645d52SCameron Smith      use posixio
38ab645d52SCameron Smith      use streamio
3959599516SKenneth E. Jansen      include "common.h"
4002ce253eSCameron Smith
419a6935e5SKenneth E. Jansen      real*8, target, allocatable :: xread(:,:), qread(:,:), acread(:,:)
429a6935e5SKenneth E. Jansen      real*8, target, allocatable :: uread(:,:)
439a6935e5SKenneth E. Jansen      real*8, target, allocatable :: BCinpread(:,:)
44266200f9SCameron Smith      real*8 :: iotime
459a6935e5SKenneth E. Jansen      integer, target, allocatable :: iperread(:), iBCtmpread(:)
469a6935e5SKenneth E. Jansen      integer, target, allocatable :: ilworkread(:), nBCread(:)
47513954efSKenneth E. Jansen      integer, target, allocatable :: fncorpread(:)
48513954efSKenneth E. Jansen      integer fncorpsize
49513954efSKenneth E. Jansen      character*10 cname2, cname2nd
5059599516SKenneth E. Jansen      character*8 mach2
5159599516SKenneth E. Jansen      character*30 fmt1
5259599516SKenneth E. Jansen      character*255 fname1,fnamer,fnamelr
5359599516SKenneth E. Jansen      character*255 warning
5459599516SKenneth E. Jansen      integer igeomBAK, ibndc, irstin, ierr
559a6935e5SKenneth E. Jansen      integer, target :: intfromfile(50) ! integers read from headers
569f4aafb6SCameron Smith      integer :: descriptor, descriptorG, GPID, color, nfields
5759599516SKenneth E. Jansen      integer ::  numparts, nppf
5859599516SKenneth E. Jansen      integer :: ierr_io, numprocs, itmp, itmp2
59ade0e30fSCameron Smith      integer :: ignored
60d7abaf6cSCameron Smith      integer :: fileFmt
6159599516SKenneth E. Jansen      character*255 fname2, temp2
6259599516SKenneth E. Jansen      character*64 temp1
63e5afe575SCameron Smith      type(c_ptr) :: handle
64e5afe575SCameron Smith      character(len=1024) :: dataInt, dataDbl
65e5afe575SCameron Smith      dataInt = c_char_'integer'//c_null_char
66e5afe575SCameron Smith      dataDbl = c_char_'double'//c_null_char
6759599516SKenneth E. Jansenc
6859599516SKenneth E. Jansenc.... determine the step number to start with
6959599516SKenneth E. Jansenc
7059599516SKenneth E. Jansen      open(unit=72,file='numstart.dat',status='old')
7159599516SKenneth E. Jansen      read(72,*) irstart
7259599516SKenneth E. Jansen      close(72)
7359599516SKenneth E. Jansen      lstep=irstart ! in case restart files have no fields
7459599516SKenneth E. Jansen
7559599516SKenneth E. Jansen      fname1='geombc.dat'
7659599516SKenneth E. Jansen      fname1= trim(fname1)  // cname2(myrank+1)
7759599516SKenneth E. Jansen
7859599516SKenneth E. Jansen      itmp=1
7959599516SKenneth E. Jansen      if (irstart .gt. 0) itmp = int(log10(float(irstart)))+1
8059599516SKenneth E. Jansen      write (fmt1,"('(''restart.'',i',i1,',1x)')") itmp
8159599516SKenneth E. Jansen      write (fnamer,fmt1) irstart
8259599516SKenneth E. Jansen      fnamer = trim(fnamer) // cname2(myrank+1)
8359599516SKenneth E. Jansenc
8459599516SKenneth E. Jansenc.... open input files
8559599516SKenneth E. Jansenc.... input the geometry parameters
8659599516SKenneth E. Jansenc
8759599516SKenneth E. Jansen      numparts = numpe !This is the common settings. Beware if you try to compute several parts per process
8859599516SKenneth E. Jansen
8959599516SKenneth E. Jansen      itwo=2
9059599516SKenneth E. Jansen      ione=1
9159599516SKenneth E. Jansen      ieleven=11
9259599516SKenneth E. Jansen      itmp = int(log10(float(myrank+1)))+1
9359599516SKenneth E. Jansen
94266200f9SCameron Smith      iotime = TMRC()
959f4aafb6SCameron Smith      if( input_mode .eq. -1 ) then
96a486e66cSCameron Smith        call streamio_setup_read(fhandle, geomRestartStream)
979f4aafb6SCameron Smith      else if( input_mode .eq. 0 ) then
98ab645d52SCameron Smith        call posixio_setup(fhandle, c_char_'r')
999f4aafb6SCameron Smith      else if( input_mode .ge. 1 ) then
100ab645d52SCameron Smith        call syncio_setup_read(nsynciofiles, fhandle)
1012efdc748SKenneth E. Jansen      end if
102a93de25bSCameron Smith      call phio_constructName(fhandle,
103d7abaf6cSCameron Smith     &        c_char_'geombc' // char(0), fname1)
104d7abaf6cSCameron Smith      call phio_openfile(fname1, fhandle);
10559599516SKenneth E. Jansen
106d5d2f64dSCameron Smith      call phio_readheader(fhandle,c_char_'number of nodes' // char(0),
107e5afe575SCameron Smith     & c_loc(numnp),ione, dataInt, iotype)
10859599516SKenneth E. Jansen
109d5d2f64dSCameron Smith      call phio_readheader(fhandle,c_char_'number of modes' // char(0),
110e5afe575SCameron Smith     & c_loc(nshg),ione, dataInt, iotype)
11159599516SKenneth E. Jansen
112d5d2f64dSCameron Smith      call phio_readheader(fhandle,
113e5afe575SCameron Smith     &  c_char_'number of interior elements' // char(0),
114e5afe575SCameron Smith     &  c_loc(numel),ione, dataInt, iotype)
11559599516SKenneth E. Jansen
116d5d2f64dSCameron Smith      call phio_readheader(fhandle,
117e5afe575SCameron Smith     &  c_char_'number of boundary elements' // char(0),
118e5afe575SCameron Smith     &  c_loc(numelb),ione, dataInt, iotype)
11959599516SKenneth E. Jansen
120d5d2f64dSCameron Smith      call phio_readheader(fhandle,
121e5afe575SCameron Smith     &  c_char_'maximum number of element nodes' // char(0),
122e5afe575SCameron Smith     &  c_loc(nen),ione, dataInt, iotype)
12359599516SKenneth E. Jansen
124d5d2f64dSCameron Smith      call phio_readheader(fhandle,
125e5afe575SCameron Smith     &  c_char_'number of interior tpblocks' // char(0),
126e5afe575SCameron Smith     &  c_loc(nelblk),ione, dataInt, iotype)
12759599516SKenneth E. Jansen
128d5d2f64dSCameron Smith      call phio_readheader(fhandle,
129e5afe575SCameron Smith     & c_char_'number of boundary tpblocks' // char(0),
130e5afe575SCameron Smith     & c_loc(nelblb),ione, dataInt, iotype)
13159599516SKenneth E. Jansen
132d5d2f64dSCameron Smith      call phio_readheader(fhandle,
133e5afe575SCameron Smith     & c_char_'number of nodes with Dirichlet BCs' // char(0),
134e5afe575SCameron Smith     & c_loc(numpbc),ione, dataInt, iotype)
13559599516SKenneth E. Jansen
136d5d2f64dSCameron Smith      call phio_readheader(fhandle,
137e5afe575SCameron Smith     & c_char_'number of shape functions' // char(0),
138e5afe575SCameron Smith     & c_loc(ntopsh),ione, dataInt, iotype)
13959599516SKenneth E. Jansenc
14059599516SKenneth E. Jansenc.... calculate the maximum number of boundary element nodes
14159599516SKenneth E. Jansenc
14259599516SKenneth E. Jansen      nenb = 0
14359599516SKenneth E. Jansen      do i = 1, melCat
14459599516SKenneth E. Jansen         if (nen .eq. nenCat(i,nsd)) nenb = max(nenCat(i,nsd-1), nenb)
14559599516SKenneth E. Jansen      enddo
14659599516SKenneth E. Jansen      if (myrank == master) then
14759599516SKenneth E. Jansen         if (nenb .eq. 0) call error ('input   ','nen     ',nen)
14859599516SKenneth E. Jansen      endif
14959599516SKenneth E. Jansenc
15059599516SKenneth E. Jansenc.... setup some useful constants
15159599516SKenneth E. Jansenc
15259599516SKenneth E. Jansen      I3nsd  = nsd / 3          ! nsd=3 integer flag
15359599516SKenneth E. Jansen      E3nsd  = float(I3nsd)     ! nsd=3 real    flag
15459599516SKenneth E. Jansen      if(matflg(1,1).lt.0) then
15559599516SKenneth E. Jansen         nflow = nsd + 1
15659599516SKenneth E. Jansen      else
15759599516SKenneth E. Jansen         nflow = nsd + 2
15859599516SKenneth E. Jansen      endif
15959599516SKenneth E. Jansen      ndof   = nsd + 2
16059599516SKenneth E. Jansen      nsclr=impl(1)/100
16159599516SKenneth E. Jansen      ndof=ndof+nsclr           ! number of sclr transport equations to solve
16259599516SKenneth E. Jansen
16359599516SKenneth E. Jansen      ndofBC = ndof + I3nsd     ! dimension of BC array
16459599516SKenneth E. Jansen      ndiBCB = 2                ! dimension of iBCB array
16559599516SKenneth E. Jansen      ndBCB  = ndof + 1         ! dimension of BCB array
16659599516SKenneth E. Jansen      nsymdf = (ndof*(ndof + 1)) / 2 ! symm. d.o.f.'s
16759599516SKenneth E. Jansenc
16859599516SKenneth E. Jansenc.... ----------------------> Communication tasks <--------------------
16959599516SKenneth E. Jansenc
17059599516SKenneth E. Jansen      if(numpe > 1) then
171d5d2f64dSCameron Smith         call phio_readheader(fhandle,
172e5afe575SCameron Smith     &    c_char_'size of ilwork array' // char(0),
173e5afe575SCameron Smith     &    c_loc(nlwork),ione, dataInt, iotype)
17459599516SKenneth E. Jansen
175d5d2f64dSCameron Smith         call phio_readheader(fhandle,
176e5afe575SCameron Smith     &    c_char_'ilwork' //char(0),
177e5afe575SCameron Smith     &    c_loc(nlwork),ione, dataInt, iotype)
17859599516SKenneth E. Jansen
17959599516SKenneth E. Jansen         allocate( point2ilwork(nlwork) )
18059599516SKenneth E. Jansen         allocate( ilworkread(nlwork) )
181d5d2f64dSCameron Smith         call phio_readdatablock(fhandle, c_char_'ilwork' // char(0),
182bc62cfd4SCameron Smith     &      c_loc(ilworkread), nlwork, dataInt , iotype)
18359599516SKenneth E. Jansen
18459599516SKenneth E. Jansen         point2ilwork = ilworkread
18559599516SKenneth E. Jansen         call ctypes (point2ilwork)
186513954efSKenneth E. Jansen
187ec121c45SKenneth E. Jansen       if((usingPETSc.eq.1).or.(svLSFlag.eq.1)) then
188513954efSKenneth E. Jansen         fncorpsize = nshg
189513954efSKenneth E. Jansen         allocate(fncorp(fncorpsize))
190513954efSKenneth E. Jansen         call gen_ncorp(fncorp, ilworkread, nlwork, fncorpsize)
191513954efSKenneth E. Jansen!
192513954efSKenneth E. Jansen! the  following code finds the global range of the owned nodes
193513954efSKenneth E. Jansen!
194513954efSKenneth E. Jansen         maxowned=0
195513954efSKenneth E. Jansen         minowned=maxval(fncorp)
196513954efSKenneth E. Jansen         do i = 1,nshg
197513954efSKenneth E. Jansen            if(fncorp(i).gt.0) then  ! don't consider remote copies
198513954efSKenneth E. Jansen               maxowned=max(maxowned,fncorp(i))
199513954efSKenneth E. Jansen               minowned=min(minowned,fncorp(i))
200513954efSKenneth E. Jansen            endif
201513954efSKenneth E. Jansen         enddo
202513954efSKenneth E. Jansen!
203513954efSKenneth E. Jansen!  end of global range code
204513954efSKenneth E. Jansen!
205513954efSKenneth E. Jansen         call commuInt(fncorp, point2ilwork, 1, 'out')
206513954efSKenneth E. Jansen         ncorpsize = fncorpsize
207513954efSKenneth E. Jansen       endif
208ec121c45SKenneth E. Jansen       if(svLSFlag.eq.1) then
209ec121c45SKenneth E. Jansen         allocate(ltg(ncorpsize))
210ec121c45SKenneth E. Jansen         ltg(:)=fncorp(:)
211ec121c45SKenneth E. Jansen       endif
21259599516SKenneth E. Jansen      else
213*c90fc7c7SKenneth E. Jansen       if((usingPETSc.eq.1)) then
214*c90fc7c7SKenneth E. Jansen         fncorpsize = nshg
215*c90fc7c7SKenneth E. Jansen         allocate(fncorp(fncorpsize))
216*c90fc7c7SKenneth E. Jansen         maxowned=nshg
217*c90fc7c7SKenneth E. Jansen         minowned=1
218*c90fc7c7SKenneth E. Jansen         iownnodes=nshg
219*c90fc7c7SKenneth E. Jansen           do i =1,nshg
220*c90fc7c7SKenneth E. Jansen             fncorp(i)=i
221*c90fc7c7SKenneth E. Jansen           enddo
222*c90fc7c7SKenneth E. Jansen       endif
223*c90fc7c7SKenneth E. Jansen       if((svLSFlag.eq.1)) then
224ec121c45SKenneth E. Jansen           allocate(ltg(nshg))
225ec121c45SKenneth E. Jansen           do i =1,nshg
226ec121c45SKenneth E. Jansen             ltg(i)=i
227ec121c45SKenneth E. Jansen           enddo
228*c90fc7c7SKenneth E. Jansen       endif
22959599516SKenneth E. Jansen           nlwork=1
23059599516SKenneth E. Jansen           allocate( point2ilwork(1))
23159599516SKenneth E. Jansen           nshg0 = nshg
23259599516SKenneth E. Jansen      endif
23359599516SKenneth E. Jansen
234ec121c45SKenneth E. Jansen
23559599516SKenneth E. Jansen      itwo=2
23659599516SKenneth E. Jansen
237d5d2f64dSCameron Smith      call phio_readheader(fhandle,
238e5afe575SCameron Smith     & c_char_'co-ordinates' // char(0),
239e5afe575SCameron Smith     & c_loc(intfromfile),itwo, dataDbl, iotype)
24059599516SKenneth E. Jansen      numnp=intfromfile(1)
24159599516SKenneth E. Jansen      allocate( point2x(numnp,nsd) )
24259599516SKenneth E. Jansen      allocate( xread(numnp,nsd) )
24359599516SKenneth E. Jansen      ixsiz=numnp*nsd
244d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
245bc62cfd4SCameron Smith     & c_char_'co-ordinates' // char(0),
246bc62cfd4SCameron Smith     & c_loc(xread),ixsiz, dataDbl, iotype)
24759599516SKenneth E. Jansen      point2x = xread
248513954efSKenneth E. Jansen
249513954efSKenneth E. Jansenc..............................for Duct
250513954efSKenneth E. Jansen      if(istretchOutlet.eq.1)then
251513954efSKenneth E. Jansen
252513954efSKenneth E. Jansenc...geometry6
253513954efSKenneth E. Jansen        if(iDuctgeometryType .eq. 6) then
254513954efSKenneth E. Jansen          xmaxn = 1.276
255513954efSKenneth E. Jansen          xmaxo = 0.848
256513954efSKenneth E. Jansen          xmin  = 0.42
257513954efSKenneth E. Jansenc...geometry8
258513954efSKenneth E. Jansen        elseif(iDuctgeometryType .eq. 8)then
259513954efSKenneth E. Jansen          xmaxn=1.6*4.5*0.0254+0.85*1.5
260513954efSKenneth E. Jansen          xmaxo=1.6*4.5*0.0254+0.85*1.0
261513954efSKenneth E. Jansen          xmin =1.6*4.5*0.0254+0.85*0.5
262513954efSKenneth E. Jansen        endif
263513954efSKenneth E. Jansenc...
264513954efSKenneth E. Jansen        alpha=(xmaxn-xmaxo)/(xmaxo-xmin)**2
265513954efSKenneth E. Jansen        where (point2x(:,1) .ge. xmin)
266513954efSKenneth E. Jansenc..... N=# of current elements from .42 to exit(~40)
267513954efSKenneth E. Jansenc..... (x_mx-x_mn)/N=.025
268513954efSKenneth E. Jansenc..... alpha=3    3*.025=.075
269513954efSKenneth E. Jansen           point2x(:,1)=point2x(:,1)+
270513954efSKenneth E. Jansen     &     alpha*(point2x(:,1)-xmin)**2
271513954efSKenneth E. Jansenc..... ftn to stretch x at exit
272513954efSKenneth E. Jansen        endwhere
273513954efSKenneth E. Jansen      endif
274513954efSKenneth E. Jansen
27559599516SKenneth E. Jansenc
27659599516SKenneth E. Jansenc.... read in and block out the connectivity
27759599516SKenneth E. Jansenc
2780f541e5dSKenneth E. Jansen      if( input_mode .eq. -1 ) then
27959599516SKenneth E. Jansen        call genblk (IBKSIZ)
2800f541e5dSKenneth E. Jansen      else if( input_mode .eq. 0 ) then
2810f541e5dSKenneth E. Jansen        call genblkPosix (IBKSIZ)
2820f541e5dSKenneth E. Jansen      else if( input_mode .ge. 1 ) then
283ab5b07a4SKenneth E. Jansen        call genblkSyncIO (IBKSIZ)
2840f541e5dSKenneth E. Jansen      end if
28559599516SKenneth E. Jansenc
28659599516SKenneth E. Jansenc.... read the boundary condition mapping array
28759599516SKenneth E. Jansenc
28859599516SKenneth E. Jansen      ione=1
289d5d2f64dSCameron Smith      call phio_readheader(fhandle,
290e5afe575SCameron Smith     & c_char_'bc mapping array' // char(0),
291e5afe575SCameron Smith     & c_loc(nshg),ione, dataInt, iotype)
29259599516SKenneth E. Jansen
29359599516SKenneth E. Jansen      allocate( nBC(nshg) )
29459599516SKenneth E. Jansen
29559599516SKenneth E. Jansen      allocate( nBCread(nshg) )
29659599516SKenneth E. Jansen
297d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
298bc62cfd4SCameron Smith     & c_char_'bc mapping array' // char(0),
299bc62cfd4SCameron Smith     & c_loc(nBCread), nshg, dataInt, iotype)
30059599516SKenneth E. Jansen
30159599516SKenneth E. Jansen      nBC=nBCread
30259599516SKenneth E. Jansenc
30359599516SKenneth E. Jansenc.... read the temporary iBC array
30459599516SKenneth E. Jansenc
30559599516SKenneth E. Jansen      ione=1
306d5d2f64dSCameron Smith      call phio_readheader(fhandle,
307e5afe575SCameron Smith     & c_char_'bc codes array' // char(0),
308e5afe575SCameron Smith     & c_loc(numpbc),ione, dataInt, iotype)
30959599516SKenneth E. Jansen
31059599516SKenneth E. Jansen      if ( numpbc > 0 ) then
31159599516SKenneth E. Jansen        allocate( iBCtmp(numpbc) )
31259599516SKenneth E. Jansen        allocate( iBCtmpread(numpbc) )
31359599516SKenneth E. Jansen      else
31459599516SKenneth E. Jansen        allocate( iBCtmp(1) )
31559599516SKenneth E. Jansen        allocate( iBCtmpread(1) )
31659599516SKenneth E. Jansen      endif
317d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
318bc62cfd4SCameron Smith     & c_char_'bc codes array' // char(0),
319bc62cfd4SCameron Smith     & c_loc(iBCtmpread), numpbc, dataInt, iotype)
32059599516SKenneth E. Jansen
32159599516SKenneth E. Jansen      if ( numpbc > 0 ) then
32259599516SKenneth E. Jansen         iBCtmp=iBCtmpread
32359599516SKenneth E. Jansen      else  ! sometimes a partition has no BC's
32459599516SKenneth E. Jansen         deallocate( iBCtmpread)
32559599516SKenneth E. Jansen         iBCtmp=0
32659599516SKenneth E. Jansen      endif
32759599516SKenneth E. Jansenc
32859599516SKenneth E. Jansenc.... read boundary condition data
32959599516SKenneth E. Jansenc
33059599516SKenneth E. Jansen      ione=1
331d5d2f64dSCameron Smith      call phio_readheader(fhandle,
332e5afe575SCameron Smith     & c_char_'boundary condition array' // char(0),
333e5afe575SCameron Smith     & c_loc(intfromfile),ione, dataDbl, iotype)
33459599516SKenneth E. Jansen
33559599516SKenneth E. Jansen      if ( numpbc > 0 ) then
33659599516SKenneth E. Jansen         allocate( BCinp(numpbc,ndof+7) )
33759599516SKenneth E. Jansen         nsecondrank=intfromfile(1)/numpbc
33859599516SKenneth E. Jansen         allocate( BCinpread(numpbc,nsecondrank) )
33959599516SKenneth E. Jansen         iBCinpsiz=intfromfile(1)
34059599516SKenneth E. Jansen      else
34159599516SKenneth E. Jansen         allocate( BCinp(1,ndof+7) )
34259599516SKenneth E. Jansen         allocate( BCinpread(0,0) ) !dummy
34359599516SKenneth E. Jansen         iBCinpsiz=intfromfile(1)
34459599516SKenneth E. Jansen      endif
34559599516SKenneth E. Jansen
346d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
347bc62cfd4SCameron Smith     & c_char_'boundary condition array' // char(0),
348bc62cfd4SCameron Smith     & c_loc(BCinpread), iBCinpsiz, dataDbl, iotype)
34959599516SKenneth E. Jansen
35059599516SKenneth E. Jansen      if ( numpbc > 0 ) then
35159599516SKenneth E. Jansen         BCinp(:,1:(ndof+7))=BCinpread(:,1:(ndof+7))
35259599516SKenneth E. Jansen      else  ! sometimes a partition has no BC's
35359599516SKenneth E. Jansen         deallocate(BCinpread)
35459599516SKenneth E. Jansen         BCinp=0
35559599516SKenneth E. Jansen      endif
35659599516SKenneth E. Jansenc
35759599516SKenneth E. Jansenc.... read periodic boundary conditions
35859599516SKenneth E. Jansenc
35959599516SKenneth E. Jansen      ione=1
360d5d2f64dSCameron Smith      call phio_readheader(fhandle,
361e5afe575SCameron Smith     & c_char_'periodic masters array' // char(0),
362e5afe575SCameron Smith     & c_loc(nshg), ione, dataInt, iotype)
36359599516SKenneth E. Jansen      allocate( point2iper(nshg) )
36459599516SKenneth E. Jansen      allocate( iperread(nshg) )
365d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
366bc62cfd4SCameron Smith     & c_char_'periodic masters array' // char(0),
367bc62cfd4SCameron Smith     & c_loc(iperread), nshg, dataInt, iotype)
36859599516SKenneth E. Jansen      point2iper=iperread
36959599516SKenneth E. Jansenc
37059599516SKenneth E. Jansenc.... generate the boundary element blocks
37159599516SKenneth E. Jansenc
3720f541e5dSKenneth E. Jansen      if( input_mode .eq. -1 ) then
3730f541e5dSKenneth E. Jansen        call genbkb (IBKSIZ)
3740f541e5dSKenneth E. Jansen      else if( input_mode .eq. 0 ) then
3750f541e5dSKenneth E. Jansen        call genbkbPosix (IBKSIZ)
3760f541e5dSKenneth E. Jansen      else if( input_mode .ge. 1 ) then
377ab5b07a4SKenneth E. Jansen        call genbkbSyncIO (IBKSIZ)
3780f541e5dSKenneth E. Jansen      end if
37959599516SKenneth E. Jansenc
38059599516SKenneth E. Jansenc  Read in the nsons and ifath arrays if needed
38159599516SKenneth E. Jansenc
38259599516SKenneth E. Jansenc  There is a fundamental shift in the meaning of ifath based on whether
38359599516SKenneth E. Jansenc  there exist homogenous directions in the flow.
38459599516SKenneth E. Jansenc
38559599516SKenneth E. Jansenc  HOMOGENOUS DIRECTIONS EXIST:  Here nfath is the number of inhomogenous
38659599516SKenneth E. Jansenc  points in the TOTAL mesh.  That is to say that each partition keeps a
38759599516SKenneth E. Jansenc  link to  ALL inhomogenous points.  This link is furthermore not to the
38859599516SKenneth E. Jansenc  sms numbering but to the original structured grid numbering.  These
38959599516SKenneth E. Jansenc  inhomogenous points are thought of as fathers, with their sons being all
39059599516SKenneth E. Jansenc  the points in the homogenous directions that have this father's
39159599516SKenneth E. Jansenc  inhomogeneity.  The array ifath takes as an arguement the sms numbering
39259599516SKenneth E. Jansenc  and returns as a result the father.
39359599516SKenneth E. Jansenc
39459599516SKenneth E. Jansenc  In this case nsons is the number of sons that each father has and ifath
39559599516SKenneth E. Jansenc  is an array which tells the
39659599516SKenneth E. Jansenc
39759599516SKenneth E. Jansenc  NO HOMOGENOUS DIRECTIONS.  In this case the mesh would grow to rapidly
39859599516SKenneth E. Jansenc  if we followed the above strategy since every partition would index its
39959599516SKenneth E. Jansenc  points to the ENTIRE mesh.  Furthermore, there would never be a need
40059599516SKenneth E. Jansenc  to average to a node off processor since there is no spatial averaging.
40159599516SKenneth E. Jansenc  Therefore, to properly account for this case we must recognize it and
40259599516SKenneth E. Jansenc  inerrupt certain actions (i.e. assembly of the average across partitions).
40359599516SKenneth E. Jansenc  This case is easily identified by noting that maxval(nsons) =1 (i.e. no
40459599516SKenneth E. Jansenc  father has any sons).  Reiterating to be clear, in this case ifath does
40559599516SKenneth E. Jansenc  not point to a global numbering but instead just points to itself.
40659599516SKenneth E. Jansenc
40759599516SKenneth E. Jansen      nfath=1  ! some architectures choke on a zero or undeclared
40859599516SKenneth E. Jansen                 ! dimension variable.  This sets it to a safe, small value.
40959599516SKenneth E. Jansen      if(((iLES .lt. 20) .and. (iLES.gt.0))
41059599516SKenneth E. Jansen     &                   .or. (itwmod.gt.0)  ) then ! don't forget same
41159599516SKenneth E. Jansen                                                    ! conditional in proces.f
41259599516SKenneth E. Jansen                                                    ! needed for alloc
41359599516SKenneth E. Jansen         ione=1
41459599516SKenneth E. Jansen         if(nohomog.gt.0) then
415d5d2f64dSCameron Smith            call phio_readheader(fhandle,
416e5afe575SCameron Smith     &       c_char_'number of father-nodes' // char(0),
417e5afe575SCameron Smith     &       c_loc(nfath), ione, dataInt, iotype)
41859599516SKenneth E. Jansen
419d5d2f64dSCameron Smith            call phio_readheader(fhandle,
420e5afe575SCameron Smith     &       c_char_'number of son-nodes for each father' // char(0),
421e5afe575SCameron Smith     &       c_loc(nfath), ione, dataInt, iotype)
42259599516SKenneth E. Jansen
42359599516SKenneth E. Jansen            allocate (point2nsons(nfath))
42459599516SKenneth E. Jansen
425d5d2f64dSCameron Smith            call phio_readdatablock(fhandle,
426bc62cfd4SCameron Smith     &       c_char_'number of son-nodes for each father' // char(0),
427bc62cfd4SCameron Smith     &       c_loc(point2nsons),nfath, dataInt, iotype)
42859599516SKenneth E. Jansen
429d5d2f64dSCameron Smith            call phio_readheader(fhandle,
430e5afe575SCameron Smith     &       c_char_'keyword ifath' // char(0),
431e5afe575SCameron Smith     &       c_loc(nshg), ione, dataInt, iotype);
43259599516SKenneth E. Jansen
43359599516SKenneth E. Jansen            allocate (point2ifath(nshg))
43459599516SKenneth E. Jansen
435d5d2f64dSCameron Smith            call phio_readdatablock(fhandle,
436bc62cfd4SCameron Smith     &       c_char_'keyword ifath' // char(0),
437bc62cfd4SCameron Smith     &       c_loc(point2ifath), nshg, dataInt, iotype)
43859599516SKenneth E. Jansen
43959599516SKenneth E. Jansen            nsonmax=maxval(point2nsons)
44059599516SKenneth E. Jansen         else  ! this is the case where there is no homogeneity
44159599516SKenneth E. Jansen               ! therefore ever node is a father (too itself).  sonfath
44259599516SKenneth E. Jansen               ! (a routine in NSpre) will set this up but this gives
44359599516SKenneth E. Jansen               ! you an option to avoid that.
44459599516SKenneth E. Jansen            nfath=nshg
44559599516SKenneth E. Jansen            allocate (point2nsons(nfath))
44659599516SKenneth E. Jansen            point2nsons=1
44759599516SKenneth E. Jansen            allocate (point2ifath(nshg))
44859599516SKenneth E. Jansen            do i=1,nshg
44959599516SKenneth E. Jansen               point2ifath(i)=i
45059599516SKenneth E. Jansen            enddo
45159599516SKenneth E. Jansen            nsonmax=1
45259599516SKenneth E. Jansen         endif
45359599516SKenneth E. Jansen      else
45459599516SKenneth E. Jansen         allocate (point2nsons(1))
45559599516SKenneth E. Jansen         allocate (point2ifath(1))
45659599516SKenneth E. Jansen      endif
45759599516SKenneth E. Jansen
458d7abaf6cSCameron Smith      call phio_closefile(fhandle);
459266200f9SCameron Smith      iotime = TMRC() - iotime
460266200f9SCameron Smith      if (myrank.eq.master) then
461266200f9SCameron Smith        write(*,*) 'time to read geombc (seconds)', iotime
462266200f9SCameron Smith      endif
463266200f9SCameron Smith
46459599516SKenneth E. Jansenc.... Read restart files
465266200f9SCameron Smith      iotime = TMRC()
4669f4aafb6SCameron Smith      if( input_mode .eq. -1 ) then
467a486e66cSCameron Smith        call streamio_setup_read(fhandle, geomRestartStream)
4689f4aafb6SCameron Smith      else if( input_mode .eq. 0 ) then
469d7abaf6cSCameron Smith        call posixio_setup(fhandle, c_char_'r')
4709f4aafb6SCameron Smith      else if( input_mode .ge. 1 ) then
471d7abaf6cSCameron Smith        call syncio_setup_read(nsynciofiles, fhandle)
472d7abaf6cSCameron Smith      end if
473a93de25bSCameron Smith      call phio_constructName(fhandle,
474d7abaf6cSCameron Smith     &        c_char_'restart' // char(0), fnamer)
4759071d3baSCameron Smith      call phstr_appendInt(fnamer, irstart)
4769071d3baSCameron Smith      call phstr_appendStr(fnamer, c_char_'.'//c_null_char)
477d7abaf6cSCameron Smith      call phio_openfile(fnamer, fhandle);
47859599516SKenneth E. Jansen
47959599516SKenneth E. Jansen      ithree=3
48059599516SKenneth E. Jansen
48159599516SKenneth E. Jansen      itmp = int(log10(float(myrank+1)))+1
48259599516SKenneth E. Jansen
48359599516SKenneth E. Jansen      intfromfile=0
484d5d2f64dSCameron Smith      call phio_readheader(fhandle,
485e5afe575SCameron Smith     & c_char_'solution' // char(0),
486e5afe575SCameron Smith     & c_loc(intfromfile), ithree, dataInt, iotype)
48759599516SKenneth E. Jansenc
48859599516SKenneth E. Jansenc.... read the values of primitive variables into q
48959599516SKenneth E. Jansenc
49059599516SKenneth E. Jansen      allocate( qold(nshg,ndof) )
49159599516SKenneth E. Jansen      if(intfromfile(1).ne.0) then
49259599516SKenneth E. Jansen         nshg2=intfromfile(1)
49359599516SKenneth E. Jansen         ndof2=intfromfile(2)
49459599516SKenneth E. Jansen         lstep=intfromfile(3)
49559599516SKenneth E. Jansen         if(ndof2.ne.ndof) then
49659599516SKenneth E. Jansen
49759599516SKenneth E. Jansen         endif
49859599516SKenneth E. Jansen        if (nshg2 .ne. nshg)
49959599516SKenneth E. Jansen     &        call error ('restar  ', 'nshg   ', nshg)
50059599516SKenneth E. Jansen         allocate( qread(nshg,ndof2) )
50159599516SKenneth E. Jansen         iqsiz=nshg*ndof2
502d5d2f64dSCameron Smith         call phio_readdatablock(fhandle,
503bc62cfd4SCameron Smith     &    c_char_'solution' // char(0),
504bc62cfd4SCameron Smith     &    c_loc(qread),iqsiz, dataDbl,iotype)
50559599516SKenneth E. Jansen         qold(:,1:ndof)=qread(:,1:ndof)
50659599516SKenneth E. Jansen         deallocate(qread)
50759599516SKenneth E. Jansen      else
50859599516SKenneth E. Jansen         if (myrank.eq.master) then
50959599516SKenneth E. Jansen            if (matflg(1,1).eq.0) then ! compressible
51059599516SKenneth E. Jansen               warning='Solution is set to zero (with p and T to one)'
51159599516SKenneth E. Jansen            else
51259599516SKenneth E. Jansen               warning='Solution is set to zero'
51359599516SKenneth E. Jansen            endif
51459599516SKenneth E. Jansen            write(*,*) warning
51559599516SKenneth E. Jansen         endif
51659599516SKenneth E. Jansen         qold=zero
51759599516SKenneth E. Jansen         if (matflg(1,1).eq.0) then ! compressible
51859599516SKenneth E. Jansen            qold(:,1)=one ! avoid zero pressure
51959599516SKenneth E. Jansen            qold(:,nflow)=one ! avoid zero temperature
52059599516SKenneth E. Jansen         endif
52159599516SKenneth E. Jansen      endif
52259599516SKenneth E. Jansen
52359599516SKenneth E. Jansen      intfromfile=0
524d5d2f64dSCameron Smith      call phio_readheader(fhandle,
525e5afe575SCameron Smith     & c_char_'time derivative of solution' // char(0),
526e5afe575SCameron Smith     & c_loc(intfromfile), ithree, dataInt, iotype)
52759599516SKenneth E. Jansen      allocate( acold(nshg,ndof) )
52859599516SKenneth E. Jansen      if(intfromfile(1).ne.0) then
52959599516SKenneth E. Jansen         nshg2=intfromfile(1)
53059599516SKenneth E. Jansen         ndof2=intfromfile(2)
53159599516SKenneth E. Jansen         lstep=intfromfile(3)
53259599516SKenneth E. Jansen
53359599516SKenneth E. Jansen         if (nshg2 .ne. nshg)
53459599516SKenneth E. Jansen     &        call error ('restar  ', 'nshg   ', nshg)
53559599516SKenneth E. Jansen         allocate( acread(nshg,ndof2) )
53659599516SKenneth E. Jansen         acread=zero
53759599516SKenneth E. Jansen         iacsiz=nshg*ndof2
538d5d2f64dSCameron Smith         call phio_readdatablock(fhandle,
539bc62cfd4SCameron Smith     &    c_char_'time derivative of solution' // char(0),
540bc62cfd4SCameron Smith     &    c_loc(acread), iacsiz, dataDbl,iotype)
54159599516SKenneth E. Jansen         acold(:,1:ndof)=acread(:,1:ndof)
54259599516SKenneth E. Jansen         deallocate(acread)
54359599516SKenneth E. Jansen      else
54459599516SKenneth E. Jansen         if (myrank.eq.master) then
54559599516SKenneth E. Jansen            warning='Time derivative of solution is set to zero (SAFE)'
54659599516SKenneth E. Jansen            write(*,*) warning
54759599516SKenneth E. Jansen         endif
54859599516SKenneth E. Jansen         acold=zero
54959599516SKenneth E. Jansen      endif
55059599516SKenneth E. Jansencc
55159599516SKenneth E. Jansencc.... read the header and check it against the run data
55259599516SKenneth E. Jansencc
55359599516SKenneth E. Jansen      if (ideformwall.eq.1) then
55459599516SKenneth E. Jansen
55559599516SKenneth E. Jansen          intfromfile=0
556d5d2f64dSCameron Smith          call phio_readheader(fhandle,
557e5afe575SCameron Smith     &     c_char_'displacement' // char(0),
558e5afe575SCameron Smith     &     c_loc(intfromfile), ithree, dataInt, iotype)
55959599516SKenneth E. Jansen
56059599516SKenneth E. Jansen         nshg2=intfromfile(1)
56159599516SKenneth E. Jansen         ndisp=intfromfile(2)
56259599516SKenneth E. Jansen         lstep=intfromfile(3)
56359599516SKenneth E. Jansen         if(ndisp.ne.nsd) then
56459599516SKenneth E. Jansen            warning='WARNING ndisp not equal nsd'
56559599516SKenneth E. Jansen            write(*,*) warning , ndisp
56659599516SKenneth E. Jansen         endif
56759599516SKenneth E. Jansen         if (nshg2 .ne. nshg)
56859599516SKenneth E. Jansen     &        call error ('restar  ', 'nshg   ', nshg)
56959599516SKenneth E. Jansenc
57059599516SKenneth E. Jansenc.... read the values of primitive variables into uold
57159599516SKenneth E. Jansenc
57259599516SKenneth E. Jansen         allocate( uold(nshg,nsd) )
57359599516SKenneth E. Jansen         allocate( uread(nshg,nsd) )
57459599516SKenneth E. Jansen
57559599516SKenneth E. Jansen         iusiz=nshg*nsd
57659599516SKenneth E. Jansen
577d5d2f64dSCameron Smith         call phio_readdatablock(fhandle,
578bc62cfd4SCameron Smith     &    c_char_'displacement' // char(0),
579bc62cfd4SCameron Smith     &    c_loc(uread), iusiz, dataDbl, iotype)
58059599516SKenneth E. Jansen
58159599516SKenneth E. Jansen         uold(:,1:nsd)=uread(:,1:nsd)
58259599516SKenneth E. Jansen       else
58359599516SKenneth E. Jansen         allocate( uold(nshg,nsd) )
58459599516SKenneth E. Jansen         uold(:,1:nsd) = zero
58559599516SKenneth E. Jansen       endif
58659599516SKenneth E. Jansenc
58759599516SKenneth E. Jansenc.... close c-binary files
58859599516SKenneth E. Jansenc
589d7abaf6cSCameron Smith      call phio_closefile(fhandle)
590266200f9SCameron Smith      iotime = TMRC() - iotime
591266200f9SCameron Smith      if (myrank.eq.master) then
592266200f9SCameron Smith        write(*,*) 'time to read restart (seconds)', iotime
593266200f9SCameron Smith      endif
59459599516SKenneth E. Jansen
59559599516SKenneth E. Jansen      deallocate(xread)
59659599516SKenneth E. Jansen      if ( numpbc > 0 )  then
59759599516SKenneth E. Jansen         deallocate(bcinpread)
59859599516SKenneth E. Jansen         deallocate(ibctmpread)
59959599516SKenneth E. Jansen      endif
60059599516SKenneth E. Jansen      deallocate(iperread)
60159599516SKenneth E. Jansen      if(numpe.gt.1)
60259599516SKenneth E. Jansen     &     deallocate(ilworkread)
60359599516SKenneth E. Jansen      deallocate(nbcread)
60459599516SKenneth E. Jansen
60559599516SKenneth E. Jansen      return
60659599516SKenneth E. Jansen 994  call error ('input   ','opening ', igeomBAK)
60759599516SKenneth E. Jansen 995  call error ('input   ','opening ', igeomBAK)
60859599516SKenneth E. Jansen 997  call error ('input   ','end file', igeomBAK)
60959599516SKenneth E. Jansen 998  call error ('input   ','end file', igeomBAK)
61059599516SKenneth E. Jansen      end
61159599516SKenneth E. Jansenc
61259599516SKenneth E. Jansenc No longer called but kept around in case....
61359599516SKenneth E. Jansenc
61459599516SKenneth E. Jansen      subroutine genpzero(iBC)
61559599516SKenneth E. Jansen
61659599516SKenneth E. Jansen      use pointer_data
61759599516SKenneth E. Jansen      include "common.h"
61859599516SKenneth E. Jansen      integer iBC(nshg)
61959599516SKenneth E. Jansenc
62059599516SKenneth E. Jansenc....  check to see if any of the nodes have a dirichlet pressure
62159599516SKenneth E. Jansenc
62259599516SKenneth E. Jansen      pzero=1
62359599516SKenneth E. Jansen      if (any(btest(iBC,2))) pzero=0
62459599516SKenneth E. Jansen      do iblk = 1, nelblb
62559599516SKenneth E. Jansen         npro = lcblkb(1,iblk+1)-lcblkb(1,iblk)
62659599516SKenneth E. Jansen         do i=1, npro
62759599516SKenneth E. Jansen            iBCB1=miBCB(iblk)%p(i,1)
62859599516SKenneth E. Jansenc
62959599516SKenneth E. Jansenc.... check to see if any of the nodes have a Neumann pressure
63059599516SKenneth E. Jansenc     but not periodic (note that
63159599516SKenneth E. Jansenc
63259599516SKenneth E. Jansen            if(btest(iBCB1,1)) pzero=0
63359599516SKenneth E. Jansen         enddo
63459599516SKenneth E. Jansenc
63559599516SKenneth E. Jansenc.... share results with other processors
63659599516SKenneth E. Jansenc
63759599516SKenneth E. Jansen         pzl=pzero
63859599516SKenneth E. Jansen         if (numpe .gt. 1)
63959599516SKenneth E. Jansen     &        call MPI_ALLREDUCE (pzl, pzero, 1,
64059599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_MIN, MPI_COMM_WORLD,ierr)
64159599516SKenneth E. Jansen      enddo
64259599516SKenneth E. Jansen      return
64359599516SKenneth E. Jansen      end
644