159599516SKenneth E. Jansen subroutine genbkb (ibksz) 259599516SKenneth E. Jansenc 359599516SKenneth E. Jansenc---------------------------------------------------------------------- 459599516SKenneth E. Jansenc 559599516SKenneth E. Jansenc This routine reads the boundary elements, reorders them and 659599516SKenneth E. Jansenc generates traces for the gather/scatter operations. 759599516SKenneth E. Jansenc 859599516SKenneth E. Jansenc Zdenek Johan, Fall 1991. 959599516SKenneth E. Jansenc---------------------------------------------------------------------- 1059599516SKenneth E. Jansenc 1159599516SKenneth E. Jansen use dtnmod 1259599516SKenneth E. Jansen use pointer_data 1359599516SKenneth E. Jansenc 1459599516SKenneth E. Jansen include "common.h" 1559599516SKenneth E. Jansen!MR CHANGE 1659599516SKenneth E. Jansen include "mpif.h" !Required to determine the max for itpblk 1759599516SKenneth E. Jansen!MR CHANGE END 1859599516SKenneth E. Jansenc 1959599516SKenneth E. Jansen 2059599516SKenneth E. Jansen integer, allocatable :: ientp(:,:),iBCBtp(:,:) 2159599516SKenneth E. Jansen real*8, allocatable :: BCBtp(:,:) 2259599516SKenneth E. Jansen integer materb(ibksz) 2359599516SKenneth E. Jansen integer intfromfile(50) ! integers read from headers 2459599516SKenneth E. Jansen character*255 fname1 2559599516SKenneth E. Jansen 2659599516SKenneth E. Jansencccccccccccccc New Phasta IO starts here cccccccccccccccccccccccccccccc 2759599516SKenneth E. Jansen 2859599516SKenneth E. Jansen integer :: descriptor, descriptorG, GPID, color, nfiles, nfields 2959599516SKenneth E. Jansen integer :: numparts, nppf, nppp, nprocs, writeLock 3059599516SKenneth E. Jansen integer :: ierr_io, numprocs, itmp, itmp2 3159599516SKenneth E. Jansen! integer :: num_local_loop, num_global_loop 3259599516SKenneth E. Jansen!MR CHANGE 3359599516SKenneth E. Jansen integer :: itpblktot,ierr 3459599516SKenneth E. Jansen!MR CHANGE END 3559599516SKenneth E. Jansen 3659599516SKenneth E. Jansen character*255 fnamer, fname2, temp2 3759599516SKenneth E. Jansen character*64 temp1, temp3 3859599516SKenneth E. Jansen 3959599516SKenneth E. Jansen nfiles = nsynciofiles 4059599516SKenneth E. Jansen nfields = nsynciofieldsreadgeombc 4159599516SKenneth E. Jansen numparts = numpe !This is the common settings. Beware if you try to compute several parts per process 4259599516SKenneth E. Jansen 4359599516SKenneth E. Jansen nppp = numparts/numpe 4459599516SKenneth E. Jansen nppf = numparts/nfiles 4559599516SKenneth E. Jansen 4659599516SKenneth E. Jansen color = int(myrank/(numparts/nfiles)) 4759599516SKenneth E. Jansen itmp2 = int(log10(float(color+1)))+1 4859599516SKenneth E. Jansen write (temp2,"('(''geombc-dat.'',i',i1,')')") itmp2 4959599516SKenneth E. Jansen temp2=trim(temp2) 5059599516SKenneth E. Jansen write (fnamer,temp2) (color+1) 5159599516SKenneth E. Jansen fnamer=trim(fnamer) 5259599516SKenneth E. Jansen 5359599516SKenneth E. Jansen ione=1 5459599516SKenneth E. Jansen itwo=2 5559599516SKenneth E. Jansen ieight=8 5659599516SKenneth E. Jansen ieleven=11 5759599516SKenneth E. Jansen itmp = int(log10(float(myrank+1)))+1 5859599516SKenneth E. Jansen 5959599516SKenneth E. Jansen! num_global_loop = 4 6059599516SKenneth E. Jansen! num_local_loop = nelblb 6159599516SKenneth E. Jansen 6259599516SKenneth E. Jansencccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 6359599516SKenneth E. Jansen 6459599516SKenneth E. Jansen iel=1 6559599516SKenneth E. Jansen itpblk=nelblb 6659599516SKenneth E. Jansen 6759599516SKenneth E. Jansen 6859599516SKenneth E. Jansen!MR CHANGE 6959599516SKenneth E. Jansen ! Get the total number of different interior topologies in the whole domain. 7059599516SKenneth E. Jansen ! Try to read from a field. If the field does not exist, scan the geombc file. 7159599516SKenneth E. Jansen itpblktot=-1 72*ba1c73e0SCameron Smith call readheader(igeom,'total number of boundary tpblocks' // char(0), 73*ba1c73e0SCameron Smith & itpblktot,ione,'integer' // char(0),iotype) 7459599516SKenneth E. Jansen 7559599516SKenneth E. Jansen! write (*,*) 'Rank: ',myrank,' boundary itpblktot intermediate:', 7659599516SKenneth E. Jansen! & itpblktot 7759599516SKenneth E. Jansen 7859599516SKenneth E. Jansen if (itpblktot == -1) then 7959599516SKenneth E. Jansen ! The field 'total number of different boundary tpblocks' was not found in the geombc file. 8059599516SKenneth E. Jansen ! Scan all the geombc file for the 'connectivity interior' fields to get this information. 8159599516SKenneth E. Jansen iblk=0 8259599516SKenneth E. Jansen neltp=0 8359599516SKenneth E. Jansen do while(neltp .ne. -1) 8459599516SKenneth E. Jansen 8559599516SKenneth E. Jansen ! intfromfile is reinitialized to -1 every time. 8659599516SKenneth E. Jansen ! If connectivity boundary@xxx is not found, then 8759599516SKenneth E. Jansen ! readheader will return intfromfile unchanged 8859599516SKenneth E. Jansen 8959599516SKenneth E. Jansen intfromfile(:)=-1 9059599516SKenneth E. Jansen iblk = iblk+1 91*ba1c73e0SCameron Smith call readheader(igeom,'connectivity boundary1' // char(0), 92*ba1c73e0SCameron Smith & intfromfile,ieight,'integer' // char(0),iotype) 9359599516SKenneth E. Jansen neltp = intfromfile(1) ! -1 if fname2 was not found, >=0 otherwise 9459599516SKenneth E. Jansen end do 9559599516SKenneth E. Jansen itpblktot = iblk-1 9659599516SKenneth E. Jansen end if 9759599516SKenneth E. Jansen 9859599516SKenneth E. Jansen if (myrank == 0) then 9959599516SKenneth E. Jansen write(*,*) 'Number of boundary topologies: ',itpblktot 10059599516SKenneth E. Jansen endif 10159599516SKenneth E. Jansen! write (*,*) 'Rank: ',myrank,' boundary itpblktot final:', 10259599516SKenneth E. Jansen! & itpblktot 10359599516SKenneth E. Jansen 10459599516SKenneth E. Jansen!MR CHANGE END 10559599516SKenneth E. Jansen nelblb=0 10659599516SKenneth E. Jansen mattyp=0 10759599516SKenneth E. Jansen ndofl = ndof 10859599516SKenneth E. Jansen!MR CHANGE 10959599516SKenneth E. Jansen! call initphmpiio( nfields, nppf, nfiles, igeom ) 11059599516SKenneth E. Jansen! call openfile( fnamer, 'read', igeom ) 11159599516SKenneth E. Jansen 11259599516SKenneth E. Jansen do iblk = 1, itpblktot 11359599516SKenneth E. Jansen writeLock=0; 11459599516SKenneth E. Jansen!MR CHANGE END 11559599516SKenneth E. Jansen 11659599516SKenneth E. Jansen 11759599516SKenneth E. Jansen! print *, "Loop ",iblk, myrank, itpblk, trim(fnamer) 11859599516SKenneth E. Jansen 11959599516SKenneth E. Jansenccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 12059599516SKenneth E. Jansen! write(*,*) 'rank, fname2',myrank, trim(adjustl(fname2)) 12159599516SKenneth E. Jansen 12259599516SKenneth E. Jansenccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 12359599516SKenneth E. Jansen 12459599516SKenneth E. Jansen ! Synchronization for performance monitoring, as some parts do not include some topologies 12559599516SKenneth E. Jansen call MPI_Barrier(MPI_COMM_WORLD,ierr) 126*ba1c73e0SCameron Smith call readheader(igeom,'connectivity boundary1' // char(0), 127*ba1c73e0SCameron Smith & intfromfile,ieight,'integer' // char(0),iotype) 12859599516SKenneth E. Jansen neltp =intfromfile(1) 12959599516SKenneth E. Jansen nenl =intfromfile(2) 13059599516SKenneth E. Jansen ipordl=intfromfile(3) 13159599516SKenneth E. Jansen nshl =intfromfile(4) 13259599516SKenneth E. Jansen nshlb =intfromfile(5) 13359599516SKenneth E. Jansen nenbl =intfromfile(6) 13459599516SKenneth E. Jansen lcsyst=intfromfile(7) 13559599516SKenneth E. Jansen numnbc=intfromfile(8) 13659599516SKenneth E. Jansen 13759599516SKenneth E. Jansen!MR CHANGE 13859599516SKenneth E. Jansen! write (temp1,"('connectivityBoundaryHeader_',i1,'_',i1)") 13959599516SKenneth E. Jansen! & iblk,myrank 14059599516SKenneth E. Jansen! temp1=trim(temp1) 14159599516SKenneth E. Jansen! open(unit=14,file=temp1,status='unknown') 14259599516SKenneth E. Jansen! write(14,*) intfromfile(:) 14359599516SKenneth E. Jansen! close(14) 14459599516SKenneth E. Jansen!MR CHANGE END 14559599516SKenneth E. Jansen 14659599516SKenneth E. Jansen allocate (ientp(neltp,nshl)) 14759599516SKenneth E. Jansen allocate (iBCBtp(neltp,ndiBCB)) 14859599516SKenneth E. Jansen allocate (BCBtp(neltp,ndBCB)) 14959599516SKenneth E. Jansen iientpsiz=neltp*nshl 15059599516SKenneth E. Jansen 15159599516SKenneth E. Jansen if (neltp==0) then 15259599516SKenneth E. Jansen writeLock=1; 15359599516SKenneth E. Jansen endif 15459599516SKenneth E. Jansen 15559599516SKenneth E. Jansen! print *, "neltp is ", neltp 15659599516SKenneth E. Jansen 157*ba1c73e0SCameron Smith call readdatablock(igeom,'connectivity boundary1' // char(0), 158*ba1c73e0SCameron Smith & ientp,iientpsiz,'integer' // char(0),iotype) 15959599516SKenneth E. Jansen 16059599516SKenneth E. Jansen!MR CHANGE 16159599516SKenneth E. Jansen! write (temp1,"('connectivityBoundaryDatablock_',i1,'_',i1)") 16259599516SKenneth E. Jansen! & iblk,myrank 16359599516SKenneth E. Jansen! temp1=trim(temp1) 16459599516SKenneth E. Jansen 16559599516SKenneth E. Jansen! open(unit=14,file=temp1,status='unknown') 16659599516SKenneth E. Jansen! do i=1,neltp 16759599516SKenneth E. Jansen! do j=1,nshl 16859599516SKenneth E. Jansen! write(14,*) ientp(i,j) 16959599516SKenneth E. Jansen! enddo 17059599516SKenneth E. Jansen! enddo 17159599516SKenneth E. Jansen! write(14,*) iientpsiz 17259599516SKenneth E. Jansen! close(14) 17359599516SKenneth E. Jansen!MR CHANGE END 17459599516SKenneth E. Jansen 17559599516SKenneth E. Jansen 17659599516SKenneth E. Jansenc 17759599516SKenneth E. Jansenc.... Read the boundary flux codes 17859599516SKenneth E. Jansenc 17959599516SKenneth E. Jansen 18059599516SKenneth E. Jansen! print *,"connectivity [] is ", trim(fname2),ientp(0,0) 18159599516SKenneth E. Jansen 18259599516SKenneth E. Jansen 18359599516SKenneth E. Jansenccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 18459599516SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 18559599516SKenneth E. Jansen 18659599516SKenneth E. Jansenccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 18759599516SKenneth E. Jansen 188*ba1c73e0SCameron Smith call readheader(igeom,'nbc codes1' // char(0) ,intfromfile, 18959599516SKenneth E. Jansen & ieight,'integer' // char(0),iotype) 19059599516SKenneth E. Jansen iiBCBtpsiz=neltp*ndiBCB 191*ba1c73e0SCameron Smith call readdatablock(igeom,'nbc codes1' // char(0) ,iBCBtp, 19259599516SKenneth E. Jansen & iiBCBtpsiz,'integer' // char(0),iotype) 19359599516SKenneth E. Jansen 19459599516SKenneth E. Jansen!MR CHANGE 19559599516SKenneth E. Jansen! print *, "ndiBCB is ",ndiBCB 19659599516SKenneth E. Jansen! write (temp1,"('nbcCodesDatablock_',i1,'_',i1)") 19759599516SKenneth E. Jansen! & iblk,myrank 19859599516SKenneth E. Jansen! temp1=trim(temp1) 19959599516SKenneth E. Jansen! 20059599516SKenneth E. Jansen! open(unit=13,file=temp1,status='unknown') 20159599516SKenneth E. Jansen! do i=1,neltp 20259599516SKenneth E. Jansen! do j=1,ndiBCB 20359599516SKenneth E. Jansen! write(13,*) iBCBtp(i,j) 20459599516SKenneth E. Jansen! enddo 20559599516SKenneth E. Jansen! enddo 20659599516SKenneth E. Jansen! write(13,*) iiBCBtpsiz 20759599516SKenneth E. Jansen! close(13) 20859599516SKenneth E. Jansen!! iBCBtp(:,:) = 0 ! JUST FOR TEST 20959599516SKenneth E. Jansen!MR CHANGE END 21059599516SKenneth E. Jansen 21159599516SKenneth E. Jansenc 21259599516SKenneth E. Jansenc.... read the boundary condition data 21359599516SKenneth E. Jansenc 21459599516SKenneth E. Jansen 21559599516SKenneth E. Jansenccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 21659599516SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 21759599516SKenneth E. Jansenccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 21859599516SKenneth E. Jansen 219*ba1c73e0SCameron Smith call readheader(igeom,'nbc values1' // char(0) ,intfromfile, 22059599516SKenneth E. Jansen & ieight,'integer' // char(0) ,iotype) 22159599516SKenneth E. Jansen BCBtp = zero 22259599516SKenneth E. Jansen iBCBtpsiz=neltp*ndBCB 223*ba1c73e0SCameron Smith call readdatablock(igeom,'nbc values1' // char(0), 224*ba1c73e0SCameron Smith & BCBtp,iBCBtpsiz,'double' // char(0) ,iotype) 22559599516SKenneth E. Jansen 22659599516SKenneth E. Jansen!MR CHANGE 22759599516SKenneth E. Jansen! write (temp1,"('nbcValuesDatablock_',i1,'_',i1)") 22859599516SKenneth E. Jansen! & iblk,myrank 22959599516SKenneth E. Jansen! temp1=trim(temp1) 23059599516SKenneth E. Jansen! open(unit=12,file=temp1,status='unknown') 23159599516SKenneth E. Jansen! do i=1,neltp 23259599516SKenneth E. Jansen! do j=1,ndBCB 23359599516SKenneth E. Jansen! write(12,*) BCBtp(i,j) 23459599516SKenneth E. Jansen! enddo 23559599516SKenneth E. Jansen! enddo 23659599516SKenneth E. Jansen! write(12,*) iBCBtpsiz 23759599516SKenneth E. Jansen! close(12) 23859599516SKenneth E. Jansen!MR CHANGE END 23959599516SKenneth E. Jansen 24059599516SKenneth E. Jansenc 24159599516SKenneth E. Jansenc This is a temporary fix until NSpre properly zeros this array where it 24259599516SKenneth E. Jansenc is not set. DEC has indigestion with these arrays though the 24359599516SKenneth E. Jansenc result is never used (never effects solution). 24459599516SKenneth E. Jansenc 24559599516SKenneth E. Jansen 24659599516SKenneth E. Jansen 24759599516SKenneth E. Jansen!MR CHANGE 24859599516SKenneth E. Jansen if(writeLock==0) then 24959599516SKenneth E. Jansen!MR CHANGE 25059599516SKenneth E. Jansen! print *,"In ASSIGN ASSIGN",myrank 25159599516SKenneth E. Jansen where(.not.btest(iBCBtp(:,1),0)) BCBtp(:,1)=zero 25259599516SKenneth E. Jansen where(.not.btest(iBCBtp(:,1),1)) BCBtp(:,2)=zero 25359599516SKenneth E. Jansen where(.not.btest(iBCBtp(:,1),3)) BCBtp(:,6)=zero 25459599516SKenneth E. Jansen if(ndBCB.gt.6) then 25559599516SKenneth E. Jansen do i=6,ndof 25659599516SKenneth E. Jansen where(.not.btest(iBCBtp(:,1),i-1)) BCBtp(:,i+1)=zero 25759599516SKenneth E. Jansen enddo 25859599516SKenneth E. Jansen endif 25959599516SKenneth E. Jansen where(.not.btest(iBCBtp(:,1),2)) 26059599516SKenneth E. Jansen BCBtp(:,3)=zero 26159599516SKenneth E. Jansen BCBtp(:,4)=zero 26259599516SKenneth E. Jansen BCBtp(:,5)=zero 26359599516SKenneth E. Jansen endwhere 26459599516SKenneth E. Jansen 26559599516SKenneth E. Jansen do n=1,neltp,ibksz 26659599516SKenneth E. Jansen nelblb=nelblb+1 26759599516SKenneth E. Jansen npro= min(IBKSZ, neltp - n + 1) 26859599516SKenneth E. Jansenc 26959599516SKenneth E. Jansen lcblkb(1,nelblb) = iel 27059599516SKenneth E. Jansenc lcblkb(2,nelblb) = iopen ! available for later use 27159599516SKenneth E. Jansen lcblkb(3,nelblb) = lcsyst 27259599516SKenneth E. Jansen lcblkb(4,nelblb) = ipordl 27359599516SKenneth E. Jansen lcblkb(5,nelblb) = nenl 27459599516SKenneth E. Jansen lcblkb(6,nelblb) = nenbl 27559599516SKenneth E. Jansen lcblkb(7,nelblb) = mattyp 27659599516SKenneth E. Jansen lcblkb(8,nelblb) = ndofl 27759599516SKenneth E. Jansen lcblkb(9,nelblb) = nshl 27859599516SKenneth E. Jansen lcblkb(10,nelblb) = nshlb ! # of shape functions per elt 27959599516SKenneth E. Jansenc 28059599516SKenneth E. Jansenc.... save the element block 28159599516SKenneth E. Jansenc 28259599516SKenneth E. Jansen n1=n 28359599516SKenneth E. Jansen n2=n+npro-1 28459599516SKenneth E. Jansen materb=1 ! all one material for now 28559599516SKenneth E. Jansenc 28659599516SKenneth E. Jansenc.... allocate memory for stack arrays 28759599516SKenneth E. Jansenc 28859599516SKenneth E. Jansen 28959599516SKenneth E. Jansen allocate (mienb(nelblb)%p(npro,nshl)) 29059599516SKenneth E. Jansenc 29159599516SKenneth E. Jansen allocate (miBCB(nelblb)%p(npro,ndiBCB)) 29259599516SKenneth E. Jansenc 29359599516SKenneth E. Jansen allocate (mBCB(nelblb)%p(npro,nshlb,ndBCB)) 29459599516SKenneth E. Jansenc 29559599516SKenneth E. Jansen allocate (mmatb(nelblb)%p(npro)) 29659599516SKenneth E. Jansenc 29759599516SKenneth E. Jansenc.... save the boundary element block 29859599516SKenneth E. Jansenc 29959599516SKenneth E. Jansen call gensvb (ientp(n1:n2,1:nshl), 30059599516SKenneth E. Jansen & iBCBtp(n1:n2,:), BCBtp(n1:n2,:), 30159599516SKenneth E. Jansen & materb, mienb(nelblb)%p, 30259599516SKenneth E. Jansen & miBCB(nelblb)%p, mBCB(nelblb)%p, 30359599516SKenneth E. Jansen & mmatb(nelblb)%p) 30459599516SKenneth E. Jansenc 30559599516SKenneth E. Jansen iel=iel+npro 30659599516SKenneth E. Jansen enddo 30759599516SKenneth E. Jansen 30859599516SKenneth E. Jansen!MR CHANGE 30959599516SKenneth E. Jansen endif 31059599516SKenneth E. Jansen!MR CHANGE 31159599516SKenneth E. Jansen deallocate(ientp) 31259599516SKenneth E. Jansen deallocate(iBCBtp) 31359599516SKenneth E. Jansen deallocate(BCBtp) 31459599516SKenneth E. Jansen 31559599516SKenneth E. Jansen enddo 31659599516SKenneth E. Jansen lcblkb(1,nelblb+1) = iel 31759599516SKenneth E. Jansen 31859599516SKenneth E. Jansen! call closefile( igeom, "read" ) 31959599516SKenneth E. Jansen! call finalizephmpiio( igeom ) 32059599516SKenneth E. Jansen 32159599516SKenneth E. Jansenc 32259599516SKenneth E. Jansenc.... return 32359599516SKenneth E. Jansenc 32459599516SKenneth E. Jansen return 32559599516SKenneth E. Jansenc 32659599516SKenneth E. Jansenc.... end of file error handling 32759599516SKenneth E. Jansenc 32859599516SKenneth E. Jansen 911 call error ('genbcb ','end file',igeomBAK) 32959599516SKenneth E. Jansenc 33059599516SKenneth E. Jansen1000 format(a80,//, 33159599516SKenneth E. Jansen & ' B o u n d a r y E l e m e n t C o n n e c t i v i t y',//, 33259599516SKenneth E. Jansen & ' Elem BC codes',/, 33359599516SKenneth E. Jansen & ' Number C P V H ',5x,27('Node',i1,:,2x)) 33459599516SKenneth E. Jansen1100 format(2x,i5,2x,4i2,3x,27i7) 33559599516SKenneth E. Jansenc$$$2000 format(a80,//, 33659599516SKenneth E. Jansenc$$$ & ' B o u n d a r y E l e m e n t B C D a t a ',//, 33759599516SKenneth E. Jansenc$$$ & ' Node ',3x,'mass',/, 33859599516SKenneth E. Jansenc$$$ & ' Number ',3x,'flux',6x,'Pressure',6x,'Heat',6x, 33959599516SKenneth E. Jansenc$$$ & 3('Viscous',i1,:,4x)) 34059599516SKenneth E. Jansen2100 format(2x,i5,1p,1x,6e12.4) 34159599516SKenneth E. Jansenc 34259599516SKenneth E. Jansen end 34359599516SKenneth E. Jansen 344