1*59599516SKenneth E. Jansen subroutine f3lhs (shpb, shglb, xlb, flhsl, 2*59599516SKenneth E. Jansen & fnrml, sgn ) 3*59599516SKenneth E. Jansenc 4*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 5*59599516SKenneth E. Jansenc 6*59599516SKenneth E. Jansenc This subroutine computes the element LHS matrix and the normal 7*59599516SKenneth E. Jansenc to the boundary for computation of (output) boundary fluxes. 8*59599516SKenneth E. Jansenc 9*59599516SKenneth E. Jansenc input: 10*59599516SKenneth E. Jansenc shpb (nen,nintg) : boundary element shape-functions 11*59599516SKenneth E. Jansenc shglb (nsd,nen,nintg) : boundary element grad-shape-functions 12*59599516SKenneth E. Jansenc wghtb (nintg) : boundary element weight 13*59599516SKenneth E. Jansenc xlb (npro,nenl,nsd) : nodal coordinates 14*59599516SKenneth E. Jansenc sgn (npro,nshl) : mode signs for hierarchic basis 15*59599516SKenneth E. Jansenc 16*59599516SKenneth E. Jansenc output: 17*59599516SKenneth E. Jansenc flhsl (npro,nenl,1) : element lumped lhs on flux boundary 18*59599516SKenneth E. Jansenc fnrml (npro,nenl,nsd) : RHS of LS projection of normal to 19*59599516SKenneth E. Jansenc flux boundary 20*59599516SKenneth E. Jansenc 21*59599516SKenneth E. Jansenc 22*59599516SKenneth E. Jansenc Note: Special lumping technique is used to compute the LHS. 23*59599516SKenneth E. Jansenc See T.J.R. Hughes, "The Finite Element Method: Linear 24*59599516SKenneth E. Jansenc Static and Dynamic Finite Element Analysis", page 445. 25*59599516SKenneth E. Jansenc 26*59599516SKenneth E. Jansenc Note: Least-squares projection is used to compute the normal to 27*59599516SKenneth E. Jansenc the boundary at the nodes. This routine provides the element 28*59599516SKenneth E. Jansenc contribution to the RHS of the projection linear system. 29*59599516SKenneth E. Jansenc 30*59599516SKenneth E. Jansenc 31*59599516SKenneth E. Jansenc Zdenek Johan, Summer 1991. 32*59599516SKenneth E. Jansenc---------------------------------------------------------------------- 33*59599516SKenneth E. Jansenc 34*59599516SKenneth E. Jansen include "common.h" 35*59599516SKenneth E. Jansenc 36*59599516SKenneth E. Jansen dimension shpb(nshl,ngaussb), shglb(nsd,nshl,ngaussb), 37*59599516SKenneth E. Jansen & xlb(npro,nenl,nsd), 38*59599516SKenneth E. Jansen & flhsl(npro,nshl,1), fnrml(npro,nshl,nsd) 39*59599516SKenneth E. Jansenc 40*59599516SKenneth E. Jansen dimension WdetJb(npro), 41*59599516SKenneth E. Jansen & bnorm(npro,nsd), fmstot(npro), 42*59599516SKenneth E. Jansen & temp(npro), temp1(npro), 43*59599516SKenneth E. Jansen & temp2(npro), temp3(npro) 44*59599516SKenneth E. Jansen 45*59599516SKenneth E. Jansen dimension sgn(npro,nshl), shape(npro,nshl), 46*59599516SKenneth E. Jansen & shdrv(npro,nsd,nshl), 47*59599516SKenneth E. Jansen & v1(npro,nsd), v2(npro,nsd) 48*59599516SKenneth E. Jansenc 49*59599516SKenneth E. Jansenc.... integrate the lumped LHS matrix and normal 50*59599516SKenneth E. Jansenc 51*59599516SKenneth E. Jansen fmstot = zero 52*59599516SKenneth E. Jansenc 53*59599516SKenneth E. Jansenc 54*59599516SKenneth E. Jansenc.... compute the normal to the boundary 55*59599516SKenneth E. Jansenc 56*59599516SKenneth E. Jansen 57*59599516SKenneth E. Jansen v1 = xlb(:,2,:) - xlb(:,1,:) 58*59599516SKenneth E. Jansen v2 = xlb(:,3,:) - xlb(:,1,:) 59*59599516SKenneth E. Jansen 60*59599516SKenneth E. Jansen if (lcsyst .eq. 1) then 61*59599516SKenneth E. Jansen temp1 = v1(:,2) * v2(:,3) - v2(:,2) * v1(:,3) 62*59599516SKenneth E. Jansen temp2 = v2(:,1) * v1(:,3) - v1(:,1) * v2(:,3) 63*59599516SKenneth E. Jansen temp3 = v1(:,1) * v2(:,2) - v2(:,1) * v1(:,2) 64*59599516SKenneth E. Jansen else 65*59599516SKenneth E. Jansen temp1 = - v1(:,2) * v2(:,3) + v2(:,2) * v1(:,3) 66*59599516SKenneth E. Jansen temp2 = - v2(:,1) * v1(:,3) + v1(:,1) * v2(:,3) 67*59599516SKenneth E. Jansen temp3 = - v1(:,1) * v2(:,2) + v2(:,1) * v1(:,2) 68*59599516SKenneth E. Jansen endif 69*59599516SKenneth E. Jansenc 70*59599516SKenneth E. Jansen temp = one / sqrt ( temp1**2 + temp2**2 + temp3**2 ) 71*59599516SKenneth E. Jansen bnorm(:,1) = temp1 * temp 72*59599516SKenneth E. Jansen bnorm(:,2) = temp2 * temp 73*59599516SKenneth E. Jansen bnorm(:,3) = temp3 * temp 74*59599516SKenneth E. Jansen 75*59599516SKenneth E. Jansen do intp = 1, ngaussb 76*59599516SKenneth E. Jansenc 77*59599516SKenneth E. Jansenc.... get the hierarchic shape functions at this int point 78*59599516SKenneth E. Jansenc 79*59599516SKenneth E. Jansen call getshp(shpb, shglb, sgn, 80*59599516SKenneth E. Jansen & shape, shdrv) 81*59599516SKenneth E. Jansenc 82*59599516SKenneth E. Jansen 83*59599516SKenneth E. Jansenc$$$ WdetJb = Qwtb(lcsyst,intp) / (four*temp) 84*59599516SKenneth E. Jansen if (lcsyst .eq. 1) then 85*59599516SKenneth E. Jansen WdetJb = Qwtb(lcsyst,intp) / (four*temp) 86*59599516SKenneth E. Jansen elseif (lcsyst .eq. 2) then 87*59599516SKenneth E. Jansen WdetJb = Qwtb(lcsyst,intp) / (four*temp) 88*59599516SKenneth E. Jansen elseif (lcsyst .eq. 3) then 89*59599516SKenneth E. Jansen WdetJb = Qwtb(lcsyst,intp) / (two*temp) 90*59599516SKenneth E. Jansen elseif (lcsyst .eq. 4) then 91*59599516SKenneth E. Jansen WdetJb = Qwtb(lcsyst,intp) / (four*temp) 92*59599516SKenneth E. Jansen elseif (lcsyst .eq. 5) then 93*59599516SKenneth E. Jansen WdetJb = Qwtb(lcsyst,intp) / (four*temp) 94*59599516SKenneth E. Jansen elseif (lcsyst .eq. 6) then 95*59599516SKenneth E. Jansen WdetJb = Qwtb(lcsyst,intp) / (two*temp) 96*59599516SKenneth E. Jansen endif 97*59599516SKenneth E. Jansen 98*59599516SKenneth E. Jansenc 99*59599516SKenneth E. Jansenc.... compute the lumped LHS and normal 100*59599516SKenneth E. Jansenc 101*59599516SKenneth E. Jansen do n = 1, nenl ! when changed to nshl solution degraded ipord 10 102*59599516SKenneth E. Jansen flhsl(:,n,1) = flhsl(:,n,1) + WdetJb * shape(:,n) 103*59599516SKenneth E. Jansen 104*59599516SKenneth E. Jansenc for curved geometries the below construct for the normals has to be used 105*59599516SKenneth E. Jansen fnrml(:,n,1) = fnrml(:,n,1) + WdetJb * bnorm(:,1) 106*59599516SKenneth E. Jansen & * shape(:,n) 107*59599516SKenneth E. Jansen fnrml(:,n,2) = fnrml(:,n,2) + WdetJb * bnorm(:,2) 108*59599516SKenneth E. Jansen & * shape(:,n) 109*59599516SKenneth E. Jansen fnrml(:,n,3) = fnrml(:,n,3) + WdetJb * bnorm(:,3) 110*59599516SKenneth E. Jansen & * shape(:,n) 111*59599516SKenneth E. Jansen enddo 112*59599516SKenneth E. Jansenc 113*59599516SKenneth E. Jansenc To best represent this case it should be assigned to the vertex 114*59599516SKenneth E. Jansenc modes and higher entities should get zero as is done below 115*59599516SKenneth E. Jansenc 116*59599516SKenneth E. Jansen fmstot = fmstot + WdetJb 117*59599516SKenneth E. Jansenc 118*59599516SKenneth E. Jansen enddo 119*59599516SKenneth E. Jansen 120*59599516SKenneth E. Jansenc$$$ do i=1,nenl 121*59599516SKenneth E. Jansenc$$$ fnrml(:,i,:)=bnorm(:,:) 122*59599516SKenneth E. Jansenc$$$ enddo 123*59599516SKenneth E. Jansen if(ipord.gt.1) fnrml(:,nenl:nshl,:)=zero 124*59599516SKenneth E. Jansenc 125*59599516SKenneth E. Jansenc.... scale the LHS matrix contribution 126*59599516SKenneth E. Jansenc 127*59599516SKenneth E. Jansen temp = zero 128*59599516SKenneth E. Jansen do n = 1, nshl 129*59599516SKenneth E. Jansen temp = temp + flhsl(:,n,1) 130*59599516SKenneth E. Jansen enddo 131*59599516SKenneth E. Jansenc 132*59599516SKenneth E. Jansen do n = 1, nshl 133*59599516SKenneth E. Jansen flhsl(:,n,1) = flhsl(:,n,1) * fmstot / temp 134*59599516SKenneth E. Jansen enddo 135*59599516SKenneth E. Jansenc 136*59599516SKenneth E. Jansenc.... return 137*59599516SKenneth E. Jansenc 138*59599516SKenneth E. Jansen return 139*59599516SKenneth E. Jansen end 140