xref: /phasta/phSolver/common/slpwBC.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen       subroutine slpwBC(nslpw,ihis,iBCg,BCg,BCtmpg,iBC,BC,wlnorm)
2*59599516SKenneth E. Jansen       include "common.h"
3*59599516SKenneth E. Jansen       include "mpif.h"
4*59599516SKenneth E. Jansen
5*59599516SKenneth E. Jansen       integer nslpw,ihis,iBCg,iBC
6*59599516SKenneth E. Jansen       real*8 BCg(ndofBC)
7*59599516SKenneth E. Jansen       real*8 BCtmpg(ndof+7)
8*59599516SKenneth E. Jansen       real*8 BC(ndofBC)
9*59599516SKenneth E. Jansen       real*8 wlnorm(3,9)
10*59599516SKenneth E. Jansen       real*8 c4,c5,c6,c7
11*59599516SKenneth E. Jansen       real*8 c8,c9,c10,c11
12*59599516SKenneth E. Jansen       real*8 c12,c13,c14,c15
13*59599516SKenneth E. Jansen       real*8 ck1,ck2,ck3
14*59599516SKenneth E. Jansen       real*8 det,det3x3,tmp,u,v,w
15*59599516SKenneth E. Jansen       integer nmax
16*59599516SKenneth E. Jansen       real*8 wn1(3),wn2(3),wn3(3)
17*59599516SKenneth E. Jansen
18*59599516SKenneth E. Jansen       icd=ibits(iBCg,3,3)
19*59599516SKenneth E. Jansen       ixset=ibits(iBCg,3,1)
20*59599516SKenneth E. Jansen       iyset=ibits(iBCg,4,1)
21*59599516SKenneth E. Jansen       izset=ibits(iBCg,5,1)
22*59599516SKenneth E. Jansen       iBC=iBCg-(ixset*8+iyset*16+izset*32)
23*59599516SKenneth E. Jansen
24*59599516SKenneth E. Jansenccc case1: one slipwall and no user-specified velocity BC
25*59599516SKenneth E. Jansen       if(nslpw.eq.1.and.icd.eq.0)then
26*59599516SKenneth E. Jansen        do islpw=1,9
27*59599516SKenneth E. Jansen           if(btest(ihis,islpw))exit
28*59599516SKenneth E. Jansen        enddo
29*59599516SKenneth E. Jansen        wn1(:)=wlnorm(:,islpw)
30*59599516SKenneth E. Jansen        ii=nmax(wn1(1),wn1(2),wn1(3))
31*59599516SKenneth E. Jansen        if(ii.eq.1)then  ! u has the largest constrain
32*59599516SKenneth E. Jansen         iBC=iBC+8
33*59599516SKenneth E. Jansen         BC(3)=0
34*59599516SKenneth E. Jansen         BC(4)=wn1(2)/wn1(1)
35*59599516SKenneth E. Jansen         BC(5)=wn1(3)/wn1(1)
36*59599516SKenneth E. Jansen        elseif(ii.eq.2)then
37*59599516SKenneth E. Jansen         iBC=iBC+16
38*59599516SKenneth E. Jansen         BC(3)=0
39*59599516SKenneth E. Jansen         BC(4)=wn1(1)/wn1(2)
40*59599516SKenneth E. Jansen         BC(5)=wn1(3)/wn1(2)
41*59599516SKenneth E. Jansen        elseif(ii.eq.3)then
42*59599516SKenneth E. Jansen         iBC=iBC+32
43*59599516SKenneth E. Jansen         BC(3)=0
44*59599516SKenneth E. Jansen         BC(4)=wn1(1)/wn1(3)
45*59599516SKenneth E. Jansen         BC(5)=wn1(2)/wn1(3)
46*59599516SKenneth E. Jansen        endif
47*59599516SKenneth E. Jansen
48*59599516SKenneth E. Jansenccc case2: two slipwall and no user-specified velocity BC
49*59599516SKenneth E. Jansen       elseif(nslpw.eq.2.and.icd.eq.0)then
50*59599516SKenneth E. Jansen        do islpw=1,9
51*59599516SKenneth E. Jansen           if(btest(ihis,islpw))exit
52*59599516SKenneth E. Jansen        enddo
53*59599516SKenneth E. Jansen        do jslpw=islpw+1,9
54*59599516SKenneth E. Jansen           if(btest(ihis,jslpw))exit
55*59599516SKenneth E. Jansen        enddo
56*59599516SKenneth E. Jansen        wn1(:)=wlnorm(:,islpw)
57*59599516SKenneth E. Jansen        wn2(:)=wlnorm(:,jslpw)
58*59599516SKenneth E. Jansen        c4=wn1(1)
59*59599516SKenneth E. Jansen        c5=wn1(2)
60*59599516SKenneth E. Jansen        c6=wn1(3)
61*59599516SKenneth E. Jansen        c7=0
62*59599516SKenneth E. Jansen        c8=wn2(1)
63*59599516SKenneth E. Jansen        c9=wn2(2)
64*59599516SKenneth E. Jansen        c10=wn2(3)
65*59599516SKenneth E. Jansen        c11=0
66*59599516SKenneth E. Jansen        ck1=c5*c10-c9*c6
67*59599516SKenneth E. Jansen        ck2=c4*c9-c8*c5
68*59599516SKenneth E. Jansen        ck3=c4*c9-c8*c5
69*59599516SKenneth E. Jansen        kk=nmax(ck1,ck2,ck3)
70*59599516SKenneth E. Jansen        if(kk.eq.1)then  ! u has the largest freedom
71*59599516SKenneth E. Jansen          iBC=iBC+48
72*59599516SKenneth E. Jansen          det=c5*c10-c9*c6
73*59599516SKenneth E. Jansen          BC(3)=(c10*c7-c6*c11)/det
74*59599516SKenneth E. Jansen          BC(4)=(c10*c4-c6*c8)/det
75*59599516SKenneth E. Jansen          BC(5)=(c11*c5-c9*c7)/det
76*59599516SKenneth E. Jansen          BC(6)=(c5*c8-c9*c4)/det
77*59599516SKenneth E. Jansen        elseif(kk.eq.2)then
78*59599516SKenneth E. Jansen          iBC=iBC+40
79*59599516SKenneth E. Jansen          det=c4*c10-c8*c6
80*59599516SKenneth E. Jansen          BC(3)=(c10*c7-c6*c11)/det
81*59599516SKenneth E. Jansen          BC(4)=(c10*c5-c6*c9)/det
82*59599516SKenneth E. Jansen          BC(5)=(c11*c4-c8*c7)/det
83*59599516SKenneth E. Jansen          BC(6)=(c4*c9-c5*c8)/det
84*59599516SKenneth E. Jansen        elseif(kk.eq.3)then
85*59599516SKenneth E. Jansen          iBC=iBC+24
86*59599516SKenneth E. Jansen          det=c4*c9-c8*c5
87*59599516SKenneth E. Jansen          BC(3)=(c9*c7-c5*c11)/det
88*59599516SKenneth E. Jansen          BC(4)=(c9*c6-c5*c10)/det
89*59599516SKenneth E. Jansen          BC(5)=(c4*c11-c8*c7)/det
90*59599516SKenneth E. Jansen          BC(6)=(c4*c10-c8*c6)/det
91*59599516SKenneth E. Jansen        endif
92*59599516SKenneth E. Jansen
93*59599516SKenneth E. Jansenccc case3: one slipwall and one user-specified velocity BC
94*59599516SKenneth E. Jansen       elseif(nslpw.eq.1.and.(icd.eq.1.or.icd.eq.2.or.icd.eq.4))then
95*59599516SKenneth E. Jansen        do islpw=1,9
96*59599516SKenneth E. Jansen           if(btest(ihis,islpw))exit
97*59599516SKenneth E. Jansen        enddo
98*59599516SKenneth E. Jansen        wn1(:)=wlnorm(:,islpw)
99*59599516SKenneth E. Jansen        c4=BCtmpg(4)
100*59599516SKenneth E. Jansen        c5=BCtmpg(5)
101*59599516SKenneth E. Jansen        c6=BCtmpg(6)
102*59599516SKenneth E. Jansen        c7=BCtmpg(7)
103*59599516SKenneth E. Jansen        c8=wn1(1)
104*59599516SKenneth E. Jansen        c9=wn1(2)
105*59599516SKenneth E. Jansen        c10=wn1(3)
106*59599516SKenneth E. Jansen        c11=0
107*59599516SKenneth E. Jansen        ck1=c5*c10-c9*c6
108*59599516SKenneth E. Jansen        ck2=c4*c9-c8*c5
109*59599516SKenneth E. Jansen        ck3=c4*c9-c8*c5
110*59599516SKenneth E. Jansen        kk=nmax(ck1,ck2,ck3)
111*59599516SKenneth E. Jansen        if(kk.eq.1)then  ! u has the largest freedom
112*59599516SKenneth E. Jansen          iBC=iBC+48
113*59599516SKenneth E. Jansen          det=c5*c10-c9*c6
114*59599516SKenneth E. Jansen          BC(3)=(c10*c7-c6*c11)/det
115*59599516SKenneth E. Jansen          BC(4)=(c10*c4-c6*c8)/det
116*59599516SKenneth E. Jansen          BC(5)=(c11*c5-c9*c7)/det
117*59599516SKenneth E. Jansen          BC(6)=(c5*c8-c9*c4)/det
118*59599516SKenneth E. Jansen        elseif(kk.eq.2)then
119*59599516SKenneth E. Jansen          iBC=iBC+40
120*59599516SKenneth E. Jansen          det=c4*c10-c8*c6
121*59599516SKenneth E. Jansen          BC(3)=(c10*c7-c6*c11)/det
122*59599516SKenneth E. Jansen          BC(4)=(c10*c5-c6*c9)/det
123*59599516SKenneth E. Jansen          BC(5)=(c11*c4-c8*c7)/det
124*59599516SKenneth E. Jansen          BC(6)=(c4*c9-c5*c8)/det
125*59599516SKenneth E. Jansen        elseif(kk.eq.3)then
126*59599516SKenneth E. Jansen          iBC=iBC+24
127*59599516SKenneth E. Jansen          det=c4*c9-c8*c5
128*59599516SKenneth E. Jansen          BC(3)=(c9*c7-c5*c11)/det
129*59599516SKenneth E. Jansen          BC(4)=(c9*c6-c5*c10)/det
130*59599516SKenneth E. Jansen          BC(5)=(c4*c11-c8*c7)/det
131*59599516SKenneth E. Jansen          BC(6)=(c4*c10-c8*c6)/det
132*59599516SKenneth E. Jansen        endif
133*59599516SKenneth E. Jansen
134*59599516SKenneth E. Jansenccc case4: two slipwalls and one user-specified velocity BC
135*59599516SKenneth E. Jansen       elseif(nslpw.eq.2.and.(icd.eq.1.or.icd.eq.2.or.icd.eq.4))then
136*59599516SKenneth E. Jansen        iBC=iBC+56
137*59599516SKenneth E. Jansen        c4=BCtmpg(4)
138*59599516SKenneth E. Jansen        c5=BCtmpg(5)
139*59599516SKenneth E. Jansen        c6=BCtmpg(6)
140*59599516SKenneth E. Jansen        c7=BCtmpg(7)
141*59599516SKenneth E. Jansen        do islpw=1,9
142*59599516SKenneth E. Jansen           if(btest(ihis,islpw))exit
143*59599516SKenneth E. Jansen        enddo
144*59599516SKenneth E. Jansen        do jslpw=islpw+1,9
145*59599516SKenneth E. Jansen           if(btest(ihis,jslpw))exit
146*59599516SKenneth E. Jansen        enddo
147*59599516SKenneth E. Jansen        wn1(:)=wlnorm(:,islpw)
148*59599516SKenneth E. Jansen        wn2(:)=wlnorm(:,jslpw)
149*59599516SKenneth E. Jansen        c8=wn1(1)
150*59599516SKenneth E. Jansen        c9=wn1(2)
151*59599516SKenneth E. Jansen        c10=wn1(3)
152*59599516SKenneth E. Jansen        c11=0
153*59599516SKenneth E. Jansen        c12=wn2(1)
154*59599516SKenneth E. Jansen        c13=wn2(2)
155*59599516SKenneth E. Jansen        c14=wn2(3)
156*59599516SKenneth E. Jansen        c15=0
157*59599516SKenneth E. Jansen        tmp=det3x3(c4,c5,c6,c8,c9,c10,c12,c13,c14)
158*59599516SKenneth E. Jansen        BC(4)=det3x3(c4,c7,c6,c8,c11,c10,c12,c15,c14)/tmp
159*59599516SKenneth E. Jansen        BC(3)=det3x3(c7,c5,c6,c11,c9,c10,c15,c13,c14)/tmp
160*59599516SKenneth E. Jansen        BC(5)=det3x3(c4,c5,c7,c8,c9,c11,c12,c13,c15)/tmp
161*59599516SKenneth E. Jansen
162*59599516SKenneth E. Jansenccc case5: one slipwall and two user-specified velocity BC
163*59599516SKenneth E. Jansen       elseif(nslpw.eq.1.and.(icd.eq.3.or.icd.eq.5.or.icd.eq.6))then
164*59599516SKenneth E. Jansen        iBC=iBC+56
165*59599516SKenneth E. Jansen        c4=BCtmpg(4)
166*59599516SKenneth E. Jansen        c5=BCtmpg(5)
167*59599516SKenneth E. Jansen        c6=BCtmpg(6)
168*59599516SKenneth E. Jansen        c7=BCtmpg(7)
169*59599516SKenneth E. Jansen        c8=BCtmpg(8)
170*59599516SKenneth E. Jansen        c9=BCtmpg(9)
171*59599516SKenneth E. Jansen        c10=BCtmpg(10)
172*59599516SKenneth E. Jansen        c11=BCtmpg(11)
173*59599516SKenneth E. Jansen        do islpw=1,9
174*59599516SKenneth E. Jansen           if(btest(ihis,islpw))exit
175*59599516SKenneth E. Jansen        enddo
176*59599516SKenneth E. Jansen        wn1(:)=wlnorm(:,islpw)
177*59599516SKenneth E. Jansen        c12=wn1(1)
178*59599516SKenneth E. Jansen        c13=wn1(2)
179*59599516SKenneth E. Jansen        c14=wn1(3)
180*59599516SKenneth E. Jansen        c15=0
181*59599516SKenneth E. Jansen        tmp=det3x3(c4,c5,c6,c8,c9,c10,c12,c13,c14)
182*59599516SKenneth E. Jansen        BC(4)=det3x3(c4,c7,c6,c8,c11,c10,c12,c15,c14)/tmp
183*59599516SKenneth E. Jansen        BC(3)=det3x3(c7,c5,c6,c11,c9,c10,c15,c13,c14)/tmp
184*59599516SKenneth E. Jansen        BC(5)=det3x3(c4,c5,c7,c8,c9,c11,c12,c13,c15)/tmp
185*59599516SKenneth E. Jansen
186*59599516SKenneth E. Jansenccc case6: two slipwalls and two user-specified velocity BC
187*59599516SKenneth E. Jansen
188*59599516SKenneth E. Jansenccc case7: one slipwall and three user-specified velocity BC
189*59599516SKenneth E. Jansen       elseif(nslpw.eq.1.and.icd.eq.7)then
190*59599516SKenneth E. Jansen        iBC=iBC+56
191*59599516SKenneth E. Jansen        u=BC(3)
192*59599516SKenneth E. Jansen        v=BC(4)
193*59599516SKenneth E. Jansen        w=BC(5)
194*59599516SKenneth E. Jansen        do islpw=1,9
195*59599516SKenneth E. Jansen           if(btest(ihis,islpw))exit
196*59599516SKenneth E. Jansen        enddo
197*59599516SKenneth E. Jansen        wn1(:)=wlnorm(:,islpw)
198*59599516SKenneth E. Jansen        ii=nmax(wn1(1),wn1(2),wn1(3))
199*59599516SKenneth E. Jansen        if(ii.eq.1)then  ! u has the largest constrain
200*59599516SKenneth E. Jansen         BC(3)=-wn1(2)/wn1(1)*v-wn1(3)/wn1(1)*w  ! u is determined by v and w
201*59599516SKenneth E. Jansen        elseif(ii.eq.2)then ! v has the largest constrain
202*59599516SKenneth E. Jansen         BC(4)=-wn1(1)/wn1(2)*u-wn1(3)/wn1(2)*w  ! v is determined by u and w
203*59599516SKenneth E. Jansen        elseif(ii.eq.3)then ! w has the largest constrain
204*59599516SKenneth E. Jansen         BC(5)=-wn1(1)/wn1(3)*u-wn1(2)/wn1(3)*v  ! w is determined by u and v
205*59599516SKenneth E. Jansen        endif
206*59599516SKenneth E. Jansen
207*59599516SKenneth E. Jansenccc case8: two slipwall and three user-specified velocity BC
208*59599516SKenneth E. Jansen       elseif(nslpw.eq.2.and.icd.eq.7)then
209*59599516SKenneth E. Jansen        iBC=iBC+56
210*59599516SKenneth E. Jansen        u=BC(3)
211*59599516SKenneth E. Jansen        v=BC(4)
212*59599516SKenneth E. Jansen        w=BC(5)
213*59599516SKenneth E. Jansen        do islpw=1,9
214*59599516SKenneth E. Jansen           if(btest(ihis,islpw))exit
215*59599516SKenneth E. Jansen        enddo
216*59599516SKenneth E. Jansen        do jslpw=islpw+1,9
217*59599516SKenneth E. Jansen           if(btest(ihis,jslpw))exit
218*59599516SKenneth E. Jansen        enddo
219*59599516SKenneth E. Jansen        wn1(:)=wlnorm(:,islpw)
220*59599516SKenneth E. Jansen        wn2(:)=wlnorm(:,jslpw)
221*59599516SKenneth E. Jansen        c4=wn1(1)
222*59599516SKenneth E. Jansen        c5=wn1(2)
223*59599516SKenneth E. Jansen        c6=wn1(3)
224*59599516SKenneth E. Jansen        c7=0
225*59599516SKenneth E. Jansen        c8=wn2(1)
226*59599516SKenneth E. Jansen        c9=wn2(2)
227*59599516SKenneth E. Jansen        c10=wn2(3)
228*59599516SKenneth E. Jansen        c11=0
229*59599516SKenneth E. Jansen        ck1=c5*c10-c9*c6   ! ck is the cross product of wn1 and wn2
230*59599516SKenneth E. Jansen        ck2=c4*c9-c8*c5
231*59599516SKenneth E. Jansen        ck3=c4*c9-c8*c5
232*59599516SKenneth E. Jansen        kk=nmax(ck1,ck2,ck3)
233*59599516SKenneth E. Jansen        if(kk.eq.1)then  ! u has the largest freedom
234*59599516SKenneth E. Jansen          det=c5*c10-c9*c6
235*59599516SKenneth E. Jansen          BC(4)=(c10*c7-c6*c11)/det-(c10*c4-c6*c8)/det*u ! v is determined by u
236*59599516SKenneth E. Jansen          BC(5)=(c11*c5-c9*c7)/det-(c5*c8-c9*c4)/det*u   ! w is determined by u
237*59599516SKenneth E. Jansen        elseif(kk.eq.2)then ! v has the largest freedom
238*59599516SKenneth E. Jansen          det=c4*c10-c8*c6
239*59599516SKenneth E. Jansen          BC(3)=(c10*c7-c6*c11)/det-(c10*c5-c6*c9)/det*v ! u is determined by v
240*59599516SKenneth E. Jansen          BC(5)=(c11*c4-c8*c7)/det-(c4*c9-c5*c8)/det*v   ! w is determined by v
241*59599516SKenneth E. Jansen        elseif(kk.eq.3)then  ! w has the largest freedom
242*59599516SKenneth E. Jansen          det=c4*c9-c8*c5
243*59599516SKenneth E. Jansen          BC(3)=(c9*c7-c5*c11)/det-(c9*c6-c5*c10)/det*w  ! u is determined by w
244*59599516SKenneth E. Jansen          BC(4)=(c4*c11-c8*c7)/det-(c4*c10-c8*c6)/det*w  ! v is determined by w
245*59599516SKenneth E. Jansen        endif
246*59599516SKenneth E. Jansen
247*59599516SKenneth E. Jansenccc case9: more than three slipwalls is acutally non-slip wall, regardless of user-specified velocity BC
248*59599516SKenneth E. Jansen       elseif(nslpw.ge.3)then
249*59599516SKenneth E. Jansen          iBC=iBC+56
250*59599516SKenneth E. Jansen          BC(3:5)=0
251*59599516SKenneth E. Jansenccc
252*59599516SKenneth E. Jansen
253*59599516SKenneth E. Jansen       endif
254*59599516SKenneth E. Jansen
255*59599516SKenneth E. Jansen       return
256*59599516SKenneth E. Jansen       end
257*59599516SKenneth E. Jansen
258*59599516SKenneth E. Jansencccccccccccccc
259*59599516SKenneth E. Jansen
260*59599516SKenneth E. Jansen       integer function nmax(nx,ny,nz)
261*59599516SKenneth E. Jansen       real*8 nx,ny,nz
262*59599516SKenneth E. Jansen       real*8 lnx,lny,lnz
263*59599516SKenneth E. Jansen          lnx=abs(nx)
264*59599516SKenneth E. Jansen          lny=abs(ny)
265*59599516SKenneth E. Jansen          lnz=abs(nz)
266*59599516SKenneth E. Jansen          if(lnx.gt.lny.and.lnx.gt.lnz)nmax=1
267*59599516SKenneth E. Jansen          if(lny.gt.lnx.and.lny.gt.lnz)nmax=2
268*59599516SKenneth E. Jansen          if(lnz.gt.lnx.and.lnz.gt.lny)nmax=3
269*59599516SKenneth E. Jansen          return
270*59599516SKenneth E. Jansen       end
271*59599516SKenneth E. Jansen
272*59599516SKenneth E. Jansencccccccccccccc
273*59599516SKenneth E. Jansen
274*59599516SKenneth E. Jansen       real*8 function det3x3(a1,a2,a3,a4,a5,a6,a7,a8,a9)
275*59599516SKenneth E. Jansen       real*8 a1,a2,a3,a4,a5,a6,a7,a8,a9
276*59599516SKenneth E. Jansen         det3x3=a1*a5*a9+a4*a8*a3+a7*a6*a2-a7*a5*a3-a8*a6*a1-a9*a4*a2
277*59599516SKenneth E. Jansen       return
278*59599516SKenneth E. Jansen       end
279*59599516SKenneth E. Jansen
280*59599516SKenneth E. Jansen
281*59599516SKenneth E. Jansen
282*59599516SKenneth E. Jansen
283*59599516SKenneth E. Jansen
284*59599516SKenneth E. Jansen
285*59599516SKenneth E. Jansen
286*59599516SKenneth E. Jansen
287