xref: /phasta/phSolver/common/sfID2np.f (revision 712d3df0b59ebebaaeaea358162c8d2c043c6e08)
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