1*ab5b07a4SKenneth E. Jansen subroutine genbkbSyncIO (ibksz) 29d714148SKenneth E. Jansenc 39d714148SKenneth E. Jansenc---------------------------------------------------------------------- 49d714148SKenneth E. Jansenc 59d714148SKenneth E. Jansenc This routine reads the boundary elements, reorders them and 69d714148SKenneth E. Jansenc generates traces for the gather/scatter operations. 79d714148SKenneth E. Jansenc 89d714148SKenneth E. Jansenc Zdenek Johan, Fall 1991. 99d714148SKenneth E. Jansenc---------------------------------------------------------------------- 109d714148SKenneth E. Jansenc 119d714148SKenneth E. Jansen use dtnmod 129d714148SKenneth E. Jansen use pointer_data 13*ab5b07a4SKenneth E. Jansen use phio 14*ab5b07a4SKenneth E. Jansen use iso_c_binding 159d714148SKenneth E. Jansen include "common.h" 169d714148SKenneth E. Jansen include "mpif.h" !Required to determine the max for itpblk 179d714148SKenneth E. Jansen 18*ab5b07a4SKenneth E. Jansen integer, target, allocatable :: ientp(:,:),iBCBtp(:,:) 19*ab5b07a4SKenneth E. Jansen real*8, target, allocatable :: BCBtp(:,:) 209d714148SKenneth E. Jansen integer materb(ibksz) 21*ab5b07a4SKenneth E. Jansen integer, target :: intfromfile(50) ! integers read from headers 229d714148SKenneth E. Jansen character*255 fname1 23*ab5b07a4SKenneth E. Jansen integer :: descriptor, descriptorG, GPID, color, nfields 24*ab5b07a4SKenneth E. Jansen integer :: numparts, nppp, nprocs, writeLock 259d714148SKenneth E. Jansen integer :: ierr_io, numprocs, itmp, itmp2 26*ab5b07a4SKenneth E. Jansen integer, target :: itpblktot,ierr 27*ab5b07a4SKenneth E. Jansen character*255 fname2 28*ab5b07a4SKenneth E. Jansen character(len=30) :: dataInt, dataDbl 29*ab5b07a4SKenneth E. Jansen dataInt = c_char_'integer'//c_null_char 30*ab5b07a4SKenneth E. Jansen dataDbl = c_char_'double'//c_null_char 319d714148SKenneth E. Jansen 329d714148SKenneth E. Jansen nfields = nsynciofieldsreadgeombc 339d714148SKenneth E. Jansen numparts = numpe !This is the common settings. Beware if you try to compute several parts per process 349d714148SKenneth E. Jansen nppp = numparts/numpe 359d714148SKenneth E. Jansen ione=1 369d714148SKenneth E. Jansen itwo=2 379d714148SKenneth E. Jansen ieight=8 389d714148SKenneth E. Jansen ieleven=11 399d714148SKenneth E. Jansen itmp = int(log10(float(myrank+1)))+1 409d714148SKenneth E. Jansen iel=1 419d714148SKenneth E. Jansen itpblk=nelblb 429d714148SKenneth E. Jansen 439d714148SKenneth E. Jansen ! Get the total number of different interior topologies in the whole domain. 449d714148SKenneth E. Jansen ! Try to read from a field. If the field does not exist, scan the geombc file. 459d714148SKenneth E. Jansen itpblktot=-1 46*ab5b07a4SKenneth E. Jansen call phio_readheader(fhandle, 47*ab5b07a4SKenneth E. Jansen & c_char_'total number of boundary tpblocks' // char(0), 48*ab5b07a4SKenneth E. Jansen & c_loc(itpblktot), ione, dataInt, iotype) 499d714148SKenneth E. Jansen 509d714148SKenneth E. Jansen if (itpblktot == -1) then 519d714148SKenneth E. Jansen ! The field 'total number of different boundary tpblocks' was not found in the geombc file. 529d714148SKenneth E. Jansen ! Scan all the geombc file for the 'connectivity interior' fields to get this information. 539d714148SKenneth E. Jansen iblk=0 549d714148SKenneth E. Jansen neltp=0 559d714148SKenneth E. Jansen do while(neltp .ne. -1) 569d714148SKenneth E. Jansen 579d714148SKenneth E. Jansen ! intfromfile is reinitialized to -1 every time. 589d714148SKenneth E. Jansen ! If connectivity boundary@xxx is not found, then 599d714148SKenneth E. Jansen ! readheader will return intfromfile unchanged 609d714148SKenneth E. Jansen 619d714148SKenneth E. Jansen intfromfile(:)=-1 629d714148SKenneth E. Jansen iblk = iblk+1 63*ab5b07a4SKenneth E. Jansen write (fname2,"('connectivity boundary',i1)") iblk 64*ab5b07a4SKenneth E. Jansen 65*ab5b07a4SKenneth E. Jansen 66*ab5b07a4SKenneth E. Jansen call phio_readheader(fhandle, fname2 // char(0), 67*ab5b07a4SKenneth E. Jansen & c_loc(intfromfile), ieight, dataInt, iotype) 689d714148SKenneth E. Jansen neltp = intfromfile(1) ! -1 if fname2 was not found, >=0 otherwise 699d714148SKenneth E. Jansen end do 709d714148SKenneth E. Jansen itpblktot = iblk-1 719d714148SKenneth E. Jansen end if 729d714148SKenneth E. Jansen 739d714148SKenneth E. Jansen if (myrank == 0) then 749d714148SKenneth E. Jansen write(*,*) 'Number of boundary topologies: ',itpblktot 759d714148SKenneth E. Jansen endif 769d714148SKenneth E. Jansen! write (*,*) 'Rank: ',myrank,' boundary itpblktot final:', 779d714148SKenneth E. Jansen! & itpblktot 789d714148SKenneth E. Jansen 799d714148SKenneth E. Jansen nelblb=0 809d714148SKenneth E. Jansen mattyp=0 819d714148SKenneth E. Jansen ndofl = ndof 82*ab5b07a4SKenneth E. Jansen 839d714148SKenneth E. Jansen do iblk = 1, itpblktot 849d714148SKenneth E. Jansen writeLock=0; 85*ab5b07a4SKenneth E. Jansen write (fname2,"('connectivity boundary',i1)") iblk 869d714148SKenneth E. Jansen ! Synchronization for performance monitoring, as some parts do not include some topologies 879d714148SKenneth E. Jansen call MPI_Barrier(MPI_COMM_WORLD,ierr) 88*ab5b07a4SKenneth E. Jansen call phio_readheader(fhandle, fname2 // char(0), 89*ab5b07a4SKenneth E. Jansen & c_loc(intfromfile), ieight, dataInt, iotype) 909d714148SKenneth E. Jansen neltp =intfromfile(1) 919d714148SKenneth E. Jansen nenl =intfromfile(2) 929d714148SKenneth E. Jansen ipordl=intfromfile(3) 939d714148SKenneth E. Jansen nshl =intfromfile(4) 949d714148SKenneth E. Jansen nshlb =intfromfile(5) 959d714148SKenneth E. Jansen nenbl =intfromfile(6) 969d714148SKenneth E. Jansen lcsyst=intfromfile(7) 979d714148SKenneth E. Jansen numnbc=intfromfile(8) 989d714148SKenneth E. Jansen 999d714148SKenneth E. Jansen allocate (ientp(neltp,nshl)) 1009d714148SKenneth E. Jansen allocate (iBCBtp(neltp,ndiBCB)) 1019d714148SKenneth E. Jansen allocate (BCBtp(neltp,ndBCB)) 1029d714148SKenneth E. Jansen iientpsiz=neltp*nshl 1039d714148SKenneth E. Jansen 1049d714148SKenneth E. Jansen if (neltp==0) then 1059d714148SKenneth E. Jansen writeLock=1; 1069d714148SKenneth E. Jansen endif 1079d714148SKenneth E. Jansen 108*ab5b07a4SKenneth E. Jansen call phio_readdatablock(fhandle, fname2 // char(0), 109*ab5b07a4SKenneth E. Jansen & c_loc(ientp),iientpsiz,dataInt,iotype) 1109d714148SKenneth E. Jansenc 1119d714148SKenneth E. Jansenc.... Read the boundary flux codes 1129d714148SKenneth E. Jansenc 1139d714148SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 114*ab5b07a4SKenneth E. Jansen write (fname2,"('nbc codes',i1)") iblk 1159d714148SKenneth E. Jansen 116*ab5b07a4SKenneth E. Jansen call phio_readheader(fhandle, fname2 // char(0), 117*ab5b07a4SKenneth E. Jansen & c_loc(intfromfile), ieight, dataInt, iotype) 1189d714148SKenneth E. Jansen iiBCBtpsiz=neltp*ndiBCB 119*ab5b07a4SKenneth E. Jansen call phio_readdatablock(fhandle, fname2 // char(0), 120*ab5b07a4SKenneth E. Jansen & c_loc(iBCBtp),iiBCBtpsiz,dataInt,iotype) 1219d714148SKenneth E. Jansenc 1229d714148SKenneth E. Jansenc.... read the boundary condition data 1239d714148SKenneth E. Jansenc 1249d714148SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 125*ab5b07a4SKenneth E. Jansen write (fname2,"('nbc values',i1)") iblk 1269d714148SKenneth E. Jansen 127*ab5b07a4SKenneth E. Jansen call phio_readheader(fhandle, fname2 // char(0), 128*ab5b07a4SKenneth E. Jansen & c_loc(intfromfile), ieight, dataInt, iotype) 1299d714148SKenneth E. Jansen BCBtp = zero 1309d714148SKenneth E. Jansen iBCBtpsiz=neltp*ndBCB 131*ab5b07a4SKenneth E. Jansen call phio_readdatablock(fhandle, fname2 // char(0), 132*ab5b07a4SKenneth E. Jansen & c_loc(BCBtp),iBCBtpsiz,dataDbl,iotype) 1339d714148SKenneth E. Jansenc 1349d714148SKenneth E. Jansenc This is a temporary fix until NSpre properly zeros this array where it 1359d714148SKenneth E. Jansenc is not set. DEC has indigestion with these arrays though the 1369d714148SKenneth E. Jansenc result is never used (never effects solution). 1379d714148SKenneth E. Jansenc 1389d714148SKenneth E. Jansen if(writeLock==0) then 1399d714148SKenneth E. Jansen where(.not.btest(iBCBtp(:,1),0)) BCBtp(:,1)=zero 1409d714148SKenneth E. Jansen where(.not.btest(iBCBtp(:,1),1)) BCBtp(:,2)=zero 1419d714148SKenneth E. Jansen where(.not.btest(iBCBtp(:,1),3)) BCBtp(:,6)=zero 1429d714148SKenneth E. Jansen if(ndBCB.gt.6) then 1439d714148SKenneth E. Jansen do i=6,ndof 1449d714148SKenneth E. Jansen where(.not.btest(iBCBtp(:,1),i-1)) BCBtp(:,i+1)=zero 1459d714148SKenneth E. Jansen enddo 1469d714148SKenneth E. Jansen endif 1479d714148SKenneth E. Jansen where(.not.btest(iBCBtp(:,1),2)) 1489d714148SKenneth E. Jansen BCBtp(:,3)=zero 1499d714148SKenneth E. Jansen BCBtp(:,4)=zero 1509d714148SKenneth E. Jansen BCBtp(:,5)=zero 1519d714148SKenneth E. Jansen endwhere 1529d714148SKenneth E. Jansen 1539d714148SKenneth E. Jansen do n=1,neltp,ibksz 1549d714148SKenneth E. Jansen nelblb=nelblb+1 1559d714148SKenneth E. Jansen npro= min(IBKSZ, neltp - n + 1) 1569d714148SKenneth E. Jansen lcblkb(1,nelblb) = iel 1579d714148SKenneth E. Jansen lcblkb(3,nelblb) = lcsyst 1589d714148SKenneth E. Jansen lcblkb(4,nelblb) = ipordl 1599d714148SKenneth E. Jansen lcblkb(5,nelblb) = nenl 1609d714148SKenneth E. Jansen lcblkb(6,nelblb) = nenbl 1619d714148SKenneth E. Jansen lcblkb(7,nelblb) = mattyp 1629d714148SKenneth E. Jansen lcblkb(8,nelblb) = ndofl 1639d714148SKenneth E. Jansen lcblkb(9,nelblb) = nshl 1649d714148SKenneth E. Jansen lcblkb(10,nelblb) = nshlb ! # of shape functions per elt 1659d714148SKenneth E. Jansenc 1669d714148SKenneth E. Jansenc.... save the element block 1679d714148SKenneth E. Jansenc 1689d714148SKenneth E. Jansen n1=n 1699d714148SKenneth E. Jansen n2=n+npro-1 1709d714148SKenneth E. Jansen materb=1 ! all one material for now 1719d714148SKenneth E. Jansenc 1729d714148SKenneth E. Jansenc.... allocate memory for stack arrays 1739d714148SKenneth E. Jansenc 1749d714148SKenneth E. Jansen allocate (mienb(nelblb)%p(npro,nshl)) 1759d714148SKenneth E. Jansen allocate (miBCB(nelblb)%p(npro,ndiBCB)) 1769d714148SKenneth E. Jansen allocate (mBCB(nelblb)%p(npro,nshlb,ndBCB)) 1779d714148SKenneth E. Jansen allocate (mmatb(nelblb)%p(npro)) 1789d714148SKenneth E. Jansenc 1799d714148SKenneth E. Jansenc.... save the boundary element block 1809d714148SKenneth E. Jansenc 1819d714148SKenneth E. Jansen call gensvb (ientp(n1:n2,1:nshl), 1829d714148SKenneth E. Jansen & iBCBtp(n1:n2,:), BCBtp(n1:n2,:), 1839d714148SKenneth E. Jansen & materb, mienb(nelblb)%p, 1849d714148SKenneth E. Jansen & miBCB(nelblb)%p, mBCB(nelblb)%p, 1859d714148SKenneth E. Jansen & mmatb(nelblb)%p) 1869d714148SKenneth E. Jansen iel=iel+npro 1879d714148SKenneth E. Jansen enddo 1889d714148SKenneth E. Jansen endif 1899d714148SKenneth E. Jansen deallocate(ientp) 1909d714148SKenneth E. Jansen deallocate(iBCBtp) 1919d714148SKenneth E. Jansen deallocate(BCBtp) 1929d714148SKenneth E. Jansen 1939d714148SKenneth E. Jansen enddo 1949d714148SKenneth E. Jansen lcblkb(1,nelblb+1) = iel 1959d714148SKenneth E. Jansen 1969d714148SKenneth E. Jansenc 1979d714148SKenneth E. Jansenc.... return 1989d714148SKenneth E. Jansenc 1999d714148SKenneth E. Jansen return 2009d714148SKenneth E. Jansenc 2019d714148SKenneth E. Jansenc.... end of file error handling 2029d714148SKenneth E. Jansenc 2039d714148SKenneth E. Jansen 911 call error ('genbcb ','end file',igeomBAK) 2049d714148SKenneth E. Jansenc 2059d714148SKenneth E. Jansen1000 format(a80,//, 2069d714148SKenneth 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',//, 2079d714148SKenneth E. Jansen & ' Elem BC codes',/, 2089d714148SKenneth E. Jansen & ' Number C P V H ',5x,27('Node',i1,:,2x)) 2099d714148SKenneth E. Jansen1100 format(2x,i5,2x,4i2,3x,27i7) 2109d714148SKenneth E. Jansenc$$$2000 format(a80,//, 2119d714148SKenneth E. Jansenc$$$ & ' B o u n d a r y E l e m e n t B C D a t a ',//, 2129d714148SKenneth E. Jansenc$$$ & ' Node ',3x,'mass',/, 2139d714148SKenneth E. Jansenc$$$ & ' Number ',3x,'flux',6x,'Pressure',6x,'Heat',6x, 2149d714148SKenneth E. Jansenc$$$ & 3('Viscous',i1,:,4x)) 2159d714148SKenneth E. Jansen2100 format(2x,i5,1p,1x,6e12.4) 2169d714148SKenneth E. Jansenc 2179d714148SKenneth E. Jansen end 2189d714148SKenneth E. Jansen 219