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