xref: /phasta/phSolver/common/genbkbSyncIO.f (revision ab5b07a458969128644e941ce150fa049270fdf1)
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