159599516SKenneth E. Jansen subroutine findslpw(x,ilwork,iper,iBC) 259599516SKenneth E. Jansen use pointer_data 359599516SKenneth E. Jansen use slpw 459599516SKenneth E. Jansen include "common.h" 559599516SKenneth E. Jansen include "mpif.h" 659599516SKenneth E. Jansen real*8 x(numnp,nsd) 759599516SKenneth E. Jansen integer iper(nshg) 859599516SKenneth E. Jansen integer ilwork(nlwork) 959599516SKenneth E. Jansen integer ifirstvisit(nshg) 1059599516SKenneth E. Jansen integer, allocatable :: ienb(:) 1159599516SKenneth E. Jansen real*8 elnrm(nsd),wn1(nsd),wn2(nsd),wn3(nsd),aedg(nsd),bedg(nsd) 1259599516SKenneth E. Jansen real*8 mag 1359599516SKenneth E. Jansen integer iBC(nshg) 1459599516SKenneth E. Jansen integer, allocatable :: IDslpw(:) 1559599516SKenneth E. Jansen real*8 AA(nsd),BB(nsd),tmp 1659599516SKenneth E. Jansen integer iparall 1759599516SKenneth E. Jansen 1859599516SKenneth E. Jansen allocate(idxslpw(nshg)) 1959599516SKenneth E. Jansen allocate(mpslpw(nshg,2)) 2059599516SKenneth E. Jansen allocate(wlnorm(nshg,nsd,9)) 2159599516SKenneth E. Jansen 2259599516SKenneth E. Jansen 2359599516SKenneth E. Jansen nslpwnd=0 2459599516SKenneth E. Jansen idxslpw=0 2559599516SKenneth E. Jansen mpslpw=0 2659599516SKenneth E. Jansen wlnorm=0 2759599516SKenneth E. Jansen ifirstvisit(:)=1 2859599516SKenneth E. Jansen do iblk=1,nelblb 2959599516SKenneth E. Jansen npro=lcblkb(1,iblk+1)-lcblkb(1,iblk) 3059599516SKenneth E. Jansen nenbl=lcblkb(6,iblk) 3159599516SKenneth E. Jansen nshl=lcblkb(9,iblk) 3259599516SKenneth E. Jansen allocate(ienb(nshl)) 3359599516SKenneth E. Jansen do i=1,npro 3459599516SKenneth E. Jansen isfID=miBCB(iblk)%p(i,2) 3559599516SKenneth E. Jansen if(isfID.gt.709.or.isfID.lt.701)cycle 3659599516SKenneth E. Jansen islpw=mod(isfID,700) 3759599516SKenneth E. Jansen ienb(1:nshl)=mienb(iblk)%p(i,1:nshl) 3859599516SKenneth E. Jansen do j=1,nenbl 3959599516SKenneth E. Jansen nn=ienb(j) 4059599516SKenneth E. Jansen if(ifirstvisit(nn).eq.1)then 4159599516SKenneth E. Jansen ifirstvisit(nn)=0 4259599516SKenneth E. Jansen nslpwnd=nslpwnd+1 4359599516SKenneth E. Jansen idxslpw(nslpwnd)=nn 4459599516SKenneth E. Jansen endif 4559599516SKenneth E. Jansen if(.not.btest(mpslpw(nn,2),islpw))then 4659599516SKenneth E. Jansen mpslpw(nn,1)=mpslpw(nn,1)+1 4759599516SKenneth E. Jansen mpslpw(nn,2)=mpslpw(nn,2)+2**islpw 4859599516SKenneth E. Jansen endif 4959599516SKenneth E. Jansen if(j.ne.1.and.j.ne.nenbl)then 5059599516SKenneth E. Jansen aedg(:)=x(ienb(j+1),:)-x(nn,:) 5159599516SKenneth E. Jansen bedg(:)=x(ienb(j-1),:)-x(nn,:) 5259599516SKenneth E. Jansen elseif(j.eq.1)then 5359599516SKenneth E. Jansen aedg(:)=x(ienb(j+1),:)-x(nn,:) 5459599516SKenneth E. Jansen bedg(:)=x(ienb(nenbl),:)-x(nn,:) 5559599516SKenneth E. Jansen elseif(j.eq.nenbl)then 5659599516SKenneth E. Jansen aedg(:)=x(ienb(1),:)-x(nn,:) 5759599516SKenneth E. Jansen bedg(:)=x(ienb(j-1),:)-x(nn,:) 5859599516SKenneth E. Jansen endif 5959599516SKenneth E. Jansen elnrm(1)=aedg(2)*bedg(3)-aedg(3)*bedg(2) 6059599516SKenneth E. Jansen elnrm(2)=aedg(3)*bedg(1)-aedg(1)*bedg(3) 6159599516SKenneth E. Jansen elnrm(3)=aedg(1)*bedg(2)-aedg(2)*bedg(1) 6259599516SKenneth E. Jansen wlnorm(nn,:,islpw)=wlnorm(nn,:,islpw)+elnrm(:) 6359599516SKenneth E. Jansen enddo 6459599516SKenneth E. Jansen enddo 6559599516SKenneth E. Jansen deallocate(ienb) 6659599516SKenneth E. Jansen enddo 6759599516SKenneth E. Jansen 6859599516SKenneth E. Jansen do k=1,9 6959599516SKenneth E. Jansen if(numpe.gt.1) call commu(wlnorm(:,:,k),ilwork,3,'in ') 7059599516SKenneth E. Jansen call bc3per(iBC,wlnorm(:,:,k),iper,ilwork,3) 7159599516SKenneth E. Jansen if(numpe.gt.1) call commu(wlnorm(:,:,k),ilwork,3,'out') 7259599516SKenneth E. Jansen enddo 7359599516SKenneth E. Jansencccccccccccccccccccccccccccccccccccccccccccccccccc 7459599516SKenneth E. Jansen 7559599516SKenneth E. Jansen 7659599516SKenneth E. Jansen do id=1,nslpwnd 7759599516SKenneth E. Jansen nn=idxslpw(id) 7859599516SKenneth E. Jansen nslpw=mpslpw(nn,1) 7959599516SKenneth E. Jansen ihis=mpslpw(nn,2) 8059599516SKenneth E. Jansen nslpwg=nslpw 8159599516SKenneth E. Jansen 8259599516SKenneth E. Jansen allocate(IDslpw(nslpw)) 8359599516SKenneth E. Jansen jslpw=0 8459599516SKenneth E. Jansen do ni=1,nslpw 8559599516SKenneth E. Jansen do islpw=1+jslpw,9 8659599516SKenneth E. Jansen if(btest(ihis,islpw))exit 8759599516SKenneth E. Jansen enddo 8859599516SKenneth E. Jansen IDslpw(ni)=islpw 8959599516SKenneth E. Jansen jslpw=islpw 9059599516SKenneth E. Jansen enddo 9159599516SKenneth E. Jansen 9259599516SKenneth E. Jansen ired=0 9359599516SKenneth E. Jansen do i=1,nslpwg 9459599516SKenneth E. Jansen if(btest(ired,i))cycle 9559599516SKenneth E. Jansen do j=i+1,nslpwg 9659599516SKenneth E. Jansen AA(:)=wlnorm(nn,:,IDslpw(i)) 9759599516SKenneth E. Jansen BB(:)=wlnorm(nn,:,IDslpw(j)) 9859599516SKenneth E. Jansen if(iparall(AA,BB).eq.1)then 9959599516SKenneth E. Jansen nslpw=nslpw-1 10059599516SKenneth E. Jansen ihis=ihis-2**IDslpw(j) 10159599516SKenneth E. Jansen wlnorm(nn,:,IDslpw(i))=AA(:)+BB(:) 10259599516SKenneth E. Jansen ired=ired+2**j 10359599516SKenneth E. Jansen endif 10459599516SKenneth E. Jansen enddo 10559599516SKenneth E. Jansen enddo 10659599516SKenneth E. Jansen 10759599516SKenneth E. Jansen do k=1,9 10859599516SKenneth E. Jansen wn1(:)=wlnorm(nn,:,k) 10959599516SKenneth E. Jansen mag=(wn1(1)**2+wn1(2)**2+wn1(3)**2)**0.5 11059599516SKenneth E. Jansen if(mag.ne.0)wlnorm(nn,:,k)=wn1(:)/mag 11159599516SKenneth E. Jansen enddo 11259599516SKenneth E. Jansen 11359599516SKenneth E. Jansen mpslpw(nn,1)=nslpw 11459599516SKenneth E. Jansen mpslpw(nn,2)=ihis 11559599516SKenneth E. Jansen 11659599516SKenneth E. Jansen deallocate(IDslpw) 11759599516SKenneth E. Jansen enddo 11859599516SKenneth E. Jansen 11959599516SKenneth E. Jansen 120*513954efSKenneth E. Jansenc call write_field(myrank,'a'//char(0), 121*513954efSKenneth E. Jansenc & 'wnrm'//char(0),4,wlnorm(:,:,1),'d'//char(0),nshg,3,701) 12259599516SKenneth E. Jansencc 7 is the number of charaters of the name of array wnrm701 123*513954efSKenneth E. Jansenc call write_field(myrank,'a'//char(0), 124*513954efSKenneth E. Jansenc & 'wnrm'//char(0),4,wlnorm(:,:,2),'d'//char(0),nshg,3,702) 12559599516SKenneth E. Jansenc stop 12659599516SKenneth E. Jansen 12759599516SKenneth E. Jansen return 12859599516SKenneth E. Jansen end 12959599516SKenneth E. Jansen 13059599516SKenneth E. Jansencccccccccccccccccccccc 13159599516SKenneth E. Jansen 13259599516SKenneth E. Jansen integer function iparall(A,B) 13359599516SKenneth E. Jansen real*8 A(3),B(3) 13459599516SKenneth E. Jansen real*8 angtol,tmp 13559599516SKenneth E. Jansen 13659599516SKenneth E. Jansen tmp=(A(1)**2+A(2)**2+A(3)**2)**0.5 13759599516SKenneth E. Jansen A(:)=A(:)/tmp 13859599516SKenneth E. Jansen tmp=(B(1)**2+B(2)**2+B(3)**2)**0.5 13959599516SKenneth E. Jansen B(:)=B(:)/tmp 14059599516SKenneth E. Jansen pi=3.1415926535 14159599516SKenneth E. Jansen angtol=10 14259599516SKenneth E. Jansen angtol=sin(angtol*(pi/180)) 14359599516SKenneth E. Jansen C1=A(2)*B(3)-A(3)*B(2) 14459599516SKenneth E. Jansen C2=A(3)*B(1)-A(1)*B(3) 14559599516SKenneth E. Jansen C3=A(1)*B(2)-A(2)*B(1) 14659599516SKenneth E. Jansen Cmag=(C1**2+C2**2+C3**2)**0.5 14759599516SKenneth E. Jansen dotp=A(1)*B(1)+A(2)*B(2)+A(3)*B(3) 14859599516SKenneth E. Jansen if(dotp.gt.0.and.Cmag.lt.angtol)then 14959599516SKenneth E. Jansen iparall=1 15059599516SKenneth E. Jansen else 15159599516SKenneth E. Jansen iparall=0 15259599516SKenneth E. Jansen endif 15359599516SKenneth E. Jansen 15459599516SKenneth E. Jansen return 15559599516SKenneth E. Jansen end 156