xref: /phasta/phSolver/common/readnblk.f (revision 9f4aafb6046924838358fe70fa1d2d5a25434130)
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
49*9f4aafb6SCameron Smith      integer :: descriptor, descriptorG, GPID, color, 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      numparts = numpe !This is the common settings. Beware if you try to compute several parts per process
8159599516SKenneth E. Jansen
8259599516SKenneth E. Jansen      itwo=2
8359599516SKenneth E. Jansen      ione=1
8459599516SKenneth E. Jansen      ieleven=11
8559599516SKenneth E. Jansen      itmp = int(log10(float(myrank+1)))+1
8659599516SKenneth E. Jansen
87*9f4aafb6SCameron Smith      if( input_mode .eq. -1 ) then
88a486e66cSCameron Smith        call streamio_setup_read(fhandle, geomRestartStream)
89*9f4aafb6SCameron Smith      else if( input_mode .eq. 0 ) then
90ab645d52SCameron Smith        call posixio_setup(fhandle, c_char_'r')
91*9f4aafb6SCameron Smith      else if( input_mode .ge. 1 ) then
92ab645d52SCameron Smith        call syncio_setup_read(nsynciofiles, fhandle)
932efdc748SKenneth E. Jansen      end if
94a93de25bSCameron Smith      call phio_constructName(fhandle,
95d7abaf6cSCameron Smith     &        c_char_'geombc' // char(0), fname1)
96d7abaf6cSCameron Smith      call phio_openfile(fname1, fhandle);
9759599516SKenneth E. Jansen
98d5d2f64dSCameron Smith      call phio_readheader(fhandle,c_char_'number of nodes' // char(0),
99e5afe575SCameron Smith     & c_loc(numnp),ione, dataInt, iotype)
10059599516SKenneth E. Jansen
101d5d2f64dSCameron Smith      call phio_readheader(fhandle,c_char_'number of modes' // char(0),
102e5afe575SCameron Smith     & c_loc(nshg),ione, dataInt, iotype)
10359599516SKenneth E. Jansen
104d5d2f64dSCameron Smith      call phio_readheader(fhandle,
105e5afe575SCameron Smith     &  c_char_'number of interior elements' // char(0),
106e5afe575SCameron Smith     &  c_loc(numel),ione, dataInt, iotype)
10759599516SKenneth E. Jansen
108d5d2f64dSCameron Smith      call phio_readheader(fhandle,
109e5afe575SCameron Smith     &  c_char_'number of boundary elements' // char(0),
110e5afe575SCameron Smith     &  c_loc(numelb),ione, dataInt, iotype)
11159599516SKenneth E. Jansen
112d5d2f64dSCameron Smith      call phio_readheader(fhandle,
113e5afe575SCameron Smith     &  c_char_'maximum number of element nodes' // char(0),
114e5afe575SCameron Smith     &  c_loc(nen),ione, dataInt, iotype)
11559599516SKenneth E. Jansen
116d5d2f64dSCameron Smith      call phio_readheader(fhandle,
117e5afe575SCameron Smith     &  c_char_'number of interior tpblocks' // char(0),
118e5afe575SCameron Smith     &  c_loc(nelblk),ione, dataInt, iotype)
11959599516SKenneth E. Jansen
120d5d2f64dSCameron Smith      call phio_readheader(fhandle,
121e5afe575SCameron Smith     & c_char_'number of boundary tpblocks' // char(0),
122e5afe575SCameron Smith     & c_loc(nelblb),ione, dataInt, iotype)
12359599516SKenneth E. Jansen
124d5d2f64dSCameron Smith      call phio_readheader(fhandle,
125e5afe575SCameron Smith     & c_char_'number of nodes with Dirichlet BCs' // char(0),
126e5afe575SCameron Smith     & c_loc(numpbc),ione, dataInt, iotype)
12759599516SKenneth E. Jansen
128d5d2f64dSCameron Smith      call phio_readheader(fhandle,
129e5afe575SCameron Smith     & c_char_'number of shape functions' // char(0),
130e5afe575SCameron Smith     & c_loc(ntopsh),ione, dataInt, iotype)
13159599516SKenneth E. Jansenc
13259599516SKenneth E. Jansenc.... calculate the maximum number of boundary element nodes
13359599516SKenneth E. Jansenc
13459599516SKenneth E. Jansen      nenb = 0
13559599516SKenneth E. Jansen      do i = 1, melCat
13659599516SKenneth E. Jansen         if (nen .eq. nenCat(i,nsd)) nenb = max(nenCat(i,nsd-1), nenb)
13759599516SKenneth E. Jansen      enddo
13859599516SKenneth E. Jansen      if (myrank == master) then
13959599516SKenneth E. Jansen         if (nenb .eq. 0) call error ('input   ','nen     ',nen)
14059599516SKenneth E. Jansen      endif
14159599516SKenneth E. Jansenc
14259599516SKenneth E. Jansenc.... setup some useful constants
14359599516SKenneth E. Jansenc
14459599516SKenneth E. Jansen      I3nsd  = nsd / 3          ! nsd=3 integer flag
14559599516SKenneth E. Jansen      E3nsd  = float(I3nsd)     ! nsd=3 real    flag
14659599516SKenneth E. Jansen      if(matflg(1,1).lt.0) then
14759599516SKenneth E. Jansen         nflow = nsd + 1
14859599516SKenneth E. Jansen      else
14959599516SKenneth E. Jansen         nflow = nsd + 2
15059599516SKenneth E. Jansen      endif
15159599516SKenneth E. Jansen      ndof   = nsd + 2
15259599516SKenneth E. Jansen      nsclr=impl(1)/100
15359599516SKenneth E. Jansen      ndof=ndof+nsclr           ! number of sclr transport equations to solve
15459599516SKenneth E. Jansen
15559599516SKenneth E. Jansen      ndofBC = ndof + I3nsd     ! dimension of BC array
15659599516SKenneth E. Jansen      ndiBCB = 2                ! dimension of iBCB array
15759599516SKenneth E. Jansen      ndBCB  = ndof + 1         ! dimension of BCB array
15859599516SKenneth E. Jansen      nsymdf = (ndof*(ndof + 1)) / 2 ! symm. d.o.f.'s
15959599516SKenneth E. Jansenc
16059599516SKenneth E. Jansenc.... ----------------------> Communication tasks <--------------------
16159599516SKenneth E. Jansenc
16259599516SKenneth E. Jansen      if(numpe > 1) then
163d5d2f64dSCameron Smith         call phio_readheader(fhandle,
164e5afe575SCameron Smith     &    c_char_'size of ilwork array' // char(0),
165e5afe575SCameron Smith     &    c_loc(nlwork),ione, dataInt, iotype)
16659599516SKenneth E. Jansen
167d5d2f64dSCameron Smith         call phio_readheader(fhandle,
168e5afe575SCameron Smith     &    c_char_'ilwork' //char(0),
169e5afe575SCameron Smith     &    c_loc(nlwork),ione, dataInt, iotype)
17059599516SKenneth E. Jansen
17159599516SKenneth E. Jansen         allocate( point2ilwork(nlwork) )
17259599516SKenneth E. Jansen         allocate( ilworkread(nlwork) )
173d5d2f64dSCameron Smith         call phio_readdatablock(fhandle, c_char_'ilwork' // char(0),
174bc62cfd4SCameron Smith     &      c_loc(ilworkread), nlwork, dataInt , iotype)
17559599516SKenneth E. Jansen
17659599516SKenneth E. Jansen         point2ilwork = ilworkread
17759599516SKenneth E. Jansen         call ctypes (point2ilwork)
17859599516SKenneth E. Jansen      else
17959599516SKenneth E. Jansen           nlwork=1
18059599516SKenneth E. Jansen           allocate( point2ilwork(1))
18159599516SKenneth E. Jansen           nshg0 = nshg
18259599516SKenneth E. Jansen      endif
18359599516SKenneth E. Jansen
18459599516SKenneth E. Jansen      itwo=2
18559599516SKenneth E. Jansen
186d5d2f64dSCameron Smith      call phio_readheader(fhandle,
187e5afe575SCameron Smith     & c_char_'co-ordinates' // char(0),
188e5afe575SCameron Smith     & c_loc(intfromfile),itwo, dataDbl, iotype)
18959599516SKenneth E. Jansen      numnp=intfromfile(1)
19059599516SKenneth E. Jansen      allocate( point2x(numnp,nsd) )
19159599516SKenneth E. Jansen      allocate( xread(numnp,nsd) )
19259599516SKenneth E. Jansen      ixsiz=numnp*nsd
193d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
194bc62cfd4SCameron Smith     & c_char_'co-ordinates' // char(0),
195bc62cfd4SCameron Smith     & c_loc(xread),ixsiz, dataDbl, iotype)
19659599516SKenneth E. Jansen      point2x = xread
19759599516SKenneth E. Jansenc
19859599516SKenneth E. Jansenc.... read in and block out the connectivity
19959599516SKenneth E. Jansenc
20059599516SKenneth E. Jansen      call genblk (IBKSIZ)
20159599516SKenneth E. Jansenc
20259599516SKenneth E. Jansenc.... read the boundary condition mapping array
20359599516SKenneth E. Jansenc
20459599516SKenneth E. Jansen      ione=1
205d5d2f64dSCameron Smith      call phio_readheader(fhandle,
206e5afe575SCameron Smith     & c_char_'bc mapping array' // char(0),
207e5afe575SCameron Smith     & c_loc(nshg),ione, dataInt, iotype)
20859599516SKenneth E. Jansen
20959599516SKenneth E. Jansen      allocate( nBC(nshg) )
21059599516SKenneth E. Jansen
21159599516SKenneth E. Jansen      allocate( nBCread(nshg) )
21259599516SKenneth E. Jansen
213d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
214bc62cfd4SCameron Smith     & c_char_'bc mapping array' // char(0),
215bc62cfd4SCameron Smith     & c_loc(nBCread), nshg, dataInt, iotype)
21659599516SKenneth E. Jansen
21759599516SKenneth E. Jansen      nBC=nBCread
21859599516SKenneth E. Jansenc
21959599516SKenneth E. Jansenc.... read the temporary iBC array
22059599516SKenneth E. Jansenc
22159599516SKenneth E. Jansen      ione=1
222d5d2f64dSCameron Smith      call phio_readheader(fhandle,
223e5afe575SCameron Smith     & c_char_'bc codes array' // char(0),
224e5afe575SCameron Smith     & c_loc(numpbc),ione, dataInt, iotype)
22559599516SKenneth E. Jansen
22659599516SKenneth E. Jansen      if ( numpbc > 0 ) then
22759599516SKenneth E. Jansen        allocate( iBCtmp(numpbc) )
22859599516SKenneth E. Jansen        allocate( iBCtmpread(numpbc) )
22959599516SKenneth E. Jansen      else
23059599516SKenneth E. Jansen        allocate( iBCtmp(1) )
23159599516SKenneth E. Jansen        allocate( iBCtmpread(1) )
23259599516SKenneth E. Jansen      endif
233d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
234bc62cfd4SCameron Smith     & c_char_'bc codes array' // char(0),
235bc62cfd4SCameron Smith     & c_loc(iBCtmpread), numpbc, dataInt, iotype)
23659599516SKenneth E. Jansen
23759599516SKenneth E. Jansen      if ( numpbc > 0 ) then
23859599516SKenneth E. Jansen         iBCtmp=iBCtmpread
23959599516SKenneth E. Jansen      else  ! sometimes a partition has no BC's
24059599516SKenneth E. Jansen         deallocate( iBCtmpread)
24159599516SKenneth E. Jansen         iBCtmp=0
24259599516SKenneth E. Jansen      endif
24359599516SKenneth E. Jansenc
24459599516SKenneth E. Jansenc.... read boundary condition data
24559599516SKenneth E. Jansenc
24659599516SKenneth E. Jansen      ione=1
247d5d2f64dSCameron Smith      call phio_readheader(fhandle,
248e5afe575SCameron Smith     & c_char_'boundary condition array' // char(0),
249e5afe575SCameron Smith     & c_loc(intfromfile),ione, dataDbl, iotype)
25059599516SKenneth E. Jansen
25159599516SKenneth E. Jansen      if ( numpbc > 0 ) then
25259599516SKenneth E. Jansen         allocate( BCinp(numpbc,ndof+7) )
25359599516SKenneth E. Jansen         nsecondrank=intfromfile(1)/numpbc
25459599516SKenneth E. Jansen         allocate( BCinpread(numpbc,nsecondrank) )
25559599516SKenneth E. Jansen         iBCinpsiz=intfromfile(1)
25659599516SKenneth E. Jansen      else
25759599516SKenneth E. Jansen         allocate( BCinp(1,ndof+7) )
25859599516SKenneth E. Jansen         allocate( BCinpread(0,0) ) !dummy
25959599516SKenneth E. Jansen         iBCinpsiz=intfromfile(1)
26059599516SKenneth E. Jansen      endif
26159599516SKenneth E. Jansen
262d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
263bc62cfd4SCameron Smith     & c_char_'boundary condition array' // char(0),
264bc62cfd4SCameron Smith     & c_loc(BCinpread), iBCinpsiz, dataDbl, iotype)
26559599516SKenneth E. Jansen
26659599516SKenneth E. Jansen      if ( numpbc > 0 ) then
26759599516SKenneth E. Jansen         BCinp(:,1:(ndof+7))=BCinpread(:,1:(ndof+7))
26859599516SKenneth E. Jansen      else  ! sometimes a partition has no BC's
26959599516SKenneth E. Jansen         deallocate(BCinpread)
27059599516SKenneth E. Jansen         BCinp=0
27159599516SKenneth E. Jansen      endif
27259599516SKenneth E. Jansenc
27359599516SKenneth E. Jansenc.... read periodic boundary conditions
27459599516SKenneth E. Jansenc
27559599516SKenneth E. Jansen      ione=1
276d5d2f64dSCameron Smith      call phio_readheader(fhandle,
277e5afe575SCameron Smith     & c_char_'periodic masters array' // char(0),
278e5afe575SCameron Smith     & c_loc(nshg), ione, dataInt, iotype)
27959599516SKenneth E. Jansen      allocate( point2iper(nshg) )
28059599516SKenneth E. Jansen      allocate( iperread(nshg) )
281d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
282bc62cfd4SCameron Smith     & c_char_'periodic masters array' // char(0),
283bc62cfd4SCameron Smith     & c_loc(iperread), nshg, dataInt, iotype)
28459599516SKenneth E. Jansen      point2iper=iperread
28559599516SKenneth E. Jansenc
28659599516SKenneth E. Jansenc.... generate the boundary element blocks
28759599516SKenneth E. Jansenc
28859599516SKenneth E. Jansen      call genbkb (ibksiz)
28959599516SKenneth E. Jansenc
29059599516SKenneth E. Jansenc  Read in the nsons and ifath arrays if needed
29159599516SKenneth E. Jansenc
29259599516SKenneth E. Jansenc  There is a fundamental shift in the meaning of ifath based on whether
29359599516SKenneth E. Jansenc  there exist homogenous directions in the flow.
29459599516SKenneth E. Jansenc
29559599516SKenneth E. Jansenc  HOMOGENOUS DIRECTIONS EXIST:  Here nfath is the number of inhomogenous
29659599516SKenneth E. Jansenc  points in the TOTAL mesh.  That is to say that each partition keeps a
29759599516SKenneth E. Jansenc  link to  ALL inhomogenous points.  This link is furthermore not to the
29859599516SKenneth E. Jansenc  sms numbering but to the original structured grid numbering.  These
29959599516SKenneth E. Jansenc  inhomogenous points are thought of as fathers, with their sons being all
30059599516SKenneth E. Jansenc  the points in the homogenous directions that have this father's
30159599516SKenneth E. Jansenc  inhomogeneity.  The array ifath takes as an arguement the sms numbering
30259599516SKenneth E. Jansenc  and returns as a result the father.
30359599516SKenneth E. Jansenc
30459599516SKenneth E. Jansenc  In this case nsons is the number of sons that each father has and ifath
30559599516SKenneth E. Jansenc  is an array which tells the
30659599516SKenneth E. Jansenc
30759599516SKenneth E. Jansenc  NO HOMOGENOUS DIRECTIONS.  In this case the mesh would grow to rapidly
30859599516SKenneth E. Jansenc  if we followed the above strategy since every partition would index its
30959599516SKenneth E. Jansenc  points to the ENTIRE mesh.  Furthermore, there would never be a need
31059599516SKenneth E. Jansenc  to average to a node off processor since there is no spatial averaging.
31159599516SKenneth E. Jansenc  Therefore, to properly account for this case we must recognize it and
31259599516SKenneth E. Jansenc  inerrupt certain actions (i.e. assembly of the average across partitions).
31359599516SKenneth E. Jansenc  This case is easily identified by noting that maxval(nsons) =1 (i.e. no
31459599516SKenneth E. Jansenc  father has any sons).  Reiterating to be clear, in this case ifath does
31559599516SKenneth E. Jansenc  not point to a global numbering but instead just points to itself.
31659599516SKenneth E. Jansenc
31759599516SKenneth E. Jansen      nfath=1  ! some architectures choke on a zero or undeclared
31859599516SKenneth E. Jansen                 ! dimension variable.  This sets it to a safe, small value.
31959599516SKenneth E. Jansen      if(((iLES .lt. 20) .and. (iLES.gt.0))
32059599516SKenneth E. Jansen     &                   .or. (itwmod.gt.0)  ) then ! don't forget same
32159599516SKenneth E. Jansen                                                    ! conditional in proces.f
32259599516SKenneth E. Jansen                                                    ! needed for alloc
32359599516SKenneth E. Jansen         ione=1
32459599516SKenneth E. Jansen         if(nohomog.gt.0) then
325d5d2f64dSCameron Smith            call phio_readheader(fhandle,
326e5afe575SCameron Smith     &       c_char_'number of father-nodes' // char(0),
327e5afe575SCameron Smith     &       c_loc(nfath), ione, dataInt, iotype)
32859599516SKenneth E. Jansen
329d5d2f64dSCameron Smith            call phio_readheader(fhandle,
330e5afe575SCameron Smith     &       c_char_'number of son-nodes for each father' // char(0),
331e5afe575SCameron Smith     &       c_loc(nfath), ione, dataInt, iotype)
33259599516SKenneth E. Jansen
33359599516SKenneth E. Jansen            allocate (point2nsons(nfath))
33459599516SKenneth E. Jansen
335d5d2f64dSCameron Smith            call phio_readdatablock(fhandle,
336bc62cfd4SCameron Smith     &       c_char_'number of son-nodes for each father' // char(0),
337bc62cfd4SCameron Smith     &       c_loc(point2nsons),nfath, dataInt, iotype)
33859599516SKenneth E. Jansen
339d5d2f64dSCameron Smith            call phio_readheader(fhandle,
340e5afe575SCameron Smith     &       c_char_'keyword ifath' // char(0),
341e5afe575SCameron Smith     &       c_loc(nshg), ione, dataInt, iotype);
34259599516SKenneth E. Jansen
34359599516SKenneth E. Jansen            allocate (point2ifath(nshg))
34459599516SKenneth E. Jansen
345d5d2f64dSCameron Smith            call phio_readdatablock(fhandle,
346bc62cfd4SCameron Smith     &       c_char_'keyword ifath' // char(0),
347bc62cfd4SCameron Smith     &       c_loc(point2ifath), nshg, dataInt, iotype)
34859599516SKenneth E. Jansen
34959599516SKenneth E. Jansen            nsonmax=maxval(point2nsons)
35059599516SKenneth E. Jansen         else  ! this is the case where there is no homogeneity
35159599516SKenneth E. Jansen               ! therefore ever node is a father (too itself).  sonfath
35259599516SKenneth E. Jansen               ! (a routine in NSpre) will set this up but this gives
35359599516SKenneth E. Jansen               ! you an option to avoid that.
35459599516SKenneth E. Jansen            nfath=nshg
35559599516SKenneth E. Jansen            allocate (point2nsons(nfath))
35659599516SKenneth E. Jansen            point2nsons=1
35759599516SKenneth E. Jansen            allocate (point2ifath(nshg))
35859599516SKenneth E. Jansen            do i=1,nshg
35959599516SKenneth E. Jansen               point2ifath(i)=i
36059599516SKenneth E. Jansen            enddo
36159599516SKenneth E. Jansen            nsonmax=1
36259599516SKenneth E. Jansen         endif
36359599516SKenneth E. Jansen      else
36459599516SKenneth E. Jansen         allocate (point2nsons(1))
36559599516SKenneth E. Jansen         allocate (point2ifath(1))
36659599516SKenneth E. Jansen      endif
36759599516SKenneth E. Jansen
368d7abaf6cSCameron Smith      call phio_closefile(fhandle);
36959599516SKenneth E. Jansenc.... Read restart files
370*9f4aafb6SCameron Smith      if( input_mode .eq. -1 ) then
371a486e66cSCameron Smith        call streamio_setup_read(fhandle, geomRestartStream)
372*9f4aafb6SCameron Smith      else if( input_mode .eq. 0 ) then
373d7abaf6cSCameron Smith        call posixio_setup(fhandle, c_char_'r')
374*9f4aafb6SCameron Smith      else if( input_mode .ge. 1 ) then
375d7abaf6cSCameron Smith        call syncio_setup_read(nsynciofiles, fhandle)
376d7abaf6cSCameron Smith      end if
377a93de25bSCameron Smith      call phio_constructName(fhandle,
378d7abaf6cSCameron Smith     &        c_char_'restart' // char(0), fnamer)
379e81a6dc1SCameron Smith      call phio_appendInt(fnamer, irstart)
380d7abaf6cSCameron Smith      call phio_openfile(fnamer, fhandle);
38159599516SKenneth E. Jansen
38259599516SKenneth E. Jansen      ithree=3
38359599516SKenneth E. Jansen
38459599516SKenneth E. Jansen      itmp = int(log10(float(myrank+1)))+1
38559599516SKenneth E. Jansen
38659599516SKenneth E. Jansen      intfromfile=0
387d5d2f64dSCameron Smith      call phio_readheader(fhandle,
388e5afe575SCameron Smith     & c_char_'solution' // char(0),
389e5afe575SCameron Smith     & c_loc(intfromfile), ithree, dataInt, iotype)
39059599516SKenneth E. Jansenc
39159599516SKenneth E. Jansenc.... read the values of primitive variables into q
39259599516SKenneth E. Jansenc
39359599516SKenneth E. Jansen      allocate( qold(nshg,ndof) )
39459599516SKenneth E. Jansen      if(intfromfile(1).ne.0) then
39559599516SKenneth E. Jansen         nshg2=intfromfile(1)
39659599516SKenneth E. Jansen         ndof2=intfromfile(2)
39759599516SKenneth E. Jansen         lstep=intfromfile(3)
39859599516SKenneth E. Jansen         if(ndof2.ne.ndof) then
39959599516SKenneth E. Jansen
40059599516SKenneth E. Jansen         endif
40159599516SKenneth E. Jansen        if (nshg2 .ne. nshg)
40259599516SKenneth E. Jansen     &        call error ('restar  ', 'nshg   ', nshg)
40359599516SKenneth E. Jansen         allocate( qread(nshg,ndof2) )
40459599516SKenneth E. Jansen         iqsiz=nshg*ndof2
405d5d2f64dSCameron Smith         call phio_readdatablock(fhandle,
406bc62cfd4SCameron Smith     &    c_char_'solution' // char(0),
407bc62cfd4SCameron Smith     &    c_loc(qread),iqsiz, dataDbl,iotype)
40859599516SKenneth E. Jansen         qold(:,1:ndof)=qread(:,1:ndof)
40959599516SKenneth E. Jansen         deallocate(qread)
41059599516SKenneth E. Jansen      else
41159599516SKenneth E. Jansen         if (myrank.eq.master) then
41259599516SKenneth E. Jansen            if (matflg(1,1).eq.0) then ! compressible
41359599516SKenneth E. Jansen               warning='Solution is set to zero (with p and T to one)'
41459599516SKenneth E. Jansen            else
41559599516SKenneth E. Jansen               warning='Solution is set to zero'
41659599516SKenneth E. Jansen            endif
41759599516SKenneth E. Jansen            write(*,*) warning
41859599516SKenneth E. Jansen         endif
41959599516SKenneth E. Jansen         qold=zero
42059599516SKenneth E. Jansen         if (matflg(1,1).eq.0) then ! compressible
42159599516SKenneth E. Jansen            qold(:,1)=one ! avoid zero pressure
42259599516SKenneth E. Jansen            qold(:,nflow)=one ! avoid zero temperature
42359599516SKenneth E. Jansen         endif
42459599516SKenneth E. Jansen      endif
42559599516SKenneth E. Jansen
42659599516SKenneth E. Jansen      intfromfile=0
427d5d2f64dSCameron Smith      call phio_readheader(fhandle,
428e5afe575SCameron Smith     & c_char_'time derivative of solution' // char(0),
429e5afe575SCameron Smith     & c_loc(intfromfile), ithree, dataInt, iotype)
43059599516SKenneth E. Jansen      allocate( acold(nshg,ndof) )
43159599516SKenneth E. Jansen      if(intfromfile(1).ne.0) then
43259599516SKenneth E. Jansen         nshg2=intfromfile(1)
43359599516SKenneth E. Jansen         ndof2=intfromfile(2)
43459599516SKenneth E. Jansen         lstep=intfromfile(3)
43559599516SKenneth E. Jansen
43659599516SKenneth E. Jansen         if (nshg2 .ne. nshg)
43759599516SKenneth E. Jansen     &        call error ('restar  ', 'nshg   ', nshg)
43859599516SKenneth E. Jansen         allocate( acread(nshg,ndof2) )
43959599516SKenneth E. Jansen         acread=zero
44059599516SKenneth E. Jansen         iacsiz=nshg*ndof2
441d5d2f64dSCameron Smith         call phio_readdatablock(fhandle,
442bc62cfd4SCameron Smith     &    c_char_'time derivative of solution' // char(0),
443bc62cfd4SCameron Smith     &    c_loc(acread), iacsiz, dataDbl,iotype)
44459599516SKenneth E. Jansen         acold(:,1:ndof)=acread(:,1:ndof)
44559599516SKenneth E. Jansen         deallocate(acread)
44659599516SKenneth E. Jansen      else
44759599516SKenneth E. Jansen         if (myrank.eq.master) then
44859599516SKenneth E. Jansen            warning='Time derivative of solution is set to zero (SAFE)'
44959599516SKenneth E. Jansen            write(*,*) warning
45059599516SKenneth E. Jansen         endif
45159599516SKenneth E. Jansen         acold=zero
45259599516SKenneth E. Jansen      endif
45359599516SKenneth E. Jansencc
45459599516SKenneth E. Jansencc.... read the header and check it against the run data
45559599516SKenneth E. Jansencc
45659599516SKenneth E. Jansen      if (ideformwall.eq.1) then
45759599516SKenneth E. Jansen
45859599516SKenneth E. Jansen          intfromfile=0
459d5d2f64dSCameron Smith          call phio_readheader(fhandle,
460e5afe575SCameron Smith     &     c_char_'displacement' // char(0),
461e5afe575SCameron Smith     &     c_loc(intfromfile), ithree, dataInt, iotype)
46259599516SKenneth E. Jansen
46359599516SKenneth E. Jansen         nshg2=intfromfile(1)
46459599516SKenneth E. Jansen         ndisp=intfromfile(2)
46559599516SKenneth E. Jansen         lstep=intfromfile(3)
46659599516SKenneth E. Jansen         if(ndisp.ne.nsd) then
46759599516SKenneth E. Jansen            warning='WARNING ndisp not equal nsd'
46859599516SKenneth E. Jansen            write(*,*) warning , ndisp
46959599516SKenneth E. Jansen         endif
47059599516SKenneth E. Jansen         if (nshg2 .ne. nshg)
47159599516SKenneth E. Jansen     &        call error ('restar  ', 'nshg   ', nshg)
47259599516SKenneth E. Jansenc
47359599516SKenneth E. Jansenc.... read the values of primitive variables into uold
47459599516SKenneth E. Jansenc
47559599516SKenneth E. Jansen         allocate( uold(nshg,nsd) )
47659599516SKenneth E. Jansen         allocate( uread(nshg,nsd) )
47759599516SKenneth E. Jansen
47859599516SKenneth E. Jansen         iusiz=nshg*nsd
47959599516SKenneth E. Jansen
480d5d2f64dSCameron Smith         call phio_readdatablock(fhandle,
481bc62cfd4SCameron Smith     &    c_char_'displacement' // char(0),
482bc62cfd4SCameron Smith     &    c_loc(uread), iusiz, dataDbl, iotype)
48359599516SKenneth E. Jansen
48459599516SKenneth E. Jansen         uold(:,1:nsd)=uread(:,1:nsd)
48559599516SKenneth E. Jansen       else
48659599516SKenneth E. Jansen         allocate( uold(nshg,nsd) )
48759599516SKenneth E. Jansen         uold(:,1:nsd) = zero
48859599516SKenneth E. Jansen       endif
48959599516SKenneth E. Jansenc
49059599516SKenneth E. Jansenc.... close c-binary files
49159599516SKenneth E. Jansenc
492d7abaf6cSCameron Smith      call phio_closefile(fhandle)
49359599516SKenneth E. Jansen
49459599516SKenneth E. Jansen      deallocate(xread)
49559599516SKenneth E. Jansen      if ( numpbc > 0 )  then
49659599516SKenneth E. Jansen         deallocate(bcinpread)
49759599516SKenneth E. Jansen         deallocate(ibctmpread)
49859599516SKenneth E. Jansen      endif
49959599516SKenneth E. Jansen      deallocate(iperread)
50059599516SKenneth E. Jansen      if(numpe.gt.1)
50159599516SKenneth E. Jansen     &     deallocate(ilworkread)
50259599516SKenneth E. Jansen      deallocate(nbcread)
50359599516SKenneth E. Jansen
50459599516SKenneth E. Jansen      return
50559599516SKenneth E. Jansen 994  call error ('input   ','opening ', igeomBAK)
50659599516SKenneth E. Jansen 995  call error ('input   ','opening ', igeomBAK)
50759599516SKenneth E. Jansen 997  call error ('input   ','end file', igeomBAK)
50859599516SKenneth E. Jansen 998  call error ('input   ','end file', igeomBAK)
50959599516SKenneth E. Jansen      end
51059599516SKenneth E. Jansenc
51159599516SKenneth E. Jansenc No longer called but kept around in case....
51259599516SKenneth E. Jansenc
51359599516SKenneth E. Jansen      subroutine genpzero(iBC)
51459599516SKenneth E. Jansen
51559599516SKenneth E. Jansen      use pointer_data
51659599516SKenneth E. Jansen      include "common.h"
51759599516SKenneth E. Jansen      integer iBC(nshg)
51859599516SKenneth E. Jansenc
51959599516SKenneth E. Jansenc....  check to see if any of the nodes have a dirichlet pressure
52059599516SKenneth E. Jansenc
52159599516SKenneth E. Jansen      pzero=1
52259599516SKenneth E. Jansen      if (any(btest(iBC,2))) pzero=0
52359599516SKenneth E. Jansen      do iblk = 1, nelblb
52459599516SKenneth E. Jansen         npro = lcblkb(1,iblk+1)-lcblkb(1,iblk)
52559599516SKenneth E. Jansen         do i=1, npro
52659599516SKenneth E. Jansen            iBCB1=miBCB(iblk)%p(i,1)
52759599516SKenneth E. Jansenc
52859599516SKenneth E. Jansenc.... check to see if any of the nodes have a Neumann pressure
52959599516SKenneth E. Jansenc     but not periodic (note that
53059599516SKenneth E. Jansenc
53159599516SKenneth E. Jansen            if(btest(iBCB1,1)) pzero=0
53259599516SKenneth E. Jansen         enddo
53359599516SKenneth E. Jansenc
53459599516SKenneth E. Jansenc.... share results with other processors
53559599516SKenneth E. Jansenc
53659599516SKenneth E. Jansen         pzl=pzero
53759599516SKenneth E. Jansen         if (numpe .gt. 1)
53859599516SKenneth E. Jansen     &        call MPI_ALLREDUCE (pzl, pzero, 1,
53959599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_MIN, MPI_COMM_WORLD,ierr)
54059599516SKenneth E. Jansen      enddo
54159599516SKenneth E. Jansen      return
54259599516SKenneth E. Jansen      end
543