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