xref: /phasta/phSolver/common/genbc1.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen        subroutine genBC1 (BCtmp,  iBC,  BC)
2*59599516SKenneth E. Jansenc
3*59599516SKenneth E. Jansenc----------------------------------------------------------------------
4*59599516SKenneth E. Jansenc
5*59599516SKenneth E. Jansenc This subroutine adjusts the boundary conditions to accommodate for
6*59599516SKenneth E. Jansenc the velocity constraints in the non-axes directions. It copies the
7*59599516SKenneth E. Jansenc reduced constraint parameters in BC.
8*59599516SKenneth E. Jansenc
9*59599516SKenneth E. Jansenc input:
10*59599516SKenneth E. Jansenc  BCtmp (nshg,6+5*I3nsd) : input BC parameters (density, temperature,
11*59599516SKenneth E. Jansenc                             pressure, (nsd-1)(nsd+1) velocity params,
12*59599516SKenneth E. Jansenc                             upto 4 scalar params)
13*59599516SKenneth E. Jansenc  iBC   (nshg)           : boundary condition code
14*59599516SKenneth E. Jansenc
15*59599516SKenneth E. Jansenc output:
16*59599516SKenneth E. Jansenc  BC    (nshg,ndofBC)    : the constraint eq's parameters
17*59599516SKenneth E. Jansenc
18*59599516SKenneth E. Jansenc
19*59599516SKenneth E. Jansenc Farzin Shakib, Winter 1986.
20*59599516SKenneth E. Jansenc Zdenek Johan,  Winter 1991.  (Fortran 90)
21*59599516SKenneth E. Jansenc----------------------------------------------------------------------
22*59599516SKenneth E. Jansenc
23*59599516SKenneth E. Jansen      include "common.h"
24*59599516SKenneth E. Jansen
25*59599516SKenneth E. Jansenc
26*59599516SKenneth E. Jansen        dimension BCtmp(nshg,ndof+7),    iBC(nshg),
27*59599516SKenneth E. Jansen     &            BC(nshg,ndofBC),tmpbc(4)
28*59599516SKenneth E. Jansenc
29*59599516SKenneth E. Jansen        dimension tmp(nshg)
30*59599516SKenneth E. Jansenc
31*59599516SKenneth E. Jansenc.... scalars
32*59599516SKenneth E. Jansenc
33*59599516SKenneth E. Jansen        do isclr=1,nsclr
34*59599516SKenneth E. Jansen           where (btest(iBC,5+isclr)) BC(:,6+isclr) = BCtmp(:,12+isclr)
35*59599516SKenneth E. Jansen        enddo
36*59599516SKenneth E. Jansenc
37*59599516SKenneth E. Jansenc.... set up the thermodynamic properties
38*59599516SKenneth E. Jansenc
39*59599516SKenneth E. Jansen        where (btest(iBC,0)) BC(:,1) = BCtmp(:,1) ! density
40*59599516SKenneth E. Jansen        where (btest(iBC,1)) BC(:,2) = BCtmp(:,2) ! temperature
41*59599516SKenneth E. Jansen        where (btest(iBC,2)) BC(:,1) = BCtmp(:,3) ! pressure
42*59599516SKenneth E. Jansenc
43*59599516SKenneth E. Jansenc.... if the velocity in the x1-direction is specified
44*59599516SKenneth E. Jansenc
45*59599516SKenneth E. Jansen        where (ibits(iBC,3,3) .eq. 1)
46*59599516SKenneth E. Jansen          tmp     = BCtmp(:,4)**2 + BCtmp(:,5)**2 + BCtmp(:,6)**2
47*59599516SKenneth E. Jansen          BC(:,3) = tmp * BCtmp(:,7) / BCtmp(:,4)
48*59599516SKenneth E. Jansen          BC(:,4) =       BCtmp(:,5) / BCtmp(:,4)
49*59599516SKenneth E. Jansen          BC(:,5) =       BCtmp(:,6) / BCtmp(:,4)
50*59599516SKenneth E. Jansen        endwhere
51*59599516SKenneth E. Jansenc
52*59599516SKenneth E. Jansenc.... if the velocity in the x2-direction is specified
53*59599516SKenneth E. Jansenc
54*59599516SKenneth E. Jansen        where (ibits(iBC,3,3) .eq. 2)
55*59599516SKenneth E. Jansen          tmp     = BCtmp(:,4)**2 + BCtmp(:,5)**2 + BCtmp(:,6)**2
56*59599516SKenneth E. Jansen          BC(:,3) = tmp * BCtmp(:,7) / BCtmp(:,5)
57*59599516SKenneth E. Jansen          BC(:,4) =       BCtmp(:,4) / BCtmp(:,5)
58*59599516SKenneth E. Jansen          BC(:,5) =       BCtmp(:,6) / BCtmp(:,5)
59*59599516SKenneth E. Jansen        endwhere
60*59599516SKenneth E. Jansenc
61*59599516SKenneth E. Jansenc.... if the two velocities are specified (x1 & x2-direction)
62*59599516SKenneth E. Jansenc
63*59599516SKenneth E. Jansenc
64*59599516SKenneth E. Jansenc  Protect against user flipping the order of x1 and x2 in
65*59599516SKenneth E. Jansenc  the vector 1 and vector 2.  Without this it will blow up.
66*59599516SKenneth E. Jansenc
67*59599516SKenneth E. Jansen        do i=1,nshg
68*59599516SKenneth E. Jansen          if(ibits(iBC(i),3,3) .eq. 3 .and.
69*59599516SKenneth E. Jansen     &       (BCtmp(i,4).eq.0 .or. BCtmp(i,9).eq.0)) then !flip them
70*59599516SKenneth E. Jansen              tmpbc(1:4)=BCtmp(i,4:7)
71*59599516SKenneth E. Jansen              BCtmp(i,4:7)=BCtmp(i,8:11)
72*59599516SKenneth E. Jansen              BCtmp(i,8:11)=tmpbc(1:4)
73*59599516SKenneth E. Jansen          endif
74*59599516SKenneth E. Jansen        enddo
75*59599516SKenneth E. Jansen        where (ibits(iBC,3,3) .eq. 3)
76*59599516SKenneth E. Jansen          tmp         = sqrt (BCtmp(:, 4)**2 + BCtmp(:, 5)**2
77*59599516SKenneth E. Jansen     &                                       + BCtmp(:, 6)**2)
78*59599516SKenneth E. Jansen          BCtmp(:, 4) = BCtmp(:, 4) / tmp
79*59599516SKenneth E. Jansen          BCtmp(:, 5) = BCtmp(:, 5) / tmp
80*59599516SKenneth E. Jansen          BCtmp(:, 6) = BCtmp(:, 6) / tmp
81*59599516SKenneth E. Jansen          BCtmp(:, 7) = BCtmp(:, 7) * tmp
82*59599516SKenneth E. Jansenc
83*59599516SKenneth E. Jansen          tmp         = sqrt (BCtmp(:, 8)**2 + BCtmp(:, 9)**2
84*59599516SKenneth E. Jansen     &                                       + BCtmp(:,10)**2)
85*59599516SKenneth E. Jansen          BCtmp(:, 8) = BCtmp(:, 8) / tmp
86*59599516SKenneth E. Jansen          BCtmp(:, 9) = BCtmp(:, 9) / tmp
87*59599516SKenneth E. Jansen          BCtmp(:,10) = BCtmp(:,10) / tmp
88*59599516SKenneth E. Jansen          BCtmp(:,11) = BCtmp(:,11) * tmp
89*59599516SKenneth E. Jansenc
90*59599516SKenneth E. Jansen          BCtmp(:, 4) = BCtmp(:, 9) * BCtmp(:, 4)
91*59599516SKenneth E. Jansen     &                - BCtmp(:, 5) * BCtmp(:, 8)
92*59599516SKenneth E. Jansen          BCtmp(:, 6) = BCtmp(:, 9) * BCtmp(:, 6)
93*59599516SKenneth E. Jansen     &                - BCtmp(:, 5) * BCtmp(:,10)
94*59599516SKenneth E. Jansen          BCtmp(:, 7) = BCtmp(:, 9) * BCtmp(:, 7)
95*59599516SKenneth E. Jansen     &                - BCtmp(:, 5) * BCtmp(:,11)
96*59599516SKenneth E. Jansen          BC(:,3)     = BCtmp(:, 7) / BCtmp(:, 4)
97*59599516SKenneth E. Jansen          BC(:,4)     = BCtmp(:, 6) / BCtmp(:, 4)
98*59599516SKenneth E. Jansenc
99*59599516SKenneth E. Jansen          BCtmp(:, 9) = BCtmp(:, 4) * BCtmp(:, 9)
100*59599516SKenneth E. Jansen          BCtmp(:,10) = BCtmp(:, 4) * BCtmp(:,10)
101*59599516SKenneth E. Jansen     &                - BCtmp(:, 8) * BCtmp(:, 6)
102*59599516SKenneth E. Jansen          BCtmp(:,11) = BCtmp(:, 4) * BCtmp(:,11)
103*59599516SKenneth E. Jansen     &                - BCtmp(:, 8) * BCtmp(:, 7)
104*59599516SKenneth E. Jansen          BC(:,5)     = BCtmp(:,11) / BCtmp(:, 9)
105*59599516SKenneth E. Jansen          BC(:,6)     = BCtmp(:,10) / BCtmp(:, 9)
106*59599516SKenneth E. Jansen        endwhere
107*59599516SKenneth E. Jansenc
108*59599516SKenneth E. Jansenc.... if the velocity in the x3-direction is specified
109*59599516SKenneth E. Jansenc
110*59599516SKenneth E. Jansen        if (nsd .eq. 3) then
111*59599516SKenneth E. Jansen        where (ibits(iBC,3,3) .eq. 4)
112*59599516SKenneth E. Jansen          tmp     = BCtmp(:,4)**2 + BCtmp(:,5)**2 + BCtmp(:,6)**2
113*59599516SKenneth E. Jansen          BC(:,3) = tmp * BCtmp(:,7) / BCtmp(:,6)
114*59599516SKenneth E. Jansen          BC(:,4) =       BCtmp(:,4) / BCtmp(:,6)
115*59599516SKenneth E. Jansen          BC(:,5) =       BCtmp(:,5) / BCtmp(:,6)
116*59599516SKenneth E. Jansen        endwhere
117*59599516SKenneth E. Jansen        endif
118*59599516SKenneth E. Jansenc
119*59599516SKenneth E. Jansenc.... if two velocities are specified (x1 & x3-direction)
120*59599516SKenneth E. Jansenc
121*59599516SKenneth E. Jansen        if (nsd .eq. 3) then
122*59599516SKenneth E. Jansenc
123*59599516SKenneth E. Jansenc  Protect against user flipping the order of x1 and x3 in
124*59599516SKenneth E. Jansenc  the vector 1 and vector 2.  Without this it will blow up.
125*59599516SKenneth E. Jansenc
126*59599516SKenneth E. Jansen        do i=1,nshg
127*59599516SKenneth E. Jansen          if(ibits(iBC(i),3,3) .eq. 5 .and.
128*59599516SKenneth E. Jansen     &       (BCtmp(i,4).eq.0 .or. BCtmp(i,10).eq.0)) then !flip them
129*59599516SKenneth E. Jansen              tmpbc(1:4)=BCtmp(i,4:7)
130*59599516SKenneth E. Jansen              BCtmp(i,4:7)=BCtmp(i,8:11)
131*59599516SKenneth E. Jansen              BCtmp(i,8:11)=tmpbc(1:4)
132*59599516SKenneth E. Jansen           endif
133*59599516SKenneth E. Jansen        enddo
134*59599516SKenneth E. Jansen        where (ibits(iBC,3,3) .eq. 5)
135*59599516SKenneth E. Jansen          tmp         = sqrt (BCtmp(:, 4)**2 + BCtmp(:, 5)**2
136*59599516SKenneth E. Jansen     &                                       + BCtmp(:, 6)**2)
137*59599516SKenneth E. Jansen          BCtmp(:, 4) = BCtmp(:, 4) / tmp
138*59599516SKenneth E. Jansen          BCtmp(:, 5) = BCtmp(:, 5) / tmp
139*59599516SKenneth E. Jansen          BCtmp(:, 6) = BCtmp(:, 6) / tmp
140*59599516SKenneth E. Jansen          BCtmp(:, 7) = BCtmp(:, 7) * tmp
141*59599516SKenneth E. Jansenc
142*59599516SKenneth E. Jansen          tmp         = sqrt (BCtmp(:, 8)**2 + BCtmp(:, 9)**2
143*59599516SKenneth E. Jansen     &                                       + BCtmp(:,10)**2)
144*59599516SKenneth E. Jansen          BCtmp(:, 8) = BCtmp(:, 8) / tmp
145*59599516SKenneth E. Jansen          BCtmp(:, 9) = BCtmp(:, 9) / tmp
146*59599516SKenneth E. Jansen          BCtmp(:,10) = BCtmp(:,10) / tmp
147*59599516SKenneth E. Jansen          BCtmp(:,11) = BCtmp(:,11) * tmp
148*59599516SKenneth E. Jansenc
149*59599516SKenneth E. Jansen          BCtmp(:, 4) = BCtmp(:,10) * BCtmp(:, 4)
150*59599516SKenneth E. Jansen     &                - BCtmp(:, 6) * BCtmp(:, 8)
151*59599516SKenneth E. Jansen          BCtmp(:, 5) = BCtmp(:,10) * BCtmp(:, 5)
152*59599516SKenneth E. Jansen     &                - BCtmp(:, 6) * BCtmp(:, 9)
153*59599516SKenneth E. Jansen          BCtmp(:, 7) = BCtmp(:,10) * BCtmp(:, 7)
154*59599516SKenneth E. Jansen     &                - BCtmp(:, 6) * BCtmp(:,11)
155*59599516SKenneth E. Jansen          BC(:,3)     = BCtmp(:, 7) / BCtmp(:, 4)
156*59599516SKenneth E. Jansen          BC(:,4)     = BCtmp(:, 5) / BCtmp(:, 4)
157*59599516SKenneth E. Jansenc
158*59599516SKenneth E. Jansen          BCtmp(:, 9) = BCtmp(:, 4) * BCtmp(:, 9)
159*59599516SKenneth E. Jansen     &                - BCtmp(:, 8) * BCtmp(:, 5)
160*59599516SKenneth E. Jansen          BCtmp(:,10) = BCtmp(:, 4) * BCtmp(:,10)
161*59599516SKenneth E. Jansen          BCtmp(:,11) = BCtmp(:, 4) * BCtmp(:,11)
162*59599516SKenneth E. Jansen     &                - BCtmp(:, 8) * BCtmp(:, 7)
163*59599516SKenneth E. Jansen          BC(:,5)     = BCtmp(:,11) / BCtmp(:,10)
164*59599516SKenneth E. Jansen          BC(:,6)     = BCtmp(:, 9) / BCtmp(:,10)
165*59599516SKenneth E. Jansen        endwhere
166*59599516SKenneth E. Jansen        endif
167*59599516SKenneth E. Jansenc
168*59599516SKenneth E. Jansenc.... if two velocities are specified (x2 & x3-direction)
169*59599516SKenneth E. Jansenc
170*59599516SKenneth E. Jansen        if (nsd .eq. 3) then
171*59599516SKenneth E. Jansenc
172*59599516SKenneth E. Jansenc  Protect against user flipping the order of x2 and x3 in
173*59599516SKenneth E. Jansenc  the vector 1 and vector 2.  Without this it will blow up.
174*59599516SKenneth E. Jansenc
175*59599516SKenneth E. Jansen        do i=1,nshg
176*59599516SKenneth E. Jansen          if(ibits(iBC(i),3,3) .eq. 6 .and. (
177*59599516SKenneth E. Jansen     &       BCtmp(i,5).eq.0 .or. BCtmp(i,10).eq.0)) then !flip them
178*59599516SKenneth E. Jansen              tmpbc(1:4)=BCtmp(i,4:7)
179*59599516SKenneth E. Jansen              BCtmp(i,4:7)=BCtmp(i,8:11)
180*59599516SKenneth E. Jansen              BCtmp(i,8:11)=tmpbc(1:4)
181*59599516SKenneth E. Jansen           endif
182*59599516SKenneth E. Jansen        enddo
183*59599516SKenneth E. Jansen        where (ibits(iBC,3,3) .eq. 6)
184*59599516SKenneth E. Jansen          tmp         = sqrt (BCtmp(:, 4)**2 + BCtmp(:, 5)**2
185*59599516SKenneth E. Jansen     &                                       + BCtmp(:, 6)**2)
186*59599516SKenneth E. Jansen          BCtmp(:, 4) = BCtmp(:, 4) / tmp
187*59599516SKenneth E. Jansen          BCtmp(:, 5) = BCtmp(:, 5) / tmp
188*59599516SKenneth E. Jansen          BCtmp(:, 6) = BCtmp(:, 6) / tmp
189*59599516SKenneth E. Jansen          BCtmp(:, 7) = BCtmp(:, 7) * tmp
190*59599516SKenneth E. Jansenc
191*59599516SKenneth E. Jansen          tmp         = sqrt (BCtmp(:, 8)**2 + BCtmp(:, 9)**2
192*59599516SKenneth E. Jansen     &                                       + BCtmp(:,10)**2)
193*59599516SKenneth E. Jansen          BCtmp(:, 8) = BCtmp(:, 8) / tmp
194*59599516SKenneth E. Jansen          BCtmp(:, 9) = BCtmp(:, 9) / tmp
195*59599516SKenneth E. Jansen          BCtmp(:,10) = BCtmp(:,10) / tmp
196*59599516SKenneth E. Jansen          BCtmp(:,11) = BCtmp(:,11) * tmp
197*59599516SKenneth E. Jansenc
198*59599516SKenneth E. Jansen          BCtmp(:, 4) = BCtmp(:,10) * BCtmp(:, 4)
199*59599516SKenneth E. Jansen     &                - BCtmp(:, 6) * BCtmp(:, 8)
200*59599516SKenneth E. Jansen          BCtmp(:, 5) = BCtmp(:,10) * BCtmp(:, 5)
201*59599516SKenneth E. Jansen     &                - BCtmp(:, 6) * BCtmp(:, 9)
202*59599516SKenneth E. Jansen          BCtmp(:, 7) = BCtmp(:,10) * BCtmp(:, 7)
203*59599516SKenneth E. Jansen     &                - BCtmp(:, 6) * BCtmp(:,11)
204*59599516SKenneth E. Jansen          BC(:,3)     = BCtmp(:, 7) / BCtmp(:, 5)
205*59599516SKenneth E. Jansen          BC(:,4)     = BCtmp(:, 4) / BCtmp(:, 5)
206*59599516SKenneth E. Jansenc
207*59599516SKenneth E. Jansen          BCtmp(:, 8) = BCtmp(:, 5) * BCtmp(:, 8)
208*59599516SKenneth E. Jansen     &                - BCtmp(:, 9) * BCtmp(:, 4)
209*59599516SKenneth E. Jansen          BCtmp(:,10) = BCtmp(:, 5) * BCtmp(:,10)
210*59599516SKenneth E. Jansen          BCtmp(:,11) = BCtmp(:, 5) * BCtmp(:,11)
211*59599516SKenneth E. Jansen     &                - BCtmp(:, 9) * BCtmp(:, 7)
212*59599516SKenneth E. Jansen          BC(:,5)     = BCtmp(:,11) / BCtmp(:,10)
213*59599516SKenneth E. Jansen          BC(:,6)     = BCtmp(:, 8) / BCtmp(:,10)
214*59599516SKenneth E. Jansen        endwhere
215*59599516SKenneth E. Jansen        endif
216*59599516SKenneth E. Jansenc
217*59599516SKenneth E. Jansenc.... if all velocities are specified
218*59599516SKenneth E. Jansenc
219*59599516SKenneth E. Jansen        if (nsd .eq. 3) then
220*59599516SKenneth E. Jansen        where (ibits(iBC,3,3) .eq. 7)
221*59599516SKenneth E. Jansen          BC(:,3) = BCtmp(:,7) * BCtmp(:,4)
222*59599516SKenneth E. Jansen          BC(:,4) = BCtmp(:,7) * BCtmp(:,5)
223*59599516SKenneth E. Jansen          BC(:,5) = BCtmp(:,7) * BCtmp(:,6)
224*59599516SKenneth E. Jansen        endwhere
225*59599516SKenneth E. Jansen        endif
226*59599516SKenneth E. Jansenc
227*59599516SKenneth E. Jansenc.... end
228*59599516SKenneth E. Jansenc
229*59599516SKenneth E. Jansen        return
230*59599516SKenneth E. Jansen        end
231