xref: /phasta/phSolver/incompressible/bflux.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen      subroutine Bflux ( y,          ac,        u,      x,
2*59599516SKenneth E. Jansen     &                   shp,       shgl,       shpb,
3*59599516SKenneth E. Jansen     &                   shglb,     ilwork,     iBC,
4*59599516SKenneth E. Jansen     &                   BC,        iper  ,     wallssVec)
5*59599516SKenneth E. Jansenc
6*59599516SKenneth E. Jansenc----------------------------------------------------------------------
7*59599516SKenneth E. Jansenc
8*59599516SKenneth E. Jansenc This routine :
9*59599516SKenneth E. Jansenc   1. computes the boundary fluxes
10*59599516SKenneth E. Jansenc   2. prints the results in the file [FLUX.lstep]
11*59599516SKenneth E. Jansenc
12*59599516SKenneth E. Jansenc output:
13*59599516SKenneth E. Jansenc  in file flux.<lstep>.n (similar to restart file):
14*59599516SKenneth E. Jansenc     machin  nshg  lstep
15*59599516SKenneth E. Jansenc     normal_1 ... normal_nsd            ! outward normal direction
16*59599516SKenneth E. Jansenc     tau_1n   ... tau_nsd n             ! boundary viscous flux
17*59599516SKenneth E. Jansenc
18*59599516SKenneth E. Jansenc Zdenek Johan, Summer 1991.
19*59599516SKenneth E. Jansenc----------------------------------------------------------------------
20*59599516SKenneth E. Jansenc
21*59599516SKenneth E. Jansen
22*59599516SKenneth E. Jansen      use pointer_data
23*59599516SKenneth E. Jansen
24*59599516SKenneth E. Jansen      include "common.h"
25*59599516SKenneth E. Jansen      include "mpif.h"
26*59599516SKenneth E. Jansen
27*59599516SKenneth E. Jansen      character*10  cname2
28*59599516SKenneth E. Jansen
29*59599516SKenneth E. Jansen      real*8    y(nshg,ndof),             ac(nshg,ndof),
30*59599516SKenneth E. Jansen     &          u(nshg,nsd),              x(numnp,nsd)
31*59599516SKenneth E. Jansen      dimension iBC(nshg),
32*59599516SKenneth E. Jansen     &            BC(nshg,ndofBC),
33*59599516SKenneth E. Jansen     &            iper(nshg)
34*59599516SKenneth E. Jansen
35*59599516SKenneth E. Jansen      real*8    shp(MAXTOP,maxsh,MAXQPT),
36*59599516SKenneth E. Jansen     &          shgl(MAXTOP,nsd,maxsh,MAXQPT),
37*59599516SKenneth E. Jansen     &          shpb(MAXTOP,maxsh,MAXQPT),
38*59599516SKenneth E. Jansen     &          shglb(MAXTOP,nsd,maxsh,MAXQPT)
39*59599516SKenneth E. Jansenc
40*59599516SKenneth E. Jansenc
41*59599516SKenneth E. Jansen      real*8    flxres(nshg,nflow),
42*59599516SKenneth E. Jansen     &          flxLHS(nshg,1),           flxnrm(nshg,nsd),
43*59599516SKenneth E. Jansen     &          temp(nshg),               rtmp(nshg,ndof),
44*59599516SKenneth E. Jansen     &          flxTot(nflow),            wallssVec(nshg,3)
45*59599516SKenneth E. Jansen
46*59599516SKenneth E. Jansen      real*8    qres(nshg,nsd*nsd)
47*59599516SKenneth E. Jansen
48*59599516SKenneth E. Jansenc
49*59599516SKenneth E. Jansen      integer   ilwork(nlwork),
50*59599516SKenneth E. Jansen     &          invflx(nshg),             nodflx(nshg)
51*59599516SKenneth E. Jansenc
52*59599516SKenneth E. Jansen      character*60 fname1,  fmt1, fmt2, fnamer, fname2
53*59599516SKenneth E. Jansen      character*13 fieldbflux
54*59599516SKenneth E. Jansen      character*19 fieldwss
55*59599516SKenneth E. Jansen      integer irstin, isize, nitems, ndofwss
56*59599516SKenneth E. Jansen      integer iarray(50)  ! integers read from headers
57*59599516SKenneth E. Jansen
58*59599516SKenneth E. Jansen      real*8, allocatable, dimension(:,:,:,:) :: xKebe, xGoC
59*59599516SKenneth E. Jansen      integer, allocatable, dimension(:,:)    :: ien2
60*59599516SKenneth E. Jansen      integer, allocatable, dimension(:)      :: map
61*59599516SKenneth E. Jansen      real*8, allocatable, dimension(:,:)     :: xmu2
62*59599516SKenneth E. Jansenc
63*59599516SKenneth E. Jansenc....  calculate the flux nodes
64*59599516SKenneth E. Jansenc
65*59599516SKenneth E. Jansen      numflx  = 0
66*59599516SKenneth E. Jansen      invflx  = 0
67*59599516SKenneth E. Jansen      nodflx  = 0
68*59599516SKenneth E. Jansen      do iblk = 1, nelblb
69*59599516SKenneth E. Jansen         iel    = lcblkb(1,iblk)
70*59599516SKenneth E. Jansen         lcsyst = lcblkb(3,iblk)
71*59599516SKenneth E. Jansen         nenl   = lcblkb(5,iblk)
72*59599516SKenneth E. Jansen         nenbl  = lcblkb(6,iblk)
73*59599516SKenneth E. Jansen         ndofl  = lcblkb(8,iblk)
74*59599516SKenneth E. Jansen         nshl   = lcblkb(9,iblk)
75*59599516SKenneth E. Jansen         nshlb  = lcblkb(10,iblk)
76*59599516SKenneth E. Jansen         npro   = lcblkb(1,iblk+1) - iel
77*59599516SKenneth E. Jansen         call flxNode (mienb(iblk)%p,   miBCB(iblk)%p,  invflx)
78*59599516SKenneth E. Jansen      enddo
79*59599516SKenneth E. Jansenc      do i = 1, nshg
80*59599516SKenneth E. Jansen      do i = 1, numnp
81*59599516SKenneth E. Jansen         if (invflx(i) .ne. 0) then
82*59599516SKenneth E. Jansen            numflx = numflx + 1
83*59599516SKenneth E. Jansen            nodflx(numflx) = i
84*59599516SKenneth E. Jansen         endif
85*59599516SKenneth E. Jansen      enddo
86*59599516SKenneth E. Jansenc
87*59599516SKenneth E. Jansenc.... -------------------->   interior elements   <--------------------
88*59599516SKenneth E. Jansenc
89*59599516SKenneth E. Jansenc.... initialize the arrays
90*59599516SKenneth E. Jansenc
91*59599516SKenneth E. Jansen      flxres = zero
92*59599516SKenneth E. Jansen      flxLHS = zero
93*59599516SKenneth E. Jansen      flxnrm = zero
94*59599516SKenneth E. Jansen      if (numflx .ne. 0)  then !we have flux nodes
95*59599516SKenneth E. Jansen      qres   = zero
96*59599516SKenneth E. Jansenc
97*59599516SKenneth E. Jansenc.... loop over the element-blocks
98*59599516SKenneth E. Jansenc
99*59599516SKenneth E. Jansen      lhs    = 0
100*59599516SKenneth E. Jansen
101*59599516SKenneth E. Jansen      ires=2  ! shield e3ql from an unmapped lmassinv
102*59599516SKenneth E. Jansen      ierrcalcsave=ierrcalc
103*59599516SKenneth E. Jansen      ierrcalc=0
104*59599516SKenneth E. Jansen      do iblk = 1, nelblk
105*59599516SKenneth E. Jansenc
106*59599516SKenneth E. Jansenc.... set up the parameters
107*59599516SKenneth E. Jansenc
108*59599516SKenneth E. Jansen         iel    = lcblk(1,iblk)
109*59599516SKenneth E. Jansen         nenl   = lcblk(5,iblk) ! no. of vertices per element
110*59599516SKenneth E. Jansen         nshl   = lcblk(10,iblk)
111*59599516SKenneth E. Jansen         ndofl  = lcblk(8,iblk)
112*59599516SKenneth E. Jansen         lcsyst = lcblk(3,iblk)
113*59599516SKenneth E. Jansen         npro   = lcblk(1,iblk+1) - iel
114*59599516SKenneth E. Jansen         ngauss = nint(lcsyst)
115*59599516SKenneth E. Jansen         allocate ( ien2(npro,nshl) )
116*59599516SKenneth E. Jansen         allocate ( xmu2(npro,maxsh))
117*59599516SKenneth E. Jansen         allocate ( map(npro) )
118*59599516SKenneth E. Jansenc
119*59599516SKenneth E. Jansenc.... get the elements touching the boundary
120*59599516SKenneth E. Jansenc
121*59599516SKenneth E. Jansen         call mapConn( mien(iblk)%p,    ien2,    invflx,
122*59599516SKenneth E. Jansen     &                 map,             nshl,    npro,
123*59599516SKenneth E. Jansen     &                 npro2,           nshg )
124*59599516SKenneth E. Jansen
125*59599516SKenneth E. Jansen         nprold = npro
126*59599516SKenneth E. Jansen         npro = npro2
127*59599516SKenneth E. Jansen
128*59599516SKenneth E. Jansen         if (npro .ne. 0) then
129*59599516SKenneth E. Jansen
130*59599516SKenneth E. Jansen            call mapArray( mxmudmi(iblk)%p, xmu2,    map,
131*59599516SKenneth E. Jansen     &                     maxsh,           nprold)
132*59599516SKenneth E. Jansenc
133*59599516SKenneth E. Jansenc.... allocate the element matrices (though they're not needed)
134*59599516SKenneth E. Jansenc
135*59599516SKenneth E. Jansen            allocate ( xKebe(npro,9,nshl,nshl) )
136*59599516SKenneth E. Jansen            allocate ( xGoC (npro,4,nshl,nshl) )
137*59599516SKenneth E. Jansenc
138*59599516SKenneth E. Jansenc.... compute and assemble the residuals
139*59599516SKenneth E. Jansenc
140*59599516SKenneth E. Jansen            call AsIGMR (y,                    ac,
141*59599516SKenneth E. Jansen     &                   x,                    xmu2(1:npro,:),
142*59599516SKenneth E. Jansen     &                   shp(lcsyst,1:nshl,:),
143*59599516SKenneth E. Jansen     &                   shgl(lcsyst,:,1:nshl,:),
144*59599516SKenneth E. Jansen     &                   ien2(1:npro,:),
145*59599516SKenneth E. Jansen     &                   flxres,               qres,
146*59599516SKenneth E. Jansen     &                   xKebe,                xGoC,
147*59599516SKenneth E. Jansen     &                   rtmp)
148*59599516SKenneth E. Jansenc
149*59599516SKenneth E. Jansen            deallocate ( xKebe )
150*59599516SKenneth E. Jansen            deallocate ( xGoC  )
151*59599516SKenneth E. Jansen         endif
152*59599516SKenneth E. Jansen         deallocate ( ien2  )
153*59599516SKenneth E. Jansen         deallocate ( xmu2  )
154*59599516SKenneth E. Jansen         deallocate ( map   )
155*59599516SKenneth E. Jansenc
156*59599516SKenneth E. Jansen      enddo
157*59599516SKenneth E. Jansen      ierrcalc=ierrcalcsave
158*59599516SKenneth E. Jansenc
159*59599516SKenneth E. Jansenc.... -------------------->   boundary elements   <--------------------
160*59599516SKenneth E. Jansenc
161*59599516SKenneth E. Jansen      do iblk = 1, nelblb
162*59599516SKenneth E. Jansenc
163*59599516SKenneth E. Jansenc.... set up the parameters
164*59599516SKenneth E. Jansenc
165*59599516SKenneth E. Jansen         iel    = lcblkb(1,iblk)
166*59599516SKenneth E. Jansen         lcsyst = lcblkb(3,iblk)
167*59599516SKenneth E. Jansen         nenl   = lcblkb(5,iblk)
168*59599516SKenneth E. Jansen         nshl   = lcblkb(9,iblk)
169*59599516SKenneth E. Jansen         nenbl  = lcblkb(6,iblk)
170*59599516SKenneth E. Jansen         nshlb  = lcblkb(10,iblk)
171*59599516SKenneth E. Jansen         npro   = lcblkb(1,iblk+1) - iel
172*59599516SKenneth E. Jansen
173*59599516SKenneth E. Jansen         if(lcsyst.eq.3) lcsyst=nenbl
174*59599516SKenneth E. Jansenc
175*59599516SKenneth E. Jansen         if(lcsyst.eq.3 .or. lcsyst.eq.4) then
176*59599516SKenneth E. Jansen            ngaussb = nintb(lcsyst)
177*59599516SKenneth E. Jansen         else
178*59599516SKenneth E. Jansen            ngaussb = nintb(lcsyst)
179*59599516SKenneth E. Jansen         endif
180*59599516SKenneth E. Jansenc
181*59599516SKenneth E. Jansenc.... allocate the element matrices (though they're not needed)
182*59599516SKenneth E. Jansenc
183*59599516SKenneth E. Jansen            allocate ( xKebe(npro,9,nshl,nshl) )
184*59599516SKenneth E. Jansenc.... compute and assemble the residuals
185*59599516SKenneth E. Jansenc
186*59599516SKenneth E. Jansen         call AsBFlx (u,                      y,
187*59599516SKenneth E. Jansen     &                ac,                     x,
188*59599516SKenneth E. Jansen     &                shpb(lcsyst,1:nshl,:),
189*59599516SKenneth E. Jansen     &                shglb(lcsyst,:,1:nshl,:),
190*59599516SKenneth E. Jansen     &                mienb(iblk)%p,
191*59599516SKenneth E. Jansen     &                miBCB(iblk)%p,           mBCB(iblk)%p,
192*59599516SKenneth E. Jansen     &                invflx,                  flxres,
193*59599516SKenneth E. Jansen     &                flxLHS,                  flxnrm,
194*59599516SKenneth E. Jansen     &                xKebe  )
195*59599516SKenneth E. Jansenc
196*59599516SKenneth E. Jansen            deallocate ( xKebe )
197*59599516SKenneth E. Jansenc
198*59599516SKenneth E. Jansenc.... end of boundary element loop
199*59599516SKenneth E. Jansenc
200*59599516SKenneth E. Jansen      enddo
201*59599516SKenneth E. Jansenc.... Communication needed before we take care of periodicity and
202*59599516SKenneth E. Jansenc     division of RHS by LHS ???
203*59599516SKenneth E. Jansenc
204*59599516SKenneth E. Jansen      if(numpe > 1) then
205*59599516SKenneth E. Jansen         call commu (flxres, ilwork, nflow, 'in ')
206*59599516SKenneth E. Jansen         call commu (flxLHS, ilwork, 1   , 'in ')
207*59599516SKenneth E. Jansen         call commu (flxnrm, ilwork, nsd , 'in ')
208*59599516SKenneth E. Jansen      endif
209*59599516SKenneth E. Jansenc
210*59599516SKenneth E. Jansenc  take care of periodic boundary conditions
211*59599516SKenneth E. Jansenc
212*59599516SKenneth E. Jansen        do j= 1,nshg
213*59599516SKenneth E. Jansen          if ((btest(iBC(j),10))) then
214*59599516SKenneth E. Jansen             i = iper(j)
215*59599516SKenneth E. Jansen             flxLHS(i,1) = flxLHS(i,1) + flxLHS(j,1)
216*59599516SKenneth E. Jansen             flxres(i,:) =  flxres(i,:) + flxres(j,:)
217*59599516SKenneth E. Jansen          endif
218*59599516SKenneth E. Jansen        enddo
219*59599516SKenneth E. Jansen
220*59599516SKenneth E. Jansen        do j= 1,nshg
221*59599516SKenneth E. Jansen          if ((btest(iBC(j),10))) then
222*59599516SKenneth E. Jansen            i = iper(j)
223*59599516SKenneth E. Jansen            flxLHS(j,1) = flxLHS(i,1)
224*59599516SKenneth E. Jansen            flxres(j,:) = flxres(i,:)
225*59599516SKenneth E. Jansen          endif
226*59599516SKenneth E. Jansen        enddo
227*59599516SKenneth E. Jansenc
228*59599516SKenneth E. Jansenc        call bc3per(iBC,  flxres, iper, ilwork, nflow)
229*59599516SKenneth E. Jansen
230*59599516SKenneth E. Jansenc
231*59599516SKenneth E. Jansenc.... integrated fluxes (aerodynamic forces update)
232*59599516SKenneth E. Jansenc
233*59599516SKenneth E. Jansen        flxTot = zero
234*59599516SKenneth E. Jansen        do n = 1, numflx
235*59599516SKenneth E. Jansen           flxTot = flxTot + flxres(nodflx(n),:)
236*59599516SKenneth E. Jansen        enddo
237*59599516SKenneth E. Jansen        Force(1) = flxTot(1)
238*59599516SKenneth E. Jansen        Force(2) = flxTot(2)
239*59599516SKenneth E. Jansen        Force(3) = flxTot(3)
240*59599516SKenneth E. Jansen      else
241*59599516SKenneth E. Jansenc       need to call commu for procs. with no flux nodes
242*59599516SKenneth E. Jansen        if(numpe > 1) then
243*59599516SKenneth E. Jansen           call commu (flxres, ilwork, nflow, 'in ')
244*59599516SKenneth E. Jansen           call commu (flxLHS, ilwork, 1   , 'in ')
245*59599516SKenneth E. Jansen           call commu (flxnrm, ilwork, nsd , 'in ')
246*59599516SKenneth E. Jansen        endif
247*59599516SKenneth E. Jansen      endif  ! make sure the zero numflux processors still commu
248*59599516SKenneth E. Jansenc
249*59599516SKenneth E. Jansenc.... only need to commu if we are going to print surface flux (or compute avg) since
250*59599516SKenneth E. Jansenc     the force calculation just sums flxres (and each on processor node
251*59599516SKenneth E. Jansenc     has his "piece" of the sum already).
252*59599516SKenneth E. Jansenc
253*59599516SKenneth E. Jansen      ntoutv=ntout
254*59599516SKenneth E. Jansen      if ((irs .ge. 1) .and. (mod(lstep, ntoutv) .eq. 0) .or.
255*59599516SKenneth E. Jansen     &     istep .eq. nstep(itseq) .or. ioybar == 1) then
256*59599516SKenneth E. Jansen
257*59599516SKenneth E. Jansen
258*59599516SKenneth E. Jansenc
259*59599516SKenneth E. Jansenc  need to zero the slaves to prevent counting twice
260*59599516SKenneth E. Jansenc  (actually unnecessary since flxres of boundary nodes will be counted n
261*59599516SKenneth E. Jansenc  times while flxlhs will be counted n times-> the ratio is still
262*59599516SKenneth E. Jansenc  correct
263*59599516SKenneth E. Jansenc
264*59599516SKenneth E. Jansen
265*59599516SKenneth E. Jansen      ndofwss = 3;
266*59599516SKenneth E. Jansen      wallssVec=rtmp(:,1:ndofwss)
267*59599516SKenneth E. Jansen
268*59599516SKenneth E. Jansen      if (numflx .eq. 0) then   !no flux nodes
269*59599516SKenneth E. Jansen         rtmp=zero
270*59599516SKenneth E. Jansen         wallssVec = zero
271*59599516SKenneth E. Jansen
272*59599516SKenneth E. Jansenc        need to call commu for procs. with no flux nodes
273*59599516SKenneth E. Jansen         if(numpe > 1) then
274*59599516SKenneth E. Jansen            call commu (flxres, ilwork, nflow, 'out')
275*59599516SKenneth E. Jansen            call commu (flxLHS, ilwork, 1   , 'out')
276*59599516SKenneth E. Jansen            call commu (flxnrm, ilwork, nsd , 'out')
277*59599516SKenneth E. Jansen         endif
278*59599516SKenneth E. Jansen      else
279*59599516SKenneth E. Jansenc
280*59599516SKenneth E. Jansenc.... ---------------------------->  Solve  <---------------------------
281*59599516SKenneth E. Jansenc
282*59599516SKenneth E. Jansenc.... compute the viscous and heat fluxes
283*59599516SKenneth E. Jansenc
284*59599516SKenneth E. Jansenc
285*59599516SKenneth E. Jansenc.... ---------------------------->  Print  <---------------------------
286*59599516SKenneth E. Jansenc
287*59599516SKenneth E. Jansenc.... nodal fluxes
288*59599516SKenneth E. Jansenc
289*59599516SKenneth E. Jansen      do i = 1, 3
290*59599516SKenneth E. Jansen         where ( (invflx .ne. 0) .and. (flxLHS(:,1) .ne. zero) )
291*59599516SKenneth E. Jansen     &        flxres(:,i) = flxres(:,i) / flxLHS(:,1)
292*59599516SKenneth E. Jansen      enddo
293*59599516SKenneth E. Jansenc
294*59599516SKenneth E. Jansenc.... normalize the outward normal
295*59599516SKenneth E. Jansenc
296*59599516SKenneth E. Jansen      temp = sqrt(flxnrm(:,1)**2 + flxnrm(:,2)**2 + flxnrm(:,3)**2)
297*59599516SKenneth E. Jansen      where ( (invflx .ne. 0) .and. (temp .ne. zero) )
298*59599516SKenneth E. Jansen         flxnrm(:,1) = flxnrm(:,1) / temp
299*59599516SKenneth E. Jansen         flxnrm(:,2) = flxnrm(:,2) / temp
300*59599516SKenneth E. Jansen         flxnrm(:,3) = flxnrm(:,3) / temp
301*59599516SKenneth E. Jansen      endwhere
302*59599516SKenneth E. Jansen
303*59599516SKenneth E. Jansenc
304*59599516SKenneth E. Jansenc.... ---------------------------->  Communications <-------------------
305*59599516SKenneth E. Jansenc
306*59599516SKenneth E. Jansen      if(numpe > 1) then
307*59599516SKenneth E. Jansen         call commu (flxres, ilwork, nflow, 'out')
308*59599516SKenneth E. Jansen         call commu (flxLHS, ilwork, 1   , 'out')
309*59599516SKenneth E. Jansen         call commu (flxnrm, ilwork, nsd , 'out')
310*59599516SKenneth E. Jansen      endif
311*59599516SKenneth E. Jansenc
312*59599516SKenneth E. Jansen
313*59599516SKenneth E. Jansen         rtmp = zero
314*59599516SKenneth E. Jansen         wallssVec  = zero
315*59599516SKenneth E. Jansen
316*59599516SKenneth E. Jansen         do i=1, numnp
317*59599516SKenneth E. Jansen            if (invflx(i) .ne. 0) then
318*59599516SKenneth E. Jansen               rtmp(i,2:4) = flxres(i,1:3) !viscous flux
319*59599516SKenneth E. Jansenc     calculate the WSS
320*59599516SKenneth E. Jansen               tn=    flxres(i,1) * flxnrm(i,1)
321*59599516SKenneth E. Jansen     &              + flxres(i,2) * flxnrm(i,2)
322*59599516SKenneth E. Jansen     &              + flxres(i,3) * flxnrm(i,3)
323*59599516SKenneth E. Jansen
324*59599516SKenneth E. Jansen               wallssVec(i,1) = flxres(i,1) - tn * flxnrm(i,1)
325*59599516SKenneth E. Jansen               wallssVec(i,2) = flxres(i,2) - tn * flxnrm(i,2)
326*59599516SKenneth E. Jansen               wallssVec(i,3) = flxres(i,3) - tn * flxnrm(i,3)
327*59599516SKenneth E. Jansen
328*59599516SKenneth E. Jansen            endif
329*59599516SKenneth E. Jansen         enddo
330*59599516SKenneth E. Jansen      endif
331*59599516SKenneth E. Jansencc      itmp = 1
332*59599516SKenneth E. Jansencc      if (lstep .gt. 0) itmp = int(log10(float(lstep)))+1
333*59599516SKenneth E. Jansencc      write (fmt1,"('(''flux.'',i',i1,',1x)')") itmp
334*59599516SKenneth E. Jansencc      write (fname1,fmt1) lstep
335*59599516SKenneth E. Jansen
336*59599516SKenneth E. Jansencc         fname1 = trim(fname1) // cname2(myrank+1)
337*59599516SKenneth E. Jansen
338*59599516SKenneth E. Jansencc      open (unit=iflux, file=fname1, status='unknown',
339*59599516SKenneth E. Jansencc     &         form='formatted',err=997)
340*59599516SKenneth E. Jansen
341*59599516SKenneth E. Jansenc      write (iflux) machin, nshg, lstep
342*59599516SKenneth E. Jansenc      write (iflux) rtmp(:,1:6)
343*59599516SKenneth E. Jansenc
344*59599516SKenneth E. Jansenc.... output the results
345*59599516SKenneth E. Jansenc
346*59599516SKenneth E. Jansencc         do n = 1, numflx
347*59599516SKenneth E. Jansencc            k = nodflx(n)
348*59599516SKenneth E. Jansencc            write (iflux,2000) k,invflx(k),flxLHS(k,1),(x(k,i),i=1,3),
349*59599516SKenneth E. Jansencc     &           (flxnrm(k,i),  i=1,3),
350*59599516SKenneth E. Jansencc     &           (flxres(k,i),  i=1,3)
351*59599516SKenneth E. Jansencc         enddo
352*59599516SKenneth E. Jansencc         close (iflux)
353*59599516SKenneth E. Jansenc... output the results in the new format in restart.step#.proc# file
354*59599516SKenneth E. Jansen
355*59599516SKenneth E. Jansencc         itmp = 1
356*59599516SKenneth E. Jansencc         if (lstep .gt. 0) itmp = int(log10(float(lstep)))+1
357*59599516SKenneth E. Jansencc         write (fmt2,"('(''restart.'',i',i1,',1x)')") itmp
358*59599516SKenneth E. Jansencc         write (fname2,fmt2) lstep
359*59599516SKenneth E. Jansen
360*59599516SKenneth E. Jansencc         fname2 = trim(fname2) // cname2(myrank+1)
361*59599516SKenneth E. Jansenc
362*59599516SKenneth E. Jansenc.... open input files
363*59599516SKenneth E. Jansenc
364*59599516SKenneth E. Jansencc         call openfile(  fname2,  'append?', irstin )
365*59599516SKenneth E. Jansen
366*59599516SKenneth E. Jansencc         fieldbflux = 'boundary flux'
367*59599516SKenneth E. Jansencc         isize = nshg*ndof
368*59599516SKenneth E. Jansencc         nitems = 3;
369*59599516SKenneth E. Jansencc         iarray(1) = nshg
370*59599516SKenneth E. Jansencc         iarray(2) = ndof
371*59599516SKenneth E. Jansencc         iarray(3) = lstep
372*59599516SKenneth E. Jansencc         call writeheader(irstin, fieldbflux,iarray, nitems, isize,
373*59599516SKenneth E. Jansencc     &        'double', iotype )
374*59599516SKenneth E. Jansen
375*59599516SKenneth E. Jansenc         fieldbflux = 'boundary flux'
376*59599516SKenneth E. Jansencc         nitems = nshg*ndof
377*59599516SKenneth E. Jansencc         call writedatablock(irstin, fieldbflux,rtmp, nitems,
378*59599516SKenneth E. Jansencc     &        'double', iotype)
379*59599516SKenneth E. Jansen
380*59599516SKenneth E. Jansencc         call closefile( irstin, "append" )
381*59599516SKenneth E. Jansenc         call Write_boundaryflux(myrank,lstep,nshg,ndof,rtmp(:,1:ndof))
382*59599516SKenneth E. Jansen
383*59599516SKenneth E. Jansenc     wallss vectors into the restart file(s)
384*59599516SKenneth E. Jansen
385*59599516SKenneth E. Jansen        ntoutv=ntout
386*59599516SKenneth E. Jansen        if ((irs .ge. 1) .and. (mod(lstep, ntoutv) .eq. 0) .or.
387*59599516SKenneth E. Jansen     &       istep .eq. nstep(itseq) ) then
388*59599516SKenneth E. Jansen
389*59599516SKenneth E. Jansen            call write_field(myrank,'a','wss',3,
390*59599516SKenneth E. Jansen     &                       wallssVec,'d',nshg,ndofwss,lstep)
391*59599516SKenneth E. Jansen         endif
392*59599516SKenneth E. Jansen
393*59599516SKenneth E. Jansen      endif
394*59599516SKenneth E. Jansenc
395*59599516SKenneth E. Jansen      return
396*59599516SKenneth E. Jansenc
397*59599516SKenneth E. Jansenc.... file error handling
398*59599516SKenneth E. Jansenc
399*59599516SKenneth E. Jansen997     call error ('bflux   ','opening ', iflux)
400*59599516SKenneth E. Jansenc
401*59599516SKenneth E. Jansenc$$$1000    format(' ',a80,/,1x,i10,1p,3e20.7)
402*59599516SKenneth E. Jansen 2000   format(i6,i6,10(2x,E12.5e2))
403*59599516SKenneth E. Jansenc$$$2001    format(1p,1x,i6,3e15.7)
404*59599516SKenneth E. Jansenc
405*59599516SKenneth E. Jansenc.... end
406*59599516SKenneth E. Jansenc
407*59599516SKenneth E. Jansen        end
408*59599516SKenneth E. Jansen
409*59599516SKenneth E. Jansen
410*59599516SKenneth E. Jansen      subroutine flxNode(ienb, iBCB, flg)
411*59599516SKenneth E. Jansenc---------------------------------------------------------------------
412*59599516SKenneth E. Jansenc
413*59599516SKenneth E. Jansenc     This routine flags the flux nodes
414*59599516SKenneth E. Jansenc
415*59599516SKenneth E. Jansenc----------------------------------------------------------------------
416*59599516SKenneth E. Jansen      include "common.h"
417*59599516SKenneth E. Jansenc
418*59599516SKenneth E. Jansen      integer   flg(nshg),        iBCB(npro,ndiBCB),
419*59599516SKenneth E. Jansen     &          ienb(npro, nshl), lnode(27)
420*59599516SKenneth E. Jansen
421*59599516SKenneth E. Jansenc
422*59599516SKenneth E. Jansenc.... compute the nodes which lie on the boundary (hierarchic)
423*59599516SKenneth E. Jansenc
424*59599516SKenneth E. Jansen      call getbnodes(lnode)
425*59599516SKenneth E. Jansen
426*59599516SKenneth E. Jansen      do i=1, npro
427*59599516SKenneth E. Jansen         if (nsrflist(iBCB(i,2)).eq.1) then
428*59599516SKenneth E. Jansen            do j=1, nshlb
429*59599516SKenneth E. Jansen               nodelcl = lnode(j)
430*59599516SKenneth E. Jansen               flg(abs(ienb(i,nodelcl)))=flg(abs(ienb(i,nodelcl)))+1
431*59599516SKenneth E. Jansen            enddo
432*59599516SKenneth E. Jansen         endif
433*59599516SKenneth E. Jansen      enddo
434*59599516SKenneth E. Jansenc
435*59599516SKenneth E. Jansen      return
436*59599516SKenneth E. Jansen      end
437*59599516SKenneth E. Jansen
438*59599516SKenneth E. Jansen
439*59599516SKenneth E. Jansen      subroutine mapConn( ien,      ien2,    mask,
440*59599516SKenneth E. Jansen     &                    map,      nshl,    npro,
441*59599516SKenneth E. Jansen     &                    npro2,    nshg )
442*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
443*59599516SKenneth E. Jansenc
444*59599516SKenneth E. Jansenc  Create a condensed connectivity array based on the nodes in
445*59599516SKenneth E. Jansenc  mask.
446*59599516SKenneth E. Jansenc
447*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
448*59599516SKenneth E. Jansen
449*59599516SKenneth E. Jansen      integer ien(npro,nshl),  ien2(npro,nshl), mask(nshg),
450*59599516SKenneth E. Jansen     &        map(npro)
451*59599516SKenneth E. Jansen
452*59599516SKenneth E. Jansen      integer nshl, nshg, npro, npro2, i, iel
453*59599516SKenneth E. Jansen
454*59599516SKenneth E. Jansenc
455*59599516SKenneth E. Jansenc.... first build the map
456*59599516SKenneth E. Jansenc
457*59599516SKenneth E. Jansen      map = 0
458*59599516SKenneth E. Jansen      do i = 1, nshl
459*59599516SKenneth E. Jansen         do iel = 1, npro
460*59599516SKenneth E. Jansen            map(iel) = map(iel) + mask( abs(ien(iel,i)) )
461*59599516SKenneth E. Jansen         enddo
462*59599516SKenneth E. Jansen      enddo
463*59599516SKenneth E. Jansen
464*59599516SKenneth E. Jansen      npro2 = 0
465*59599516SKenneth E. Jansen      do iel = 1, npro
466*59599516SKenneth E. Jansen         if ( map(iel) .gt. 0 ) then
467*59599516SKenneth E. Jansen            npro2 = npro2 + 1
468*59599516SKenneth E. Jansen            map(iel) = npro2
469*59599516SKenneth E. Jansen         else
470*59599516SKenneth E. Jansen            map(iel) = npro
471*59599516SKenneth E. Jansen         endif
472*59599516SKenneth E. Jansen      enddo
473*59599516SKenneth E. Jansenc
474*59599516SKenneth E. Jansenc.... create the condensed connectivity array
475*59599516SKenneth E. Jansenc
476*59599516SKenneth E. Jansen      if ( npro2 .gt. 0 ) then
477*59599516SKenneth E. Jansen         do i = 1, nshl
478*59599516SKenneth E. Jansen            do iel = 1, npro
479*59599516SKenneth E. Jansen               ien2(map(iel),i) = ien(iel,i)
480*59599516SKenneth E. Jansen            enddo
481*59599516SKenneth E. Jansen         enddo
482*59599516SKenneth E. Jansen      endif
483*59599516SKenneth E. Jansen
484*59599516SKenneth E. Jansen      return
485*59599516SKenneth E. Jansen      end
486*59599516SKenneth E. Jansen
487*59599516SKenneth E. Jansen
488*59599516SKenneth E. Jansen      subroutine mapArray( x,      x2,      map,
489*59599516SKenneth E. Jansen     &                     nshl,   nprold)
490*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
491*59599516SKenneth E. Jansenc
492*59599516SKenneth E. Jansenc  Maps array x into array x2 based on the given map
493*59599516SKenneth E. Jansenc
494*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
495*59599516SKenneth E. Jansen      real*8   x(nprold,nshl),    x2(nprold,nshl)
496*59599516SKenneth E. Jansen
497*59599516SKenneth E. Jansen      integer  map(nprold)
498*59599516SKenneth E. Jansen
499*59599516SKenneth E. Jansen      integer   nprold, nshl,  i
500*59599516SKenneth E. Jansen
501*59599516SKenneth E. Jansenc
502*59599516SKenneth E. Jansenc.... map the array
503*59599516SKenneth E. Jansenc
504*59599516SKenneth E. Jansen      do i = 1, nshl
505*59599516SKenneth E. Jansen         x2(map(:),i) = x(:,i)
506*59599516SKenneth E. Jansen      enddo
507*59599516SKenneth E. Jansen
508*59599516SKenneth E. Jansen      return
509*59599516SKenneth E. Jansen      end
510