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 61*e8a3eca4SCameron Smith integer :: readstep 6259599516SKenneth E. Jansen character*255 fname2, temp2 6359599516SKenneth E. Jansen character*64 temp1 64e5afe575SCameron Smith type(c_ptr) :: handle 65e5afe575SCameron Smith character(len=1024) :: dataInt, dataDbl 66e5afe575SCameron Smith dataInt = c_char_'integer'//c_null_char 67e5afe575SCameron Smith dataDbl = c_char_'double'//c_null_char 6859599516SKenneth E. Jansenc 6959599516SKenneth E. Jansenc.... determine the step number to start with 7059599516SKenneth E. Jansenc 71*e8a3eca4SCameron Smith irstart=0 72*e8a3eca4SCameron Smith if (myrank.eq.master) then 7359599516SKenneth E. Jansen open(unit=72,file='numstart.dat',status='old') 7459599516SKenneth E. Jansen read(72,*) irstart 7559599516SKenneth E. Jansen close(72) 76*e8a3eca4SCameron Smith endif 77*e8a3eca4SCameron Smith call drvAllreducesclr(irstart,readstep) 78*e8a3eca4SCameron Smith irstart=readstep 7959599516SKenneth E. Jansen lstep=irstart ! in case restart files have no fields 8059599516SKenneth E. Jansen 8159599516SKenneth E. Jansen fname1='geombc.dat' 8259599516SKenneth E. Jansen fname1= trim(fname1) // cname2(myrank+1) 8359599516SKenneth E. Jansen 8459599516SKenneth E. Jansen itmp=1 8559599516SKenneth E. Jansen if (irstart .gt. 0) itmp = int(log10(float(irstart)))+1 8659599516SKenneth E. Jansen write (fmt1,"('(''restart.'',i',i1,',1x)')") itmp 8759599516SKenneth E. Jansen write (fnamer,fmt1) irstart 8859599516SKenneth E. Jansen fnamer = trim(fnamer) // cname2(myrank+1) 8959599516SKenneth E. Jansenc 9059599516SKenneth E. Jansenc.... open input files 9159599516SKenneth E. Jansenc.... input the geometry parameters 9259599516SKenneth E. Jansenc 9359599516SKenneth E. Jansen numparts = numpe !This is the common settings. Beware if you try to compute several parts per process 9459599516SKenneth E. Jansen 9559599516SKenneth E. Jansen itwo=2 9659599516SKenneth E. Jansen ione=1 9759599516SKenneth E. Jansen ieleven=11 9859599516SKenneth E. Jansen itmp = int(log10(float(myrank+1)))+1 9959599516SKenneth E. Jansen 100266200f9SCameron Smith iotime = TMRC() 1019f4aafb6SCameron Smith if( input_mode .eq. -1 ) then 102a486e66cSCameron Smith call streamio_setup_read(fhandle, geomRestartStream) 1039f4aafb6SCameron Smith else if( input_mode .eq. 0 ) then 104ab645d52SCameron Smith call posixio_setup(fhandle, c_char_'r') 1059f4aafb6SCameron Smith else if( input_mode .ge. 1 ) then 106ab645d52SCameron Smith call syncio_setup_read(nsynciofiles, fhandle) 1072efdc748SKenneth E. Jansen end if 108a93de25bSCameron Smith call phio_constructName(fhandle, 109d7abaf6cSCameron Smith & c_char_'geombc' // char(0), fname1) 110d7abaf6cSCameron Smith call phio_openfile(fname1, fhandle); 11159599516SKenneth E. Jansen 112d5d2f64dSCameron Smith call phio_readheader(fhandle,c_char_'number of nodes' // char(0), 113e5afe575SCameron Smith & c_loc(numnp),ione, dataInt, iotype) 11459599516SKenneth E. Jansen 115d5d2f64dSCameron Smith call phio_readheader(fhandle,c_char_'number of modes' // char(0), 116e5afe575SCameron Smith & c_loc(nshg),ione, dataInt, iotype) 11759599516SKenneth E. Jansen 118d5d2f64dSCameron Smith call phio_readheader(fhandle, 119e5afe575SCameron Smith & c_char_'number of interior elements' // char(0), 120e5afe575SCameron Smith & c_loc(numel),ione, dataInt, iotype) 12159599516SKenneth E. Jansen 122d5d2f64dSCameron Smith call phio_readheader(fhandle, 123e5afe575SCameron Smith & c_char_'number of boundary elements' // char(0), 124e5afe575SCameron Smith & c_loc(numelb),ione, dataInt, iotype) 12559599516SKenneth E. Jansen 126d5d2f64dSCameron Smith call phio_readheader(fhandle, 127e5afe575SCameron Smith & c_char_'maximum number of element nodes' // char(0), 128e5afe575SCameron Smith & c_loc(nen),ione, dataInt, iotype) 12959599516SKenneth E. Jansen 130d5d2f64dSCameron Smith call phio_readheader(fhandle, 131e5afe575SCameron Smith & c_char_'number of interior tpblocks' // char(0), 132e5afe575SCameron Smith & c_loc(nelblk),ione, dataInt, iotype) 13359599516SKenneth E. Jansen 134d5d2f64dSCameron Smith call phio_readheader(fhandle, 135e5afe575SCameron Smith & c_char_'number of boundary tpblocks' // char(0), 136e5afe575SCameron Smith & c_loc(nelblb),ione, dataInt, iotype) 13759599516SKenneth E. Jansen 138d5d2f64dSCameron Smith call phio_readheader(fhandle, 139e5afe575SCameron Smith & c_char_'number of nodes with Dirichlet BCs' // char(0), 140e5afe575SCameron Smith & c_loc(numpbc),ione, dataInt, iotype) 14159599516SKenneth E. Jansen 142d5d2f64dSCameron Smith call phio_readheader(fhandle, 143e5afe575SCameron Smith & c_char_'number of shape functions' // char(0), 144e5afe575SCameron Smith & c_loc(ntopsh),ione, dataInt, iotype) 14559599516SKenneth E. Jansenc 14659599516SKenneth E. Jansenc.... calculate the maximum number of boundary element nodes 14759599516SKenneth E. Jansenc 14859599516SKenneth E. Jansen nenb = 0 14959599516SKenneth E. Jansen do i = 1, melCat 15059599516SKenneth E. Jansen if (nen .eq. nenCat(i,nsd)) nenb = max(nenCat(i,nsd-1), nenb) 15159599516SKenneth E. Jansen enddo 15259599516SKenneth E. Jansen if (myrank == master) then 15359599516SKenneth E. Jansen if (nenb .eq. 0) call error ('input ','nen ',nen) 15459599516SKenneth E. Jansen endif 15559599516SKenneth E. Jansenc 15659599516SKenneth E. Jansenc.... setup some useful constants 15759599516SKenneth E. Jansenc 15859599516SKenneth E. Jansen I3nsd = nsd / 3 ! nsd=3 integer flag 15959599516SKenneth E. Jansen E3nsd = float(I3nsd) ! nsd=3 real flag 16059599516SKenneth E. Jansen if(matflg(1,1).lt.0) then 16159599516SKenneth E. Jansen nflow = nsd + 1 16259599516SKenneth E. Jansen else 16359599516SKenneth E. Jansen nflow = nsd + 2 16459599516SKenneth E. Jansen endif 16559599516SKenneth E. Jansen ndof = nsd + 2 16659599516SKenneth E. Jansen nsclr=impl(1)/100 16759599516SKenneth E. Jansen ndof=ndof+nsclr ! number of sclr transport equations to solve 16859599516SKenneth E. Jansen 16959599516SKenneth E. Jansen ndofBC = ndof + I3nsd ! dimension of BC array 17059599516SKenneth E. Jansen ndiBCB = 2 ! dimension of iBCB array 17159599516SKenneth E. Jansen ndBCB = ndof + 1 ! dimension of BCB array 17259599516SKenneth E. Jansen nsymdf = (ndof*(ndof + 1)) / 2 ! symm. d.o.f.'s 17359599516SKenneth E. Jansenc 17459599516SKenneth E. Jansenc.... ----------------------> Communication tasks <-------------------- 17559599516SKenneth E. Jansenc 17659599516SKenneth E. Jansen if(numpe > 1) then 177d5d2f64dSCameron Smith call phio_readheader(fhandle, 178e5afe575SCameron Smith & c_char_'size of ilwork array' // char(0), 179e5afe575SCameron Smith & c_loc(nlwork),ione, dataInt, iotype) 18059599516SKenneth E. Jansen 181d5d2f64dSCameron Smith call phio_readheader(fhandle, 182e5afe575SCameron Smith & c_char_'ilwork' //char(0), 183e5afe575SCameron Smith & c_loc(nlwork),ione, dataInt, iotype) 18459599516SKenneth E. Jansen 18559599516SKenneth E. Jansen allocate( point2ilwork(nlwork) ) 18659599516SKenneth E. Jansen allocate( ilworkread(nlwork) ) 187d5d2f64dSCameron Smith call phio_readdatablock(fhandle, c_char_'ilwork' // char(0), 188bc62cfd4SCameron Smith & c_loc(ilworkread), nlwork, dataInt , iotype) 18959599516SKenneth E. Jansen 19059599516SKenneth E. Jansen point2ilwork = ilworkread 19159599516SKenneth E. Jansen call ctypes (point2ilwork) 192513954efSKenneth E. Jansen 193ec121c45SKenneth E. Jansen if((usingPETSc.eq.1).or.(svLSFlag.eq.1)) then 194513954efSKenneth E. Jansen fncorpsize = nshg 195513954efSKenneth E. Jansen allocate(fncorp(fncorpsize)) 196513954efSKenneth E. Jansen call gen_ncorp(fncorp, ilworkread, nlwork, fncorpsize) 197513954efSKenneth E. Jansen! 198513954efSKenneth E. Jansen! the following code finds the global range of the owned nodes 199513954efSKenneth E. Jansen! 200513954efSKenneth E. Jansen maxowned=0 201513954efSKenneth E. Jansen minowned=maxval(fncorp) 202513954efSKenneth E. Jansen do i = 1,nshg 203513954efSKenneth E. Jansen if(fncorp(i).gt.0) then ! don't consider remote copies 204513954efSKenneth E. Jansen maxowned=max(maxowned,fncorp(i)) 205513954efSKenneth E. Jansen minowned=min(minowned,fncorp(i)) 206513954efSKenneth E. Jansen endif 207513954efSKenneth E. Jansen enddo 208513954efSKenneth E. Jansen! 209513954efSKenneth E. Jansen! end of global range code 210513954efSKenneth E. Jansen! 211513954efSKenneth E. Jansen call commuInt(fncorp, point2ilwork, 1, 'out') 212513954efSKenneth E. Jansen ncorpsize = fncorpsize 213513954efSKenneth E. Jansen endif 214ec121c45SKenneth E. Jansen if(svLSFlag.eq.1) then 215ec121c45SKenneth E. Jansen allocate(ltg(ncorpsize)) 216ec121c45SKenneth E. Jansen ltg(:)=fncorp(:) 217ec121c45SKenneth E. Jansen endif 218f538fcd7SKenneth E. Jansen else !serial 219c90fc7c7SKenneth E. Jansen if((usingPETSc.eq.1)) then 220c90fc7c7SKenneth E. Jansen fncorpsize = nshg 221c90fc7c7SKenneth E. Jansen allocate(fncorp(fncorpsize)) 222c90fc7c7SKenneth E. Jansen maxowned=nshg 223c90fc7c7SKenneth E. Jansen minowned=1 224c90fc7c7SKenneth E. Jansen iownnodes=nshg 225c90fc7c7SKenneth E. Jansen do i =1,nshg 226c90fc7c7SKenneth E. Jansen fncorp(i)=i 227c90fc7c7SKenneth E. Jansen enddo 228c90fc7c7SKenneth E. Jansen endif 229c90fc7c7SKenneth E. Jansen if((svLSFlag.eq.1)) then 230ec121c45SKenneth E. Jansen allocate(ltg(nshg)) 231ec121c45SKenneth E. Jansen do i =1,nshg 232ec121c45SKenneth E. Jansen ltg(i)=i 233ec121c45SKenneth E. Jansen enddo 234c90fc7c7SKenneth E. Jansen endif 23559599516SKenneth E. Jansen nlwork=1 23659599516SKenneth E. Jansen allocate( point2ilwork(1)) 23759599516SKenneth E. Jansen nshg0 = nshg 23859599516SKenneth E. Jansen endif 23959599516SKenneth E. Jansen 240ec121c45SKenneth E. Jansen 24159599516SKenneth E. Jansen itwo=2 24259599516SKenneth E. Jansen 243d5d2f64dSCameron Smith call phio_readheader(fhandle, 244e5afe575SCameron Smith & c_char_'co-ordinates' // char(0), 245e5afe575SCameron Smith & c_loc(intfromfile),itwo, dataDbl, iotype) 24659599516SKenneth E. Jansen numnp=intfromfile(1) 24759599516SKenneth E. Jansen allocate( point2x(numnp,nsd) ) 24859599516SKenneth E. Jansen allocate( xread(numnp,nsd) ) 24959599516SKenneth E. Jansen ixsiz=numnp*nsd 250d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 251bc62cfd4SCameron Smith & c_char_'co-ordinates' // char(0), 252bc62cfd4SCameron Smith & c_loc(xread),ixsiz, dataDbl, iotype) 25359599516SKenneth E. Jansen point2x = xread 254513954efSKenneth E. Jansen 255513954efSKenneth E. Jansenc..............................for Duct 256513954efSKenneth E. Jansen if(istretchOutlet.eq.1)then 257513954efSKenneth E. Jansen 258513954efSKenneth E. Jansenc...geometry6 259513954efSKenneth E. Jansen if(iDuctgeometryType .eq. 6) then 260513954efSKenneth E. Jansen xmaxn = 1.276 261513954efSKenneth E. Jansen xmaxo = 0.848 262513954efSKenneth E. Jansen xmin = 0.42 263513954efSKenneth E. Jansenc...geometry8 264513954efSKenneth E. Jansen elseif(iDuctgeometryType .eq. 8)then 265513954efSKenneth E. Jansen xmaxn=1.6*4.5*0.0254+0.85*1.5 266513954efSKenneth E. Jansen xmaxo=1.6*4.5*0.0254+0.85*1.0 267513954efSKenneth E. Jansen xmin =1.6*4.5*0.0254+0.85*0.5 268513954efSKenneth E. Jansen endif 269513954efSKenneth E. Jansenc... 270513954efSKenneth E. Jansen alpha=(xmaxn-xmaxo)/(xmaxo-xmin)**2 271513954efSKenneth E. Jansen where (point2x(:,1) .ge. xmin) 272513954efSKenneth E. Jansenc..... N=# of current elements from .42 to exit(~40) 273513954efSKenneth E. Jansenc..... (x_mx-x_mn)/N=.025 274513954efSKenneth E. Jansenc..... alpha=3 3*.025=.075 275513954efSKenneth E. Jansen point2x(:,1)=point2x(:,1)+ 276513954efSKenneth E. Jansen & alpha*(point2x(:,1)-xmin)**2 277513954efSKenneth E. Jansenc..... ftn to stretch x at exit 278513954efSKenneth E. Jansen endwhere 279513954efSKenneth E. Jansen endif 280513954efSKenneth E. Jansen 28159599516SKenneth E. Jansenc 28259599516SKenneth E. Jansenc.... read in and block out the connectivity 28359599516SKenneth E. Jansenc 2840f541e5dSKenneth E. Jansen if( input_mode .eq. -1 ) then 28559599516SKenneth E. Jansen call genblk (IBKSIZ) 2860f541e5dSKenneth E. Jansen else if( input_mode .eq. 0 ) then 2870f541e5dSKenneth E. Jansen call genblkPosix (IBKSIZ) 2880f541e5dSKenneth E. Jansen else if( input_mode .ge. 1 ) then 289ab5b07a4SKenneth E. Jansen call genblkSyncIO (IBKSIZ) 2900f541e5dSKenneth E. Jansen end if 29159599516SKenneth E. Jansenc 29259599516SKenneth E. Jansenc.... read the boundary condition mapping array 29359599516SKenneth E. Jansenc 29459599516SKenneth E. Jansen ione=1 295d5d2f64dSCameron Smith call phio_readheader(fhandle, 296e5afe575SCameron Smith & c_char_'bc mapping array' // char(0), 297e5afe575SCameron Smith & c_loc(nshg),ione, dataInt, iotype) 29859599516SKenneth E. Jansen 29959599516SKenneth E. Jansen allocate( nBC(nshg) ) 30059599516SKenneth E. Jansen 30159599516SKenneth E. Jansen allocate( nBCread(nshg) ) 30259599516SKenneth E. Jansen 303d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 304bc62cfd4SCameron Smith & c_char_'bc mapping array' // char(0), 305bc62cfd4SCameron Smith & c_loc(nBCread), nshg, dataInt, iotype) 30659599516SKenneth E. Jansen 30759599516SKenneth E. Jansen nBC=nBCread 30859599516SKenneth E. Jansenc 30959599516SKenneth E. Jansenc.... read the temporary iBC array 31059599516SKenneth E. Jansenc 31159599516SKenneth E. Jansen ione=1 312d5d2f64dSCameron Smith call phio_readheader(fhandle, 313e5afe575SCameron Smith & c_char_'bc codes array' // char(0), 314e5afe575SCameron Smith & c_loc(numpbc),ione, dataInt, iotype) 31559599516SKenneth E. Jansen 31659599516SKenneth E. Jansen if ( numpbc > 0 ) then 31759599516SKenneth E. Jansen allocate( iBCtmp(numpbc) ) 31859599516SKenneth E. Jansen allocate( iBCtmpread(numpbc) ) 31959599516SKenneth E. Jansen else 32059599516SKenneth E. Jansen allocate( iBCtmp(1) ) 32159599516SKenneth E. Jansen allocate( iBCtmpread(1) ) 32259599516SKenneth E. Jansen endif 323d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 324bc62cfd4SCameron Smith & c_char_'bc codes array' // char(0), 325bc62cfd4SCameron Smith & c_loc(iBCtmpread), numpbc, dataInt, iotype) 32659599516SKenneth E. Jansen 32759599516SKenneth E. Jansen if ( numpbc > 0 ) then 32859599516SKenneth E. Jansen iBCtmp=iBCtmpread 32959599516SKenneth E. Jansen else ! sometimes a partition has no BC's 33059599516SKenneth E. Jansen deallocate( iBCtmpread) 33159599516SKenneth E. Jansen iBCtmp=0 33259599516SKenneth E. Jansen endif 33359599516SKenneth E. Jansenc 33459599516SKenneth E. Jansenc.... read boundary condition data 33559599516SKenneth E. Jansenc 33659599516SKenneth E. Jansen ione=1 337d5d2f64dSCameron Smith call phio_readheader(fhandle, 338e5afe575SCameron Smith & c_char_'boundary condition array' // char(0), 339e5afe575SCameron Smith & c_loc(intfromfile),ione, dataDbl, iotype) 34059599516SKenneth E. Jansen 34159599516SKenneth E. Jansen if ( numpbc > 0 ) then 34259599516SKenneth E. Jansen allocate( BCinp(numpbc,ndof+7) ) 34359599516SKenneth E. Jansen nsecondrank=intfromfile(1)/numpbc 34459599516SKenneth E. Jansen allocate( BCinpread(numpbc,nsecondrank) ) 34559599516SKenneth E. Jansen iBCinpsiz=intfromfile(1) 34659599516SKenneth E. Jansen else 34759599516SKenneth E. Jansen allocate( BCinp(1,ndof+7) ) 34859599516SKenneth E. Jansen allocate( BCinpread(0,0) ) !dummy 34959599516SKenneth E. Jansen iBCinpsiz=intfromfile(1) 35059599516SKenneth E. Jansen endif 35159599516SKenneth E. Jansen 352d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 353bc62cfd4SCameron Smith & c_char_'boundary condition array' // char(0), 354bc62cfd4SCameron Smith & c_loc(BCinpread), iBCinpsiz, dataDbl, iotype) 35559599516SKenneth E. Jansen 35659599516SKenneth E. Jansen if ( numpbc > 0 ) then 35759599516SKenneth E. Jansen BCinp(:,1:(ndof+7))=BCinpread(:,1:(ndof+7)) 35859599516SKenneth E. Jansen else ! sometimes a partition has no BC's 35959599516SKenneth E. Jansen deallocate(BCinpread) 36059599516SKenneth E. Jansen BCinp=0 36159599516SKenneth E. Jansen endif 36259599516SKenneth E. Jansenc 36359599516SKenneth E. Jansenc.... read periodic boundary conditions 36459599516SKenneth E. Jansenc 36559599516SKenneth E. Jansen ione=1 366d5d2f64dSCameron Smith call phio_readheader(fhandle, 367e5afe575SCameron Smith & c_char_'periodic masters array' // char(0), 368e5afe575SCameron Smith & c_loc(nshg), ione, dataInt, iotype) 36959599516SKenneth E. Jansen allocate( point2iper(nshg) ) 37059599516SKenneth E. Jansen allocate( iperread(nshg) ) 371d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 372bc62cfd4SCameron Smith & c_char_'periodic masters array' // char(0), 373bc62cfd4SCameron Smith & c_loc(iperread), nshg, dataInt, iotype) 37459599516SKenneth E. Jansen point2iper=iperread 37559599516SKenneth E. Jansenc 37659599516SKenneth E. Jansenc.... generate the boundary element blocks 37759599516SKenneth E. Jansenc 3780f541e5dSKenneth E. Jansen if( input_mode .eq. -1 ) then 3790f541e5dSKenneth E. Jansen call genbkb (IBKSIZ) 3800f541e5dSKenneth E. Jansen else if( input_mode .eq. 0 ) then 3810f541e5dSKenneth E. Jansen call genbkbPosix (IBKSIZ) 3820f541e5dSKenneth E. Jansen else if( input_mode .ge. 1 ) then 383ab5b07a4SKenneth E. Jansen call genbkbSyncIO (IBKSIZ) 3840f541e5dSKenneth E. Jansen end if 38559599516SKenneth E. Jansenc 38659599516SKenneth E. Jansenc Read in the nsons and ifath arrays if needed 38759599516SKenneth E. Jansenc 38859599516SKenneth E. Jansenc There is a fundamental shift in the meaning of ifath based on whether 38959599516SKenneth E. Jansenc there exist homogenous directions in the flow. 39059599516SKenneth E. Jansenc 39159599516SKenneth E. Jansenc HOMOGENOUS DIRECTIONS EXIST: Here nfath is the number of inhomogenous 39259599516SKenneth E. Jansenc points in the TOTAL mesh. That is to say that each partition keeps a 39359599516SKenneth E. Jansenc link to ALL inhomogenous points. This link is furthermore not to the 39459599516SKenneth E. Jansenc sms numbering but to the original structured grid numbering. These 39559599516SKenneth E. Jansenc inhomogenous points are thought of as fathers, with their sons being all 39659599516SKenneth E. Jansenc the points in the homogenous directions that have this father's 39759599516SKenneth E. Jansenc inhomogeneity. The array ifath takes as an arguement the sms numbering 39859599516SKenneth E. Jansenc and returns as a result the father. 39959599516SKenneth E. Jansenc 40059599516SKenneth E. Jansenc In this case nsons is the number of sons that each father has and ifath 40159599516SKenneth E. Jansenc is an array which tells the 40259599516SKenneth E. Jansenc 40359599516SKenneth E. Jansenc NO HOMOGENOUS DIRECTIONS. In this case the mesh would grow to rapidly 40459599516SKenneth E. Jansenc if we followed the above strategy since every partition would index its 40559599516SKenneth E. Jansenc points to the ENTIRE mesh. Furthermore, there would never be a need 40659599516SKenneth E. Jansenc to average to a node off processor since there is no spatial averaging. 40759599516SKenneth E. Jansenc Therefore, to properly account for this case we must recognize it and 40859599516SKenneth E. Jansenc inerrupt certain actions (i.e. assembly of the average across partitions). 40959599516SKenneth E. Jansenc This case is easily identified by noting that maxval(nsons) =1 (i.e. no 41059599516SKenneth E. Jansenc father has any sons). Reiterating to be clear, in this case ifath does 41159599516SKenneth E. Jansenc not point to a global numbering but instead just points to itself. 41259599516SKenneth E. Jansenc 41359599516SKenneth E. Jansen nfath=1 ! some architectures choke on a zero or undeclared 41459599516SKenneth E. Jansen ! dimension variable. This sets it to a safe, small value. 41559599516SKenneth E. Jansen if(((iLES .lt. 20) .and. (iLES.gt.0)) 41659599516SKenneth E. Jansen & .or. (itwmod.gt.0) ) then ! don't forget same 41759599516SKenneth E. Jansen ! conditional in proces.f 41859599516SKenneth E. Jansen ! needed for alloc 41959599516SKenneth E. Jansen ione=1 42059599516SKenneth E. Jansen if(nohomog.gt.0) then 421d5d2f64dSCameron Smith call phio_readheader(fhandle, 422e5afe575SCameron Smith & c_char_'number of father-nodes' // char(0), 423e5afe575SCameron Smith & c_loc(nfath), ione, dataInt, iotype) 42459599516SKenneth E. Jansen 425d5d2f64dSCameron Smith call phio_readheader(fhandle, 426e5afe575SCameron Smith & c_char_'number of son-nodes for each father' // char(0), 427e5afe575SCameron Smith & c_loc(nfath), ione, dataInt, iotype) 42859599516SKenneth E. Jansen 42959599516SKenneth E. Jansen allocate (point2nsons(nfath)) 43059599516SKenneth E. Jansen 431d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 432bc62cfd4SCameron Smith & c_char_'number of son-nodes for each father' // char(0), 433bc62cfd4SCameron Smith & c_loc(point2nsons),nfath, dataInt, iotype) 43459599516SKenneth E. Jansen 435d5d2f64dSCameron Smith call phio_readheader(fhandle, 436e5afe575SCameron Smith & c_char_'keyword ifath' // char(0), 437e5afe575SCameron Smith & c_loc(nshg), ione, dataInt, iotype); 43859599516SKenneth E. Jansen 43959599516SKenneth E. Jansen allocate (point2ifath(nshg)) 44059599516SKenneth E. Jansen 441d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 442bc62cfd4SCameron Smith & c_char_'keyword ifath' // char(0), 443bc62cfd4SCameron Smith & c_loc(point2ifath), nshg, dataInt, iotype) 44459599516SKenneth E. Jansen 44559599516SKenneth E. Jansen nsonmax=maxval(point2nsons) 44659599516SKenneth E. Jansen else ! this is the case where there is no homogeneity 44759599516SKenneth E. Jansen ! therefore ever node is a father (too itself). sonfath 44859599516SKenneth E. Jansen ! (a routine in NSpre) will set this up but this gives 44959599516SKenneth E. Jansen ! you an option to avoid that. 45059599516SKenneth E. Jansen nfath=nshg 45159599516SKenneth E. Jansen allocate (point2nsons(nfath)) 45259599516SKenneth E. Jansen point2nsons=1 45359599516SKenneth E. Jansen allocate (point2ifath(nshg)) 45459599516SKenneth E. Jansen do i=1,nshg 45559599516SKenneth E. Jansen point2ifath(i)=i 45659599516SKenneth E. Jansen enddo 45759599516SKenneth E. Jansen nsonmax=1 45859599516SKenneth E. Jansen endif 45959599516SKenneth E. Jansen else 46059599516SKenneth E. Jansen allocate (point2nsons(1)) 46159599516SKenneth E. Jansen allocate (point2ifath(1)) 46259599516SKenneth E. Jansen endif 46359599516SKenneth E. Jansen 464d7abaf6cSCameron Smith call phio_closefile(fhandle); 465266200f9SCameron Smith iotime = TMRC() - iotime 466266200f9SCameron Smith if (myrank.eq.master) then 467266200f9SCameron Smith write(*,*) 'time to read geombc (seconds)', iotime 468266200f9SCameron Smith endif 469266200f9SCameron Smith 47059599516SKenneth E. Jansenc.... Read restart files 471266200f9SCameron Smith iotime = TMRC() 4729f4aafb6SCameron Smith if( input_mode .eq. -1 ) then 473a486e66cSCameron Smith call streamio_setup_read(fhandle, geomRestartStream) 4749f4aafb6SCameron Smith else if( input_mode .eq. 0 ) then 475d7abaf6cSCameron Smith call posixio_setup(fhandle, c_char_'r') 4769f4aafb6SCameron Smith else if( input_mode .ge. 1 ) then 477d7abaf6cSCameron Smith call syncio_setup_read(nsynciofiles, fhandle) 478d7abaf6cSCameron Smith end if 479a93de25bSCameron Smith call phio_constructName(fhandle, 480d7abaf6cSCameron Smith & c_char_'restart' // char(0), fnamer) 4819071d3baSCameron Smith call phstr_appendInt(fnamer, irstart) 4829071d3baSCameron Smith call phstr_appendStr(fnamer, c_char_'.'//c_null_char) 483d7abaf6cSCameron Smith call phio_openfile(fnamer, fhandle); 48459599516SKenneth E. Jansen 48559599516SKenneth E. Jansen ithree=3 48659599516SKenneth E. Jansen 48759599516SKenneth E. Jansen itmp = int(log10(float(myrank+1)))+1 48859599516SKenneth E. Jansen 48959599516SKenneth E. Jansen intfromfile=0 490d5d2f64dSCameron Smith call phio_readheader(fhandle, 491e5afe575SCameron Smith & c_char_'solution' // char(0), 492e5afe575SCameron Smith & c_loc(intfromfile), ithree, dataInt, iotype) 49359599516SKenneth E. Jansenc 49459599516SKenneth E. Jansenc.... read the values of primitive variables into q 49559599516SKenneth E. Jansenc 49659599516SKenneth E. Jansen allocate( qold(nshg,ndof) ) 49759599516SKenneth E. Jansen if(intfromfile(1).ne.0) then 49859599516SKenneth E. Jansen nshg2=intfromfile(1) 49959599516SKenneth E. Jansen ndof2=intfromfile(2) 50059599516SKenneth E. Jansen lstep=intfromfile(3) 50159599516SKenneth E. Jansen if(ndof2.ne.ndof) then 50259599516SKenneth E. Jansen 50359599516SKenneth E. Jansen endif 50459599516SKenneth E. Jansen if (nshg2 .ne. nshg) 50559599516SKenneth E. Jansen & call error ('restar ', 'nshg ', nshg) 50659599516SKenneth E. Jansen allocate( qread(nshg,ndof2) ) 50759599516SKenneth E. Jansen iqsiz=nshg*ndof2 508d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 509bc62cfd4SCameron Smith & c_char_'solution' // char(0), 510bc62cfd4SCameron Smith & c_loc(qread),iqsiz, dataDbl,iotype) 51159599516SKenneth E. Jansen qold(:,1:ndof)=qread(:,1:ndof) 51259599516SKenneth E. Jansen deallocate(qread) 51359599516SKenneth E. Jansen else 51459599516SKenneth E. Jansen if (myrank.eq.master) then 51559599516SKenneth E. Jansen if (matflg(1,1).eq.0) then ! compressible 51659599516SKenneth E. Jansen warning='Solution is set to zero (with p and T to one)' 51759599516SKenneth E. Jansen else 51859599516SKenneth E. Jansen warning='Solution is set to zero' 51959599516SKenneth E. Jansen endif 52059599516SKenneth E. Jansen write(*,*) warning 52159599516SKenneth E. Jansen endif 52259599516SKenneth E. Jansen qold=zero 52359599516SKenneth E. Jansen if (matflg(1,1).eq.0) then ! compressible 52459599516SKenneth E. Jansen qold(:,1)=one ! avoid zero pressure 52559599516SKenneth E. Jansen qold(:,nflow)=one ! avoid zero temperature 52659599516SKenneth E. Jansen endif 52759599516SKenneth E. Jansen endif 52859599516SKenneth E. Jansen 52959599516SKenneth E. Jansen intfromfile=0 530d5d2f64dSCameron Smith call phio_readheader(fhandle, 531e5afe575SCameron Smith & c_char_'time derivative of solution' // char(0), 532e5afe575SCameron Smith & c_loc(intfromfile), ithree, dataInt, iotype) 53359599516SKenneth E. Jansen allocate( acold(nshg,ndof) ) 53459599516SKenneth E. Jansen if(intfromfile(1).ne.0) then 53559599516SKenneth E. Jansen nshg2=intfromfile(1) 53659599516SKenneth E. Jansen ndof2=intfromfile(2) 53759599516SKenneth E. Jansen lstep=intfromfile(3) 53859599516SKenneth E. Jansen 53959599516SKenneth E. Jansen if (nshg2 .ne. nshg) 54059599516SKenneth E. Jansen & call error ('restar ', 'nshg ', nshg) 54159599516SKenneth E. Jansen allocate( acread(nshg,ndof2) ) 54259599516SKenneth E. Jansen acread=zero 54359599516SKenneth E. Jansen iacsiz=nshg*ndof2 544d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 545bc62cfd4SCameron Smith & c_char_'time derivative of solution' // char(0), 546bc62cfd4SCameron Smith & c_loc(acread), iacsiz, dataDbl,iotype) 54759599516SKenneth E. Jansen acold(:,1:ndof)=acread(:,1:ndof) 54859599516SKenneth E. Jansen deallocate(acread) 54959599516SKenneth E. Jansen else 55059599516SKenneth E. Jansen if (myrank.eq.master) then 55159599516SKenneth E. Jansen warning='Time derivative of solution is set to zero (SAFE)' 55259599516SKenneth E. Jansen write(*,*) warning 55359599516SKenneth E. Jansen endif 55459599516SKenneth E. Jansen acold=zero 55559599516SKenneth E. Jansen endif 55659599516SKenneth E. Jansencc 55759599516SKenneth E. Jansencc.... read the header and check it against the run data 55859599516SKenneth E. Jansencc 55959599516SKenneth E. Jansen if (ideformwall.eq.1) then 56059599516SKenneth E. Jansen 56159599516SKenneth E. Jansen intfromfile=0 562d5d2f64dSCameron Smith call phio_readheader(fhandle, 563e5afe575SCameron Smith & c_char_'displacement' // char(0), 564e5afe575SCameron Smith & c_loc(intfromfile), ithree, dataInt, iotype) 56559599516SKenneth E. Jansen 56659599516SKenneth E. Jansen nshg2=intfromfile(1) 56759599516SKenneth E. Jansen ndisp=intfromfile(2) 56859599516SKenneth E. Jansen lstep=intfromfile(3) 56959599516SKenneth E. Jansen if(ndisp.ne.nsd) then 57059599516SKenneth E. Jansen warning='WARNING ndisp not equal nsd' 57159599516SKenneth E. Jansen write(*,*) warning , ndisp 57259599516SKenneth E. Jansen endif 57359599516SKenneth E. Jansen if (nshg2 .ne. nshg) 57459599516SKenneth E. Jansen & call error ('restar ', 'nshg ', nshg) 57559599516SKenneth E. Jansenc 57659599516SKenneth E. Jansenc.... read the values of primitive variables into uold 57759599516SKenneth E. Jansenc 57859599516SKenneth E. Jansen allocate( uold(nshg,nsd) ) 57959599516SKenneth E. Jansen allocate( uread(nshg,nsd) ) 58059599516SKenneth E. Jansen 58159599516SKenneth E. Jansen iusiz=nshg*nsd 58259599516SKenneth E. Jansen 583d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 584bc62cfd4SCameron Smith & c_char_'displacement' // char(0), 585bc62cfd4SCameron Smith & c_loc(uread), iusiz, dataDbl, iotype) 58659599516SKenneth E. Jansen 58759599516SKenneth E. Jansen uold(:,1:nsd)=uread(:,1:nsd) 58859599516SKenneth E. Jansen else 58959599516SKenneth E. Jansen allocate( uold(nshg,nsd) ) 59059599516SKenneth E. Jansen uold(:,1:nsd) = zero 59159599516SKenneth E. Jansen endif 59259599516SKenneth E. Jansenc 59359599516SKenneth E. Jansenc.... close c-binary files 59459599516SKenneth E. Jansenc 595d7abaf6cSCameron Smith call phio_closefile(fhandle) 596266200f9SCameron Smith iotime = TMRC() - iotime 597266200f9SCameron Smith if (myrank.eq.master) then 598266200f9SCameron Smith write(*,*) 'time to read restart (seconds)', iotime 599266200f9SCameron Smith endif 60059599516SKenneth E. Jansen 60159599516SKenneth E. Jansen deallocate(xread) 60259599516SKenneth E. Jansen if ( numpbc > 0 ) then 60359599516SKenneth E. Jansen deallocate(bcinpread) 60459599516SKenneth E. Jansen deallocate(ibctmpread) 60559599516SKenneth E. Jansen endif 60659599516SKenneth E. Jansen deallocate(iperread) 60759599516SKenneth E. Jansen if(numpe.gt.1) 60859599516SKenneth E. Jansen & deallocate(ilworkread) 60959599516SKenneth E. Jansen deallocate(nbcread) 61059599516SKenneth E. Jansen 61159599516SKenneth E. Jansen return 61259599516SKenneth E. Jansen 994 call error ('input ','opening ', igeomBAK) 61359599516SKenneth E. Jansen 995 call error ('input ','opening ', igeomBAK) 61459599516SKenneth E. Jansen 997 call error ('input ','end file', igeomBAK) 61559599516SKenneth E. Jansen 998 call error ('input ','end file', igeomBAK) 61659599516SKenneth E. Jansen end 61759599516SKenneth E. Jansenc 61859599516SKenneth E. Jansenc No longer called but kept around in case.... 61959599516SKenneth E. Jansenc 62059599516SKenneth E. Jansen subroutine genpzero(iBC) 62159599516SKenneth E. Jansen 62259599516SKenneth E. Jansen use pointer_data 62359599516SKenneth E. Jansen include "common.h" 62459599516SKenneth E. Jansen integer iBC(nshg) 62559599516SKenneth E. Jansenc 62659599516SKenneth E. Jansenc.... check to see if any of the nodes have a dirichlet pressure 62759599516SKenneth E. Jansenc 62859599516SKenneth E. Jansen pzero=1 62959599516SKenneth E. Jansen if (any(btest(iBC,2))) pzero=0 63059599516SKenneth E. Jansen do iblk = 1, nelblb 63159599516SKenneth E. Jansen npro = lcblkb(1,iblk+1)-lcblkb(1,iblk) 63259599516SKenneth E. Jansen do i=1, npro 63359599516SKenneth E. Jansen iBCB1=miBCB(iblk)%p(i,1) 63459599516SKenneth E. Jansenc 63559599516SKenneth E. Jansenc.... check to see if any of the nodes have a Neumann pressure 63659599516SKenneth E. Jansenc but not periodic (note that 63759599516SKenneth E. Jansenc 63859599516SKenneth E. Jansen if(btest(iBCB1,1)) pzero=0 63959599516SKenneth E. Jansen enddo 64059599516SKenneth E. Jansenc 64159599516SKenneth E. Jansenc.... share results with other processors 64259599516SKenneth E. Jansenc 64359599516SKenneth E. Jansen pzl=pzero 64459599516SKenneth E. Jansen if (numpe .gt. 1) 64559599516SKenneth E. Jansen & call MPI_ALLREDUCE (pzl, pzero, 1, 64659599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_MIN, MPI_COMM_WORLD,ierr) 64759599516SKenneth E. Jansen enddo 64859599516SKenneth E. Jansen return 64959599516SKenneth E. Jansen end 650