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 187ec121c45SKenneth 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 208ec121c45SKenneth E. Jansen if(svLSFlag.eq.1) then 209ec121c45SKenneth E. Jansen allocate(ltg(ncorpsize)) 210ec121c45SKenneth E. Jansen ltg(:)=fncorp(:) 211ec121c45SKenneth E. Jansen endif 21259599516SKenneth E. Jansen else 213*c90fc7c7SKenneth E. Jansen if((usingPETSc.eq.1)) then 214*c90fc7c7SKenneth E. Jansen fncorpsize = nshg 215*c90fc7c7SKenneth E. Jansen allocate(fncorp(fncorpsize)) 216*c90fc7c7SKenneth E. Jansen maxowned=nshg 217*c90fc7c7SKenneth E. Jansen minowned=1 218*c90fc7c7SKenneth E. Jansen iownnodes=nshg 219*c90fc7c7SKenneth E. Jansen do i =1,nshg 220*c90fc7c7SKenneth E. Jansen fncorp(i)=i 221*c90fc7c7SKenneth E. Jansen enddo 222*c90fc7c7SKenneth E. Jansen endif 223*c90fc7c7SKenneth E. Jansen if((svLSFlag.eq.1)) then 224ec121c45SKenneth E. Jansen allocate(ltg(nshg)) 225ec121c45SKenneth E. Jansen do i =1,nshg 226ec121c45SKenneth E. Jansen ltg(i)=i 227ec121c45SKenneth E. Jansen enddo 228*c90fc7c7SKenneth E. Jansen endif 22959599516SKenneth E. Jansen nlwork=1 23059599516SKenneth E. Jansen allocate( point2ilwork(1)) 23159599516SKenneth E. Jansen nshg0 = nshg 23259599516SKenneth E. Jansen endif 23359599516SKenneth E. Jansen 234ec121c45SKenneth E. Jansen 23559599516SKenneth E. Jansen itwo=2 23659599516SKenneth E. Jansen 237d5d2f64dSCameron Smith call phio_readheader(fhandle, 238e5afe575SCameron Smith & c_char_'co-ordinates' // char(0), 239e5afe575SCameron Smith & c_loc(intfromfile),itwo, dataDbl, iotype) 24059599516SKenneth E. Jansen numnp=intfromfile(1) 24159599516SKenneth E. Jansen allocate( point2x(numnp,nsd) ) 24259599516SKenneth E. Jansen allocate( xread(numnp,nsd) ) 24359599516SKenneth E. Jansen ixsiz=numnp*nsd 244d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 245bc62cfd4SCameron Smith & c_char_'co-ordinates' // char(0), 246bc62cfd4SCameron Smith & c_loc(xread),ixsiz, dataDbl, iotype) 24759599516SKenneth E. Jansen point2x = xread 248513954efSKenneth E. Jansen 249513954efSKenneth E. Jansenc..............................for Duct 250513954efSKenneth E. Jansen if(istretchOutlet.eq.1)then 251513954efSKenneth E. Jansen 252513954efSKenneth E. Jansenc...geometry6 253513954efSKenneth E. Jansen if(iDuctgeometryType .eq. 6) then 254513954efSKenneth E. Jansen xmaxn = 1.276 255513954efSKenneth E. Jansen xmaxo = 0.848 256513954efSKenneth E. Jansen xmin = 0.42 257513954efSKenneth E. Jansenc...geometry8 258513954efSKenneth E. Jansen elseif(iDuctgeometryType .eq. 8)then 259513954efSKenneth E. Jansen xmaxn=1.6*4.5*0.0254+0.85*1.5 260513954efSKenneth E. Jansen xmaxo=1.6*4.5*0.0254+0.85*1.0 261513954efSKenneth E. Jansen xmin =1.6*4.5*0.0254+0.85*0.5 262513954efSKenneth E. Jansen endif 263513954efSKenneth E. Jansenc... 264513954efSKenneth E. Jansen alpha=(xmaxn-xmaxo)/(xmaxo-xmin)**2 265513954efSKenneth E. Jansen where (point2x(:,1) .ge. xmin) 266513954efSKenneth E. Jansenc..... N=# of current elements from .42 to exit(~40) 267513954efSKenneth E. Jansenc..... (x_mx-x_mn)/N=.025 268513954efSKenneth E. Jansenc..... alpha=3 3*.025=.075 269513954efSKenneth E. Jansen point2x(:,1)=point2x(:,1)+ 270513954efSKenneth E. Jansen & alpha*(point2x(:,1)-xmin)**2 271513954efSKenneth E. Jansenc..... ftn to stretch x at exit 272513954efSKenneth E. Jansen endwhere 273513954efSKenneth E. Jansen endif 274513954efSKenneth E. Jansen 27559599516SKenneth E. Jansenc 27659599516SKenneth E. Jansenc.... read in and block out the connectivity 27759599516SKenneth E. Jansenc 2780f541e5dSKenneth E. Jansen if( input_mode .eq. -1 ) then 27959599516SKenneth E. Jansen call genblk (IBKSIZ) 2800f541e5dSKenneth E. Jansen else if( input_mode .eq. 0 ) then 2810f541e5dSKenneth E. Jansen call genblkPosix (IBKSIZ) 2820f541e5dSKenneth E. Jansen else if( input_mode .ge. 1 ) then 283ab5b07a4SKenneth E. Jansen call genblkSyncIO (IBKSIZ) 2840f541e5dSKenneth E. Jansen end if 28559599516SKenneth E. Jansenc 28659599516SKenneth E. Jansenc.... read the boundary condition mapping array 28759599516SKenneth E. Jansenc 28859599516SKenneth E. Jansen ione=1 289d5d2f64dSCameron Smith call phio_readheader(fhandle, 290e5afe575SCameron Smith & c_char_'bc mapping array' // char(0), 291e5afe575SCameron Smith & c_loc(nshg),ione, dataInt, iotype) 29259599516SKenneth E. Jansen 29359599516SKenneth E. Jansen allocate( nBC(nshg) ) 29459599516SKenneth E. Jansen 29559599516SKenneth E. Jansen allocate( nBCread(nshg) ) 29659599516SKenneth E. Jansen 297d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 298bc62cfd4SCameron Smith & c_char_'bc mapping array' // char(0), 299bc62cfd4SCameron Smith & c_loc(nBCread), nshg, dataInt, iotype) 30059599516SKenneth E. Jansen 30159599516SKenneth E. Jansen nBC=nBCread 30259599516SKenneth E. Jansenc 30359599516SKenneth E. Jansenc.... read the temporary iBC array 30459599516SKenneth E. Jansenc 30559599516SKenneth E. Jansen ione=1 306d5d2f64dSCameron Smith call phio_readheader(fhandle, 307e5afe575SCameron Smith & c_char_'bc codes array' // char(0), 308e5afe575SCameron Smith & c_loc(numpbc),ione, dataInt, iotype) 30959599516SKenneth E. Jansen 31059599516SKenneth E. Jansen if ( numpbc > 0 ) then 31159599516SKenneth E. Jansen allocate( iBCtmp(numpbc) ) 31259599516SKenneth E. Jansen allocate( iBCtmpread(numpbc) ) 31359599516SKenneth E. Jansen else 31459599516SKenneth E. Jansen allocate( iBCtmp(1) ) 31559599516SKenneth E. Jansen allocate( iBCtmpread(1) ) 31659599516SKenneth E. Jansen endif 317d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 318bc62cfd4SCameron Smith & c_char_'bc codes array' // char(0), 319bc62cfd4SCameron Smith & c_loc(iBCtmpread), numpbc, dataInt, iotype) 32059599516SKenneth E. Jansen 32159599516SKenneth E. Jansen if ( numpbc > 0 ) then 32259599516SKenneth E. Jansen iBCtmp=iBCtmpread 32359599516SKenneth E. Jansen else ! sometimes a partition has no BC's 32459599516SKenneth E. Jansen deallocate( iBCtmpread) 32559599516SKenneth E. Jansen iBCtmp=0 32659599516SKenneth E. Jansen endif 32759599516SKenneth E. Jansenc 32859599516SKenneth E. Jansenc.... read boundary condition data 32959599516SKenneth E. Jansenc 33059599516SKenneth E. Jansen ione=1 331d5d2f64dSCameron Smith call phio_readheader(fhandle, 332e5afe575SCameron Smith & c_char_'boundary condition array' // char(0), 333e5afe575SCameron Smith & c_loc(intfromfile),ione, dataDbl, iotype) 33459599516SKenneth E. Jansen 33559599516SKenneth E. Jansen if ( numpbc > 0 ) then 33659599516SKenneth E. Jansen allocate( BCinp(numpbc,ndof+7) ) 33759599516SKenneth E. Jansen nsecondrank=intfromfile(1)/numpbc 33859599516SKenneth E. Jansen allocate( BCinpread(numpbc,nsecondrank) ) 33959599516SKenneth E. Jansen iBCinpsiz=intfromfile(1) 34059599516SKenneth E. Jansen else 34159599516SKenneth E. Jansen allocate( BCinp(1,ndof+7) ) 34259599516SKenneth E. Jansen allocate( BCinpread(0,0) ) !dummy 34359599516SKenneth E. Jansen iBCinpsiz=intfromfile(1) 34459599516SKenneth E. Jansen endif 34559599516SKenneth E. Jansen 346d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 347bc62cfd4SCameron Smith & c_char_'boundary condition array' // char(0), 348bc62cfd4SCameron Smith & c_loc(BCinpread), iBCinpsiz, dataDbl, iotype) 34959599516SKenneth E. Jansen 35059599516SKenneth E. Jansen if ( numpbc > 0 ) then 35159599516SKenneth E. Jansen BCinp(:,1:(ndof+7))=BCinpread(:,1:(ndof+7)) 35259599516SKenneth E. Jansen else ! sometimes a partition has no BC's 35359599516SKenneth E. Jansen deallocate(BCinpread) 35459599516SKenneth E. Jansen BCinp=0 35559599516SKenneth E. Jansen endif 35659599516SKenneth E. Jansenc 35759599516SKenneth E. Jansenc.... read periodic boundary conditions 35859599516SKenneth E. Jansenc 35959599516SKenneth E. Jansen ione=1 360d5d2f64dSCameron Smith call phio_readheader(fhandle, 361e5afe575SCameron Smith & c_char_'periodic masters array' // char(0), 362e5afe575SCameron Smith & c_loc(nshg), ione, dataInt, iotype) 36359599516SKenneth E. Jansen allocate( point2iper(nshg) ) 36459599516SKenneth E. Jansen allocate( iperread(nshg) ) 365d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 366bc62cfd4SCameron Smith & c_char_'periodic masters array' // char(0), 367bc62cfd4SCameron Smith & c_loc(iperread), nshg, dataInt, iotype) 36859599516SKenneth E. Jansen point2iper=iperread 36959599516SKenneth E. Jansenc 37059599516SKenneth E. Jansenc.... generate the boundary element blocks 37159599516SKenneth E. Jansenc 3720f541e5dSKenneth E. Jansen if( input_mode .eq. -1 ) then 3730f541e5dSKenneth E. Jansen call genbkb (IBKSIZ) 3740f541e5dSKenneth E. Jansen else if( input_mode .eq. 0 ) then 3750f541e5dSKenneth E. Jansen call genbkbPosix (IBKSIZ) 3760f541e5dSKenneth E. Jansen else if( input_mode .ge. 1 ) then 377ab5b07a4SKenneth E. Jansen call genbkbSyncIO (IBKSIZ) 3780f541e5dSKenneth E. Jansen end if 37959599516SKenneth E. Jansenc 38059599516SKenneth E. Jansenc Read in the nsons and ifath arrays if needed 38159599516SKenneth E. Jansenc 38259599516SKenneth E. Jansenc There is a fundamental shift in the meaning of ifath based on whether 38359599516SKenneth E. Jansenc there exist homogenous directions in the flow. 38459599516SKenneth E. Jansenc 38559599516SKenneth E. Jansenc HOMOGENOUS DIRECTIONS EXIST: Here nfath is the number of inhomogenous 38659599516SKenneth E. Jansenc points in the TOTAL mesh. That is to say that each partition keeps a 38759599516SKenneth E. Jansenc link to ALL inhomogenous points. This link is furthermore not to the 38859599516SKenneth E. Jansenc sms numbering but to the original structured grid numbering. These 38959599516SKenneth E. Jansenc inhomogenous points are thought of as fathers, with their sons being all 39059599516SKenneth E. Jansenc the points in the homogenous directions that have this father's 39159599516SKenneth E. Jansenc inhomogeneity. The array ifath takes as an arguement the sms numbering 39259599516SKenneth E. Jansenc and returns as a result the father. 39359599516SKenneth E. Jansenc 39459599516SKenneth E. Jansenc In this case nsons is the number of sons that each father has and ifath 39559599516SKenneth E. Jansenc is an array which tells the 39659599516SKenneth E. Jansenc 39759599516SKenneth E. Jansenc NO HOMOGENOUS DIRECTIONS. In this case the mesh would grow to rapidly 39859599516SKenneth E. Jansenc if we followed the above strategy since every partition would index its 39959599516SKenneth E. Jansenc points to the ENTIRE mesh. Furthermore, there would never be a need 40059599516SKenneth E. Jansenc to average to a node off processor since there is no spatial averaging. 40159599516SKenneth E. Jansenc Therefore, to properly account for this case we must recognize it and 40259599516SKenneth E. Jansenc inerrupt certain actions (i.e. assembly of the average across partitions). 40359599516SKenneth E. Jansenc This case is easily identified by noting that maxval(nsons) =1 (i.e. no 40459599516SKenneth E. Jansenc father has any sons). Reiterating to be clear, in this case ifath does 40559599516SKenneth E. Jansenc not point to a global numbering but instead just points to itself. 40659599516SKenneth E. Jansenc 40759599516SKenneth E. Jansen nfath=1 ! some architectures choke on a zero or undeclared 40859599516SKenneth E. Jansen ! dimension variable. This sets it to a safe, small value. 40959599516SKenneth E. Jansen if(((iLES .lt. 20) .and. (iLES.gt.0)) 41059599516SKenneth E. Jansen & .or. (itwmod.gt.0) ) then ! don't forget same 41159599516SKenneth E. Jansen ! conditional in proces.f 41259599516SKenneth E. Jansen ! needed for alloc 41359599516SKenneth E. Jansen ione=1 41459599516SKenneth E. Jansen if(nohomog.gt.0) then 415d5d2f64dSCameron Smith call phio_readheader(fhandle, 416e5afe575SCameron Smith & c_char_'number of father-nodes' // char(0), 417e5afe575SCameron Smith & c_loc(nfath), ione, dataInt, iotype) 41859599516SKenneth E. Jansen 419d5d2f64dSCameron Smith call phio_readheader(fhandle, 420e5afe575SCameron Smith & c_char_'number of son-nodes for each father' // char(0), 421e5afe575SCameron Smith & c_loc(nfath), ione, dataInt, iotype) 42259599516SKenneth E. Jansen 42359599516SKenneth E. Jansen allocate (point2nsons(nfath)) 42459599516SKenneth E. Jansen 425d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 426bc62cfd4SCameron Smith & c_char_'number of son-nodes for each father' // char(0), 427bc62cfd4SCameron Smith & c_loc(point2nsons),nfath, dataInt, iotype) 42859599516SKenneth E. Jansen 429d5d2f64dSCameron Smith call phio_readheader(fhandle, 430e5afe575SCameron Smith & c_char_'keyword ifath' // char(0), 431e5afe575SCameron Smith & c_loc(nshg), ione, dataInt, iotype); 43259599516SKenneth E. Jansen 43359599516SKenneth E. Jansen allocate (point2ifath(nshg)) 43459599516SKenneth E. Jansen 435d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 436bc62cfd4SCameron Smith & c_char_'keyword ifath' // char(0), 437bc62cfd4SCameron Smith & c_loc(point2ifath), nshg, dataInt, iotype) 43859599516SKenneth E. Jansen 43959599516SKenneth E. Jansen nsonmax=maxval(point2nsons) 44059599516SKenneth E. Jansen else ! this is the case where there is no homogeneity 44159599516SKenneth E. Jansen ! therefore ever node is a father (too itself). sonfath 44259599516SKenneth E. Jansen ! (a routine in NSpre) will set this up but this gives 44359599516SKenneth E. Jansen ! you an option to avoid that. 44459599516SKenneth E. Jansen nfath=nshg 44559599516SKenneth E. Jansen allocate (point2nsons(nfath)) 44659599516SKenneth E. Jansen point2nsons=1 44759599516SKenneth E. Jansen allocate (point2ifath(nshg)) 44859599516SKenneth E. Jansen do i=1,nshg 44959599516SKenneth E. Jansen point2ifath(i)=i 45059599516SKenneth E. Jansen enddo 45159599516SKenneth E. Jansen nsonmax=1 45259599516SKenneth E. Jansen endif 45359599516SKenneth E. Jansen else 45459599516SKenneth E. Jansen allocate (point2nsons(1)) 45559599516SKenneth E. Jansen allocate (point2ifath(1)) 45659599516SKenneth E. Jansen endif 45759599516SKenneth E. Jansen 458d7abaf6cSCameron Smith call phio_closefile(fhandle); 459266200f9SCameron Smith iotime = TMRC() - iotime 460266200f9SCameron Smith if (myrank.eq.master) then 461266200f9SCameron Smith write(*,*) 'time to read geombc (seconds)', iotime 462266200f9SCameron Smith endif 463266200f9SCameron Smith 46459599516SKenneth E. Jansenc.... Read restart files 465266200f9SCameron Smith iotime = TMRC() 4669f4aafb6SCameron Smith if( input_mode .eq. -1 ) then 467a486e66cSCameron Smith call streamio_setup_read(fhandle, geomRestartStream) 4689f4aafb6SCameron Smith else if( input_mode .eq. 0 ) then 469d7abaf6cSCameron Smith call posixio_setup(fhandle, c_char_'r') 4709f4aafb6SCameron Smith else if( input_mode .ge. 1 ) then 471d7abaf6cSCameron Smith call syncio_setup_read(nsynciofiles, fhandle) 472d7abaf6cSCameron Smith end if 473a93de25bSCameron Smith call phio_constructName(fhandle, 474d7abaf6cSCameron Smith & c_char_'restart' // char(0), fnamer) 4759071d3baSCameron Smith call phstr_appendInt(fnamer, irstart) 4769071d3baSCameron Smith call phstr_appendStr(fnamer, c_char_'.'//c_null_char) 477d7abaf6cSCameron Smith call phio_openfile(fnamer, fhandle); 47859599516SKenneth E. Jansen 47959599516SKenneth E. Jansen ithree=3 48059599516SKenneth E. Jansen 48159599516SKenneth E. Jansen itmp = int(log10(float(myrank+1)))+1 48259599516SKenneth E. Jansen 48359599516SKenneth E. Jansen intfromfile=0 484d5d2f64dSCameron Smith call phio_readheader(fhandle, 485e5afe575SCameron Smith & c_char_'solution' // char(0), 486e5afe575SCameron Smith & c_loc(intfromfile), ithree, dataInt, iotype) 48759599516SKenneth E. Jansenc 48859599516SKenneth E. Jansenc.... read the values of primitive variables into q 48959599516SKenneth E. Jansenc 49059599516SKenneth E. Jansen allocate( qold(nshg,ndof) ) 49159599516SKenneth E. Jansen if(intfromfile(1).ne.0) then 49259599516SKenneth E. Jansen nshg2=intfromfile(1) 49359599516SKenneth E. Jansen ndof2=intfromfile(2) 49459599516SKenneth E. Jansen lstep=intfromfile(3) 49559599516SKenneth E. Jansen if(ndof2.ne.ndof) then 49659599516SKenneth E. Jansen 49759599516SKenneth E. Jansen endif 49859599516SKenneth E. Jansen if (nshg2 .ne. nshg) 49959599516SKenneth E. Jansen & call error ('restar ', 'nshg ', nshg) 50059599516SKenneth E. Jansen allocate( qread(nshg,ndof2) ) 50159599516SKenneth E. Jansen iqsiz=nshg*ndof2 502d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 503bc62cfd4SCameron Smith & c_char_'solution' // char(0), 504bc62cfd4SCameron Smith & c_loc(qread),iqsiz, dataDbl,iotype) 50559599516SKenneth E. Jansen qold(:,1:ndof)=qread(:,1:ndof) 50659599516SKenneth E. Jansen deallocate(qread) 50759599516SKenneth E. Jansen else 50859599516SKenneth E. Jansen if (myrank.eq.master) then 50959599516SKenneth E. Jansen if (matflg(1,1).eq.0) then ! compressible 51059599516SKenneth E. Jansen warning='Solution is set to zero (with p and T to one)' 51159599516SKenneth E. Jansen else 51259599516SKenneth E. Jansen warning='Solution is set to zero' 51359599516SKenneth E. Jansen endif 51459599516SKenneth E. Jansen write(*,*) warning 51559599516SKenneth E. Jansen endif 51659599516SKenneth E. Jansen qold=zero 51759599516SKenneth E. Jansen if (matflg(1,1).eq.0) then ! compressible 51859599516SKenneth E. Jansen qold(:,1)=one ! avoid zero pressure 51959599516SKenneth E. Jansen qold(:,nflow)=one ! avoid zero temperature 52059599516SKenneth E. Jansen endif 52159599516SKenneth E. Jansen endif 52259599516SKenneth E. Jansen 52359599516SKenneth E. Jansen intfromfile=0 524d5d2f64dSCameron Smith call phio_readheader(fhandle, 525e5afe575SCameron Smith & c_char_'time derivative of solution' // char(0), 526e5afe575SCameron Smith & c_loc(intfromfile), ithree, dataInt, iotype) 52759599516SKenneth E. Jansen allocate( acold(nshg,ndof) ) 52859599516SKenneth E. Jansen if(intfromfile(1).ne.0) then 52959599516SKenneth E. Jansen nshg2=intfromfile(1) 53059599516SKenneth E. Jansen ndof2=intfromfile(2) 53159599516SKenneth E. Jansen lstep=intfromfile(3) 53259599516SKenneth E. Jansen 53359599516SKenneth E. Jansen if (nshg2 .ne. nshg) 53459599516SKenneth E. Jansen & call error ('restar ', 'nshg ', nshg) 53559599516SKenneth E. Jansen allocate( acread(nshg,ndof2) ) 53659599516SKenneth E. Jansen acread=zero 53759599516SKenneth E. Jansen iacsiz=nshg*ndof2 538d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 539bc62cfd4SCameron Smith & c_char_'time derivative of solution' // char(0), 540bc62cfd4SCameron Smith & c_loc(acread), iacsiz, dataDbl,iotype) 54159599516SKenneth E. Jansen acold(:,1:ndof)=acread(:,1:ndof) 54259599516SKenneth E. Jansen deallocate(acread) 54359599516SKenneth E. Jansen else 54459599516SKenneth E. Jansen if (myrank.eq.master) then 54559599516SKenneth E. Jansen warning='Time derivative of solution is set to zero (SAFE)' 54659599516SKenneth E. Jansen write(*,*) warning 54759599516SKenneth E. Jansen endif 54859599516SKenneth E. Jansen acold=zero 54959599516SKenneth E. Jansen endif 55059599516SKenneth E. Jansencc 55159599516SKenneth E. Jansencc.... read the header and check it against the run data 55259599516SKenneth E. Jansencc 55359599516SKenneth E. Jansen if (ideformwall.eq.1) then 55459599516SKenneth E. Jansen 55559599516SKenneth E. Jansen intfromfile=0 556d5d2f64dSCameron Smith call phio_readheader(fhandle, 557e5afe575SCameron Smith & c_char_'displacement' // char(0), 558e5afe575SCameron Smith & c_loc(intfromfile), ithree, dataInt, iotype) 55959599516SKenneth E. Jansen 56059599516SKenneth E. Jansen nshg2=intfromfile(1) 56159599516SKenneth E. Jansen ndisp=intfromfile(2) 56259599516SKenneth E. Jansen lstep=intfromfile(3) 56359599516SKenneth E. Jansen if(ndisp.ne.nsd) then 56459599516SKenneth E. Jansen warning='WARNING ndisp not equal nsd' 56559599516SKenneth E. Jansen write(*,*) warning , ndisp 56659599516SKenneth E. Jansen endif 56759599516SKenneth E. Jansen if (nshg2 .ne. nshg) 56859599516SKenneth E. Jansen & call error ('restar ', 'nshg ', nshg) 56959599516SKenneth E. Jansenc 57059599516SKenneth E. Jansenc.... read the values of primitive variables into uold 57159599516SKenneth E. Jansenc 57259599516SKenneth E. Jansen allocate( uold(nshg,nsd) ) 57359599516SKenneth E. Jansen allocate( uread(nshg,nsd) ) 57459599516SKenneth E. Jansen 57559599516SKenneth E. Jansen iusiz=nshg*nsd 57659599516SKenneth E. Jansen 577d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 578bc62cfd4SCameron Smith & c_char_'displacement' // char(0), 579bc62cfd4SCameron Smith & c_loc(uread), iusiz, dataDbl, iotype) 58059599516SKenneth E. Jansen 58159599516SKenneth E. Jansen uold(:,1:nsd)=uread(:,1:nsd) 58259599516SKenneth E. Jansen else 58359599516SKenneth E. Jansen allocate( uold(nshg,nsd) ) 58459599516SKenneth E. Jansen uold(:,1:nsd) = zero 58559599516SKenneth E. Jansen endif 58659599516SKenneth E. Jansenc 58759599516SKenneth E. Jansenc.... close c-binary files 58859599516SKenneth E. Jansenc 589d7abaf6cSCameron Smith call phio_closefile(fhandle) 590266200f9SCameron Smith iotime = TMRC() - iotime 591266200f9SCameron Smith if (myrank.eq.master) then 592266200f9SCameron Smith write(*,*) 'time to read restart (seconds)', iotime 593266200f9SCameron Smith endif 59459599516SKenneth E. Jansen 59559599516SKenneth E. Jansen deallocate(xread) 59659599516SKenneth E. Jansen if ( numpbc > 0 ) then 59759599516SKenneth E. Jansen deallocate(bcinpread) 59859599516SKenneth E. Jansen deallocate(ibctmpread) 59959599516SKenneth E. Jansen endif 60059599516SKenneth E. Jansen deallocate(iperread) 60159599516SKenneth E. Jansen if(numpe.gt.1) 60259599516SKenneth E. Jansen & deallocate(ilworkread) 60359599516SKenneth E. Jansen deallocate(nbcread) 60459599516SKenneth E. Jansen 60559599516SKenneth E. Jansen return 60659599516SKenneth E. Jansen 994 call error ('input ','opening ', igeomBAK) 60759599516SKenneth E. Jansen 995 call error ('input ','opening ', igeomBAK) 60859599516SKenneth E. Jansen 997 call error ('input ','end file', igeomBAK) 60959599516SKenneth E. Jansen 998 call error ('input ','end file', igeomBAK) 61059599516SKenneth E. Jansen end 61159599516SKenneth E. Jansenc 61259599516SKenneth E. Jansenc No longer called but kept around in case.... 61359599516SKenneth E. Jansenc 61459599516SKenneth E. Jansen subroutine genpzero(iBC) 61559599516SKenneth E. Jansen 61659599516SKenneth E. Jansen use pointer_data 61759599516SKenneth E. Jansen include "common.h" 61859599516SKenneth E. Jansen integer iBC(nshg) 61959599516SKenneth E. Jansenc 62059599516SKenneth E. Jansenc.... check to see if any of the nodes have a dirichlet pressure 62159599516SKenneth E. Jansenc 62259599516SKenneth E. Jansen pzero=1 62359599516SKenneth E. Jansen if (any(btest(iBC,2))) pzero=0 62459599516SKenneth E. Jansen do iblk = 1, nelblb 62559599516SKenneth E. Jansen npro = lcblkb(1,iblk+1)-lcblkb(1,iblk) 62659599516SKenneth E. Jansen do i=1, npro 62759599516SKenneth E. Jansen iBCB1=miBCB(iblk)%p(i,1) 62859599516SKenneth E. Jansenc 62959599516SKenneth E. Jansenc.... check to see if any of the nodes have a Neumann pressure 63059599516SKenneth E. Jansenc but not periodic (note that 63159599516SKenneth E. Jansenc 63259599516SKenneth E. Jansen if(btest(iBCB1,1)) pzero=0 63359599516SKenneth E. Jansen enddo 63459599516SKenneth E. Jansenc 63559599516SKenneth E. Jansenc.... share results with other processors 63659599516SKenneth E. Jansenc 63759599516SKenneth E. Jansen pzl=pzero 63859599516SKenneth E. Jansen if (numpe .gt. 1) 63959599516SKenneth E. Jansen & call MPI_ALLREDUCE (pzl, pzero, 1, 64059599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_MIN, MPI_COMM_WORLD,ierr) 64159599516SKenneth E. Jansen enddo 64259599516SKenneth E. Jansen return 64359599516SKenneth E. Jansen end 644