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(:) 21*17860365SKenneth E. Jansen! integer, allocatable :: fncorp(:) 22*17860365SKenneth 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 33*17860365SKenneth 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 187513954efSKenneth E. Jansen if(usingPETSc.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 20859599516SKenneth E. Jansen else 20959599516SKenneth E. Jansen nlwork=1 21059599516SKenneth E. Jansen allocate( point2ilwork(1)) 21159599516SKenneth E. Jansen nshg0 = nshg 21259599516SKenneth E. Jansen endif 21359599516SKenneth E. Jansen 21459599516SKenneth E. Jansen itwo=2 21559599516SKenneth E. Jansen 216d5d2f64dSCameron Smith call phio_readheader(fhandle, 217e5afe575SCameron Smith & c_char_'co-ordinates' // char(0), 218e5afe575SCameron Smith & c_loc(intfromfile),itwo, dataDbl, iotype) 21959599516SKenneth E. Jansen numnp=intfromfile(1) 22059599516SKenneth E. Jansen allocate( point2x(numnp,nsd) ) 22159599516SKenneth E. Jansen allocate( xread(numnp,nsd) ) 22259599516SKenneth E. Jansen ixsiz=numnp*nsd 223d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 224bc62cfd4SCameron Smith & c_char_'co-ordinates' // char(0), 225bc62cfd4SCameron Smith & c_loc(xread),ixsiz, dataDbl, iotype) 22659599516SKenneth E. Jansen point2x = xread 227513954efSKenneth E. Jansen 228513954efSKenneth E. Jansenc..............................for Duct 229513954efSKenneth E. Jansen if(istretchOutlet.eq.1)then 230513954efSKenneth E. Jansen 231513954efSKenneth E. Jansenc...geometry6 232513954efSKenneth E. Jansen if(iDuctgeometryType .eq. 6) then 233513954efSKenneth E. Jansen xmaxn = 1.276 234513954efSKenneth E. Jansen xmaxo = 0.848 235513954efSKenneth E. Jansen xmin = 0.42 236513954efSKenneth E. Jansenc...geometry8 237513954efSKenneth E. Jansen elseif(iDuctgeometryType .eq. 8)then 238513954efSKenneth E. Jansen xmaxn=1.6*4.5*0.0254+0.85*1.5 239513954efSKenneth E. Jansen xmaxo=1.6*4.5*0.0254+0.85*1.0 240513954efSKenneth E. Jansen xmin =1.6*4.5*0.0254+0.85*0.5 241513954efSKenneth E. Jansen endif 242513954efSKenneth E. Jansenc... 243513954efSKenneth E. Jansen alpha=(xmaxn-xmaxo)/(xmaxo-xmin)**2 244513954efSKenneth E. Jansen where (point2x(:,1) .ge. xmin) 245513954efSKenneth E. Jansenc..... N=# of current elements from .42 to exit(~40) 246513954efSKenneth E. Jansenc..... (x_mx-x_mn)/N=.025 247513954efSKenneth E. Jansenc..... alpha=3 3*.025=.075 248513954efSKenneth E. Jansen point2x(:,1)=point2x(:,1)+ 249513954efSKenneth E. Jansen & alpha*(point2x(:,1)-xmin)**2 250513954efSKenneth E. Jansenc..... ftn to stretch x at exit 251513954efSKenneth E. Jansen endwhere 252513954efSKenneth E. Jansen endif 253513954efSKenneth E. Jansen 25459599516SKenneth E. Jansenc 25559599516SKenneth E. Jansenc.... read in and block out the connectivity 25659599516SKenneth E. Jansenc 25759599516SKenneth E. Jansen call genblk (IBKSIZ) 25859599516SKenneth E. Jansenc 25959599516SKenneth E. Jansenc.... read the boundary condition mapping array 26059599516SKenneth E. Jansenc 26159599516SKenneth E. Jansen ione=1 262d5d2f64dSCameron Smith call phio_readheader(fhandle, 263e5afe575SCameron Smith & c_char_'bc mapping array' // char(0), 264e5afe575SCameron Smith & c_loc(nshg),ione, dataInt, iotype) 26559599516SKenneth E. Jansen 26659599516SKenneth E. Jansen allocate( nBC(nshg) ) 26759599516SKenneth E. Jansen 26859599516SKenneth E. Jansen allocate( nBCread(nshg) ) 26959599516SKenneth E. Jansen 270d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 271bc62cfd4SCameron Smith & c_char_'bc mapping array' // char(0), 272bc62cfd4SCameron Smith & c_loc(nBCread), nshg, dataInt, iotype) 27359599516SKenneth E. Jansen 27459599516SKenneth E. Jansen nBC=nBCread 27559599516SKenneth E. Jansenc 27659599516SKenneth E. Jansenc.... read the temporary iBC array 27759599516SKenneth E. Jansenc 27859599516SKenneth E. Jansen ione=1 279d5d2f64dSCameron Smith call phio_readheader(fhandle, 280e5afe575SCameron Smith & c_char_'bc codes array' // char(0), 281e5afe575SCameron Smith & c_loc(numpbc),ione, dataInt, iotype) 28259599516SKenneth E. Jansen 28359599516SKenneth E. Jansen if ( numpbc > 0 ) then 28459599516SKenneth E. Jansen allocate( iBCtmp(numpbc) ) 28559599516SKenneth E. Jansen allocate( iBCtmpread(numpbc) ) 28659599516SKenneth E. Jansen else 28759599516SKenneth E. Jansen allocate( iBCtmp(1) ) 28859599516SKenneth E. Jansen allocate( iBCtmpread(1) ) 28959599516SKenneth E. Jansen endif 290d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 291bc62cfd4SCameron Smith & c_char_'bc codes array' // char(0), 292bc62cfd4SCameron Smith & c_loc(iBCtmpread), numpbc, dataInt, iotype) 29359599516SKenneth E. Jansen 29459599516SKenneth E. Jansen if ( numpbc > 0 ) then 29559599516SKenneth E. Jansen iBCtmp=iBCtmpread 29659599516SKenneth E. Jansen else ! sometimes a partition has no BC's 29759599516SKenneth E. Jansen deallocate( iBCtmpread) 29859599516SKenneth E. Jansen iBCtmp=0 29959599516SKenneth E. Jansen endif 30059599516SKenneth E. Jansenc 30159599516SKenneth E. Jansenc.... read boundary condition data 30259599516SKenneth E. Jansenc 30359599516SKenneth E. Jansen ione=1 304d5d2f64dSCameron Smith call phio_readheader(fhandle, 305e5afe575SCameron Smith & c_char_'boundary condition array' // char(0), 306e5afe575SCameron Smith & c_loc(intfromfile),ione, dataDbl, iotype) 30759599516SKenneth E. Jansen 30859599516SKenneth E. Jansen if ( numpbc > 0 ) then 30959599516SKenneth E. Jansen allocate( BCinp(numpbc,ndof+7) ) 31059599516SKenneth E. Jansen nsecondrank=intfromfile(1)/numpbc 31159599516SKenneth E. Jansen allocate( BCinpread(numpbc,nsecondrank) ) 31259599516SKenneth E. Jansen iBCinpsiz=intfromfile(1) 31359599516SKenneth E. Jansen else 31459599516SKenneth E. Jansen allocate( BCinp(1,ndof+7) ) 31559599516SKenneth E. Jansen allocate( BCinpread(0,0) ) !dummy 31659599516SKenneth E. Jansen iBCinpsiz=intfromfile(1) 31759599516SKenneth E. Jansen endif 31859599516SKenneth E. Jansen 319d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 320bc62cfd4SCameron Smith & c_char_'boundary condition array' // char(0), 321bc62cfd4SCameron Smith & c_loc(BCinpread), iBCinpsiz, dataDbl, iotype) 32259599516SKenneth E. Jansen 32359599516SKenneth E. Jansen if ( numpbc > 0 ) then 32459599516SKenneth E. Jansen BCinp(:,1:(ndof+7))=BCinpread(:,1:(ndof+7)) 32559599516SKenneth E. Jansen else ! sometimes a partition has no BC's 32659599516SKenneth E. Jansen deallocate(BCinpread) 32759599516SKenneth E. Jansen BCinp=0 32859599516SKenneth E. Jansen endif 32959599516SKenneth E. Jansenc 33059599516SKenneth E. Jansenc.... read periodic boundary conditions 33159599516SKenneth E. Jansenc 33259599516SKenneth E. Jansen ione=1 333d5d2f64dSCameron Smith call phio_readheader(fhandle, 334e5afe575SCameron Smith & c_char_'periodic masters array' // char(0), 335e5afe575SCameron Smith & c_loc(nshg), ione, dataInt, iotype) 33659599516SKenneth E. Jansen allocate( point2iper(nshg) ) 33759599516SKenneth E. Jansen allocate( iperread(nshg) ) 338d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 339bc62cfd4SCameron Smith & c_char_'periodic masters array' // char(0), 340bc62cfd4SCameron Smith & c_loc(iperread), nshg, dataInt, iotype) 34159599516SKenneth E. Jansen point2iper=iperread 34259599516SKenneth E. Jansenc 34359599516SKenneth E. Jansenc.... generate the boundary element blocks 34459599516SKenneth E. Jansenc 34559599516SKenneth E. Jansen call genbkb (ibksiz) 34659599516SKenneth E. Jansenc 34759599516SKenneth E. Jansenc Read in the nsons and ifath arrays if needed 34859599516SKenneth E. Jansenc 34959599516SKenneth E. Jansenc There is a fundamental shift in the meaning of ifath based on whether 35059599516SKenneth E. Jansenc there exist homogenous directions in the flow. 35159599516SKenneth E. Jansenc 35259599516SKenneth E. Jansenc HOMOGENOUS DIRECTIONS EXIST: Here nfath is the number of inhomogenous 35359599516SKenneth E. Jansenc points in the TOTAL mesh. That is to say that each partition keeps a 35459599516SKenneth E. Jansenc link to ALL inhomogenous points. This link is furthermore not to the 35559599516SKenneth E. Jansenc sms numbering but to the original structured grid numbering. These 35659599516SKenneth E. Jansenc inhomogenous points are thought of as fathers, with their sons being all 35759599516SKenneth E. Jansenc the points in the homogenous directions that have this father's 35859599516SKenneth E. Jansenc inhomogeneity. The array ifath takes as an arguement the sms numbering 35959599516SKenneth E. Jansenc and returns as a result the father. 36059599516SKenneth E. Jansenc 36159599516SKenneth E. Jansenc In this case nsons is the number of sons that each father has and ifath 36259599516SKenneth E. Jansenc is an array which tells the 36359599516SKenneth E. Jansenc 36459599516SKenneth E. Jansenc NO HOMOGENOUS DIRECTIONS. In this case the mesh would grow to rapidly 36559599516SKenneth E. Jansenc if we followed the above strategy since every partition would index its 36659599516SKenneth E. Jansenc points to the ENTIRE mesh. Furthermore, there would never be a need 36759599516SKenneth E. Jansenc to average to a node off processor since there is no spatial averaging. 36859599516SKenneth E. Jansenc Therefore, to properly account for this case we must recognize it and 36959599516SKenneth E. Jansenc inerrupt certain actions (i.e. assembly of the average across partitions). 37059599516SKenneth E. Jansenc This case is easily identified by noting that maxval(nsons) =1 (i.e. no 37159599516SKenneth E. Jansenc father has any sons). Reiterating to be clear, in this case ifath does 37259599516SKenneth E. Jansenc not point to a global numbering but instead just points to itself. 37359599516SKenneth E. Jansenc 37459599516SKenneth E. Jansen nfath=1 ! some architectures choke on a zero or undeclared 37559599516SKenneth E. Jansen ! dimension variable. This sets it to a safe, small value. 37659599516SKenneth E. Jansen if(((iLES .lt. 20) .and. (iLES.gt.0)) 37759599516SKenneth E. Jansen & .or. (itwmod.gt.0) ) then ! don't forget same 37859599516SKenneth E. Jansen ! conditional in proces.f 37959599516SKenneth E. Jansen ! needed for alloc 38059599516SKenneth E. Jansen ione=1 38159599516SKenneth E. Jansen if(nohomog.gt.0) then 382d5d2f64dSCameron Smith call phio_readheader(fhandle, 383e5afe575SCameron Smith & c_char_'number of father-nodes' // char(0), 384e5afe575SCameron Smith & c_loc(nfath), ione, dataInt, iotype) 38559599516SKenneth E. Jansen 386d5d2f64dSCameron Smith call phio_readheader(fhandle, 387e5afe575SCameron Smith & c_char_'number of son-nodes for each father' // char(0), 388e5afe575SCameron Smith & c_loc(nfath), ione, dataInt, iotype) 38959599516SKenneth E. Jansen 39059599516SKenneth E. Jansen allocate (point2nsons(nfath)) 39159599516SKenneth E. Jansen 392d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 393bc62cfd4SCameron Smith & c_char_'number of son-nodes for each father' // char(0), 394bc62cfd4SCameron Smith & c_loc(point2nsons),nfath, dataInt, iotype) 39559599516SKenneth E. Jansen 396d5d2f64dSCameron Smith call phio_readheader(fhandle, 397e5afe575SCameron Smith & c_char_'keyword ifath' // char(0), 398e5afe575SCameron Smith & c_loc(nshg), ione, dataInt, iotype); 39959599516SKenneth E. Jansen 40059599516SKenneth E. Jansen allocate (point2ifath(nshg)) 40159599516SKenneth E. Jansen 402d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 403bc62cfd4SCameron Smith & c_char_'keyword ifath' // char(0), 404bc62cfd4SCameron Smith & c_loc(point2ifath), nshg, dataInt, iotype) 40559599516SKenneth E. Jansen 40659599516SKenneth E. Jansen nsonmax=maxval(point2nsons) 40759599516SKenneth E. Jansen else ! this is the case where there is no homogeneity 40859599516SKenneth E. Jansen ! therefore ever node is a father (too itself). sonfath 40959599516SKenneth E. Jansen ! (a routine in NSpre) will set this up but this gives 41059599516SKenneth E. Jansen ! you an option to avoid that. 41159599516SKenneth E. Jansen nfath=nshg 41259599516SKenneth E. Jansen allocate (point2nsons(nfath)) 41359599516SKenneth E. Jansen point2nsons=1 41459599516SKenneth E. Jansen allocate (point2ifath(nshg)) 41559599516SKenneth E. Jansen do i=1,nshg 41659599516SKenneth E. Jansen point2ifath(i)=i 41759599516SKenneth E. Jansen enddo 41859599516SKenneth E. Jansen nsonmax=1 41959599516SKenneth E. Jansen endif 42059599516SKenneth E. Jansen else 42159599516SKenneth E. Jansen allocate (point2nsons(1)) 42259599516SKenneth E. Jansen allocate (point2ifath(1)) 42359599516SKenneth E. Jansen endif 42459599516SKenneth E. Jansen 425d7abaf6cSCameron Smith call phio_closefile(fhandle); 426266200f9SCameron Smith iotime = TMRC() - iotime 427266200f9SCameron Smith if (myrank.eq.master) then 428266200f9SCameron Smith write(*,*) 'time to read geombc (seconds)', iotime 429266200f9SCameron Smith endif 430266200f9SCameron Smith 43159599516SKenneth E. Jansenc.... Read restart files 432266200f9SCameron Smith iotime = TMRC() 4339f4aafb6SCameron Smith if( input_mode .eq. -1 ) then 434a486e66cSCameron Smith call streamio_setup_read(fhandle, geomRestartStream) 4359f4aafb6SCameron Smith else if( input_mode .eq. 0 ) then 436d7abaf6cSCameron Smith call posixio_setup(fhandle, c_char_'r') 4379f4aafb6SCameron Smith else if( input_mode .ge. 1 ) then 438d7abaf6cSCameron Smith call syncio_setup_read(nsynciofiles, fhandle) 439d7abaf6cSCameron Smith end if 440a93de25bSCameron Smith call phio_constructName(fhandle, 441d7abaf6cSCameron Smith & c_char_'restart' // char(0), fnamer) 4429071d3baSCameron Smith call phstr_appendInt(fnamer, irstart) 4439071d3baSCameron Smith call phstr_appendStr(fnamer, c_char_'.'//c_null_char) 444d7abaf6cSCameron Smith call phio_openfile(fnamer, fhandle); 44559599516SKenneth E. Jansen 44659599516SKenneth E. Jansen ithree=3 44759599516SKenneth E. Jansen 44859599516SKenneth E. Jansen itmp = int(log10(float(myrank+1)))+1 44959599516SKenneth E. Jansen 45059599516SKenneth E. Jansen intfromfile=0 451d5d2f64dSCameron Smith call phio_readheader(fhandle, 452e5afe575SCameron Smith & c_char_'solution' // char(0), 453e5afe575SCameron Smith & c_loc(intfromfile), ithree, dataInt, iotype) 45459599516SKenneth E. Jansenc 45559599516SKenneth E. Jansenc.... read the values of primitive variables into q 45659599516SKenneth E. Jansenc 45759599516SKenneth E. Jansen allocate( qold(nshg,ndof) ) 45859599516SKenneth E. Jansen if(intfromfile(1).ne.0) then 45959599516SKenneth E. Jansen nshg2=intfromfile(1) 46059599516SKenneth E. Jansen ndof2=intfromfile(2) 46159599516SKenneth E. Jansen lstep=intfromfile(3) 46259599516SKenneth E. Jansen if(ndof2.ne.ndof) then 46359599516SKenneth E. Jansen 46459599516SKenneth E. Jansen endif 46559599516SKenneth E. Jansen if (nshg2 .ne. nshg) 46659599516SKenneth E. Jansen & call error ('restar ', 'nshg ', nshg) 46759599516SKenneth E. Jansen allocate( qread(nshg,ndof2) ) 46859599516SKenneth E. Jansen iqsiz=nshg*ndof2 469d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 470bc62cfd4SCameron Smith & c_char_'solution' // char(0), 471bc62cfd4SCameron Smith & c_loc(qread),iqsiz, dataDbl,iotype) 47259599516SKenneth E. Jansen qold(:,1:ndof)=qread(:,1:ndof) 47359599516SKenneth E. Jansen deallocate(qread) 47459599516SKenneth E. Jansen else 47559599516SKenneth E. Jansen if (myrank.eq.master) then 47659599516SKenneth E. Jansen if (matflg(1,1).eq.0) then ! compressible 47759599516SKenneth E. Jansen warning='Solution is set to zero (with p and T to one)' 47859599516SKenneth E. Jansen else 47959599516SKenneth E. Jansen warning='Solution is set to zero' 48059599516SKenneth E. Jansen endif 48159599516SKenneth E. Jansen write(*,*) warning 48259599516SKenneth E. Jansen endif 48359599516SKenneth E. Jansen qold=zero 48459599516SKenneth E. Jansen if (matflg(1,1).eq.0) then ! compressible 48559599516SKenneth E. Jansen qold(:,1)=one ! avoid zero pressure 48659599516SKenneth E. Jansen qold(:,nflow)=one ! avoid zero temperature 48759599516SKenneth E. Jansen endif 48859599516SKenneth E. Jansen endif 48959599516SKenneth E. Jansen 49059599516SKenneth E. Jansen intfromfile=0 491d5d2f64dSCameron Smith call phio_readheader(fhandle, 492e5afe575SCameron Smith & c_char_'time derivative of solution' // char(0), 493e5afe575SCameron Smith & c_loc(intfromfile), ithree, dataInt, iotype) 49459599516SKenneth E. Jansen allocate( acold(nshg,ndof) ) 49559599516SKenneth E. Jansen if(intfromfile(1).ne.0) then 49659599516SKenneth E. Jansen nshg2=intfromfile(1) 49759599516SKenneth E. Jansen ndof2=intfromfile(2) 49859599516SKenneth E. Jansen lstep=intfromfile(3) 49959599516SKenneth E. Jansen 50059599516SKenneth E. Jansen if (nshg2 .ne. nshg) 50159599516SKenneth E. Jansen & call error ('restar ', 'nshg ', nshg) 50259599516SKenneth E. Jansen allocate( acread(nshg,ndof2) ) 50359599516SKenneth E. Jansen acread=zero 50459599516SKenneth E. Jansen iacsiz=nshg*ndof2 505d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 506bc62cfd4SCameron Smith & c_char_'time derivative of solution' // char(0), 507bc62cfd4SCameron Smith & c_loc(acread), iacsiz, dataDbl,iotype) 50859599516SKenneth E. Jansen acold(:,1:ndof)=acread(:,1:ndof) 50959599516SKenneth E. Jansen deallocate(acread) 51059599516SKenneth E. Jansen else 51159599516SKenneth E. Jansen if (myrank.eq.master) then 51259599516SKenneth E. Jansen warning='Time derivative of solution is set to zero (SAFE)' 51359599516SKenneth E. Jansen write(*,*) warning 51459599516SKenneth E. Jansen endif 51559599516SKenneth E. Jansen acold=zero 51659599516SKenneth E. Jansen endif 51759599516SKenneth E. Jansencc 51859599516SKenneth E. Jansencc.... read the header and check it against the run data 51959599516SKenneth E. Jansencc 52059599516SKenneth E. Jansen if (ideformwall.eq.1) then 52159599516SKenneth E. Jansen 52259599516SKenneth E. Jansen intfromfile=0 523d5d2f64dSCameron Smith call phio_readheader(fhandle, 524e5afe575SCameron Smith & c_char_'displacement' // char(0), 525e5afe575SCameron Smith & c_loc(intfromfile), ithree, dataInt, iotype) 52659599516SKenneth E. Jansen 52759599516SKenneth E. Jansen nshg2=intfromfile(1) 52859599516SKenneth E. Jansen ndisp=intfromfile(2) 52959599516SKenneth E. Jansen lstep=intfromfile(3) 53059599516SKenneth E. Jansen if(ndisp.ne.nsd) then 53159599516SKenneth E. Jansen warning='WARNING ndisp not equal nsd' 53259599516SKenneth E. Jansen write(*,*) warning , ndisp 53359599516SKenneth E. Jansen endif 53459599516SKenneth E. Jansen if (nshg2 .ne. nshg) 53559599516SKenneth E. Jansen & call error ('restar ', 'nshg ', nshg) 53659599516SKenneth E. Jansenc 53759599516SKenneth E. Jansenc.... read the values of primitive variables into uold 53859599516SKenneth E. Jansenc 53959599516SKenneth E. Jansen allocate( uold(nshg,nsd) ) 54059599516SKenneth E. Jansen allocate( uread(nshg,nsd) ) 54159599516SKenneth E. Jansen 54259599516SKenneth E. Jansen iusiz=nshg*nsd 54359599516SKenneth E. Jansen 544d5d2f64dSCameron Smith call phio_readdatablock(fhandle, 545bc62cfd4SCameron Smith & c_char_'displacement' // char(0), 546bc62cfd4SCameron Smith & c_loc(uread), iusiz, dataDbl, iotype) 54759599516SKenneth E. Jansen 54859599516SKenneth E. Jansen uold(:,1:nsd)=uread(:,1:nsd) 54959599516SKenneth E. Jansen else 55059599516SKenneth E. Jansen allocate( uold(nshg,nsd) ) 55159599516SKenneth E. Jansen uold(:,1:nsd) = zero 55259599516SKenneth E. Jansen endif 55359599516SKenneth E. Jansenc 55459599516SKenneth E. Jansenc.... close c-binary files 55559599516SKenneth E. Jansenc 556d7abaf6cSCameron Smith call phio_closefile(fhandle) 557266200f9SCameron Smith iotime = TMRC() - iotime 558266200f9SCameron Smith if (myrank.eq.master) then 559266200f9SCameron Smith write(*,*) 'time to read restart (seconds)', iotime 560266200f9SCameron Smith endif 56159599516SKenneth E. Jansen 56259599516SKenneth E. Jansen deallocate(xread) 56359599516SKenneth E. Jansen if ( numpbc > 0 ) then 56459599516SKenneth E. Jansen deallocate(bcinpread) 56559599516SKenneth E. Jansen deallocate(ibctmpread) 56659599516SKenneth E. Jansen endif 56759599516SKenneth E. Jansen deallocate(iperread) 56859599516SKenneth E. Jansen if(numpe.gt.1) 56959599516SKenneth E. Jansen & deallocate(ilworkread) 57059599516SKenneth E. Jansen deallocate(nbcread) 57159599516SKenneth E. Jansen 57259599516SKenneth E. Jansen return 57359599516SKenneth E. Jansen 994 call error ('input ','opening ', igeomBAK) 57459599516SKenneth E. Jansen 995 call error ('input ','opening ', igeomBAK) 57559599516SKenneth E. Jansen 997 call error ('input ','end file', igeomBAK) 57659599516SKenneth E. Jansen 998 call error ('input ','end file', igeomBAK) 57759599516SKenneth E. Jansen end 57859599516SKenneth E. Jansenc 57959599516SKenneth E. Jansenc No longer called but kept around in case.... 58059599516SKenneth E. Jansenc 58159599516SKenneth E. Jansen subroutine genpzero(iBC) 58259599516SKenneth E. Jansen 58359599516SKenneth E. Jansen use pointer_data 58459599516SKenneth E. Jansen include "common.h" 58559599516SKenneth E. Jansen integer iBC(nshg) 58659599516SKenneth E. Jansenc 58759599516SKenneth E. Jansenc.... check to see if any of the nodes have a dirichlet pressure 58859599516SKenneth E. Jansenc 58959599516SKenneth E. Jansen pzero=1 59059599516SKenneth E. Jansen if (any(btest(iBC,2))) pzero=0 59159599516SKenneth E. Jansen do iblk = 1, nelblb 59259599516SKenneth E. Jansen npro = lcblkb(1,iblk+1)-lcblkb(1,iblk) 59359599516SKenneth E. Jansen do i=1, npro 59459599516SKenneth E. Jansen iBCB1=miBCB(iblk)%p(i,1) 59559599516SKenneth E. Jansenc 59659599516SKenneth E. Jansenc.... check to see if any of the nodes have a Neumann pressure 59759599516SKenneth E. Jansenc but not periodic (note that 59859599516SKenneth E. Jansenc 59959599516SKenneth E. Jansen if(btest(iBCB1,1)) pzero=0 60059599516SKenneth E. Jansen enddo 60159599516SKenneth E. Jansenc 60259599516SKenneth E. Jansenc.... share results with other processors 60359599516SKenneth E. Jansenc 60459599516SKenneth E. Jansen pzl=pzero 60559599516SKenneth E. Jansen if (numpe .gt. 1) 60659599516SKenneth E. Jansen & call MPI_ALLREDUCE (pzl, pzero, 1, 60759599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_MIN, MPI_COMM_WORLD,ierr) 60859599516SKenneth E. Jansen enddo 60959599516SKenneth E. Jansen return 61059599516SKenneth E. Jansen end 611