Skip to content
Snippets Groups Projects
post.f90 53.6 KiB
Newer Older

MODULE definitions

   type structure
      integer,dimension(:),pointer::octree
      integer noctree,nnode,nleaves
      integer nelemr,nlsf 
      double precision,dimension(:),pointer::x,y,z
      double precision,dimension(:),pointer::u,v,w,wiso,temp,pressure,strain
      double precision,dimension(:),pointer::nodal_pressure,spressure
      double precision,dimension(:),pointer::e2d,eviscosity
      double precision,dimension(:),pointer::crit,dilatr,yield_ratio,frict_angle
      integer,dimension(:,:),pointer::icon,iconr
      double precision,dimension(:,:),pointer:: lsf
      integer,dimension(:),pointer::on(:),is_plastic,matnum
      logical, dimension(:), pointer :: whole_leaf_in_fluid
   end type structure

   type sheet
      integer nsurface,nt
      double precision,dimension(:),pointer::r,s,x,y,z,xn,yn,zn,u,v,w
      integer,dimension(:,:),pointer::icon
      integer nhull,levelt,itype,material
   end type sheet

END MODULE definitions


!==============================================================================!
!==============================================================================!
!                                                                              |
!              ||===\\                                                         | 
!              ||    \\                                                        |
!              ||     ||   //==\\   ||  ||   //==||  ||/==\\                   |
!              ||     ||  ||    ||  ||  ||  ||   ||  ||    ||                  |
!              ||    //   ||    ||  ||  ||  ||   ||  ||                        |
!              ||===//     \\==//    \\==\\  \\==\\  ||                        |
!                                                                              |
!==============================================================================!
!==============================================================================!
!                                                                              |
!              POST PROCESSING    Apr. 2008                                    |
!                                                                              |
!==============================================================================!
!==============================================================================!

program data_postprocessing

use definitions

implicit none

type (sheet),dimension(:),allocatable::surface
type(structure),SAVE :: ov
integer :: ie,mer,nn,ner,i,i1,i2,i3,i4,i5,kfx,kfy,kfz,kft
integer :: iunit,ilsf,nne,is,k,npcl,j,np,nl
integer :: output_u_field
integer :: output_v_field
integer :: output_w_field
integer :: output_velo_vect 
integer :: output_preiso_velo_vect 
Dave Whipp's avatar
Dave Whipp committed
integer :: output_iso_velo_vect 
integer :: output_disp_field
integer :: output_press_fieldn 
integer :: output_press_fielde 
integer :: output_smooth_press_fielde
integer :: output_countnode_field
integer :: output_temp_field
integer :: output_elem_matnum
integer :: output_e2d_fielde 
integer :: output_e2d_fieldn
integer :: output_eviscosity_fielde 
integer :: output_is_plastic_fielde
integer :: output_yield_ratio_fielde
integer :: output_frict_angle_fielde
integer :: output_dilatr_fielde
integer :: output_crit_field
integer :: output_strain_field
integer :: output_lsf_field
integer :: output_surface_icon
integer :: output_strain_tensor
integer :: output_ps
integer :: output_cubes
integer :: output_rivers
integer :: output_regular
integer :: output_zisodisp
integer iproc,nproc,ierr,nnn,nnne,nnnep,levelmax,ix,iy,iz,nlinks,iordermin
integer iconmin,iconmax
integer,dimension(:),allocatable::nstrain,donor,order
integer,dimension(:),allocatable::levs,li
integer nz,ni,ijk,ptcnt,nb,dumpi
integer,dimension(:),allocatable::invoid,elvoid,rtf,ftr
integer myicon(100),nstep,ndir,iter,ii,lsf,levmax

logical,dimension(:),allocatable::influid,do_it,subset_leaves,instrain
logical :: nest

character clsf*3,c4*4,cc4*4,dir*128
Dave Whipp's avatar
Dave Whipp committed
character cs,nestin
character*8 vernum,input_vernum,output_vernum

double precision :: eps,dil,current_time,activation_time,zmin,xx,yy,zz,maxe2d,dist
double precision, allocatable, dimension (:) :: ov_nodee2d, ov_nodecrit
double precision, allocatable, dimension (:) :: countnode 
double precision,dimension(:,:),allocatable::s,n1,n2,n3,zisodisp
double precision,dimension(:,:,:),allocatable::strain,strainn
double precision,dimension(:),allocatable::xi,yi,zi,ui,vi,wi,si,ei
double precision,dimension(:),allocatable::s11,s12,s13,s22,s23,s33,str11,str12,str13,str22,str23,str33
double precision,dimension(:),allocatable::azimuth1,azimuth3,dip1,dip3
double precision zmax,dz,l1,l2,l3,n11,n12,n13,n21,n22,n23,n31,n32,n33,con,dxy
Dave Whipp's avatar
Dave Whipp committed
double precision :: sselemx,sselemy,sselemz,xminls,yminls,zminls,usum,vsum,wsum
double precision :: uvwsum,disp,wmod
double precision dxyz,x,y,z,xcut,dumpdp
integer icut 

!==============================================================================!
!==============================================================================!

call system('clear')

nne=8

! Post-processor version number
vernum='0.2a'

write (*,'(a)') '!------------------------------------------------------------------------------|'
write (*,'(a)') '!------------------------------------------------------------------------------|'
write (*,'(a)') '!                                                                              |'
write (*,'(a)') '!          8888888b.   .d88888b.  888     888       d8888 8888888b.            |'
write (*,'(a)') '!          888  "Y88b d88P" "Y88b 888     888      d88888 888   Y88b           |'
write (*,'(a)') '!          888    888 888     888 888     888     d88P888 888    888           |'
write (*,'(a)') '!          888    888 888     888 888     888    d88P 888 888   d88P           |'
write (*,'(a)') '!          888    888 888     888 888     888   d88P  888 8888888P"            |'
write (*,'(a)') '!          888    888 888     888 888     888  d88P   888 888 T88b             |'
write (*,'(a)') '!          888  .d88P Y88b. .d88P Y88b. .d88P d8888888888 888  T88b            |'
write (*,'(a)') '!          8888888P"   "Y88888P"   "Y88888P" d88P     888 888   T88b           |'
write (*,'(a)') '!                                                                              |'
write(*,'(a,a8,a)') '!              DOUAR-WSMP version post-processor version ', vernum,'              |'
write (*,'(a)') '!------------------------------------------------------------------------------|'
write (*,'(a)') '!------------------------------------------------------------------------------|'
Dave Whipp's avatar
Dave Whipp committed
write (*,*) ''
Dave Whipp's avatar
Dave Whipp committed
write (*,'(a)') '1. Please enter the directory name containing DOUAR output.'
write (*,'(a)') '   NOTE: The directory name should be relative to one level above the working'
write (*,'(a)') '   directory. The default value is "OUT" (i.e., "../OUT")'
read (*,'(a)') dir
ndir=len_trim(dir)
if (ndir.eq.0) then
  ndir=3
  dir(1:ndir)='OUT'
endif

Dave Whipp's avatar
Dave Whipp committed
write (*,*) ''
Dave Whipp's avatar
Dave Whipp committed
write (*,'(a)') '2. Please enter the output time step.'
read*,nstep
write (c4,'(i4)') nstep
if (nstep.lt.1000) c4(1:1)='0'
if (nstep.lt.100) c4(1:2)='00'
if (nstep.lt.10) c4(1:3)='000'

Dave Whipp's avatar
Dave Whipp committed
write (*,*) ''
Dave Whipp's avatar
Dave Whipp committed
write (*,'(a)') '3. Is the output file a debug file? ("y" or "n")'
read (*,'(a)') cs
select case (cs)
Dave Whipp's avatar
Dave Whipp committed
case ('y','Y','yes','Yes')
   write (*,'(a)') '3a. Please enter the debug file grid iteration number: '
   read*,iter
   write (cc4,'(i4)') iter
   if (iter.lt.1000) cc4(1:1)='0'
   if (iter.lt.100) cc4(1:2)='00'
   if (iter.lt.10) cc4(1:3)='000'
Dave Whipp's avatar
Dave Whipp committed
case ('n','N','no','No')
   write (*,'(a)') 'Output file is not a debug file.'
case default 
   write (*,'(a)') 'Error: Response must be either "y" or "n". Please rerun the post-processor.'
Dave Whipp's avatar
Dave Whipp committed
   write (*,'(a)') 'Exiting...'
Dave Whipp's avatar
Dave Whipp committed
write (*,*) ''
Dave Whipp's avatar
Dave Whipp committed
write (*,'(a)') '4. Is this a nested model? ("y" or "n")'
read (*,'(a)') nestin
select case (trim(nestin))
case ('y','Y','yes','Yes')
   nest=.true.
case ('n','N','no','No')
   nest=.false.
case default 
Dave Whipp's avatar
Dave Whipp committed
   write (*,'(a)') 'Error: Response must be either "y" or "n". Please rerun the post-processor.'
   write (*,'(a)') 'Exiting...'
!==============================================================================
!==============================================================================

write(*,'(a)') ''
write(*,'(a)') '**************************************************************************'
write(*,'(a)') '--------------------------------------------------------------------------'
write(*,'(a)') '--------------------------------------------------------------------------'
write(*,'(a)') '------------------- VTK file production in progress ----------------------'
write(*,'(a)') '--------------------------------------------------------------------------'
write(*,'(a)') '--------------------------------------------------------------------------'
if (cs=='y') then
Dave Whipp's avatar
Dave Whipp committed
   write(*,'(a,a,a,a,a,a,a,a,a)') 'Processing output file ', '../'//dir(1:ndir)//'/time_'//c4//'_'//cc4//'.bin'
   open(unit=7,file='../'//dir(1:ndir)//'/time_'//c4//'_'//cc4//'.bin',status='old',form='unformatted')
else
Dave Whipp's avatar
Dave Whipp committed
   write(*,'(a,a,a,a,a,a,a)') 'Processing output file ', '../'//dir(1:ndir)//'/time_'//c4//'.bin'
   open(unit=7,file='../'//dir(1:ndir)//'/time_'//c4//'.bin',status='old',form='unformatted')
end if
write(*,'(a)') '--------------------------------------------------------------------------'
open(unit=77,file='input_of_outputs.txt',status='old')
read(77,*) input_vernum
write(*,'(a,a)') 'Post-processor input file version ', input_vernum
if (vernum /= input_vernum) then
  write (*,'(a)') 'Error: Post-processor version and post input file version do not agree.'
  write (*,'(a,a)') 'Post-processor version: ',vernum
  write (*,'(a,a)') 'Post input file version: ',input_vernum
  write (*,'(a)') 'Unable to continue. Exiting.'
  stop
endif
write(*,'(a)') '--------------------------------------------------------------------------'
Dave Whipp's avatar
Dave Whipp committed
read(77,*) output_u_field
read(77,*) output_v_field 
read(77,*) output_w_field
read(77,*) output_velo_vect 
read(77,*) output_preiso_velo_vect 
Dave Whipp's avatar
Dave Whipp committed
read(77,*) output_iso_velo_vect 
read(77,*) output_disp_field 
read(77,*) output_press_fieldn 
read(77,*) output_press_fielde 
read(77,*) output_smooth_press_fielde
read(77,*) output_countnode_field
read(77,*) output_temp_field
read(77,*) output_elem_matnum
read(77,*) output_e2d_fielde 
read(77,*) output_e2d_fieldn
read(77,*) output_eviscosity_fielde 
read(77,*) output_is_plastic_fielde
read(77,*) output_yield_ratio_fielde
read(77,*) output_frict_angle_fielde
read(77,*) output_dilatr_fielde
read(77,*) output_crit_field 
read(77,*) output_strain_field 
read(77,*) output_lsf_field 
read(77,*) output_surface_icon
read(77,*) output_strain_tensor
read(77,*) output_ps
read(77,*) output_cubes
read(77,*) output_rivers
read(77,*) output_regular
read(77,*) output_zisodisp
Dave Whipp's avatar
Dave Whipp committed
write(*,'(a,l)') 'output u      field       ->',(output_u_field==1)
write(*,'(a,l)') 'output v      field       ->',(output_v_field==1)
write(*,'(a,l)') 'output w      field       ->',(output_w_field==1)
write(*,'(a,l)') 'output velo   vectors     ->',(output_velo_vect==1) 
write(*,'(a,l)') 'output preiso velo vectors->',(output_preiso_velo_vect==1) 
write(*,'(a,l)') 'output iso velo vectors   ->',(output_preiso_velo_vect==1) 
write(*,'(a,l)') 'output disp   field       ->',(output_disp_field==1)
write(*,'(a,l)') 'output node press field   ->',(output_press_fieldn==1) 
write(*,'(a,l)') 'output raw press field    ->',(output_press_fielde==1) 
write(*,'(a,l)') 'output smooth press field ->',(output_smooth_press_fielde==1)
write(*,'(a,l)') 'output countnode field    ->',(output_countnode_field==1)
write(*,'(a,l)') 'output temp   field       ->',(output_temp_field==1)
write(*,'(a,l)') 'output elem material #    ->',(output_elem_matnum==1)
write(*,'(a,l)') 'output elemental e2d field->',(output_e2d_fielde==1) 
write(*,'(a,l)') 'output nodal e2d field    ->',(output_e2d_fieldn==1)
write(*,'(a,l)') 'output elem eff viscosity ->',(output_eviscosity_fielde==1) 
write(*,'(a,l)') 'output element is plastic ->',(output_is_plastic_fielde==1)
write(*,'(a,l)') 'output element yield ratio->',(output_yield_ratio_fielde==1)
write(*,'(a,l)') 'output elem friction angle->',(output_frict_angle_fielde==1)
write(*,'(a,l)') 'output element dilat rate ->',(output_dilatr_fielde==1) 
write(*,'(a,l)') 'output crit   field       ->',(output_crit_field==1)
write(*,'(a,l)') 'output strain field       ->',(output_strain_field==1)
write(*,'(a,l)') 'output lsf    field       ->',(output_lsf_field==1)
write(*,'(a,l)') 'output surfaces icon      ->',(output_surface_icon==1)
write(*,'(a,l)') 'output strain tensor      ->',(output_strain_tensor==1)
write(*,'(a,l)') 'output principal stresses ->',(output_ps==1)
write(*,'(a,l)') 'output elemental fields   ->',(output_cubes==1)
write(*,'(a,l)') 'output rivers             ->',(output_rivers==1)
write(*,'(a,l)') 'output regular            ->',(output_regular==1)
write(*,'(a,l)') 'output zisodisp           ->',(output_zisodisp==1)
write(*,'(a)') '--------------------------------------------------------------------------'

!==============================================================================!
!==============================================================================!

read (7) output_vernum

if (vernum /= output_vernum) then
  write (*,'(a)') 'Error: Post-processor version and DOUAR version do not agree.'
  write (*,'(a,a)') 'Post-processor version: ',vernum
  write (*,'(a,a)') 'DOUAR version: ',output_vernum
  write (*,'(a)') 'Unable to continue. Exiting.'
  stop
endif

read (7) ov%noctree,ov%nnode,ov%nleaves,ner,ov%nlsf,npcl,current_time
nn=ov%nnode
allocate(ov%on(nn))
allocate(ov%x(nn),ov%y(nn),ov%z(nn))
allocate(ov%u(nn),ov%v(nn),ov%w(nn),ov%wiso(nn))
allocate(ov%pressure(ov%nleaves),ov%strain(nn))
allocate(ov%e2d(ov%nleaves),ov%eviscosity(ov%nleaves),ov%is_plastic(ov%nleaves))
allocate(ov%dilatr(ov%nleaves),ov%whole_leaf_in_fluid(ov%nleaves))
allocate(ov%crit(ov%nleaves),ov%matnum(ov%nleaves),ov%yield_ratio(ov%nleaves))
allocate(ov%frict_angle(ov%nleaves))
allocate(ov%temp(nn))
allocate(ov%lsf(nn,ov%nlsf))
allocate(influid(nn))
allocate(invoid(nn))
allocate(rtf(nn),ftr(nn),elvoid(nn))
allocate(surface(ov%nlsf))
allocate(ov%nodal_pressure(nn),ov%spressure(ov%nleaves))
allocate(ov%icon(8,ov%nleaves))
allocate(ov%octree(ov%noctree))

!========================
!=====[nodal values]=====
!========================

read(7)(ov%x(i),ov%y(i),ov%z(i),   &
        ov%u(i),ov%v(i),ov%w(i),   &
        ov%wiso(i),                &
        ov%lsf(i,1:ov%nlsf),       &
        ov%temp(i),                &
        ov%nodal_pressure(i),      &
        ov%strain(i),              &
        kfx,kfy,kfz,kft,i=1,nn)

!======================
!=====[icon array]=====
!======================

read(7) (ov%icon(1:8,ie),            &
         ov%pressure(ie),            & 
         ov%spressure(ie),           &
         ov%crit(ie),                &
         ov%e2d(ie),                 &
         ov%eviscosity(ie),          &
         ov%is_plastic(ie),          &
         ov%dilatr(ie),              &
         ov%yield_ratio(ie),         &
         ov%whole_leaf_in_fluid(ie), & 
         ie=1,ov%nleaves)

!==============================
!=====[octree information]=====
!==============================

read(7) (ov%octree(i),i=1,ov%noctree)

!================================
!=====[bad face information]=====
!================================
mer=ner   ! mer=1
if(ner.gt.mer)mer=ner
allocate(ov%iconr(9,mer))
read(7) (ov%iconr(1:9,ie),ie=1,ner)

ov%nelemr=ner

!============================
!=====[void information]=====
!============================

read (7) (invoid(i),elvoid(i),ftr(i),rtf(i),influid(i),i=1,nn)
ov%on=0
do i=1,nn
   if (influid(i)) ov%on(i)=1
enddo

read(7) (i5,i=1,ner)

!==============================================================
!=====[measure work, strain, compute principal directions]=====
!==============================================================

allocate (s (3,ov%nleaves))
allocate (n1(3,ov%nleaves))
allocate (n2(3,ov%nleaves))
allocate (n3(3,ov%nleaves))
allocate (strain(3,3,ov%nleaves))

call find_volumes (ov%icon,ov%octree,ov%noctree,ov%nleaves,ov%lsf,ov%nlsf,ov%nnode,influid, &
                   ov%x,ov%y,ov%z,ov%u,ov%v,ov%w,s,n1,n2,n3,strain)

! rescaling of the values for plotting purposes

s=s/maxval(abs(s))*.01

strain=strain/maxval(abs(strain))*.01

!===============================
!=====[surface information]=====
!===============================

do is=1,ov%nlsf
   read(7) surface(is)%nsurface,activation_time,surface(is)%nt
   allocate (surface(is)%x(surface(is)%nsurface),  &
             surface(is)%y(surface(is)%nsurface),  &
             surface(is)%z(surface(is)%nsurface),  &
             surface(is)%xn(surface(is)%nsurface), &
             surface(is)%yn(surface(is)%nsurface), &
             surface(is)%zn(surface(is)%nsurface), &
             surface(is)%r(surface(is)%nsurface),  &
             surface(is)%s(surface(is)%nsurface),  &
             surface(is)%u(surface(is)%nsurface),  &
             surface(is)%v(surface(is)%nsurface),  &
             surface(is)%w(surface(is)%nsurface),  &
             surface(is)%icon(3,surface(is)%nt))
  
if (cs=='y') then
   read (7) (surface(is)%r(i),surface(is)%s(i), &
               surface(is)%x(i),surface(is)%y(i),surface(is)%z(i), &
               surface(is)%xn(i),surface(is)%yn(i),surface(is)%zn(i), &
               i=1,surface(is)%nsurface)
else
   read (7) (surface(is)%r(i),surface(is)%s(i), &
               surface(is)%x(i),surface(is)%y(i),surface(is)%z(i), &
               surface(is)%xn(i),surface(is)%yn(i),surface(is)%zn(i), &
               surface(is)%u(i),surface(is)%v(i),surface(is)%w(i), &
               i=1,surface(is)%nsurface)
end if

   read (7) (surface(is)%icon(1:3,i),i=1,surface(is)%nt)

end do

!=============================
!=====[cloud information]=====
!=============================

read (7) (dumpdp,      & 
            dumpdp,    &
            dumpdp,    &
            dumpdp,    &
            dumpdp,    & 
            dumpdp,    &
            dumpdp,    &
            dumpdp,    &
            dumpdp,    &
            dumpdp,    &
            dumpi,     &
            i=1,npcl)
!================================
!=====[isostasy information]=====
!================================

read (7) nb
dxy=1.d0/real(nb)
allocate(zisodisp(nb+1,nb+1))
read (7) ((zisodisp(i,j),j=1,nb+1),i=1,nb+1)
!============================
!=====[nest information]=====
!============================

read(7) sselemx,sselemy,sselemz,xminls,yminls,zminls

close(7)

!==============================================================================
!==============================================================================
!=====[C -> N]=================================================================
!==============================================================================
!==============================================================================

allocate(countnode(ov%nnode))
allocate(ov_nodee2d(ov%nnode))
allocate(ov_nodecrit(ov%nnode))

ov_nodee2d       = 0.d0
ov_nodecrit      = 0.d0
countnode        = 0.d0
 
do i=1,ov%nleaves
   do j=1,8
      k=ov%icon(j,i)
      ov_nodee2d(k)       = ov_nodee2d(k)      + ov%e2d(i)    
      ov_nodecrit(k)      = ov_nodecrit(k)     + ov%crit(i)    
      countnode(k)        = countnode(k)       + 1                     
   end do
end do

do i=1,ov%nnode
   if (countnode(i).gt.0.d0) then
      ov_nodee2d(i)      = ov_nodee2d(i)      / countnode(i)
      ov_nodecrit(i)     = ov_nodecrit(i)     / countnode(i)
   end if
end do

! Convert coordinates if using a nest
if (nest) then
  ov%x=ov%x*sselemx+xminls
  ov%y=ov%y*sselemy+yminls
  ov%z=ov%z*sselemz+zminls
Dave Whipp's avatar
Dave Whipp committed
  do is=1,ov%nlsf
    surface(is)%x=surface(is)%x*sselemx+xminls
    surface(is)%y=surface(is)%y*sselemy+yminls
    surface(is)%z=surface(is)%z*sselemz+zminls
  enddo
!==============================================================================
!==============================================================================

write(*,'(a,i10)') 'octree length              ',ov%noctree
write(*,'(a,i10)') 'nb of nodes                ',ov%nnode
write(*,'(a,i10)') 'nb of leaves               ',ov%nleaves
write(*,'(a,i10)') 'nb of bad faces            ',ner
write(*,'(a,i10)') 'nb of lsf                  ',ov%nlsf
write(*,*) '--------------------------------------------------------------------------'
write(*,'(a,2f30.20)') 'x                 range : ',minval(ov%x(1:nn)),       maxval(ov%x(1:nn))
write(*,'(a,2f30.20)') 'y                 range : ',minval(ov%y(1:nn)),       maxval(ov%y(1:nn))
write(*,'(a,2f30.20)') 'z                 range : ',minval(ov%z(1:nn)),       maxval(ov%z(1:nn))
write(*,'(a,2f30.20)') 'u                 range : ',minval(ov%u(1:nn)),       maxval(ov%u(1:nn))
write(*,'(a,2f30.20)') 'v                 range : ',minval(ov%v(1:nn)),       maxval(ov%v(1:nn))
write(*,'(a,2f30.20)') 'w                 range : ',minval(ov%w(1:nn)),       maxval(ov%w(1:nn))
write(*,'(a,2f30.20)') 'w (iso)           range : ',minval(ov%wiso(1:nn)),    maxval(ov%wiso(1:nn))
write(*,'(a,2f30.20)') 'pressure          range : ',minval(ov%pressure),      maxval(ov%pressure) 
write(*,'(a,2f30.20)') 'smooth pressure   range : ',minval(ov%spressure),     maxval(ov%spressure)
write(*,'(a,2f30.20)') 'pressure (nodes)  range : ',minval(ov%nodal_pressure),maxval(ov%nodal_pressure)
write(*,'(a,2f30.20)') 'e2d               range : ',minval(ov%e2d),           maxval(ov%e2d)
write(*,'(a,2f30.20)') 'e2d (nodes)       range : ',minval(ov_nodee2d),       maxval(ov_nodee2d)
write(*,'(a,2f30.20)') 'yield ratio       range : ',minval(ov%yield_ratio),   maxval(ov%yield_ratio)
write(*,'(a,2f30.20)') 'friction angle    range : ',minval(ov%frict_angle),   maxval(ov%frict_angle)
write(*,'(a,2f30.20)') 'dilatation rate   range : ',minval(ov%dilatr),        maxval(ov%dilatr)
write(*,'(a,2f30.20)') 'crit              range : ',minval(ov%crit),          maxval(ov%crit)
write(*,'(a,2f30.20)') 'crit (nodes)      range : ',minval(ov_nodecrit),      maxval(ov_nodecrit)
write(*,'(a,2f30.20)') 'strain            range : ',minval(ov%strain(1:nn)),  maxval(ov%strain(1:nn))
do is=1,ov%nlsf
write(*,*) '--------------------------------------------------------------------------'
write(*,'(a,i3)') 'surface',is
write(*,'(a,i7,a)') 'surface counts ',surface(is)%nsurface, ' points'
write(*,'(a,i7,a)') 'surface counts ',surface(is)%nt, ' triangles'
write(*,'(a,2f30.20)') 'surf%x range : ',minval(surface(is)%x),maxval(surface(is)%x)
write(*,'(a,2f30.20)') 'surf%y range : ',minval(surface(is)%y),maxval(surface(is)%y)
write(*,'(a,2f30.20)') 'surf%z range : ',minval(surface(is)%z),maxval(surface(is)%z)
end do

nnn=0
nnne=0
do i=1,nn
if (invoid(i).eq.0) nnn=nnn+1
enddo
do i=1,ov%nleaves
if (elvoid(i).eq.0) nnne=nnne+1
enddo

!==============================================================================
!=====[producing cubes.vtk]====================================================
!==============================================================================
if (output_cubes==1) then

   !=====[selection of leaves we are interested in]====
   allocate(subset_leaves(ov%nleaves))
   maxe2d=maxval(ov%e2d)
   subset_leaves=.false.
   do i=1,ov%nleaves
      xx=ov%x(ov%icon(1,i))
      yy=ov%y(ov%icon(1,i))
      zz=ov%z(ov%icon(1,i))
      if (.not.(xx.gt..5d0 .and. yy.gt. .5d0) .and.  ov%e2d(i)>0.06 *maxe2d) subset_leaves(i)=.true.
   end do
   !subset_leaves=ov%whole_leaf_in_fluid

   nl=count(subset_leaves)
   !np=8*nl
   np=8*ov%nleaves

   iunit=30
   open(unit=iunit,file='cubes.vtk')
   write(iunit,'(a)')'# vtk DataFile Version 3.0'
   write(iunit,'(a)')'velocities'
   write(iunit,'(a)')'ASCII'
   write(iunit,'(a)')'DATASET UNSTRUCTURED_GRID'
   write(iunit,'(a7,i10,a6)')'POINTS ',np,' float'

   do i=1,ov%nleaves
      !if (subset_leaves(i)) then
         do k=1,8 
           xx=ov%x(ov%icon(k,i))
           yy=ov%y(ov%icon(k,i))
           zz=ov%z(ov%icon(k,i))
Dave Whipp's avatar
Dave Whipp committed
           write(iunit,'(3e13.6)') xx,yy,zz
         end do
      !end if
   enddo

   write(iunit,'(A6, 2I10)') 'CELLS ',nl,(1+8)*nl
   do ie=1,ov%nleaves
      if (subset_leaves(ie)) then
         write(iunit,'(9I10)') 8 , ((ie-1)*8+i-1,i=1,8)
      end if
   end do

   write(iunit,'(A11, I10)') 'CELL_TYPES ',nl
   do ie=1,ov%nleaves
      if (subset_leaves(ie)) then
         write(iunit,'(I2)') 11
      end if 
   end do

   write(iunit,'(a11,i10)')'POINT_DATA ',np

   write(iunit,'(a)')'SCALARS e2d float 1'
   write(iunit,'(a)')'LOOKUP_TABLE default'
   do i=1,ov%nleaves
Dave Whipp's avatar
Dave Whipp committed
         do k=1,8
            if (abs(ov%e2d(i)).ge.1.d98) ov%e2d(i)=sign(1.d98,ov%e2d(i))
Dave Whipp's avatar
Dave Whipp committed
            if (abs(ov%e2d(i)).le.1.d-99) ov%e2d(i)=0.d0
            write(iunit,'(e13.6)') ov%e2d(i)
         end do
   end do
   
   write(iunit,'(a)')'SCALARS w float 1'
   write(iunit,'(a)')'LOOKUP_TABLE default'
   do i=1,ov%nleaves
Dave Whipp's avatar
Dave Whipp committed
      do k=1,8
        wsum=sum(ov%w(ov%icon(:,i)))/8.d0
        if (abs(wsum).ge.1.d98) wsum=sign(1.d98,wsum)
Dave Whipp's avatar
Dave Whipp committed
        if (abs(wsum).le.1.d-99) wsum=0.d0
        write(iunit,'(e13.6)') wsum
      end do
   end do
   write(iunit,'(a)')'SCALARS v float 1'
   write(iunit,'(a)')'LOOKUP_TABLE default'
   do i=1,ov%nleaves
Dave Whipp's avatar
Dave Whipp committed
      do k=1,8
        vsum=sum(ov%v(ov%icon(:,i)))/8.d0
        if (abs(vsum).ge.1.d98) vsum=sign(1.d98,vsum)
Dave Whipp's avatar
Dave Whipp committed
        if (abs(vsum).le.1.d-99) vsum=0.d0
        write(iunit,'(e13.6)') vsum
      end do
   end do
   write(iunit,'(a)')'SCALARS u float 1'
   write(iunit,'(a)')'LOOKUP_TABLE default'
   do i=1,ov%nleaves
      do k=1,8 
Dave Whipp's avatar
Dave Whipp committed
        usum=sum(ov%u(ov%icon(:,i)))/8.d0
        if (abs(usum).ge.1.d98) usum=sign(1.d98,usum)
Dave Whipp's avatar
Dave Whipp committed
        if (abs(usum).le.1.d-99) usum=0.d0
        write(iunit,'(e13.6)') usum
      end do
   end do

   write(iunit,'(a)')'SCALARS uvw float 1'
   write(iunit,'(a)')'LOOKUP_TABLE default'
   do i=1,ov%nleaves
Dave Whipp's avatar
Dave Whipp committed
      do k=1,8
        uvwsum=sqrt((sum(ov%u(ov%icon(:,i)))/8.d0)**2+(sum(ov%v(ov%icon(:,i)))/8.d0)**2+(sum(ov%w(ov%icon(:,i)))/8.d0)**2)
        if (abs(uvwsum).ge.1.d98) uvwsum=sign(1.d98,uvwsum)
Dave Whipp's avatar
Dave Whipp committed
        if (abs(uvwsum).le.1.d-99) uvwsum=0.d0
        write(iunit,'(e13.6)') uvwsum
      end do
   end do

   write(*,*) '--------------------------------------------------------------------------'
   write(*,*) 'opla I am done producing cubes.vtk'
end if




!==============================================================================
!======[producing strain.vtk]==================================================
!==============================================================================

if (output_strain_tensor/=0) then

nnnep=0
levelmax=2
allocate (instrain(ov%nleaves))
instrain=.FALSE.
do i=1,ov%nleaves
   if (elvoid(i).eq.0) then
   xx=sum(ov%x(ov%icon(:,i)))/8.d0
   yy=sum(ov%y(ov%icon(:,i)))/8.d0
   zz=sum(ov%z(ov%icon(:,i)))/8.d0
   xx=xx*(2.d0**levelmax)
   yy=yy*(2.d0**levelmax)
   zz=zz*(2.d0**levelmax)
   ix=int(xx)
   iy=int(yy)
   iz=int(zz)
   if (abs(xx-float(ix)-0.5d0).lt.1.d-6 .and. &
       abs(yy-float(iy)-0.5d0).lt.1.d-6 .and. &
       abs(zz-float(iz)-0.5d0).lt.1.d-6) instrain(i)=.TRUE.
   if (instrain(i)) nnnep=nnnep+1
   endif
enddo 
!print*,'here',nnne,nnnep

iunit=30
open(unit=iunit,file='strain.vtk')
write(iunit,'(a)')'# vtk DataFile Version 3.0'
write(iunit,'(a)')'sigma1'
write(iunit,'(a)')'ASCII'
write(iunit,'(a)')'DATASET UNSTRUCTURED_GRID'
write(iunit,'(a7,i10,a6)')'POINTS ',nnnep,' float'

do i=1,ov%nleaves
   if (elvoid(i).eq.0) then
   xx=sum(ov%x(ov%icon(:,i)))/8.d0
   yy=sum(ov%y(ov%icon(:,i)))/8.d0
   zz=sum(ov%z(ov%icon(:,i)))/8.d0
   if (instrain(i)) write(iunit,'(3f16.11)') xx,yy,zz
   endif
enddo 

write(iunit,'(a11,i10)')'POINT_DATA ',nnnep

write(iunit,'(a)')'TENSORS strain float'
do i=1,ov%nleaves
   if (elvoid(i).eq.0) then
Dave Whipp's avatar
Dave Whipp committed
     xx=sum(ov%x(ov%icon(:,i)))/8.d0
     yy=sum(ov%y(ov%icon(:,i)))/8.d0
     zz=sum(ov%z(ov%icon(:,i)))/8.d0
     if (instrain(i)) then
       !if (strain(1,:,i).ge.1.d98) strain(1,:,i)=1.d98
       !if (strain(1,:,i).le.1.d-99) strain(1,:,i)=0.d0
       !if (strain(2,:,i).ge.1.d98) strain(2,:,i)=1.d98
       !if (strain(2,:,i).le.1.d-99) strain(2,:,i)=1.d0
       !if (strain(3,:,i).ge.1.d98) strain(3,:,i)=1.d98
       !if (strain(3,:,i).le.1.d-99) strain(3,:,i)=1.d0
Dave Whipp's avatar
Dave Whipp committed
       write(iunit,'(3e13.6)') strain(1,:,i)
       write(iunit,'(3e13.6)') strain(2,:,i)
       write(iunit,'(3e13.6)') strain(3,:,i)
     endif
   endif
enddo
close (iunit)

deallocate (instrain)

write(*,*) '--------------------------------------------------------------------------'
write(*,*)'opla I am done producing strain.vtk '

end if

!==============================================================================
!======[produce compressive.vtk file]==========================================
!==============================================================================

if (output_ps/=0) then

allocate(do_it(ov%nleaves))

np=0
do i=1,ov%nleaves
   zz=sum(ov%z(ov%icon(:,i)))/8.d0  !criterion
   if (zz<.3d0) then
      np=np+1
      do_it(i)=.true.
   end if
end do

write(*,*) '--------------------------------------------------------------------------'
write(*,*) 'subset of points in compressive.vtk:',np

iunit=30
open(unit=iunit,file='compressive.vtk')
write(iunit,'(a)')'# vtk DataFile Version 3.0'
write(iunit,'(a)')'sigma1'
write(iunit,'(a)')'ASCII'
write(iunit,'(a)')'DATASET UNSTRUCTURED_GRID'
write(iunit,'(a7,i10,a6)')'POINTS ',np,' float'

do i=1,ov%nleaves
   if (do_it(i)) then
      xx=sum(ov%x(ov%icon(:,i)))/8.d0
      yy=sum(ov%y(ov%icon(:,i)))/8.d0
      zz=sum(ov%z(ov%icon(:,i)))/8.d0
      write(iunit,'(3f16.11)') xx,yy,zz
   end if
enddo

write(iunit,'(a11,i10)')'POINT_DATA ', np

write(iunit,'(a)')'VECTORS sigma1head+ float'
do i=1,ov%nleaves
   if (do_it(i)) & 
   write(iunit,'(3e15.4)') n1(1:3,i)*s(1,i)
enddo
write(iunit,'(a)')'VECTORS sigma1head- float'
do i=1,ov%nleaves
   if (do_it(i)) & 
   write(iunit,'(3e15.4)') -n1(1:3,i)*s(1,i)
enddo

write(iunit,'(a)')'VECTORS sigma3tail+ float'
do i=1,ov%nleaves
   if (do_it(i)) & 
   write(iunit,'(3e15.4)') n2(1:3,i)*s(2,i)
enddo

write(iunit,'(a)')'VECTORS sigma3tail- float'
do i=1,ov%nleaves
   if (do_it(i)) & 
   write(iunit,'(3e15.4)') -n2(1:3,i)*s(2,i)
enddo

write(iunit,'(a)')'VECTORS sigma2head+ float'
do i=1,ov%nleaves
   if (do_it(i)) & 
   write(iunit,'(3e15.4)') n3(1:3,i)*min(0.d0,s(3,i))
enddo

write(iunit,'(a)')'VECTORS sigma2head- float'
do i=1,ov%nleaves
   if (do_it(i)) & 
   write(iunit,'(3e15.4)') -n3(1:3,i)*min(0.d0,s(3,i))
enddo

write(iunit,'(a)')'VECTORS sigma2tail+ float'
do i=1,ov%nleaves
   if (do_it(i)) & 
   write(iunit,'(3e15.4)') n3(1:3,i)*max(0.d0,s(3,i))
enddo

write(iunit,'(a)')'VECTORS sigma2tail- float'
do i=1,ov%nleaves
   if (do_it(i)) & 
   write(iunit,'(3e15.4)') -n3(1:3,i)*max(0.d0,s(3,i))
enddo

close (iunit)

deallocate(do_it)

write(*,*) '--------------------------------------------------------------------------'
write(*,*)'opla I am done producing compressive.vtk '

end if

!==============================================================================
!======[produce visu.vtk file]=================================================
!==============================================================================


!iunit=30
!open(unit=iunit,file='cut.dat')
!do i=1,nnn              ! loop over nodes
!   x=ov%x(rtf(i))
!   y=ov%y(rtf(i))
!   z=ov%z(rtf(i))
!   icut=3   ! icut between 0 and 64 for uniform level 6
!   ! example , cross section in plane given by x=value
!   xcut=icut*2.d0**(-6)    ! background uniform grid level is 6
!   dxyz=2.d0**(-7)      ! higher level grid in boxes is 7
!   if (abs(x-xcut)<1.d-6 ) then   ! select nodes that are only on the plane
!      if (mod(nint(y/dxyz),2)==0) then  ! les coordonnees des noeuds surla grille de niveau 7 divisees par dxy vont prendre les valeurs 0 a 128
!      if (mod(nint(z/dxyz),2)==0) then
!         write(iunit,*) x,y,z
!      end if
!      end if
!   end if
!enddo
!close(iunit)


iunit=30
open(unit=iunit,file='visu.vtk')
write(iunit,'(a)')'# vtk DataFile Version 3.0'
write(iunit,'(a)')'velocities'
write(iunit,'(a)')'ASCII'
write(iunit,'(a)')'DATASET UNSTRUCTURED_GRID'
write(iunit,'(a7,i10,a6)')'POINTS ',nnn,' float'

do i=1,nnn
write(iunit,'(3f16.11)')ov%x(rtf(i)),ov%y(rtf(i)),ov%z(rtf(i))
enddo

write(iunit,'(A6, 2I10)') 'CELLS ',nnne,(1+nne)*nnne
iconmin=nn
iconmax=0
do ie=1,ov%nleaves
   if (elvoid(ie).eq.0) then
   myicon(1:nne)=ftr(ov%icon(1:nne,ie))-1
     do k=1,nne
     iconmin=min(iconmin,myicon(k))
     iconmax=max(iconmax,myicon(k))
     enddo
   write(iunit,'(9I10)')nne,myicon(1:nne)
   endif
enddo
!print*,iconmin,iconmax

write(iunit,'(A11, I10)') 'CELL_TYPES ',nnne
do ie=1,nnne
   write(iunit,'(I2)')11 ! octree  (8 nodes)
end do

write(iunit,'(a11,i10)')'POINT_DATA ',nnn

if(output_u_field==1) then 
Dave Whipp's avatar
Dave Whipp committed
   write(iunit,'(a)')'SCALARS u double 1'
   write(iunit,'(a)')'LOOKUP_TABLE default'
   do i=1,nnn
      if (abs(ov%u(rtf(i))).ge.1.d98) ov%u(rtf(i))=sign(1.d98,ov%u(rtf(i)))
Dave Whipp's avatar
Dave Whipp committed
      if (abs(ov%u(rtf(i))).le.1.d-99) ov%u(rtf(i))=0.d0
      write(iunit,'(e13.6)') ov%u(rtf(i))
   enddo
end if

if(output_v_field==1) then 
Dave Whipp's avatar
Dave Whipp committed
   write(iunit,'(a)')'SCALARS v double 1'
   write(iunit,'(a)')'LOOKUP_TABLE default'
   do i=1,nnn
      if (abs(ov%v(rtf(i))).ge.1.d98) ov%v(rtf(i))=sign(1.d98,ov%v(rtf(i)))
Dave Whipp's avatar
Dave Whipp committed
      if (abs(ov%v(rtf(i))).le.1.d-99) ov%v(rtf(i))=0.d0
      write(iunit,'(e13.6)') ov%v(rtf(i))
   enddo
end if

if(output_w_field==1) then 
Dave Whipp's avatar
Dave Whipp committed
   write(iunit,'(a)')'SCALARS w double 1'
   write(iunit,'(a)')'LOOKUP_TABLE default'
   do i=1,nnn
      if (abs(ov%w(rtf(i))).ge.1.d98) ov%w(rtf(i))=sign(1.d98,ov%w(rtf(i)))
Dave Whipp's avatar
Dave Whipp committed
      if (abs(ov%w(rtf(i))).le.1.d-99) ov%w(rtf(i))=0.d0
      write(iunit,'(e13.6)') ov%w(rtf(i))
   enddo
end if

if(output_disp_field==1) then 
Dave Whipp's avatar
Dave Whipp committed
   write(iunit,'(a)')'SCALARS disp double 1'
   write(iunit,'(a)')'LOOKUP_TABLE default'
   do i=1,nnn
Dave Whipp's avatar
Dave Whipp committed
      disp=sqrt(ov%u(rtf(i))**2+ov%v(rtf(i))**2+ov%w(rtf(i))**2)
      if (abs(disp).ge.1.d98) disp=sign(1.d98,disp)
Dave Whipp's avatar
Dave Whipp committed
      if (abs(disp).le.1.d-99) disp=0.d0
      write(iunit,'(e13.6)') disp
if(output_press_fieldn==1) then 
Dave Whipp's avatar
Dave Whipp committed
   write(iunit,'(a)')'SCALARS pressure_n double 1'
   write(iunit,'(a)')'LOOKUP_TABLE default'
   do i=1,nnn
      if (abs(ov%nodal_pressure(rtf(i))).ge.1.d98) then
        ov%nodal_pressure(rtf(i))=sign(1.d98,ov%nodal_pressure(rtf(i)))
Dave Whipp's avatar
Dave Whipp committed
      endif
      if (abs(ov%nodal_pressure(rtf(i))).le.1.d-99) then
        ov%nodal_pressure(rtf(i))=0.d0
      endif
      write(iunit,'(e13.6)') ov%nodal_pressure(rtf(i))
if(output_countnode_field==1) then 
Dave Whipp's avatar
Dave Whipp committed
   write(iunit,'(a)')'SCALARS countnode double 1' 
   write(iunit,'(a)')'LOOKUP_TABLE default' 
Dave Whipp's avatar
Dave Whipp committed
   do i=1,nnn
      if (abs(countnode(rtf(i))).ge.1.d98) then
        countnode(rtf(i))=sign(1.d98,countnode(rtf(i)))
Dave Whipp's avatar
Dave Whipp committed
      endif
      if (abs(countnode(rtf(i))).le.1.d-99) countnode(rtf(i))=0.d0
      write(iunit,'(e13.6)') countnode(rtf(i))
if(output_e2d_fieldn==1) then 
Dave Whipp's avatar
Dave Whipp committed
   write(iunit,'(a)')'SCALARS e2dn double 1'
   write(iunit,'(a)')'LOOKUP_TABLE default'
   do i=1,nnn
      if (abs(ov_nodee2d(rtf(i))).ge.1.d98) then
        ov_nodee2d(rtf(i))=sign(1.d98,ov_nodee2d(rtf(i)))
Dave Whipp's avatar
Dave Whipp committed
      endif
      if (abs(ov_nodee2d(rtf(i))).le.1.d-99) ov_nodee2d(rtf(i))=0.d0
      write(iunit,'(e13.6)') ov_nodee2d(rtf(i))
   enddo
end if

if(output_crit_field==1) then 
Dave Whipp's avatar
Dave Whipp committed
   write(iunit,'(a)')'SCALARS crit double 1'
   write(iunit,'(a)')'LOOKUP_TABLE default'
   do i=1,nnn
      if (abs(ov_nodecrit(rtf(i))).ge.1.d98) then
        ov_nodecrit(rtf(i))=sign(1.d98,ov_nodecrit(rtf(i)))
Dave Whipp's avatar
Dave Whipp committed
      endif
      if (abs(ov_nodecrit(rtf(i))).le.1.d-99) ov_nodecrit(rtf(i))=0.d0
      write(iunit,'(e13.6)') ov_nodecrit(rtf(i))
   enddo
end if

if(output_strain_field==1) then 
Dave Whipp's avatar
Dave Whipp committed
   write(iunit,'(a)')'SCALARS s double 1'
   write(iunit,'(a)')'LOOKUP_TABLE default'
   do i=1,nnn
      if (abs(ov%strain(rtf(i))).ge.1.d98) then
        ov%strain(rtf(i))=sign(1.d98,ov%strain(rtf(i)))
Dave Whipp's avatar
Dave Whipp committed
      endif