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