xref: /phasta/phSolver/common/elem-search.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen      subroutine elem_search(xl,xts1,xts2,xts3,xsic,elmt, idfile)
2*59599516SKenneth E. Jansenc
3*59599516SKenneth E. Jansenc----------------------------------------------------------------------
4*59599516SKenneth E. Jansenc This subroutine finds for a particular point in which element it lays
5*59599516SKenneth E. Jansenc and what are its local coordinates
6*59599516SKenneth E. Jansenc
7*59599516SKenneth E. Jansenc input:
8*59599516SKenneth E. Jansenc  xl      (npro, nshl, nsd)    : local node coordinates
9*59599516SKenneth E. Jansenc  xts1, xts2, xts3		: point coordinates
10*59599516SKenneth E. Jansenc
11*59599516SKenneth E. Jansenc output:
12*59599516SKenneth E. Jansenc  xsic   (nsd)           	: point's local coordinates
13*59599516SKenneth E. Jansenc  elmt  			: element number
14*59599516SKenneth E. Jansenc
15*59599516SKenneth E. Jansenc
16*59599516SKenneth E. Jansenc  Elaine Bohr
17*59599516SKenneth E. Jansenc  April 2002
18*59599516SKenneth E. Jansenc----------------------------------------------------------------------
19*59599516SKenneth E. Jansenc
20*59599516SKenneth E. Jansen      use spebc
21*59599516SKenneth E. Jansen      include "common.h"
22*59599516SKenneth E. Jansen
23*59599516SKenneth E. Jansen      dimension shape(nelint,nshl), xsic(nsd),
24*59599516SKenneth E. Jansen     &     xl(nelint,nenl,nsd)
25*59599516SKenneth E. Jansen
26*59599516SKenneth E. Jansen      real*8 al(nelint,nenl,nsd),
27*59599516SKenneth E. Jansen     &       zi0(nelint,nsd), detaij(nelint), dzi0(nelint,nsd),
28*59599516SKenneth E. Jansen     &       neg(nelint), distance(nelint)
29*59599516SKenneth E. Jansen      integer testing(4), found(nelint), negativ(nelint)
30*59599516SKenneth E. Jansen
31*59599516SKenneth E. Jansen      real*8 xts1, xts2, xts3, min
32*59599516SKenneth E. Jansen      integer e, elmt, result, count, counting, find
33*59599516SKenneth E. Jansen
34*59599516SKenneth E. Jansen      tolpt = 0.000001
35*59599516SKenneth E. Jansen      call get_coeff_tet(xl,al)
36*59599516SKenneth E. Jansen
37*59599516SKenneth E. Jansen      detaij(:) = -al(:,2,1)*al(:,3,2)*al(:,4,3) +
38*59599516SKenneth E. Jansen     &           al(:,2,1)*al(:,4,2)*al(:,3,3) + al(:,2,2)*
39*59599516SKenneth E. Jansen     &           al(:,3,1)*al(:,4,3) - al(:,2,2)*al(:,4,1)*
40*59599516SKenneth E. Jansen     &           al(:,3,3) - al(:,2,3)*al(:,3,1)*al(:,4,2)+
41*59599516SKenneth E. Jansen     &           al(:,2,3)*al(:,4,1)*al(:,3,2)
42*59599516SKenneth E. Jansen
43*59599516SKenneth E. Jansen      detaij = 1./detaij
44*59599516SKenneth E. Jansen
45*59599516SKenneth E. Jansen      zi0(:,1) = detaij(:)*((al(:,4,2)*al(:,3,3)
46*59599516SKenneth E. Jansen     &           - al(:,3,2)*al(:,4,3))*(xts1-al(:,1,1)) +
47*59599516SKenneth E. Jansen     &           (al(:,3,1)*al(:,4,3)
48*59599516SKenneth E. Jansen     &           - al(:,4,1)*al(:,3,3))*(xts2-al(:,1,2)) +
49*59599516SKenneth E. Jansen     &           (al(:,4,1)*al(:,3,2)
50*59599516SKenneth E. Jansen     &           - al(:,3,1)*al(:,4,2))*(xts3-al(:,1,3)))
51*59599516SKenneth E. Jansen
52*59599516SKenneth E. Jansen
53*59599516SKenneth E. Jansen      zi0(:,2) = detaij(:)*((al(:,2,2)*al(:,4,3)
54*59599516SKenneth E. Jansen     &           - al(:,4,2)*al(:,2,3))*(xts1-al(:,1,1)) +
55*59599516SKenneth E. Jansen     &           (al(:,4,1)*al(:,2,3)
56*59599516SKenneth E. Jansen     &           - al(:,2,1)*al(:,4,3))*(xts2-al(:,1,2)) +
57*59599516SKenneth E. Jansen     &           (al(:,2,1)*al(:,4,2)
58*59599516SKenneth E. Jansen     &           - al(:,4,1)*al(:,2,2))*(xts3-al(:,1,3)))
59*59599516SKenneth E. Jansen
60*59599516SKenneth E. Jansen      zi0(:,3) = detaij(:)*((al(:,3,2)*al(:,2,3)
61*59599516SKenneth E. Jansen     &           - al(:,2,2)*al(:,3,3))*(xts1-al(:,1,1)) +
62*59599516SKenneth E. Jansen     &           (al(:,2,1)*al(:,3,3)
63*59599516SKenneth E. Jansen     &           - al(:,3,1)*al(:,2,3))*(xts2-al(:,1,2)) +
64*59599516SKenneth E. Jansen     &           (al(:,3,1)*al(:,2,2)
65*59599516SKenneth E. Jansen     &           - al(:,2,1)*al(:,3,2))*(xts3-al(:,1,3)))
66*59599516SKenneth E. Jansen
67*59599516SKenneth E. Jansenc      zi0(:,4) = 1 - zi0(:,1) - zi0(:,2) - zi0(:,3)
68*59599516SKenneth E. Jansen
69*59599516SKenneth E. Jansen      elmt = 0
70*59599516SKenneth E. Jansen      counting = 0
71*59599516SKenneth E. Jansen      neg(:) = 0
72*59599516SKenneth E. Jansen      negativ(:) = 0
73*59599516SKenneth E. Jansen      found(:) = 0
74*59599516SKenneth E. Jansenc      distance(:) = 0
75*59599516SKenneth E. Jansen      do e = 1, nelint
76*59599516SKenneth E. Jansen
77*59599516SKenneth E. Jansen	 count = 0
78*59599516SKenneth E. Jansen	 testing(:) = 0
79*59599516SKenneth E. Jansen         if (zi0(e,1).lt.(one+tolpt).and.
80*59599516SKenneth E. Jansen     &          zi0(e,1).gt.(zero-tolpt)) then
81*59599516SKenneth E. Jansen             testing(1) = 1
82*59599516SKenneth E. Jansen	     count = count + 1
83*59599516SKenneth E. Jansen	 endif
84*59599516SKenneth E. Jansen         if (zi0(e,2).lt.(one+tolpt).and.
85*59599516SKenneth E. Jansen     &          zi0(e,2).gt.(zero-tolpt)) then
86*59599516SKenneth E. Jansen             testing(2) = 1
87*59599516SKenneth E. Jansen	     count = count + 1
88*59599516SKenneth E. Jansen	 endif
89*59599516SKenneth E. Jansen         if (zi0(e,3).lt.(one+tolpt).and.
90*59599516SKenneth E. Jansen     &          zi0(e,3).gt.(zero-tolpt)) then
91*59599516SKenneth E. Jansen             testing(3) = 1
92*59599516SKenneth E. Jansen	     count = count + 1
93*59599516SKenneth E. Jansen	 endif
94*59599516SKenneth E. Jansen         if ((1-zi0(e,1)-zi0(e,2)-zi0(e,3)).lt.(one+tolpt).and.
95*59599516SKenneth E. Jansen     &       (1-zi0(e,1)-zi0(e,2)-zi0(e,3)).gt.(zero-tolpt)) then
96*59599516SKenneth E. Jansen             testing(4) = 1
97*59599516SKenneth E. Jansen	     count = count + 1
98*59599516SKenneth E. Jansen	 endif
99*59599516SKenneth E. Jansen
100*59599516SKenneth E. Jansen         result = 1
101*59599516SKenneth E. Jansen	 do i = 1, 4
102*59599516SKenneth E. Jansen	    result = result*testing(i)
103*59599516SKenneth E. Jansen	 enddo
104*59599516SKenneth E. Jansen
105*59599516SKenneth E. Jansen         if (result .eq. 1) then
106*59599516SKenneth E. Jansen             xsic(:) = zi0(e,:)
107*59599516SKenneth E. Jansen	     elmt = e
108*59599516SKenneth E. Jansen
109*59599516SKenneth E. Jansen	     return
110*59599516SKenneth E. Jansen
111*59599516SKenneth E. Jansen	 elseif (count .eq. 3) then
112*59599516SKenneth E. Jansen	    counting = counting + 1
113*59599516SKenneth E. Jansen	    do i = 1, 3
114*59599516SKenneth E. Jansen	       if (testing(i) .eq. 0 .and.
115*59599516SKenneth E. Jansen     &		       zi0(e,i) .lt. 0.0) then
116*59599516SKenneth E. Jansen                  found(counting) = e
117*59599516SKenneth E. Jansen		  neg(counting) = zi0(e,i)
118*59599516SKenneth E. Jansen		  negativ(counting) = i
119*59599516SKenneth E. Jansenc		  distance(counting) = sqrt(zi0(e,1)*zi0(e,1)+
120*59599516SKenneth E. Jansenc    &		          zi0(e,2)*zi0(e,2)+zi0(e,3)*zi0(e,3))
121*59599516SKenneth E. Jansen	       endif
122*59599516SKenneth E. Jansen	    enddo
123*59599516SKenneth E. Jansen	    if (testing(4) .eq. 0) then
124*59599516SKenneth E. Jansen	       found(counting) = e
125*59599516SKenneth E. Jansen	       neg(counting) = 1-zi0(e,1)-zi0(e,2)-zi0(e,3)
126*59599516SKenneth E. Jansen	       negativ(counting) = 4
127*59599516SKenneth E. Jansenc	       distance(counting) = sqrt(zi0(e,1)*zi0(e,1)+
128*59599516SKenneth E. Jansenc     &		       zi0(e,2)*zi0(e,2)+zi0(e,3)*zi0(e,3))
129*59599516SKenneth E. Jansen	    endif
130*59599516SKenneth E. Jansen	 endif
131*59599516SKenneth E. Jansen
132*59599516SKenneth E. Jansen
133*59599516SKenneth E. Jansen      enddo
134*59599516SKenneth E. Jansen
135*59599516SKenneth E. Jansen      min = neg(1)
136*59599516SKenneth E. Jansen      elmt = found(1)
137*59599516SKenneth E. Jansen      find = 1
138*59599516SKenneth E. Jansen      do i = 2, counting
139*59599516SKenneth E. Jansen         if (min .lt. neg(i)) then
140*59599516SKenneth E. Jansen	    min = neg(i)
141*59599516SKenneth E. Jansen	    elmt = found(i)
142*59599516SKenneth E. Jansen	    find = i
143*59599516SKenneth E. Jansen	 endif
144*59599516SKenneth E. Jansen      enddo
145*59599516SKenneth E. Jansen      if (negativ(find) .eq. 4) then
146*59599516SKenneth E. Jansen         prop = zi0(elmt,1)+zi0(elmt,2)+zi0(elmt,3)
147*59599516SKenneth E. Jansen	 xsic(:) = zi0(elmt,:) / prop
148*59599516SKenneth E. Jansen      else
149*59599516SKenneth E. Jansen         xsic(:) = zi0(elmt,:)
150*59599516SKenneth E. Jansen         xsic(negativ(find)) = 0.0
151*59599516SKenneth E. Jansen      endif
152*59599516SKenneth E. Jansenc      call error ('elem_search ', 'outrange', idfile)
153*59599516SKenneth E. Jansen
154*59599516SKenneth E. Jansen      return
155*59599516SKenneth E. Jansen
156*59599516SKenneth E. Jansen
157*59599516SKenneth E. Jansen      end
158*59599516SKenneth E. Jansen
159