1*10167291SKenneth E. Jansenc======================================================================== 2*10167291SKenneth E. Jansenc Dynamically controll the suction level based on main contraction mdot, 3*10167291SKenneth E. Jansenc called by itrdrv.f 4*10167291SKenneth E. Jansenc======================================================================== 5*10167291SKenneth E. Jansen subroutine setSuction_Duct3(x,BC,y, ilwork) 6*10167291SKenneth E. Jansen 7*10167291SKenneth E. Jansen use wallData ! wnorm 8*10167291SKenneth E. Jansen use timedata 9*10167291SKenneth E. Jansen include "common.h" 10*10167291SKenneth E. Jansen include "mpif.h" 11*10167291SKenneth E. Jansen include "auxmpi.h" 12*10167291SKenneth E. Jansen 13*10167291SKenneth E. Jansen integer i, j, k, nn, nL 14*10167291SKenneth E. Jansen integer ilwork(nlwork) 15*10167291SKenneth E. Jansen integer nSuctionNode 16*10167291SKenneth E. Jansen integer, allocatable :: suctionNodeMap(:) 17*10167291SKenneth E. Jansen! logical inPatch 18*10167291SKenneth E. Jansen real*8 xcoor,ycoor,zcoor 19*10167291SKenneth E. Jansen real*8 BC(nshg,ndofBC) 20*10167291SKenneth E. Jansen real*8 BC3(numnp, 5) !used for hack to get suction right on part boundaries 21*10167291SKenneth E. Jansen real*8 x(nshg,nsd), y(nshg,ndof) 22*10167291SKenneth E. Jansen! real*8 xmin_t, xmax_t, xmin_b, xmax_b !ramp geometry controls 23*10167291SKenneth E. Jansen! real*8 xmin_su, xmax_su, xmin_sl, xmax_sl !side wall patch limits 24*10167291SKenneth E. Jansen! real*8 t_upper !upper thickness of suction area 25*10167291SKenneth E. Jansen! real*8 ymin_su, ymax_sl 26*10167291SKenneth E. Jansen real*8 nvel_s, nvel_t, nvel_b !normal velocity on the side walls, top, and bottom 27*10167291SKenneth E. Jansen 28*10167291SKenneth E. Jansen! real*8 delX, delY, X1, Y1 !Variables used to map upper surface or trumpet 29*10167291SKenneth E. Jansen! real*8 Xline(30,2) 30*10167291SKenneth E. Jansen! integer suctionIDs(4) 31*10167291SKenneth E. Jansen 32*10167291SKenneth E. Jansen! real*8 wallBCout(nshg, 6) 33*10167291SKenneth E. Jansen 34*10167291SKenneth E. Jansen if(myrank.eq.0)write(*,*)'Setting side suctions' 35*10167291SKenneth E. Jansen 36*10167291SKenneth E. Jansen nvel_b = suctionVbottom !normal velocity at the bottom patch 37*10167291SKenneth E. Jansen nvel_sl = suctionVside_lower !normal velocity of lower side wall patches 38*10167291SKenneth E. Jansen nvel_su = suctionVside_upper !normal velocity of upper side wall patches 39*10167291SKenneth E. Jansen nvel_t = suctionVtop !normal velocity at the top patch 40*10167291SKenneth E. Jansen 41*10167291SKenneth E. Jansen allocate(suctionNodeMap(nshg)) 42*10167291SKenneth E. Jansen call sfID2np(isetSuctionID_Duct, nSuctionNode, suctionNodeMap) !to figure out whether it's the top, bottom, or side surface. 43*10167291SKenneth E. Jansen 44*10167291SKenneth E. Jansen smallNum=1.0e-5 45*10167291SKenneth E. Jansen xsideBotMax=0.0428625+smallNum 46*10167291SKenneth E. Jansen xsideTopMax=0.130175+smallNum 47*10167291SKenneth E. Jansen 48*10167291SKenneth E. Jansen do i = 1, nSuctionNode 49*10167291SKenneth E. Jansen nn = suctionNodeMap(i) ! map face node index to global node 50*10167291SKenneth E. Jansen xcoor = x(nn,1) 51*10167291SKenneth E. Jansen ycoor = x(nn,2) 52*10167291SKenneth E. Jansen !zcoor = x(nn,3) 53*10167291SKenneth E. Jansen 54*10167291SKenneth E. Jansen !wnormx = wnorm(nn, 1) 55*10167291SKenneth E. Jansen wnormy = wnorm(nn, 2) 56*10167291SKenneth E. Jansen wnormz = wnorm(nn, 3) 57*10167291SKenneth E. Jansen 58*10167291SKenneth E. Jansen !Test if the point lies in one of the suction patches 59*10167291SKenneth E. Jansen 60*10167291SKenneth E. Jansen if((abs(nvel_sl) > 0 .or. abs(nvel_su) > 0) .and. !if either upper or lower side walls are on... 61*10167291SKenneth E. Jansen & (abs(wnormz) >= 0.999)) then ! and the node normal is in the z direction 62*10167291SKenneth E. Jansen if((ycoor > 0) .and. (xcoor .le. xsideTopMax)) then !hack to prevent edges from turning on. 63*10167291SKenneth E. Jansen BC(nn, 3) = nvel_su*wnorm(nn, 1) ! set xVel 64*10167291SKenneth E. Jansen BC(nn, 4) = nvel_su*wnorm(nn, 2) ! set yVel 65*10167291SKenneth E. Jansen BC(nn, 5) = nvel_su*wnorm(nn, 3) ! set zVel 66*10167291SKenneth E. Jansen elseif (xcoor .le. xsideBotMax) then 67*10167291SKenneth E. Jansen BC(nn, 3) = nvel_sl*wnorm(nn, 1) ! set xVel 68*10167291SKenneth E. Jansen BC(nn, 4) = nvel_sl*wnorm(nn, 2) ! set yVel 69*10167291SKenneth E. Jansen BC(nn, 5) = nvel_sl*wnorm(nn, 3) ! set zVel 70*10167291SKenneth E. Jansen endif 71*10167291SKenneth E. Jansen else if(abs(wnormz) > 0.1) then ! side walls should have a larger znormal than this - it's ambiguous what to do so do nothing 72*10167291SKenneth E. Jansen cycle 73*10167291SKenneth E. Jansen else if(abs(nvel_t) > 0 .and. !top suction patch 74*10167291SKenneth E. Jansen & wnormy > 0.001) then !face is pointing up (in the +y direction) 75*10167291SKenneth E. Jansen BC(nn, 3) = nvel_t*wnorm(nn, 1) ! set xVel using wall normal 76*10167291SKenneth E. Jansen BC(nn, 4) = nvel_t*wnorm(nn, 2) ! set yVel 77*10167291SKenneth E. Jansen BC(nn, 5) = nvel_t*wnorm(nn, 3) ! set zVel 78*10167291SKenneth E. Jansen 79*10167291SKenneth E. Jansen else if(abs(nvel_b) > 0 .and. !bottom suction patches 80*10167291SKenneth E. Jansen & wnormy < -0.001) then !face is pointing down (in the -y direction) 81*10167291SKenneth E. Jansen BC(nn, 3) = nvel_b*wnorm(nn, 1) ! set xVel using wall normal 82*10167291SKenneth E. Jansen BC(nn, 4) = nvel_b*wnorm(nn, 2) ! set yVel 83*10167291SKenneth E. Jansen BC(nn, 5) = nvel_b*wnorm(nn, 3) ! set zVel 84*10167291SKenneth E. Jansen endif 85*10167291SKenneth E. Jansen 86*10167291SKenneth E. Jansen enddo 87*10167291SKenneth E. Jansen 88*10167291SKenneth E. Jansen if(numpe.gt.1) then 89*10167291SKenneth E. Jansen BC3(:,1:3)=BC(:,3:5) 90*10167291SKenneth E. Jansen do i=1,nshg 91*10167291SKenneth E. Jansen bc3mag=BC3(i,1)**2+BC3(i,2)**2+BC3(i,3)**2 92*10167291SKenneth E. Jansen if(bc3mag.gt.0) BC3(i,4)=one 93*10167291SKenneth E. Jansen enddo 94*10167291SKenneth E. Jansen call commu(BC3,ilwork,5,'in ') 95*10167291SKenneth E. Jansen! This accumulated and failed call commu(BC(:,3:5),ilwork,3,'in ') 96*10167291SKenneth E. Jansen do i=1,nshg 97*10167291SKenneth E. Jansen bcmag=BC(i,3)**2+BC(i,4)**2+BC(i,5)**2 98*10167291SKenneth E. Jansen if((bcmag.eq.0).and.(BC3(i,4).ne.0)) then !node is slave and has not been correctly set. 99*10167291SKenneth E. Jansen BC(i,3:5)=BC3(i,1:3)/BC3(i,4) !division by BC3 is necessary to account for more than two blocks sharing the same node 100*10167291SKenneth E. Jansen endif 101*10167291SKenneth E. Jansen enddo 102*10167291SKenneth E. Jansen endif 103*10167291SKenneth E. Jansen 104*10167291SKenneth E. Jansen !Debugging loop 105*10167291SKenneth E. Jansen! if(nSuctionNode.gt.0) then 106*10167291SKenneth E. Jansen! icount=0 107*10167291SKenneth E. Jansen! do i=1,nSuctionNode 108*10167291SKenneth E. Jansen! nn=suctionNodeMap(i) 109*10167291SKenneth E. Jansen! dz=dabs(dabs(x(nn,3))-0.0762) 110*10167291SKenneth E. Jansen! if(dz.lt.0.0001) then 111*10167291SKenneth E. Jansen! icount=icount+1 112*10167291SKenneth E. Jansen! if(icount.eq.1) 113*10167291SKenneth E. Jansen! & write(myrank+1000,*) 'writing wnorm and BC setSuctionNG3' 114*10167291SKenneth E. Jansen! write(myrank+1000,1234) nn,i, 115*10167291SKenneth E. Jansen! & x(nn,1), x(nn,2), x(nn,3), 116*10167291SKenneth E. Jansen! & wnorm(nn,1),wnorm(nn,2),wnorm(nn,3), 117*10167291SKenneth E. Jansen! & BC(nn,3),BC(nn,4),BC(nn,5) 118*10167291SKenneth E. Jansen! endif 119*10167291SKenneth E. Jansen! enddo 120*10167291SKenneth E. Jansen! if(icount.gt.0) close(myrank+1000) 121*10167291SKenneth E. Jansen! endif 122*10167291SKenneth E. Jansen!1234 format(i5,2x,i5,9(2x,e14.7)) 123*10167291SKenneth E. Jansen 124*10167291SKenneth E. Jansen end 125*10167291SKenneth E. Jansen 126*10167291SKenneth E. Jansen 127*10167291SKenneth E. Jansen 128*10167291SKenneth E. Jansen 129*10167291SKenneth E. Jansen 130*10167291SKenneth E. Jansen 131