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