ghost_gradient.f90 Source File

Set value gradients in the ghost cells


This file depends on

sourcefile~~ghost_gradient.f90~~EfferentGraph sourcefile~ghost_gradient.f90 ghost_gradient.f90 sourcefile~utils.f90 utils.f90 sourcefile~ghost_gradient.f90->sourcefile~utils.f90 sourcefile~global_vars.f90 global_vars.f90 sourcefile~ghost_gradient.f90->sourcefile~global_vars.f90 sourcefile~utils.f90->sourcefile~global_vars.f90 sourcefile~global.f90 global.f90 sourcefile~global_vars.f90->sourcefile~global.f90

Files dependent on this one

sourcefile~~ghost_gradient.f90~~AfferentGraph sourcefile~ghost_gradient.f90 ghost_gradient.f90 sourcefile~summon_grad_evaluation.f90 summon_grad_evaluation.f90 sourcefile~summon_grad_evaluation.f90->sourcefile~ghost_gradient.f90 sourcefile~solver.f90 solver.f90 sourcefile~solver.f90->sourcefile~summon_grad_evaluation.f90 sourcefile~update.f90 update.f90 sourcefile~solver.f90->sourcefile~update.f90 sourcefile~update.f90->sourcefile~summon_grad_evaluation.f90 sourcefile~main.f90 main.f90 sourcefile~main.f90->sourcefile~solver.f90 sourcefile~start_finish.f90 start_finish.f90 sourcefile~main.f90->sourcefile~start_finish.f90 sourcefile~start_finish.f90->sourcefile~solver.f90

Contents

Source Code


Source Code

  !< Set value gradients in the ghost cells
module ghost_gradients
  !< Set value gradients in the ghost cells
  ! ---------------------------------------------------------
  !   # 170508 - Jatinder Pal Singh Sandhu
  !---------------------------------------------------------
  
  ! geometry
  use global_vars, only : imx, jmx, kmx
  use global_vars, only : xnx, xny, xnz
  use global_vars, only : ynx, yny, ynz
  use global_vars, only : znx, zny, znz
  use global_vars, only : xA, yA, zA
  use global_vars, only : volume

  ! state variable
  use global_vars, only : density
  use global_vars, only : pressure
  use global_vars, only : R_gas
  use global_vars, only : n_grad
  use global_vars, only : n_var

  ! state and gradients
  use global_vars, only : qp
  use global_vars, only : gradqp_x
  use global_vars, only : gradqp_y
  use global_vars, only : gradqp_z

  ! layout boundary condition id for face
  use global_vars, only : imin_id
  use global_vars, only : imax_id
  use global_vars, only : jmin_id
  use global_vars, only : jmax_id
  use global_vars, only : kmin_id
  use global_vars, only : kmax_id
  use global_vars, only : fixed_wall_temperature

  use utils,       only : dmsg
  
  implicit none

  public :: apply_gradient_bc

  contains

    subroutine apply_gradient_bc()
      !< Call same subroutine for all the face
      implicit none

      call dmsg(1,'ghost_gradients', 'apply_gradient_bc')
      if(imin_id<0)then
        call apply('imin')
      end if
      if(imax_id<0)then
        call apply('imax')
      end if
      if(jmin_id<0)then
        call apply('jmin')
      end if
      if(jmax_id<0)then
        call apply('jmax')
      end if
      if(kmin_id<0)then
        call apply('kmin')
      end if
      if(kmax_id<0)then
        call apply('kmax')
      end if
      
    end subroutine apply_gradient_bc
    



    subroutine apply(face)
      !< Apply/set value of all gradient in the ghost cells
      !< gradqp_G = (qp_I - qp_G)*Area_W*unit_normal_G/(volume_G)
      !< volume_G = volume_I
      !-----------------------------------------------------------
      implicit none
      character(len=*) :: face
      real, dimension(n_grad) :: qp_I
      real, dimension(n_grad) :: qp_G
      real    :: T_I
      real    :: T_G 
      real    :: c_x
      real    :: c_y
      real    :: c_z
      integer :: n
      integer :: i,j,k,l
      real    :: nx
      real    :: ny
      real    :: nz
      real    :: dot

      !-----------------------------------------------------------
      ! gradqp_G = (qp_I - qp_G)*Area_W*unit_normal_G/(volume_G)
      ! volume_G = volume_I
      !-----------------------------------------------------------

      n = n_grad
      select case (face)
        
        case('imin')

          do k = 1,kmx-1
            do j = 1,jmx-1
              do i = 1,1
                nx   = xnx(i,j,k)
                ny   = xny(i,j,k)
                nz   = xnz(i,j,k)
                c_x  = xA(i,j,k)*nx/volume(i,j,k)
                c_y  = xA(i,j,k)*ny/volume(i,j,k)
                c_z  = xA(i,j,k)*nz/volume(i,j,k)
                T_I  = pressure(i  ,j,k)/(R_gas*density(i  ,j,k))
                T_G  = pressure(i-1,j,k)/(R_gas*density(i-1,j,k))
                qp_I = qp(i  ,j,k,2:n_var)
                qp_G = qp(i-1,j,k,2:n_var)

                ! normal component of gradient
                gradqp_x(i-1,j,k,:) = (qp_I - qp_G)*c_x 
                gradqp_y(i-1,j,k,:) = (qp_I - qp_G)*c_y
                gradqp_z(i-1,j,k,:) = (qp_I - qp_G)*c_z
                gradqp_x(i-1,j,k,4) = ( T_I -  T_G)*c_x
                gradqp_y(i-1,j,k,4) = ( T_I -  T_G)*c_y
                gradqp_z(i-1,j,k,4) = ( T_I -  T_G)*c_z
                if(imin_id==-5 .and. (fixed_wall_temperature(1)<1. .and. fixed_wall_temperature(1)>=0.))then
                  gradqp_x(i-1,j,k,4) = -gradqp_x(i,j,k,4)
                  gradqp_y(i-1,j,k,4) = -gradqp_y(i,j,k,4)
                  gradqp_z(i-1,j,k,4) = -gradqp_z(i,j,k,4)

                end if
                !parallel component of gradient
                do l=1,n
                  dot = (gradqp_x(i,j,k,l)*nx) + (gradqp_y(i,j,k,l)*ny) + (gradqp_z(i,j,k,l)*nz)
                  gradqp_x(i-1,j,k,l) = gradqp_x(i-1,j,k,l) + (gradqp_x(i,j,k,l) - dot*nx)
                  gradqp_y(i-1,j,k,l) = gradqp_y(i-1,j,k,l) + (gradqp_y(i,j,k,l) - dot*ny)
                  gradqp_z(i-1,j,k,l) = gradqp_z(i-1,j,k,l) + (gradqp_z(i,j,k,l) - dot*nz)
                end do
              end do
            end do
          end do

        case('imax')
          do k = 1,kmx-1
            do j = 1,jmx-1
              do i = imx,imx
                nx   = xnx(i,j,k)
                ny   = xny(i,j,k)
                nz   = xnz(i,j,k)
                c_x  = xA(i,j,k)*nx/volume(i-1,j,k)
                c_y  = xA(i,j,k)*ny/volume(i-1,j,k)
                c_z  = xA(i,j,k)*nz/volume(i-1,j,k)
                T_I  = pressure(i-1,j,k)/(R_gas*density(i-1,j,k))
                T_G  = pressure(i  ,j,k)/(R_gas*density(i  ,j,k))
                qp_I = qp(i-1,j,k,2:n_var)
                qp_G = qp(i  ,j,k,2:n_var)

                ! normal component of gradient
                gradqp_x(i,j,k,:) = -(qp_I - qp_G)*c_x 
                gradqp_y(i,j,k,:) = -(qp_I - qp_G)*c_y
                gradqp_z(i,j,k,:) = -(qp_I - qp_G)*c_z
                gradqp_x(i,j,k,4) = -( T_I -  T_G)*c_x
                gradqp_y(i,j,k,4) = -( T_I -  T_G)*c_y
                gradqp_z(i,j,k,4) = -( T_I -  T_G)*c_z
                if(imax_id==-5 .and. (fixed_wall_temperature(2)<1. .and. fixed_wall_temperature(2)>=0.))then
                gradqp_x(i,j,k,4) = -gradqp_x(i-1,j,k,4)
                gradqp_y(i,j,k,4) = -gradqp_y(i-1,j,k,4)
                gradqp_z(i,j,k,4) = -gradqp_z(i-1,j,k,4)
                end if
                !parallel component of gradient
                do l=1,n
                  dot = (gradqp_x(i-1,j,k,l)*nx) + (gradqp_y(i-1,j,k,l)*ny) + (gradqp_z(i-1,j,k,l)*nz)
                  gradqp_x(i,j,k,l) = gradqp_x(i,j,k,l) + (gradqp_x(i-1,j,k,l) - dot*nx)
                  gradqp_y(i,j,k,l) = gradqp_y(i,j,k,l) + (gradqp_y(i-1,j,k,l) - dot*ny)
                  gradqp_z(i,j,k,l) = gradqp_z(i,j,k,l) + (gradqp_z(i-1,j,k,l) - dot*nz)
                end do
              end do
            end do
          end do


        case('jmin')
          do k = 1,kmx-1
            do j = 1,1
              do i = 1,imx-1
                nx   = ynx(i,j,k)
                ny   = yny(i,j,k)
                nz   = ynz(i,j,k)
                c_x  = yA(i,j,k)*nx/volume(i,j,k)
                c_y  = yA(i,j,k)*ny/volume(i,j,k)
                c_z  = yA(i,j,k)*nz/volume(i,j,k)
                T_I  = pressure(i,j  ,k)/(R_gas*density(i,j  ,k))
                T_G  = pressure(i,j-1,k)/(R_gas*density(i,j-1,k))
                qp_I = qp(i,j  ,k,2:n_var)
                qp_G = qp(i,j-1,k,2:n_var)

                ! normal component of gradient
                gradqp_x(i,j-1,k,:) = (qp_I - qp_G)*c_x 
                gradqp_y(i,j-1,k,:) = (qp_I - qp_G)*c_y
                gradqp_z(i,j-1,k,:) = (qp_I - qp_G)*c_z
                gradqp_x(i,j-1,k,4) = ( T_I -  T_G)*c_x
                gradqp_y(i,j-1,k,4) = ( T_I -  T_G)*c_y
                gradqp_z(i,j-1,k,4) = ( T_I -  T_G)*c_z
                if(jmin_id==-5 .and. (fixed_wall_temperature(3)<1. .and. fixed_wall_temperature(3)>=0.))then
                gradqp_x(i,j-1,k,4) = -gradqp_x(i,j,k,4)
                gradqp_y(i,j-1,k,4) = -gradqp_y(i,j,k,4)
                gradqp_z(i,j-1,k,4) = -gradqp_z(i,j,k,4)
                end if
                !parallel component of gradient
                do l=1,n
                  dot = (gradqp_x(i,j,k,l)*nx) + (gradqp_y(i,j,k,l)*ny) + (gradqp_z(i,j,k,l)*nz)
                  gradqp_x(i,j-1,k,l) = gradqp_x(i,j-1,k,l) + (gradqp_x(i,j,k,l) - dot*nx)
                  gradqp_y(i,j-1,k,l) = gradqp_y(i,j-1,k,l) + (gradqp_y(i,j,k,l) - dot*ny)
                  gradqp_z(i,j-1,k,l) = gradqp_z(i,j-1,k,l) + (gradqp_z(i,j,k,l) - dot*nz)
                end do
              end do
            end do
          end do

        case('jmax')
          do k = 1,kmx-1
            do j = jmx,jmx
              do i = 1,imx-1
                nx   = ynx(i,j,k)
                ny   = yny(i,j,k)
                nz   = ynz(i,j,k)
                c_x  = yA(i,j,k)*nx/volume(i,j,k)
                c_y  = yA(i,j,k)*ny/volume(i,j,k)
                c_z  = yA(i,j,k)*nz/volume(i,j,k)
                T_I  = pressure(i,j-1,k)/(R_gas*density(i,j-1,k))
                T_G  = pressure(i,j  ,k)/(R_gas*density(i,j  ,k))
                qp_I = qp(i,j-1,k,2:n_var)
                qp_G = qp(i,j  ,k,2:n_var)

                ! normal component of gradient
                gradqp_x(i,j,k,:) = -(qp_I - qp_G)*c_x 
                gradqp_y(i,j,k,:) = -(qp_I - qp_G)*c_y
                gradqp_z(i,j,k,:) = -(qp_I - qp_G)*c_z
                gradqp_x(i,j,k,4) = -( T_I -  T_G)*c_x
                gradqp_y(i,j,k,4) = -( T_I -  T_G)*c_y
                gradqp_z(i,j,k,4) = -( T_I -  T_G)*c_z
                if(jmax_id==-5 .and. (fixed_wall_temperature(4)<1. .and. fixed_wall_temperature(4)>=0.))then
                gradqp_x(i,j,k,4) = -gradqp_x(i,j-1,k,4)
                gradqp_y(i,j,k,4) = -gradqp_y(i,j-1,k,4)
                gradqp_z(i,j,k,4) = -gradqp_z(i,j-1,k,4)
                end if
                !parallel component of gradient
                do l=1,n
                  dot = (gradqp_x(i,j-1,k,l)*nx) + (gradqp_y(i,j-1,k,l)*ny) + (gradqp_z(i,j-1,k,l)*nz)
                  gradqp_x(i,j,k,l) = gradqp_x(i,j,k,l) + (gradqp_x(i,j-1,k,l) - dot*nx)
                  gradqp_y(i,j,k,l) = gradqp_y(i,j,k,l) + (gradqp_y(i,j-1,k,l) - dot*ny)
                  gradqp_z(i,j,k,l) = gradqp_z(i,j,k,l) + (gradqp_z(i,j-1,k,l) - dot*nz)
                end do
              end do
            end do
          end do


        case('kmin')
          do k = 1,1
            do j = 1,jmx-1
              do i = 1,imx-1
                nx   = znx(i,j,k)
                ny   = zny(i,j,k)
                nz   = znz(i,j,k)
                c_x  = zA(i,j,k)*nx/volume(i,j,k)
                c_y  = zA(i,j,k)*ny/volume(i,j,k)
                c_z  = zA(i,j,k)*nz/volume(i,j,k)
                T_I  = pressure(i,j,k  )/(R_gas*density(i,j,k  ))
                T_G  = pressure(i,j,k-1)/(R_gas*density(i,j,k-1))
                qp_I = qp(i,j,k  ,2:n_var)
                qp_G = qp(i,j,k-1,2:n_var)

                ! normal component of gradient
                gradqp_x(i,j,k-1,:) = (qp_I - qp_G)*c_x 
                gradqp_y(i,j,k-1,:) = (qp_I - qp_G)*c_y
                gradqp_z(i,j,k-1,:) = (qp_I - qp_G)*c_z
                gradqp_x(i,j,k-1,4) = ( T_I -  T_G)*c_x
                gradqp_y(i,j,k-1,4) = ( T_I -  T_G)*c_y
                gradqp_z(i,j,k-1,4) = ( T_I -  T_G)*c_z
                if(kmin_id==-5 .and. (fixed_wall_temperature(5)<1. .and. fixed_wall_temperature(5)>=0.))then
                gradqp_x(i,j,k-1,4) = -gradqp_x(i,j,k,4)
                gradqp_y(i,j,k-1,4) = -gradqp_y(i,j,k,4)
                gradqp_z(i,j,k-1,4) = -gradqp_z(i,j,k,4)
                end if
                !parallel component of gradient
                do l=1,n
                  dot = (gradqp_x(i,j,k,l)*nx) + (gradqp_y(i,j,k,l)*ny) + (gradqp_z(i,j,k,l)*nz)
                  gradqp_x(i,j,k-1,l) = gradqp_x(i,j,k-1,l) + (gradqp_x(i,j,k,l) - dot*nx)
                  gradqp_y(i,j,k-1,l) = gradqp_y(i,j,k-1,l) + (gradqp_y(i,j,k,l) - dot*ny)
                  gradqp_z(i,j,k-1,l) = gradqp_z(i,j,k-1,l) + (gradqp_z(i,j,k,l) - dot*nz)
                end do
              end do
            end do
          end do

        case('kmax')
          do k = kmx,kmx
            do j = 1,jmx-1
              do i = 1,imx-1
                nx   = znx(i,j,k)
                ny   = zny(i,j,k)
                nz   = znz(i,j,k)
                c_x  = zA(i,j,k)*nx/volume(i,j,k)
                c_y  = zA(i,j,k)*ny/volume(i,j,k)
                c_z  = zA(i,j,k)*nz/volume(i,j,k)
                T_I  = pressure(i,j,k-1)/(R_gas*density(i,j,k-1))
                T_G  = pressure(i,j,k  )/(R_gas*density(i,j,k  ))
                qp_I = qp(i,j,k-1,2:n_var)
                qp_G = qp(i,j,k  ,2:n_var)

                ! normal component of gradient
                gradqp_x(i,j,k,:) = -(qp_I - qp_G)*c_x 
                gradqp_y(i,j,k,:) = -(qp_I - qp_G)*c_y
                gradqp_z(i,j,k,:) = -(qp_I - qp_G)*c_z
                gradqp_x(i,j,k,4) = -( T_I -  T_G)*c_x
                gradqp_y(i,j,k,4) = -( T_I -  T_G)*c_y
                gradqp_z(i,j,k,4) = -( T_I -  T_G)*c_z
                if(kmax_id==-5 .and. (fixed_wall_temperature(6)<1. .and. fixed_wall_temperature(6)>=0.))then
                gradqp_x(i,j,k,4) = -gradqp_x(i,j,k-1,4)
                gradqp_y(i,j,k,4) = -gradqp_y(i,j,k-1,4)
                gradqp_z(i,j,k,4) = -gradqp_z(i,j,k-1,4)
                end if
                !parallel component of gradient
                do l=1,n
                  dot = (gradqp_x(i,j,k-1,l)*nx) + (gradqp_y(i,j,k-1,l)*ny) + (gradqp_z(i,j,k-1,l)*nz)
                  gradqp_x(i,j,k,l) = gradqp_x(i,j,k,l) + (gradqp_x(i,j,k-1,l) - dot*nx)
                  gradqp_y(i,j,k,l) = gradqp_y(i,j,k,l) + (gradqp_y(i,j,k-1,l) - dot*ny)
                  gradqp_z(i,j,k,l) = gradqp_z(i,j,k,l) + (gradqp_z(i,j,k-1,l) - dot*nz)
                end do
              end do
            end do
          end do

        case DEFAULT
          print*, "Ghost gradients : Wrong face name string"

      end select
          
    end subroutine apply


 
end module ghost_gradients