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

201 lines
6.3 KiB
Fortran

SUBROUTINE BPOPT(ID)
C ====================
C
C the part of B-matrix corresponding to the population rows
C and T and ne columns
C
INCLUDE 'IMPLIC.FOR'
INCLUDE 'BASICS.FOR'
INCLUDE 'ATOMIC.FOR'
INCLUDE 'MODELQ.FOR'
INCLUDE 'ARRAY1.FOR'
INCLUDE 'ALIPAR.FOR'
INCLUDE 'ODFPAR.FOR'
PARAMETER (TRHA=1.5D0)
PARAMETER (CCOR=0.09,SIXTH=UN/6.)
DIMENSION DCOL(MTRANS),DLOC(MTRANS),AM(MLEVEL)
C
NSE=NFREQE+INSE-1
IF(INRE.EQ.0.AND.INPC.EQ.0) GO TO 400
IF(IELH.GT.0) N0HN=NFIRST(IELH)
NKH=IABS(IIEXP(NREFS(IATREF,ID)))
T=TEMP(ID)
ANE=ELEC(ID)
HKT=HK/T
TK=HKT/H
ANMNE1=WMM(ID)*DENS1(ID)
DO I=1,NTRANS
DCOL(I)=0.
END DO
DO I=1,NLEVEL
AM(I)=0.
END DO
C
C Derivatives of collisional rates wrt temperature - DCOL
C Note that these derivatives are calculated numerically
C
IF(.NOT.LTE.AND.INRE.GT.0.AND.ID.LT.IDLTE) THEN
DELTAT=T*1.D-4
CALL COLIS(ID,T+DELTAT,DCOL,DLOC)
DO ITR=1,NTRANS
DCOL(ITR)=(DCOL(ITR)-COLRAT(ITR,ID))/DELTAT
end do
END IF
C
C Column corresponding to temperature and electron density, ie. the
C (NFREQE+INRE)-th and (NFREQE+INPC)-t resach columns
C
C ATT(I) - auxiliary vector = (derivative of rate matrix wrt
C temperature) times (vector of populations)
C
C ANN(I) - auxiliary vector = (derivative of rate matrix wrt
C electron density) times (vector of populations)
C
C
C a) contribution to AT and AN from true statistical equilibrium
C equations (arising due to dependence of transition rates on
C temperature and electron density);
C derivatives contain the collisional-radiative switching
C parameter CRSW
C
IF(.NOT.LTE.AND.ID.LT.IDLTE) THEN
DO 230 ITR=1,NTRANS
I=ILOW(ITR)
IF(ILTION(IEL(I)).GE.1.OR.IIFIX(IATM(I)).EQ.1) GO TO 230
J=IUP(ITR)
IF(IPZERO(I,ID).NE.0.OR.IPZERO(J,ID).NE.0) GO TO 230
II=IABS(IIEXP(I))
JJ=IABS(IIEXP(J))
NREFI=NREFS(IATM(I),ID)
IF(.NOT.LINE(ITR)) THEN
DLGT=-(TRHA+HKT*FR0(ITR))/T
DLGN=ELEC1(ID)
ELSE
DLGT=-HKT*FR0(ITR)/T
DLGN=0.
END IF
POPI=ABTRA(ITR,ID)
POPJ=EMTRA(ITR,ID)
PJI=POPJ*(RRD(ITR,ID)+COLRAT(ITR,ID))
AVT=(POPI-POPJ)*DCOL(ITR)-PJI*DLGT-
* POPJ*DRDT(ITR,ID)
AVN=(POPI-POPJ)*COLRAT(ITR,ID)/ane-PJI*DLGN
C
IF(I.NE.NREFI.AND.II.GT.0.AND.ILTLEV(I).LE.0) THEN
ATT(II)=ATT(II)+AVT
ANN(II)=ANN(II)+AVN
IF(JJ.EQ.0) THEN
ATT(II)=ATT(II)-PJI*DSBPST(J,ID)
ANN(II)=ANN(II)-PJI*DSBPSN(J,ID)
END IF
END IF
IF(J.NE.NREFI.AND.JJ.GT.0.AND.ILTLEV(J).LE.0.
* and.iabs(imodl(i)).ne.4) THEN
ATT(JJ)=ATT(JJ)-AVT
ANN(JJ)=ANN(JJ)-AVN
IF(II.EQ.0) THEN
PIJ=POPI*(RRU(ITR,ID)+COLRAT(ITR,ID))
ATT(JJ)=ATT(JJ)-PIJ*DSBPST(I,ID)
ANN(JJ)=ANN(JJ)-PIJ*DSBPSN(I,ID)
END IF
END IF
230 CONTINUE
END IF
C
C simple expressions in the case of LTE
C
LLT=LTE.OR.ID.GE.IDLTE
DO IAT=1,NATOM
DO I=N0A(IAT),NKA(IAT)
II=IABS(IIEXP(I))
IF(II.NE.0.AND.I.NE.NREFS(IAT,ID)) THEN
IF(LLT.OR.ILTION(IEL(I)).GE.1.OR.ILTLEV(I).GE.1) THEN
ATT(II)=ATT(II)-POPUL(I,ID)*DSBPST(I,ID)
ANN(II)=ANN(II)-POPUL(I,ID)*DSBPSN(I,ID)
END IF
END IF
END DO
END DO
C
C
C b) contribution to AT and AN (and AM - for total particle density)
C from the abundance definition equations
C
DO IAT=1,NATOM
IF(IIFIX(IAT).NE.1) THEN
NREFII=IABS(IIEXP(NREFS(IAT,ID)))
IF(NREFII.NE.0) THEN
DO I=N0A(IAT),NKA(IAT)
IL=ILK(I)
II=IIEXP(I)
IF(IL.EQ.0) THEN
IF(II.EQ.0) THEN
ATT(NREFII)=ATT(NREFII)+POPUL(I,ID)*DSBPST(I,ID)
ANN(NREFII)=ANN(NREFII)+POPUL(I,ID)*DSBPSN(I,ID)
END IF
ELSE
ATT(NREFII)=ATT(NREFII)+POPUL(I,ID)*DUSUMT(IL)*ANE
ANN(NREFII)=ANN(NREFII)+
* POPUL(I,ID)*(USUM(IL)+ANE*DUSUMN(IL))
END IF
END DO
if(ifmol.eq.0.or.t.gt.tmolim) then
ANN(NREFII)=ANN(NREFII)+UN/YTOT(ID)*ABUND(IAT,ID)
AM(NREFII)=AM(NREFII)-UN/YTOT(ID)*ABUND(IAT,ID)
end if
END IF
END IF
END DO
C
C -----------------------
C Having evaluated auxiliary vectors AT, AN, AM, we may now set up
C the columns corresponding to temperature, el.density, and total
C particle number density
C
DO I=1,NLVEXP
IF(IFPOPR.LE.3) THEN
AVT=0.
AVN=0.
AVM=0.
DO J=1,NLVEXP
AVT=AVT-ESEMAT(I,J)*ATT(J)
AVN=AVN-ESEMAT(I,J)*ANN(J)
AVM=AVM-ESEMAT(I,J)*AM(J)
END DO
ELSE
AVT=ATT(I)
AVN=ANN(I)
AVM=AM(I)
END IF
IF(INHE.NE.0) B(NSE+I,NFREQE+INHE)=B(NSE+I,NFREQE+INHE)+AVM
IF(INRE.NE.0) B(NSE+I,NFREQE+INRE)=B(NSE+I,NFREQE+INRE)+AVT
IF(INPC.NE.0) B(NSE+I,NFREQE+INPC)=B(NSE+I,NFREQE+INPC)+AVN
END DO
C
C Columns corresponding to populations
C
400 CONTINUE
IF(IFPOPR.LE.3) THEN
DO I=1,NLVEXP
B(NSE+I,NSE+I)=B(NSE+I,NSE+I)-UN
IF(IABS(IFPOPR).GE.3) THEN
SUM=0.
DO J=1,NLVEXP
SUM=SUM+ESEMAT(I,J)*BESE(J)
END DO
VECL(NSE+I)=POPGRP(I)-SUM
END IF
END DO
ELSE IF(IFPOPR.LE.5) THEN
DO I=1,NLVEXP
SUM=0.
DO J=1,NLVEXP
SUM=SUM+ESEMAT(I,J)*POPGRP(J)
B(NSE+I,NSE+J)=B(NSE+I,NSE+J)+ESEMAT(I,J)
END DO
VECL(NSE+I)=BESE(I)-SUM
END DO
END IF
RETURN
END