Return the right eigenvectors matrix R as dF/dP = A = R ^ L.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(primitive_compressible), | intent(in) | :: | self | Primitive. |
||
| class(eos_object), | intent(in) | :: | eos | Equation of state. |
Eigenvectors.
pure function right_eigenvectors(self, eos) result(eig)
!< Return the right eigenvectors matrix `R` as `dF/dP = A = R ^ L`.
class(primitive_compressible), intent(in) :: self !< Primitive.
class(eos_object), intent(in) :: eos !< Equation of state.
real(R8P) :: eig(1:3, 1:3) !< Eigenvectors.
real(R8P) :: gp !< `g*p`.
real(R8P) :: gp_inv !< `1/(g*p)`.
real(R8P) :: a !< Speed of sound, `sqrt(g*p/r)`.
gp = eos%g() * self%pressure
gp_inv = 1._R8P / gp
a = eos%speed_of_sound(density=self%density, pressure=self%pressure)
eig(1, 1) = 0.5_R8P * self%density * gp_inv ; eig(1, 2) = self%density * gp_inv ; eig(1, 3) = eig(1, 1)
eig(2, 1) = -0.5_R8P * a * gp_inv ; eig(2, 2) = 0._R8P ; eig(2, 3) = -eig(2, 1)
eig(3, 1) = 0.5_R8P ; eig(3, 2) = 0._R8P ; eig(3, 3) = eig(3, 1)
endfunction right_eigenvectors