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