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