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 213ec121c45SKenneth E. Jansen allocate(ltg(nshg)) 214ec121c45SKenneth E. Jansen do i =1,nshg 215ec121c45SKenneth E. Jansen ltg(i)=i 216ec121c45SKenneth 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 222ec121c45SKenneth 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 266*0f541e5dSKenneth E. Jansen if( input_mode .eq. -1 ) then 26759599516SKenneth E. Jansen call genblk (IBKSIZ) 268*0f541e5dSKenneth E. Jansen else if( input_mode .eq. 0 ) then 269*0f541e5dSKenneth E. Jansen call genblkPosix (IBKSIZ) 270*0f541e5dSKenneth E. Jansen else if( input_mode .ge. 1 ) then 271*0f541e5dSKenneth E. Jansen call genblk (IBKSIZ) 272*0f541e5dSKenneth E. Jansen end if 27359599516SKenneth E. Jansenc 27459599516SKenneth E. Jansenc.... read the boundary condition mapping array 27559599516SKenneth E. Jansenc 27659599516SKenneth E. Jansen ione=1 277d5d2f64dSCameron Smith call phio_readheader(fhandle, 278e5afe575SCameron Smith & c_char_'bc mapping array' // char(0), 279e5afe575SCameron Smith & c_loc(nshg),ione, dataInt, iotype) 28059599516SKenneth E. Jansen 28159599516SKenneth E. Jansen allocate( nBC(nshg) ) 28259599516SKenneth E. Jansen 28359599516SKenneth E. Jansen allocate( nBCread(nshg) ) 28459599516SKenneth E. Jansen 285d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 286bc62cfd4SCameron Smith & c_char_'bc mapping array' // char(0), 287bc62cfd4SCameron Smith & c_loc(nBCread), nshg, dataInt, iotype) 28859599516SKenneth E. Jansen 28959599516SKenneth E. Jansen nBC=nBCread 29059599516SKenneth E. Jansenc 29159599516SKenneth E. Jansenc.... read the temporary iBC array 29259599516SKenneth E. Jansenc 29359599516SKenneth E. Jansen ione=1 294d5d2f64dSCameron Smith call phio_readheader(fhandle, 295e5afe575SCameron Smith & c_char_'bc codes array' // char(0), 296e5afe575SCameron Smith & c_loc(numpbc),ione, dataInt, iotype) 29759599516SKenneth E. Jansen 29859599516SKenneth E. Jansen if ( numpbc > 0 ) then 29959599516SKenneth E. Jansen allocate( iBCtmp(numpbc) ) 30059599516SKenneth E. Jansen allocate( iBCtmpread(numpbc) ) 30159599516SKenneth E. Jansen else 30259599516SKenneth E. Jansen allocate( iBCtmp(1) ) 30359599516SKenneth E. Jansen allocate( iBCtmpread(1) ) 30459599516SKenneth E. Jansen endif 305d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 306bc62cfd4SCameron Smith & c_char_'bc codes array' // char(0), 307bc62cfd4SCameron Smith & c_loc(iBCtmpread), numpbc, dataInt, iotype) 30859599516SKenneth E. Jansen 30959599516SKenneth E. Jansen if ( numpbc > 0 ) then 31059599516SKenneth E. Jansen iBCtmp=iBCtmpread 31159599516SKenneth E. Jansen else ! sometimes a partition has no BC's 31259599516SKenneth E. Jansen deallocate( iBCtmpread) 31359599516SKenneth E. Jansen iBCtmp=0 31459599516SKenneth E. Jansen endif 31559599516SKenneth E. Jansenc 31659599516SKenneth E. Jansenc.... read boundary condition data 31759599516SKenneth E. Jansenc 31859599516SKenneth E. Jansen ione=1 319d5d2f64dSCameron Smith call phio_readheader(fhandle, 320e5afe575SCameron Smith & c_char_'boundary condition array' // char(0), 321e5afe575SCameron Smith & c_loc(intfromfile),ione, dataDbl, iotype) 32259599516SKenneth E. Jansen 32359599516SKenneth E. Jansen if ( numpbc > 0 ) then 32459599516SKenneth E. Jansen allocate( BCinp(numpbc,ndof+7) ) 32559599516SKenneth E. Jansen nsecondrank=intfromfile(1)/numpbc 32659599516SKenneth E. Jansen allocate( BCinpread(numpbc,nsecondrank) ) 32759599516SKenneth E. Jansen iBCinpsiz=intfromfile(1) 32859599516SKenneth E. Jansen else 32959599516SKenneth E. Jansen allocate( BCinp(1,ndof+7) ) 33059599516SKenneth E. Jansen allocate( BCinpread(0,0) ) !dummy 33159599516SKenneth E. Jansen iBCinpsiz=intfromfile(1) 33259599516SKenneth E. Jansen endif 33359599516SKenneth E. Jansen 334d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 335bc62cfd4SCameron Smith & c_char_'boundary condition array' // char(0), 336bc62cfd4SCameron Smith & c_loc(BCinpread), iBCinpsiz, dataDbl, iotype) 33759599516SKenneth E. Jansen 33859599516SKenneth E. Jansen if ( numpbc > 0 ) then 33959599516SKenneth E. Jansen BCinp(:,1:(ndof+7))=BCinpread(:,1:(ndof+7)) 34059599516SKenneth E. Jansen else ! sometimes a partition has no BC's 34159599516SKenneth E. Jansen deallocate(BCinpread) 34259599516SKenneth E. Jansen BCinp=0 34359599516SKenneth E. Jansen endif 34459599516SKenneth E. Jansenc 34559599516SKenneth E. Jansenc.... read periodic boundary conditions 34659599516SKenneth E. Jansenc 34759599516SKenneth E. Jansen ione=1 348d5d2f64dSCameron Smith call phio_readheader(fhandle, 349e5afe575SCameron Smith & c_char_'periodic masters array' // char(0), 350e5afe575SCameron Smith & c_loc(nshg), ione, dataInt, iotype) 35159599516SKenneth E. Jansen allocate( point2iper(nshg) ) 35259599516SKenneth E. Jansen allocate( iperread(nshg) ) 353d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 354bc62cfd4SCameron Smith & c_char_'periodic masters array' // char(0), 355bc62cfd4SCameron Smith & c_loc(iperread), nshg, dataInt, iotype) 35659599516SKenneth E. Jansen point2iper=iperread 35759599516SKenneth E. Jansenc 35859599516SKenneth E. Jansenc.... generate the boundary element blocks 35959599516SKenneth E. Jansenc 360*0f541e5dSKenneth E. Jansen if( input_mode .eq. -1 ) then 361*0f541e5dSKenneth E. Jansen call genbkb (IBKSIZ) 362*0f541e5dSKenneth E. Jansen else if( input_mode .eq. 0 ) then 363*0f541e5dSKenneth E. Jansen call genbkbPosix (IBKSIZ) 364*0f541e5dSKenneth E. Jansen else if( input_mode .ge. 1 ) then 365*0f541e5dSKenneth E. Jansen call genbkb (IBKSIZ) 366*0f541e5dSKenneth E. Jansen end if 36759599516SKenneth E. Jansenc 36859599516SKenneth E. Jansenc Read in the nsons and ifath arrays if needed 36959599516SKenneth E. Jansenc 37059599516SKenneth E. Jansenc There is a fundamental shift in the meaning of ifath based on whether 37159599516SKenneth E. Jansenc there exist homogenous directions in the flow. 37259599516SKenneth E. Jansenc 37359599516SKenneth E. Jansenc HOMOGENOUS DIRECTIONS EXIST: Here nfath is the number of inhomogenous 37459599516SKenneth E. Jansenc points in the TOTAL mesh. That is to say that each partition keeps a 37559599516SKenneth E. Jansenc link to ALL inhomogenous points. This link is furthermore not to the 37659599516SKenneth E. Jansenc sms numbering but to the original structured grid numbering. These 37759599516SKenneth E. Jansenc inhomogenous points are thought of as fathers, with their sons being all 37859599516SKenneth E. Jansenc the points in the homogenous directions that have this father's 37959599516SKenneth E. Jansenc inhomogeneity. The array ifath takes as an arguement the sms numbering 38059599516SKenneth E. Jansenc and returns as a result the father. 38159599516SKenneth E. Jansenc 38259599516SKenneth E. Jansenc In this case nsons is the number of sons that each father has and ifath 38359599516SKenneth E. Jansenc is an array which tells the 38459599516SKenneth E. Jansenc 38559599516SKenneth E. Jansenc NO HOMOGENOUS DIRECTIONS. In this case the mesh would grow to rapidly 38659599516SKenneth E. Jansenc if we followed the above strategy since every partition would index its 38759599516SKenneth E. Jansenc points to the ENTIRE mesh. Furthermore, there would never be a need 38859599516SKenneth E. Jansenc to average to a node off processor since there is no spatial averaging. 38959599516SKenneth E. Jansenc Therefore, to properly account for this case we must recognize it and 39059599516SKenneth E. Jansenc inerrupt certain actions (i.e. assembly of the average across partitions). 39159599516SKenneth E. Jansenc This case is easily identified by noting that maxval(nsons) =1 (i.e. no 39259599516SKenneth E. Jansenc father has any sons). Reiterating to be clear, in this case ifath does 39359599516SKenneth E. Jansenc not point to a global numbering but instead just points to itself. 39459599516SKenneth E. Jansenc 39559599516SKenneth E. Jansen nfath=1 ! some architectures choke on a zero or undeclared 39659599516SKenneth E. Jansen ! dimension variable. This sets it to a safe, small value. 39759599516SKenneth E. Jansen if(((iLES .lt. 20) .and. (iLES.gt.0)) 39859599516SKenneth E. Jansen & .or. (itwmod.gt.0) ) then ! don't forget same 39959599516SKenneth E. Jansen ! conditional in proces.f 40059599516SKenneth E. Jansen ! needed for alloc 40159599516SKenneth E. Jansen ione=1 40259599516SKenneth E. Jansen if(nohomog.gt.0) then 403d5d2f64dSCameron Smith call phio_readheader(fhandle, 404e5afe575SCameron Smith & c_char_'number of father-nodes' // char(0), 405e5afe575SCameron Smith & c_loc(nfath), ione, dataInt, iotype) 40659599516SKenneth E. Jansen 407d5d2f64dSCameron Smith call phio_readheader(fhandle, 408e5afe575SCameron Smith & c_char_'number of son-nodes for each father' // char(0), 409e5afe575SCameron Smith & c_loc(nfath), ione, dataInt, iotype) 41059599516SKenneth E. Jansen 41159599516SKenneth E. Jansen allocate (point2nsons(nfath)) 41259599516SKenneth E. Jansen 413d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 414bc62cfd4SCameron Smith & c_char_'number of son-nodes for each father' // char(0), 415bc62cfd4SCameron Smith & c_loc(point2nsons),nfath, dataInt, iotype) 41659599516SKenneth E. Jansen 417d5d2f64dSCameron Smith call phio_readheader(fhandle, 418e5afe575SCameron Smith & c_char_'keyword ifath' // char(0), 419e5afe575SCameron Smith & c_loc(nshg), ione, dataInt, iotype); 42059599516SKenneth E. Jansen 42159599516SKenneth E. Jansen allocate (point2ifath(nshg)) 42259599516SKenneth E. Jansen 423d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 424bc62cfd4SCameron Smith & c_char_'keyword ifath' // char(0), 425bc62cfd4SCameron Smith & c_loc(point2ifath), nshg, dataInt, iotype) 42659599516SKenneth E. Jansen 42759599516SKenneth E. Jansen nsonmax=maxval(point2nsons) 42859599516SKenneth E. Jansen else ! this is the case where there is no homogeneity 42959599516SKenneth E. Jansen ! therefore ever node is a father (too itself). sonfath 43059599516SKenneth E. Jansen ! (a routine in NSpre) will set this up but this gives 43159599516SKenneth E. Jansen ! you an option to avoid that. 43259599516SKenneth E. Jansen nfath=nshg 43359599516SKenneth E. Jansen allocate (point2nsons(nfath)) 43459599516SKenneth E. Jansen point2nsons=1 43559599516SKenneth E. Jansen allocate (point2ifath(nshg)) 43659599516SKenneth E. Jansen do i=1,nshg 43759599516SKenneth E. Jansen point2ifath(i)=i 43859599516SKenneth E. Jansen enddo 43959599516SKenneth E. Jansen nsonmax=1 44059599516SKenneth E. Jansen endif 44159599516SKenneth E. Jansen else 44259599516SKenneth E. Jansen allocate (point2nsons(1)) 44359599516SKenneth E. Jansen allocate (point2ifath(1)) 44459599516SKenneth E. Jansen endif 44559599516SKenneth E. Jansen 446d7abaf6cSCameron Smith call phio_closefile(fhandle); 447266200f9SCameron Smith iotime = TMRC() - iotime 448266200f9SCameron Smith if (myrank.eq.master) then 449266200f9SCameron Smith write(*,*) 'time to read geombc (seconds)', iotime 450266200f9SCameron Smith endif 451266200f9SCameron Smith 45259599516SKenneth E. Jansenc.... Read restart files 453266200f9SCameron Smith iotime = TMRC() 4549f4aafb6SCameron Smith if( input_mode .eq. -1 ) then 455a486e66cSCameron Smith call streamio_setup_read(fhandle, geomRestartStream) 4569f4aafb6SCameron Smith else if( input_mode .eq. 0 ) then 457d7abaf6cSCameron Smith call posixio_setup(fhandle, c_char_'r') 4589f4aafb6SCameron Smith else if( input_mode .ge. 1 ) then 459d7abaf6cSCameron Smith call syncio_setup_read(nsynciofiles, fhandle) 460d7abaf6cSCameron Smith end if 461a93de25bSCameron Smith call phio_constructName(fhandle, 462d7abaf6cSCameron Smith & c_char_'restart' // char(0), fnamer) 4639071d3baSCameron Smith call phstr_appendInt(fnamer, irstart) 4649071d3baSCameron Smith call phstr_appendStr(fnamer, c_char_'.'//c_null_char) 465d7abaf6cSCameron Smith call phio_openfile(fnamer, fhandle); 46659599516SKenneth E. Jansen 46759599516SKenneth E. Jansen ithree=3 46859599516SKenneth E. Jansen 46959599516SKenneth E. Jansen itmp = int(log10(float(myrank+1)))+1 47059599516SKenneth E. Jansen 47159599516SKenneth E. Jansen intfromfile=0 472d5d2f64dSCameron Smith call phio_readheader(fhandle, 473e5afe575SCameron Smith & c_char_'solution' // char(0), 474e5afe575SCameron Smith & c_loc(intfromfile), ithree, dataInt, iotype) 47559599516SKenneth E. Jansenc 47659599516SKenneth E. Jansenc.... read the values of primitive variables into q 47759599516SKenneth E. Jansenc 47859599516SKenneth E. Jansen allocate( qold(nshg,ndof) ) 47959599516SKenneth E. Jansen if(intfromfile(1).ne.0) then 48059599516SKenneth E. Jansen nshg2=intfromfile(1) 48159599516SKenneth E. Jansen ndof2=intfromfile(2) 48259599516SKenneth E. Jansen lstep=intfromfile(3) 48359599516SKenneth E. Jansen if(ndof2.ne.ndof) then 48459599516SKenneth E. Jansen 48559599516SKenneth E. Jansen endif 48659599516SKenneth E. Jansen if (nshg2 .ne. nshg) 48759599516SKenneth E. Jansen & call error ('restar ', 'nshg ', nshg) 48859599516SKenneth E. Jansen allocate( qread(nshg,ndof2) ) 48959599516SKenneth E. Jansen iqsiz=nshg*ndof2 490d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 491bc62cfd4SCameron Smith & c_char_'solution' // char(0), 492bc62cfd4SCameron Smith & c_loc(qread),iqsiz, dataDbl,iotype) 49359599516SKenneth E. Jansen qold(:,1:ndof)=qread(:,1:ndof) 49459599516SKenneth E. Jansen deallocate(qread) 49559599516SKenneth E. Jansen else 49659599516SKenneth E. Jansen if (myrank.eq.master) then 49759599516SKenneth E. Jansen if (matflg(1,1).eq.0) then ! compressible 49859599516SKenneth E. Jansen warning='Solution is set to zero (with p and T to one)' 49959599516SKenneth E. Jansen else 50059599516SKenneth E. Jansen warning='Solution is set to zero' 50159599516SKenneth E. Jansen endif 50259599516SKenneth E. Jansen write(*,*) warning 50359599516SKenneth E. Jansen endif 50459599516SKenneth E. Jansen qold=zero 50559599516SKenneth E. Jansen if (matflg(1,1).eq.0) then ! compressible 50659599516SKenneth E. Jansen qold(:,1)=one ! avoid zero pressure 50759599516SKenneth E. Jansen qold(:,nflow)=one ! avoid zero temperature 50859599516SKenneth E. Jansen endif 50959599516SKenneth E. Jansen endif 51059599516SKenneth E. Jansen 51159599516SKenneth E. Jansen intfromfile=0 512d5d2f64dSCameron Smith call phio_readheader(fhandle, 513e5afe575SCameron Smith & c_char_'time derivative of solution' // char(0), 514e5afe575SCameron Smith & c_loc(intfromfile), ithree, dataInt, iotype) 51559599516SKenneth E. Jansen allocate( acold(nshg,ndof) ) 51659599516SKenneth E. Jansen if(intfromfile(1).ne.0) then 51759599516SKenneth E. Jansen nshg2=intfromfile(1) 51859599516SKenneth E. Jansen ndof2=intfromfile(2) 51959599516SKenneth E. Jansen lstep=intfromfile(3) 52059599516SKenneth E. Jansen 52159599516SKenneth E. Jansen if (nshg2 .ne. nshg) 52259599516SKenneth E. Jansen & call error ('restar ', 'nshg ', nshg) 52359599516SKenneth E. Jansen allocate( acread(nshg,ndof2) ) 52459599516SKenneth E. Jansen acread=zero 52559599516SKenneth E. Jansen iacsiz=nshg*ndof2 526d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 527bc62cfd4SCameron Smith & c_char_'time derivative of solution' // char(0), 528bc62cfd4SCameron Smith & c_loc(acread), iacsiz, dataDbl,iotype) 52959599516SKenneth E. Jansen acold(:,1:ndof)=acread(:,1:ndof) 53059599516SKenneth E. Jansen deallocate(acread) 53159599516SKenneth E. Jansen else 53259599516SKenneth E. Jansen if (myrank.eq.master) then 53359599516SKenneth E. Jansen warning='Time derivative of solution is set to zero (SAFE)' 53459599516SKenneth E. Jansen write(*,*) warning 53559599516SKenneth E. Jansen endif 53659599516SKenneth E. Jansen acold=zero 53759599516SKenneth E. Jansen endif 53859599516SKenneth E. Jansencc 53959599516SKenneth E. Jansencc.... read the header and check it against the run data 54059599516SKenneth E. Jansencc 54159599516SKenneth E. Jansen if (ideformwall.eq.1) then 54259599516SKenneth E. Jansen 54359599516SKenneth E. Jansen intfromfile=0 544d5d2f64dSCameron Smith call phio_readheader(fhandle, 545e5afe575SCameron Smith & c_char_'displacement' // char(0), 546e5afe575SCameron Smith & c_loc(intfromfile), ithree, dataInt, iotype) 54759599516SKenneth E. Jansen 54859599516SKenneth E. Jansen nshg2=intfromfile(1) 54959599516SKenneth E. Jansen ndisp=intfromfile(2) 55059599516SKenneth E. Jansen lstep=intfromfile(3) 55159599516SKenneth E. Jansen if(ndisp.ne.nsd) then 55259599516SKenneth E. Jansen warning='WARNING ndisp not equal nsd' 55359599516SKenneth E. Jansen write(*,*) warning , ndisp 55459599516SKenneth E. Jansen endif 55559599516SKenneth E. Jansen if (nshg2 .ne. nshg) 55659599516SKenneth E. Jansen & call error ('restar ', 'nshg ', nshg) 55759599516SKenneth E. Jansenc 55859599516SKenneth E. Jansenc.... read the values of primitive variables into uold 55959599516SKenneth E. Jansenc 56059599516SKenneth E. Jansen allocate( uold(nshg,nsd) ) 56159599516SKenneth E. Jansen allocate( uread(nshg,nsd) ) 56259599516SKenneth E. Jansen 56359599516SKenneth E. Jansen iusiz=nshg*nsd 56459599516SKenneth E. Jansen 565d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 566bc62cfd4SCameron Smith & c_char_'displacement' // char(0), 567bc62cfd4SCameron Smith & c_loc(uread), iusiz, dataDbl, iotype) 56859599516SKenneth E. Jansen 56959599516SKenneth E. Jansen uold(:,1:nsd)=uread(:,1:nsd) 57059599516SKenneth E. Jansen else 57159599516SKenneth E. Jansen allocate( uold(nshg,nsd) ) 57259599516SKenneth E. Jansen uold(:,1:nsd) = zero 57359599516SKenneth E. Jansen endif 57459599516SKenneth E. Jansenc 57559599516SKenneth E. Jansenc.... close c-binary files 57659599516SKenneth E. Jansenc 577d7abaf6cSCameron Smith call phio_closefile(fhandle) 578266200f9SCameron Smith iotime = TMRC() - iotime 579266200f9SCameron Smith if (myrank.eq.master) then 580266200f9SCameron Smith write(*,*) 'time to read restart (seconds)', iotime 581266200f9SCameron Smith endif 58259599516SKenneth E. Jansen 58359599516SKenneth E. Jansen deallocate(xread) 58459599516SKenneth E. Jansen if ( numpbc > 0 ) then 58559599516SKenneth E. Jansen deallocate(bcinpread) 58659599516SKenneth E. Jansen deallocate(ibctmpread) 58759599516SKenneth E. Jansen endif 58859599516SKenneth E. Jansen deallocate(iperread) 58959599516SKenneth E. Jansen if(numpe.gt.1) 59059599516SKenneth E. Jansen & deallocate(ilworkread) 59159599516SKenneth E. Jansen deallocate(nbcread) 59259599516SKenneth E. Jansen 59359599516SKenneth E. Jansen return 59459599516SKenneth E. Jansen 994 call error ('input ','opening ', igeomBAK) 59559599516SKenneth E. Jansen 995 call error ('input ','opening ', igeomBAK) 59659599516SKenneth E. Jansen 997 call error ('input ','end file', igeomBAK) 59759599516SKenneth E. Jansen 998 call error ('input ','end file', igeomBAK) 59859599516SKenneth E. Jansen end 59959599516SKenneth E. Jansenc 60059599516SKenneth E. Jansenc No longer called but kept around in case.... 60159599516SKenneth E. Jansenc 60259599516SKenneth E. Jansen subroutine genpzero(iBC) 60359599516SKenneth E. Jansen 60459599516SKenneth E. Jansen use pointer_data 60559599516SKenneth E. Jansen include "common.h" 60659599516SKenneth E. Jansen integer iBC(nshg) 60759599516SKenneth E. Jansenc 60859599516SKenneth E. Jansenc.... check to see if any of the nodes have a dirichlet pressure 60959599516SKenneth E. Jansenc 61059599516SKenneth E. Jansen pzero=1 61159599516SKenneth E. Jansen if (any(btest(iBC,2))) pzero=0 61259599516SKenneth E. Jansen do iblk = 1, nelblb 61359599516SKenneth E. Jansen npro = lcblkb(1,iblk+1)-lcblkb(1,iblk) 61459599516SKenneth E. Jansen do i=1, npro 61559599516SKenneth E. Jansen iBCB1=miBCB(iblk)%p(i,1) 61659599516SKenneth E. Jansenc 61759599516SKenneth E. Jansenc.... check to see if any of the nodes have a Neumann pressure 61859599516SKenneth E. Jansenc but not periodic (note that 61959599516SKenneth E. Jansenc 62059599516SKenneth E. Jansen if(btest(iBCB1,1)) pzero=0 62159599516SKenneth E. Jansen enddo 62259599516SKenneth E. Jansenc 62359599516SKenneth E. Jansenc.... share results with other processors 62459599516SKenneth E. Jansenc 62559599516SKenneth E. Jansen pzl=pzero 62659599516SKenneth E. Jansen if (numpe .gt. 1) 62759599516SKenneth E. Jansen & call MPI_ALLREDUCE (pzl, pzero, 1, 62859599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_MIN, MPI_COMM_WORLD,ierr) 62959599516SKenneth E. Jansen enddo 63059599516SKenneth E. Jansen return 63159599516SKenneth E. Jansen end 632