muscl_reconstruct_prim Subroutine

private pure subroutine muscl_reconstruct_prim(u, typelim, uL, uR)

Uses

  • proc~~muscl_reconstruct_prim~4~~UsesGraph proc~muscl_reconstruct_prim~4 muscl_reconstruct_prim module~mod_limiter mod_limiter proc~muscl_reconstruct_prim~4->module~mod_limiter

MUSCL reconstruction in primitive variables for two faces using a 5-point stencil. Returns uL(:,iface), uR(:,iface) for iface=1 (between cells 2-3) and iface=2 (between 3-4).

Arguments

Type IntentOptional Attributes Name
real(kind=dp), intent(in) :: u(nw_phys,5)
integer, intent(in) :: typelim
real(kind=dp), intent(out) :: uL(nw_phys,2)
real(kind=dp), intent(out) :: uR(nw_phys,2)

Calls

proc~~muscl_reconstruct_prim~4~~CallsGraph proc~muscl_reconstruct_prim~4 muscl_reconstruct_prim proc~fix_prim_state~4 fix_prim_state proc~muscl_reconstruct_prim~4->proc~fix_prim_state~4 proc~koren~4 koren proc~muscl_reconstruct_prim~4->proc~koren~4 proc~mcbeta~4 mcbeta proc~muscl_reconstruct_prim~4->proc~mcbeta~4 proc~minmod~4 minmod proc~muscl_reconstruct_prim~4->proc~minmod~4 proc~vanleer~4 vanleer proc~muscl_reconstruct_prim~4->proc~vanleer~4

Called by

proc~~muscl_reconstruct_prim~4~~CalledByGraph proc~muscl_reconstruct_prim~4 muscl_reconstruct_prim proc~reconflux_muscl_hll_prim~4 reconflux_muscl_hll_prim proc~reconflux_muscl_hll_prim~4->proc~muscl_reconstruct_prim~4 proc~reconflux_muscl_hllc_prim~4 reconflux_muscl_hllc_prim proc~reconflux_muscl_hllc_prim~4->proc~muscl_reconstruct_prim~4 proc~reconflux_muscl_llf_prim~4 reconflux_muscl_llf_prim proc~reconflux_muscl_llf_prim~4->proc~muscl_reconstruct_prim~4 proc~finite_volume_local_muscl_hllc~4 finite_volume_local_muscl_hllc proc~finite_volume_local_muscl_hllc~4->proc~reconflux_muscl_hllc_prim~4 proc~finite_volume_local_muscl_hll~4 finite_volume_local_muscl_hll proc~finite_volume_local_muscl_hll~4->proc~reconflux_muscl_hll_prim~4 proc~finite_volume_local_muscl_llf~4 finite_volume_local_muscl_llf proc~finite_volume_local_muscl_llf~4->proc~reconflux_muscl_llf_prim~4 proc~finite_volume_local~4 finite_volume_local proc~finite_volume_local~4->proc~finite_volume_local_muscl_hllc~4 proc~finite_volume_local~4->proc~finite_volume_local_muscl_hll~4 proc~finite_volume_local~4->proc~finite_volume_local_muscl_llf~4

Source Code

  pure subroutine muscl_reconstruct_prim(u, typelim, uL, uR)
    use mod_limiter, only: limiter_minmod, limiter_vanleer, limiter_mcbeta, limiter_koren
    
    real(dp), intent(in)  :: u(nw_phys,5)
    integer,  intent(in)  :: typelim
    real(dp), intent(out) :: uL(nw_phys,2), uR(nw_phys,2)

    real(dp) :: sig(nw_phys,3)   ! slopes at cells 2,3,4
    integer  :: iw

    select case (typelim)
    case (limiter_minmod)
      do iw=1,nw_phys
        sig(iw,1) = minmod (u(iw,2)-u(iw,1), u(iw,3)-u(iw,2))  ! cell 2
        sig(iw,2) = minmod (u(iw,3)-u(iw,2), u(iw,4)-u(iw,3))  ! cell 3
        sig(iw,3) = minmod (u(iw,4)-u(iw,3), u(iw,5)-u(iw,4))  ! cell 4
      end do
    case (limiter_vanleer)
      do iw=1,nw_phys
        sig(iw,1) = vanleer(u(iw,2)-u(iw,1), u(iw,3)-u(iw,2))
        sig(iw,2) = vanleer(u(iw,3)-u(iw,2), u(iw,4)-u(iw,3))
        sig(iw,3) = vanleer(u(iw,4)-u(iw,3), u(iw,5)-u(iw,4))
     end do
    case (limiter_mcbeta)
      do iw=1,nw_phys
        sig(iw,1) = mcbeta(u(iw,2)-u(iw,1), u(iw,3)-u(iw,2))
        sig(iw,2) = mcbeta(u(iw,3)-u(iw,2), u(iw,4)-u(iw,3))
        sig(iw,3) = mcbeta(u(iw,4)-u(iw,3), u(iw,5)-u(iw,4))
      end do
     case (limiter_koren)
      do iw=1,nw_phys
        sig(iw,1) = koren(u(iw,2)-u(iw,1), u(iw,3)-u(iw,2))
        sig(iw,2) = koren(u(iw,3)-u(iw,2), u(iw,4)-u(iw,3))
        sig(iw,3) = koren(u(iw,4)-u(iw,3), u(iw,5)-u(iw,4))
     end do
    case default  ! Fallback: Godunov (piecewise constant)
      do iw=1,nw_phys
        sig(iw,1)=0._dp
        sig(iw,2)=0._dp
        sig(iw,3)=0._dp
      end do
    end select

    ! Face 1: between cells 2 and 3
    uL(:,1) = u(:,2) + 0.5_dp*sig(:,1)
    uR(:,1) = u(:,3) - 0.5_dp*sig(:,2)

    ! Face 2: between cells 3 and 4
    uL(:,2) = u(:,3) + 0.5_dp*sig(:,2)
    uR(:,2) = u(:,4) - 0.5_dp*sig(:,3)

    ! The slopes above were limited slot by slot, so a state can come out
    ! inadmissible or -- where the physics carries auxiliary variables --
    ! internally inconsistent. Repair it here, once, rather than in each of the
    ! three Riemann solvers: this is the single producer of face states.
    call fix_prim_state(uL(:,1))
    call fix_prim_state(uR(:,1))
    call fix_prim_state(uL(:,2))
    call fix_prim_state(uR(:,2))
  end subroutine muscl_reconstruct_prim