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

163 lines
4.2 KiB
Fortran

SUBROUTINE ALISK1
C =================
C
C Simplified routine ALIST1 for Kantorovich iteration
C
C Evaluation of all nexcessary ALI parameters + radiative rates
C
INCLUDE 'IMPLIC.FOR'
INCLUDE 'BASICS.FOR'
INCLUDE 'ATOMIC.FOR'
INCLUDE 'MODELQ.FOR'
INCLUDE 'ODFPAR.FOR'
INCLUDE 'ALIPAR.FOR'
INCLUDE 'ARRAY1.FOR'
INCLUDE 'ITERAT.FOR'
DIMENSION RBNU(MDEPTH)
C DIMENSION EHKL(MFREQL)
C
C zero the rates and other quantities (subr. NULL)
C
DO ID=1,ND
FCOOLI(ID)=0.
FLFIX(ID)=0.
FPRD(ID)=0.
FLRD(ID)=0.
PRADT(ID)=0.
PRADA(ID)=0.
DO ITR=1,NTRANS
RRU(ITR,ID)=0.
RRD(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 OPACF1(IJ)
IF(IJEX(IJ).GT.0) THEN
IJE=IJEX(IJ)
DO ID=1,ND
ABSOEX(IJE,ID)=ABSO1(ID)
EMISEX(IJE,ID)=EMIS1(ID)
SCATEX(IJE,ID)=SCAT1(ID)
END DO
END IF
CALL RTEFR1(IJ)
CALL ALIFRK(IJ)
IF(LROSS) CALL ROSSTD(IJ)
if(ioptab.lt.0) go to 100
C
C ---------------------
C Continuum transitions
C ---------------------
C
DO ID=1,ND
RBNU(ID)=(RAD1(ID)+BNUE(IJ))*EXP(-HKT1(ID)*FR)
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)
ICDW=MCDW(ITR)
IMER=IMRG(II)
IF(IFWOP(II).GE.0) THEN
IF(ICDW.GE.1) SG=SG*DWF1(ICDW,ID)
ELSE
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)
10 CONTINUE
END DO
C
C ----------------
C Line transitions
C ----------------
C
IF(IJLIN(IJ).GT.0) THEN
C
C the "primary" line at the given frequency
C
ITR=IJLIN(IJ)
DO ID=1,ND
SGW0=PRFLIN(ID,IJ)*W0
RRU(ITR,ID)=RRU(ITR,ID)+SGW0*RAD1(ID)
RRD(ITR,ID)=RRD(ITR,ID)+SGW0*RBNU(ID)
END DO
END IF
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
DO ID=1,ND
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)
END DO
90 CONTINUE
100 CONTINUE
C
C multiply some quantities by frequency-independent constants
C
DO ID=1,ND
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)
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
END IF
RETURN
END