Reconstruct interfaces states.
The reconstruction is done in pseudo characteristic variables.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(euler_1d), | intent(in) | :: | self | Euler field. |
||
| type(conservative_compressible), | intent(in) | :: | conservative(1-self%Ng:) | Conservative variables. |
||
| type(conservative_compressible), | intent(inout) | :: | r_conservative(1:,0:) | Reconstructed conservative vars. |
subroutine reconstruct_interfaces_characteristic(self, conservative, r_conservative)
!< Reconstruct interfaces states.
!<
!< The reconstruction is done in pseudo characteristic variables.
class(euler_1d), intent(in) :: self !< Euler field.
type(conservative_compressible), intent(in) :: conservative(1-self%Ng:) !< Conservative variables.
type(conservative_compressible), intent(inout) :: r_conservative(1:, 0:) !< Reconstructed conservative vars.
type(primitive_compressible) :: primitive(1-self%Ng:self%Ni+self%Ng) !< Primitive variables.
type(primitive_compressible) :: r_primitive(1:2, 0:self%Ni+1) !< Reconstructed primitive variables.
type(primitive_compressible) :: Pm(1:2) !< Mean of primitive variables.
real(R8P) :: LPm(1:3, 1:3, 1:2) !< Mean left eigenvectors matrix.
real(R8P) :: RPm(1:3, 1:3, 1:2) !< Mean right eigenvectors matrix.
real(R8P) :: C(1:2, 1-self%Ng:-1+self%Ng, 1:3) !< Pseudo characteristic variables.
real(R8P) :: CR(1:2, 1:3) !< Pseudo characteristic reconst.
real(R8P) :: buffer(1:3) !< Dummy buffer.
integer(I4P) :: i !< Counter.
integer(I4P) :: j !< Counter.
integer(I4P) :: f !< Counter.
integer(I4P) :: v !< Counter.
class(interpolator_object), allocatable :: interpolator !< WENO interpolator.
select case(self%weno_order)
case(1) ! 1st order piecewise constant reconstruction
do i=0, self%Ni+1
r_conservative(1, i) = conservative(i)
r_conservative(2, i) = r_conservative(1, i)
enddo
case(3, 5, 7, 9, 11, 13, 15, 17) ! 3rd-17th order WENO reconstruction
call wenoof_create(interpolator_type='reconstructor-JS', S=self%Ng, interpolator=interpolator)
do i=1-self%Ng, self%Ni+self%Ng
primitive(i) = conservative_to_primitive_compressible(conservative=conservative(i), eos=self%eos)
enddo
do i=0, self%Ni+1
! compute pseudo charteristic variables
do f=1, 2
Pm(f) = 0.5_R8P * (primitive(i+f-2) + primitive(i+f-1))
enddo
do f=1, 2
LPm(:, :, f) = Pm(f)%left_eigenvectors(eos=self%eos)
RPm(:, :, f) = Pm(f)%right_eigenvectors(eos=self%eos)
enddo
do j=i+1-self%Ng, i-1+self%Ng
do f=1, 2
do v=1, 3
C(f, j-i, v) = dot_product(LPm(v, :, f), [primitive(j)%density, primitive(j)%velocity%x, primitive(j)%pressure])
enddo
enddo
enddo
! compute WENO reconstruction of pseudo charteristic variables
do v=1, 3
call interpolator%interpolate(stencil=C(:, :, v), interpolation=CR(:, v))
enddo
! trasform back reconstructed pseudo charteristic variables to primitive ones
do f=1, 2
do v=1, 3
buffer(v) = dot_product(RPm(v, :, f), CR(f, :))
enddo
r_primitive(f, i)%density = buffer(1)
r_primitive(f, i)%velocity = buffer(2) * ex
r_primitive(f, i)%pressure = buffer(3)
enddo
enddo
do i=0, self%Ni+1
r_conservative(1, i) = primitive_to_conservative_compressible(primitive=r_primitive(1, i), eos=self%eos)
r_conservative(2, i) = primitive_to_conservative_compressible(primitive=r_primitive(2, i), eos=self%eos)
enddo
endselect
endsubroutine reconstruct_interfaces_characteristic