vtf-logo

fsi/adlib-amroc/BlastPlate/src/von_neumann.f

c
c
c     =====================================================
      subroutine von_neumann(E0,R0,rhoamb,pamb,dist,dim,
     &                       gamma,toltheta,rho,p,u)
c     =====================================================
c
      implicit double precision (a-h,o-z)
c

      C2=0.8510d0
      if (dim.EQ.1.d0)then
         C2=0.53864d0
      end if
      C1=(E0/C2/rhoamb)**(1.d0/(2.d0+dim))
      time=(R0/C1)**((2.d0+dim)/2.d0)
      tmp1 = C1*(time)**(2.d0/(2.d0+dim))
      tmp2 = (gamma-1.d0)/(dim+2.d0*gamma-2.d0)
      tmp3 = (gamma+1.d0)/(dim*gamma-dim+2.d0)
      theta=1.
      xwzlasttheta=0.
      xwzlastx=0.
      x=0.
      iend=0
      imax=1000
      iblast=0
      rho=rhoamb
      p=pamb
      u=0.d0
      powx=-1.d0*((dim**2.d0+4.d0)*gamma**2.d0+
     &     (8.d0*dim-3.d0*dim**2.d0-4.d0)*gamma +
     &     (4.d0*dim**2.d0-8.d0*dim))/((dim+2.d0)*
     &     (2.d0*gamma+dim-2.)*(dim*gamma-dim+2.d0))
      powr=((dim**2.d0+4.d0)*gamma**2.d0+
     &     (8.d0*dim-3.d0*dim**2.d0-4.d0)*gamma +
     &     (4.d0*dim**2.d0-8.d0*dim))/((2.d0-gamma)*
     &     (2.d0*gamma+dim-2.)*(dim*gamma-dim+2.d0))
      powu=-1.d0*((dim**2.d0+4.d0)*gamma**2.d0+
     &     (8.d0*dim-3.d0*dim**2.d0-4.d0)*gamma +
     &     (4.d0*dim**2.d0-8.d0*dim))/((dim+2.d0)*
     &     (2.d0*gamma+dim-2.)*(dim*gamma-dim+2.d0))
      powp=((dim**2.d0+4.d0)*gamma**2.d0+
     &     (8.d0*dim-3.d0*dim**2.d0-4.d0)*gamma +
     &     (4.d0*dim**2.d0-8.d0*dim))/((dim+2.d0)*
     &     (2.d0-gamma)*(dim*gamma-dim+2.d0))
      base=1.
      do i =0,imax
         base=((dim*(2.d0-gamma)*theta+dim+2.d0*gamma-2.d0)/
     &          (3.d0*dim-dim*gamma+2.d0*gamma-2.d0))
         x=tmp1*
     &     (theta)**(tmp2)*
     &     ((theta+1.d0)/2.d0)**(-2.d0/(dim+2.d0))*
     &     ((gamma+theta)/(gamma+1.d0))**
     &         (tmp3)*
     &     base**(powx)
         if(i.eq.0.and.dist.gt.x)then
c           we are out of the pressurized range
            iblast=0
            goto 10
         endif
         if(dabs(x-dist)/dist.lt.toltheta)then
c           we found the position
            iblast=1
            goto 10
         endif
         if(i.eq.imax-1)then
c           we did not found it
            print*, ' von-neumann initialization at distance ', dist, 
     &           ' failed \n'
         endif
         dxdtheta=tmp1*(tmp2)*(theta)**(tmp2-1.d0)*
     &     ((theta+1.d0)/2.d0)**(-2.d0/(dim+2.d0))*
     &     ((gamma+theta)/(gamma+1.d0))**(tmp3)*base**(powx)+
     &     tmp1*(theta)**(tmp2)*(-1.d0/(dim+2.d0))*
     &     ((theta+1.d0)/2.d0)**(-2.d0/(dim+2.d0)-1.d0)*
     &     ((gamma+theta)/(gamma+1.d0))**(tmp3)*base**(powx)+
     &     tmp1*(theta)**(tmp2)*
     &     ((theta+1.d0)/2.d0)**(-2.d0/(dim+2.d0))*
     &     (1.d0/(dim*gamma-dim+2.d0))*
     &     ((gamma+theta)/(gamma+1.d0))**(tmp3-1.d0)*base**(powx)+
     &     tmp1*(theta)**(tmp2)*
     &     ((theta+1.d0)/2.d0)**(-2.d0/(dim+2.d0))*
     &     ((gamma+theta)/(gamma+1.d0))**(tmp3)*
     &     dim*(2.d0-gamma)/(3.d0*dim-dim*gamma+2.d0*gamma-2.d0)*
     &     powx*base**(powx-1.d0)
         xwzlasttheta=theta
         xwzlastx=x
         theta=xwzlasttheta+(dist-xwzlastx)/dxdtheta
         if(theta.le.0.d0)then
            theta=xwzlasttheta/2.d0
         elseif(theta.ge.1.d0)then
            theta=1.1d0*xwzlasttheta
            if(theta.ge.1.d0)then
               theta=0.99
            endif
         endif
      end do
 10   if(iblast.eq.1)then
         rho=(gamma+1.d0)/(gamma-1.d0)*rhoamb*
     &       theta**((dim)/(dim+2.d0*gamma-2.d0))*
     &       ((gamma+theta)/(gamma+1.d0))**((-2.d0*(dim-1.d0))/
     &         (dim*gamma-dim+2.d0))*
     &       (base)**(powr)
         u=4.d0*C1/(2.d0+dim)/(gamma+1.d0)*
     &     time**(-1.d0*dim/(dim+2.d0))*
     &     theta**((gamma-1.d0)/(dim+2.d0*gamma-2.d0))*
     &     ((theta+1.d0)/2.d0)**(dim/(dim+2.d0))*
     &     ((gamma+theta)/(gamma+1.d0))**
     &       (-1.d0*(dim-1.d0)*(gamma-1.d0)/(dim*gamma-dim+2.d0))*
     &     base**(powu)
         p=8.d0/(dim+2.d0)**2.d0/(gamma+1.d0)*rhoamb*C1*C1*
     &     time**(-2.d0*dim/(dim+2.d0))*
     &     ((theta+1.d0)/2.d0)**(2.d0*dim/(dim+2.d0))*
     &     ((gamma+theta)/(gamma+1.d0))**
     &        (-2.d0*(dim-1.d0)*gamma/(dim*gamma-gamma+2.d0))*
     &     base**powp
      endif
      return
      end