xref: /phasta/phSolver/common/readnblk.f (revision a93de25bae149ad19f75861f2d379ed7e8392d86)
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(:)
2159599516SKenneth E. Jansen      integer, allocatable :: nBC(:)
2259599516SKenneth E. Jansen      integer, allocatable :: point2iper(:)
239a6935e5SKenneth E. Jansen      integer, target, allocatable :: point2ifath(:)
249a6935e5SKenneth E. Jansen      integer, target, allocatable :: point2nsons(:)
2559599516SKenneth E. Jansen
2659599516SKenneth E. Jansen      end module
2759599516SKenneth E. Jansen
2859599516SKenneth E. Jansen      subroutine readnblk
29e5afe575SCameron Smith      use iso_c_binding
3059599516SKenneth E. Jansen      use readarrays
31e5afe575SCameron Smith      use phio
32ab645d52SCameron Smith      use syncio
33ab645d52SCameron Smith      use posixio
34ab645d52SCameron Smith      use streamio
3559599516SKenneth E. Jansen      include "common.h"
3602ce253eSCameron Smith
379a6935e5SKenneth E. Jansen      real*8, target, allocatable :: xread(:,:), qread(:,:), acread(:,:)
389a6935e5SKenneth E. Jansen      real*8, target, allocatable :: uread(:,:)
399a6935e5SKenneth E. Jansen      real*8, target, allocatable :: BCinpread(:,:)
409a6935e5SKenneth E. Jansen      integer, target, allocatable :: iperread(:), iBCtmpread(:)
419a6935e5SKenneth E. Jansen      integer, target, allocatable :: ilworkread(:), nBCread(:)
4259599516SKenneth E. Jansen      character*10 cname2
4359599516SKenneth E. Jansen      character*8 mach2
4459599516SKenneth E. Jansen      character*30 fmt1
4559599516SKenneth E. Jansen      character*255 fname1,fnamer,fnamelr
4659599516SKenneth E. Jansen      character*255 warning
4759599516SKenneth E. Jansen      integer igeomBAK, ibndc, irstin, ierr
489a6935e5SKenneth E. Jansen      integer, target :: intfromfile(50) ! integers read from headers
4959599516SKenneth E. Jansen      integer :: descriptor, descriptorG, GPID, color, nfiles, nfields
5059599516SKenneth E. Jansen      integer ::  numparts, nppf
5159599516SKenneth E. Jansen      integer :: ierr_io, numprocs, itmp, itmp2
52ade0e30fSCameron Smith      integer :: ignored
53d7abaf6cSCameron Smith      integer :: fileFmt
5459599516SKenneth E. Jansen      character*255 fname2, temp2
5559599516SKenneth E. Jansen      character*64 temp1
56e5afe575SCameron Smith      type(c_ptr) :: handle
57e5afe575SCameron Smith      character(len=1024) :: dataInt, dataDbl
58e5afe575SCameron Smith      dataInt = c_char_'integer'//c_null_char
59e5afe575SCameron Smith      dataDbl = c_char_'double'//c_null_char
6059599516SKenneth E. Jansenc
6159599516SKenneth E. Jansenc.... determine the step number to start with
6259599516SKenneth E. Jansenc
6359599516SKenneth E. Jansen      open(unit=72,file='numstart.dat',status='old')
6459599516SKenneth E. Jansen      read(72,*) irstart
6559599516SKenneth E. Jansen      close(72)
6659599516SKenneth E. Jansen      lstep=irstart ! in case restart files have no fields
6759599516SKenneth E. Jansen
6859599516SKenneth E. Jansen      fname1='geombc.dat'
6959599516SKenneth E. Jansen      fname1= trim(fname1)  // cname2(myrank+1)
7059599516SKenneth E. Jansen
7159599516SKenneth E. Jansen      itmp=1
7259599516SKenneth E. Jansen      if (irstart .gt. 0) itmp = int(log10(float(irstart)))+1
7359599516SKenneth E. Jansen      write (fmt1,"('(''restart.'',i',i1,',1x)')") itmp
7459599516SKenneth E. Jansen      write (fnamer,fmt1) irstart
7559599516SKenneth E. Jansen      fnamer = trim(fnamer) // cname2(myrank+1)
7659599516SKenneth E. Jansenc
7759599516SKenneth E. Jansenc.... open input files
7859599516SKenneth E. Jansenc.... input the geometry parameters
7959599516SKenneth E. Jansenc
8059599516SKenneth E. Jansen      nfiles = nsynciofiles
8159599516SKenneth E. Jansen      numparts = numpe !This is the common settings. Beware if you try to compute several parts per process
8259599516SKenneth E. Jansen
8359599516SKenneth E. Jansen      itwo=2
8459599516SKenneth E. Jansen      ione=1
8559599516SKenneth E. Jansen      ieleven=11
8659599516SKenneth E. Jansen      itmp = int(log10(float(myrank+1)))+1
8759599516SKenneth E. Jansen
88ab645d52SCameron Smith      if( nsynciofiles .eq. -1 ) then
89ab645d52SCameron Smith        call streamio_setup(grstream, fhandle)
90ab645d52SCameron Smith      else if( nsynciofiles .eq. 0 ) then
91ab645d52SCameron Smith        call posixio_setup(fhandle, c_char_'r')
92*a93de25bSCameron Smith      else if( nsynciofiles .ge. 1 ) then
93ab645d52SCameron Smith        call syncio_setup_read(nsynciofiles, fhandle)
942efdc748SKenneth E. Jansen      end if
95*a93de25bSCameron Smith      call phio_constructName(fhandle,
96d7abaf6cSCameron Smith     &        c_char_'geombc' // char(0), fname1)
97d7abaf6cSCameron Smith      call phio_openfile(fname1, fhandle);
9859599516SKenneth E. Jansen
99d5d2f64dSCameron Smith      call phio_readheader(fhandle,c_char_'number of nodes' // char(0),
100e5afe575SCameron Smith     & c_loc(numnp),ione, dataInt, iotype)
10159599516SKenneth E. Jansen
102d5d2f64dSCameron Smith      call phio_readheader(fhandle,c_char_'number of modes' // char(0),
103e5afe575SCameron Smith     & c_loc(nshg),ione, dataInt, iotype)
10459599516SKenneth E. Jansen
105d5d2f64dSCameron Smith      call phio_readheader(fhandle,
106e5afe575SCameron Smith     &  c_char_'number of interior elements' // char(0),
107e5afe575SCameron Smith     &  c_loc(numel),ione, dataInt, iotype)
10859599516SKenneth E. Jansen
109d5d2f64dSCameron Smith      call phio_readheader(fhandle,
110e5afe575SCameron Smith     &  c_char_'number of boundary elements' // char(0),
111e5afe575SCameron Smith     &  c_loc(numelb),ione, dataInt, iotype)
11259599516SKenneth E. Jansen
113d5d2f64dSCameron Smith      call phio_readheader(fhandle,
114e5afe575SCameron Smith     &  c_char_'maximum number of element nodes' // char(0),
115e5afe575SCameron Smith     &  c_loc(nen),ione, dataInt, iotype)
11659599516SKenneth E. Jansen
117d5d2f64dSCameron Smith      call phio_readheader(fhandle,
118e5afe575SCameron Smith     &  c_char_'number of interior tpblocks' // char(0),
119e5afe575SCameron Smith     &  c_loc(nelblk),ione, dataInt, iotype)
12059599516SKenneth E. Jansen
121d5d2f64dSCameron Smith      call phio_readheader(fhandle,
122e5afe575SCameron Smith     & c_char_'number of boundary tpblocks' // char(0),
123e5afe575SCameron Smith     & c_loc(nelblb),ione, dataInt, iotype)
12459599516SKenneth E. Jansen
125d5d2f64dSCameron Smith      call phio_readheader(fhandle,
126e5afe575SCameron Smith     & c_char_'number of nodes with Dirichlet BCs' // char(0),
127e5afe575SCameron Smith     & c_loc(numpbc),ione, dataInt, iotype)
12859599516SKenneth E. Jansen
129d5d2f64dSCameron Smith      call phio_readheader(fhandle,
130e5afe575SCameron Smith     & c_char_'number of shape functions' // char(0),
131e5afe575SCameron Smith     & c_loc(ntopsh),ione, dataInt, iotype)
13259599516SKenneth E. Jansenc
13359599516SKenneth E. Jansenc.... calculate the maximum number of boundary element nodes
13459599516SKenneth E. Jansenc
13559599516SKenneth E. Jansen      nenb = 0
13659599516SKenneth E. Jansen      do i = 1, melCat
13759599516SKenneth E. Jansen         if (nen .eq. nenCat(i,nsd)) nenb = max(nenCat(i,nsd-1), nenb)
13859599516SKenneth E. Jansen      enddo
13959599516SKenneth E. Jansen      if (myrank == master) then
14059599516SKenneth E. Jansen         if (nenb .eq. 0) call error ('input   ','nen     ',nen)
14159599516SKenneth E. Jansen      endif
14259599516SKenneth E. Jansenc
14359599516SKenneth E. Jansenc.... setup some useful constants
14459599516SKenneth E. Jansenc
14559599516SKenneth E. Jansen      I3nsd  = nsd / 3          ! nsd=3 integer flag
14659599516SKenneth E. Jansen      E3nsd  = float(I3nsd)     ! nsd=3 real    flag
14759599516SKenneth E. Jansen      if(matflg(1,1).lt.0) then
14859599516SKenneth E. Jansen         nflow = nsd + 1
14959599516SKenneth E. Jansen      else
15059599516SKenneth E. Jansen         nflow = nsd + 2
15159599516SKenneth E. Jansen      endif
15259599516SKenneth E. Jansen      ndof   = nsd + 2
15359599516SKenneth E. Jansen      nsclr=impl(1)/100
15459599516SKenneth E. Jansen      ndof=ndof+nsclr           ! number of sclr transport equations to solve
15559599516SKenneth E. Jansen
15659599516SKenneth E. Jansen      ndofBC = ndof + I3nsd     ! dimension of BC array
15759599516SKenneth E. Jansen      ndiBCB = 2                ! dimension of iBCB array
15859599516SKenneth E. Jansen      ndBCB  = ndof + 1         ! dimension of BCB array
15959599516SKenneth E. Jansen      nsymdf = (ndof*(ndof + 1)) / 2 ! symm. d.o.f.'s
16059599516SKenneth E. Jansenc
16159599516SKenneth E. Jansenc.... ----------------------> Communication tasks <--------------------
16259599516SKenneth E. Jansenc
16359599516SKenneth E. Jansen      if(numpe > 1) then
164d5d2f64dSCameron Smith         call phio_readheader(fhandle,
165e5afe575SCameron Smith     &    c_char_'size of ilwork array' // char(0),
166e5afe575SCameron Smith     &    c_loc(nlwork),ione, dataInt, iotype)
16759599516SKenneth E. Jansen
168d5d2f64dSCameron Smith         call phio_readheader(fhandle,
169e5afe575SCameron Smith     &    c_char_'ilwork' //char(0),
170e5afe575SCameron Smith     &    c_loc(nlwork),ione, dataInt, iotype)
17159599516SKenneth E. Jansen
17259599516SKenneth E. Jansen         allocate( point2ilwork(nlwork) )
17359599516SKenneth E. Jansen         allocate( ilworkread(nlwork) )
174d5d2f64dSCameron Smith         call phio_readdatablock(fhandle, c_char_'ilwork' // char(0),
175bc62cfd4SCameron Smith     &      c_loc(ilworkread), nlwork, dataInt , iotype)
17659599516SKenneth E. Jansen
17759599516SKenneth E. Jansen         point2ilwork = ilworkread
17859599516SKenneth E. Jansen         call ctypes (point2ilwork)
17959599516SKenneth E. Jansen      else
18059599516SKenneth E. Jansen           nlwork=1
18159599516SKenneth E. Jansen           allocate( point2ilwork(1))
18259599516SKenneth E. Jansen           nshg0 = nshg
18359599516SKenneth E. Jansen      endif
18459599516SKenneth E. Jansen
18559599516SKenneth E. Jansen      itwo=2
18659599516SKenneth E. Jansen
187d5d2f64dSCameron Smith      call phio_readheader(fhandle,
188e5afe575SCameron Smith     & c_char_'co-ordinates' // char(0),
189e5afe575SCameron Smith     & c_loc(intfromfile),itwo, dataDbl, iotype)
19059599516SKenneth E. Jansen      numnp=intfromfile(1)
19159599516SKenneth E. Jansen      allocate( point2x(numnp,nsd) )
19259599516SKenneth E. Jansen      allocate( xread(numnp,nsd) )
19359599516SKenneth E. Jansen      ixsiz=numnp*nsd
194d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
195bc62cfd4SCameron Smith     & c_char_'co-ordinates' // char(0),
196bc62cfd4SCameron Smith     & c_loc(xread),ixsiz, dataDbl, iotype)
19759599516SKenneth E. Jansen      point2x = xread
19859599516SKenneth E. Jansenc
19959599516SKenneth E. Jansenc.... read in and block out the connectivity
20059599516SKenneth E. Jansenc
20159599516SKenneth E. Jansen      call genblk (IBKSIZ)
20259599516SKenneth E. Jansenc
20359599516SKenneth E. Jansenc.... read the boundary condition mapping array
20459599516SKenneth E. Jansenc
20559599516SKenneth E. Jansen      ione=1
206d5d2f64dSCameron Smith      call phio_readheader(fhandle,
207e5afe575SCameron Smith     & c_char_'bc mapping array' // char(0),
208e5afe575SCameron Smith     & c_loc(nshg),ione, dataInt, iotype)
20959599516SKenneth E. Jansen
21059599516SKenneth E. Jansen      allocate( nBC(nshg) )
21159599516SKenneth E. Jansen
21259599516SKenneth E. Jansen      allocate( nBCread(nshg) )
21359599516SKenneth E. Jansen
214d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
215bc62cfd4SCameron Smith     & c_char_'bc mapping array' // char(0),
216bc62cfd4SCameron Smith     & c_loc(nBCread), nshg, dataInt, iotype)
21759599516SKenneth E. Jansen
21859599516SKenneth E. Jansen      nBC=nBCread
21959599516SKenneth E. Jansenc
22059599516SKenneth E. Jansenc.... read the temporary iBC array
22159599516SKenneth E. Jansenc
22259599516SKenneth E. Jansen      ione=1
223d5d2f64dSCameron Smith      call phio_readheader(fhandle,
224e5afe575SCameron Smith     & c_char_'bc codes array' // char(0),
225e5afe575SCameron Smith     & c_loc(numpbc),ione, dataInt, iotype)
22659599516SKenneth E. Jansen
22759599516SKenneth E. Jansen      if ( numpbc > 0 ) then
22859599516SKenneth E. Jansen        allocate( iBCtmp(numpbc) )
22959599516SKenneth E. Jansen        allocate( iBCtmpread(numpbc) )
23059599516SKenneth E. Jansen      else
23159599516SKenneth E. Jansen        allocate( iBCtmp(1) )
23259599516SKenneth E. Jansen        allocate( iBCtmpread(1) )
23359599516SKenneth E. Jansen      endif
234d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
235bc62cfd4SCameron Smith     & c_char_'bc codes array' // char(0),
236bc62cfd4SCameron Smith     & c_loc(iBCtmpread), numpbc, dataInt, iotype)
23759599516SKenneth E. Jansen
23859599516SKenneth E. Jansen      if ( numpbc > 0 ) then
23959599516SKenneth E. Jansen         iBCtmp=iBCtmpread
24059599516SKenneth E. Jansen      else  ! sometimes a partition has no BC's
24159599516SKenneth E. Jansen         deallocate( iBCtmpread)
24259599516SKenneth E. Jansen         iBCtmp=0
24359599516SKenneth E. Jansen      endif
24459599516SKenneth E. Jansenc
24559599516SKenneth E. Jansenc.... read boundary condition data
24659599516SKenneth E. Jansenc
24759599516SKenneth E. Jansen      ione=1
248d5d2f64dSCameron Smith      call phio_readheader(fhandle,
249e5afe575SCameron Smith     & c_char_'boundary condition array' // char(0),
250e5afe575SCameron Smith     & c_loc(intfromfile),ione, dataDbl, iotype)
25159599516SKenneth E. Jansen
25259599516SKenneth E. Jansen      if ( numpbc > 0 ) then
25359599516SKenneth E. Jansen         allocate( BCinp(numpbc,ndof+7) )
25459599516SKenneth E. Jansen         nsecondrank=intfromfile(1)/numpbc
25559599516SKenneth E. Jansen         allocate( BCinpread(numpbc,nsecondrank) )
25659599516SKenneth E. Jansen         iBCinpsiz=intfromfile(1)
25759599516SKenneth E. Jansen      else
25859599516SKenneth E. Jansen         allocate( BCinp(1,ndof+7) )
25959599516SKenneth E. Jansen         allocate( BCinpread(0,0) ) !dummy
26059599516SKenneth E. Jansen         iBCinpsiz=intfromfile(1)
26159599516SKenneth E. Jansen      endif
26259599516SKenneth E. Jansen
263d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
264bc62cfd4SCameron Smith     & c_char_'boundary condition array' // char(0),
265bc62cfd4SCameron Smith     & c_loc(BCinpread), iBCinpsiz, dataDbl, iotype)
26659599516SKenneth E. Jansen
26759599516SKenneth E. Jansen      if ( numpbc > 0 ) then
26859599516SKenneth E. Jansen         BCinp(:,1:(ndof+7))=BCinpread(:,1:(ndof+7))
26959599516SKenneth E. Jansen      else  ! sometimes a partition has no BC's
27059599516SKenneth E. Jansen         deallocate(BCinpread)
27159599516SKenneth E. Jansen         BCinp=0
27259599516SKenneth E. Jansen      endif
27359599516SKenneth E. Jansenc
27459599516SKenneth E. Jansenc.... read periodic boundary conditions
27559599516SKenneth E. Jansenc
27659599516SKenneth E. Jansen      ione=1
277d5d2f64dSCameron Smith      call phio_readheader(fhandle,
278e5afe575SCameron Smith     & c_char_'periodic masters array' // char(0),
279e5afe575SCameron Smith     & c_loc(nshg), ione, dataInt, iotype)
28059599516SKenneth E. Jansen      allocate( point2iper(nshg) )
28159599516SKenneth E. Jansen      allocate( iperread(nshg) )
282d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
283bc62cfd4SCameron Smith     & c_char_'periodic masters array' // char(0),
284bc62cfd4SCameron Smith     & c_loc(iperread), nshg, dataInt, iotype)
28559599516SKenneth E. Jansen      point2iper=iperread
28659599516SKenneth E. Jansenc
28759599516SKenneth E. Jansenc.... generate the boundary element blocks
28859599516SKenneth E. Jansenc
28959599516SKenneth E. Jansen      call genbkb (ibksiz)
29059599516SKenneth E. Jansenc
29159599516SKenneth E. Jansenc  Read in the nsons and ifath arrays if needed
29259599516SKenneth E. Jansenc
29359599516SKenneth E. Jansenc  There is a fundamental shift in the meaning of ifath based on whether
29459599516SKenneth E. Jansenc  there exist homogenous directions in the flow.
29559599516SKenneth E. Jansenc
29659599516SKenneth E. Jansenc  HOMOGENOUS DIRECTIONS EXIST:  Here nfath is the number of inhomogenous
29759599516SKenneth E. Jansenc  points in the TOTAL mesh.  That is to say that each partition keeps a
29859599516SKenneth E. Jansenc  link to  ALL inhomogenous points.  This link is furthermore not to the
29959599516SKenneth E. Jansenc  sms numbering but to the original structured grid numbering.  These
30059599516SKenneth E. Jansenc  inhomogenous points are thought of as fathers, with their sons being all
30159599516SKenneth E. Jansenc  the points in the homogenous directions that have this father's
30259599516SKenneth E. Jansenc  inhomogeneity.  The array ifath takes as an arguement the sms numbering
30359599516SKenneth E. Jansenc  and returns as a result the father.
30459599516SKenneth E. Jansenc
30559599516SKenneth E. Jansenc  In this case nsons is the number of sons that each father has and ifath
30659599516SKenneth E. Jansenc  is an array which tells the
30759599516SKenneth E. Jansenc
30859599516SKenneth E. Jansenc  NO HOMOGENOUS DIRECTIONS.  In this case the mesh would grow to rapidly
30959599516SKenneth E. Jansenc  if we followed the above strategy since every partition would index its
31059599516SKenneth E. Jansenc  points to the ENTIRE mesh.  Furthermore, there would never be a need
31159599516SKenneth E. Jansenc  to average to a node off processor since there is no spatial averaging.
31259599516SKenneth E. Jansenc  Therefore, to properly account for this case we must recognize it and
31359599516SKenneth E. Jansenc  inerrupt certain actions (i.e. assembly of the average across partitions).
31459599516SKenneth E. Jansenc  This case is easily identified by noting that maxval(nsons) =1 (i.e. no
31559599516SKenneth E. Jansenc  father has any sons).  Reiterating to be clear, in this case ifath does
31659599516SKenneth E. Jansenc  not point to a global numbering but instead just points to itself.
31759599516SKenneth E. Jansenc
31859599516SKenneth E. Jansen      nfath=1  ! some architectures choke on a zero or undeclared
31959599516SKenneth E. Jansen                 ! dimension variable.  This sets it to a safe, small value.
32059599516SKenneth E. Jansen      if(((iLES .lt. 20) .and. (iLES.gt.0))
32159599516SKenneth E. Jansen     &                   .or. (itwmod.gt.0)  ) then ! don't forget same
32259599516SKenneth E. Jansen                                                    ! conditional in proces.f
32359599516SKenneth E. Jansen                                                    ! needed for alloc
32459599516SKenneth E. Jansen         ione=1
32559599516SKenneth E. Jansen         if(nohomog.gt.0) then
326d5d2f64dSCameron Smith            call phio_readheader(fhandle,
327e5afe575SCameron Smith     &       c_char_'number of father-nodes' // char(0),
328e5afe575SCameron Smith     &       c_loc(nfath), ione, dataInt, iotype)
32959599516SKenneth E. Jansen
330d5d2f64dSCameron Smith            call phio_readheader(fhandle,
331e5afe575SCameron Smith     &       c_char_'number of son-nodes for each father' // char(0),
332e5afe575SCameron Smith     &       c_loc(nfath), ione, dataInt, iotype)
33359599516SKenneth E. Jansen
33459599516SKenneth E. Jansen            allocate (point2nsons(nfath))
33559599516SKenneth E. Jansen
336d5d2f64dSCameron Smith            call phio_readdatablock(fhandle,
337bc62cfd4SCameron Smith     &       c_char_'number of son-nodes for each father' // char(0),
338bc62cfd4SCameron Smith     &       c_loc(point2nsons),nfath, dataInt, iotype)
33959599516SKenneth E. Jansen
340d5d2f64dSCameron Smith            call phio_readheader(fhandle,
341e5afe575SCameron Smith     &       c_char_'keyword ifath' // char(0),
342e5afe575SCameron Smith     &       c_loc(nshg), ione, dataInt, iotype);
34359599516SKenneth E. Jansen
34459599516SKenneth E. Jansen            allocate (point2ifath(nshg))
34559599516SKenneth E. Jansen
346d5d2f64dSCameron Smith            call phio_readdatablock(fhandle,
347bc62cfd4SCameron Smith     &       c_char_'keyword ifath' // char(0),
348bc62cfd4SCameron Smith     &       c_loc(point2ifath), nshg, dataInt, iotype)
34959599516SKenneth E. Jansen
35059599516SKenneth E. Jansen            nsonmax=maxval(point2nsons)
35159599516SKenneth E. Jansen         else  ! this is the case where there is no homogeneity
35259599516SKenneth E. Jansen               ! therefore ever node is a father (too itself).  sonfath
35359599516SKenneth E. Jansen               ! (a routine in NSpre) will set this up but this gives
35459599516SKenneth E. Jansen               ! you an option to avoid that.
35559599516SKenneth E. Jansen            nfath=nshg
35659599516SKenneth E. Jansen            allocate (point2nsons(nfath))
35759599516SKenneth E. Jansen            point2nsons=1
35859599516SKenneth E. Jansen            allocate (point2ifath(nshg))
35959599516SKenneth E. Jansen            do i=1,nshg
36059599516SKenneth E. Jansen               point2ifath(i)=i
36159599516SKenneth E. Jansen            enddo
36259599516SKenneth E. Jansen            nsonmax=1
36359599516SKenneth E. Jansen         endif
36459599516SKenneth E. Jansen      else
36559599516SKenneth E. Jansen         allocate (point2nsons(1))
36659599516SKenneth E. Jansen         allocate (point2ifath(1))
36759599516SKenneth E. Jansen      endif
36859599516SKenneth E. Jansen
369d7abaf6cSCameron Smith      call phio_closefile(fhandle);
37059599516SKenneth E. Jansenc.... Read restart files
3712efdc748SKenneth E. Jansen      if(nsynciofiles.gt.0) then
37236adee64SCameron Smith        fnamer = c_char_"restart-dat."//c_null_char
3732efdc748SKenneth E. Jansen      else
3742efdc748SKenneth E. Jansen        fnamer = c_char_"restart."//c_null_char
3752efdc748SKenneth E. Jansen      endif
3762efdc748SKenneth E. Jansen
377d7abaf6cSCameron Smith      if( nsynciofiles .eq. -1 ) then
378d7abaf6cSCameron Smith        call streamio_setup(grstream, fhandle)
379d7abaf6cSCameron Smith      else if( nsynciofiles .eq. 0 ) then
380d7abaf6cSCameron Smith        call posixio_setup(fhandle, c_char_'r')
381*a93de25bSCameron Smith      else if( nsynciofiles .ge. 1 ) then
382d7abaf6cSCameron Smith        call syncio_setup_read(nsynciofiles, fhandle)
383d7abaf6cSCameron Smith      end if
384*a93de25bSCameron Smith      call phio_constructName(fhandle,
385d7abaf6cSCameron Smith     &        c_char_'restart' // char(0), fnamer)
386e81a6dc1SCameron Smith      call phio_appendInt(fnamer, irstart)
387d7abaf6cSCameron Smith      call phio_openfile(fnamer, fhandle);
38859599516SKenneth E. Jansen
38959599516SKenneth E. Jansen      ithree=3
39059599516SKenneth E. Jansen
39159599516SKenneth E. Jansen      itmp = int(log10(float(myrank+1)))+1
39259599516SKenneth E. Jansen
39359599516SKenneth E. Jansen      intfromfile=0
394d5d2f64dSCameron Smith      call phio_readheader(fhandle,
395e5afe575SCameron Smith     & c_char_'solution' // char(0),
396e5afe575SCameron Smith     & c_loc(intfromfile), ithree, dataInt, iotype)
39759599516SKenneth E. Jansenc
39859599516SKenneth E. Jansenc.... read the values of primitive variables into q
39959599516SKenneth E. Jansenc
40059599516SKenneth E. Jansen      allocate( qold(nshg,ndof) )
40159599516SKenneth E. Jansen      if(intfromfile(1).ne.0) then
40259599516SKenneth E. Jansen         nshg2=intfromfile(1)
40359599516SKenneth E. Jansen         ndof2=intfromfile(2)
40459599516SKenneth E. Jansen         lstep=intfromfile(3)
40559599516SKenneth E. Jansen         if(ndof2.ne.ndof) then
40659599516SKenneth E. Jansen
40759599516SKenneth E. Jansen         endif
40859599516SKenneth E. Jansen        if (nshg2 .ne. nshg)
40959599516SKenneth E. Jansen     &        call error ('restar  ', 'nshg   ', nshg)
41059599516SKenneth E. Jansen         allocate( qread(nshg,ndof2) )
41159599516SKenneth E. Jansen         iqsiz=nshg*ndof2
412d5d2f64dSCameron Smith         call phio_readdatablock(fhandle,
413bc62cfd4SCameron Smith     &    c_char_'solution' // char(0),
414bc62cfd4SCameron Smith     &    c_loc(qread),iqsiz, dataDbl,iotype)
41559599516SKenneth E. Jansen         qold(:,1:ndof)=qread(:,1:ndof)
41659599516SKenneth E. Jansen         deallocate(qread)
41759599516SKenneth E. Jansen      else
41859599516SKenneth E. Jansen         if (myrank.eq.master) then
41959599516SKenneth E. Jansen            if (matflg(1,1).eq.0) then ! compressible
42059599516SKenneth E. Jansen               warning='Solution is set to zero (with p and T to one)'
42159599516SKenneth E. Jansen            else
42259599516SKenneth E. Jansen               warning='Solution is set to zero'
42359599516SKenneth E. Jansen            endif
42459599516SKenneth E. Jansen            write(*,*) warning
42559599516SKenneth E. Jansen         endif
42659599516SKenneth E. Jansen         qold=zero
42759599516SKenneth E. Jansen         if (matflg(1,1).eq.0) then ! compressible
42859599516SKenneth E. Jansen            qold(:,1)=one ! avoid zero pressure
42959599516SKenneth E. Jansen            qold(:,nflow)=one ! avoid zero temperature
43059599516SKenneth E. Jansen         endif
43159599516SKenneth E. Jansen      endif
43259599516SKenneth E. Jansen
43359599516SKenneth E. Jansen      intfromfile=0
434d5d2f64dSCameron Smith      call phio_readheader(fhandle,
435e5afe575SCameron Smith     & c_char_'time derivative of solution' // char(0),
436e5afe575SCameron Smith     & c_loc(intfromfile), ithree, dataInt, iotype)
43759599516SKenneth E. Jansen      allocate( acold(nshg,ndof) )
43859599516SKenneth E. Jansen      if(intfromfile(1).ne.0) then
43959599516SKenneth E. Jansen         nshg2=intfromfile(1)
44059599516SKenneth E. Jansen         ndof2=intfromfile(2)
44159599516SKenneth E. Jansen         lstep=intfromfile(3)
44259599516SKenneth E. Jansen
44359599516SKenneth E. Jansen         if (nshg2 .ne. nshg)
44459599516SKenneth E. Jansen     &        call error ('restar  ', 'nshg   ', nshg)
44559599516SKenneth E. Jansen         allocate( acread(nshg,ndof2) )
44659599516SKenneth E. Jansen         acread=zero
44759599516SKenneth E. Jansen         iacsiz=nshg*ndof2
448d5d2f64dSCameron Smith         call phio_readdatablock(fhandle,
449bc62cfd4SCameron Smith     &    c_char_'time derivative of solution' // char(0),
450bc62cfd4SCameron Smith     &    c_loc(acread), iacsiz, dataDbl,iotype)
45159599516SKenneth E. Jansen         acold(:,1:ndof)=acread(:,1:ndof)
45259599516SKenneth E. Jansen         deallocate(acread)
45359599516SKenneth E. Jansen      else
45459599516SKenneth E. Jansen         if (myrank.eq.master) then
45559599516SKenneth E. Jansen            warning='Time derivative of solution is set to zero (SAFE)'
45659599516SKenneth E. Jansen            write(*,*) warning
45759599516SKenneth E. Jansen         endif
45859599516SKenneth E. Jansen         acold=zero
45959599516SKenneth E. Jansen      endif
46059599516SKenneth E. Jansencc
46159599516SKenneth E. Jansencc.... read the header and check it against the run data
46259599516SKenneth E. Jansencc
46359599516SKenneth E. Jansen      if (ideformwall.eq.1) then
46459599516SKenneth E. Jansen
46559599516SKenneth E. Jansen          intfromfile=0
466d5d2f64dSCameron Smith          call phio_readheader(fhandle,
467e5afe575SCameron Smith     &     c_char_'displacement' // char(0),
468e5afe575SCameron Smith     &     c_loc(intfromfile), ithree, dataInt, iotype)
46959599516SKenneth E. Jansen
47059599516SKenneth E. Jansen         nshg2=intfromfile(1)
47159599516SKenneth E. Jansen         ndisp=intfromfile(2)
47259599516SKenneth E. Jansen         lstep=intfromfile(3)
47359599516SKenneth E. Jansen         if(ndisp.ne.nsd) then
47459599516SKenneth E. Jansen            warning='WARNING ndisp not equal nsd'
47559599516SKenneth E. Jansen            write(*,*) warning , ndisp
47659599516SKenneth E. Jansen         endif
47759599516SKenneth E. Jansen         if (nshg2 .ne. nshg)
47859599516SKenneth E. Jansen     &        call error ('restar  ', 'nshg   ', nshg)
47959599516SKenneth E. Jansenc
48059599516SKenneth E. Jansenc.... read the values of primitive variables into uold
48159599516SKenneth E. Jansenc
48259599516SKenneth E. Jansen         allocate( uold(nshg,nsd) )
48359599516SKenneth E. Jansen         allocate( uread(nshg,nsd) )
48459599516SKenneth E. Jansen
48559599516SKenneth E. Jansen         iusiz=nshg*nsd
48659599516SKenneth E. Jansen
487d5d2f64dSCameron Smith         call phio_readdatablock(fhandle,
488bc62cfd4SCameron Smith     &    c_char_'displacement' // char(0),
489bc62cfd4SCameron Smith     &    c_loc(uread), iusiz, dataDbl, iotype)
49059599516SKenneth E. Jansen
49159599516SKenneth E. Jansen         uold(:,1:nsd)=uread(:,1:nsd)
49259599516SKenneth E. Jansen       else
49359599516SKenneth E. Jansen         allocate( uold(nshg,nsd) )
49459599516SKenneth E. Jansen         uold(:,1:nsd) = zero
49559599516SKenneth E. Jansen       endif
49659599516SKenneth E. Jansenc
49759599516SKenneth E. Jansenc.... close c-binary files
49859599516SKenneth E. Jansenc
499d7abaf6cSCameron Smith      call phio_closefile(fhandle)
50059599516SKenneth E. Jansen
50159599516SKenneth E. Jansen      deallocate(xread)
50259599516SKenneth E. Jansen      if ( numpbc > 0 )  then
50359599516SKenneth E. Jansen         deallocate(bcinpread)
50459599516SKenneth E. Jansen         deallocate(ibctmpread)
50559599516SKenneth E. Jansen      endif
50659599516SKenneth E. Jansen      deallocate(iperread)
50759599516SKenneth E. Jansen      if(numpe.gt.1)
50859599516SKenneth E. Jansen     &     deallocate(ilworkread)
50959599516SKenneth E. Jansen      deallocate(nbcread)
51059599516SKenneth E. Jansen
51159599516SKenneth E. Jansen      return
51259599516SKenneth E. Jansen 994  call error ('input   ','opening ', igeomBAK)
51359599516SKenneth E. Jansen 995  call error ('input   ','opening ', igeomBAK)
51459599516SKenneth E. Jansen 997  call error ('input   ','end file', igeomBAK)
51559599516SKenneth E. Jansen 998  call error ('input   ','end file', igeomBAK)
51659599516SKenneth E. Jansen      end
51759599516SKenneth E. Jansenc
51859599516SKenneth E. Jansenc No longer called but kept around in case....
51959599516SKenneth E. Jansenc
52059599516SKenneth E. Jansen      subroutine genpzero(iBC)
52159599516SKenneth E. Jansen
52259599516SKenneth E. Jansen      use pointer_data
52359599516SKenneth E. Jansen      include "common.h"
52459599516SKenneth E. Jansen      integer iBC(nshg)
52559599516SKenneth E. Jansenc
52659599516SKenneth E. Jansenc....  check to see if any of the nodes have a dirichlet pressure
52759599516SKenneth E. Jansenc
52859599516SKenneth E. Jansen      pzero=1
52959599516SKenneth E. Jansen      if (any(btest(iBC,2))) pzero=0
53059599516SKenneth E. Jansen      do iblk = 1, nelblb
53159599516SKenneth E. Jansen         npro = lcblkb(1,iblk+1)-lcblkb(1,iblk)
53259599516SKenneth E. Jansen         do i=1, npro
53359599516SKenneth E. Jansen            iBCB1=miBCB(iblk)%p(i,1)
53459599516SKenneth E. Jansenc
53559599516SKenneth E. Jansenc.... check to see if any of the nodes have a Neumann pressure
53659599516SKenneth E. Jansenc     but not periodic (note that
53759599516SKenneth E. Jansenc
53859599516SKenneth E. Jansen            if(btest(iBCB1,1)) pzero=0
53959599516SKenneth E. Jansen         enddo
54059599516SKenneth E. Jansenc
54159599516SKenneth E. Jansenc.... share results with other processors
54259599516SKenneth E. Jansenc
54359599516SKenneth E. Jansen         pzl=pzero
54459599516SKenneth E. Jansen         if (numpe .gt. 1)
54559599516SKenneth E. Jansen     &        call MPI_ALLREDUCE (pzl, pzero, 1,
54659599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_MIN, MPI_COMM_WORLD,ierr)
54759599516SKenneth E. Jansen      enddo
54859599516SKenneth E. Jansen      return
54959599516SKenneth E. Jansen      end
550