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(:) 2117860365SKenneth E. Jansen! integer, allocatable :: fncorp(:) 2217860365SKenneth E. Jansen integer, allocatable :: twodncorp(:,:) 2359599516SKenneth E. Jansen integer, allocatable :: nBC(:) 2459599516SKenneth E. Jansen integer, allocatable :: point2iper(:) 259a6935e5SKenneth E. Jansen integer, target, allocatable :: point2ifath(:) 269a6935e5SKenneth E. Jansen integer, target, allocatable :: point2nsons(:) 2759599516SKenneth E. Jansen 2859599516SKenneth E. Jansen end module 2959599516SKenneth E. Jansen 3059599516SKenneth E. Jansen subroutine readnblk 31e5afe575SCameron Smith use iso_c_binding 3259599516SKenneth E. Jansen use readarrays 3317860365SKenneth E. Jansen use fncorpmod 34e5afe575SCameron Smith use phio 359071d3baSCameron Smith use phstr 36ab645d52SCameron Smith use syncio 37ab645d52SCameron Smith use posixio 38ab645d52SCameron Smith use streamio 3959599516SKenneth E. Jansen include "common.h" 4002ce253eSCameron Smith 419a6935e5SKenneth E. Jansen real*8, target, allocatable :: xread(:,:), qread(:,:), acread(:,:) 429a6935e5SKenneth E. Jansen real*8, target, allocatable :: uread(:,:) 439a6935e5SKenneth E. Jansen real*8, target, allocatable :: BCinpread(:,:) 44266200f9SCameron Smith real*8 :: iotime 459a6935e5SKenneth E. Jansen integer, target, allocatable :: iperread(:), iBCtmpread(:) 469a6935e5SKenneth E. Jansen integer, target, allocatable :: ilworkread(:), nBCread(:) 47513954efSKenneth E. Jansen integer, target, allocatable :: fncorpread(:) 48513954efSKenneth E. Jansen integer fncorpsize 49513954efSKenneth E. Jansen character*10 cname2, cname2nd 5059599516SKenneth E. Jansen character*8 mach2 5159599516SKenneth E. Jansen character*30 fmt1 5259599516SKenneth E. Jansen character*255 fname1,fnamer,fnamelr 5359599516SKenneth E. Jansen character*255 warning 5459599516SKenneth E. Jansen integer igeomBAK, ibndc, irstin, ierr 559a6935e5SKenneth E. Jansen integer, target :: intfromfile(50) ! integers read from headers 569f4aafb6SCameron Smith integer :: descriptor, descriptorG, GPID, color, nfields 5759599516SKenneth E. Jansen integer :: numparts, nppf 5859599516SKenneth E. Jansen integer :: ierr_io, numprocs, itmp, itmp2 59ade0e30fSCameron Smith integer :: ignored 60d7abaf6cSCameron Smith integer :: fileFmt 6159599516SKenneth E. Jansen character*255 fname2, temp2 6259599516SKenneth E. Jansen character*64 temp1 63e5afe575SCameron Smith type(c_ptr) :: handle 64e5afe575SCameron Smith character(len=1024) :: dataInt, dataDbl 65e5afe575SCameron Smith dataInt = c_char_'integer'//c_null_char 66e5afe575SCameron Smith dataDbl = c_char_'double'//c_null_char 6759599516SKenneth E. Jansenc 6859599516SKenneth E. Jansenc.... determine the step number to start with 6959599516SKenneth E. Jansenc 7059599516SKenneth E. Jansen open(unit=72,file='numstart.dat',status='old') 7159599516SKenneth E. Jansen read(72,*) irstart 7259599516SKenneth E. Jansen close(72) 7359599516SKenneth E. Jansen lstep=irstart ! in case restart files have no fields 7459599516SKenneth E. Jansen 7559599516SKenneth E. Jansen fname1='geombc.dat' 7659599516SKenneth E. Jansen fname1= trim(fname1) // cname2(myrank+1) 7759599516SKenneth E. Jansen 7859599516SKenneth E. Jansen itmp=1 7959599516SKenneth E. Jansen if (irstart .gt. 0) itmp = int(log10(float(irstart)))+1 8059599516SKenneth E. Jansen write (fmt1,"('(''restart.'',i',i1,',1x)')") itmp 8159599516SKenneth E. Jansen write (fnamer,fmt1) irstart 8259599516SKenneth E. Jansen fnamer = trim(fnamer) // cname2(myrank+1) 8359599516SKenneth E. Jansenc 8459599516SKenneth E. Jansenc.... open input files 8559599516SKenneth E. Jansenc.... input the geometry parameters 8659599516SKenneth E. Jansenc 8759599516SKenneth E. Jansen numparts = numpe !This is the common settings. Beware if you try to compute several parts per process 8859599516SKenneth E. Jansen 8959599516SKenneth E. Jansen itwo=2 9059599516SKenneth E. Jansen ione=1 9159599516SKenneth E. Jansen ieleven=11 9259599516SKenneth E. Jansen itmp = int(log10(float(myrank+1)))+1 9359599516SKenneth E. Jansen 94266200f9SCameron Smith iotime = TMRC() 959f4aafb6SCameron Smith if( input_mode .eq. -1 ) then 96a486e66cSCameron Smith call streamio_setup_read(fhandle, geomRestartStream) 979f4aafb6SCameron Smith else if( input_mode .eq. 0 ) then 98ab645d52SCameron Smith call posixio_setup(fhandle, c_char_'r') 999f4aafb6SCameron Smith else if( input_mode .ge. 1 ) then 100ab645d52SCameron Smith call syncio_setup_read(nsynciofiles, fhandle) 1012efdc748SKenneth E. Jansen end if 102a93de25bSCameron Smith call phio_constructName(fhandle, 103d7abaf6cSCameron Smith & c_char_'geombc' // char(0), fname1) 104d7abaf6cSCameron Smith call phio_openfile(fname1, fhandle); 10559599516SKenneth E. Jansen 106d5d2f64dSCameron Smith call phio_readheader(fhandle,c_char_'number of nodes' // char(0), 107e5afe575SCameron Smith & c_loc(numnp),ione, dataInt, iotype) 10859599516SKenneth E. Jansen 109d5d2f64dSCameron Smith call phio_readheader(fhandle,c_char_'number of modes' // char(0), 110e5afe575SCameron Smith & c_loc(nshg),ione, dataInt, iotype) 11159599516SKenneth E. Jansen 112d5d2f64dSCameron Smith call phio_readheader(fhandle, 113e5afe575SCameron Smith & c_char_'number of interior elements' // char(0), 114e5afe575SCameron Smith & c_loc(numel),ione, dataInt, iotype) 11559599516SKenneth E. Jansen 116d5d2f64dSCameron Smith call phio_readheader(fhandle, 117e5afe575SCameron Smith & c_char_'number of boundary elements' // char(0), 118e5afe575SCameron Smith & c_loc(numelb),ione, dataInt, iotype) 11959599516SKenneth E. Jansen 120d5d2f64dSCameron Smith call phio_readheader(fhandle, 121e5afe575SCameron Smith & c_char_'maximum number of element nodes' // char(0), 122e5afe575SCameron Smith & c_loc(nen),ione, dataInt, iotype) 12359599516SKenneth E. Jansen 124d5d2f64dSCameron Smith call phio_readheader(fhandle, 125e5afe575SCameron Smith & c_char_'number of interior tpblocks' // char(0), 126e5afe575SCameron Smith & c_loc(nelblk),ione, dataInt, iotype) 12759599516SKenneth E. Jansen 128d5d2f64dSCameron Smith call phio_readheader(fhandle, 129e5afe575SCameron Smith & c_char_'number of boundary tpblocks' // char(0), 130e5afe575SCameron Smith & c_loc(nelblb),ione, dataInt, iotype) 13159599516SKenneth E. Jansen 132d5d2f64dSCameron Smith call phio_readheader(fhandle, 133e5afe575SCameron Smith & c_char_'number of nodes with Dirichlet BCs' // char(0), 134e5afe575SCameron Smith & c_loc(numpbc),ione, dataInt, iotype) 13559599516SKenneth E. Jansen 136d5d2f64dSCameron Smith call phio_readheader(fhandle, 137e5afe575SCameron Smith & c_char_'number of shape functions' // char(0), 138e5afe575SCameron Smith & c_loc(ntopsh),ione, dataInt, iotype) 13959599516SKenneth E. Jansenc 14059599516SKenneth E. Jansenc.... calculate the maximum number of boundary element nodes 14159599516SKenneth E. Jansenc 14259599516SKenneth E. Jansen nenb = 0 14359599516SKenneth E. Jansen do i = 1, melCat 14459599516SKenneth E. Jansen if (nen .eq. nenCat(i,nsd)) nenb = max(nenCat(i,nsd-1), nenb) 14559599516SKenneth E. Jansen enddo 14659599516SKenneth E. Jansen if (myrank == master) then 14759599516SKenneth E. Jansen if (nenb .eq. 0) call error ('input ','nen ',nen) 14859599516SKenneth E. Jansen endif 14959599516SKenneth E. Jansenc 15059599516SKenneth E. Jansenc.... setup some useful constants 15159599516SKenneth E. Jansenc 15259599516SKenneth E. Jansen I3nsd = nsd / 3 ! nsd=3 integer flag 15359599516SKenneth E. Jansen E3nsd = float(I3nsd) ! nsd=3 real flag 15459599516SKenneth E. Jansen if(matflg(1,1).lt.0) then 15559599516SKenneth E. Jansen nflow = nsd + 1 15659599516SKenneth E. Jansen else 15759599516SKenneth E. Jansen nflow = nsd + 2 15859599516SKenneth E. Jansen endif 15959599516SKenneth E. Jansen ndof = nsd + 2 16059599516SKenneth E. Jansen nsclr=impl(1)/100 16159599516SKenneth E. Jansen ndof=ndof+nsclr ! number of sclr transport equations to solve 16259599516SKenneth E. Jansen 16359599516SKenneth E. Jansen ndofBC = ndof + I3nsd ! dimension of BC array 16459599516SKenneth E. Jansen ndiBCB = 2 ! dimension of iBCB array 16559599516SKenneth E. Jansen ndBCB = ndof + 1 ! dimension of BCB array 16659599516SKenneth E. Jansen nsymdf = (ndof*(ndof + 1)) / 2 ! symm. d.o.f.'s 16759599516SKenneth E. Jansenc 16859599516SKenneth E. Jansenc.... ----------------------> Communication tasks <-------------------- 16959599516SKenneth E. Jansenc 17059599516SKenneth E. Jansen if(numpe > 1) then 171d5d2f64dSCameron Smith call phio_readheader(fhandle, 172e5afe575SCameron Smith & c_char_'size of ilwork array' // char(0), 173e5afe575SCameron Smith & c_loc(nlwork),ione, dataInt, iotype) 17459599516SKenneth E. Jansen 175d5d2f64dSCameron Smith call phio_readheader(fhandle, 176e5afe575SCameron Smith & c_char_'ilwork' //char(0), 177e5afe575SCameron Smith & c_loc(nlwork),ione, dataInt, iotype) 17859599516SKenneth E. Jansen 17959599516SKenneth E. Jansen allocate( point2ilwork(nlwork) ) 18059599516SKenneth E. Jansen allocate( ilworkread(nlwork) ) 181d5d2f64dSCameron Smith call phio_readdatablock(fhandle, c_char_'ilwork' // char(0), 182bc62cfd4SCameron Smith & c_loc(ilworkread), nlwork, dataInt , iotype) 18359599516SKenneth E. Jansen 18459599516SKenneth E. Jansen point2ilwork = ilworkread 18559599516SKenneth E. Jansen call ctypes (point2ilwork) 186513954efSKenneth E. Jansen 187*ec121c45SKenneth E. Jansen if((usingPETSc.eq.1).or.(svLSFlag.eq.1)) then 188513954efSKenneth E. Jansen fncorpsize = nshg 189513954efSKenneth E. Jansen allocate(fncorp(fncorpsize)) 190513954efSKenneth E. Jansen call gen_ncorp(fncorp, ilworkread, nlwork, fncorpsize) 191513954efSKenneth E. Jansen! 192513954efSKenneth E. Jansen! the following code finds the global range of the owned nodes 193513954efSKenneth E. Jansen! 194513954efSKenneth E. Jansen maxowned=0 195513954efSKenneth E. Jansen minowned=maxval(fncorp) 196513954efSKenneth E. Jansen do i = 1,nshg 197513954efSKenneth E. Jansen if(fncorp(i).gt.0) then ! don't consider remote copies 198513954efSKenneth E. Jansen maxowned=max(maxowned,fncorp(i)) 199513954efSKenneth E. Jansen minowned=min(minowned,fncorp(i)) 200513954efSKenneth E. Jansen endif 201513954efSKenneth E. Jansen enddo 202513954efSKenneth E. Jansen! 203513954efSKenneth E. Jansen! end of global range code 204513954efSKenneth E. Jansen! 205513954efSKenneth E. Jansen call commuInt(fncorp, point2ilwork, 1, 'out') 206513954efSKenneth E. Jansen ncorpsize = fncorpsize 207513954efSKenneth E. Jansen endif 208*ec121c45SKenneth E. Jansen if(svLSFlag.eq.1) then 209*ec121c45SKenneth E. Jansen allocate(ltg(ncorpsize)) 210*ec121c45SKenneth E. Jansen ltg(:)=fncorp(:) 211*ec121c45SKenneth E. Jansen endif 21259599516SKenneth E. Jansen else 213*ec121c45SKenneth E. Jansen allocate(ltg(nshg)) 214*ec121c45SKenneth E. Jansen do i =1,nshg 215*ec121c45SKenneth E. Jansen ltg(i)=i 216*ec121c45SKenneth E. Jansen enddo 21759599516SKenneth E. Jansen nlwork=1 21859599516SKenneth E. Jansen allocate( point2ilwork(1)) 21959599516SKenneth E. Jansen nshg0 = nshg 22059599516SKenneth E. Jansen endif 22159599516SKenneth E. Jansen 222*ec121c45SKenneth E. Jansen 22359599516SKenneth E. Jansen itwo=2 22459599516SKenneth E. Jansen 225d5d2f64dSCameron Smith call phio_readheader(fhandle, 226e5afe575SCameron Smith & c_char_'co-ordinates' // char(0), 227e5afe575SCameron Smith & c_loc(intfromfile),itwo, dataDbl, iotype) 22859599516SKenneth E. Jansen numnp=intfromfile(1) 22959599516SKenneth E. Jansen allocate( point2x(numnp,nsd) ) 23059599516SKenneth E. Jansen allocate( xread(numnp,nsd) ) 23159599516SKenneth E. Jansen ixsiz=numnp*nsd 232d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 233bc62cfd4SCameron Smith & c_char_'co-ordinates' // char(0), 234bc62cfd4SCameron Smith & c_loc(xread),ixsiz, dataDbl, iotype) 23559599516SKenneth E. Jansen point2x = xread 236513954efSKenneth E. Jansen 237513954efSKenneth E. Jansenc..............................for Duct 238513954efSKenneth E. Jansen if(istretchOutlet.eq.1)then 239513954efSKenneth E. Jansen 240513954efSKenneth E. Jansenc...geometry6 241513954efSKenneth E. Jansen if(iDuctgeometryType .eq. 6) then 242513954efSKenneth E. Jansen xmaxn = 1.276 243513954efSKenneth E. Jansen xmaxo = 0.848 244513954efSKenneth E. Jansen xmin = 0.42 245513954efSKenneth E. Jansenc...geometry8 246513954efSKenneth E. Jansen elseif(iDuctgeometryType .eq. 8)then 247513954efSKenneth E. Jansen xmaxn=1.6*4.5*0.0254+0.85*1.5 248513954efSKenneth E. Jansen xmaxo=1.6*4.5*0.0254+0.85*1.0 249513954efSKenneth E. Jansen xmin =1.6*4.5*0.0254+0.85*0.5 250513954efSKenneth E. Jansen endif 251513954efSKenneth E. Jansenc... 252513954efSKenneth E. Jansen alpha=(xmaxn-xmaxo)/(xmaxo-xmin)**2 253513954efSKenneth E. Jansen where (point2x(:,1) .ge. xmin) 254513954efSKenneth E. Jansenc..... N=# of current elements from .42 to exit(~40) 255513954efSKenneth E. Jansenc..... (x_mx-x_mn)/N=.025 256513954efSKenneth E. Jansenc..... alpha=3 3*.025=.075 257513954efSKenneth E. Jansen point2x(:,1)=point2x(:,1)+ 258513954efSKenneth E. Jansen & alpha*(point2x(:,1)-xmin)**2 259513954efSKenneth E. Jansenc..... ftn to stretch x at exit 260513954efSKenneth E. Jansen endwhere 261513954efSKenneth E. Jansen endif 262513954efSKenneth E. Jansen 26359599516SKenneth E. Jansenc 26459599516SKenneth E. Jansenc.... read in and block out the connectivity 26559599516SKenneth E. Jansenc 26659599516SKenneth E. Jansen call genblk (IBKSIZ) 26759599516SKenneth E. Jansenc 26859599516SKenneth E. Jansenc.... read the boundary condition mapping array 26959599516SKenneth E. Jansenc 27059599516SKenneth E. Jansen ione=1 271d5d2f64dSCameron Smith call phio_readheader(fhandle, 272e5afe575SCameron Smith & c_char_'bc mapping array' // char(0), 273e5afe575SCameron Smith & c_loc(nshg),ione, dataInt, iotype) 27459599516SKenneth E. Jansen 27559599516SKenneth E. Jansen allocate( nBC(nshg) ) 27659599516SKenneth E. Jansen 27759599516SKenneth E. Jansen allocate( nBCread(nshg) ) 27859599516SKenneth E. Jansen 279d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 280bc62cfd4SCameron Smith & c_char_'bc mapping array' // char(0), 281bc62cfd4SCameron Smith & c_loc(nBCread), nshg, dataInt, iotype) 28259599516SKenneth E. Jansen 28359599516SKenneth E. Jansen nBC=nBCread 28459599516SKenneth E. Jansenc 28559599516SKenneth E. Jansenc.... read the temporary iBC array 28659599516SKenneth E. Jansenc 28759599516SKenneth E. Jansen ione=1 288d5d2f64dSCameron Smith call phio_readheader(fhandle, 289e5afe575SCameron Smith & c_char_'bc codes array' // char(0), 290e5afe575SCameron Smith & c_loc(numpbc),ione, dataInt, iotype) 29159599516SKenneth E. Jansen 29259599516SKenneth E. Jansen if ( numpbc > 0 ) then 29359599516SKenneth E. Jansen allocate( iBCtmp(numpbc) ) 29459599516SKenneth E. Jansen allocate( iBCtmpread(numpbc) ) 29559599516SKenneth E. Jansen else 29659599516SKenneth E. Jansen allocate( iBCtmp(1) ) 29759599516SKenneth E. Jansen allocate( iBCtmpread(1) ) 29859599516SKenneth E. Jansen endif 299d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 300bc62cfd4SCameron Smith & c_char_'bc codes array' // char(0), 301bc62cfd4SCameron Smith & c_loc(iBCtmpread), numpbc, dataInt, iotype) 30259599516SKenneth E. Jansen 30359599516SKenneth E. Jansen if ( numpbc > 0 ) then 30459599516SKenneth E. Jansen iBCtmp=iBCtmpread 30559599516SKenneth E. Jansen else ! sometimes a partition has no BC's 30659599516SKenneth E. Jansen deallocate( iBCtmpread) 30759599516SKenneth E. Jansen iBCtmp=0 30859599516SKenneth E. Jansen endif 30959599516SKenneth E. Jansenc 31059599516SKenneth E. Jansenc.... read boundary condition data 31159599516SKenneth E. Jansenc 31259599516SKenneth E. Jansen ione=1 313d5d2f64dSCameron Smith call phio_readheader(fhandle, 314e5afe575SCameron Smith & c_char_'boundary condition array' // char(0), 315e5afe575SCameron Smith & c_loc(intfromfile),ione, dataDbl, iotype) 31659599516SKenneth E. Jansen 31759599516SKenneth E. Jansen if ( numpbc > 0 ) then 31859599516SKenneth E. Jansen allocate( BCinp(numpbc,ndof+7) ) 31959599516SKenneth E. Jansen nsecondrank=intfromfile(1)/numpbc 32059599516SKenneth E. Jansen allocate( BCinpread(numpbc,nsecondrank) ) 32159599516SKenneth E. Jansen iBCinpsiz=intfromfile(1) 32259599516SKenneth E. Jansen else 32359599516SKenneth E. Jansen allocate( BCinp(1,ndof+7) ) 32459599516SKenneth E. Jansen allocate( BCinpread(0,0) ) !dummy 32559599516SKenneth E. Jansen iBCinpsiz=intfromfile(1) 32659599516SKenneth E. Jansen endif 32759599516SKenneth E. Jansen 328d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 329bc62cfd4SCameron Smith & c_char_'boundary condition array' // char(0), 330bc62cfd4SCameron Smith & c_loc(BCinpread), iBCinpsiz, dataDbl, iotype) 33159599516SKenneth E. Jansen 33259599516SKenneth E. Jansen if ( numpbc > 0 ) then 33359599516SKenneth E. Jansen BCinp(:,1:(ndof+7))=BCinpread(:,1:(ndof+7)) 33459599516SKenneth E. Jansen else ! sometimes a partition has no BC's 33559599516SKenneth E. Jansen deallocate(BCinpread) 33659599516SKenneth E. Jansen BCinp=0 33759599516SKenneth E. Jansen endif 33859599516SKenneth E. Jansenc 33959599516SKenneth E. Jansenc.... read periodic boundary conditions 34059599516SKenneth E. Jansenc 34159599516SKenneth E. Jansen ione=1 342d5d2f64dSCameron Smith call phio_readheader(fhandle, 343e5afe575SCameron Smith & c_char_'periodic masters array' // char(0), 344e5afe575SCameron Smith & c_loc(nshg), ione, dataInt, iotype) 34559599516SKenneth E. Jansen allocate( point2iper(nshg) ) 34659599516SKenneth E. Jansen allocate( iperread(nshg) ) 347d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 348bc62cfd4SCameron Smith & c_char_'periodic masters array' // char(0), 349bc62cfd4SCameron Smith & c_loc(iperread), nshg, dataInt, iotype) 35059599516SKenneth E. Jansen point2iper=iperread 35159599516SKenneth E. Jansenc 35259599516SKenneth E. Jansenc.... generate the boundary element blocks 35359599516SKenneth E. Jansenc 35459599516SKenneth E. Jansen call genbkb (ibksiz) 35559599516SKenneth E. Jansenc 35659599516SKenneth E. Jansenc Read in the nsons and ifath arrays if needed 35759599516SKenneth E. Jansenc 35859599516SKenneth E. Jansenc There is a fundamental shift in the meaning of ifath based on whether 35959599516SKenneth E. Jansenc there exist homogenous directions in the flow. 36059599516SKenneth E. Jansenc 36159599516SKenneth E. Jansenc HOMOGENOUS DIRECTIONS EXIST: Here nfath is the number of inhomogenous 36259599516SKenneth E. Jansenc points in the TOTAL mesh. That is to say that each partition keeps a 36359599516SKenneth E. Jansenc link to ALL inhomogenous points. This link is furthermore not to the 36459599516SKenneth E. Jansenc sms numbering but to the original structured grid numbering. These 36559599516SKenneth E. Jansenc inhomogenous points are thought of as fathers, with their sons being all 36659599516SKenneth E. Jansenc the points in the homogenous directions that have this father's 36759599516SKenneth E. Jansenc inhomogeneity. The array ifath takes as an arguement the sms numbering 36859599516SKenneth E. Jansenc and returns as a result the father. 36959599516SKenneth E. Jansenc 37059599516SKenneth E. Jansenc In this case nsons is the number of sons that each father has and ifath 37159599516SKenneth E. Jansenc is an array which tells the 37259599516SKenneth E. Jansenc 37359599516SKenneth E. Jansenc NO HOMOGENOUS DIRECTIONS. In this case the mesh would grow to rapidly 37459599516SKenneth E. Jansenc if we followed the above strategy since every partition would index its 37559599516SKenneth E. Jansenc points to the ENTIRE mesh. Furthermore, there would never be a need 37659599516SKenneth E. Jansenc to average to a node off processor since there is no spatial averaging. 37759599516SKenneth E. Jansenc Therefore, to properly account for this case we must recognize it and 37859599516SKenneth E. Jansenc inerrupt certain actions (i.e. assembly of the average across partitions). 37959599516SKenneth E. Jansenc This case is easily identified by noting that maxval(nsons) =1 (i.e. no 38059599516SKenneth E. Jansenc father has any sons). Reiterating to be clear, in this case ifath does 38159599516SKenneth E. Jansenc not point to a global numbering but instead just points to itself. 38259599516SKenneth E. Jansenc 38359599516SKenneth E. Jansen nfath=1 ! some architectures choke on a zero or undeclared 38459599516SKenneth E. Jansen ! dimension variable. This sets it to a safe, small value. 38559599516SKenneth E. Jansen if(((iLES .lt. 20) .and. (iLES.gt.0)) 38659599516SKenneth E. Jansen & .or. (itwmod.gt.0) ) then ! don't forget same 38759599516SKenneth E. Jansen ! conditional in proces.f 38859599516SKenneth E. Jansen ! needed for alloc 38959599516SKenneth E. Jansen ione=1 39059599516SKenneth E. Jansen if(nohomog.gt.0) then 391d5d2f64dSCameron Smith call phio_readheader(fhandle, 392e5afe575SCameron Smith & c_char_'number of father-nodes' // char(0), 393e5afe575SCameron Smith & c_loc(nfath), ione, dataInt, iotype) 39459599516SKenneth E. Jansen 395d5d2f64dSCameron Smith call phio_readheader(fhandle, 396e5afe575SCameron Smith & c_char_'number of son-nodes for each father' // char(0), 397e5afe575SCameron Smith & c_loc(nfath), ione, dataInt, iotype) 39859599516SKenneth E. Jansen 39959599516SKenneth E. Jansen allocate (point2nsons(nfath)) 40059599516SKenneth E. Jansen 401d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 402bc62cfd4SCameron Smith & c_char_'number of son-nodes for each father' // char(0), 403bc62cfd4SCameron Smith & c_loc(point2nsons),nfath, dataInt, iotype) 40459599516SKenneth E. Jansen 405d5d2f64dSCameron Smith call phio_readheader(fhandle, 406e5afe575SCameron Smith & c_char_'keyword ifath' // char(0), 407e5afe575SCameron Smith & c_loc(nshg), ione, dataInt, iotype); 40859599516SKenneth E. Jansen 40959599516SKenneth E. Jansen allocate (point2ifath(nshg)) 41059599516SKenneth E. Jansen 411d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 412bc62cfd4SCameron Smith & c_char_'keyword ifath' // char(0), 413bc62cfd4SCameron Smith & c_loc(point2ifath), nshg, dataInt, iotype) 41459599516SKenneth E. Jansen 41559599516SKenneth E. Jansen nsonmax=maxval(point2nsons) 41659599516SKenneth E. Jansen else ! this is the case where there is no homogeneity 41759599516SKenneth E. Jansen ! therefore ever node is a father (too itself). sonfath 41859599516SKenneth E. Jansen ! (a routine in NSpre) will set this up but this gives 41959599516SKenneth E. Jansen ! you an option to avoid that. 42059599516SKenneth E. Jansen nfath=nshg 42159599516SKenneth E. Jansen allocate (point2nsons(nfath)) 42259599516SKenneth E. Jansen point2nsons=1 42359599516SKenneth E. Jansen allocate (point2ifath(nshg)) 42459599516SKenneth E. Jansen do i=1,nshg 42559599516SKenneth E. Jansen point2ifath(i)=i 42659599516SKenneth E. Jansen enddo 42759599516SKenneth E. Jansen nsonmax=1 42859599516SKenneth E. Jansen endif 42959599516SKenneth E. Jansen else 43059599516SKenneth E. Jansen allocate (point2nsons(1)) 43159599516SKenneth E. Jansen allocate (point2ifath(1)) 43259599516SKenneth E. Jansen endif 43359599516SKenneth E. Jansen 434d7abaf6cSCameron Smith call phio_closefile(fhandle); 435266200f9SCameron Smith iotime = TMRC() - iotime 436266200f9SCameron Smith if (myrank.eq.master) then 437266200f9SCameron Smith write(*,*) 'time to read geombc (seconds)', iotime 438266200f9SCameron Smith endif 439266200f9SCameron Smith 44059599516SKenneth E. Jansenc.... Read restart files 441266200f9SCameron Smith iotime = TMRC() 4429f4aafb6SCameron Smith if( input_mode .eq. -1 ) then 443a486e66cSCameron Smith call streamio_setup_read(fhandle, geomRestartStream) 4449f4aafb6SCameron Smith else if( input_mode .eq. 0 ) then 445d7abaf6cSCameron Smith call posixio_setup(fhandle, c_char_'r') 4469f4aafb6SCameron Smith else if( input_mode .ge. 1 ) then 447d7abaf6cSCameron Smith call syncio_setup_read(nsynciofiles, fhandle) 448d7abaf6cSCameron Smith end if 449a93de25bSCameron Smith call phio_constructName(fhandle, 450d7abaf6cSCameron Smith & c_char_'restart' // char(0), fnamer) 4519071d3baSCameron Smith call phstr_appendInt(fnamer, irstart) 4529071d3baSCameron Smith call phstr_appendStr(fnamer, c_char_'.'//c_null_char) 453d7abaf6cSCameron Smith call phio_openfile(fnamer, fhandle); 45459599516SKenneth E. Jansen 45559599516SKenneth E. Jansen ithree=3 45659599516SKenneth E. Jansen 45759599516SKenneth E. Jansen itmp = int(log10(float(myrank+1)))+1 45859599516SKenneth E. Jansen 45959599516SKenneth E. Jansen intfromfile=0 460d5d2f64dSCameron Smith call phio_readheader(fhandle, 461e5afe575SCameron Smith & c_char_'solution' // char(0), 462e5afe575SCameron Smith & c_loc(intfromfile), ithree, dataInt, iotype) 46359599516SKenneth E. Jansenc 46459599516SKenneth E. Jansenc.... read the values of primitive variables into q 46559599516SKenneth E. Jansenc 46659599516SKenneth E. Jansen allocate( qold(nshg,ndof) ) 46759599516SKenneth E. Jansen if(intfromfile(1).ne.0) then 46859599516SKenneth E. Jansen nshg2=intfromfile(1) 46959599516SKenneth E. Jansen ndof2=intfromfile(2) 47059599516SKenneth E. Jansen lstep=intfromfile(3) 47159599516SKenneth E. Jansen if(ndof2.ne.ndof) then 47259599516SKenneth E. Jansen 47359599516SKenneth E. Jansen endif 47459599516SKenneth E. Jansen if (nshg2 .ne. nshg) 47559599516SKenneth E. Jansen & call error ('restar ', 'nshg ', nshg) 47659599516SKenneth E. Jansen allocate( qread(nshg,ndof2) ) 47759599516SKenneth E. Jansen iqsiz=nshg*ndof2 478d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 479bc62cfd4SCameron Smith & c_char_'solution' // char(0), 480bc62cfd4SCameron Smith & c_loc(qread),iqsiz, dataDbl,iotype) 48159599516SKenneth E. Jansen qold(:,1:ndof)=qread(:,1:ndof) 48259599516SKenneth E. Jansen deallocate(qread) 48359599516SKenneth E. Jansen else 48459599516SKenneth E. Jansen if (myrank.eq.master) then 48559599516SKenneth E. Jansen if (matflg(1,1).eq.0) then ! compressible 48659599516SKenneth E. Jansen warning='Solution is set to zero (with p and T to one)' 48759599516SKenneth E. Jansen else 48859599516SKenneth E. Jansen warning='Solution is set to zero' 48959599516SKenneth E. Jansen endif 49059599516SKenneth E. Jansen write(*,*) warning 49159599516SKenneth E. Jansen endif 49259599516SKenneth E. Jansen qold=zero 49359599516SKenneth E. Jansen if (matflg(1,1).eq.0) then ! compressible 49459599516SKenneth E. Jansen qold(:,1)=one ! avoid zero pressure 49559599516SKenneth E. Jansen qold(:,nflow)=one ! avoid zero temperature 49659599516SKenneth E. Jansen endif 49759599516SKenneth E. Jansen endif 49859599516SKenneth E. Jansen 49959599516SKenneth E. Jansen intfromfile=0 500d5d2f64dSCameron Smith call phio_readheader(fhandle, 501e5afe575SCameron Smith & c_char_'time derivative of solution' // char(0), 502e5afe575SCameron Smith & c_loc(intfromfile), ithree, dataInt, iotype) 50359599516SKenneth E. Jansen allocate( acold(nshg,ndof) ) 50459599516SKenneth E. Jansen if(intfromfile(1).ne.0) then 50559599516SKenneth E. Jansen nshg2=intfromfile(1) 50659599516SKenneth E. Jansen ndof2=intfromfile(2) 50759599516SKenneth E. Jansen lstep=intfromfile(3) 50859599516SKenneth E. Jansen 50959599516SKenneth E. Jansen if (nshg2 .ne. nshg) 51059599516SKenneth E. Jansen & call error ('restar ', 'nshg ', nshg) 51159599516SKenneth E. Jansen allocate( acread(nshg,ndof2) ) 51259599516SKenneth E. Jansen acread=zero 51359599516SKenneth E. Jansen iacsiz=nshg*ndof2 514d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 515bc62cfd4SCameron Smith & c_char_'time derivative of solution' // char(0), 516bc62cfd4SCameron Smith & c_loc(acread), iacsiz, dataDbl,iotype) 51759599516SKenneth E. Jansen acold(:,1:ndof)=acread(:,1:ndof) 51859599516SKenneth E. Jansen deallocate(acread) 51959599516SKenneth E. Jansen else 52059599516SKenneth E. Jansen if (myrank.eq.master) then 52159599516SKenneth E. Jansen warning='Time derivative of solution is set to zero (SAFE)' 52259599516SKenneth E. Jansen write(*,*) warning 52359599516SKenneth E. Jansen endif 52459599516SKenneth E. Jansen acold=zero 52559599516SKenneth E. Jansen endif 52659599516SKenneth E. Jansencc 52759599516SKenneth E. Jansencc.... read the header and check it against the run data 52859599516SKenneth E. Jansencc 52959599516SKenneth E. Jansen if (ideformwall.eq.1) then 53059599516SKenneth E. Jansen 53159599516SKenneth E. Jansen intfromfile=0 532d5d2f64dSCameron Smith call phio_readheader(fhandle, 533e5afe575SCameron Smith & c_char_'displacement' // char(0), 534e5afe575SCameron Smith & c_loc(intfromfile), ithree, dataInt, iotype) 53559599516SKenneth E. Jansen 53659599516SKenneth E. Jansen nshg2=intfromfile(1) 53759599516SKenneth E. Jansen ndisp=intfromfile(2) 53859599516SKenneth E. Jansen lstep=intfromfile(3) 53959599516SKenneth E. Jansen if(ndisp.ne.nsd) then 54059599516SKenneth E. Jansen warning='WARNING ndisp not equal nsd' 54159599516SKenneth E. Jansen write(*,*) warning , ndisp 54259599516SKenneth E. Jansen endif 54359599516SKenneth E. Jansen if (nshg2 .ne. nshg) 54459599516SKenneth E. Jansen & call error ('restar ', 'nshg ', nshg) 54559599516SKenneth E. Jansenc 54659599516SKenneth E. Jansenc.... read the values of primitive variables into uold 54759599516SKenneth E. Jansenc 54859599516SKenneth E. Jansen allocate( uold(nshg,nsd) ) 54959599516SKenneth E. Jansen allocate( uread(nshg,nsd) ) 55059599516SKenneth E. Jansen 55159599516SKenneth E. Jansen iusiz=nshg*nsd 55259599516SKenneth E. Jansen 553d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 554bc62cfd4SCameron Smith & c_char_'displacement' // char(0), 555bc62cfd4SCameron Smith & c_loc(uread), iusiz, dataDbl, iotype) 55659599516SKenneth E. Jansen 55759599516SKenneth E. Jansen uold(:,1:nsd)=uread(:,1:nsd) 55859599516SKenneth E. Jansen else 55959599516SKenneth E. Jansen allocate( uold(nshg,nsd) ) 56059599516SKenneth E. Jansen uold(:,1:nsd) = zero 56159599516SKenneth E. Jansen endif 56259599516SKenneth E. Jansenc 56359599516SKenneth E. Jansenc.... close c-binary files 56459599516SKenneth E. Jansenc 565d7abaf6cSCameron Smith call phio_closefile(fhandle) 566266200f9SCameron Smith iotime = TMRC() - iotime 567266200f9SCameron Smith if (myrank.eq.master) then 568266200f9SCameron Smith write(*,*) 'time to read restart (seconds)', iotime 569266200f9SCameron Smith endif 57059599516SKenneth E. Jansen 57159599516SKenneth E. Jansen deallocate(xread) 57259599516SKenneth E. Jansen if ( numpbc > 0 ) then 57359599516SKenneth E. Jansen deallocate(bcinpread) 57459599516SKenneth E. Jansen deallocate(ibctmpread) 57559599516SKenneth E. Jansen endif 57659599516SKenneth E. Jansen deallocate(iperread) 57759599516SKenneth E. Jansen if(numpe.gt.1) 57859599516SKenneth E. Jansen & deallocate(ilworkread) 57959599516SKenneth E. Jansen deallocate(nbcread) 58059599516SKenneth E. Jansen 58159599516SKenneth E. Jansen return 58259599516SKenneth E. Jansen 994 call error ('input ','opening ', igeomBAK) 58359599516SKenneth E. Jansen 995 call error ('input ','opening ', igeomBAK) 58459599516SKenneth E. Jansen 997 call error ('input ','end file', igeomBAK) 58559599516SKenneth E. Jansen 998 call error ('input ','end file', igeomBAK) 58659599516SKenneth E. Jansen end 58759599516SKenneth E. Jansenc 58859599516SKenneth E. Jansenc No longer called but kept around in case.... 58959599516SKenneth E. Jansenc 59059599516SKenneth E. Jansen subroutine genpzero(iBC) 59159599516SKenneth E. Jansen 59259599516SKenneth E. Jansen use pointer_data 59359599516SKenneth E. Jansen include "common.h" 59459599516SKenneth E. Jansen integer iBC(nshg) 59559599516SKenneth E. Jansenc 59659599516SKenneth E. Jansenc.... check to see if any of the nodes have a dirichlet pressure 59759599516SKenneth E. Jansenc 59859599516SKenneth E. Jansen pzero=1 59959599516SKenneth E. Jansen if (any(btest(iBC,2))) pzero=0 60059599516SKenneth E. Jansen do iblk = 1, nelblb 60159599516SKenneth E. Jansen npro = lcblkb(1,iblk+1)-lcblkb(1,iblk) 60259599516SKenneth E. Jansen do i=1, npro 60359599516SKenneth E. Jansen iBCB1=miBCB(iblk)%p(i,1) 60459599516SKenneth E. Jansenc 60559599516SKenneth E. Jansenc.... check to see if any of the nodes have a Neumann pressure 60659599516SKenneth E. Jansenc but not periodic (note that 60759599516SKenneth E. Jansenc 60859599516SKenneth E. Jansen if(btest(iBCB1,1)) pzero=0 60959599516SKenneth E. Jansen enddo 61059599516SKenneth E. Jansenc 61159599516SKenneth E. Jansenc.... share results with other processors 61259599516SKenneth E. Jansenc 61359599516SKenneth E. Jansen pzl=pzero 61459599516SKenneth E. Jansen if (numpe .gt. 1) 61559599516SKenneth E. Jansen & call MPI_ALLREDUCE (pzl, pzero, 1, 61659599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_MIN, MPI_COMM_WORLD,ierr) 61759599516SKenneth E. Jansen enddo 61859599516SKenneth E. Jansen return 61959599516SKenneth E. Jansen end 620