1*10167291SKenneth E. Jansen subroutine sfID2np(isurfID,nsfnp,nmap) 2*10167291SKenneth E. Jansen !Finds the nodes associated with the surface ID and returns the 3*10167291SKenneth E. Jansen !count in nsfnp and the nodal mapping in nmap. 4*10167291SKenneth E. Jansen ! 5*10167291SKenneth E. Jansen !input: 6*10167291SKenneth E. Jansen ! isurfID (1) the surface ID of the face which user want 7*10167291SKenneth E. Jansen ! to play with, it is specified in Simaker 8*10167291SKenneth E. Jansen !output: 9*10167291SKenneth E. Jansen ! nsfnp (1) number of the nodal points which lie on the 10*10167291SKenneth E. Jansen ! surface with this ID, local for one process 11*10167291SKenneth E. Jansen ! nmap (nshg) a map from nsfnp to nshg; map the node on 12*10167291SKenneth E. Jansen ! the surface to the global nodal numbering 13*10167291SKenneth E. Jansen ! for one process 14*10167291SKenneth E. Jansen 15*10167291SKenneth E. Jansen use pointer_data 16*10167291SKenneth E. Jansen include "common.h" 17*10167291SKenneth E. Jansen include "mpif.h" 18*10167291SKenneth E. Jansen integer isurfID, nsfnp 19*10167291SKenneth E. Jansen integer nmap(nshg) 20*10167291SKenneth E. Jansen integer ifirstvisit(nshg) 21*10167291SKenneth E. Jansen integer, allocatable :: ienb(:) 22*10167291SKenneth E. Jansen 23*10167291SKenneth E. Jansen !Start to find matching surfID 24*10167291SKenneth E. Jansen ifirstvisit(:)=1 25*10167291SKenneth E. Jansen nsfnp=0 26*10167291SKenneth E. Jansen do iblk=1,nelblb !loop over boundary element blocks 27*10167291SKenneth E. Jansen npro=lcblkb(1,iblk+1)-lcblkb(1,iblk) 28*10167291SKenneth E. Jansen nenbl=lcblkb(6,iblk) !nenbl = number of element nodes on the boundary local? 29*10167291SKenneth E. Jansen nshl=lcblkb(9,iblk) !nshl = number of shape [functions] local 30*10167291SKenneth E. Jansen allocate(ienb(nshl)) 31*10167291SKenneth E. Jansen do i=1,npro !loop over boundary elements 32*10167291SKenneth E. Jansen 33*10167291SKenneth E. Jansen ! If surfID does not match, do not consider 34*10167291SKenneth E. Jansen iBCB2=miBCB(iblk)%p(i,2) 35*10167291SKenneth E. Jansen if(isurfID.ne.iBCB2)cycle 36*10167291SKenneth E. Jansen 37*10167291SKenneth E. Jansen ienb(1:nshl)=mienb(iblk)%p(i,1:nshl) !ienb = index of element nodes local 38*10167291SKenneth E. Jansen do j=1,nenbl !loop over nodes in an elmeent 39*10167291SKenneth E. Jansen nn=ienb(j) !nn is a global node index. The array ienb is probably the global indeces of the nodes on the boundary for a given element 40*10167291SKenneth E. Jansen if(ifirstvisit(nn).eq.1)then !need this check because nodes are shared by other elements 41*10167291SKenneth E. Jansen ifirstvisit(nn)=0 42*10167291SKenneth E. Jansen nsfnp=nsfnp+1 !nsfnp = Number of SurFace Nodal Points 43*10167291SKenneth E. Jansen nmap(nsfnp)=nn !nmap is the mapping from nodal surface index to the global nodal numbering for one process. The ith index of nmap gives you the global node numbering. Thus, nn is a global node number (on a processor) 44*10167291SKenneth E. Jansen endif 45*10167291SKenneth E. Jansen enddo 46*10167291SKenneth E. Jansen enddo 47*10167291SKenneth E. Jansen deallocate(ienb) 48*10167291SKenneth E. Jansen enddo 49*10167291SKenneth E. Jansen 50*10167291SKenneth E. Jansen return 51*10167291SKenneth E. Jansen end 52*10167291SKenneth E. Jansen 53*10167291SKenneth E. Jansen subroutine asfID2np(isurfID, nSurfNP, nodeMap) 54*10167291SKenneth E. Jansen !Same as sfID2np, except that nmap is allocated in the subroutine 55*10167291SKenneth E. Jansen !call to be of size nsfnp. 56*10167291SKenneth E. Jansen ! 57*10167291SKenneth E. Jansen !input: 58*10167291SKenneth E. Jansen ! isurfID (1) the surface ID of the face which user want to play with, it is specified in Simaker 59*10167291SKenneth E. Jansen !output: 60*10167291SKenneth E. Jansen ! nSurfNP (1) number of the nodal points which lie on the surface with this ID, local for one process 61*10167291SKenneth E. Jansen ! nmap (nshg) a map from nsfnp to nshg, map the node on the surface to the global nodal numbering for one process 62*10167291SKenneth E. Jansen 63*10167291SKenneth E. Jansen include "common.h" 64*10167291SKenneth E. Jansen 65*10167291SKenneth E. Jansen integer :: isurfID, nSurfNP 66*10167291SKenneth E. Jansen integer, allocatable :: nodeMap(:), tmp(:) 67*10167291SKenneth E. Jansen 68*10167291SKenneth E. Jansen allocate(tmp(nshg)) 69*10167291SKenneth E. Jansen call sfID2np(isurfID, nSurfNP, tmp) 70*10167291SKenneth E. Jansen 71*10167291SKenneth E. Jansen allocate(nodeMap(max(nSurfNP, 1))) 72*10167291SKenneth E. Jansen nodeMap = tmp(1:nSurfNP) 73*10167291SKenneth E. Jansen 74*10167291SKenneth E. Jansen! if(nSurfNP > 0) then 75*10167291SKenneth E. Jansen! allocate(nmap(nSurfNP)) 76*10167291SKenneth E. Jansen! nmap = tmp(1:nSurfNP) 77*10167291SKenneth E. Jansen! else 78*10167291SKenneth E. Jansen! allocate(nmap(1)) 79*10167291SKenneth E. Jansen! endif 80*10167291SKenneth E. Jansen 81*10167291SKenneth E. Jansen deallocate(tmp) 82*10167291SKenneth E. Jansen end subroutine 83