xref: /phasta/phSolver/common/setSuction_Duct3.f90 (revision 1016729149754f57cd03fe576ba6fd0f1723ab31)
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