SpectraRust/tlusty/extracted/trmdrt.f
2026-03-19 14:05:33 +08:00

66 lines
1.9 KiB
Fortran

SUBROUTINE TRMDRT(ID,T,P,HEATCP,DLRDLT,GRDADB,RHO)
C ==================================================
C
C Thermodynamic derivatives - based on statew equation and entropy
C tables
C
C Input: T - temperature
C P - gas pressure
C
C Output: HEATCP - specific heat at constant pressure
C DLRDLT - d(ln rho)/d(ln T)
C GRDADB - adiabatic gradient d(ln T)/d(ln P)_ad
C etdrt
C
INCLUDE 'IMPLIC.FOR'
INCLUDE 'BASICS.FOR'
COMMON/CC/DPDR,DPDT,DSDT,DSDR,CV,S,GAMMA
COMMON/CONVOUT/CFLX(MDEPTH),VELCON(MDEPTH),GRADAD(MDEPTH),
& ENT(MDEPTH)
C
parameter (RCON=8.31434E7)
parameter(wmol0=1.67333E-24/2.3)
common/tdedge/redge,pedge(100),sedge(100),cvedge(100),
& cpedge(100),gammaedge(100),tedge(100)
common/tdflag/JON
C
C numerical evaluation of thermodynamic derivatives
C
rho=rhoeos(t,p)
drho=0.01*rho
dt=0.01*t
call prsent(rho,t,p0,s0)
call prsent(rho+drho,t,p1,s1)
call prsent(rho-drho,t,p2,s2)
call prsent(rho,t+dt,p3,s3)
call prsent(rho,t-dt,p4,s4)
dpdr=(p1-p2)/(2.*drho)
dpdt=(p3-p4)/(2.*dt)
dsdr=(s1-s2)/(2.*drho)*rcon
dsdt=(s3-s4)/(2.*dt)*rcon
DEN=DPDR*DSDT-DPDT*DSDR
c
if(jon .eq. 0) then
HEATCV=T*DSDT
HEATCP=T*DEN/DPDR
DQ=DSDT*P/(DEN*RHO)
GAMMA=1.d0/DQ
DLRDLT = -RHO*DPDR/(T*DPDT)
DLRDLT = 1.D0/DLRDLT
GRDADB = -P/(HEATCP*RHO*T)*DLRDLT
TDPT=T*DPDT
else if(jon .ne. 0) then
HEATCV = cvedge(JON)
HEATCP = cpedge(JON)
DLRDLT = -1.d0
GRDADB = -P/(HEATCP*RHO*T)*DLRDLT ! 0.4d0
GAMMA = gammaedge(JON)
endif
C
grdadb=p/t*(dsdr/(dsdr*dpdt-dsdt*dpdr))
GRADAD(ID) = GRDADB
ENT(ID) = S0
C
RETURN
END