Skip to content
Snippets Groups Projects
make_matrix.f90 20.9 KiB
Newer Older
Douglas Guptill's avatar
Douglas Guptill committed
!------------------------------------------------------------------------------|
!------------------------------------------------------------------------------|
!                                                                              |
!              ||===\\                                                         | 
!              ||    \\                                                        |
!              ||     ||   //==\\   ||  ||   //==||  ||/==\\                   |
!              ||     ||  ||    ||  ||  ||  ||   ||  ||    ||                  |
!              ||    //   ||    ||  ||  ||  ||   ||  ||                        |
!              ||===//     \\==//    \\==\\  \\==\\  ||                        |
!                                                                              |
!------------------------------------------------------------------------------|
!------------------------------------------------------------------------------|
!                                                                              |
!              MAKE_MATRIX    Jun. 2007                                        |
!                                                                              |
!------------------------------------------------------------------------------|
!------------------------------------------------------------------------------|

subroutine make_matrix (params,ndof,ael,bel,icon,xg,yg,zg,kfix,viscosity0,     &
                        density,penalty,expon,activationenergy,expansion,      &
Dave Whipp's avatar
Dave Whipp committed
                        diffusivity,heat,plasticity_type,                      &
                        plasticity_ss_type_coh,plasticity_ss_type_phi,         &
                        plasticity_parameters,fviscosity,unode,vnode,wnode,    &
                        temp,pressure,strain,e2dp,is_plastic,nnode,ffff,r0,s0, &
                        t0,rst,ileaves,eviscosity,vbounded,yield_ratio,        &
                        frict_angle,sstemp,threadinfo,weight)
Douglas Guptill's avatar
Douglas Guptill committed

!------------------------------------------------------------------------------|
!(((((((((((((((( Purpose of the routine  ))))))))))))))))))))))))))))))))))))))
!------------------------------------------------------------------------------|
! note that this routine is called to create the FE matrix and rhs vector
! for both the Stokes (ndof=3) and Energy equations (ndof=1)

! mpe       : number of nodes per element (8)
! ndof      : number of degrees of freedom per node (3 or 1)
! ael       : computed finite element matrix
! bel       : computed rhs vector
! icon      : connectivity array for the current element
! xg,yg,zg  : global coordinate arrays of length nnode
! kfix      : bc array of length ndof*nnode 
!             (kfix=1 means the dof is fixed to the value stored in velo)
! viscosity : viscosity
! density   : density at zero temperature (in C)
! penalty   : incompressibility penalty factor
! penaltyg  : penalty factor to impose bc
! expon     : nonlinear viscosity exponent
! unode,vnode,wnode : velocity array (obtained from previous time step or at 
!             least containing the proper velocity at the fixed dofs)
! strain    : total accumulated strain as interpolated from the 3D cloud
! e2dp      : effective strain rate from previous step as interpolated from the
!             3D cloud
Douglas Guptill's avatar
Douglas Guptill committed
! nnode     : number of nodes
! f         : global rhs vector

!------------------------------------------------------------------------------|
!((((((((((((((((  declaration of the subroutine arguments  ))))))))))))))))))))
!------------------------------------------------------------------------------|

Douglas Guptill's avatar
Douglas Guptill committed
use definitions
use gauss
use invariants
Douglas Guptill's avatar
Douglas Guptill committed

implicit none

Douglas Guptill's avatar
Douglas Guptill committed
type(parameters) params
integer ndof
double precision ael(params%mpe*ndof,params%mpe*ndof)
double precision bel(params%mpe*ndof)
integer icon(params%mpe) 
double precision xg(nnode),yg(nnode),zg(nnode)
integer kfix(nnode*ndof)
double precision viscosity0
double precision density
double precision penalty
double precision expon
double precision activationenergy
double precision expansion
double precision diffusivity
double precision heat
character (len=8) plasticity_type
character (len=16) plasticity_ss_type_coh,plasticity_ss_type_phi
Douglas Guptill's avatar
Douglas Guptill committed
double precision plasticity_parameters(9)
double precision :: fviscosity
Douglas Guptill's avatar
Douglas Guptill committed
double precision unode(nnode),vnode(nnode),wnode(nnode)
double precision temp(nnode)
double precision pressure
double precision strain(nnode)
Douglas Guptill's avatar
Douglas Guptill committed
integer nnode
double precision ffff(nnode*ndof)
double precision r0,s0,t0,rst
integer ileaves
double precision eviscosity
logical vbounded
double precision :: yield_ratio
Douglas Guptill's avatar
Douglas Guptill committed
logical is_plastic
Douglas Guptill's avatar
Douglas Guptill committed
type (thread) threadinfo
double precision weight

!------------------------------------------------------------------------------|
!(((((((((((((((( declaration of the subroutine internal variables )))))))))))))
!------------------------------------------------------------------------------|
logical is_plastic_temp,flag_vrm_pb
integer i,j,k,k1,k2,k3,ii,jj,ij,iint,nint,nb,err,ic
integer iproc,nproc,ierr,mpe
double precision eps,yield,fail,fixt,yieldnow
Douglas Guptill's avatar
Douglas Guptill committed
double precision r,s,t,w,volume,vol
Douglas Guptill's avatar
Douglas Guptill committed
double precision xcond,xmass,aref
double precision exx,eyy,ezz,exy,eyz,ezx,e2d,e3d
double precision f1(3,3),defgrad(3,3)
double precision detf1,detf,e2dref,viscomean,frictmean,friction_angle
Douglas Guptill's avatar
Douglas Guptill committed
double precision viscosity,compressibility,temperature
double precision velox,veloy,veloz,tau,uvwnorm,xmin,xmax,ymin,ymax
Dave Whipp's avatar
Dave Whipp committed
double precision zmin,zmax,dx,dy,dz,alpha,J2d,J3d,dt,dynamic
Douglas Guptill's avatar
Douglas Guptill committed
double precision jcb(3,3),jcbi(3,3),jcbp(3,3),jcbip(3,3),d(6,6),dl(6,6)
double precision,dimension(:),allocatable :: x,y,z,tnode,be
double precision,dimension(:),allocatable :: h,dhdr,dhds,dhdt,ht
double precision,dimension(:),allocatable :: dhdx,dhdy,dhdz
double precision,dimension(:),allocatable :: vel
double precision,dimension(:,:),allocatable :: b,bd,bl,aelp

!-------------------------------------------------------------------------------
!-------------------------------------------------------------------------------

call mpi_comm_size (mpi_comm_world,nproc,ierr)
call mpi_comm_rank (mpi_comm_world,iproc,ierr)

compressibility=penalty
mpe=params%mpe
Dave Whipp's avatar
Dave Whipp committed

Douglas Guptill's avatar
Douglas Guptill committed
eps=tiny(eps)
nint=8
nb=6
Douglas Guptill's avatar
Douglas Guptill committed
if (ndof.eq.1) nb=3

allocate (x(mpe),stat=err)                  ; if (err.ne.0) call stop_run ('Error alloc x in make_matrix$')
allocate (y(mpe),stat=err)                  ; if (err.ne.0) call stop_run ('Error alloc y in make_matrix$')
allocate (z(mpe),stat=err)                  ; if (err.ne.0) call stop_run ('Error alloc z in make_matrix$')
allocate (tnode(mpe),stat=err)              ; if (err.ne.0) call stop_run ('Error alloc tnode in make_matrix$')
allocate (be(mpe*ndof),stat=err)            ; if (err.ne.0) call stop_run ('Error alloc be in make_matrix$')
allocate (h(mpe),stat=err)                  ; if (err.ne.0) call stop_run ('Error alloc h in make_matrix$')
allocate (dhdr(mpe),stat=err)               ; if (err.ne.0) call stop_run ('Error alloc dhdr in make_matrix$')
allocate (dhds(mpe),stat=err)               ; if (err.ne.0) call stop_run ('Error alloc dhds in make_matrix$')
allocate (dhdt(mpe),stat=err)               ; if (err.ne.0) call stop_run ('Error alloc dhdt in make_matrix$')
allocate (ht(mpe),stat=err)                 ; if (err.ne.0) call stop_run ('Error alloc ht in make_matrix$')
allocate (dhdx(mpe),stat=err)               ; if (err.ne.0) call stop_run ('Error alloc dhdx in make_matrix$')
allocate (dhdy(mpe),stat=err)               ; if (err.ne.0) call stop_run ('Error alloc dhdy in make_matrix$')
allocate (dhdz(mpe),stat=err)               ; if (err.ne.0) call stop_run ('Error alloc dhdz in make_matrix$')
allocate (b(ndof*mpe,nb),stat=err)          ; if (err.ne.0) call stop_run ('Error alloc b in make_matrix$')
allocate (bd(ndof*mpe,nb),stat=err)         ; if (err.ne.0) call stop_run ('Error alloc bd in make_matrix$')
allocate (bl(ndof*mpe,nb),stat=err)         ; if (err.ne.0) call stop_run ('Error alloc bl in make_matrix$')
allocate (aelp(mpe*ndof,mpe*ndof),stat=err) ; if (err.ne.0) call stop_run ('Error alloc aelp in make_matrix$')
allocate (vel(mpe*ndof),stat=err)           ; if (err.ne.0) call stop_run ('Error alloc vel in make_matrix$')

do k=1,mpe
   x(k)=xg(icon(k))
   y(k)=yg(icon(k))
Douglas Guptill's avatar
Douglas Guptill committed
   tnode(k)=temp(icon(k))
enddo

ael=0.d0
aelp=0.d0
be=0.d0
bel=0.d0
bl=0.d0
vol=0.d0

!-------------------------------------------------------------------------------
! ndof=3
!-------------------------------------------------------------------------------

if (ndof.eq.1) goto 1111

Douglas Guptill's avatar
Douglas Guptill committed
! first add viscosity term (8 point integration)

is_plastic=.false.
is_plastic_temp=.false.
viscomean=0.d0
Douglas Guptill's avatar
Douglas Guptill committed

do iint=1,nint
   r=r0+rst*(rr(iint)+1.d0)/2.d0
   s=s0+rst*(ss(iint)+1.d0)/2.d0
   t=t0+rst*(tt(iint)+1.d0)/2.d0
   w=ww(iint)
   call compute_dhdx_dhdy_dhdz (mpe,r,s,t,x,y,z,dhdx,dhdy,dhdz,volume)

   h(1)=(1.d0-r)*(1.d0-s)*(1.d0-t)/8.d0
   h(2)=(1.d0+r)*(1.d0-s)*(1.d0-t)/8.d0
   h(3)=(1.d0-r)*(1.d0+s)*(1.d0-t)/8.d0
   h(4)=(1.d0+r)*(1.d0+s)*(1.d0-t)/8.d0
   h(5)=(1.d0-r)*(1.d0-s)*(1.d0+t)/8.d0
   h(6)=(1.d0+r)*(1.d0-s)*(1.d0+t)/8.d0
   h(7)=(1.d0-r)*(1.d0+s)*(1.d0+t)/8.d0
   h(8)=(1.d0+r)*(1.d0+s)*(1.d0+t)/8.d0
   
   temperature=0.d0
   do k=1,mpe
      temperature=temperature+h(k)*tnode(k)
   enddo

   exx=0.d0
   eyy=0.d0
   ezz=0.d0
   exy=0.d0
   eyz=0.d0
   ezx=0.d0
   do k=1,mpe
      ic=icon(k)
      exx=exx+dhdx(k)*unode(ic)
      eyy=eyy+dhdy(k)*vnode(ic)
      ezz=ezz+dhdz(k)*wnode(ic)
      exy=exy+(dhdx(k)*vnode(ic)+dhdy(k)*unode(ic))/2.d0
      eyz=eyz+(dhdy(k)*wnode(ic)+dhdz(k)*vnode(ic))/2.d0
      ezx=ezx+(dhdz(k)*unode(ic)+dhdx(k)*wnode(ic))/2.d0
   enddo

   call deviatoric (params%invariants_2d,exx,eyy,ezz,exy,eyz,ezx)
Douglas Guptill's avatar
Douglas Guptill committed

   J2d=second_invariant(exx,eyy,ezz,exy,eyz,ezx)
   J3d=third_invariant (exx,eyy,ezz,exy,eyz,ezx)

   e2d=0.d0
   if (J2d.gt.eps) e2d=sqrt(J2d)
Douglas Guptill's avatar
Douglas Guptill committed

   straintot=0.d0
   do k=1,mpe
      straintot=straintot+h(k)*strain(icon(k))
   enddo

   e2dprev=0.d0
   do k=1,mpe
      e2dprev=e2dprev+h(k)*e2dp(icon(k))
   enddo

Douglas Guptill's avatar
Douglas Guptill committed
!   if (straintot.gt.plasticity_parameters(3)) &
!   write(*,'(4es15.6)') sum(x)/8.d0,sum(y)/8.d0,sum(z)/8.d0,straintot

   e2dref=1.d0
   viscosity=viscosity0      
   if (e2d.gt.eps) then
     if (expon.gt.1.d0+eps .or. expon.lt.1.d0-eps) viscosity=viscosity*(e2d/e2dref)**(1.d0/expon-1.d0)
   endif
   viscosity=viscosity*fviscosity*exp(activationenergy/(expon*Rgas*(temperature*params%tempscale+273.15d0)))
Douglas Guptill's avatar
Douglas Guptill committed

Douglas Guptill's avatar
Douglas Guptill committed
   if (trim(plasticity_type)/='No') &
   call vrm (params,J2d,J3d,compressibility,viscosity,pressure,friction_angle, &
Dave Whipp's avatar
Dave Whipp committed
            plasticity_parameters,plasticity_type,plasticity_ss_type_coh,      &
            plasticity_ss_type_phi,is_plastic_temp,flag_vrm_pb,straintot,      &
            e2dprev,yield)
Douglas Guptill's avatar
Douglas Guptill committed

   is_plastic=is_plastic.or.is_plastic_temp

   if (params%viscositymax.ge.0.d0) then
      viscosity=min(params%viscositymax,viscosity)
   end if
   if (params%viscositymin.ge.0.d0) then
      viscosity=max(params%viscositymin,viscosity)
   end if

   yieldnow=2.d0*viscosity*e2d
   yield_ratio=yield_ratio+yieldnow/yield
Douglas Guptill's avatar
Douglas Guptill committed

   d=0.d0
   d(1,1)=viscosity*2.d0
   d(2,2)=viscosity*2.d0
   d(3,3)=viscosity*2.d0
   d(4,4)=viscosity
   d(5,5)=viscosity
   d(6,6)=viscosity

   do k=1,mpe
      k1=(k-1)*3+1
      k2=(k-1)*3+2
      k3=(k-1)*3+3
      b(k1,1)=dhdx(k)
      b(k2,1)=0.d0
      b(k3,1)=0.d0
      b(k1,2)=0.d0
      b(k2,2)=dhdy(k)
      b(k3,2)=0.d0
      b(k1,3)=0.d0
      b(k2,3)=0.d0
      b(k3,3)=dhdz(k)
      b(k1,4)=0.d0
      b(k2,4)=dhdz(k)
      b(k3,4)=dhdy(k)
      b(k1,5)=dhdz(k)
      b(k2,5)=0.d0
      b(k3,5)=dhdx(k)
      b(k1,6)=dhdy(k)
      b(k2,6)=dhdx(k)
      b(k3,6)=0.d0
   enddo

   do k=1,mpe
      k1=(k-1)*3+1
      k2=(k-1)*3+2
      k3=(k-1)*3+3
      bl(k1,1)=bl(k1,1)+dhdx(k)*volume*w
      bl(k2,2)=bl(k2,2)+dhdy(k)*volume*w
      bl(k3,3)=bl(k3,3)+dhdz(k)*volume*w
      bl(k2,4)=bl(k2,4)+dhdz(k)*volume*w
      bl(k3,4)=bl(k3,4)+dhdy(k)*volume*w
      bl(k1,5)=bl(k1,5)+dhdz(k)*volume*w
      bl(k3,5)=bl(k3,5)+dhdx(k)*volume*w
      bl(k1,6)=bl(k1,6)+dhdy(k)*volume*w
      bl(k2,6)=bl(k2,6)+dhdx(k)*volume*w
   enddo

   vol=vol+volume*w
   weight=weight+volume*w*density

   do j=1,mpe*ndof
      do i=1,6
         bd(j,i)=0.d0
         do k=1,6
            bd(j,i)=bd(j,i)+b(j,k)*d(k,i)
         enddo
      enddo
   enddo

   do j=1,mpe*ndof
      do i=1,mpe*ndof
         do k=1,6
            ael(i,j)=ael(i,j)+b(i,k)*bd(j,k)*volume*w
         enddo
      enddo
   enddo

   do j=1,mpe
      jj=(j-1)*ndof+ndof
      !bel(jj)=bel(jj)+h(j)*volume*w*density*(1.d0-expansion*temperature*params%tempscale)
      bel(jj)=bel(jj)+h(j)*volume*w*density
   enddo

enddo

! second add compressibility term (1 point integration)

viscomean=viscomean/nint
yield_ratio=yield_ratio/nint
Douglas Guptill's avatar
Douglas Guptill committed

eviscosity=viscomean
Douglas Guptill's avatar
Douglas Guptill committed

!viscomean=1.d0

dl=0.d0
if (params%bulkvisc) then
  dl(1,1)=compressibility
  dl(1,2)=compressibility
  dl(1,3)=compressibility
  dl(2,1)=compressibility
  dl(2,2)=compressibility
  dl(2,3)=compressibility
  dl(3,1)=compressibility
  dl(3,2)=compressibility
  dl(3,3)=compressibility
else
  dl(1,1)=compressibility*viscomean
  dl(1,2)=compressibility*viscomean
  dl(1,3)=compressibility*viscomean
  dl(2,1)=compressibility*viscomean
  dl(2,2)=compressibility*viscomean
  dl(2,3)=compressibility*viscomean
  dl(3,1)=compressibility*viscomean
  dl(3,2)=compressibility*viscomean
  dl(3,3)=compressibility*viscomean
endif
Douglas Guptill's avatar
Douglas Guptill committed

r=0.d0
s=0.d0
t=0.d0
w=8.d0
!added by Jean on 13/2/08
!   r=r0+rst*(r+1.d0)/2.d0
!   s=s0+rst*(s+1.d0)/2.d0
!   t=t0+rst*(t+1.d0)/2.d0
!   w=w
! up to here
! was wrong...
call compute_dhdx_dhdy_dhdz (mpe,r,s,t,x,y,z,dhdx,dhdy,dhdz,volume)

!----------effective viscosity--------------------------

!exx=0.d0
!eyy=0.d0
!ezz=0.d0
!exy=0.d0
!eyz=0.d0
!ezx=0.d0
!do k=1,mpe
!   ic=icon(k)
!   exx=exx+dhdx(k)*unode(ic)
!   eyy=eyy+dhdy(k)*vnode(ic)
!   ezz=ezz+dhdz(k)*wnode(ic)
!   exy=exy+(dhdx(k)*vnode(ic)+dhdy(k)*unode(ic))/2.d0
!   eyz=eyz+(dhdy(k)*wnode(ic)+dhdz(k)*vnode(ic))/2.d0
!   ezx=ezx+(dhdz(k)*unode(ic)+dhdx(k)*wnode(ic))/2.d0
!enddo

!call deviatoric (exx,eyy,ezz,exy,eyz,ezx)
!
!J2d=second_invariant (exx,eyy,ezz,exy,eyz,ezx)
!J3d=third_invariant (exx,eyy,ezz,exy,eyz,ezx)
!
!e2d=0.d0
!if (J2d.ne.0.d0) e2d=sqrt(J2d)
!
!e2dref=1.d0
!eviscosity=viscosity0      
!if (e2d.ne.0.d0 .and. expon.ne.1.d0) eviscosity=eviscosity*(e2d/e2dref)**(1.d0/expon-1.d0)
!viscosity=viscosity*exp(activationenergy/(expon*Rgas*(temperature*params%tempscale+273.15d0)))
!
!if (trim(plasticity_type)/='No') &
!call vrm(J2d,J3d,eviscosity,pressure,plasticity_parameters,plasticity_type,is_plastic_dummy,flag_vrm_pb)

!----------effective viscosity--------------------------


do k=1,mpe
   k1=(k-1)*3+1
   k2=(k-1)*3+2
   k3=(k-1)*3+3
   b(k1,1)=dhdx(k)
   b(k2,1)=0.d0
   b(k3,1)=0.d0
   b(k1,2)=0.d0
   b(k2,2)=dhdy(k)
   b(k3,2)=0.d0
   b(k1,3)=0.d0
   b(k2,3)=0.d0
   b(k3,3)=dhdz(k)
   b(k1,4)=0.d0
   b(k2,4)=dhdz(k)
   b(k3,4)=dhdy(k)
   b(k1,5)=dhdz(k)
   b(k2,5)=0.d0
   b(k3,5)=dhdx(k)
   b(k1,6)=dhdy(k)
   b(k2,6)=dhdx(k)
   b(k3,6)=0.d0
enddo

do j=1,mpe*ndof
   do i=1,6
      bd(j,i)=0.d0
      do k=1,6
         bd(j,i)=bd(j,i)+b(j,k)*dl(k,i)
      enddo
   enddo
enddo

do j=1,mpe*ndof
   do i=1,mpe*ndof
      do k=1,6
         ael(i,j)=ael(i,j)+bd(i,k)*b(j,k)*volume*w
      enddo
   enddo
enddo

!do i=1,mpe*ndof
!   do j=1,mpe*ndof
!      if (abs(ael(i,j)-ael(j,i))>eps) stop 'Ael po symmetric'
!   end do
!end do

   ! third add fixed velocity boundary conditions
   do ii=1,mpe
   do k=1,ndof
      ij=(icon(ii)-1)*ndof+k
      if (kfix(ij).eq.1) then
         if (k.eq.1) fixt=unode(icon(ii))
         if (k.eq.2) fixt=vnode(icon(ii))
         if (k.eq.3) fixt=wnode(icon(ii))
         i=(ii-1)*ndof+k
         aref=ael(i,i)
         do j=1,mpe*ndof
            bel(j)=bel(j)-ael(j,i)*fixt
            ael(i,j)=0.d0
            ael(j,i)=0.d0
         enddo
         ael(i,i)=aref
         bel(i)=aref*fixt

!         ael(i,i)=1.d0*penaltyg
!         bel(i)=fixt*penaltyg
      endif
   enddo
   enddo

goto 1112

1111  continue

!-------------------------------------------------------------------------------
! temperature calculations
!-------------------------------------------------------------------------------

alpha=1.d0
Dave Whipp's avatar
Dave Whipp committed
dynamic=1.d0
dt=params%dt
Douglas Guptill's avatar
Douglas Guptill committed

Dave Whipp's avatar
Dave Whipp committed
if (sstemp) then
  dynamic=0.d0
  dt=1.d0
endif
Douglas Guptill's avatar
Douglas Guptill committed
do iint=1,nint

   r=r0+rst*(rr(iint)+1.d0)/2.d0
   s=s0+rst*(ss(iint)+1.d0)/2.d0
   t=t0+rst*(tt(iint)+1.d0)/2.d0
   w=ww(iint)

   h(1)=(1.d0-r)*(1.d0-s)*(1.d0-t)/8.d0
   h(2)=(1.d0+r)*(1.d0-s)*(1.d0-t)/8.d0
   h(3)=(1.d0-r)*(1.d0+s)*(1.d0-t)/8.d0
   h(4)=(1.d0+r)*(1.d0+s)*(1.d0-t)/8.d0
   h(5)=(1.d0-r)*(1.d0-s)*(1.d0+t)/8.d0
   h(6)=(1.d0+r)*(1.d0-s)*(1.d0+t)/8.d0
   h(7)=(1.d0-r)*(1.d0+s)*(1.d0+t)/8.d0
   h(8)=(1.d0+r)*(1.d0+s)*(1.d0+t)/8.d0

   velox=0.d0
   veloy=0.d0
   veloz=0.d0
   do k=1,mpe
      ic=icon(k)
      velox=velox+h(k)*unode(ic)
      veloy=veloy+h(k)*vnode(ic)
      veloz=veloz+h(k)*wnode(ic)
   enddo
Dave Whipp's avatar
Dave Whipp committed

Douglas Guptill's avatar
Douglas Guptill committed
   dhdr(1)=-(1.d0-s)*(1.d0-t)/8.d0
   dhdr(2)=(1.d0-s)*(1.d0-t)/8.d0
   dhdr(3)=-(1.d0+s)*(1.d0-t)/8.d0
   dhdr(4)=(1.d0+s)*(1.d0-t)/8.d0
   dhdr(5)=-(1.d0-s)*(1.d0+t)/8.d0
   dhdr(6)=(1.d0-s)*(1.d0+t)/8.d0
   dhdr(7)=-(1.d0+s)*(1.d0+t)/8.d0
   dhdr(8)=(1.d0+s)*(1.d0+t)/8.d0
   dhds(1)=-(1.d0-r)*(1.d0-t)/8.d0
   dhds(2)=-(1.d0+r)*(1.d0-t)/8.d0
   dhds(3)=(1.d0-r)*(1.d0-t)/8.d0
   dhds(4)=(1.d0+r)*(1.d0-t)/8.d0
   dhds(5)=-(1.d0-r)*(1.d0+t)/8.d0
   dhds(6)=-(1.d0+r)*(1.d0+t)/8.d0
   dhds(7)=(1.d0-r)*(1.d0+t)/8.d0
   dhds(8)=(1.d0+r)*(1.d0+t)/8.d0
   dhdt(1)=-(1.d0-r)*(1.d0-s)/8.d0
   dhdt(2)=-(1.d0+r)*(1.d0-s)/8.d0
   dhdt(3)=-(1.d0-r)*(1.d0+s)/8.d0
   dhdt(4)=-(1.d0+r)*(1.d0+s)/8.d0
   dhdt(5)=(1.d0-r)*(1.d0-s)/8.d0
   dhdt(6)=(1.d0+r)*(1.d0-s)/8.d0
   dhdt(7)=(1.d0-r)*(1.d0+s)/8.d0
   dhdt(8)=(1.d0+r)*(1.d0+s)/8.d0

   jcb=0.
   do k=1,mpe
      jcb(1,1)=jcb(1,1)+dhdr(k)*x(k)
      jcb(1,2)=jcb(1,2)+dhdr(k)*y(k)
      jcb(1,3)=jcb(1,3)+dhdr(k)*z(k)
      jcb(2,1)=jcb(2,1)+dhds(k)*x(k)
      jcb(2,2)=jcb(2,2)+dhds(k)*y(k)
      jcb(2,3)=jcb(2,3)+dhds(k)*z(k)
      jcb(3,1)=jcb(3,1)+dhdt(k)*x(k)
      jcb(3,2)=jcb(3,2)+dhdt(k)*y(k)
      jcb(3,3)=jcb(3,3)+dhdt(k)*z(k)
   enddo

   volume=jcb(1,1)*jcb(2,2)*jcb(3,3) &
         +jcb(1,2)*jcb(2,3)*jcb(3,1) &
         +jcb(2,1)*jcb(3,2)*jcb(1,3) &
         -jcb(1,3)*jcb(2,2)*jcb(3,1) &
         -jcb(1,2)*jcb(2,1)*jcb(3,3) &
         -jcb(2,3)*jcb(3,2)*jcb(1,1)

   if (volume.le.eps) then
      if (iproc.eq.0) call write_error_vtk (ileaves,volume,icon,x,y,z)
      call stop_run('Element bow-tied or collapsed in make_matrix temperature$')
   endif

   jcbi(1,1)=(jcb(2,2)*jcb(3,3)-jcb(2,3)*jcb(3,2))/volume
   jcbi(2,1)=(jcb(2,3)*jcb(3,1)-jcb(2,1)*jcb(3,3))/volume
   jcbi(3,1)=(jcb(2,1)*jcb(3,2)-jcb(2,2)*jcb(3,1))/volume
   jcbi(1,2)=(jcb(1,3)*jcb(3,2)-jcb(1,2)*jcb(3,3))/volume
   jcbi(2,2)=(jcb(1,1)*jcb(3,3)-jcb(1,3)*jcb(3,1))/volume
   jcbi(3,2)=(jcb(1,2)*jcb(3,1)-jcb(1,1)*jcb(3,2))/volume
   jcbi(1,3)=(jcb(1,2)*jcb(2,3)-jcb(1,3)*jcb(2,2))/volume
   jcbi(2,3)=(jcb(1,3)*jcb(2,1)-jcb(1,1)*jcb(2,3))/volume
   jcbi(3,3)=(jcb(1,1)*jcb(2,2)-jcb(1,2)*jcb(2,1))/volume

   do k=1,mpe
      do i=1,3
         b(k,i)=jcbi(i,1)*dhdr(k)+jcbi(i,2)*dhds(k)+jcbi(i,3)*dhdt(k)
      enddo
   enddo

   vol=vol+volume*w

   uvwnorm=velox**2+veloy**2+veloz**2
   xmin=minval(x)
   xmax=maxval(x)
   dx=xmax-xmin
   ymin=minval(y)
   ymax=maxval(y)
   dy=ymax-ymin
   zmin=minval(z)
   zmax=maxval(z)
   dz=zmax-zmin
   if (uvwnorm.lt.tiny(uvwnorm)) then
      tau=0.d0
   else
      tau=(abs(velox)*dx+abs(veloy)*dy+abs(veloz)*dz)/sqrt(15.d0)/uvwnorm
   endif

   do k=1,mpe
      ht(k)=h(k)+tau*(velox*b(k,1)+veloy*b(k,2)+veloz*b(k,3))
   enddo

   do j=1,mpe
      bel(j)=bel(j)+h(j)*dt*heat*volume*w
Douglas Guptill's avatar
Douglas Guptill committed
      do i=1,mpe
         ! xcond=diffusivity*(b(i,1)*b(j,1)+b(i,2)*b(j,2)+b(i,3)*b(j,3))*volume
         xcond=diffusivity*(b(i,1)*b(j,1)+b(i,2)*b(j,2)+b(i,3)*b(j,3))*volume &
              +ht(i)*(velox*b(j,1)+veloy*b(j,2)+veloz*b(j,3))*volume
Dave Whipp's avatar
Dave Whipp committed
         xmass=h(i)*h(j)*volume*dynamic
         ael(i,j)=ael(i,j)+(xmass+dt*xcond*alpha)*w
         aelp(i,j)=aelp(i,j)+(xmass-dt*xcond*(1.d0-alpha))*w
Douglas Guptill's avatar
Douglas Guptill committed
      enddo
   enddo
   
enddo

do i=1,mpe
   do j=1,mpe
      bel(i)=bel(i)+aelp(i,j)*temp(icon(j))
   enddo
enddo

! third add fixed temperature boundary conditions

do i=1,mpe
   ic=icon(i)
   if (kfix(ic).eq.1) then
      fixt=temp(ic)
      do j=1,mpe
         bel(j)=bel(j)-ael(j,i)*fixt
         ael(i,j)=0.d0
         ael(j,i)=0.d0
      enddo
      ael(i,i)=1.d0*vol
      bel(i)=fixt*vol
   endif
enddo

1112  continue

deallocate (x)
deallocate (y)
deallocate (z)
deallocate (be)
deallocate (tnode)
deallocate (h)
deallocate (dhdr)
deallocate (dhds)
deallocate (dhdt)
deallocate (ht)
deallocate (dhdx)
deallocate (dhdy)
deallocate (dhdz)
deallocate (b)
deallocate (bd)
deallocate (bl)
deallocate (aelp)
deallocate (vel)

return
end
!-------------------------------------------------------------------------------
!-------------------------------------------------------------------------------