elemental subroutine jacobian_roT(ro, T, cv, dPdT, dTdP, dTdRo, dRdRo, dRdT, r, p, d2TdP_dT, d2TdP_dRo)
real(dp), intent(in) :: ro, T
real(dp), intent(out) :: cv, dPdT
real(dp), intent(out), optional :: dTdP, dTdRo, dRdRo, dRdT, r, p
real(dp), intent(out), optional :: d2TdP_dT, d2TdP_dRo
type(ThArrays_t) :: ThAr
real(dp) :: ro_Arp, dPdRo_Arp, dPdT_Arp, cv_Arp, p_Arp, r_Arp, dRdRo_Arp, dRdT_Arp
real(dp) :: d2PdT2_Arp, d2PdRodT_Arp
integer :: n
ro_Arp = ro/(MolMass*1000.0_dp)
call eos_terms(ro_Arp, T, ThAr)
dPdRo_Arp = R_cte_gaz_Arp*T
dPdT_Arp = ro_Arp*R_cte_gaz_Arp
cv_Arp = cp0_Arp - R_cte_gaz_Arp
p_Arp = ro_Arp*R_cte_gaz_Arp*T
r_Arp = (cp0_Arp*T + q0_Arp)*ro_Arp
dRdRo_Arp = cp0_Arp*T + q0_Arp
dRdT_Arp = cp0_Arp*ro_Arp
d2PdT2_Arp = 0.0_dp
d2PdRodT_Arp = R_cte_gaz_Arp
do n = 1, 14
dPdRo_Arp = dPdRo_Arp + ThAr%Derf(n) *ThAr%g(n)
dPdT_Arp = dPdT_Arp + ThAr%f(n) *ThAr%Derg(n)
cv_Arp = cv_Arp + ThAr%Dergg(n)*ThAr%hh(n) / ro_Arp
p_Arp = p_Arp + ThAr%f(n) *ThAr%g(n)
r_Arp = r_Arp + ThAr%gg(n) *ThAr%hh(n) + ThAr%f(n) *ThAr%g(n)
dRdRo_Arp = dRdRo_Arp + ThAr%gg(n) *ThAr%Derhh(n) + ThAr%Derf(n)*ThAr%g(n)
dRdT_Arp = dRdT_Arp + ThAr%Dergg(n)*ThAr%hh(n) + ThAr%f(n) *ThAr%Derg(n)
d2PdT2_Arp = d2PdT2_Arp + ThAr%f(n) *ThAr%Der2g(n)
d2PdRodT_Arp = d2PdRodT_Arp + ThAr%Derf(n) *ThAr%Derg(n)
enddo
dPdT = dPdT_Arp * 1.0e6_dp
cv = cv_Arp * 1.0e3_dp/MolMass
if (present(dTdP)) dTdP = 1.0_dp/dPdT
if (present(dTdRo)) dTdRo = -(dPdRo_Arp * 1000.0_dp/MolMass)/dPdT
if (present(dRdRo)) dRdRo = dRdRo_Arp * 1.0e6_dp/(MolMass*1000.0_dp)
if (present(dRdT)) dRdT = dRdT_Arp * 1.0e6_dp
if (present(r)) r = r_Arp * 1.0e6_dp
if (present(p)) p = p_Arp * 1.0e6_dp
if (present(d2TdP_dT)) d2TdP_dT = -(d2PdT2_Arp * 1.0e6_dp) /(dPdT**2)
if (present(d2TdP_dRo)) d2TdP_dRo = -(d2PdRodT_Arp * 1.0e6_dp/(MolMass*1000.0_dp))/(dPdT**2)
end subroutine jacobian_roT