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

254 lines
7.0 KiB
Fortran

SUBROUTINE ALIST1
C =================
C
C Evaluation of all nexcessary ALI parameters + radiative rates
C (the routine is analogous to RATES1)
C
C
INCLUDE 'IMPLIC.FOR'
INCLUDE 'BASICS.FOR'
INCLUDE 'ATOMIC.FOR'
INCLUDE 'MODELQ.FOR'
INCLUDE 'ODFPAR.FOR'
INCLUDE 'ALIPAR.FOR'
INCLUDE 'ITERAT.FOR'
DIMENSION EXX(MDEPTH),RBNU(MDEPTH),RBNUF(MDEPTH)
C DIMENSION EHKL(MFREQL),EHKLF(MFREQL)
C
C zero the rates and other quantities
C
DO ID=1,ND
REIT(ID)=0.
REIN(ID)=0.
REIX(ID)=0.
AREIT(ID)=0.
AREIN(ID)=0.
CREIT(ID)=0.
CREIN(ID)=0.
CREIX(ID)=0.
REDT(ID)=0.
REDTM(ID)=0.
REDTP(ID)=0.
REDN(ID)=0.
REDNM(ID)=0.
REDNP(ID)=0.
REDX(ID)=0.
REDXM(ID)=0.
REDXP(ID)=0.
HEIT(ID)=0.
HEITM(ID)=0.
HEITP(ID)=0.
HEIN(ID)=0.
HEINM(ID)=0.
HEINP(ID)=0.
EHET(ID)=0.
EHEN(ID)=0.
ERET(ID)=0.
EREN(ID)=0.
FCOOLI(ID)=0.
FLFIX(ID)=0.
FLEXP(ID)=0.
FLRD(ID)=0.
FPRD(ID)=0.
PRADT(ID)=0.
PRADA(ID)=0.
DO II=1,NLVEXP
HEIP(II,ID)=0.
REIP(II,ID)=0.
AREIP(II,ID)=0.
CREIP(II,ID)=0.
REDP(II,ID)=0.
REDPM(II,ID)=0.
HEIPM(II,ID)=0.
REDPP(II,ID)=0.
HEIPP(II,ID)=0.
EHEP(II,ID)=0.
EREP(II,ID)=0.
END DO
DO ITR=1,NTRANS
RRU(ITR,ID)=0.
RRD(ITR,ID)=0.
DRDT(ITR,ID)=0.
END DO
END DO
PRD0=0.
C
LROSS=NDRE.LE.0.AND.ITER.EQ.1.OR.LFIN
IF(HMIX0.GT.0.) LROSS=.TRUE.
IF(LROSS) THEN
DO ID=1,ND
ABROSD(ID)=0.
SUMDPL(ID)=0.
END DO
END IF
C
DO 100 IJ=1,NFREQ
IF(IJX(IJ).EQ.-1) GO TO 100
FR=FREQ(IJ)
W0=W0E(IJ)
CALL OPACFD(IJ)
CALL RTEFR1(IJ)
CALL ALIFR1(IJ)
IF(LROSS) CALL ROSSTD(IJ)
if(ioptab.lt.0) go to 100
C
C ---------------------
C Continuum transitions
C ---------------------
C
DO ID=1,ND
EXX(ID)=EXP(-HKT1(ID)*FR)
RBNU(ID)=(RAD1(ID)+BNUE(IJ))*EXX(ID)
RBNUF(ID)=RBNU(ID)*FR*HKT21(ID)
DO 10 IBFT=1,NTRANC
ITR=ITRBF(IBFT)
SG=CROSS(IBFT,IJ)
IF(SG.LE.0.) GO TO 10
II=ILOW(ITR)
JJ=IUP(ITR)
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 10
JC=ITRA(JJ,II)
IF(IFWOP(II).GE.0) THEN
ICDW=MCDW(ITR)
IF(ICDW.GE.1) SG=SG*DWF1(ICDW,ID)
ELSE
IMER=IMRG(II)
SG=SGMG(IMER,ID)
ENDIF
SGW0=SG*W0
RRU(ITR,ID)=RRU(ITR,ID)+SGW0*RAD1(ID)
RRD(ITR,ID)=RRD(ITR,ID)+SGW0*RBNU(ID)
DRDT(ITR,ID)=DRDT(ITR,ID)+SGW0*RBNUF(ID)
10 CONTINUE
END DO
C
C ----------------
C Line transitions
C ----------------
C
IF(ISPODF.EQ.0) THEN
IF(IJLIN(IJ).GT.0) THEN
C
C the "primary" line at the given frequency
C
ITR=IJLIN(IJ)
II=ILOW(ITR)
JJ=IUP(ITR)
DO 50 ID=1,ND
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 50
SGW0=PRFLIN(ID,IJ)*W0
RRU(ITR,ID)=RRU(ITR,ID)+SGW0*RAD1(ID)
RRD(ITR,ID)=RRD(ITR,ID)+SGW0*RBNU(ID)
DRDT(ITR,ID)=DRDT(ITR,ID)+SGW0*RBNUF(ID)
50 CONTINUE
ENDIF
IF(NLINES(IJ).LE.0) GO TO 100
C
C the "overlapping" lines at the given frequency
C
DO 90 ILINT=1,NLINES(IJ)
ITR=ITRLIN(ILINT,IJ)
if(linexp(itr)) goto 90
IJ0=IFR0(ITR)
DO IJT=IJ0,IFR1(ITR)
IF(FREQ(IJT).LE.FR) THEN
IJ0=IJT
GO TO 70
END IF
END DO
70 IJ1=IJ0-1
A1=(FR-FREQ(IJ0))/(FREQ(IJ1)-FREQ(IJ0))*W0
A2=W0-A1
II=ILOW(ITR)
JJ=IUP(ITR)
DO 80 ID=1,ND
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 80
SGW0=A1*PRFLIN(ID,IJ1)+A2*PRFLIN(ID,IJ0)
RRU(ITR,ID)=RRU(ITR,ID)+SGW0*RAD1(ID)
RRD(ITR,ID)=RRD(ITR,ID)+SGW0*RBNU(ID)
DRDT(ITR,ID)=DRDT(ITR,ID)+SGW0*RBNUF(ID)
80 CONTINUE
90 CONTINUE
C
C Opacity sampling option
C
ELSE
IF(NLINES(IJ).LE.0) GO TO 100
DO 95 ILINT=1,NLINES(IJ)
ITR=ITRLIN(ILINT,IJ)
II=ILOW(ITR)
JJ=IUP(ITR)
IE=IABS(IIEXP(II))
JE=IABS(IIEXP(JJ))
KJ=IJ-IFR0(ITR)+KFR0(ITR)
INDXPA=IABS(INDEXP(ITR))
IF(INDXPA.NE.3 .AND. INDXPA.NE.4) THEN
DO 210 ID=1,ND
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 210
SGW0=PRFLIN(ID,KJ)*W0
RRU(ITR,ID)=RRU(ITR,ID)+SGW0*RAD1(ID)
RRD(ITR,ID)=RRD(ITR,ID)+SGW0*RBNU(ID)
DRDT(ITR,ID)=DRDT(ITR,ID)+SGW0*RBNUF(ID)
210 CONTINUE
ELSE
DO 220 ID=1,ND
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 220
KJD=JIDI(ID)
SG=EXP(XJID(ID)*SIGFE(KJD,KJ)+
* (UN-XJID(ID))*SIGFE(KJD+1,KJ))
SGW0=SG*W0
RRU(ITR,ID)=RRU(ITR,ID)+SGW0*RAD1(ID)
RRD(ITR,ID)=RRD(ITR,ID)+SGW0*RBNU(ID)
DRDT(ITR,ID)=DRDT(ITR,ID)+SGW0*RBNUF(ID)
220 CONTINUE
END IF
95 CONTINUE
END IF
100 CONTINUE
C
C multiply some quantities by frequency-independent constants
C
DO ID=1,ND
REDX(ID)=REDX(ID)*WMM(ID)*DENS1(ID)*DENS1(ID)
IF(ID.GT.1) REDXM(ID)=REDXM(ID)*WMM(ID)*
* DENS1(ID-1)*DENS1(ID-1)
FCOOL(ID)=REINT(ID)*FCOOLI(ID)-REDIF(ID)*FLFIX(ID)
IF(CRSW(ID).NE.UN) THEN
DO ITR=1,NTRANS
RRU(ITR,ID)=RRU(ITR,ID)*CRSW(ID)
RRD(ITR,ID)=RRD(ITR,ID)*CRSW(ID)
DRDT(ITR,ID)=DRDT(ITR,ID)*CRSW(ID)
END DO
END IF
END DO
C
C radiation pressure
C
PRDX=1.
DO ID=1,ND
PRADT(ID)=PRADT(ID)*PCK
PRADA(ID)=PRADA(ID)*PCK
if(prada(id).gt.0.) PRDR=PRADT(ID)/PRADA(ID)
IF(PRDR.LT.PRDX) PRDX=PRDR
END DO
PRD0=PRD0/DENS1(1)*DM(1)*PCK
IF(LFIN) WRITE(10,1100) PRDX,ITER
1100 FORMAT(' PRAD MIN RATIO ',F10.6,I4)
C
C Rosseland mean opacity
C
IF(LROSS) THEN
DO ID=1,ND
ABROSD(ID)=SUMDPL(ID)/(ABROSD(ID)*DENS(ID))
END DO
if(ioptab.lt.0.and.ifryb.gt.0) then
do id=1,nd
abrosd(id)=abrosd(id)*dens(id)
end do
end if
call rosstd(0)
END IF
c
RETURN
END