xref: /phasta/phSolver/common/slpwBC.f (revision 712d3df0b59ebebaaeaea358162c8d2c043c6e08)
159599516SKenneth E. Jansen       subroutine slpwBC(nslpw,ihis,iBCg,BCg,BCtmpg,iBC,BC,wlnorm)
259599516SKenneth E. Jansen       include "common.h"
359599516SKenneth E. Jansen       include "mpif.h"
459599516SKenneth E. Jansen
559599516SKenneth E. Jansen       integer nslpw,ihis,iBCg,iBC
659599516SKenneth E. Jansen       real*8 BCg(ndofBC)
759599516SKenneth E. Jansen       real*8 BCtmpg(ndof+7)
859599516SKenneth E. Jansen       real*8 BC(ndofBC)
959599516SKenneth E. Jansen       real*8 wlnorm(3,9)
1059599516SKenneth E. Jansen       real*8 c4,c5,c6,c7
1159599516SKenneth E. Jansen       real*8 c8,c9,c10,c11
1259599516SKenneth E. Jansen       real*8 c12,c13,c14,c15
1359599516SKenneth E. Jansen       real*8 ck1,ck2,ck3
1459599516SKenneth E. Jansen       real*8 det,det3x3,tmp,u,v,w
1559599516SKenneth E. Jansen       integer nmax
1659599516SKenneth E. Jansen       real*8 wn1(3),wn2(3),wn3(3)
1759599516SKenneth E. Jansen
1859599516SKenneth E. Jansen       icd      = ibits(iBCg,3,3)
1959599516SKenneth E. Jansen       ixset    = ibits(iBCg,3,1)
2059599516SKenneth E. Jansen       iyset    = ibits(iBCg,4,1)
2159599516SKenneth E. Jansen       izset    = ibits(iBCg,5,1)
22*513954efSKenneth E. JansenC
23*513954efSKenneth E. JansenC...   release the previous setting for velocities
24*513954efSKenneth E. JansenC
2559599516SKenneth E. Jansen       iBC      = iBCg-(ixset*8+iyset*16+izset*32)
2659599516SKenneth E. Jansen
27*513954efSKenneth E. Jansen
2859599516SKenneth E. Jansenccc case1: one slipwall and no user-specified velocity BC
2959599516SKenneth E. Jansen       if(nslpw.eq.1.and.icd.eq.0)then
3059599516SKenneth E. Jansen        do islpw=1,9
3159599516SKenneth E. Jansen           if(btest(ihis,islpw))exit
3259599516SKenneth E. Jansen        enddo
3359599516SKenneth E. Jansen        wn1(:)=wlnorm(:,islpw)
3459599516SKenneth E. Jansen        ii=nmax(wn1(1),wn1(2),wn1(3))
35*513954efSKenneth E. Jansen        if(ii.eq.1)then  ! u has the largest constrain, u should be constrained
3659599516SKenneth E. Jansen         iBC  = iBC+8
3759599516SKenneth E. Jansen         BC(3)= 0
3859599516SKenneth E. Jansen         BC(4)= wn1(2)/wn1(1)
3959599516SKenneth E. Jansen         BC(5)= wn1(3)/wn1(1)
4059599516SKenneth E. Jansen        elseif(ii.eq.2)then
4159599516SKenneth E. Jansen         iBC=iBC+16
4259599516SKenneth E. Jansen         BC(3)=0
4359599516SKenneth E. Jansen         BC(4)=wn1(1)/wn1(2)
4459599516SKenneth E. Jansen         BC(5)=wn1(3)/wn1(2)
4559599516SKenneth E. Jansen        elseif(ii.eq.3)then
4659599516SKenneth E. Jansen         iBC=iBC+32
4759599516SKenneth E. Jansen         BC(3)=0
4859599516SKenneth E. Jansen         BC(4)=wn1(1)/wn1(3)
4959599516SKenneth E. Jansen         BC(5)=wn1(2)/wn1(3)
5059599516SKenneth E. Jansen        endif
5159599516SKenneth E. Jansen
5259599516SKenneth E. Jansenccc case2: two slipwall and no user-specified velocity BC
5359599516SKenneth E. Jansen       elseif(nslpw.eq.2.and.icd.eq.0)then
5459599516SKenneth E. Jansen        do islpw=1,9
5559599516SKenneth E. Jansen           if(btest(ihis,islpw))exit
5659599516SKenneth E. Jansen        enddo
5759599516SKenneth E. Jansen        do jslpw=islpw+1,9
5859599516SKenneth E. Jansen           if(btest(ihis,jslpw))exit
5959599516SKenneth E. Jansen        enddo
6059599516SKenneth E. Jansen        wn1(:)=wlnorm(:,islpw)
6159599516SKenneth E. Jansen        wn2(:)=wlnorm(:,jslpw)
6259599516SKenneth E. Jansen        c4=wn1(1)
6359599516SKenneth E. Jansen        c5=wn1(2)
6459599516SKenneth E. Jansen        c6=wn1(3)
6559599516SKenneth E. Jansen        c7=0
6659599516SKenneth E. Jansen        c8=wn2(1)
6759599516SKenneth E. Jansen        c9=wn2(2)
6859599516SKenneth E. Jansen        c10=wn2(3)
6959599516SKenneth E. Jansen        c11=0
70*513954efSKenneth E. JansenC
71*513954efSKenneth E. JansenC... ck is the cross product of wn1 and wn2
72*513954efSKenneth E. JansenC
7359599516SKenneth E. Jansen        ck1=c5*c10 - c9*c6
74*513954efSKenneth E. Jansen        ck2=c6*c8  - c4*c10
7559599516SKenneth E. Jansen        ck3=c4*c9  - c8*c5
76*513954efSKenneth E. Jansen
7759599516SKenneth E. Jansen        kk=nmax(ck1,ck2,ck3)
78*513954efSKenneth E. Jansen
79*513954efSKenneth E. Jansen        if(kk.eq.1)then  ! u has the largest freedom, v and w should be constrained
80*513954efSKenneth E. JansenC
8159599516SKenneth E. Jansen          iBC=iBC + 48
8259599516SKenneth E. Jansen          det=c5*c10-c9*c6
8359599516SKenneth E. Jansen          BC(3)=(c10*c7-c6*c11)/det
8459599516SKenneth E. Jansen          BC(4)=(c10*c4-c6*c8)/det
8559599516SKenneth E. Jansen          BC(5)=(c11*c5-c9*c7)/det
8659599516SKenneth E. Jansen          BC(6)=(c5*c8-c9*c4)/det
8759599516SKenneth E. Jansen        elseif(kk.eq.2)then
8859599516SKenneth E. Jansen          iBC=iBC+40
8959599516SKenneth E. Jansen          det=c4*c10-c8*c6
9059599516SKenneth E. Jansen          BC(3)=(c10*c7-c6*c11)/det
9159599516SKenneth E. Jansen          BC(4)=(c10*c5-c6*c9)/det
9259599516SKenneth E. Jansen          BC(5)=(c11*c4-c8*c7)/det
9359599516SKenneth E. Jansen          BC(6)=(c4*c9-c5*c8)/det
9459599516SKenneth E. Jansen        elseif(kk.eq.3)then
9559599516SKenneth E. Jansen          iBC=iBC+24
9659599516SKenneth E. Jansen          det=c4*c9-c8*c5
9759599516SKenneth E. Jansen          BC(3)=(c9*c7-c5*c11)/det
9859599516SKenneth E. Jansen          BC(4)=(c9*c6-c5*c10)/det
9959599516SKenneth E. Jansen          BC(5)=(c4*c11-c8*c7)/det
10059599516SKenneth E. Jansen          BC(6)=(c4*c10-c8*c6)/det
10159599516SKenneth E. Jansen        endif
10259599516SKenneth E. Jansen
10359599516SKenneth E. Jansenccc case3: one slipwall and one user-specified velocity BC
10459599516SKenneth E. Jansen       elseif(nslpw.eq.1.and.(icd.eq.1.or.icd.eq.2.or.icd.eq.4))then
10559599516SKenneth E. Jansen        do islpw=1,9
10659599516SKenneth E. Jansen           if(btest(ihis,islpw))exit
10759599516SKenneth E. Jansen        enddo
10859599516SKenneth E. Jansen        wn1(:)=wlnorm(:,islpw)
10959599516SKenneth E. Jansen        c4=BCtmpg(4)
11059599516SKenneth E. Jansen        c5=BCtmpg(5)
11159599516SKenneth E. Jansen        c6=BCtmpg(6)
11259599516SKenneth E. Jansen        c7=BCtmpg(7)
11359599516SKenneth E. Jansen        c8=wn1(1)
11459599516SKenneth E. Jansen        c9=wn1(2)
11559599516SKenneth E. Jansen        c10=wn1(3)
11659599516SKenneth E. Jansen        c11=0
117*513954efSKenneth E. Jansen
11859599516SKenneth E. Jansen        ck1=c5*c10 - c9*c6
119*513954efSKenneth E. Jansen        ck2=c6*c8  - c4*c10
12059599516SKenneth E. Jansen        ck3=c4*c9  - c8*c5
121*513954efSKenneth E. Jansen
12259599516SKenneth E. Jansen        kk=nmax(ck1,ck2,ck3)
12359599516SKenneth E. Jansen        if(kk.eq.1)then  ! u has the largest freedom
12459599516SKenneth E. Jansen          iBC=iBC+48
12559599516SKenneth E. Jansen          det=c5*c10-c9*c6
12659599516SKenneth E. Jansen          BC(3)=(c10*c7-c6*c11)/det
12759599516SKenneth E. Jansen          BC(4)=(c10*c4-c6*c8)/det
12859599516SKenneth E. Jansen          BC(5)=(c11*c5-c9*c7)/det
12959599516SKenneth E. Jansen          BC(6)=(c5*c8-c9*c4)/det
13059599516SKenneth E. Jansen        elseif(kk.eq.2)then
13159599516SKenneth E. Jansen          iBC=iBC+40
13259599516SKenneth E. Jansen          det=c4*c10-c8*c6
13359599516SKenneth E. Jansen          BC(3)=(c10*c7-c6*c11)/det
13459599516SKenneth E. Jansen          BC(4)=(c10*c5-c6*c9)/det
13559599516SKenneth E. Jansen          BC(5)=(c11*c4-c8*c7)/det
13659599516SKenneth E. Jansen          BC(6)=(c4*c9-c5*c8)/det
13759599516SKenneth E. Jansen        elseif(kk.eq.3)then
13859599516SKenneth E. Jansen          iBC=iBC+24
13959599516SKenneth E. Jansen          det=c4*c9-c8*c5
14059599516SKenneth E. Jansen          BC(3)=(c9*c7-c5*c11)/det
14159599516SKenneth E. Jansen          BC(4)=(c9*c6-c5*c10)/det
14259599516SKenneth E. Jansen          BC(5)=(c4*c11-c8*c7)/det
14359599516SKenneth E. Jansen          BC(6)=(c4*c10-c8*c6)/det
14459599516SKenneth E. Jansen        endif
14559599516SKenneth E. Jansen
14659599516SKenneth E. Jansenccc case4: two slipwalls and one user-specified velocity BC
14759599516SKenneth E. Jansen       elseif(nslpw.eq.2.and.(icd.eq.1.or.icd.eq.2.or.icd.eq.4))then
14859599516SKenneth E. Jansen        iBC=iBC+56
14959599516SKenneth E. Jansen        c4=BCtmpg(4)
15059599516SKenneth E. Jansen        c5=BCtmpg(5)
15159599516SKenneth E. Jansen        c6=BCtmpg(6)
15259599516SKenneth E. Jansen        c7=BCtmpg(7)
15359599516SKenneth E. Jansen        do islpw=1,9
15459599516SKenneth E. Jansen           if(btest(ihis,islpw))exit
15559599516SKenneth E. Jansen        enddo
15659599516SKenneth E. Jansen        do jslpw=islpw+1,9
15759599516SKenneth E. Jansen           if(btest(ihis,jslpw))exit
15859599516SKenneth E. Jansen        enddo
15959599516SKenneth E. Jansen        wn1(:)=wlnorm(:,islpw)
16059599516SKenneth E. Jansen        wn2(:)=wlnorm(:,jslpw)
16159599516SKenneth E. Jansen        c8=wn1(1)
16259599516SKenneth E. Jansen        c9=wn1(2)
16359599516SKenneth E. Jansen        c10=wn1(3)
16459599516SKenneth E. Jansen        c11=0
16559599516SKenneth E. Jansen        c12=wn2(1)
16659599516SKenneth E. Jansen        c13=wn2(2)
16759599516SKenneth E. Jansen        c14=wn2(3)
16859599516SKenneth E. Jansen        c15=0
16959599516SKenneth E. Jansen        tmp=det3x3(c4,c5,c6,c8,c9,c10,c12,c13,c14)
17059599516SKenneth E. Jansen        BC(4)=det3x3(c4,c7,c6,c8,c11,c10,c12,c15,c14)/tmp
17159599516SKenneth E. Jansen        BC(3)=det3x3(c7,c5,c6,c11,c9,c10,c15,c13,c14)/tmp
17259599516SKenneth E. Jansen        BC(5)=det3x3(c4,c5,c7,c8,c9,c11,c12,c13,c15)/tmp
17359599516SKenneth E. Jansen
17459599516SKenneth E. Jansenccc case5: one slipwall and two user-specified velocity BC
17559599516SKenneth E. Jansen       elseif(nslpw.eq.1.and.(icd.eq.3.or.icd.eq.5.or.icd.eq.6))then
17659599516SKenneth E. Jansen        iBC=iBC+56
17759599516SKenneth E. Jansen        c4=BCtmpg(4)
17859599516SKenneth E. Jansen        c5=BCtmpg(5)
17959599516SKenneth E. Jansen        c6=BCtmpg(6)
18059599516SKenneth E. Jansen        c7=BCtmpg(7)
18159599516SKenneth E. Jansen        c8=BCtmpg(8)
18259599516SKenneth E. Jansen        c9=BCtmpg(9)
18359599516SKenneth E. Jansen        c10=BCtmpg(10)
18459599516SKenneth E. Jansen        c11=BCtmpg(11)
18559599516SKenneth E. Jansen        do islpw=1,9
18659599516SKenneth E. Jansen           if(btest(ihis,islpw))exit
18759599516SKenneth E. Jansen        enddo
18859599516SKenneth E. Jansen        wn1(:)=wlnorm(:,islpw)
18959599516SKenneth E. Jansen        c12=wn1(1)
19059599516SKenneth E. Jansen        c13=wn1(2)
19159599516SKenneth E. Jansen        c14=wn1(3)
19259599516SKenneth E. Jansen        c15=0
19359599516SKenneth E. Jansen        tmp=det3x3(c4,c5,c6,c8,c9,c10,c12,c13,c14)
19459599516SKenneth E. Jansen        BC(4)=det3x3(c4,c7,c6,c8,c11,c10,c12,c15,c14)/tmp
19559599516SKenneth E. Jansen        BC(3)=det3x3(c7,c5,c6,c11,c9,c10,c15,c13,c14)/tmp
19659599516SKenneth E. Jansen        BC(5)=det3x3(c4,c5,c7,c8,c9,c11,c12,c13,c15)/tmp
19759599516SKenneth E. Jansen
19859599516SKenneth E. Jansenccc case6: two slipwalls and two user-specified velocity BC
19959599516SKenneth E. Jansen
20059599516SKenneth E. Jansenccc case7: one slipwall and three user-specified velocity BC
20159599516SKenneth E. Jansen       elseif(nslpw.eq.1.and.icd.eq.7)then
20259599516SKenneth E. Jansen        iBC=iBC+56
20359599516SKenneth E. Jansen        u=BC(3)
20459599516SKenneth E. Jansen        v=BC(4)
20559599516SKenneth E. Jansen        w=BC(5)
20659599516SKenneth E. Jansen        do islpw=1,9
20759599516SKenneth E. Jansen           if(btest(ihis,islpw))exit
20859599516SKenneth E. Jansen        enddo
20959599516SKenneth E. Jansen        wn1(:)=wlnorm(:,islpw)
21059599516SKenneth E. Jansen        ii=nmax(wn1(1),wn1(2),wn1(3))
21159599516SKenneth E. Jansen        if(ii.eq.1)then  ! u has the largest constrain
21259599516SKenneth E. Jansen         BC(3)=-wn1(2)/wn1(1)*v-wn1(3)/wn1(1)*w  ! u is determined by v and w
21359599516SKenneth E. Jansen        elseif(ii.eq.2)then ! v has the largest constrain
21459599516SKenneth E. Jansen         BC(4)=-wn1(1)/wn1(2)*u-wn1(3)/wn1(2)*w  ! v is determined by u and w
21559599516SKenneth E. Jansen        elseif(ii.eq.3)then ! w has the largest constrain
21659599516SKenneth E. Jansen         BC(5)=-wn1(1)/wn1(3)*u-wn1(2)/wn1(3)*v  ! w is determined by u and v
21759599516SKenneth E. Jansen        endif
21859599516SKenneth E. Jansen
21959599516SKenneth E. Jansenccc case8: two slipwall and three user-specified velocity BC
22059599516SKenneth E. Jansen       elseif(nslpw.eq.2.and.icd.eq.7)then
22159599516SKenneth E. Jansen        iBC=iBC+56
22259599516SKenneth E. Jansen        u=BC(3)
22359599516SKenneth E. Jansen        v=BC(4)
22459599516SKenneth E. Jansen        w=BC(5)
22559599516SKenneth E. Jansen        do islpw=1,9
22659599516SKenneth E. Jansen           if(btest(ihis,islpw))exit
22759599516SKenneth E. Jansen        enddo
22859599516SKenneth E. Jansen        do jslpw=islpw+1,9
22959599516SKenneth E. Jansen           if(btest(ihis,jslpw))exit
23059599516SKenneth E. Jansen        enddo
23159599516SKenneth E. Jansen        wn1(:)=wlnorm(:,islpw)
23259599516SKenneth E. Jansen        wn2(:)=wlnorm(:,jslpw)
23359599516SKenneth E. Jansen        c4=wn1(1)
23459599516SKenneth E. Jansen        c5=wn1(2)
23559599516SKenneth E. Jansen        c6=wn1(3)
23659599516SKenneth E. Jansen        c7=0
23759599516SKenneth E. Jansen        c8=wn2(1)
23859599516SKenneth E. Jansen        c9=wn2(2)
23959599516SKenneth E. Jansen        c10=wn2(3)
24059599516SKenneth E. Jansen        c11=0
241*513954efSKenneth E. Jansen
24259599516SKenneth E. Jansen        ck1=c5*c10 - c9*c6     ! ck is the cross product of wn1 and wn2
243*513954efSKenneth E. Jansen        ck2=c6*c8  - c4*c10
24459599516SKenneth E. Jansen        ck3=c4*c9  - c8*c5
245*513954efSKenneth E. Jansen
24659599516SKenneth E. Jansen        kk=nmax(ck1,ck2,ck3)
24759599516SKenneth E. Jansen        if(kk.eq.1)then  ! u has the largest freedom
24859599516SKenneth E. Jansen          det=c5*c10-c9*c6
24959599516SKenneth E. Jansen          BC(4)=(c10*c7-c6*c11)/det-(c10*c4-c6*c8)/det*u ! v is determined by u
25059599516SKenneth E. Jansen          BC(5)=(c11*c5-c9*c7)/det-(c5*c8-c9*c4)/det*u   ! w is determined by u
25159599516SKenneth E. Jansen        elseif(kk.eq.2)then ! v has the largest freedom
25259599516SKenneth E. Jansen          det=c4*c10-c8*c6
25359599516SKenneth E. Jansen          BC(3)=(c10*c7-c6*c11)/det-(c10*c5-c6*c9)/det*v ! u is determined by v
25459599516SKenneth E. Jansen          BC(5)=(c11*c4-c8*c7)/det-(c4*c9-c5*c8)/det*v   ! w is determined by v
25559599516SKenneth E. Jansen        elseif(kk.eq.3)then  ! w has the largest freedom
25659599516SKenneth E. Jansen          det=c4*c9-c8*c5
25759599516SKenneth E. Jansen          BC(3)=(c9*c7-c5*c11)/det-(c9*c6-c5*c10)/det*w  ! u is determined by w
25859599516SKenneth E. Jansen          BC(4)=(c4*c11-c8*c7)/det-(c4*c10-c8*c6)/det*w  ! v is determined by w
25959599516SKenneth E. Jansen        endif
26059599516SKenneth E. Jansen
26159599516SKenneth E. Jansenccc case9: more than three slipwalls is acutally non-slip wall, regardless of user-specified velocity BC
26259599516SKenneth E. Jansen       elseif(nslpw.ge.3)then
26359599516SKenneth E. Jansen          iBC=iBC+56
26459599516SKenneth E. Jansen          BC(3:5)=0
26559599516SKenneth E. Jansenccc
26659599516SKenneth E. Jansen
26759599516SKenneth E. Jansen       endif
26859599516SKenneth E. Jansen
26959599516SKenneth E. Jansen       return
27059599516SKenneth E. Jansen       end
27159599516SKenneth E. Jansen
272*513954efSKenneth E. JansenC-------------------------------------------------
273*513954efSKenneth E. JansenC function nmax
274*513954efSKenneth E. JansenC     returns the index at which the input number
275*513954efSKenneth E. JansenC     has the largest absolute value.
276*513954efSKenneth E. JansenC     For example nmax( 0.1, -3.4, 1.2  ) = 2
277*513954efSKenneth E. JansenC-------------------------------------------------
27859599516SKenneth E. Jansen
27959599516SKenneth E. Jansen       integer function nmax(nx,ny,nz)
28059599516SKenneth E. Jansen       real*8 nx,ny,nz
28159599516SKenneth E. Jansen       real*8 lnx,lny,lnz
28259599516SKenneth E. Jansen          lnx=abs(nx)
28359599516SKenneth E. Jansen          lny=abs(ny)
28459599516SKenneth E. Jansen          lnz=abs(nz)
28559599516SKenneth E. Jansen          if(lnx.gt.lny.and.lnx.gt.lnz)nmax=1
28659599516SKenneth E. Jansen          if(lny.gt.lnx.and.lny.gt.lnz)nmax=2
28759599516SKenneth E. Jansen          if(lnz.gt.lnx.and.lnz.gt.lny)nmax=3
28859599516SKenneth E. Jansen          return
28959599516SKenneth E. Jansen       end
29059599516SKenneth E. Jansen
291*513954efSKenneth E. JansenC-----------------------------------------------------------
292*513954efSKenneth E. JansenC function det3x3 computes the determinant of a 3x3 matrix
293*513954efSKenneth E. JansenC-----------------------------------------------------------
29459599516SKenneth E. Jansen
29559599516SKenneth E. Jansen       real*8 function det3x3(a1,a2,a3,a4,a5,a6,a7,a8,a9)
29659599516SKenneth E. Jansen       real*8 a1,a2,a3,a4,a5,a6,a7,a8,a9
29759599516SKenneth E. Jansen         det3x3=a1*a5*a9+a4*a8*a3+a7*a6*a2-a7*a5*a3-a8*a6*a1-a9*a4*a2
29859599516SKenneth E. Jansen       return
29959599516SKenneth E. Jansen       end
30059599516SKenneth E. Jansen
30159599516SKenneth E. Jansen
30259599516SKenneth E. Jansen
30359599516SKenneth E. Jansen
30459599516SKenneth E. Jansen
30559599516SKenneth E. Jansen
30659599516SKenneth E. Jansen
30759599516SKenneth E. Jansen
308