• VTF
  • FSI
  • AMROC
  • SFC
  • Motion
  • STLIB
  • Main Page
  • src/equations/spiralsgs.f

    c----------------------------------------------------------------------
    c
    c Compressible/Incompressible stretched vortex subgrid model (LES)
    c
    c----------------------------------------------------------------------
    c
    c Copyright (C) California Institute of Technology 2000-2005
    c Authors: D.I. Pullin  (dale@galcit.caltech.edu)
    c          D.J. Hill
    c          C.   Pantano
    c
    c----------------------------------------------------------------------
    
    c     -----------------------------------------------------
    c     Computes the circular average (in a given plane)
    c     of the the subgrid contribution to the velocity variance
    c     -----------------------------------------------------
    c       This file needs to be edited when the plane is changed
    c       or to change from circular averaged to spherical averaged
    c     =====================================================
          Subroutine IntegrateStructure(ex,ey,ez,rx,ry,rz,StructureAve)
    c     =====================================================
          implicit none
    
          include 'spiralsgs.i'
          
    c     input
          double precision  ex, ey, ez
          double precision  rx, ry, rz
    c      
    c     output
          double precision  StructureAve
          double precision  normalcos,ratio
    c
          if ( dir .eq. 1 ) then
    c     --- structure function defined in the yz plane
             normalcos = ex
             ratio = rx
          else if ( dir .eq. 2 ) then
    c     --- structure function defined in the xz plane
             normalcos = ey
             ratio = ry
          else if ( dir .eq. 3 ) then
    c     --- structure function defined in the xy plane
             normalcos = ez
             ratio = rz
          endif
     
          if ( dir .gt. 0 ) then
    c     For the circular average call this:      
             call IntegratePlaneStructure(normalcos,ratio,StructureAve)
          else
    c     For a spherical average:
             StructureAve = 1.90695d0
          endif
          
          return
          end 
    
    c     =====================================================
          subroutine ParticularStructureFunction(fstruc,vx,nvars,itype,
         &     dx,dy,dz,ixlo,ixhi,iylo,iyhi,izlo,izhi)
    c     =====================================================
    
          implicit none
    
          include 'spiralsgs.i'
    
    c     input
          integer  nvars, itype
          integer  ixlo,ixhi,iylo,iyhi,izlo,izhi
          double precision  vx(nvars,ixlo:ixhi,iylo:iyhi,izlo:izhi)
    c     output
          double precision  fstruc(ixlo:ixhi,iylo:iyhi,izlo:izhi)
          
          integer  dir1, dir2,dir3
          double precision  weight
          double precision  strucr
          double precision  dx,dy,dz
          double precision  ddir1,dir1r_23
          double precision  ddir2,dir2r_23
          double precision  ddir3,dir3r_23
          integer  i,j,k
    
    c--------------------------------------------------
          if ( dir .eq. 0 ) then
    c     --- structure function defined in a sphere
             dir1 = 1
             ddir1 = dx
             dir2 = 2
             ddir2 = dy
             dir3 = 3 
             ddir3 = dz
          else if ( dir .eq. 1 ) then
    c     --- structure function defined in the yz plane
             dir1 = 2
             ddir1 = dy
             dir2 = 3
             ddir2 = dz
    c     don't use third direction      
             dir3 = 0   
             ddir3 = dx      
          else if ( dir .eq. 2 ) then
    c     --- structure function defined in the xz plane
             dir1 = 1
             ddir1 = dx
             dir2 = 3
             ddir2 = dz
    c     don't use third direction
             dir3 = 0   
             ddir3 = dy
          else if ( dir .eq. 3 ) then
    c     --- structure function defined in the xy plane
             dir1 = 2
             ddir1 = dy
             dir2 = 1
             ddir2 = dx
    c     don't use third direction
             dir3 = 0   
             ddir3 = dz
          endif
    c__________________________________________________
    
          if ( dir .eq. 0 ) then
    c      spherical average:
             strucr = (ddir1*ddir2*ddir3)**(1.D0/3.D0)
          else
    c      circular average:      
             strucr = dsqrt(ddir1*ddir2)
          endif
    
          dir1r_23 = (strucr/ddir1)**(2.D0/3.D0)
          dir2r_23 = (strucr/ddir2)**(2.D0/3.D0)
          dir3r_23 = (strucr/ddir3)**(2.D0/3.D0)
    
          if (dir.eq.0) then
    c      spherical average
             weight = 1.0d0/6.0d0
          else
    c      circular average:  
             weight = 0.25d0
          end if
    c     
          do k = izlo, izhi
             do j = iylo,iyhi
                do i = ixlo,ixhi
                   fstruc(i,j,k) = 0.0d0
                enddo
             enddo
          enddo
          
          call compute_square_diffs(fstruc,vx,nvars,itype, 
         &     ixlo,ixhi,iylo,iyhi,izlo,izhi,
         &     dir1r_23, dir1)
    c
          call compute_square_diffs(fstruc,vx,nvars,itype, 
         &     ixlo,ixhi,iylo,iyhi,izlo,izhi,
         &     dir2r_23, dir2)
    c     
          if (dir.eq.0) then
    c       -- we are doing the spherical average, need one more direction
             call compute_square_diffs(fstruc,vx,nvars,itype, 
         &        ixlo,ixhi,iylo,iyhi,izlo,izhi,
         &        dir3r_23, dir3)
          end if
    
          do k = izlo, izhi
             do j = iylo,iyhi
                do i =ixlo,ixhi
                   fstruc(i,j,k) = weight * fstruc(i,j,k)
                end do
             end do
          end do
    
    c      
          return
          end
    
    
    
    c     =====================================================
          subroutine IntegratePlaneStructure(e3z,ratio,q1)
    c     =====================================================
    c ----- This computes the integral (B8) 
    c ----- in Voelkl,Pullin,Chan Phy Fluids 2000
    c ----- and mutiplies it by 2/pi - giving the circular
    c ----- average of the "resolved scales"
          implicit none
    
    c     input
          double precision  e3z
          double precision  ratio
    c     output
          double precision  q1
    c
          double precision pi
    c
          double precision  calpha,ssqalpha,afac,cfac,sapow,ctmp
    c
          pi=3.141592653589793238462643383279502884197
    
          calpha = ABS(e3z)
    c     this is ssqalpha = sin\psi on Page 1823 of Voelkl,Pullin,Chan
    c     \simga
          ssqalpha = 1.D0 - calpha*calpha
    
    c     (3 \pi^{7/3} / 16) (2-\sigma)      
          afac = 2.7103 * (2.D0 - ssqalpha)
    
    c     C_1 G(\sigma)
    c     where G(\sigma) = \pi(2 -1/3 \sigma - 1/12 \sigma^2 
    c                            -25/648\simga^3 -175/776 \sigma^4 )
    c
    c     and C_1 = \pi /(2^(2/3) \Gamma^2(4/3)
          cfac = 9.004 - 1.501*ssqalpha
          sapow = ssqalpha * ssqalpha
          cfac = cfac - 0.375*sapow
          sapow = sapow * ssqalpha
          cfac = cfac - 0.174*sapow
          sapow = sapow * ssqalpha
          cfac = cfac - 0.101*sapow
          
    c
          ctmp = (cfac + afac * ratio**(1.33333333333) )
          if ( ctmp .ne. 0.0d0 ) then
             q1 = afac * cfac * ratio * ratio / ctmp
          else
             q1 = 0.0d0
          endif
    c
          q1 = q1*2.0/pi
    
          return
          end
    
    c     =====================================================      
          subroutine compute_square_diffs(temp, vx, nvars, itype, 
         &     ixlo,ixhi,iylo,iyhi,izlo,izhi,dr_23, id)
    c     =====================================================
    
          implicit none
          
          integer  nvars, itype
          integer  ixlo,ixhi,iylo,iyhi,izlo,izhi
          integer  id
          double precision  dr_23
       
          double precision  vx(nvars,ixlo:ixhi,iylo:iyhi,izlo:izhi)
          double precision  temp(ixlo:ixhi,iylo:iyhi,izlo:izhi)
    
          integer i,j,k
          integer i1, i2, i3
          
          if ( itype .eq. 0 ) then
             i1 = 2
             i2 = 3
             i3 = 4
          endif
    
          if (id.eq.1) then
    
             if ( itype .eq. 0 ) then
                do k = izlo, izhi
                   do j = iylo,iyhi
                      do i = ixlo+1,ixhi-1
                         temp(i,j,k) = temp(i,j,k) + (
         &                    (vx(i1,i+1,j,k)-vx(i1,i,j,k))**2 +  
         &                    (vx(i1,i-1,j,k)-vx(i1,i,j,k))**2 +  
         &                    (vx(i2,i+1,j,k)-vx(i2,i,j,k))**2 +  
         &                    (vx(i2,i-1,j,k)-vx(i2,i,j,k))**2 +
         &                    (vx(i3,i+1,j,k)-vx(i3,i,j,k))**2 +  
         &                    (vx(i3,i-1,j,k)-vx(i3,i,j,k))**2 ) * dr_23
                      end do
                   end do
                end do
             else
                do k = izlo, izhi
                   do j = iylo,iyhi
                      do i = ixlo+1,ixhi-1
                         temp(i,j,k) = temp(i,j,k) + (
         &                    (vx(itype,i+1,j,k)-vx(itype,i,j,k))**2 +  
         &                    (vx(itype,i-1,j,k)-vx(itype,i,j,k))**2) 
         $                    * dr_23 
                      end do
                   end do
                end do
             endif
             
          else if (id.eq.2) then
             
             if ( itype .eq. 0 ) then
                do k = izlo, izhi
                   do j = iylo+1,iyhi-1
                      do i = ixlo,ixhi
                         temp(i,j,k) = temp(i,j,k) + (
         &                    (vx(i1,i,j+1,k)-vx(i1,i,j,k))**2 +  
         &                    (vx(i1,i,j-1,k)-vx(i1,i,j,k))**2 +  
         &                    (vx(i2,i,j+1,k)-vx(i2,i,j,k))**2 +  
         &                    (vx(i2,i,j-1,k)-vx(i2,i,j,k))**2 +
         &                    (vx(i3,i,j+1,k)-vx(i3,i,j,k))**2 +  
         &                    (vx(i3,i,j-1,k)-vx(i3,i,j,k))**2 ) * dr_23
                      end do
                   end do
                end do
             else
                do k = izlo, izhi
                   do j = iylo+1,iyhi-1
                      do i = ixlo,ixhi
                         temp(i,j,k) = temp(i,j,k) + (
         &                    (vx(itype,i,j+1,k)-vx(itype,i,j,k))**2 +  
         &                    (vx(itype,i,j-1,k)-vx(itype,i,j,k))**2 ) 
         $                    * dr_23
                      end do
                   end do
                end do
             endif
             
          else 
    
             if ( itype .eq. 0 ) then
                do k = izlo+1, izhi-1
                   do j = iylo,iyhi
                      do i = ixlo,ixhi
                         temp(i,j,k) = temp(i,j,k) + (
         &                    (vx(i1,i,j,k+1)-vx(i1,i,j,k))**2 +  
         &                    (vx(i1,i,j,k-1)-vx(i1,i,j,k))**2 +  
         &                    (vx(i2,i,j,k+1)-vx(i2,i,j,k))**2 +  
         &                    (vx(i2,i,j,k-1)-vx(i2,i,j,k))**2 +
         &                    (vx(i3,i,j,k+1)-vx(i3,i,j,k))**2 +  
         &                    (vx(i3,i,j,k-1)-vx(i3,i,j,k))**2 ) * dr_23
                      end do
                   end do
                end do
             else
                do k = izlo+1, izhi-1
                   do j = iylo,iyhi
                      do i = ixlo,ixhi
                         temp(i,j,k) = temp(i,j,k) + (
         &                    (vx(itype,i,j,k+1)-vx(itype,i,j,k))**2 +  
         &                    (vx(itype,i,j,k-1)-vx(itype,i,j,k))**2 ) 
         $                    * dr_23
                      end do
                   end do
                end do
             endif
             
          end if
          
          return
          end 
          
    

<