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