xref: /phasta/phSolver/common/readnblk.f (revision 266200f91d38c85811847d81850309452b48ec64)
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
329071d3baSCameron Smith      use phstr
33ab645d52SCameron Smith      use syncio
34ab645d52SCameron Smith      use posixio
35ab645d52SCameron Smith      use streamio
3659599516SKenneth E. Jansen      include "common.h"
3702ce253eSCameron Smith
389a6935e5SKenneth E. Jansen      real*8, target, allocatable :: xread(:,:), qread(:,:), acread(:,:)
399a6935e5SKenneth E. Jansen      real*8, target, allocatable :: uread(:,:)
409a6935e5SKenneth E. Jansen      real*8, target, allocatable :: BCinpread(:,:)
41*266200f9SCameron Smith      real*8 :: iotime
429a6935e5SKenneth E. Jansen      integer, target, allocatable :: iperread(:), iBCtmpread(:)
439a6935e5SKenneth E. Jansen      integer, target, allocatable :: ilworkread(:), nBCread(:)
4459599516SKenneth E. Jansen      character*10 cname2
4559599516SKenneth E. Jansen      character*8 mach2
4659599516SKenneth E. Jansen      character*30 fmt1
4759599516SKenneth E. Jansen      character*255 fname1,fnamer,fnamelr
4859599516SKenneth E. Jansen      character*255 warning
4959599516SKenneth E. Jansen      integer igeomBAK, ibndc, irstin, ierr
509a6935e5SKenneth E. Jansen      integer, target :: intfromfile(50) ! integers read from headers
519f4aafb6SCameron Smith      integer :: descriptor, descriptorG, GPID, color, nfields
5259599516SKenneth E. Jansen      integer ::  numparts, nppf
5359599516SKenneth E. Jansen      integer :: ierr_io, numprocs, itmp, itmp2
54ade0e30fSCameron Smith      integer :: ignored
55d7abaf6cSCameron Smith      integer :: fileFmt
5659599516SKenneth E. Jansen      character*255 fname2, temp2
5759599516SKenneth E. Jansen      character*64 temp1
58e5afe575SCameron Smith      type(c_ptr) :: handle
59e5afe575SCameron Smith      character(len=1024) :: dataInt, dataDbl
60e5afe575SCameron Smith      dataInt = c_char_'integer'//c_null_char
61e5afe575SCameron Smith      dataDbl = c_char_'double'//c_null_char
6259599516SKenneth E. Jansenc
6359599516SKenneth E. Jansenc.... determine the step number to start with
6459599516SKenneth E. Jansenc
6559599516SKenneth E. Jansen      open(unit=72,file='numstart.dat',status='old')
6659599516SKenneth E. Jansen      read(72,*) irstart
6759599516SKenneth E. Jansen      close(72)
6859599516SKenneth E. Jansen      lstep=irstart ! in case restart files have no fields
6959599516SKenneth E. Jansen
7059599516SKenneth E. Jansen      fname1='geombc.dat'
7159599516SKenneth E. Jansen      fname1= trim(fname1)  // cname2(myrank+1)
7259599516SKenneth E. Jansen
7359599516SKenneth E. Jansen      itmp=1
7459599516SKenneth E. Jansen      if (irstart .gt. 0) itmp = int(log10(float(irstart)))+1
7559599516SKenneth E. Jansen      write (fmt1,"('(''restart.'',i',i1,',1x)')") itmp
7659599516SKenneth E. Jansen      write (fnamer,fmt1) irstart
7759599516SKenneth E. Jansen      fnamer = trim(fnamer) // cname2(myrank+1)
7859599516SKenneth E. Jansenc
7959599516SKenneth E. Jansenc.... open input files
8059599516SKenneth E. Jansenc.... input the geometry parameters
8159599516SKenneth E. Jansenc
8259599516SKenneth E. Jansen      numparts = numpe !This is the common settings. Beware if you try to compute several parts per process
8359599516SKenneth E. Jansen
8459599516SKenneth E. Jansen      itwo=2
8559599516SKenneth E. Jansen      ione=1
8659599516SKenneth E. Jansen      ieleven=11
8759599516SKenneth E. Jansen      itmp = int(log10(float(myrank+1)))+1
8859599516SKenneth E. Jansen
89*266200f9SCameron Smith      iotime = TMRC()
909f4aafb6SCameron Smith      if( input_mode .eq. -1 ) then
91a486e66cSCameron Smith        call streamio_setup_read(fhandle, geomRestartStream)
929f4aafb6SCameron Smith      else if( input_mode .eq. 0 ) then
93ab645d52SCameron Smith        call posixio_setup(fhandle, c_char_'r')
949f4aafb6SCameron Smith      else if( input_mode .ge. 1 ) then
95ab645d52SCameron Smith        call syncio_setup_read(nsynciofiles, fhandle)
962efdc748SKenneth E. Jansen      end if
97a93de25bSCameron Smith      call phio_constructName(fhandle,
98d7abaf6cSCameron Smith     &        c_char_'geombc' // char(0), fname1)
99d7abaf6cSCameron Smith      call phio_openfile(fname1, fhandle);
10059599516SKenneth E. Jansen
101d5d2f64dSCameron Smith      call phio_readheader(fhandle,c_char_'number of nodes' // char(0),
102e5afe575SCameron Smith     & c_loc(numnp),ione, dataInt, iotype)
10359599516SKenneth E. Jansen
104d5d2f64dSCameron Smith      call phio_readheader(fhandle,c_char_'number of modes' // char(0),
105e5afe575SCameron Smith     & c_loc(nshg),ione, dataInt, iotype)
10659599516SKenneth E. Jansen
107d5d2f64dSCameron Smith      call phio_readheader(fhandle,
108e5afe575SCameron Smith     &  c_char_'number of interior elements' // char(0),
109e5afe575SCameron Smith     &  c_loc(numel),ione, dataInt, iotype)
11059599516SKenneth E. Jansen
111d5d2f64dSCameron Smith      call phio_readheader(fhandle,
112e5afe575SCameron Smith     &  c_char_'number of boundary elements' // char(0),
113e5afe575SCameron Smith     &  c_loc(numelb),ione, dataInt, iotype)
11459599516SKenneth E. Jansen
115d5d2f64dSCameron Smith      call phio_readheader(fhandle,
116e5afe575SCameron Smith     &  c_char_'maximum number of element nodes' // char(0),
117e5afe575SCameron Smith     &  c_loc(nen),ione, dataInt, iotype)
11859599516SKenneth E. Jansen
119d5d2f64dSCameron Smith      call phio_readheader(fhandle,
120e5afe575SCameron Smith     &  c_char_'number of interior tpblocks' // char(0),
121e5afe575SCameron Smith     &  c_loc(nelblk),ione, dataInt, iotype)
12259599516SKenneth E. Jansen
123d5d2f64dSCameron Smith      call phio_readheader(fhandle,
124e5afe575SCameron Smith     & c_char_'number of boundary tpblocks' // char(0),
125e5afe575SCameron Smith     & c_loc(nelblb),ione, dataInt, iotype)
12659599516SKenneth E. Jansen
127d5d2f64dSCameron Smith      call phio_readheader(fhandle,
128e5afe575SCameron Smith     & c_char_'number of nodes with Dirichlet BCs' // char(0),
129e5afe575SCameron Smith     & c_loc(numpbc),ione, dataInt, iotype)
13059599516SKenneth E. Jansen
131d5d2f64dSCameron Smith      call phio_readheader(fhandle,
132e5afe575SCameron Smith     & c_char_'number of shape functions' // char(0),
133e5afe575SCameron Smith     & c_loc(ntopsh),ione, dataInt, iotype)
13459599516SKenneth E. Jansenc
13559599516SKenneth E. Jansenc.... calculate the maximum number of boundary element nodes
13659599516SKenneth E. Jansenc
13759599516SKenneth E. Jansen      nenb = 0
13859599516SKenneth E. Jansen      do i = 1, melCat
13959599516SKenneth E. Jansen         if (nen .eq. nenCat(i,nsd)) nenb = max(nenCat(i,nsd-1), nenb)
14059599516SKenneth E. Jansen      enddo
14159599516SKenneth E. Jansen      if (myrank == master) then
14259599516SKenneth E. Jansen         if (nenb .eq. 0) call error ('input   ','nen     ',nen)
14359599516SKenneth E. Jansen      endif
14459599516SKenneth E. Jansenc
14559599516SKenneth E. Jansenc.... setup some useful constants
14659599516SKenneth E. Jansenc
14759599516SKenneth E. Jansen      I3nsd  = nsd / 3          ! nsd=3 integer flag
14859599516SKenneth E. Jansen      E3nsd  = float(I3nsd)     ! nsd=3 real    flag
14959599516SKenneth E. Jansen      if(matflg(1,1).lt.0) then
15059599516SKenneth E. Jansen         nflow = nsd + 1
15159599516SKenneth E. Jansen      else
15259599516SKenneth E. Jansen         nflow = nsd + 2
15359599516SKenneth E. Jansen      endif
15459599516SKenneth E. Jansen      ndof   = nsd + 2
15559599516SKenneth E. Jansen      nsclr=impl(1)/100
15659599516SKenneth E. Jansen      ndof=ndof+nsclr           ! number of sclr transport equations to solve
15759599516SKenneth E. Jansen
15859599516SKenneth E. Jansen      ndofBC = ndof + I3nsd     ! dimension of BC array
15959599516SKenneth E. Jansen      ndiBCB = 2                ! dimension of iBCB array
16059599516SKenneth E. Jansen      ndBCB  = ndof + 1         ! dimension of BCB array
16159599516SKenneth E. Jansen      nsymdf = (ndof*(ndof + 1)) / 2 ! symm. d.o.f.'s
16259599516SKenneth E. Jansenc
16359599516SKenneth E. Jansenc.... ----------------------> Communication tasks <--------------------
16459599516SKenneth E. Jansenc
16559599516SKenneth E. Jansen      if(numpe > 1) then
166d5d2f64dSCameron Smith         call phio_readheader(fhandle,
167e5afe575SCameron Smith     &    c_char_'size of ilwork array' // char(0),
168e5afe575SCameron Smith     &    c_loc(nlwork),ione, dataInt, iotype)
16959599516SKenneth E. Jansen
170d5d2f64dSCameron Smith         call phio_readheader(fhandle,
171e5afe575SCameron Smith     &    c_char_'ilwork' //char(0),
172e5afe575SCameron Smith     &    c_loc(nlwork),ione, dataInt, iotype)
17359599516SKenneth E. Jansen
17459599516SKenneth E. Jansen         allocate( point2ilwork(nlwork) )
17559599516SKenneth E. Jansen         allocate( ilworkread(nlwork) )
176d5d2f64dSCameron Smith         call phio_readdatablock(fhandle, c_char_'ilwork' // char(0),
177bc62cfd4SCameron Smith     &      c_loc(ilworkread), nlwork, dataInt , iotype)
17859599516SKenneth E. Jansen
17959599516SKenneth E. Jansen         point2ilwork = ilworkread
18059599516SKenneth E. Jansen         call ctypes (point2ilwork)
18159599516SKenneth E. Jansen      else
18259599516SKenneth E. Jansen           nlwork=1
18359599516SKenneth E. Jansen           allocate( point2ilwork(1))
18459599516SKenneth E. Jansen           nshg0 = nshg
18559599516SKenneth E. Jansen      endif
18659599516SKenneth E. Jansen
18759599516SKenneth E. Jansen      itwo=2
18859599516SKenneth E. Jansen
189d5d2f64dSCameron Smith      call phio_readheader(fhandle,
190e5afe575SCameron Smith     & c_char_'co-ordinates' // char(0),
191e5afe575SCameron Smith     & c_loc(intfromfile),itwo, dataDbl, iotype)
19259599516SKenneth E. Jansen      numnp=intfromfile(1)
19359599516SKenneth E. Jansen      allocate( point2x(numnp,nsd) )
19459599516SKenneth E. Jansen      allocate( xread(numnp,nsd) )
19559599516SKenneth E. Jansen      ixsiz=numnp*nsd
196d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
197bc62cfd4SCameron Smith     & c_char_'co-ordinates' // char(0),
198bc62cfd4SCameron Smith     & c_loc(xread),ixsiz, dataDbl, iotype)
19959599516SKenneth E. Jansen      point2x = xread
20059599516SKenneth E. Jansenc
20159599516SKenneth E. Jansenc.... read in and block out the connectivity
20259599516SKenneth E. Jansenc
20359599516SKenneth E. Jansen      call genblk (IBKSIZ)
20459599516SKenneth E. Jansenc
20559599516SKenneth E. Jansenc.... read the boundary condition mapping array
20659599516SKenneth E. Jansenc
20759599516SKenneth E. Jansen      ione=1
208d5d2f64dSCameron Smith      call phio_readheader(fhandle,
209e5afe575SCameron Smith     & c_char_'bc mapping array' // char(0),
210e5afe575SCameron Smith     & c_loc(nshg),ione, dataInt, iotype)
21159599516SKenneth E. Jansen
21259599516SKenneth E. Jansen      allocate( nBC(nshg) )
21359599516SKenneth E. Jansen
21459599516SKenneth E. Jansen      allocate( nBCread(nshg) )
21559599516SKenneth E. Jansen
216d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
217bc62cfd4SCameron Smith     & c_char_'bc mapping array' // char(0),
218bc62cfd4SCameron Smith     & c_loc(nBCread), nshg, dataInt, iotype)
21959599516SKenneth E. Jansen
22059599516SKenneth E. Jansen      nBC=nBCread
22159599516SKenneth E. Jansenc
22259599516SKenneth E. Jansenc.... read the temporary iBC array
22359599516SKenneth E. Jansenc
22459599516SKenneth E. Jansen      ione=1
225d5d2f64dSCameron Smith      call phio_readheader(fhandle,
226e5afe575SCameron Smith     & c_char_'bc codes array' // char(0),
227e5afe575SCameron Smith     & c_loc(numpbc),ione, dataInt, iotype)
22859599516SKenneth E. Jansen
22959599516SKenneth E. Jansen      if ( numpbc > 0 ) then
23059599516SKenneth E. Jansen        allocate( iBCtmp(numpbc) )
23159599516SKenneth E. Jansen        allocate( iBCtmpread(numpbc) )
23259599516SKenneth E. Jansen      else
23359599516SKenneth E. Jansen        allocate( iBCtmp(1) )
23459599516SKenneth E. Jansen        allocate( iBCtmpread(1) )
23559599516SKenneth E. Jansen      endif
236d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
237bc62cfd4SCameron Smith     & c_char_'bc codes array' // char(0),
238bc62cfd4SCameron Smith     & c_loc(iBCtmpread), numpbc, dataInt, iotype)
23959599516SKenneth E. Jansen
24059599516SKenneth E. Jansen      if ( numpbc > 0 ) then
24159599516SKenneth E. Jansen         iBCtmp=iBCtmpread
24259599516SKenneth E. Jansen      else  ! sometimes a partition has no BC's
24359599516SKenneth E. Jansen         deallocate( iBCtmpread)
24459599516SKenneth E. Jansen         iBCtmp=0
24559599516SKenneth E. Jansen      endif
24659599516SKenneth E. Jansenc
24759599516SKenneth E. Jansenc.... read boundary condition data
24859599516SKenneth E. Jansenc
24959599516SKenneth E. Jansen      ione=1
250d5d2f64dSCameron Smith      call phio_readheader(fhandle,
251e5afe575SCameron Smith     & c_char_'boundary condition array' // char(0),
252e5afe575SCameron Smith     & c_loc(intfromfile),ione, dataDbl, iotype)
25359599516SKenneth E. Jansen
25459599516SKenneth E. Jansen      if ( numpbc > 0 ) then
25559599516SKenneth E. Jansen         allocate( BCinp(numpbc,ndof+7) )
25659599516SKenneth E. Jansen         nsecondrank=intfromfile(1)/numpbc
25759599516SKenneth E. Jansen         allocate( BCinpread(numpbc,nsecondrank) )
25859599516SKenneth E. Jansen         iBCinpsiz=intfromfile(1)
25959599516SKenneth E. Jansen      else
26059599516SKenneth E. Jansen         allocate( BCinp(1,ndof+7) )
26159599516SKenneth E. Jansen         allocate( BCinpread(0,0) ) !dummy
26259599516SKenneth E. Jansen         iBCinpsiz=intfromfile(1)
26359599516SKenneth E. Jansen      endif
26459599516SKenneth E. Jansen
265d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
266bc62cfd4SCameron Smith     & c_char_'boundary condition array' // char(0),
267bc62cfd4SCameron Smith     & c_loc(BCinpread), iBCinpsiz, dataDbl, iotype)
26859599516SKenneth E. Jansen
26959599516SKenneth E. Jansen      if ( numpbc > 0 ) then
27059599516SKenneth E. Jansen         BCinp(:,1:(ndof+7))=BCinpread(:,1:(ndof+7))
27159599516SKenneth E. Jansen      else  ! sometimes a partition has no BC's
27259599516SKenneth E. Jansen         deallocate(BCinpread)
27359599516SKenneth E. Jansen         BCinp=0
27459599516SKenneth E. Jansen      endif
27559599516SKenneth E. Jansenc
27659599516SKenneth E. Jansenc.... read periodic boundary conditions
27759599516SKenneth E. Jansenc
27859599516SKenneth E. Jansen      ione=1
279d5d2f64dSCameron Smith      call phio_readheader(fhandle,
280e5afe575SCameron Smith     & c_char_'periodic masters array' // char(0),
281e5afe575SCameron Smith     & c_loc(nshg), ione, dataInt, iotype)
28259599516SKenneth E. Jansen      allocate( point2iper(nshg) )
28359599516SKenneth E. Jansen      allocate( iperread(nshg) )
284d5d2f64dSCameron Smith      call phio_readdatablock(fhandle,
285bc62cfd4SCameron Smith     & c_char_'periodic masters array' // char(0),
286bc62cfd4SCameron Smith     & c_loc(iperread), nshg, dataInt, iotype)
28759599516SKenneth E. Jansen      point2iper=iperread
28859599516SKenneth E. Jansenc
28959599516SKenneth E. Jansenc.... generate the boundary element blocks
29059599516SKenneth E. Jansenc
29159599516SKenneth E. Jansen      call genbkb (ibksiz)
29259599516SKenneth E. Jansenc
29359599516SKenneth E. Jansenc  Read in the nsons and ifath arrays if needed
29459599516SKenneth E. Jansenc
29559599516SKenneth E. Jansenc  There is a fundamental shift in the meaning of ifath based on whether
29659599516SKenneth E. Jansenc  there exist homogenous directions in the flow.
29759599516SKenneth E. Jansenc
29859599516SKenneth E. Jansenc  HOMOGENOUS DIRECTIONS EXIST:  Here nfath is the number of inhomogenous
29959599516SKenneth E. Jansenc  points in the TOTAL mesh.  That is to say that each partition keeps a
30059599516SKenneth E. Jansenc  link to  ALL inhomogenous points.  This link is furthermore not to the
30159599516SKenneth E. Jansenc  sms numbering but to the original structured grid numbering.  These
30259599516SKenneth E. Jansenc  inhomogenous points are thought of as fathers, with their sons being all
30359599516SKenneth E. Jansenc  the points in the homogenous directions that have this father's
30459599516SKenneth E. Jansenc  inhomogeneity.  The array ifath takes as an arguement the sms numbering
30559599516SKenneth E. Jansenc  and returns as a result the father.
30659599516SKenneth E. Jansenc
30759599516SKenneth E. Jansenc  In this case nsons is the number of sons that each father has and ifath
30859599516SKenneth E. Jansenc  is an array which tells the
30959599516SKenneth E. Jansenc
31059599516SKenneth E. Jansenc  NO HOMOGENOUS DIRECTIONS.  In this case the mesh would grow to rapidly
31159599516SKenneth E. Jansenc  if we followed the above strategy since every partition would index its
31259599516SKenneth E. Jansenc  points to the ENTIRE mesh.  Furthermore, there would never be a need
31359599516SKenneth E. Jansenc  to average to a node off processor since there is no spatial averaging.
31459599516SKenneth E. Jansenc  Therefore, to properly account for this case we must recognize it and
31559599516SKenneth E. Jansenc  inerrupt certain actions (i.e. assembly of the average across partitions).
31659599516SKenneth E. Jansenc  This case is easily identified by noting that maxval(nsons) =1 (i.e. no
31759599516SKenneth E. Jansenc  father has any sons).  Reiterating to be clear, in this case ifath does
31859599516SKenneth E. Jansenc  not point to a global numbering but instead just points to itself.
31959599516SKenneth E. Jansenc
32059599516SKenneth E. Jansen      nfath=1  ! some architectures choke on a zero or undeclared
32159599516SKenneth E. Jansen                 ! dimension variable.  This sets it to a safe, small value.
32259599516SKenneth E. Jansen      if(((iLES .lt. 20) .and. (iLES.gt.0))
32359599516SKenneth E. Jansen     &                   .or. (itwmod.gt.0)  ) then ! don't forget same
32459599516SKenneth E. Jansen                                                    ! conditional in proces.f
32559599516SKenneth E. Jansen                                                    ! needed for alloc
32659599516SKenneth E. Jansen         ione=1
32759599516SKenneth E. Jansen         if(nohomog.gt.0) then
328d5d2f64dSCameron Smith            call phio_readheader(fhandle,
329e5afe575SCameron Smith     &       c_char_'number of father-nodes' // char(0),
330e5afe575SCameron Smith     &       c_loc(nfath), ione, dataInt, iotype)
33159599516SKenneth E. Jansen
332d5d2f64dSCameron Smith            call phio_readheader(fhandle,
333e5afe575SCameron Smith     &       c_char_'number of son-nodes for each father' // char(0),
334e5afe575SCameron Smith     &       c_loc(nfath), ione, dataInt, iotype)
33559599516SKenneth E. Jansen
33659599516SKenneth E. Jansen            allocate (point2nsons(nfath))
33759599516SKenneth E. Jansen
338d5d2f64dSCameron Smith            call phio_readdatablock(fhandle,
339bc62cfd4SCameron Smith     &       c_char_'number of son-nodes for each father' // char(0),
340bc62cfd4SCameron Smith     &       c_loc(point2nsons),nfath, dataInt, iotype)
34159599516SKenneth E. Jansen
342d5d2f64dSCameron Smith            call phio_readheader(fhandle,
343e5afe575SCameron Smith     &       c_char_'keyword ifath' // char(0),
344e5afe575SCameron Smith     &       c_loc(nshg), ione, dataInt, iotype);
34559599516SKenneth E. Jansen
34659599516SKenneth E. Jansen            allocate (point2ifath(nshg))
34759599516SKenneth E. Jansen
348d5d2f64dSCameron Smith            call phio_readdatablock(fhandle,
349bc62cfd4SCameron Smith     &       c_char_'keyword ifath' // char(0),
350bc62cfd4SCameron Smith     &       c_loc(point2ifath), nshg, dataInt, iotype)
35159599516SKenneth E. Jansen
35259599516SKenneth E. Jansen            nsonmax=maxval(point2nsons)
35359599516SKenneth E. Jansen         else  ! this is the case where there is no homogeneity
35459599516SKenneth E. Jansen               ! therefore ever node is a father (too itself).  sonfath
35559599516SKenneth E. Jansen               ! (a routine in NSpre) will set this up but this gives
35659599516SKenneth E. Jansen               ! you an option to avoid that.
35759599516SKenneth E. Jansen            nfath=nshg
35859599516SKenneth E. Jansen            allocate (point2nsons(nfath))
35959599516SKenneth E. Jansen            point2nsons=1
36059599516SKenneth E. Jansen            allocate (point2ifath(nshg))
36159599516SKenneth E. Jansen            do i=1,nshg
36259599516SKenneth E. Jansen               point2ifath(i)=i
36359599516SKenneth E. Jansen            enddo
36459599516SKenneth E. Jansen            nsonmax=1
36559599516SKenneth E. Jansen         endif
36659599516SKenneth E. Jansen      else
36759599516SKenneth E. Jansen         allocate (point2nsons(1))
36859599516SKenneth E. Jansen         allocate (point2ifath(1))
36959599516SKenneth E. Jansen      endif
37059599516SKenneth E. Jansen
371d7abaf6cSCameron Smith      call phio_closefile(fhandle);
372*266200f9SCameron Smith      iotime = TMRC() - iotime
373*266200f9SCameron Smith      if (myrank.eq.master) then
374*266200f9SCameron Smith        write(*,*) 'time to read geombc (seconds)', iotime
375*266200f9SCameron Smith      endif
376*266200f9SCameron Smith
37759599516SKenneth E. Jansenc.... Read restart files
378*266200f9SCameron Smith      iotime = TMRC()
3799f4aafb6SCameron Smith      if( input_mode .eq. -1 ) then
380a486e66cSCameron Smith        call streamio_setup_read(fhandle, geomRestartStream)
3819f4aafb6SCameron Smith      else if( input_mode .eq. 0 ) then
382d7abaf6cSCameron Smith        call posixio_setup(fhandle, c_char_'r')
3839f4aafb6SCameron Smith      else if( input_mode .ge. 1 ) then
384d7abaf6cSCameron Smith        call syncio_setup_read(nsynciofiles, fhandle)
385d7abaf6cSCameron Smith      end if
386a93de25bSCameron Smith      call phio_constructName(fhandle,
387d7abaf6cSCameron Smith     &        c_char_'restart' // char(0), fnamer)
3889071d3baSCameron Smith      call phstr_appendInt(fnamer, irstart)
3899071d3baSCameron Smith      call phstr_appendStr(fnamer, c_char_'.'//c_null_char)
390d7abaf6cSCameron Smith      call phio_openfile(fnamer, fhandle);
39159599516SKenneth E. Jansen
39259599516SKenneth E. Jansen      ithree=3
39359599516SKenneth E. Jansen
39459599516SKenneth E. Jansen      itmp = int(log10(float(myrank+1)))+1
39559599516SKenneth E. Jansen
39659599516SKenneth E. Jansen      intfromfile=0
397d5d2f64dSCameron Smith      call phio_readheader(fhandle,
398e5afe575SCameron Smith     & c_char_'solution' // char(0),
399e5afe575SCameron Smith     & c_loc(intfromfile), ithree, dataInt, iotype)
40059599516SKenneth E. Jansenc
40159599516SKenneth E. Jansenc.... read the values of primitive variables into q
40259599516SKenneth E. Jansenc
40359599516SKenneth E. Jansen      allocate( qold(nshg,ndof) )
40459599516SKenneth E. Jansen      if(intfromfile(1).ne.0) then
40559599516SKenneth E. Jansen         nshg2=intfromfile(1)
40659599516SKenneth E. Jansen         ndof2=intfromfile(2)
40759599516SKenneth E. Jansen         lstep=intfromfile(3)
40859599516SKenneth E. Jansen         if(ndof2.ne.ndof) then
40959599516SKenneth E. Jansen
41059599516SKenneth E. Jansen         endif
41159599516SKenneth E. Jansen        if (nshg2 .ne. nshg)
41259599516SKenneth E. Jansen     &        call error ('restar  ', 'nshg   ', nshg)
41359599516SKenneth E. Jansen         allocate( qread(nshg,ndof2) )
41459599516SKenneth E. Jansen         iqsiz=nshg*ndof2
415d5d2f64dSCameron Smith         call phio_readdatablock(fhandle,
416bc62cfd4SCameron Smith     &    c_char_'solution' // char(0),
417bc62cfd4SCameron Smith     &    c_loc(qread),iqsiz, dataDbl,iotype)
41859599516SKenneth E. Jansen         qold(:,1:ndof)=qread(:,1:ndof)
41959599516SKenneth E. Jansen         deallocate(qread)
42059599516SKenneth E. Jansen      else
42159599516SKenneth E. Jansen         if (myrank.eq.master) then
42259599516SKenneth E. Jansen            if (matflg(1,1).eq.0) then ! compressible
42359599516SKenneth E. Jansen               warning='Solution is set to zero (with p and T to one)'
42459599516SKenneth E. Jansen            else
42559599516SKenneth E. Jansen               warning='Solution is set to zero'
42659599516SKenneth E. Jansen            endif
42759599516SKenneth E. Jansen            write(*,*) warning
42859599516SKenneth E. Jansen         endif
42959599516SKenneth E. Jansen         qold=zero
43059599516SKenneth E. Jansen         if (matflg(1,1).eq.0) then ! compressible
43159599516SKenneth E. Jansen            qold(:,1)=one ! avoid zero pressure
43259599516SKenneth E. Jansen            qold(:,nflow)=one ! avoid zero temperature
43359599516SKenneth E. Jansen         endif
43459599516SKenneth E. Jansen      endif
43559599516SKenneth E. Jansen
43659599516SKenneth E. Jansen      intfromfile=0
437d5d2f64dSCameron Smith      call phio_readheader(fhandle,
438e5afe575SCameron Smith     & c_char_'time derivative of solution' // char(0),
439e5afe575SCameron Smith     & c_loc(intfromfile), ithree, dataInt, iotype)
44059599516SKenneth E. Jansen      allocate( acold(nshg,ndof) )
44159599516SKenneth E. Jansen      if(intfromfile(1).ne.0) then
44259599516SKenneth E. Jansen         nshg2=intfromfile(1)
44359599516SKenneth E. Jansen         ndof2=intfromfile(2)
44459599516SKenneth E. Jansen         lstep=intfromfile(3)
44559599516SKenneth E. Jansen
44659599516SKenneth E. Jansen         if (nshg2 .ne. nshg)
44759599516SKenneth E. Jansen     &        call error ('restar  ', 'nshg   ', nshg)
44859599516SKenneth E. Jansen         allocate( acread(nshg,ndof2) )
44959599516SKenneth E. Jansen         acread=zero
45059599516SKenneth E. Jansen         iacsiz=nshg*ndof2
451d5d2f64dSCameron Smith         call phio_readdatablock(fhandle,
452bc62cfd4SCameron Smith     &    c_char_'time derivative of solution' // char(0),
453bc62cfd4SCameron Smith     &    c_loc(acread), iacsiz, dataDbl,iotype)
45459599516SKenneth E. Jansen         acold(:,1:ndof)=acread(:,1:ndof)
45559599516SKenneth E. Jansen         deallocate(acread)
45659599516SKenneth E. Jansen      else
45759599516SKenneth E. Jansen         if (myrank.eq.master) then
45859599516SKenneth E. Jansen            warning='Time derivative of solution is set to zero (SAFE)'
45959599516SKenneth E. Jansen            write(*,*) warning
46059599516SKenneth E. Jansen         endif
46159599516SKenneth E. Jansen         acold=zero
46259599516SKenneth E. Jansen      endif
46359599516SKenneth E. Jansencc
46459599516SKenneth E. Jansencc.... read the header and check it against the run data
46559599516SKenneth E. Jansencc
46659599516SKenneth E. Jansen      if (ideformwall.eq.1) then
46759599516SKenneth E. Jansen
46859599516SKenneth E. Jansen          intfromfile=0
469d5d2f64dSCameron Smith          call phio_readheader(fhandle,
470e5afe575SCameron Smith     &     c_char_'displacement' // char(0),
471e5afe575SCameron Smith     &     c_loc(intfromfile), ithree, dataInt, iotype)
47259599516SKenneth E. Jansen
47359599516SKenneth E. Jansen         nshg2=intfromfile(1)
47459599516SKenneth E. Jansen         ndisp=intfromfile(2)
47559599516SKenneth E. Jansen         lstep=intfromfile(3)
47659599516SKenneth E. Jansen         if(ndisp.ne.nsd) then
47759599516SKenneth E. Jansen            warning='WARNING ndisp not equal nsd'
47859599516SKenneth E. Jansen            write(*,*) warning , ndisp
47959599516SKenneth E. Jansen         endif
48059599516SKenneth E. Jansen         if (nshg2 .ne. nshg)
48159599516SKenneth E. Jansen     &        call error ('restar  ', 'nshg   ', nshg)
48259599516SKenneth E. Jansenc
48359599516SKenneth E. Jansenc.... read the values of primitive variables into uold
48459599516SKenneth E. Jansenc
48559599516SKenneth E. Jansen         allocate( uold(nshg,nsd) )
48659599516SKenneth E. Jansen         allocate( uread(nshg,nsd) )
48759599516SKenneth E. Jansen
48859599516SKenneth E. Jansen         iusiz=nshg*nsd
48959599516SKenneth E. Jansen
490d5d2f64dSCameron Smith         call phio_readdatablock(fhandle,
491bc62cfd4SCameron Smith     &    c_char_'displacement' // char(0),
492bc62cfd4SCameron Smith     &    c_loc(uread), iusiz, dataDbl, iotype)
49359599516SKenneth E. Jansen
49459599516SKenneth E. Jansen         uold(:,1:nsd)=uread(:,1:nsd)
49559599516SKenneth E. Jansen       else
49659599516SKenneth E. Jansen         allocate( uold(nshg,nsd) )
49759599516SKenneth E. Jansen         uold(:,1:nsd) = zero
49859599516SKenneth E. Jansen       endif
49959599516SKenneth E. Jansenc
50059599516SKenneth E. Jansenc.... close c-binary files
50159599516SKenneth E. Jansenc
502d7abaf6cSCameron Smith      call phio_closefile(fhandle)
503*266200f9SCameron Smith      iotime = TMRC() - iotime
504*266200f9SCameron Smith      if (myrank.eq.master) then
505*266200f9SCameron Smith        write(*,*) 'time to read restart (seconds)', iotime
506*266200f9SCameron Smith      endif
50759599516SKenneth E. Jansen
50859599516SKenneth E. Jansen      deallocate(xread)
50959599516SKenneth E. Jansen      if ( numpbc > 0 )  then
51059599516SKenneth E. Jansen         deallocate(bcinpread)
51159599516SKenneth E. Jansen         deallocate(ibctmpread)
51259599516SKenneth E. Jansen      endif
51359599516SKenneth E. Jansen      deallocate(iperread)
51459599516SKenneth E. Jansen      if(numpe.gt.1)
51559599516SKenneth E. Jansen     &     deallocate(ilworkread)
51659599516SKenneth E. Jansen      deallocate(nbcread)
51759599516SKenneth E. Jansen
51859599516SKenneth E. Jansen      return
51959599516SKenneth E. Jansen 994  call error ('input   ','opening ', igeomBAK)
52059599516SKenneth E. Jansen 995  call error ('input   ','opening ', igeomBAK)
52159599516SKenneth E. Jansen 997  call error ('input   ','end file', igeomBAK)
52259599516SKenneth E. Jansen 998  call error ('input   ','end file', igeomBAK)
52359599516SKenneth E. Jansen      end
52459599516SKenneth E. Jansenc
52559599516SKenneth E. Jansenc No longer called but kept around in case....
52659599516SKenneth E. Jansenc
52759599516SKenneth E. Jansen      subroutine genpzero(iBC)
52859599516SKenneth E. Jansen
52959599516SKenneth E. Jansen      use pointer_data
53059599516SKenneth E. Jansen      include "common.h"
53159599516SKenneth E. Jansen      integer iBC(nshg)
53259599516SKenneth E. Jansenc
53359599516SKenneth E. Jansenc....  check to see if any of the nodes have a dirichlet pressure
53459599516SKenneth E. Jansenc
53559599516SKenneth E. Jansen      pzero=1
53659599516SKenneth E. Jansen      if (any(btest(iBC,2))) pzero=0
53759599516SKenneth E. Jansen      do iblk = 1, nelblb
53859599516SKenneth E. Jansen         npro = lcblkb(1,iblk+1)-lcblkb(1,iblk)
53959599516SKenneth E. Jansen         do i=1, npro
54059599516SKenneth E. Jansen            iBCB1=miBCB(iblk)%p(i,1)
54159599516SKenneth E. Jansenc
54259599516SKenneth E. Jansenc.... check to see if any of the nodes have a Neumann pressure
54359599516SKenneth E. Jansenc     but not periodic (note that
54459599516SKenneth E. Jansenc
54559599516SKenneth E. Jansen            if(btest(iBCB1,1)) pzero=0
54659599516SKenneth E. Jansen         enddo
54759599516SKenneth E. Jansenc
54859599516SKenneth E. Jansenc.... share results with other processors
54959599516SKenneth E. Jansenc
55059599516SKenneth E. Jansen         pzl=pzero
55159599516SKenneth E. Jansen         if (numpe .gt. 1)
55259599516SKenneth E. Jansen     &        call MPI_ALLREDUCE (pzl, pzero, 1,
55359599516SKenneth E. Jansen     &        MPI_DOUBLE_PRECISION,MPI_MIN, MPI_COMM_WORLD,ierr)
55459599516SKenneth E. Jansen      enddo
55559599516SKenneth E. Jansen      return
55659599516SKenneth E. Jansen      end
557