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 35*520c014cSCameron Smith use phiotimer 369071d3baSCameron Smith use phstr 37ab645d52SCameron Smith use syncio 38ab645d52SCameron Smith use posixio 39ab645d52SCameron Smith use streamio 4059599516SKenneth E. Jansen include "common.h" 4102ce253eSCameron Smith 429a6935e5SKenneth E. Jansen real*8, target, allocatable :: xread(:,:), qread(:,:), acread(:,:) 439a6935e5SKenneth E. Jansen real*8, target, allocatable :: uread(:,:) 449a6935e5SKenneth E. Jansen real*8, target, allocatable :: BCinpread(:,:) 45266200f9SCameron Smith real*8 :: iotime 469a6935e5SKenneth E. Jansen integer, target, allocatable :: iperread(:), iBCtmpread(:) 479a6935e5SKenneth E. Jansen integer, target, allocatable :: ilworkread(:), nBCread(:) 48513954efSKenneth E. Jansen integer, target, allocatable :: fncorpread(:) 49513954efSKenneth E. Jansen integer fncorpsize 50513954efSKenneth E. Jansen character*10 cname2, cname2nd 5159599516SKenneth E. Jansen character*8 mach2 5259599516SKenneth E. Jansen character*30 fmt1 5359599516SKenneth E. Jansen character*255 fname1,fnamer,fnamelr 5459599516SKenneth E. Jansen character*255 warning 5559599516SKenneth E. Jansen integer igeomBAK, ibndc, irstin, ierr 569a6935e5SKenneth E. Jansen integer, target :: intfromfile(50) ! integers read from headers 579f4aafb6SCameron Smith integer :: descriptor, descriptorG, GPID, color, nfields 5859599516SKenneth E. Jansen integer :: numparts, nppf 5959599516SKenneth E. Jansen integer :: ierr_io, numprocs, itmp, itmp2 60ade0e30fSCameron Smith integer :: ignored 61d7abaf6cSCameron Smith integer :: fileFmt 62e8a3eca4SCameron Smith integer :: readstep 6359599516SKenneth E. Jansen character*255 fname2, temp2 6459599516SKenneth E. Jansen character*64 temp1 65e5afe575SCameron Smith type(c_ptr) :: handle 66e5afe575SCameron Smith character(len=1024) :: dataInt, dataDbl 67e5afe575SCameron Smith dataInt = c_char_'integer'//c_null_char 68e5afe575SCameron Smith dataDbl = c_char_'double'//c_null_char 6959599516SKenneth E. Jansenc 7059599516SKenneth E. Jansenc.... determine the step number to start with 7159599516SKenneth E. Jansenc 72e8a3eca4SCameron Smith irstart=0 73e8a3eca4SCameron Smith if (myrank.eq.master) then 7459599516SKenneth E. Jansen open(unit=72,file='numstart.dat',status='old') 7559599516SKenneth E. Jansen read(72,*) irstart 7659599516SKenneth E. Jansen close(72) 77e8a3eca4SCameron Smith endif 78df382577SCameron Smith call drvAllreduceMaxInt(irstart,readstep) 79e8a3eca4SCameron Smith irstart=readstep 8059599516SKenneth E. Jansen lstep=irstart ! in case restart files have no fields 8159599516SKenneth E. Jansen 8259599516SKenneth E. Jansen fname1='geombc.dat' 8359599516SKenneth E. Jansen fname1= trim(fname1) // cname2(myrank+1) 8459599516SKenneth E. Jansen 8559599516SKenneth E. Jansen itmp=1 8659599516SKenneth E. Jansen if (irstart .gt. 0) itmp = int(log10(float(irstart)))+1 8759599516SKenneth E. Jansen write (fmt1,"('(''restart.'',i',i1,',1x)')") itmp 8859599516SKenneth E. Jansen write (fnamer,fmt1) irstart 8959599516SKenneth E. Jansen fnamer = trim(fnamer) // cname2(myrank+1) 9059599516SKenneth E. Jansenc 9159599516SKenneth E. Jansenc.... open input files 9259599516SKenneth E. Jansenc.... input the geometry parameters 9359599516SKenneth E. Jansenc 9459599516SKenneth E. Jansen numparts = numpe !This is the common settings. Beware if you try to compute several parts per process 9559599516SKenneth E. Jansen 9659599516SKenneth E. Jansen itwo=2 9759599516SKenneth E. Jansen ione=1 9859599516SKenneth E. Jansen ieleven=11 9959599516SKenneth E. Jansen itmp = int(log10(float(myrank+1)))+1 10059599516SKenneth E. Jansen 101266200f9SCameron Smith iotime = TMRC() 1029f4aafb6SCameron Smith if( input_mode .eq. -1 ) then 103a486e66cSCameron Smith call streamio_setup_read(fhandle, geomRestartStream) 1049f4aafb6SCameron Smith else if( input_mode .eq. 0 ) then 105ab645d52SCameron Smith call posixio_setup(fhandle, c_char_'r') 1069f4aafb6SCameron Smith else if( input_mode .ge. 1 ) then 107ab645d52SCameron Smith call syncio_setup_read(nsynciofiles, fhandle) 1082efdc748SKenneth E. Jansen end if 109a93de25bSCameron Smith call phio_constructName(fhandle, 110d7abaf6cSCameron Smith & c_char_'geombc' // char(0), fname1) 111*520c014cSCameron Smith call phastaio_setfile(GEOMBC_READ) 112d7abaf6cSCameron Smith call phio_openfile(fname1, fhandle); 11359599516SKenneth E. Jansen 114d5d2f64dSCameron Smith call phio_readheader(fhandle,c_char_'number of nodes' // char(0), 115e5afe575SCameron Smith & c_loc(numnp),ione, dataInt, iotype) 11659599516SKenneth E. Jansen 117d5d2f64dSCameron Smith call phio_readheader(fhandle,c_char_'number of modes' // char(0), 118e5afe575SCameron Smith & c_loc(nshg),ione, dataInt, iotype) 11959599516SKenneth E. Jansen 120d5d2f64dSCameron Smith call phio_readheader(fhandle, 121e5afe575SCameron Smith & c_char_'number of interior elements' // char(0), 122e5afe575SCameron Smith & c_loc(numel),ione, dataInt, iotype) 12359599516SKenneth E. Jansen 124d5d2f64dSCameron Smith call phio_readheader(fhandle, 125e5afe575SCameron Smith & c_char_'number of boundary elements' // char(0), 126e5afe575SCameron Smith & c_loc(numelb),ione, dataInt, iotype) 12759599516SKenneth E. Jansen 128d5d2f64dSCameron Smith call phio_readheader(fhandle, 129e5afe575SCameron Smith & c_char_'maximum number of element nodes' // char(0), 130e5afe575SCameron Smith & c_loc(nen),ione, dataInt, iotype) 13159599516SKenneth E. Jansen 132d5d2f64dSCameron Smith call phio_readheader(fhandle, 133e5afe575SCameron Smith & c_char_'number of interior tpblocks' // char(0), 134e5afe575SCameron Smith & c_loc(nelblk),ione, dataInt, iotype) 13559599516SKenneth E. Jansen 136d5d2f64dSCameron Smith call phio_readheader(fhandle, 137e5afe575SCameron Smith & c_char_'number of boundary tpblocks' // char(0), 138e5afe575SCameron Smith & c_loc(nelblb),ione, dataInt, iotype) 13959599516SKenneth E. Jansen 140d5d2f64dSCameron Smith call phio_readheader(fhandle, 141e5afe575SCameron Smith & c_char_'number of nodes with Dirichlet BCs' // char(0), 142e5afe575SCameron Smith & c_loc(numpbc),ione, dataInt, iotype) 14359599516SKenneth E. Jansen 144d5d2f64dSCameron Smith call phio_readheader(fhandle, 145e5afe575SCameron Smith & c_char_'number of shape functions' // char(0), 146e5afe575SCameron Smith & c_loc(ntopsh),ione, dataInt, iotype) 14759599516SKenneth E. Jansenc 14859599516SKenneth E. Jansenc.... calculate the maximum number of boundary element nodes 14959599516SKenneth E. Jansenc 15059599516SKenneth E. Jansen nenb = 0 15159599516SKenneth E. Jansen do i = 1, melCat 15259599516SKenneth E. Jansen if (nen .eq. nenCat(i,nsd)) nenb = max(nenCat(i,nsd-1), nenb) 15359599516SKenneth E. Jansen enddo 15459599516SKenneth E. Jansen if (myrank == master) then 15559599516SKenneth E. Jansen if (nenb .eq. 0) call error ('input ','nen ',nen) 15659599516SKenneth E. Jansen endif 15759599516SKenneth E. Jansenc 15859599516SKenneth E. Jansenc.... setup some useful constants 15959599516SKenneth E. Jansenc 16059599516SKenneth E. Jansen I3nsd = nsd / 3 ! nsd=3 integer flag 16159599516SKenneth E. Jansen E3nsd = float(I3nsd) ! nsd=3 real flag 16259599516SKenneth E. Jansen if(matflg(1,1).lt.0) then 16359599516SKenneth E. Jansen nflow = nsd + 1 16459599516SKenneth E. Jansen else 16559599516SKenneth E. Jansen nflow = nsd + 2 16659599516SKenneth E. Jansen endif 16759599516SKenneth E. Jansen ndof = nsd + 2 16859599516SKenneth E. Jansen nsclr=impl(1)/100 16959599516SKenneth E. Jansen ndof=ndof+nsclr ! number of sclr transport equations to solve 17059599516SKenneth E. Jansen 17159599516SKenneth E. Jansen ndofBC = ndof + I3nsd ! dimension of BC array 17259599516SKenneth E. Jansen ndiBCB = 2 ! dimension of iBCB array 17359599516SKenneth E. Jansen ndBCB = ndof + 1 ! dimension of BCB array 17459599516SKenneth E. Jansen nsymdf = (ndof*(ndof + 1)) / 2 ! symm. d.o.f.'s 17559599516SKenneth E. Jansenc 17659599516SKenneth E. Jansenc.... ----------------------> Communication tasks <-------------------- 17759599516SKenneth E. Jansenc 17859599516SKenneth E. Jansen if(numpe > 1) then 179d5d2f64dSCameron Smith call phio_readheader(fhandle, 180e5afe575SCameron Smith & c_char_'size of ilwork array' // char(0), 181e5afe575SCameron Smith & c_loc(nlwork),ione, dataInt, iotype) 18259599516SKenneth E. Jansen 183d5d2f64dSCameron Smith call phio_readheader(fhandle, 184e5afe575SCameron Smith & c_char_'ilwork' //char(0), 185e5afe575SCameron Smith & c_loc(nlwork),ione, dataInt, iotype) 18659599516SKenneth E. Jansen 18759599516SKenneth E. Jansen allocate( point2ilwork(nlwork) ) 18859599516SKenneth E. Jansen allocate( ilworkread(nlwork) ) 189d5d2f64dSCameron Smith call phio_readdatablock(fhandle, c_char_'ilwork' // char(0), 190bc62cfd4SCameron Smith & c_loc(ilworkread), nlwork, dataInt , iotype) 19159599516SKenneth E. Jansen 19259599516SKenneth E. Jansen point2ilwork = ilworkread 19359599516SKenneth E. Jansen call ctypes (point2ilwork) 194513954efSKenneth E. Jansen 195ec121c45SKenneth E. Jansen if((usingPETSc.eq.1).or.(svLSFlag.eq.1)) then 196513954efSKenneth E. Jansen fncorpsize = nshg 197513954efSKenneth E. Jansen allocate(fncorp(fncorpsize)) 198513954efSKenneth E. Jansen call gen_ncorp(fncorp, ilworkread, nlwork, fncorpsize) 199513954efSKenneth E. Jansen! 200513954efSKenneth E. Jansen! the following code finds the global range of the owned nodes 201513954efSKenneth E. Jansen! 202513954efSKenneth E. Jansen maxowned=0 203513954efSKenneth E. Jansen minowned=maxval(fncorp) 204513954efSKenneth E. Jansen do i = 1,nshg 205513954efSKenneth E. Jansen if(fncorp(i).gt.0) then ! don't consider remote copies 206513954efSKenneth E. Jansen maxowned=max(maxowned,fncorp(i)) 207513954efSKenneth E. Jansen minowned=min(minowned,fncorp(i)) 208513954efSKenneth E. Jansen endif 209513954efSKenneth E. Jansen enddo 210513954efSKenneth E. Jansen! 211513954efSKenneth E. Jansen! end of global range code 212513954efSKenneth E. Jansen! 213513954efSKenneth E. Jansen call commuInt(fncorp, point2ilwork, 1, 'out') 214513954efSKenneth E. Jansen ncorpsize = fncorpsize 215513954efSKenneth E. Jansen endif 216ec121c45SKenneth E. Jansen if(svLSFlag.eq.1) then 217ec121c45SKenneth E. Jansen allocate(ltg(ncorpsize)) 218ec121c45SKenneth E. Jansen ltg(:)=fncorp(:) 219ec121c45SKenneth E. Jansen endif 220f538fcd7SKenneth E. Jansen else !serial 221c90fc7c7SKenneth E. Jansen if((usingPETSc.eq.1)) then 222c90fc7c7SKenneth E. Jansen fncorpsize = nshg 223c90fc7c7SKenneth E. Jansen allocate(fncorp(fncorpsize)) 224c90fc7c7SKenneth E. Jansen maxowned=nshg 225c90fc7c7SKenneth E. Jansen minowned=1 226c90fc7c7SKenneth E. Jansen iownnodes=nshg 227c90fc7c7SKenneth E. Jansen do i =1,nshg 228c90fc7c7SKenneth E. Jansen fncorp(i)=i 229c90fc7c7SKenneth E. Jansen enddo 230c90fc7c7SKenneth E. Jansen endif 231c90fc7c7SKenneth E. Jansen if((svLSFlag.eq.1)) then 232ec121c45SKenneth E. Jansen allocate(ltg(nshg)) 233ec121c45SKenneth E. Jansen do i =1,nshg 234ec121c45SKenneth E. Jansen ltg(i)=i 235ec121c45SKenneth E. Jansen enddo 236c90fc7c7SKenneth E. Jansen endif 23759599516SKenneth E. Jansen nlwork=1 23859599516SKenneth E. Jansen allocate( point2ilwork(1)) 23959599516SKenneth E. Jansen nshg0 = nshg 24059599516SKenneth E. Jansen endif 24159599516SKenneth E. Jansen 242ec121c45SKenneth E. Jansen 24359599516SKenneth E. Jansen itwo=2 24459599516SKenneth E. Jansen 245d5d2f64dSCameron Smith call phio_readheader(fhandle, 246e5afe575SCameron Smith & c_char_'co-ordinates' // char(0), 247e5afe575SCameron Smith & c_loc(intfromfile),itwo, dataDbl, iotype) 24859599516SKenneth E. Jansen numnp=intfromfile(1) 24959599516SKenneth E. Jansen allocate( point2x(numnp,nsd) ) 25059599516SKenneth E. Jansen allocate( xread(numnp,nsd) ) 25159599516SKenneth E. Jansen ixsiz=numnp*nsd 252d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 253bc62cfd4SCameron Smith & c_char_'co-ordinates' // char(0), 254bc62cfd4SCameron Smith & c_loc(xread),ixsiz, dataDbl, iotype) 25559599516SKenneth E. Jansen point2x = xread 256513954efSKenneth E. Jansen 257513954efSKenneth E. Jansenc..............................for Duct 258513954efSKenneth E. Jansen if(istretchOutlet.eq.1)then 259513954efSKenneth E. Jansen 260513954efSKenneth E. Jansenc...geometry6 261513954efSKenneth E. Jansen if(iDuctgeometryType .eq. 6) then 262513954efSKenneth E. Jansen xmaxn = 1.276 263513954efSKenneth E. Jansen xmaxo = 0.848 264513954efSKenneth E. Jansen xmin = 0.42 265513954efSKenneth E. Jansenc...geometry8 266513954efSKenneth E. Jansen elseif(iDuctgeometryType .eq. 8)then 267513954efSKenneth E. Jansen xmaxn=1.6*4.5*0.0254+0.85*1.5 268513954efSKenneth E. Jansen xmaxo=1.6*4.5*0.0254+0.85*1.0 269513954efSKenneth E. Jansen xmin =1.6*4.5*0.0254+0.85*0.5 270513954efSKenneth E. Jansen endif 271513954efSKenneth E. Jansenc... 272513954efSKenneth E. Jansen alpha=(xmaxn-xmaxo)/(xmaxo-xmin)**2 273513954efSKenneth E. Jansen where (point2x(:,1) .ge. xmin) 274513954efSKenneth E. Jansenc..... N=# of current elements from .42 to exit(~40) 275513954efSKenneth E. Jansenc..... (x_mx-x_mn)/N=.025 276513954efSKenneth E. Jansenc..... alpha=3 3*.025=.075 277513954efSKenneth E. Jansen point2x(:,1)=point2x(:,1)+ 278513954efSKenneth E. Jansen & alpha*(point2x(:,1)-xmin)**2 279513954efSKenneth E. Jansenc..... ftn to stretch x at exit 280513954efSKenneth E. Jansen endwhere 281513954efSKenneth E. Jansen endif 282513954efSKenneth E. Jansen 28359599516SKenneth E. Jansenc 28459599516SKenneth E. Jansenc.... read in and block out the connectivity 28559599516SKenneth E. Jansenc 2860f541e5dSKenneth E. Jansen if( input_mode .eq. -1 ) then 28759599516SKenneth E. Jansen call genblk (IBKSIZ) 2880f541e5dSKenneth E. Jansen else if( input_mode .eq. 0 ) then 2890f541e5dSKenneth E. Jansen call genblkPosix (IBKSIZ) 2900f541e5dSKenneth E. Jansen else if( input_mode .ge. 1 ) then 291ab5b07a4SKenneth E. Jansen call genblkSyncIO (IBKSIZ) 2920f541e5dSKenneth E. Jansen end if 29359599516SKenneth E. Jansenc 29459599516SKenneth E. Jansenc.... read the boundary condition mapping array 29559599516SKenneth E. Jansenc 29659599516SKenneth E. Jansen ione=1 297d5d2f64dSCameron Smith call phio_readheader(fhandle, 298e5afe575SCameron Smith & c_char_'bc mapping array' // char(0), 299e5afe575SCameron Smith & c_loc(nshg),ione, dataInt, iotype) 30059599516SKenneth E. Jansen 30159599516SKenneth E. Jansen allocate( nBC(nshg) ) 30259599516SKenneth E. Jansen 30359599516SKenneth E. Jansen allocate( nBCread(nshg) ) 30459599516SKenneth E. Jansen 305d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 306bc62cfd4SCameron Smith & c_char_'bc mapping array' // char(0), 307bc62cfd4SCameron Smith & c_loc(nBCread), nshg, dataInt, iotype) 30859599516SKenneth E. Jansen 30959599516SKenneth E. Jansen nBC=nBCread 31059599516SKenneth E. Jansenc 31159599516SKenneth E. Jansenc.... read the temporary iBC array 31259599516SKenneth E. Jansenc 31359599516SKenneth E. Jansen ione=1 314d5d2f64dSCameron Smith call phio_readheader(fhandle, 315e5afe575SCameron Smith & c_char_'bc codes array' // char(0), 316e5afe575SCameron Smith & c_loc(numpbc),ione, dataInt, iotype) 31759599516SKenneth E. Jansen 31859599516SKenneth E. Jansen if ( numpbc > 0 ) then 31959599516SKenneth E. Jansen allocate( iBCtmp(numpbc) ) 32059599516SKenneth E. Jansen allocate( iBCtmpread(numpbc) ) 32159599516SKenneth E. Jansen else 32259599516SKenneth E. Jansen allocate( iBCtmp(1) ) 32359599516SKenneth E. Jansen allocate( iBCtmpread(1) ) 32459599516SKenneth E. Jansen endif 325d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 326bc62cfd4SCameron Smith & c_char_'bc codes array' // char(0), 327bc62cfd4SCameron Smith & c_loc(iBCtmpread), numpbc, dataInt, iotype) 32859599516SKenneth E. Jansen 32959599516SKenneth E. Jansen if ( numpbc > 0 ) then 33059599516SKenneth E. Jansen iBCtmp=iBCtmpread 33159599516SKenneth E. Jansen else ! sometimes a partition has no BC's 33259599516SKenneth E. Jansen deallocate( iBCtmpread) 33359599516SKenneth E. Jansen iBCtmp=0 33459599516SKenneth E. Jansen endif 33559599516SKenneth E. Jansenc 33659599516SKenneth E. Jansenc.... read boundary condition data 33759599516SKenneth E. Jansenc 33859599516SKenneth E. Jansen ione=1 339d5d2f64dSCameron Smith call phio_readheader(fhandle, 340e5afe575SCameron Smith & c_char_'boundary condition array' // char(0), 341e5afe575SCameron Smith & c_loc(intfromfile),ione, dataDbl, iotype) 34259599516SKenneth E. Jansen 34359599516SKenneth E. Jansen if ( numpbc > 0 ) then 34459599516SKenneth E. Jansen allocate( BCinp(numpbc,ndof+7) ) 34559599516SKenneth E. Jansen nsecondrank=intfromfile(1)/numpbc 34659599516SKenneth E. Jansen allocate( BCinpread(numpbc,nsecondrank) ) 34759599516SKenneth E. Jansen iBCinpsiz=intfromfile(1) 34859599516SKenneth E. Jansen else 34959599516SKenneth E. Jansen allocate( BCinp(1,ndof+7) ) 35059599516SKenneth E. Jansen allocate( BCinpread(0,0) ) !dummy 35159599516SKenneth E. Jansen iBCinpsiz=intfromfile(1) 35259599516SKenneth E. Jansen endif 35359599516SKenneth E. Jansen 354d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 355bc62cfd4SCameron Smith & c_char_'boundary condition array' // char(0), 356bc62cfd4SCameron Smith & c_loc(BCinpread), iBCinpsiz, dataDbl, iotype) 35759599516SKenneth E. Jansen 35859599516SKenneth E. Jansen if ( numpbc > 0 ) then 35959599516SKenneth E. Jansen BCinp(:,1:(ndof+7))=BCinpread(:,1:(ndof+7)) 36059599516SKenneth E. Jansen else ! sometimes a partition has no BC's 36159599516SKenneth E. Jansen deallocate(BCinpread) 36259599516SKenneth E. Jansen BCinp=0 36359599516SKenneth E. Jansen endif 36459599516SKenneth E. Jansenc 36559599516SKenneth E. Jansenc.... read periodic boundary conditions 36659599516SKenneth E. Jansenc 36759599516SKenneth E. Jansen ione=1 368d5d2f64dSCameron Smith call phio_readheader(fhandle, 369e5afe575SCameron Smith & c_char_'periodic masters array' // char(0), 370e5afe575SCameron Smith & c_loc(nshg), ione, dataInt, iotype) 37159599516SKenneth E. Jansen allocate( point2iper(nshg) ) 37259599516SKenneth E. Jansen allocate( iperread(nshg) ) 373d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 374bc62cfd4SCameron Smith & c_char_'periodic masters array' // char(0), 375bc62cfd4SCameron Smith & c_loc(iperread), nshg, dataInt, iotype) 37659599516SKenneth E. Jansen point2iper=iperread 37759599516SKenneth E. Jansenc 37859599516SKenneth E. Jansenc.... generate the boundary element blocks 37959599516SKenneth E. Jansenc 3800f541e5dSKenneth E. Jansen if( input_mode .eq. -1 ) then 3810f541e5dSKenneth E. Jansen call genbkb (IBKSIZ) 3820f541e5dSKenneth E. Jansen else if( input_mode .eq. 0 ) then 3830f541e5dSKenneth E. Jansen call genbkbPosix (IBKSIZ) 3840f541e5dSKenneth E. Jansen else if( input_mode .ge. 1 ) then 385ab5b07a4SKenneth E. Jansen call genbkbSyncIO (IBKSIZ) 3860f541e5dSKenneth E. Jansen end if 38759599516SKenneth E. Jansenc 38859599516SKenneth E. Jansenc Read in the nsons and ifath arrays if needed 38959599516SKenneth E. Jansenc 39059599516SKenneth E. Jansenc There is a fundamental shift in the meaning of ifath based on whether 39159599516SKenneth E. Jansenc there exist homogenous directions in the flow. 39259599516SKenneth E. Jansenc 39359599516SKenneth E. Jansenc HOMOGENOUS DIRECTIONS EXIST: Here nfath is the number of inhomogenous 39459599516SKenneth E. Jansenc points in the TOTAL mesh. That is to say that each partition keeps a 39559599516SKenneth E. Jansenc link to ALL inhomogenous points. This link is furthermore not to the 39659599516SKenneth E. Jansenc sms numbering but to the original structured grid numbering. These 39759599516SKenneth E. Jansenc inhomogenous points are thought of as fathers, with their sons being all 39859599516SKenneth E. Jansenc the points in the homogenous directions that have this father's 39959599516SKenneth E. Jansenc inhomogeneity. The array ifath takes as an arguement the sms numbering 40059599516SKenneth E. Jansenc and returns as a result the father. 40159599516SKenneth E. Jansenc 40259599516SKenneth E. Jansenc In this case nsons is the number of sons that each father has and ifath 40359599516SKenneth E. Jansenc is an array which tells the 40459599516SKenneth E. Jansenc 40559599516SKenneth E. Jansenc NO HOMOGENOUS DIRECTIONS. In this case the mesh would grow to rapidly 40659599516SKenneth E. Jansenc if we followed the above strategy since every partition would index its 40759599516SKenneth E. Jansenc points to the ENTIRE mesh. Furthermore, there would never be a need 40859599516SKenneth E. Jansenc to average to a node off processor since there is no spatial averaging. 40959599516SKenneth E. Jansenc Therefore, to properly account for this case we must recognize it and 41059599516SKenneth E. Jansenc inerrupt certain actions (i.e. assembly of the average across partitions). 41159599516SKenneth E. Jansenc This case is easily identified by noting that maxval(nsons) =1 (i.e. no 41259599516SKenneth E. Jansenc father has any sons). Reiterating to be clear, in this case ifath does 41359599516SKenneth E. Jansenc not point to a global numbering but instead just points to itself. 41459599516SKenneth E. Jansenc 41559599516SKenneth E. Jansen nfath=1 ! some architectures choke on a zero or undeclared 41659599516SKenneth E. Jansen ! dimension variable. This sets it to a safe, small value. 41759599516SKenneth E. Jansen if(((iLES .lt. 20) .and. (iLES.gt.0)) 41859599516SKenneth E. Jansen & .or. (itwmod.gt.0) ) then ! don't forget same 41959599516SKenneth E. Jansen ! conditional in proces.f 42059599516SKenneth E. Jansen ! needed for alloc 42159599516SKenneth E. Jansen ione=1 42259599516SKenneth E. Jansen if(nohomog.gt.0) then 423d5d2f64dSCameron Smith call phio_readheader(fhandle, 424e5afe575SCameron Smith & c_char_'number of father-nodes' // char(0), 425e5afe575SCameron Smith & c_loc(nfath), ione, dataInt, iotype) 42659599516SKenneth E. Jansen 427d5d2f64dSCameron Smith call phio_readheader(fhandle, 428e5afe575SCameron Smith & c_char_'number of son-nodes for each father' // char(0), 429e5afe575SCameron Smith & c_loc(nfath), ione, dataInt, iotype) 43059599516SKenneth E. Jansen 43159599516SKenneth E. Jansen allocate (point2nsons(nfath)) 43259599516SKenneth E. Jansen 433d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 434bc62cfd4SCameron Smith & c_char_'number of son-nodes for each father' // char(0), 435bc62cfd4SCameron Smith & c_loc(point2nsons),nfath, dataInt, iotype) 43659599516SKenneth E. Jansen 437d5d2f64dSCameron Smith call phio_readheader(fhandle, 438e5afe575SCameron Smith & c_char_'keyword ifath' // char(0), 439e5afe575SCameron Smith & c_loc(nshg), ione, dataInt, iotype); 44059599516SKenneth E. Jansen 44159599516SKenneth E. Jansen allocate (point2ifath(nshg)) 44259599516SKenneth E. Jansen 443d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 444bc62cfd4SCameron Smith & c_char_'keyword ifath' // char(0), 445bc62cfd4SCameron Smith & c_loc(point2ifath), nshg, dataInt, iotype) 44659599516SKenneth E. Jansen 44759599516SKenneth E. Jansen nsonmax=maxval(point2nsons) 44859599516SKenneth E. Jansen else ! this is the case where there is no homogeneity 44959599516SKenneth E. Jansen ! therefore ever node is a father (too itself). sonfath 45059599516SKenneth E. Jansen ! (a routine in NSpre) will set this up but this gives 45159599516SKenneth E. Jansen ! you an option to avoid that. 45259599516SKenneth E. Jansen nfath=nshg 45359599516SKenneth E. Jansen allocate (point2nsons(nfath)) 45459599516SKenneth E. Jansen point2nsons=1 45559599516SKenneth E. Jansen allocate (point2ifath(nshg)) 45659599516SKenneth E. Jansen do i=1,nshg 45759599516SKenneth E. Jansen point2ifath(i)=i 45859599516SKenneth E. Jansen enddo 45959599516SKenneth E. Jansen nsonmax=1 46059599516SKenneth E. Jansen endif 46159599516SKenneth E. Jansen else 46259599516SKenneth E. Jansen allocate (point2nsons(1)) 46359599516SKenneth E. Jansen allocate (point2ifath(1)) 46459599516SKenneth E. Jansen endif 46559599516SKenneth E. Jansen 466d7abaf6cSCameron Smith call phio_closefile(fhandle); 467266200f9SCameron Smith iotime = TMRC() - iotime 468266200f9SCameron Smith if (myrank.eq.master) then 469266200f9SCameron Smith write(*,*) 'time to read geombc (seconds)', iotime 470266200f9SCameron Smith endif 471266200f9SCameron Smith 47259599516SKenneth E. Jansenc.... Read restart files 473266200f9SCameron Smith iotime = TMRC() 4749f4aafb6SCameron Smith if( input_mode .eq. -1 ) then 475a486e66cSCameron Smith call streamio_setup_read(fhandle, geomRestartStream) 4769f4aafb6SCameron Smith else if( input_mode .eq. 0 ) then 477d7abaf6cSCameron Smith call posixio_setup(fhandle, c_char_'r') 4789f4aafb6SCameron Smith else if( input_mode .ge. 1 ) then 479d7abaf6cSCameron Smith call syncio_setup_read(nsynciofiles, fhandle) 480d7abaf6cSCameron Smith end if 481a93de25bSCameron Smith call phio_constructName(fhandle, 482d7abaf6cSCameron Smith & c_char_'restart' // char(0), fnamer) 4839071d3baSCameron Smith call phstr_appendInt(fnamer, irstart) 4849071d3baSCameron Smith call phstr_appendStr(fnamer, c_char_'.'//c_null_char) 485*520c014cSCameron Smith call phastaio_setfile(RESTART_READ) 486d7abaf6cSCameron Smith call phio_openfile(fnamer, fhandle); 48759599516SKenneth E. Jansen 48859599516SKenneth E. Jansen ithree=3 48959599516SKenneth E. Jansen 49059599516SKenneth E. Jansen itmp = int(log10(float(myrank+1)))+1 49159599516SKenneth E. Jansen 49259599516SKenneth E. Jansen intfromfile=0 493d5d2f64dSCameron Smith call phio_readheader(fhandle, 494e5afe575SCameron Smith & c_char_'solution' // char(0), 495e5afe575SCameron Smith & c_loc(intfromfile), ithree, dataInt, iotype) 49659599516SKenneth E. Jansenc 49759599516SKenneth E. Jansenc.... read the values of primitive variables into q 49859599516SKenneth E. Jansenc 49959599516SKenneth E. Jansen allocate( qold(nshg,ndof) ) 50059599516SKenneth E. Jansen if(intfromfile(1).ne.0) then 50159599516SKenneth E. Jansen nshg2=intfromfile(1) 50259599516SKenneth E. Jansen ndof2=intfromfile(2) 50359599516SKenneth E. Jansen lstep=intfromfile(3) 50459599516SKenneth E. Jansen if(ndof2.ne.ndof) then 50559599516SKenneth E. Jansen 50659599516SKenneth E. Jansen endif 50759599516SKenneth E. Jansen if (nshg2 .ne. nshg) 50859599516SKenneth E. Jansen & call error ('restar ', 'nshg ', nshg) 50959599516SKenneth E. Jansen allocate( qread(nshg,ndof2) ) 51059599516SKenneth E. Jansen iqsiz=nshg*ndof2 511d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 512bc62cfd4SCameron Smith & c_char_'solution' // char(0), 513bc62cfd4SCameron Smith & c_loc(qread),iqsiz, dataDbl,iotype) 51459599516SKenneth E. Jansen qold(:,1:ndof)=qread(:,1:ndof) 51559599516SKenneth E. Jansen deallocate(qread) 51659599516SKenneth E. Jansen else 51759599516SKenneth E. Jansen if (myrank.eq.master) then 51859599516SKenneth E. Jansen if (matflg(1,1).eq.0) then ! compressible 51959599516SKenneth E. Jansen warning='Solution is set to zero (with p and T to one)' 52059599516SKenneth E. Jansen else 52159599516SKenneth E. Jansen warning='Solution is set to zero' 52259599516SKenneth E. Jansen endif 52359599516SKenneth E. Jansen write(*,*) warning 52459599516SKenneth E. Jansen endif 52559599516SKenneth E. Jansen qold=zero 52659599516SKenneth E. Jansen if (matflg(1,1).eq.0) then ! compressible 52759599516SKenneth E. Jansen qold(:,1)=one ! avoid zero pressure 52859599516SKenneth E. Jansen qold(:,nflow)=one ! avoid zero temperature 52959599516SKenneth E. Jansen endif 53059599516SKenneth E. Jansen endif 53159599516SKenneth E. Jansen 53259599516SKenneth E. Jansen intfromfile=0 533d5d2f64dSCameron Smith call phio_readheader(fhandle, 534e5afe575SCameron Smith & c_char_'time derivative of solution' // char(0), 535e5afe575SCameron Smith & c_loc(intfromfile), ithree, dataInt, iotype) 53659599516SKenneth E. Jansen allocate( acold(nshg,ndof) ) 53759599516SKenneth E. Jansen if(intfromfile(1).ne.0) then 53859599516SKenneth E. Jansen nshg2=intfromfile(1) 53959599516SKenneth E. Jansen ndof2=intfromfile(2) 54059599516SKenneth E. Jansen lstep=intfromfile(3) 54159599516SKenneth E. Jansen 54259599516SKenneth E. Jansen if (nshg2 .ne. nshg) 54359599516SKenneth E. Jansen & call error ('restar ', 'nshg ', nshg) 54459599516SKenneth E. Jansen allocate( acread(nshg,ndof2) ) 54559599516SKenneth E. Jansen acread=zero 54659599516SKenneth E. Jansen iacsiz=nshg*ndof2 547d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 548bc62cfd4SCameron Smith & c_char_'time derivative of solution' // char(0), 549bc62cfd4SCameron Smith & c_loc(acread), iacsiz, dataDbl,iotype) 55059599516SKenneth E. Jansen acold(:,1:ndof)=acread(:,1:ndof) 55159599516SKenneth E. Jansen deallocate(acread) 55259599516SKenneth E. Jansen else 55359599516SKenneth E. Jansen if (myrank.eq.master) then 55459599516SKenneth E. Jansen warning='Time derivative of solution is set to zero (SAFE)' 55559599516SKenneth E. Jansen write(*,*) warning 55659599516SKenneth E. Jansen endif 55759599516SKenneth E. Jansen acold=zero 55859599516SKenneth E. Jansen endif 55959599516SKenneth E. Jansencc 56059599516SKenneth E. Jansencc.... read the header and check it against the run data 56159599516SKenneth E. Jansencc 56259599516SKenneth E. Jansen if (ideformwall.eq.1) then 56359599516SKenneth E. Jansen 56459599516SKenneth E. Jansen intfromfile=0 565d5d2f64dSCameron Smith call phio_readheader(fhandle, 566e5afe575SCameron Smith & c_char_'displacement' // char(0), 567e5afe575SCameron Smith & c_loc(intfromfile), ithree, dataInt, iotype) 56859599516SKenneth E. Jansen 56959599516SKenneth E. Jansen nshg2=intfromfile(1) 57059599516SKenneth E. Jansen ndisp=intfromfile(2) 57159599516SKenneth E. Jansen lstep=intfromfile(3) 57259599516SKenneth E. Jansen if(ndisp.ne.nsd) then 57359599516SKenneth E. Jansen warning='WARNING ndisp not equal nsd' 57459599516SKenneth E. Jansen write(*,*) warning , ndisp 57559599516SKenneth E. Jansen endif 57659599516SKenneth E. Jansen if (nshg2 .ne. nshg) 57759599516SKenneth E. Jansen & call error ('restar ', 'nshg ', nshg) 57859599516SKenneth E. Jansenc 57959599516SKenneth E. Jansenc.... read the values of primitive variables into uold 58059599516SKenneth E. Jansenc 58159599516SKenneth E. Jansen allocate( uold(nshg,nsd) ) 58259599516SKenneth E. Jansen allocate( uread(nshg,nsd) ) 58359599516SKenneth E. Jansen 58459599516SKenneth E. Jansen iusiz=nshg*nsd 58559599516SKenneth E. Jansen 586d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 587bc62cfd4SCameron Smith & c_char_'displacement' // char(0), 588bc62cfd4SCameron Smith & c_loc(uread), iusiz, dataDbl, iotype) 58959599516SKenneth E. Jansen 59059599516SKenneth E. Jansen uold(:,1:nsd)=uread(:,1:nsd) 59159599516SKenneth E. Jansen else 59259599516SKenneth E. Jansen allocate( uold(nshg,nsd) ) 59359599516SKenneth E. Jansen uold(:,1:nsd) = zero 59459599516SKenneth E. Jansen endif 59559599516SKenneth E. Jansenc 59659599516SKenneth E. Jansenc.... close c-binary files 59759599516SKenneth E. Jansenc 598d7abaf6cSCameron Smith call phio_closefile(fhandle) 599266200f9SCameron Smith iotime = TMRC() - iotime 600266200f9SCameron Smith if (myrank.eq.master) then 601266200f9SCameron Smith write(*,*) 'time to read restart (seconds)', iotime 602266200f9SCameron Smith endif 60359599516SKenneth E. Jansen 60459599516SKenneth E. Jansen deallocate(xread) 60559599516SKenneth E. Jansen if ( numpbc > 0 ) then 60659599516SKenneth E. Jansen deallocate(bcinpread) 60759599516SKenneth E. Jansen deallocate(ibctmpread) 60859599516SKenneth E. Jansen endif 60959599516SKenneth E. Jansen deallocate(iperread) 61059599516SKenneth E. Jansen if(numpe.gt.1) 61159599516SKenneth E. Jansen & deallocate(ilworkread) 61259599516SKenneth E. Jansen deallocate(nbcread) 61359599516SKenneth E. Jansen 61459599516SKenneth E. Jansen return 61559599516SKenneth E. Jansen 994 call error ('input ','opening ', igeomBAK) 61659599516SKenneth E. Jansen 995 call error ('input ','opening ', igeomBAK) 61759599516SKenneth E. Jansen 997 call error ('input ','end file', igeomBAK) 61859599516SKenneth E. Jansen 998 call error ('input ','end file', igeomBAK) 61959599516SKenneth E. Jansen end 62059599516SKenneth E. Jansenc 62159599516SKenneth E. Jansenc No longer called but kept around in case.... 62259599516SKenneth E. Jansenc 62359599516SKenneth E. Jansen subroutine genpzero(iBC) 62459599516SKenneth E. Jansen 62559599516SKenneth E. Jansen use pointer_data 62659599516SKenneth E. Jansen include "common.h" 62759599516SKenneth E. Jansen integer iBC(nshg) 62859599516SKenneth E. Jansenc 62959599516SKenneth E. Jansenc.... check to see if any of the nodes have a dirichlet pressure 63059599516SKenneth E. Jansenc 63159599516SKenneth E. Jansen pzero=1 63259599516SKenneth E. Jansen if (any(btest(iBC,2))) pzero=0 63359599516SKenneth E. Jansen do iblk = 1, nelblb 63459599516SKenneth E. Jansen npro = lcblkb(1,iblk+1)-lcblkb(1,iblk) 63559599516SKenneth E. Jansen do i=1, npro 63659599516SKenneth E. Jansen iBCB1=miBCB(iblk)%p(i,1) 63759599516SKenneth E. Jansenc 63859599516SKenneth E. Jansenc.... check to see if any of the nodes have a Neumann pressure 63959599516SKenneth E. Jansenc but not periodic (note that 64059599516SKenneth E. Jansenc 64159599516SKenneth E. Jansen if(btest(iBCB1,1)) pzero=0 64259599516SKenneth E. Jansen enddo 64359599516SKenneth E. Jansenc 64459599516SKenneth E. Jansenc.... share results with other processors 64559599516SKenneth E. Jansenc 64659599516SKenneth E. Jansen pzl=pzero 64759599516SKenneth E. Jansen if (numpe .gt. 1) 64859599516SKenneth E. Jansen & call MPI_ALLREDUCE (pzl, pzero, 1, 64959599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_MIN, MPI_COMM_WORLD,ierr) 65059599516SKenneth E. Jansen enddo 65159599516SKenneth E. Jansen return 65259599516SKenneth E. Jansen end 653