1*9d714148SKenneth E. Jansen subroutine genbkb (ibksz) 2*9d714148SKenneth E. Jansenc 3*9d714148SKenneth E. Jansenc---------------------------------------------------------------------- 4*9d714148SKenneth E. Jansenc 5*9d714148SKenneth E. Jansenc This routine reads the boundary elements, reorders them and 6*9d714148SKenneth E. Jansenc generates traces for the gather/scatter operations. 7*9d714148SKenneth E. Jansenc 8*9d714148SKenneth E. Jansenc Zdenek Johan, Fall 1991. 9*9d714148SKenneth E. Jansenc---------------------------------------------------------------------- 10*9d714148SKenneth E. Jansenc 11*9d714148SKenneth E. Jansen use dtnmod 12*9d714148SKenneth E. Jansen use pointer_data 13*9d714148SKenneth E. Jansenc 14*9d714148SKenneth E. Jansen include "common.h" 15*9d714148SKenneth E. Jansen include "mpif.h" !Required to determine the max for itpblk 16*9d714148SKenneth E. Jansenc 17*9d714148SKenneth E. Jansen 18*9d714148SKenneth E. Jansen integer, allocatable :: ientp(:,:),iBCBtp(:,:) 19*9d714148SKenneth E. Jansen real*8, allocatable :: BCBtp(:,:) 20*9d714148SKenneth E. Jansen integer materb(ibksz) 21*9d714148SKenneth E. Jansen integer intfromfile(50) ! integers read from headers 22*9d714148SKenneth E. Jansen character*255 fname1 23*9d714148SKenneth E. Jansen 24*9d714148SKenneth E. Jansencccccccccccccc New Phasta IO starts here cccccccccccccccccccccccccccccc 25*9d714148SKenneth E. Jansen 26*9d714148SKenneth E. Jansen integer :: descriptor, descriptorG, GPID, color, nfiles, nfields 27*9d714148SKenneth E. Jansen integer :: numparts, nppf, nppp, nprocs, writeLock 28*9d714148SKenneth E. Jansen integer :: ierr_io, numprocs, itmp, itmp2 29*9d714148SKenneth E. Jansen integer :: itpblktot,ierr 30*9d714148SKenneth E. Jansen 31*9d714148SKenneth E. Jansen character*255 fnamer, fname2, temp2 32*9d714148SKenneth E. Jansen character*64 temp1, temp3 33*9d714148SKenneth E. Jansen 34*9d714148SKenneth E. Jansen nfiles = nsynciofiles 35*9d714148SKenneth E. Jansen nfields = nsynciofieldsreadgeombc 36*9d714148SKenneth E. Jansen numparts = numpe !This is the common settings. Beware if you try to compute several parts per process 37*9d714148SKenneth E. Jansen 38*9d714148SKenneth E. Jansen nppp = numparts/numpe 39*9d714148SKenneth E. Jansen nppf = numparts/nfiles 40*9d714148SKenneth E. Jansen 41*9d714148SKenneth E. Jansen color = int(myrank/(numparts/nfiles)) 42*9d714148SKenneth E. Jansen itmp2 = int(log10(float(color+1)))+1 43*9d714148SKenneth E. Jansen write (temp2,"('(''geombc-dat.'',i',i1,')')") itmp2 44*9d714148SKenneth E. Jansen temp2=trim(temp2) 45*9d714148SKenneth E. Jansen write (fnamer,temp2) (color+1) 46*9d714148SKenneth E. Jansen fnamer=trim(fnamer) 47*9d714148SKenneth E. Jansen 48*9d714148SKenneth E. Jansen ione=1 49*9d714148SKenneth E. Jansen itwo=2 50*9d714148SKenneth E. Jansen ieight=8 51*9d714148SKenneth E. Jansen ieleven=11 52*9d714148SKenneth E. Jansen itmp = int(log10(float(myrank+1)))+1 53*9d714148SKenneth E. Jansen 54*9d714148SKenneth E. Jansen 55*9d714148SKenneth E. Jansencccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 56*9d714148SKenneth E. Jansen 57*9d714148SKenneth E. Jansen iel=1 58*9d714148SKenneth E. Jansen itpblk=nelblb 59*9d714148SKenneth E. Jansen 60*9d714148SKenneth E. Jansen 61*9d714148SKenneth E. Jansen!MR CHANGE 62*9d714148SKenneth E. Jansen ! Get the total number of different interior topologies in the whole domain. 63*9d714148SKenneth E. Jansen ! Try to read from a field. If the field does not exist, scan the geombc file. 64*9d714148SKenneth E. Jansen itpblktot=-1 65*9d714148SKenneth E. Jansen write(temp1, 66*9d714148SKenneth E. Jansen & "('(''total number of boundary tpblocks@'',i',i1,',A1)')") itmp 67*9d714148SKenneth E. Jansen write (fname2,temp1) (myrank+1),'?' 68*9d714148SKenneth E. Jansen call readheader(igeom,fname2 // char(0) ,itpblktot,ione, 69*9d714148SKenneth E. Jansen & 'integer' // char(0),iotype) 70*9d714148SKenneth E. Jansen 71*9d714148SKenneth E. Jansen! write (*,*) 'Rank: ',myrank,' boundary itpblktot intermediate:', 72*9d714148SKenneth E. Jansen! & itpblktot 73*9d714148SKenneth E. Jansen 74*9d714148SKenneth E. Jansen if (itpblktot == -1) then 75*9d714148SKenneth E. Jansen ! The field 'total number of different boundary tpblocks' was not found in the geombc file. 76*9d714148SKenneth E. Jansen ! Scan all the geombc file for the 'connectivity interior' fields to get this information. 77*9d714148SKenneth E. Jansen iblk=0 78*9d714148SKenneth E. Jansen neltp=0 79*9d714148SKenneth E. Jansen do while(neltp .ne. -1) 80*9d714148SKenneth E. Jansen 81*9d714148SKenneth E. Jansen ! intfromfile is reinitialized to -1 every time. 82*9d714148SKenneth E. Jansen ! If connectivity boundary@xxx is not found, then 83*9d714148SKenneth E. Jansen ! readheader will return intfromfile unchanged 84*9d714148SKenneth E. Jansen 85*9d714148SKenneth E. Jansen intfromfile(:)=-1 86*9d714148SKenneth E. Jansen iblk = iblk+1 87*9d714148SKenneth E. Jansen write (temp1,"('connectivity boundary',i1)") iblk 88*9d714148SKenneth E. Jansen temp1 = trim(temp1) 89*9d714148SKenneth E. Jansen write (temp3,"('(''@'',i',i1,',A1)')") itmp 90*9d714148SKenneth E. Jansen write (fname2, temp3) (myrank+1), '?' 91*9d714148SKenneth E. Jansen fname2 = trim(temp1)//trim(fname2) 92*9d714148SKenneth E. Jansen !write(*,*) 'rank, fname2',myrank, trim(adjustl(fname2)) 93*9d714148SKenneth E. Jansen call readheader(igeom,fname2 // char(0),intfromfile, 94*9d714148SKenneth E. Jansen & ieight,'integer' // char(0),iotype) 95*9d714148SKenneth E. Jansen neltp = intfromfile(1) ! -1 if fname2 was not found, >=0 otherwise 96*9d714148SKenneth E. Jansen end do 97*9d714148SKenneth E. Jansen itpblktot = iblk-1 98*9d714148SKenneth E. Jansen end if 99*9d714148SKenneth E. Jansen 100*9d714148SKenneth E. Jansen if (myrank == 0) then 101*9d714148SKenneth E. Jansen write(*,*) 'Number of boundary topologies: ',itpblktot 102*9d714148SKenneth E. Jansen endif 103*9d714148SKenneth E. Jansen! write (*,*) 'Rank: ',myrank,' boundary itpblktot final:', 104*9d714148SKenneth E. Jansen! & itpblktot 105*9d714148SKenneth E. Jansen 106*9d714148SKenneth E. Jansen nelblb=0 107*9d714148SKenneth E. Jansen mattyp=0 108*9d714148SKenneth E. Jansen ndofl = ndof 109*9d714148SKenneth E. Jansen do iblk = 1, itpblktot 110*9d714148SKenneth E. Jansen writeLock=0; 111*9d714148SKenneth E. Jansen 112*9d714148SKenneth E. Jansen fname1='connectivity boundary?' 113*9d714148SKenneth E. Jansen 114*9d714148SKenneth E. Jansen! print *, "Loop ",iblk, myrank, itpblk, trim(fnamer) 115*9d714148SKenneth E. Jansen 116*9d714148SKenneth E. Jansenccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 117*9d714148SKenneth E. Jansen 118*9d714148SKenneth E. Jansen write (temp1,"('connectivity boundary',i1)") iblk 119*9d714148SKenneth E. Jansen temp1 = trim(temp1) 120*9d714148SKenneth E. Jansen write (temp3,"('(''@'',i',i1,',A1)')") itmp 121*9d714148SKenneth E. Jansen write (fname2, temp3) (myrank+1), '?' 122*9d714148SKenneth E. Jansen fname2 = trim(temp1)//trim(fname2) 123*9d714148SKenneth E. Jansen fname2 = trim(fname2) 124*9d714148SKenneth E. Jansen 125*9d714148SKenneth E. Jansenccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 126*9d714148SKenneth E. Jansen 127*9d714148SKenneth E. Jansen ! Synchronization for performance monitoring, as some parts do not include some topologies 128*9d714148SKenneth E. Jansen call MPI_Barrier(MPI_COMM_WORLD,ierr) 129*9d714148SKenneth E. Jansen call readheader(igeom,fname2 // char(0),intfromfile,ieight, 130*9d714148SKenneth E. Jansen & 'integer' // char(0),iotype) 131*9d714148SKenneth E. Jansen neltp =intfromfile(1) 132*9d714148SKenneth E. Jansen nenl =intfromfile(2) 133*9d714148SKenneth E. Jansen ipordl=intfromfile(3) 134*9d714148SKenneth E. Jansen nshl =intfromfile(4) 135*9d714148SKenneth E. Jansen nshlb =intfromfile(5) 136*9d714148SKenneth E. Jansen nenbl =intfromfile(6) 137*9d714148SKenneth E. Jansen lcsyst=intfromfile(7) 138*9d714148SKenneth E. Jansen numnbc=intfromfile(8) 139*9d714148SKenneth E. Jansen 140*9d714148SKenneth E. Jansen allocate (ientp(neltp,nshl)) 141*9d714148SKenneth E. Jansen allocate (iBCBtp(neltp,ndiBCB)) 142*9d714148SKenneth E. Jansen allocate (BCBtp(neltp,ndBCB)) 143*9d714148SKenneth E. Jansen iientpsiz=neltp*nshl 144*9d714148SKenneth E. Jansen 145*9d714148SKenneth E. Jansen if (neltp==0) then 146*9d714148SKenneth E. Jansen writeLock=1; 147*9d714148SKenneth E. Jansen endif 148*9d714148SKenneth E. Jansen 149*9d714148SKenneth E. Jansen! print *, "neltp is ", neltp 150*9d714148SKenneth E. Jansen 151*9d714148SKenneth E. Jansen call readdatablock(igeom,fname2 // char(0),ientp,iientpsiz, 152*9d714148SKenneth E. Jansen & 'integer' // char(0),iotype) 153*9d714148SKenneth E. Jansen 154*9d714148SKenneth E. Jansen 155*9d714148SKenneth E. Jansenc 156*9d714148SKenneth E. Jansenc.... Read the boundary flux codes 157*9d714148SKenneth E. Jansenc 158*9d714148SKenneth E. Jansen 159*9d714148SKenneth E. Jansen 160*9d714148SKenneth E. Jansen 161*9d714148SKenneth E. Jansen fname1='nbc codes?' 162*9d714148SKenneth E. Jansen 163*9d714148SKenneth E. Jansenccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 164*9d714148SKenneth E. Jansen 165*9d714148SKenneth E. Jansen write (temp1,"('nbc codes',i1)") iblk 166*9d714148SKenneth E. Jansen temp1=trim(temp1) 167*9d714148SKenneth E. Jansen write (temp3,"('(''@'',i',i1,',A1)')") itmp 168*9d714148SKenneth E. Jansen write (fname2, temp3) (myrank+1), '?' 169*9d714148SKenneth E. Jansen fname2 = trim(temp1)//trim(fname2) 170*9d714148SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 171*9d714148SKenneth E. Jansen 172*9d714148SKenneth E. Jansenccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 173*9d714148SKenneth E. Jansen 174*9d714148SKenneth E. Jansen call readheader(igeom,fname2 // char(0) ,intfromfile, 175*9d714148SKenneth E. Jansen & ieight,'integer' // char(0),iotype) 176*9d714148SKenneth E. Jansen iiBCBtpsiz=neltp*ndiBCB 177*9d714148SKenneth E. Jansen call readdatablock(igeom,fname2 // char(0) ,iBCBtp, 178*9d714148SKenneth E. Jansen & iiBCBtpsiz,'integer' // char(0),iotype) 179*9d714148SKenneth E. Jansen 180*9d714148SKenneth E. Jansenc 181*9d714148SKenneth E. Jansenc.... read the boundary condition data 182*9d714148SKenneth E. Jansenc 183*9d714148SKenneth E. Jansen fname1='nbc values?' 184*9d714148SKenneth E. Jansen 185*9d714148SKenneth E. Jansenccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 186*9d714148SKenneth E. Jansen 187*9d714148SKenneth E. Jansen write (temp1,"('nbc values',i1)") iblk 188*9d714148SKenneth E. Jansen temp1=trim(temp1) 189*9d714148SKenneth E. Jansen write (temp3,"('(''@'',i',i1,',A1)')") itmp 190*9d714148SKenneth E. Jansen write (fname2, temp3) (myrank+1), '?' 191*9d714148SKenneth E. Jansen fname2 = trim(temp1)//trim(fname2) 192*9d714148SKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD, ierr) 193*9d714148SKenneth E. Jansenccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc 194*9d714148SKenneth E. Jansen 195*9d714148SKenneth E. Jansen call readheader(igeom,fname2 // char(0) ,intfromfile, 196*9d714148SKenneth E. Jansen & ieight,'integer' // char(0) ,iotype) 197*9d714148SKenneth E. Jansen BCBtp = zero 198*9d714148SKenneth E. Jansen iBCBtpsiz=neltp*ndBCB 199*9d714148SKenneth E. Jansen call readdatablock(igeom,fname2 // char(0),BCBtp,iBCBtpsiz, 200*9d714148SKenneth E. Jansen & 'double' // char(0) ,iotype) 201*9d714148SKenneth E. Jansen 202*9d714148SKenneth E. Jansen 203*9d714148SKenneth E. Jansenc 204*9d714148SKenneth E. Jansenc This is a temporary fix until NSpre properly zeros this array where it 205*9d714148SKenneth E. Jansenc is not set. DEC has indigestion with these arrays though the 206*9d714148SKenneth E. Jansenc result is never used (never effects solution). 207*9d714148SKenneth E. Jansenc 208*9d714148SKenneth E. Jansen 209*9d714148SKenneth E. Jansen 210*9d714148SKenneth E. Jansen if(writeLock==0) then 211*9d714148SKenneth E. Jansen where(.not.btest(iBCBtp(:,1),0)) BCBtp(:,1)=zero 212*9d714148SKenneth E. Jansen where(.not.btest(iBCBtp(:,1),1)) BCBtp(:,2)=zero 213*9d714148SKenneth E. Jansen where(.not.btest(iBCBtp(:,1),3)) BCBtp(:,6)=zero 214*9d714148SKenneth E. Jansen if(ndBCB.gt.6) then 215*9d714148SKenneth E. Jansen do i=6,ndof 216*9d714148SKenneth E. Jansen where(.not.btest(iBCBtp(:,1),i-1)) BCBtp(:,i+1)=zero 217*9d714148SKenneth E. Jansen enddo 218*9d714148SKenneth E. Jansen endif 219*9d714148SKenneth E. Jansen where(.not.btest(iBCBtp(:,1),2)) 220*9d714148SKenneth E. Jansen BCBtp(:,3)=zero 221*9d714148SKenneth E. Jansen BCBtp(:,4)=zero 222*9d714148SKenneth E. Jansen BCBtp(:,5)=zero 223*9d714148SKenneth E. Jansen endwhere 224*9d714148SKenneth E. Jansen 225*9d714148SKenneth E. Jansen do n=1,neltp,ibksz 226*9d714148SKenneth E. Jansen nelblb=nelblb+1 227*9d714148SKenneth E. Jansen npro= min(IBKSZ, neltp - n + 1) 228*9d714148SKenneth E. Jansenc 229*9d714148SKenneth E. Jansen lcblkb(1,nelblb) = iel 230*9d714148SKenneth E. Jansen lcblkb(3,nelblb) = lcsyst 231*9d714148SKenneth E. Jansen lcblkb(4,nelblb) = ipordl 232*9d714148SKenneth E. Jansen lcblkb(5,nelblb) = nenl 233*9d714148SKenneth E. Jansen lcblkb(6,nelblb) = nenbl 234*9d714148SKenneth E. Jansen lcblkb(7,nelblb) = mattyp 235*9d714148SKenneth E. Jansen lcblkb(8,nelblb) = ndofl 236*9d714148SKenneth E. Jansen lcblkb(9,nelblb) = nshl 237*9d714148SKenneth E. Jansen lcblkb(10,nelblb) = nshlb ! # of shape functions per elt 238*9d714148SKenneth E. Jansenc 239*9d714148SKenneth E. Jansenc.... save the element block 240*9d714148SKenneth E. Jansenc 241*9d714148SKenneth E. Jansen n1=n 242*9d714148SKenneth E. Jansen n2=n+npro-1 243*9d714148SKenneth E. Jansen materb=1 ! all one material for now 244*9d714148SKenneth E. Jansenc 245*9d714148SKenneth E. Jansenc.... allocate memory for stack arrays 246*9d714148SKenneth E. Jansenc 247*9d714148SKenneth E. Jansen 248*9d714148SKenneth E. Jansen allocate (mienb(nelblb)%p(npro,nshl)) 249*9d714148SKenneth E. Jansenc 250*9d714148SKenneth E. Jansen allocate (miBCB(nelblb)%p(npro,ndiBCB)) 251*9d714148SKenneth E. Jansenc 252*9d714148SKenneth E. Jansen allocate (mBCB(nelblb)%p(npro,nshlb,ndBCB)) 253*9d714148SKenneth E. Jansenc 254*9d714148SKenneth E. Jansen allocate (mmatb(nelblb)%p(npro)) 255*9d714148SKenneth E. Jansenc 256*9d714148SKenneth E. Jansenc.... save the boundary element block 257*9d714148SKenneth E. Jansenc 258*9d714148SKenneth E. Jansen call gensvb (ientp(n1:n2,1:nshl), 259*9d714148SKenneth E. Jansen & iBCBtp(n1:n2,:), BCBtp(n1:n2,:), 260*9d714148SKenneth E. Jansen & materb, mienb(nelblb)%p, 261*9d714148SKenneth E. Jansen & miBCB(nelblb)%p, mBCB(nelblb)%p, 262*9d714148SKenneth E. Jansen & mmatb(nelblb)%p) 263*9d714148SKenneth E. Jansenc 264*9d714148SKenneth E. Jansen iel=iel+npro 265*9d714148SKenneth E. Jansen enddo 266*9d714148SKenneth E. Jansen 267*9d714148SKenneth E. Jansen endif 268*9d714148SKenneth E. Jansen deallocate(ientp) 269*9d714148SKenneth E. Jansen deallocate(iBCBtp) 270*9d714148SKenneth E. Jansen deallocate(BCBtp) 271*9d714148SKenneth E. Jansen 272*9d714148SKenneth E. Jansen enddo 273*9d714148SKenneth E. Jansen lcblkb(1,nelblb+1) = iel 274*9d714148SKenneth E. Jansen 275*9d714148SKenneth E. Jansenc 276*9d714148SKenneth E. Jansenc.... return 277*9d714148SKenneth E. Jansenc 278*9d714148SKenneth E. Jansen return 279*9d714148SKenneth E. Jansenc 280*9d714148SKenneth E. Jansenc.... end of file error handling 281*9d714148SKenneth E. Jansenc 282*9d714148SKenneth E. Jansen 911 call error ('genbcb ','end file',igeomBAK) 283*9d714148SKenneth E. Jansenc 284*9d714148SKenneth E. Jansen1000 format(a80,//, 285*9d714148SKenneth 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',//, 286*9d714148SKenneth E. Jansen & ' Elem BC codes',/, 287*9d714148SKenneth E. Jansen & ' Number C P V H ',5x,27('Node',i1,:,2x)) 288*9d714148SKenneth E. Jansen1100 format(2x,i5,2x,4i2,3x,27i7) 289*9d714148SKenneth E. Jansenc$$$2000 format(a80,//, 290*9d714148SKenneth E. Jansenc$$$ & ' B o u n d a r y E l e m e n t B C D a t a ',//, 291*9d714148SKenneth E. Jansenc$$$ & ' Node ',3x,'mass',/, 292*9d714148SKenneth E. Jansenc$$$ & ' Number ',3x,'flux',6x,'Pressure',6x,'Heat',6x, 293*9d714148SKenneth E. Jansenc$$$ & 3('Viscous',i1,:,4x)) 294*9d714148SKenneth E. Jansen2100 format(2x,i5,1p,1x,6e12.4) 295*9d714148SKenneth E. Jansenc 296*9d714148SKenneth E. Jansen end 297*9d714148SKenneth E. Jansen 298