Skip to content
Snippets Groups Projects
do_leaf_measurements.f90 8.32 KiB
Newer Older
Douglas Guptill's avatar
Douglas Guptill committed
!------------------------------------------------------------------------------|
!------------------------------------------------------------------------------|
!                                                                              |
!              ||===\\                                                         | 
!              ||    \\                                                        |
!              ||     ||   //==\\   ||  ||   //==||  ||/==\\                   |
!              ||     ||  ||    ||  ||  ||  ||   ||  ||    ||                  |
!              ||    //   ||    ||  ||  ||  ||   ||  ||                        |
!              ||===//     \\==//    \\==\\  \\==\\  ||                        |
!                                                                              |
!------------------------------------------------------------------------------|
!------------------------------------------------------------------------------|
!                                                                              |
!              DO_LEAF_MEASUREMENTS    Nov. 2006                               |
!                                                                              |
!------------------------------------------------------------------------------|
!------------------------------------------------------------------------------|
         
subroutine do_leaf_measurements (osolve,ov,params,istep,iter,iter_nl) 
      
!------------------------------------------------------------------------------|
!(((((((((((((((( Purpose of the routine  ))))))))))))))))))))))))))))))))))))))
!------------------------------------------------------------------------------|
! this routine calculates the second invariant of the strain rate, 
! and a value for the criterion used by the improve_octree subroutine,
! inside each element by using the velocity information at the nodes.
! mpe is number of nodes per element (8)
! icon is connectivity array 
! xnode,ynode,znode are the global coordinate arrays of length nnode
! unode,vnode,wnode are the velocity arrays of length nnode (obtained 
! from previous time step or at least containing the proper velocity 
! at the fixed dofs)
! nnode is number of nodes
! nleaves is the number of leaves/elements
! e2d is the second invariant of the strain rate
! crit is the criterion

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

use definitions
use gauss
use invariants
use constants

implicit none

type (octreev) ov
type (octreesolve) osolve
type (parameters) params
integer istep,iter,iter_nl

!------------------------------------------------------------------------------|
!(((((((((((((((( declaration of the subroutine internal variables )))))))))))))
!------------------------------------------------------------------------------|

double precision,dimension(:),allocatable :: x,y,z,vx,vy,vz
double precision,dimension(:),allocatable :: dhdx,dhdy,dhdz
double precision :: r,s,t,volume,w
double precision :: exx,eyy,ezz,exy,eyz,ezx,J2d,J3d
integer err,ierr,nproc,iproc,k,i,iint,nleaves,mpe
double precision, dimension(:), allocatable :: e2dtemp,e3dtemp,crittemp,lodetemp
double precision, dimension(:), allocatable :: qtemp,dilatrtemp
Douglas Guptill's avatar
Douglas Guptill committed
character*72  :: shift
logical cutcell
double precision :: prod

!=====[2 oct 2007]====
!double precision pw,pw2
!double precision x_P1,y_P1,z_P1
!double precision x_P2,y_P2,z_P2
!double precision x_P3,y_P3,z_P3
!double precision x_P4,y_P4,z_P4
!double precision x_P5,y_P5,z_P5
!double precision x0,y0,z0,dxyz

!integer np,iy
!double precision x_A,x_B,xxx,yyy,zzz,Vme2d,maxe2d
!logical, dimension(:), allocatable :: filter
!integer ny
!integer leaf,level,locc
!==========

!------------------------------------------------------------------------------|
!------------------------------------------------------------------------------|

INCLUDE 'mpif.h'

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

shift=' '

mpe=params%mpe

nleaves=osolve%nleaves

allocate (x(mpe),y(mpe),z(mpe),stat=err)          ; if (err.ne.0) call stop_run ('Error alloc x,y,z in compute_e2d_crit$')
allocate (vx(mpe),vy(mpe),vz(mpe),stat=err)       ; if (err.ne.0) call stop_run ('Error alloc vx,vy,vz in compute_e2d_crit$')
allocate (dhdx(mpe),dhdy(mpe),dhdz(mpe),stat=err) ; if (err.ne.0) call stop_run ('Error alloc dhdx,dhdy,dhdz in compute_e2d_crit$')
allocate (e2dtemp(nleaves),stat=err)              ; if (err.ne.0) call stop_run ('Error alloc e2dtemp in compute_e2d_crit$')
allocate (e3dtemp(nleaves),stat=err)              ; if (err.ne.0) call stop_run ('Error alloc e2dtemp in compute_e3d_crit$')
allocate (crittemp(nleaves),stat=err)             ; if (err.ne.0) call stop_run ('Error alloc crittemp in compute_e2d_crit$')
allocate (lodetemp(nleaves),stat=err)             ; if (err.ne.0) call stop_run ('Error alloc lodetemp in compute_e2d_crit$')
allocate (qtemp(nleaves),stat=err)                ; if (err.ne.0) call stop_run ('Error alloc qtemp in compute_e2d_crit$')
allocate (dilatrtemp(nleaves),stat=err)             ; if (err.ne.0) call stop_run ('Error alloc dilatrtemp in compute_e2d_crit$')
Douglas Guptill's avatar
Douglas Guptill committed

e2dtemp=0.d0
e3dtemp=0.d0
crittemp=0.d0
lodetemp=0.d0
qtemp=0.d0
dilatrtemp=0.d0
Douglas Guptill's avatar
Douglas Guptill committed

osolve%e2d=0.d0
osolve%e3d=0.d0
osolve%crit=0.d0
osolve%lode=0.d0
osolve%q=0.d0
osolve%dilatr=0.d0
Douglas Guptill's avatar
Douglas Guptill committed

do i=1+iproc,nleaves,nproc

   do k=1,mpe
      x(k) =osolve%x(osolve%icon(k,i))
      y(k) =osolve%y(osolve%icon(k,i))
      z(k) =osolve%z(osolve%icon(k,i))
      vx(k)=ov%unode(osolve%icon(k,i))
      vy(k)=ov%vnode(osolve%icon(k,i))
      vz(k)=ov%wnode(osolve%icon(k,i))
   enddo

   r=0.d0
   s=0.d0
   t=0.d0

   call compute_dhdx_dhdy_dhdz (mpe,r,s,t,x,y,z,dhdx,dhdy,dhdz,volume)

   exx=0.d0
   eyy=0.d0
   ezz=0.d0
   exy=0.d0
   eyz=0.d0
   ezx=0.d0
   do k=1,mpe
      exx=exx+dhdx(k)*vx(k)
      eyy=eyy+dhdy(k)*vy(k)
      ezz=ezz+dhdz(k)*vz(k)
      exy=exy+(dhdx(k)*vy(k)+dhdy(k)*vx(k))/2.d0
      eyz=eyz+(dhdy(k)*vz(k)+dhdz(k)*vy(k))/2.d0
      ezx=ezx+(dhdz(k)*vx(k)+dhdx(k)*vz(k))/2.d0
   enddo

   ! Dilatation rate
   dilatrtemp(i)=(exx+eyy+ezz)

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

!   if (.not.osolve%is_plastic(i)) then
!      qtemp(i)=0.d0
!   else
      qtemp(i)=2.d0*osolve%eviscosity(i)*sqrt(second_invariant(exx,eyy,ezz,exy,eyz,ezx))
!   end if

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

   e2dtemp(i)=sqrt(J2d)
Douglas Guptill's avatar
Douglas Guptill committed

   if (J2d/=0.d0) lodetemp(i)=lode_angle (J2d,J3d)/pi

   if (J3d<0.d0) then
      e3dtemp(i)=-abs(J3d)**(1./3.d0)
   else
      e3dtemp(i)=J3d**(1./3.d0)
   end if

   select case (params%refine_criterion)
      case(1) 
         crittemp(i)=e2dtemp(i)
      case(2) 
         crittemp(i)=sqrt(exx**2+eyy**2+ezz**2)
      case(3)
         crittemp(i)=sqrt(J2d)*abs(x(1)-x(2)) 
      case default
         crittemp(i)=0.d0
   end select

end do

call mpi_reduce (e2dtemp, osolve%e2d, nleaves,mpi_double_precision,mpi_sum,0,mpi_comm_world,ierr)
call mpi_reduce (e3dtemp, osolve%e3d, nleaves,mpi_double_precision,mpi_sum,0,mpi_comm_world,ierr)
call mpi_reduce (crittemp,osolve%crit,nleaves,mpi_double_precision,mpi_sum,0,mpi_comm_world,ierr)
call mpi_reduce (lodetemp,osolve%lode,nleaves,mpi_double_precision,mpi_sum,0,mpi_comm_world,ierr)
call mpi_reduce (qtemp, osolve%q, nleaves,mpi_double_precision,mpi_sum,0,mpi_comm_world,ierr)
call mpi_reduce (dilatrtemp, osolve%dilatr, nleaves,mpi_double_precision,mpi_sum,0,mpi_comm_world,ierr)
Douglas Guptill's avatar
Douglas Guptill committed

deallocate (x,y,z)
deallocate (vx,vy,vz)
deallocate (dhdx,dhdy,dhdz)
deallocate (crittemp)
deallocate (e2dtemp)
deallocate (e3dtemp)
deallocate (lodetemp) 
deallocate (qtemp) 
deallocate (dilatrtemp)
Douglas Guptill's avatar
Douglas Guptill committed

if (iproc.eq.0 .and. params%debug>=1 .and. params%compute_qpgram) then
   write(*,'(a,f11.5)')  shift//'min(q) =', minval(osolve%q)
   write(*,'(a,f11.5)')  shift//'max(q) =', maxval(osolve%q)
end if     

call DoRuRe_vel_stats  (params%doDoRuRe,istep,iter,iter_nl,ov%nnode,ov%unode,ov%vnode,ov%wnode)
call DoRuRe_leaf_stats (params%doDoRuRe,osolve%nleaves,osolve%e2d,osolve%e3d,osolve%pressure,osolve%q,osolve%dilatr,istep,iter,iter_nl)
Douglas Guptill's avatar
Douglas Guptill committed

return
end

!------------------------------------------------------------------------------|
!------------------------------------------------------------------------------|