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