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