xref: /phasta/phSolver/common/f3lhs.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
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