Skip to content
Snippets Groups Projects
do_leaf_measurements.f90 8.54 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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
    !      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
    
       call deviatoric (exx,eyy,ezz,exy,eyz,ezx)
    
    !   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
    
    
       ! Dilatation rate
       dilatrtemp(i)=(exx+eyy+ezz)
    
    
    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)
    
    
       !e2dtemp(i)=J2d
       ! Set e2d as effective stress (sqrt of 2nd invariant) - dwhipp 12/09
       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
    
    !------------------------------------------------------------------------------|
    !------------------------------------------------------------------------------|