50011 lines
1.5 MiB
50011 lines
1.5 MiB
PROGRAM TLUSTY
|
|
C
|
|
C ****************** Version TLUSTY207 ********************
|
|
C
|
|
C Non-LTE model stellar atmospheres computer program
|
|
C Universal code for stellar atmospheres and accretion disks
|
|
C
|
|
C *********************************************************
|
|
C
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
C
|
|
OPEN(UNIT=91,STATUS='SCRATCH',FORM='UNFORMATTED')
|
|
OPEN(UNIT=92,STATUS='SCRATCH',FORM='UNFORMATTED')
|
|
OPEN(UNIT=93,STATUS='SCRATCH',FORM='UNFORMATTED')
|
|
C
|
|
C Initialization
|
|
C
|
|
INIT=1
|
|
ITER=0
|
|
CALL START
|
|
LFIN=.FALSE.
|
|
IF(NITER.EQ.0) LFIN=.TRUE.
|
|
C
|
|
C Basic iteration loop of the hybrid CL/ALI method:
|
|
C
|
|
10 ITER=ITER+1
|
|
C
|
|
C 1. Formal solution step
|
|
C
|
|
CALL RESOLV
|
|
c CALL TIMING(1,ITER)
|
|
INIT=0
|
|
IF(LFIN) GO TO 20
|
|
C
|
|
C 1b. Acceleration of convergence
|
|
C
|
|
IF(IACC.GT.0) CALL ACCEL2
|
|
c IF(LAC2) GO TO 10
|
|
C
|
|
C 2. Solution of the linearized equations
|
|
C
|
|
IF(IFRYB.EQ.0) THEN
|
|
IF(NN.GT.MSMX) THEN
|
|
CALL SOLVE
|
|
ELSE
|
|
CALL SOLVES
|
|
END IF
|
|
ELSE
|
|
CALL RYBSOL
|
|
END IF
|
|
C
|
|
CALL TIMING(2,ITER)
|
|
GO TO 10
|
|
20 CONTINUE
|
|
C
|
|
STOP
|
|
END
|
|
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
BLOCK DATA
|
|
C ==========
|
|
C
|
|
C Hydrogenic oscillator strentghs
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
C
|
|
DATA ((OSH(I,J),I=1,20),J=1,16)/20*0.,
|
|
* 0.4162,19*0.,7.910D-2,0.6407,18*0.,2.899D-2,0.1193,
|
|
* 0.8421,17*0.,1.394D-2,4.467D-2,0.1506,1.038,16*0.,7.799D-3,
|
|
* 2.209D-2,5.584D-2,0.1793,1.231,15*0.,4.814D-3,1.270D-2,2.768D-2,
|
|
* 6.549D-2,0.2069,1.424,14*0.,3.183D-3,8.036D-3,1.604D-2,3.23D-2,
|
|
* 7.448D-2,0.234,1.616,13*0.,2.216D-3,5.429D-3,1.023D-2,1.87D-2,
|
|
* 3.645D-2,8.315D-2,0.2609,1.807,12*0.,1.605D-3,3.851D-3,6.98D-3,
|
|
* 1.196D-2,2.104D-2,4.038D-2,9.163D-2,0.2876,1.999,11*0.,1.201D-3,
|
|
* 2.835D-3,4.996D-3,8.187D-3,1.344D-2,2.32D-2,4.416D-2,0.1,0.3143,
|
|
* 2.19,10*0.,9.214D-4,2.151D-3,3.711D-3,5.886D-3,9.209D-3,1.479D-2,
|
|
* 2.525D-2,4.787D-2,0.1083,0.3408,2.381,9*0.,7.227D-4,1.672D-3,
|
|
* 2.839D-3,4.393D-3,6.631D-3,1.012D-2,1.605D-2,2.724D-2,5.152D-2,
|
|
* 0.1166,0.3673,2.572,8*0.,5.744D-4,1.326D-3,2.224D-3,3.375D-3,
|
|
* 4.959D-3,7.289D-3,1.097D-2,1.726D-2,2.918D-2,5.513D-2,0.1248,
|
|
* 0.3938,2.763,7*0.,4.686D-4,1.07D-3,1.776D-3,2.656D-3,3.821D-3,
|
|
* 5.455D-3,7.891D-3,1.177D-2,1.843D-2,3.109D-2,5.872D-2,0.133,
|
|
* 0.4202,2.954,6*0.,3.856D-4,8.764D-4,1.443D-3,2.131D-3,3.014D-3,
|
|
* 4.207D-3,5.905D-3,8.456D-3,1.254D-2,1.958D-2,3.298D-2,6.228D-2,
|
|
* 0.1412,0.4467,3.145,5*0./
|
|
DATA ((OSH(I,J),I=1,20),J=17,20)/3.211D-4,
|
|
* 7.270D-4,1.188D-3,1.739D-3,
|
|
* 2.425D-3,3.324D-3,4.556D-3,6.323D-3,8.995D-3,.01328,.0207,.03486,
|
|
* .06584,.1494,0.4731,3.336,4*0.,2.702D-4,6.099D-4,9.916D-4,
|
|
* 1.439D-3,1.984D-3,2.679D-3,3.602D-3,4.877D-3,6.719D-3,9.515D-3,
|
|
* 0.01402,.02182,.03672,.06938,.1575,.4995,3.527,3*0.,2.296D-4,
|
|
* 5.167D-4,8.361D-4,1.204D-3,1.646D-3,2.196D-3,2.905D-3,3.856D-3,
|
|
* 5.180D-3,7.099D-3,.01002,.01474,.02292,.03858,.07292,.1657,.5259,
|
|
* 3.718,2*0.,1.967D-4,4.416D-4,7.118D-4,1.019D-3,1.382D-3,1.825D-3,
|
|
* 2.383D-3,3.112D-3,4.094D-3,5.468D-3,7.468D-3,.01052,.01545,
|
|
* .02402,.04043,.07644,0.1738,.5523,3.909,0./
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE START
|
|
C ================
|
|
C
|
|
C General input and initialization procedure
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
common/hediff/ hcmass,radstr
|
|
C
|
|
read(1,*,end=10,err=10) idisk
|
|
10 continue
|
|
call initia
|
|
if(hcmass.gt.0.) call hedif
|
|
nn0=nn
|
|
CALL COMSET
|
|
call prdini
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE INITIA
|
|
C =================
|
|
C
|
|
C driver for input and initializations - "new" routine
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
PARAMETER (T15=1.D-15)
|
|
parameter (xcon=8.0935d-21)
|
|
CHARACTER*20 FINSTD
|
|
CHARACTER*40 FILEI
|
|
CHARACTER*4 TYPIOI
|
|
DIMENSION IGLE(18),IGMN(25),IGFE(26),IGNI(28)
|
|
dimension fst(mfreq),extrd0(mfreq)
|
|
COMMON/STRPAR/IMER,ITR,IC,IL,IP,NLASTE,NHOD,LASV
|
|
COMMON/INUNIT/IUNIT
|
|
common/freqcl/frmin,frmax,nfrecl
|
|
DATA IGLE/2,1,2,1,6,9,4,9,6,1,2,1,6,9,4,9,6,1/
|
|
DATA IGMN/2,1,2,1,6,9,4,9,6,1,2,1,6,9,4,9,6,1,
|
|
* 10,21,28,25,6,7,6/
|
|
DATA IGFE/2,1,2,1,6,9,4,9,6,1,2,1,6,9,4,9,6,1,
|
|
* 10,21,28,25,6,25,30,25/
|
|
DATA IGNI/2,1,2,1,6,9,4,9,6,1,2,1,6,9,4,9,6,1,
|
|
* 10,21,28,25,6,25,28,21,10,21/
|
|
C
|
|
C ----------------------
|
|
C Basic input parameters
|
|
C ----------------------
|
|
C
|
|
CALL READBF(0)
|
|
FRTABM=0.
|
|
C
|
|
C for a stellar atmosphere
|
|
C
|
|
IF(IDISK.EQ.0) THEN
|
|
READ(IBUFF,*) TEFF,GRAV
|
|
WRITE(6,601) TEFF,GRAV
|
|
GRAV=EXP(2.3025851*GRAV)
|
|
C
|
|
C for an accretion disk
|
|
C
|
|
ELSE
|
|
READ(IBUFF,*) XMSTAR,XMDOT,RSTAR,RELDST
|
|
END IF
|
|
c
|
|
c the rest of input is the same for atmospheres and disks
|
|
C
|
|
READ(IBUFF,*) LTE,LTGREY
|
|
READ(IBUFF,*) FINSTD
|
|
CALL NSTPAR(FINSTD)
|
|
C
|
|
C ------------------------
|
|
C Specific input for disks
|
|
C ------------------------
|
|
C
|
|
IF(IDISK.EQ.1) CALL INPDIS
|
|
C
|
|
C ------------------------
|
|
c Initialize opacity table
|
|
C ------------------------
|
|
c
|
|
if(ioptab.ne.0) call tabini
|
|
C
|
|
C ----------------------------
|
|
C Frequency points and weights
|
|
C ----------------------------
|
|
C
|
|
C NFREAD - number of "continuum" frequency points which are
|
|
C read. May be less than NFREQ - the actual number of
|
|
C frequencies, because the frequency points in lines
|
|
C can be calculated.
|
|
C FREQ(IJ) - frequency (in sec**-1) of the IJ-th freq. point
|
|
C W(IJ) - corresponding frequency quadrature weight
|
|
C
|
|
READ(IBUFF,*) NFREAD
|
|
NJREAD=NFREAD
|
|
if(njread.gt.mfreq) CALL QUIT('njread.gt.mfreq',njread,mfreq)
|
|
C
|
|
IF(NJREAD.LE.0) THEN
|
|
frmin = FRCMIN
|
|
frmax = FRCMAX
|
|
NFREQ=-NJREAD
|
|
if(ifrset.ge.0) then
|
|
nfreq=ifrset
|
|
frmin=frtab(numfreq)
|
|
frmax=frtab(1)
|
|
end if
|
|
if(ifrset.lt.0) nfreqc=-ifrset
|
|
nfreqc=nfreq
|
|
if(nfreq.eq.1) then
|
|
freq(1)=frmin
|
|
w(1)=1.
|
|
ijali(1)=1
|
|
else
|
|
do ij=1,nfreq
|
|
fr=log(frmin)+(log(frmax)-log(frmin))*(ij-1)/(nfreq-1)
|
|
freq(nfreq-ij+1)=exp(fr)
|
|
ijali(ij)=1
|
|
end do
|
|
end if
|
|
C
|
|
C setting simple quadrature weights - trapezoidal integration
|
|
C
|
|
if(nfreq.gt.1) then
|
|
w(1)=0.5*(freq(1)-freq(2))
|
|
w(nfreq)=0.5*(freq(nfreq-1)-freq(nfreq))
|
|
do ij=2,nfreq-1
|
|
w(ij)=0.5*(freq(ij-1)-freq(ij+1))
|
|
end do
|
|
end if
|
|
ELSE
|
|
NFREQC=NJREAD
|
|
END IF
|
|
C
|
|
C ----------------------------------------------------
|
|
C Initialize 1/i*i, 1/i*i*i; and turbulent velocities
|
|
C ----------------------------------------------------
|
|
C
|
|
DO I=1,NLMX
|
|
X=I
|
|
XI2(I)=UN/(X*X)
|
|
XI3(I)=XI2(I)/X
|
|
END DO
|
|
C
|
|
IF(ABS(VTB).LT.1.E3) VTB=VTB*1.E5
|
|
DO ID=1,ND
|
|
IF(VTB.GT.0.) VTURB(ID)=VTB
|
|
IF(IPTURB.EQ.0) VTURB(ID)=0.
|
|
VTURBS(ID)=ABS(VTB)
|
|
END DO
|
|
C
|
|
C ----------------------------------------------------
|
|
C Input parameters for explicit and non-explicit atoms
|
|
C ----------------------------------------------------
|
|
C
|
|
C Input parameters are read by procedure STATE
|
|
C (see description there)
|
|
C
|
|
CALL STATE(0,ID,X1,X2)
|
|
ID=1
|
|
WRITE(6,602) YTOT(ID),WMY(ID),WMM(ID)
|
|
C
|
|
C check consistency of the opacity table
|
|
C
|
|
c if(ioptab.gt.0.and.iopold.eq.0) call chctab
|
|
c
|
|
DO I=1,MLEVEL
|
|
ILK(I)=0
|
|
DO J=1,MLEVEL
|
|
ITRA(J,I)=0
|
|
END DO
|
|
END DO
|
|
c
|
|
if(nfrecl.gt.nfreq) nfrecl=nfreq
|
|
do ij=1,nfrecl
|
|
ijali(ij)=0
|
|
end do
|
|
C
|
|
IF(NFFIX.EQ.2) THEN
|
|
DO IJ=1,NFREQC
|
|
IJALI(IJ)=1
|
|
END DO
|
|
END IF
|
|
C
|
|
C --------------------------------------------------------------
|
|
C Input of parameters for explicit ions, levels, and transitions
|
|
C --------------------------------------------------------------
|
|
C
|
|
ILEV=0
|
|
IATLST=0
|
|
ION=0
|
|
IA=0
|
|
IUNIT=20
|
|
NATOM=0
|
|
NLEVEL=0
|
|
10 CONTINUE
|
|
READ(IBUFF,*,END=20,ERR=20) IATII,IZII,NLEVSI,ILASTI,ILVLIN,
|
|
* NONSTD,TYPIOI,FILEI
|
|
IF(ILASTI.EQ.0) THEN
|
|
ION=ION+1
|
|
if(ion.gt.mion) CALL QUIT('ion.gt.mion',ion,mion)
|
|
IATI(ION)=IATII
|
|
IZI(ION)=IZII
|
|
ILTION(ION)=0
|
|
if(nlevsi.lt.0) then
|
|
iltion(ion)=2
|
|
nlevsi=-nlevsi
|
|
end if
|
|
NLEVS(ION)=NLEVSI
|
|
TYPION(ION)=TYPIOI
|
|
FIDATA(ION)=FILEI
|
|
NLLIM(ION)=ILVLIN
|
|
INODF1(ION)=0
|
|
INODF2(ION)=0
|
|
IUPSUM(ION)=0
|
|
ICUP(ION)=16
|
|
FF(ION)=0.
|
|
MODEFF=1
|
|
NFF=0
|
|
IF(IATI(ION).EQ.1.AND.IZI(ION).EQ.0) THEN
|
|
IUPSUM(ION)=-100
|
|
MODEFF=2
|
|
END IF
|
|
IF(IATI(ION).EQ.1.AND.IZI(ION).EQ.-1) THEN
|
|
IUPSUM(ION)=0
|
|
ICUP(ION)=0
|
|
MODEFF=3
|
|
END IF
|
|
IF(IATI(ION).EQ.2.AND.IZI(ION).EQ.1) THEN
|
|
MODEFF=2
|
|
ICUP(ION)=32
|
|
END IF
|
|
IF(NONSTD.GT.0) THEN
|
|
READ(IBUFF,*) IUPSUM(ION),ICUP(ION),MODEFF,NFF
|
|
ELSE IF(NONSTD.LT.0) THEN
|
|
READ(IBUFF,*) INODF1(ION),INODF2(ION),FIODF1(ION),
|
|
* FIODF2(ION),FIBFCS(ION)
|
|
IKOBS(ION)=IABS(NONSTD)
|
|
if(ispodf.ge.1) then
|
|
IF(INODF1(ION).EQ.0) THEN
|
|
IUNIT=IUNIT+1
|
|
INODF1(ION)=IUNIT
|
|
END IF
|
|
IF(INODF2(ION).EQ.0) THEN
|
|
IUNIT=IUNIT+1
|
|
INODF2(ION)=IUNIT
|
|
END IF
|
|
end if
|
|
IF(FIBFCS(ION).NE.' ') THEN
|
|
IUNIT=IUNIT+1
|
|
INBFCS(ION)=IUNIT
|
|
END IF
|
|
IUPSUM(ION)=1
|
|
ICUP(ION)=0
|
|
END IF
|
|
C
|
|
IF(IATI(ION).EQ.IATLST) THEN
|
|
NFIRST(ION)=ILEV
|
|
ELSE
|
|
NFIRST(ION)=ILEV+1
|
|
IATLST=IATI(ION)
|
|
IA=IATEX(IATLST)
|
|
N0A(IA)=NFIRST(ION)
|
|
NATOM=MAX(NATOM,IA)
|
|
END IF
|
|
NLAST(ION)=NFIRST(ION)+NLEVS(ION)-1
|
|
NNEXT(ION)=NLAST(ION)+1
|
|
ILEV=NNEXT(ION)
|
|
if(ilev.gt.mlevel) CALL QUIT('ilev.gt.mlevel',ilev,mlevel)
|
|
IZ(ION)=IZI(ION)+1
|
|
CHARG2(ION)=IZ(ION)*IZ(ION)
|
|
IF(IFMOFF.gt.0) THEN
|
|
NFF=NQUANT(NLAST(ION))+1
|
|
IF(NFF.GT.0) FF(ION)=EH/H*IZ(ION)*IZ(ION)/NFF/NFF
|
|
END IF
|
|
N0I=NFIRST(ION)
|
|
N1I=NLAST(ION)
|
|
NKI=NNEXT(ION)
|
|
ITRA(NKI,NKI)=MODEFF
|
|
DO II=N0I,N1I
|
|
IEL(II)=ION
|
|
IATM(II)=IA
|
|
END DO
|
|
ILK(NKI)=ION
|
|
IATM(NKI)=IA
|
|
C
|
|
IF(NUMAT(IA).EQ.1) THEN
|
|
IATH=IA
|
|
IF(IZ(ION).EQ.1) IELH=ION
|
|
IF(IZ(ION).EQ.0) THEN
|
|
IELHM=ION
|
|
IOPHMI=0
|
|
END IF
|
|
END IF
|
|
IF(NUMAT(IA).EQ.2) THEN
|
|
IATHE=IA
|
|
IF(IZ(ION).EQ.1) IELHE1=ION
|
|
IF(IZ(ION).EQ.2) IELHE2=ION
|
|
END IF
|
|
C
|
|
IF(ION.EQ.1) WRITE(6,603)
|
|
WRITE(6,604) ION,TYPION(ION),N0I,N1I,NKI,IZ(ION),
|
|
* IUPSUM(ION),ICUP(ION),FF(ION)
|
|
C
|
|
ELSE IF(ILASTI.GT.0) THEN
|
|
ENION(ILEV)=0.
|
|
G(ILEV)=ILASTI
|
|
NQUANT(ILEV)=1
|
|
TYPLEV(ILEV)=TYPIOI
|
|
IMODL(ILEV)=0
|
|
IFWOP(ILEV)=0
|
|
IEL(ILEV)=ION
|
|
NKA(IA)=NNEXT(ION)
|
|
if(modref.ge.0) nref(ia)=nka(ia)
|
|
IF(ILASTI.EQ.1.AND.IATII.GT.IZII) THEN
|
|
IF(IATII.LT.25) THEN
|
|
G(ILEV)=IGLE(IATII-IZII)
|
|
ELSE IF(IATII.EQ.25) THEN
|
|
G(ILEV)=IGMN(IATII-IZII)
|
|
ELSE IF(IATII.EQ.26) THEN
|
|
G(ILEV)=IGFE(IATII-IZII)
|
|
ELSE IF(IATII.EQ.28) THEN
|
|
G(ILEV)=IGNI(IATII-IZII)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
GO TO 20
|
|
END IF
|
|
GO TO 10
|
|
20 CONTINUE
|
|
NION=ION
|
|
NLEVEL=NKI
|
|
c
|
|
if(ioptab.gt.0.and.iopold.eq.0) call chctab
|
|
write(6,631)
|
|
* iopadd,irsct,irsche,irsch2,iophmi,ioph2p,iopoh,iopch
|
|
631 format(/'iopadd,irsct,irsche,irsch2,iophmi,ioph2p,iopoh,iopch',
|
|
* 8i6)
|
|
|
|
C
|
|
IMER=0
|
|
ITR=0
|
|
ITRX=0
|
|
IC=0
|
|
IL=0
|
|
IP=0
|
|
IF(NFREAD.LE.0) THEN
|
|
NLASTE=NFREQC
|
|
NFREQ=NFREQC
|
|
ELSE
|
|
NLASTE=0
|
|
NFREQ=0
|
|
END IF
|
|
LBPFX=.TRUE.
|
|
C
|
|
lasv=.false.
|
|
DO ION=1,NION
|
|
CALL RDATA(ION)
|
|
IF(IFMOFF.gt.0) THEN
|
|
NFF=NQUANT(NLAST(ION))+1
|
|
IF(NFF.GT.0) FF(ION)=EH/H*IZ(ION)*IZ(ION)/NFF/NFF
|
|
END IF
|
|
END DO
|
|
C
|
|
NTRANS=ITR
|
|
NFREQ=NLASTE
|
|
NCON=IC
|
|
if(ntrans.gt.mtrans) CALL QUIT('ntrans.gt.mtrans',ntrans,mtrans)
|
|
C
|
|
CALL LEVSET
|
|
C
|
|
c WRITE(6,605)
|
|
DO I=1,NLEVEL
|
|
IF(I.EQ.1) WRITE(6,605)
|
|
WRITE(6,606) I,TYPLEV(I),TYPION(IEL(I)),ENION(I)/H,G(I),
|
|
* NQUANT(I),IEL(I),ILK(I),IATM(I),
|
|
* IMODL(I),ILTLEV(I),IIEXP(I),IIFOR(I)
|
|
END DO
|
|
C
|
|
C -----------------------------------------------------------
|
|
C useful quantities for later use
|
|
C -----------------------------------------------------------
|
|
C
|
|
DO 125 IT=1,NTRANS
|
|
FRQMX(IT)=0.
|
|
LINEXP(IT)=(.NOT.LINE(IT).OR.INDEXP(IT).EQ.0)
|
|
IF(LINEXP(IT)) GO TO 125
|
|
FFMX=0.
|
|
DO IJ=IFR0(IT),IFR1(IT)
|
|
FFMX=MAX(FFMX,FREQ(IJ))
|
|
END DO
|
|
FRQMX(IT)=FFMX
|
|
125 CONTINUE
|
|
C
|
|
C ------------------------------------------------------
|
|
C setup continuum frequencies (if they are not read)
|
|
C ------------------------------------------------------
|
|
C
|
|
if(nfreq.gt.mfreq) CALL QUIT('nfreq.gt.mfreq',nfreq,mfreq)
|
|
if(nfreqc.gt.mfreqc) CALL QUIT('nfreqc.gt.mfreqc',nfreqc,mfreqc)
|
|
IF(NFREAD.GT.0.AND.ISPODF.EQ.0) THEN
|
|
IF(IOPTAB.EQ.0) THEN
|
|
CALL INIFRC(0)
|
|
ELSE IF(IOPTAB.GT.0) THEN
|
|
CALL INIFRT
|
|
END IF
|
|
END IF
|
|
IF(ISPODF.GE.1) CALL INIFRS
|
|
IF(FRLMAX.LE.0.) FRLMAX=FREQ(1)
|
|
C
|
|
C ---------------------------------------------------------
|
|
C setup depth-independent line profiles (sampling mode)
|
|
C ---------------------------------------------------------
|
|
C
|
|
IF(ISPODF.GE.1) THEN
|
|
TSTD=0.75*TEFF
|
|
DO 80 IT=1,NTRANS
|
|
IF(LINEXP(IT)) GOTO 80
|
|
INDXPA=IABS(INDEXP(IT))
|
|
IF(INDXPA.GE.2 .AND. INDXPA.LE.4) GO TO 80
|
|
CALL DOPGAM(IT,1,TSTD,DOP,AGAM)
|
|
CALL LINSPL(IT,DOP,AGAM)
|
|
80 CONTINUE
|
|
END IF
|
|
C
|
|
call rdatax(0,ic,0)
|
|
C
|
|
C check the dimensions
|
|
C
|
|
if(nd.gt.mdepth) CALL QUIT('nd.gt.mdepth',nd,mdepth)
|
|
if(nfreq.gt.mfreq) CALL QUIT('nfreq.gt.mfreq',nfreq,mfreq)
|
|
if(nfreqc.gt.mfreqc) CALL QUIT('nfreqc.gt.mfreqc',nfreqc,mfreqc)
|
|
if(nfreqe.gt.mfrex) CALL QUIT('nfreqe.gt.mfrex',nfreqe,mfrex)
|
|
if(nlevel.gt.mlevel) CALL QUIT('nlevel.gt.mlevel',nlevel,mlevel)
|
|
if(ntrans.gt.mtrans) CALL QUIT('ntrans.gt.mtrans',ntrans,mtrans)
|
|
if(natom.gt.matom) CALL QUIT('natom.gt.matom',natom,matom)
|
|
if(nion.gt.mion) CALL QUIT('nion.gt.mion',nion,mion)
|
|
if(ibfint.eq.0.and.nfreq.gt.mfreqc)
|
|
* CALL QUIT('nfreq.gt.mfreqc for ibfint.eq.0',nfreq,mfreqc)
|
|
if(ntrans.gt.32767)
|
|
* call quit(' Too many transitions to define ITRLIN as INTEGER*2',
|
|
* ntrans,ntrans)
|
|
nncdw=0
|
|
do ibft=1,ntranc
|
|
itr=itrbf(ibft)
|
|
icdw=mcdw(itr)
|
|
if(icdw.ge.1) nncdw=nncdw+1
|
|
end do
|
|
if(nncdw.gt.mmcdw)
|
|
& call quit(' Too many pseudo-continua',nncdw,mmcdw)
|
|
c
|
|
C -----------------------------------------------------------
|
|
C read the input model
|
|
C -----------------------------------------------------------
|
|
C
|
|
IF(.NOT.LTGREY) THEN
|
|
CALL INPMOD
|
|
IF(ICHANG.NE.0) CALL CHANGE
|
|
END IF
|
|
C
|
|
CALL LINSET(0,0,0,0,0.d0,0.d0,0.d0)
|
|
C
|
|
C -----------------------------------------------------------
|
|
C There is no additional input for ODF transitions (i.e. ABS(MODE)=3)
|
|
C from standard input; all information is taken from corresponding
|
|
C input files (subroutine ODFSET)
|
|
C
|
|
C Input parameters for ODF lines or for iron line sampling
|
|
C -----------------------------------------------------------
|
|
C
|
|
DOPSTD=SQRT(TWO*BOLK*TEFF/HMASS+VTB*VTB)
|
|
IF(NHOD.GT.0) CALL ODFHYS(DOPSTD)
|
|
IF(ISPODF.EQ.0) THEN
|
|
CALL ODFSET
|
|
ELSE IF(ISPODF.GE.1) THEN
|
|
CALL IROSET
|
|
END IF
|
|
C
|
|
C -----------------------------------------------------------
|
|
C select explicit continuum frequencies
|
|
C -----------------------------------------------------------
|
|
C
|
|
c IF(NFREAD.GT.0.AND.ISPODF.EQ.0.and.ioptab.eq.0) CALL INIFRC(1)
|
|
IF(NFREAD.GT.0.AND.ISPODF.GE.0) CALL INIFRC(1)
|
|
C
|
|
CALL TRAINI
|
|
C
|
|
c
|
|
C --------------------------------------------------------
|
|
c Interpolate the opacity table to current frequencies
|
|
C --------------------------------------------------------
|
|
c
|
|
if(ioptab.ne.0) then
|
|
call tabint
|
|
call rayini
|
|
do ij=1,nfreqc
|
|
ijx(ij)=1
|
|
end do
|
|
end if
|
|
C
|
|
C -----------------------------------------------------------
|
|
C sorting frequencies & new weights
|
|
C -----------------------------------------------------------
|
|
C
|
|
DO IJ=NFREQC+1,NFREQ
|
|
IJX(IJ)=1
|
|
END DO
|
|
if(ioptab.ge.0) then
|
|
CALL SRTFRQ
|
|
else
|
|
do ij=1,nfreq
|
|
ijfr(ij)=ij
|
|
jik(ij)=ij
|
|
end do
|
|
end if
|
|
C
|
|
C -----------------------------------------------------------
|
|
C other frequency-dependent quantities
|
|
C -----------------------------------------------------------
|
|
C
|
|
if(ifryb.gt.0.or.nfrecl.ge.nfreq) then
|
|
do ij=1,nfreq
|
|
ijali(ij)=0
|
|
ijfr(ij)=ij
|
|
end do
|
|
end if
|
|
c
|
|
CALL CORRWM
|
|
C
|
|
do ij=1,nfreq
|
|
if(icompt.eq.0) then
|
|
sigec(ij)=sige
|
|
else
|
|
c
|
|
c first-order expression
|
|
c
|
|
if(knish.eq.0) then
|
|
SIGEC(IJ)=SIGE*(un-two*freq(ij)*xcon)
|
|
c
|
|
C Use full Klein-Nishina cross section
|
|
c (Rybicki & Lightman 1975):
|
|
c
|
|
else
|
|
xf=xcon*freq(ij)
|
|
if(xf.lt.1.d-1) then
|
|
SIGEC(IJ)=SIGE*(1.-xf*(2.-xf*(26./5.-xf*(13.3
|
|
* -xf*(1144./35.-xf*(544./7.-xf*(3784./21.
|
|
* -xf*(6148./15.-xf*(151552./165.
|
|
* -xf*111872./55.)))))))))
|
|
else if(xf.gt.1.d3) then
|
|
SIGEC(IJ)=SIGE*3./8./xf*(log(2.*xf)+0.5)
|
|
else
|
|
SIGEC(IJ)=SIGE*0.75*((1.+xf)/xf**3*(2.*xf*(1.+xf)/
|
|
* (1.+2.*xf)-log(1.+2.*xf))
|
|
* +0.5*log(1.+2.*xf)/xf
|
|
* -(1.+3.*xf)/(1.+2.*xf)**2)
|
|
endif
|
|
endif
|
|
endif
|
|
end do
|
|
c
|
|
CALL RTEANG
|
|
C
|
|
C -----------------------------------------------------------
|
|
C print out some important transition parameters
|
|
C -----------------------------------------------------------
|
|
C
|
|
if(iptran.gt.0) then
|
|
WRITE(6,607) NTRANS
|
|
c cone=3.28805e15*6.6256e-27/109678.758
|
|
cone=3.2880869e15*6.6256e-27/109678.758
|
|
DO IT=1,NTRANS
|
|
IF(FR0(IT).GT.0.) THEN
|
|
ALAM=2.997925D18/FR0(IT)
|
|
ELSE
|
|
ALAM=0.
|
|
END IF
|
|
if(indexp(it).ne.0) then
|
|
ii=ilow(it)
|
|
io=iel(ii)
|
|
n1=nfirst(io)-1
|
|
WRITE(6,608) IT,ILOW(IT),IUP(IT),
|
|
* typion(io),ii-n1,iup(it)-n1,
|
|
* INDEXP(IT),ICOL(IT),
|
|
* IFR0(IT),IFR1(IT),OSC0(IT),FR0(IT),ALAM
|
|
itr=it
|
|
if(ioptab.gt.0.and.line(itr)) then
|
|
jj=iup(itr)
|
|
iaa=numat(iatm(ii))
|
|
atn=float(iaa)+(float(iz(io))-un)*0.01
|
|
gf=log10(osc0(itr)*g(ii))
|
|
eel=-(enion(ii)-enion(n1+1))/cone
|
|
xl=(g(ii)-1.)/2.
|
|
eeu=-(enion(jj)-enion(n1+1))/cone
|
|
xu=(g(jj)-1.)/2.
|
|
wlam=alam
|
|
if(wlam.gt.2000.) then
|
|
ALM=1.E8/(alam*alam)
|
|
xn1=64.328+29498.1/(146.-ALM)+255.4/(41.-ALM)
|
|
wlam=alam/(xn1*1.d-6+un)
|
|
end if
|
|
write(66,666) alam,wlam,atn,gf,eel,xl,eeu,xu
|
|
666 format(2f11.3,f7.2,f7.3,f12.3,f6.1,f12.3,f6.1)
|
|
end if
|
|
end if
|
|
END DO
|
|
end if
|
|
C
|
|
C --------------------------------------------------------
|
|
C Evaluation of the photoionization cross-sections in both
|
|
C explicit and fixed-option continuum transitions
|
|
C
|
|
C array CROSS(transition,frequency)
|
|
C --------------------------------------------------------
|
|
C
|
|
NFREQB=NFREQ
|
|
IF(IBFINT.GT.0) NFREQB=NFREQC
|
|
if(lasv) call sigave
|
|
DO 220 ITR=1,NTRANS
|
|
IF(LINE(ITR).OR.INDEXP(ITR).EQ.0) GO TO 220
|
|
IC=ITRCON(ITR)
|
|
if(ibf(ic).gt.49.and.ibf(ic).lt.100) go to 220
|
|
ISIK=0
|
|
MODW=IABS(INDEXP(ITR))
|
|
IF(MODW.EQ.5 .OR. MODW.EQ.15) ISIK=1
|
|
DO IJ=1,NFREQB
|
|
FR=FREQ(IJ)
|
|
IF(ISPODF.GE.1) FR=FREQ(IFREQB(IJ))
|
|
CS=SIGK(FR,ITR,ISIK)
|
|
BFCS(IC,IJ)=real(CS)
|
|
IF(FR.LT.FR0PC(ITR)) BFCS(IC,IJ)=0.
|
|
IF(IFWOP(ILOW(ITR)).LT.0) BFCS(IC,IJ)=1.E-30
|
|
END DO
|
|
220 CONTINUE
|
|
C
|
|
call rdatax(-1,ic,0)
|
|
c
|
|
call gomini
|
|
C
|
|
C -----------------------------------------
|
|
C Input parameters for additional opacities
|
|
C -----------------------------------------
|
|
C
|
|
IF(IOPADD.GT.0) THEN
|
|
C
|
|
C procedure OPADD0 now sets up array CROSS that
|
|
C contain relevant cross-sections
|
|
C
|
|
DO IJ=1,NFREQB
|
|
CALL OPADD0(IJ)
|
|
END DO
|
|
END IF
|
|
C
|
|
IF(IOPHL1.NE.0 .OR. IOPHL2.NE.0) then
|
|
if(ielh.le.0)
|
|
* CALL QUIT('ielh.le.0 for iophl1.gt.0',ielh,iophl1)
|
|
CALL OPAHST
|
|
end if
|
|
if(iophe1.gt.0.and.ielhe1.le.0)
|
|
* CALL QUIT('iophe1.gt.0.and.ielhe1.le.0',iophe1,ielhe1)
|
|
if(iophe2.gt.0.and.ielhe2.le.0)
|
|
* CALL QUIT('iophe2.gt.0.and.ielhe2.le.0',iophe2,ielhe2)
|
|
if(iphe2c.gt.0.and.ielhe2.le.0)
|
|
* CALL QUIT('iophe2c.gt.0.and.ielhe2.le.0',iophe2c,ielhe2)
|
|
C
|
|
C --------------------------------------------------------------------
|
|
C Parameters specifying the overall organization and structure of the
|
|
C global matrices of complete linearization
|
|
C --------------------------------------------------------------------
|
|
C
|
|
if(hmix0.gt.0..and.iconv.eq.0) iconv=1
|
|
IF(HMIX0.GT.0.and.inpc.gt.0.and.inse.gt.0) THEN
|
|
INDL = 3
|
|
INPC = 4
|
|
INSE = 5
|
|
INZD = 0
|
|
END IF
|
|
c
|
|
if(ifryb.gt.0) then
|
|
inhe=0
|
|
inre=1
|
|
indl=0
|
|
inpc=0
|
|
inmp=0
|
|
inse=0
|
|
inzd=0
|
|
do ij=1,nfreq
|
|
ijali(ij)=0
|
|
end do
|
|
end if
|
|
c
|
|
nn=nfreqe
|
|
if(inhe.gt.0) nn=nn+1
|
|
if(inre.gt.0) nn=nn+1
|
|
if(inpc.gt.0) nn=nn+1
|
|
if(inmp.gt.0) nn=nn+1
|
|
if(indl.gt.0) nn=nn+1
|
|
if(inzd.gt.0) nn=nn+1
|
|
nngg=nn
|
|
if(inse.gt.0) nn=nn+NLVEXP
|
|
LCHMAT=.FALSE.
|
|
c
|
|
C change LCHC and IRSPLT in case that INPC=0
|
|
C
|
|
IF(INPC.EQ.0) THEN
|
|
IRSPLT=1
|
|
LCHC=.TRUE.
|
|
END IF
|
|
C
|
|
C --------------------------------------------------------------------
|
|
C Acceleration parameters
|
|
C --------------------------------------------------------------------
|
|
C
|
|
C if ITEK > 0, full iteration after Ng accelerations
|
|
C < 0, only first ITEK iterations are full iterations;
|
|
C KANT=0 - signifies a full complete linearization iteration;
|
|
C KANT=1 - a Kantorovich iteration
|
|
C
|
|
DO IKT=1,NITER
|
|
KANT(IKT)=0
|
|
END DO
|
|
IF(ORELAX.EQ.0.) ORELAX=UN
|
|
IACC0=IACC-3
|
|
LAC2=.FALSE.
|
|
LRES2=.TRUE.
|
|
IF(ITEK.GT.0) THEN
|
|
DO IKT=ITEK+1,NITER
|
|
KANT(IKT)=1
|
|
END DO
|
|
DO IKT=IACC,18,IACD
|
|
KANT(IKT)=0
|
|
END DO
|
|
ELSE IF(ITEK.LT.0) THEN
|
|
ITEK=ABS(ITEK)
|
|
DO IKT=ITEK+1,NITER
|
|
KANT(IKT)=1
|
|
END DO
|
|
END IF
|
|
C
|
|
IF(KSNG.EQ.0) THEN
|
|
DO I=1,NN
|
|
LSNG(I)=.TRUE.
|
|
END DO
|
|
ELSE
|
|
DO I=1,NN
|
|
LSNG(I)=.FALSE.
|
|
END DO
|
|
END IF
|
|
IF(KSNG.EQ.1) THEN
|
|
DO I=1,NFREQE
|
|
LSNG(I)=.TRUE.
|
|
END DO
|
|
IF(INSE.GT.0) THEN
|
|
DO ION=1,NION
|
|
N0=NFIRST(ION)
|
|
N0G=NNGG+ABS(IIEXP(N0))
|
|
LSNG(N0G)=.TRUE.
|
|
NKE=NNEXT(ION)
|
|
NKG=NNGG+ABS(IIEXP(NKE))
|
|
LSNG(NKG)=.TRUE.
|
|
END DO
|
|
END IF
|
|
END IF
|
|
IF(INHE.GT.0) LSNG(NFREQE+INHE)=.TRUE.
|
|
IF(INRE.GT.0) LSNG(NFREQE+INRE)=.TRUE.
|
|
IF(INPC.GT.0) LSNG(NFREQE+INPC)=.TRUE.
|
|
IF(INMP.GT.0) LSNG(NFREQE+INMP)=.TRUE.
|
|
IF(INDL.GT.0) LSNG(NFREQE+INDL)=.TRUE.
|
|
|
|
C
|
|
C ------------------------------------
|
|
C Wind-blanketing parameters - albedos; or irradiation intensity
|
|
C ------------------------------------
|
|
C
|
|
IF(IWINBL.EQ.1) THEN
|
|
READ(IBUFF,*) (ALBE(I),I=1,NFREQ)
|
|
ELSE IF(IWINBL.EQ.2) THEN
|
|
READ(IBUFF,*) (ALBE(I),I=1,NFREQ)
|
|
ELSE IF(IWINBL.EQ.3) THEN
|
|
READ(IBUFF,*) ALCON0,ALCHE2,ALLIN0
|
|
DO IJ=1,NFREQC
|
|
ALBE(IJ)=ALCON0
|
|
IF(FREQ(IJ).GT.1.315D16) ALBE(IJ)=ALCHE2
|
|
END DO
|
|
DO IJ=NFREQC+1,NFREQ
|
|
ALBE(IJ)=ALLIN0
|
|
END DO
|
|
READ(IBUFF,*) NUMMOD
|
|
IF(NUMMOD.GT.0) THEN
|
|
DO I=1,NUMMOD
|
|
READ(IBUFF,*) IJ1,IJ2,ALB
|
|
DO IJ=IJ1,IJ2
|
|
ALBE(IJ)=ALB
|
|
END DO
|
|
END DO
|
|
END IF
|
|
END IF
|
|
C
|
|
C ------------------------------------
|
|
C External irradiation intensity
|
|
C ------------------------------------
|
|
C
|
|
if(wdil.le.0..and.adist.gt.0.)
|
|
* wdil=4.*(rstar/adist)**2
|
|
EXTOT=0.
|
|
|
|
IF(TRAD.EQ.0) THEN
|
|
DO IJ=1,NFREQ
|
|
EXTRAD(IJ)=0.
|
|
END DO
|
|
ELSE IF(TRAD.GT.0) THEN
|
|
DO IJ=1,NFREQ
|
|
EXTRAD(IJ)=BNUE(IJ)/(EXP(HK*FREQ(IJ)/TRAD)-UN)*WDIL
|
|
EXTOT=EXTOT+W(IJ)*EXTRAD(IJ)
|
|
END DO
|
|
ELSE
|
|
open(48,file='stellarspectrum.dat',status='old')
|
|
nfreq0=-ifix(real(trad))
|
|
DO IJ=NFREQ0,1,-1
|
|
read(48,*) fst(ij), EXTRD0(IJ)
|
|
end do
|
|
close(48)
|
|
call interp(fst,extrd0,freq,extrad,nfreq0,nfreq,2,0,0)
|
|
DO IJ=1,NFREQ
|
|
EXTRAD(IJ)=EXTRAD(IJ)*WDIL
|
|
EXTOT=EXTOT+W(IJ)*EXTRAD(IJ)
|
|
END DO
|
|
END IF
|
|
DO IJ=1,NFREQ
|
|
DO IMU=1,NMU
|
|
EXTINT(IJ,IMU)=EXTRAD(IJ)
|
|
END DO
|
|
HEXTRD(IJ)=HALF*EXTRAD(IJ)
|
|
END DO
|
|
TSTAR=TRAD
|
|
EXTOT=EXTOT/SIG4P/4.
|
|
EXTOT0=WDIL*TRAD*TRAD*TRAD*TRAD
|
|
write(6,496) extot0,extot
|
|
496 format(/' EXTERNAL IRRADIATION - EXTOT0, EXTOT: ',1p2e12.3/)
|
|
C
|
|
if(nd.gt.mdepth) CALL QUIT('nd.gt.mdepth',nd,mdepth)
|
|
if(nfreq.gt.mfreq) CALL QUIT('nfreq.gt.mfreq',nfreq,mfreq)
|
|
if(nfreqe.gt.mfrex) CALL QUIT('nfreqe.gt.mfrex',nfreqe,mfrex)
|
|
if(nlevel.gt.mlevel) CALL QUIT('nlevel.gt.mlevel',nlevel,mlevel)
|
|
if(ntrans.gt.mtrans) CALL QUIT('ntrans.gt.mtrans',ntrans,mtrans)
|
|
if(natom.gt.matom) CALL QUIT('natom.gt.matom',natom,matom)
|
|
if(nion.gt.mion) CALL QUIT('nion.gt.mion',nion,mion)
|
|
if(nn.gt.mtot) CALL QUIT('nn.gt.mtot',nn,mtot)
|
|
if(nlambd.gt.mlambd) CALL QUIT('nlambd.gt.mlambd',nlambd,mlambd)
|
|
if(nhod.gt.mhod) CALL QUIT('nhod.gt.mhod',nhod,mhod)
|
|
if(ntrans.gt.32767)
|
|
* call quit(' Too many transitions to define ITRLIN as INTEGER*2',
|
|
* ntrans,ntrans)
|
|
C
|
|
C -----------------------------------------------------------
|
|
C calculate the input LTE-grey model, if needed
|
|
C -----------------------------------------------------------
|
|
C
|
|
IF(LTGREY.AND.IDISK.EQ.0) CALL LTEGR
|
|
IF(LTGREY.AND.IDISK.GT.0) CALL LTEGRD
|
|
C
|
|
CALL NSTOUT
|
|
CALL DMDER
|
|
C
|
|
C
|
|
601 FORMAT(1H1,'*******************************'//
|
|
* ' M O D E L A T M O S P H E R E'//
|
|
* ' *******************************'//
|
|
* ' TEFF =',F10.0/' LOG G =',F10.2/)
|
|
|
|
c 602 FORMAT(1H0//' YTOT =',F11.5/
|
|
c * ' WMY =',1PD15.5/' WMM =',D15.5/)
|
|
602 FORMAT(' YTOT WMY WMM ',F11.5,1P2D15.5)
|
|
603 FORMAT(1H0//' EXPLICIT IONS INCLUDED'/
|
|
* ' ----------------------'//
|
|
* ' NO. ION N0 N1 NK IZ IUPSUM ICUP FF'/)
|
|
604 FORMAT(1H ,I3,2X,A4,6I6,1PD15.3)
|
|
605 FORMAT(1H0//' EXPLICIT ENERGY LEVELS INCLUDED'/
|
|
* ' -------------------------------'//
|
|
* ' NO. LEVEL ION ION.FREQ.(s^-1) G NQ',
|
|
* ' IEL ILK IAT IMOD ILT IIE IIF'/)
|
|
606 FORMAT(1H ,I4,1X,A10,A4,1PD15.7,0PF10.2,8I5)
|
|
607 FORMAT(1H0//' TRANSITION PARAMETERS (TOTAL OF',I6,' )'/
|
|
* ' ---------------------'//
|
|
* ' ITR ILOW IUP',14x,' INDEXP ICOL IFR0 IFR1 OSC',
|
|
* ' FR0',8X,' LAMBDA'/)
|
|
608 FORMAT(1H ,I6,2I5,a6,2i4,2i5,2I7,1P2D12.3,0PF12.3)
|
|
c 609 FORMAT(1H0//' FREQUENCY POINTS AND WEIGHTS - EXPLICIT'/
|
|
c * ' ---------------------------------------'//
|
|
c * ' IJ ',7X,'FREQ',13X,'WEIGHT',11X,'PROF'/)
|
|
c 610 FORMAT(1H ,I7,1P2D17.8,D15.5,I5,D17.8)
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ************************************************************************
|
|
C
|
|
C
|
|
C
|
|
SUBROUTINE RDATA(ION)
|
|
C =====================
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
COMMON/STRPAR/IMER,ITR,IC,IL,IP,NLASTE,NHOD,LASV
|
|
COMMON/INUNIT/IUNIT
|
|
common/imodlc/imodl0(mlevel)
|
|
PARAMETER (T15=1.D-15)
|
|
CHARACTER*1 A
|
|
CHARACTER(len=100) :: DUM
|
|
c
|
|
ihydp0=0
|
|
IUNIT=21
|
|
OPEN(IUNIT,FILE=FIDATA(ION),STATUS='OLD')
|
|
C
|
|
C read the first record - a label for the energy level input
|
|
C
|
|
READ(IUNIT,501) A
|
|
501 FORMAT(A1)
|
|
C
|
|
C -----------------------------------------------------
|
|
C input parameters for explicit energy levels
|
|
C -----------------------------------------------------
|
|
C
|
|
DO IL=1,NLEVS(ION)
|
|
I=IL+NFIRST(ION)-1
|
|
IE=IEL(I)
|
|
N0I=NFIRST(IE)
|
|
NKI=NNEXT(IE)
|
|
IQ=I-N0I+1
|
|
X=IQ*IQ
|
|
READ(IUNIT,*)
|
|
* ENION(I),G(I),NQUANT(I),TYPLEV(I),ifwop(i),FRODF(I),IMODL(I)
|
|
if(ifwop(i).lt.0.and.i.ne.nlast(ie))
|
|
* CALL QUIT('ifwop(i).lt.0.and.i.ne.nlast(ie)',i,nlast(ie))
|
|
imodl0(i)=imodl(i)
|
|
E=ABS(ENION(I))
|
|
E0=E
|
|
IF(E.EQ.0.) E0=EH*IZ(IE)*IZ(IE)/X
|
|
IF(E.GT.1.D-7.AND.E.LT.100.) E0=1.6018D-12*E
|
|
IF(E.GT.100..AND.E.LT.1.D7) E0=1.9857D-16*E
|
|
IF(E.GT.1.D7) E0=H*E
|
|
IF(ENION(I).GE.0.) THEN
|
|
ENION(I)=E0
|
|
ELSE
|
|
ENION(I)=-E0
|
|
END IF
|
|
IF(G(I).EQ.0.) G(I)=2.D0*X
|
|
IF(NQUANT(I).EQ.0) NQUANT(I)=IQ
|
|
iltlev(i)=0
|
|
if(nquant(i).lt.0) then
|
|
iltlev(i)=1
|
|
nquant(i)=iabs(nquant(i))
|
|
end if
|
|
if(ispodf.eq.0 .and. ifwop(i).ge.2) ifwop(i)=0
|
|
if(ifwop(i).lt.0) then
|
|
enion(i)=0.
|
|
IMER=IMER+1
|
|
IMRG(I)=IMER
|
|
IIMER(IMER)=I
|
|
endif
|
|
LBPFX = LBPFX .AND. IMODL(I).EQ.0 .AND. IIFIX(IATM(I)).EQ.0
|
|
if(imodl(i).gt.100) then
|
|
iguide(i)=imodl(i)-100+NFIRST(ION)-1
|
|
imodl(i)=6
|
|
end if
|
|
END DO
|
|
c
|
|
C ----------------------------------------------------------------------
|
|
C
|
|
C skip lines if more levels than needed, and skip the continuum
|
|
C transition label
|
|
C
|
|
5 READ(IUNIT,501) A
|
|
IF(A.NE.'*') GO TO 5
|
|
II0=NFIRST(ION)-1
|
|
ILLIM=NLLIM(ION)+II0
|
|
JCORR=0
|
|
JJCX=0
|
|
C
|
|
C -----------------------------------------------------
|
|
C input parameters for continuum transitions
|
|
C -----------------------------------------------------
|
|
C
|
|
10 CONTINUE
|
|
READ(IUNIT,'(A100)',END=19) DUM
|
|
READ(DUM,*,IOSTAT=KSTAT) II,JJ,MODE,
|
|
* IFANCY,ICOLIS,
|
|
* IFRQ0,IFRQ1,OSC,CPARAM,NCOL
|
|
IF (KSTAT.NE.0) THEN
|
|
READ(DUM,*,ERR=15) II,JJ,MODE,
|
|
* IFANCY,ICOLIS,
|
|
* IFRQ0,IFRQ1,OSC,CPARAM
|
|
NCOL=0
|
|
END IF
|
|
IFFR0=0
|
|
IF(IABS(MODE).GT.100) THEN
|
|
IF(MODE.GT.0) MODE=MODE-100
|
|
IF(MODE.LT.0) MODE=MODE+100
|
|
IFFR0=1
|
|
READ(IUNIT,*) FR0INP
|
|
IF(FR0INP.LT.1.E10) FR0INP=2.997925D18/FR0INP
|
|
END IF
|
|
ITR=ITR+1
|
|
|
|
C
|
|
IF(JJ.LT.1000) THEN
|
|
IF(II.EQ.1 .OR. JJCX.EQ.1) JCORR=NLEVS(ION)+1-JJ
|
|
II=II+II0
|
|
JJ=JJ+II0+JCORR
|
|
ELSE
|
|
II=II+II0
|
|
JJCX=1
|
|
END IF
|
|
ILOW(ITR)=II
|
|
IUP(ITR)=JJ
|
|
INDEXP(ITR)=MODE
|
|
OSC0(ITR)=OSC
|
|
ICOL(ITR)=ICOLIS
|
|
CPAR(ITR)=CPARAM
|
|
LALI(ITR)=.FALSE.
|
|
LEXP(ITR)=.FALSE.
|
|
|
|
|
|
FR0PCI=0.
|
|
IF(IABS(MODE).EQ.5 .OR. IABS(MODE).EQ.15) THEN
|
|
READ(IUNIT,*) FR0PCI
|
|
if(ion.eq.ielh) then
|
|
if(ii.eq.1.and.cutlym.ne.0) fr0pci=cutlym
|
|
if(ii.eq.2.and.cutbal.ne.0) fr0pci=cutbal
|
|
end if
|
|
IF(FR0PCI.LT.1.E10) FR0PCI=2.997925D18/FR0PCI
|
|
END IF
|
|
FR0PC(ITR)=FR0PCI
|
|
INDEXP(ITR)=MODE
|
|
|
|
IC=IC+1
|
|
NTRANC=IC
|
|
if(ifancy.eq.15) then
|
|
ibf(ic)=ifancy
|
|
itrbf(ic)=itr
|
|
call rdatax(itr,ic,IUNIT)
|
|
go to 10
|
|
end if
|
|
IF(ITRA(II,JJ).EQ.0) THEN
|
|
ITRA(II,JJ)=ITR
|
|
ELSE
|
|
ICOL(ITR)=99
|
|
END IF
|
|
IE=IEL(II)
|
|
N0I=NFIRST(IE)
|
|
NKI=NNEXT(IE)
|
|
LINE(ITR)=.FALSE.
|
|
IFC0(ITR)=IFRQ0
|
|
IFC1(ITR)=IFRQ1
|
|
FR0(ITR)=(ENION(II)-ENION(JJ)+ENION(NKI))/H
|
|
IF(IFFR0.EQ.1) FR0(ITR)=FR0INP
|
|
C
|
|
C -----------------------------------------------------
|
|
C Additional input parameters for continuum transitions
|
|
C -----------------------------------------------------
|
|
C
|
|
C Only for IFANCY = 2, 3, or 4
|
|
C S0, ALF, BET, GAM - parameters for evaluation the
|
|
C photoionization cross-section
|
|
C
|
|
NTRANC=IC
|
|
IF(IFANCY.GE.2.AND.IFANCY.LE.4) THEN
|
|
READ(IUNIT,*) S0CS(IC),ALFCS(IC),BETCS(IC),GAMCS(IC)
|
|
ELSE IF(IFANCY.EQ.6) THEN
|
|
READ(IUNIT,*) (CTOP(IFIT,IC),IFIT=1,6)
|
|
END IF
|
|
C
|
|
C -----------------------------------------------------
|
|
C Additional input parameters for continuum transitions -TOPBASE DATA
|
|
C -----------------------------------------------------
|
|
C
|
|
C Only for IFANCY > 100 there are IFANCY-100 fit points
|
|
C
|
|
C XTOP(MFIT,MCROSS) - x = alog10(nu/nu0) of a fit point
|
|
C CTOP(MFIT,MCROSS) - sigma = alog10(sigma/10^-18) of a fit point
|
|
C
|
|
C there are IFANCY-100 fit points
|
|
C
|
|
IF(IFANCY.GT.100) THEN
|
|
NFIT=IFANCY-100
|
|
IF(NFIT.GT.MFIT) CALL QUIT('nfit.gt.mfit',nfit,mfit)
|
|
READ(IUNIT,*) (XTOP(IFIT,IC),IFIT=1,NFIT)
|
|
READ(IUNIT,*) (CTOP(IFIT,IC),IFIT=1,NFIT)
|
|
END IF
|
|
C
|
|
C -----------------------------------------------
|
|
C Additional input parameters for continuum transitions -COLLISIONAL DATA
|
|
C ----------------------------------------------
|
|
IF (NCOL.NE.0) THEN
|
|
DUM1=0
|
|
DO IIC=1,NCOL
|
|
READ(IUNIT,*) ITYPE, NCTEMP
|
|
IF (ITYPE.GT.MXTCOL) CALL QUIT('itype.gt.mxtcol',ITYPE,MXTCOL)
|
|
READ(IUNIT,*) (CTEMP(ITYPE,IFIT,ITR),IFIT=1,NCTEMP)
|
|
READ(IUNIT,*) (CRATE(ITYPE,IFIT,ITR),IFIT=1,NCTEMP)
|
|
DUM1=DUM1+2**(ITYPE-1)
|
|
idum1=ifix(real(dum1))
|
|
END DO
|
|
IF (ICOL(ITR).EQ.99) GO TO 10
|
|
IF (MOD(DUM1,TWO).EQ.1.and.ICOL(ITR).lt.10) THEN
|
|
c IN ORDER TO KEEP THE INFO FOR ELECTRON COLLISIONS FROM ICOL
|
|
ICOL(ITR)=1000*iDUM1
|
|
ELSE
|
|
IF (ICOL(ITR).LT.0) THEN
|
|
ICOL(ITR)=-1000*iDUM1+ICOL(ITR)-1
|
|
ELSE
|
|
ICOL(ITR)=1000*iDUM1+ICOL(ITR)+1
|
|
ENDIF
|
|
END IF
|
|
c
|
|
END IF
|
|
C
|
|
IBF(IC)=IFANCY
|
|
if(ifancy.gt.49.and.ifancy.lt.100) lasv=.true.
|
|
ITRA(JJ,II)=IC
|
|
ITRBF(IC)=ITR
|
|
ITRCON(ITR)=IC
|
|
IF(FR0(ITR).GT.0.) THEN
|
|
ALAM=2.997925D18/FR0(ITR)
|
|
ELSE
|
|
ALAM=0.
|
|
END IF
|
|
C
|
|
if(icolis.eq.0.and.ifancy.le.1.and.osc.eq.0.) then
|
|
zz=iz(iel(ii))
|
|
xq=nquant(ii)
|
|
if(fr0(itr).gt.0..and.xq.gt.0.)
|
|
* sig0=2.815d-20*zz*zz/(fr0(itr)*1.d-16)**3/xq**5
|
|
if(zz.gt.1.9) sig0=sig0*2.
|
|
if(zz.gt.2.9) sig0=sig0*1.5
|
|
osc0(itr)=sig0
|
|
end if
|
|
C
|
|
IF(II.LT.NLAST(ION)) GO TO 10
|
|
15 READ(IUNIT,501,end=19,err=19) A
|
|
IF(A.NE.'*') GO TO 15
|
|
C
|
|
C -----------------------------------------------------------
|
|
C Input parameters for line transitions
|
|
C -----------------------------------------------------------
|
|
C
|
|
19 CONTINUE
|
|
IIP=0
|
|
JJP=0
|
|
20 CONTINUE
|
|
READ(IUNIT,'(A100)',END=30) DUM
|
|
READ(DUM,*,IOSTAT=KSTAT) II,JJ,MODE,IFANCY,ICOLIS,
|
|
* IFRQ0,IFRQ1,OSC,CPARAM,NCOL
|
|
IF (KSTAT.NE.0) THEN
|
|
READ(DUM,*,END=30,ERR=30) II,JJ,MODE,IFANCY,
|
|
* ICOLIS,IFRQ0,IFRQ1,OSC,CPARAM
|
|
NCOL=0
|
|
END IF
|
|
IF(ISPODF.GE.1) THEN
|
|
INDXPA=IABS(MODE)
|
|
LIJP=II.EQ.IIP .AND. JJ.EQ.JJP
|
|
LOD34=INDXPA.EQ.3 .OR. INDXPA.EQ.4
|
|
IF(LIJP .AND. LOD34) THEN
|
|
IF (NCOL.NE.0) GO TO 29
|
|
GO TO 20
|
|
ENDIF
|
|
IIP=II
|
|
JJP=JJ
|
|
END IF
|
|
IFFR0=0
|
|
IF(IABS(MODE).GT.100) THEN
|
|
IF(MODE.GT.0) MODE=MODE-100
|
|
IF(MODE.LT.0) MODE=MODE+100
|
|
IFFR0=1
|
|
READ(IUNIT,*) FR0INP
|
|
IF(FR0INP.LT.1.E10) FR0INP=2.997925D18/FR0INP
|
|
END IF
|
|
IF(JJ.GT.NLEVS(ION)) THEN
|
|
IF(IABS(MODE).EQ.2) THEN
|
|
READ(IUNIT,*) K1,K2,K3,X1,X2,X3,K4
|
|
IF (NCOL.NE.0) GO TO 29
|
|
GO TO 20
|
|
END IF
|
|
IF(IABS(MODE).EQ.1) READ(IUNIT,*) LCMP
|
|
IF(IABS(IFANCY).EQ.1) READ(IUNIT,*) GAMRL
|
|
IF (NCOL.NE.0) GO TO 29
|
|
GO TO 20
|
|
END IF
|
|
ITR=ITR+1
|
|
II=II+II0
|
|
JJ=JJ+II0
|
|
ILOW(ITR)=II
|
|
IUP(ITR)=JJ
|
|
INDEXP(ITR)=MODE
|
|
OSC0(ITR)=OSC
|
|
ICOL(ITR)=ICOLIS
|
|
CPAR(ITR)=CPARAM
|
|
LALI(ITR)=.FALSE.
|
|
LEXP(ITR)=.FALSE.
|
|
IFC0(ITR)=IFRQ0
|
|
IFC1(ITR)=IFRQ1
|
|
ITRCON(ITR)=0
|
|
IF(ITRA(II,JJ).EQ.0) THEN
|
|
ITRA(II,JJ)=ITR
|
|
ELSE
|
|
ICOL(ITR)=99
|
|
END IF
|
|
IE=IEL(II)
|
|
N0I=NFIRST(IE)
|
|
NKI=NNEXT(IE)
|
|
LINE(ITR)=.TRUE.
|
|
IFR0(ITR)=IFRQ0
|
|
IFR1(ITR)=IFRQ1
|
|
FR0(ITR)=(ENION(II)-ENION(JJ))/H
|
|
IF(IFFR0.EQ.1) FR0(ITR)=FR0INP
|
|
|
|
c write(6,632) itr,ilow(itr),iup(itr),ifr0(itr),ifr1(itr)
|
|
c 632 format(' itr ',5i8)
|
|
|
|
IF(OSC.EQ.0..and.nquant(ii).le.20.and.nquant(jj).le.20) THEN
|
|
IF(MODE.NE.3.AND.MODE.NE.4) THEN
|
|
GH=2.D0*NQUANT(II)*NQUANT(II)
|
|
OSC0(ITR)=OSH(NQUANT(II),NQUANT(JJ))*G(II)/GH
|
|
ENDIF
|
|
IF(ifwop(jj).lt.0) THEN
|
|
OSC0(ITR)=0.
|
|
JJ0=NQUANT(JJ-1)
|
|
J20=MIN(20,NLMX)
|
|
IF(J20.GE.JJ0) THEN
|
|
DO JTR=JJ0,J20
|
|
OSC0(ITR)=OSC0(ITR)+OSH(NQUANT(II),JTR)
|
|
END DO
|
|
END IF
|
|
IF(NLMX.GT.20) THEN
|
|
XII=NQUANT(II)*NQUANT(II)
|
|
SUF=0.
|
|
DO JTR=21,NLMX
|
|
XJ=JTR
|
|
XJJ=XJ*XJ
|
|
XJTR=XJ/(XJJ-XII)
|
|
SUF=SUF+XJTR*XJTR*XJTR
|
|
END DO
|
|
XITR=(400.-XII)/20.
|
|
OSC0(ITR)=OSC0(ITR)+OSH(NQUANT(II),20)*SUF*XITR*XITR*XITR
|
|
END IF
|
|
END IF
|
|
END IF
|
|
C
|
|
IF(FR0(ITR).GT.0.) THEN
|
|
ALAM=2.997925D18/FR0(ITR)
|
|
ELSE
|
|
ALAM=0.
|
|
END IF
|
|
IF(MODE.EQ.0) THEN
|
|
IF (NCOL.NE.0) GO TO 29
|
|
GO TO 20
|
|
END IF
|
|
IF(IABS(MODE).EQ.2) GO TO 25
|
|
C
|
|
C change the status of treatment of superlines,
|
|
C if specified in the "offset-setting" record, or
|
|
C because of too loo or too high frequency
|
|
C
|
|
IF(IABS(MODE).EQ.3.OR.IABS(MODE).EQ.4) THEN
|
|
IF(II.LT.ILLIM.OR.FR0(ITR).LE.FRLMIN.OR.
|
|
* FR0(ITR).GE.FRLMAX) INDEXP(ITR)=0
|
|
IF (NCOL.NE.0) GO TO 29
|
|
GO TO 20
|
|
END IF
|
|
C
|
|
C -----------------------------------------------------------
|
|
C Additional input parameters for "clasical" line transitions
|
|
C (i.e. those not represented by ODF's - ie ABS(MODE)=1)
|
|
C -----------------------------------------------------------
|
|
C
|
|
C LCOMP - mode of considering absorption profile:
|
|
C = false - depth-independent profile
|
|
C = true - depth-dependent profile
|
|
C INTMOD - mode of evaluating frequency points in the line
|
|
C = 0 - means that frequency points and weights have
|
|
C already been read amongst the NJREAD or NFREAD
|
|
C frequencies;
|
|
C ne 0 - frequency points and weights will be evaluated:
|
|
C the meaning of the individual values:
|
|
C = 1 - equidistant frequencies, trapezoidal integration
|
|
C = 2 - equidistant frequencies, Simpson integration
|
|
C = 3 - modified Simpson integration
|
|
C 3-point Simpson integrations with each subsequent
|
|
C integration interval doubled, until the whole
|
|
C integration area is covered
|
|
C = 4 - frequencies (in units of standard x) and weights
|
|
C (for integration over x) are read;
|
|
C
|
|
C NF - number of frequency points in the line
|
|
C (has the meaning only for INTMOD ne 0)
|
|
C
|
|
C XMAX = 0 - program sets up default XMAX=4.55
|
|
C > 0 - means that the line is assumed symmetric around the
|
|
C center, frequency points are set up between x=0 and
|
|
C x=XMAX, where x is frequency difference from the
|
|
C line center in units of the standard Doppler width
|
|
C (standard Doppler width is the Doppler width
|
|
C calculated with standard temperature TSTD and
|
|
C standard turbulent velocity VTB);
|
|
C < 0 - frequency points are set between x=XMAX and x=-XMAX
|
|
C
|
|
C IMPORTANT NOTE: all lines are
|
|
C set by default to the full-profile mode. Thefore, if XMAX was
|
|
C positive, it is reset to XMAX --> -XMAX, and NF --> 2*NF - 1
|
|
C
|
|
C TSTD > 0 - standard temperature (see above);
|
|
C = 0 - the program assigns for the standard temperature the
|
|
C default value TSTD = 0.75*TEFF
|
|
C
|
|
READ(IUNIT,*) LCOMP(ITR),INTMOD(ITR),NF,XMAX,TSTD
|
|
IPROF(ITR)=IFANCY
|
|
IF(IABS(IPROF(ITR)).EQ.1) THEN
|
|
IP=IP+1
|
|
if(ip.gt.mvoigt) CALL QUIT('ip.gt.mvoigt',ip,mvoigt)
|
|
ITRA(JJ,II)=IP
|
|
END IF
|
|
if(ion.eq.ielh) then
|
|
if(ihydpr.eq.1) then
|
|
if(nquant(ii).le.4.and.nquant(jj).lt.20) iprof(itr)=3
|
|
else if(ihydpr.eq.2) then
|
|
if(nquant(ii).le.2.and.nquant(jj).le.10) iprof(itr)=4
|
|
end if
|
|
if(iprof(itr).eq.3) ihydp0=1
|
|
if(iprof(itr).eq.4) ihydp0=2
|
|
end if
|
|
|
|
C
|
|
C if Voigt profile is assumed (ie. if IPROF = 1), an additional
|
|
C input record is required which specifies an evaluation of the
|
|
C relevant damping parameter - see procedure DOPGAM)
|
|
C
|
|
C GAMR - for > 0 - has the meaning of natural damping
|
|
C parameter (=Einstein coefficient for
|
|
C spontaneous emission)
|
|
C = 0 - classical natural damping assumed
|
|
C < 0 - damping is given by a non-standard,
|
|
C user supplied procedure GAMSP
|
|
C STARK1 - = 0 - Stark broadening neglected
|
|
C < 0 - scaled classical expression
|
|
C (ie gam = -STARK1 * classical Stark)
|
|
C > 0 - Stark broadening given by
|
|
C n(el)*[STARK1*T**STARK2 + STARK3]
|
|
C STARK2, STARK3 - see above
|
|
C VDWH - .le.0 - Van der Waals broadening neglected
|
|
C > 0 - scaled classical expression
|
|
C
|
|
IF(IABS(IPROF(ITR)).EQ.1) THEN
|
|
READ(IUNIT,*) GAMAR(IP),STARK1(IP),STARK2(IP),STARK3(IP),
|
|
* VDWH(IP)
|
|
IF(GAMAR(IP).GT.0..AND.GAMAR(IP).LT.10.)
|
|
* GAMAR(IP)=EXP(2.3025851*GAMAR(IP))
|
|
IF(STARK1(IP).LT.0.) STARK1(IP)=EXP(2.3025851*STARK1(IP))
|
|
END IF
|
|
c
|
|
c set the profile coefficient for lines to IPROF=1 (Voigt) profile
|
|
c if it was not set before, and for IOPTAB=1
|
|
c
|
|
IF(IOPTAB.GT.0.AND.IPROF(ITR).EQ.1) THEN
|
|
if(nf.lt.25) nf=25
|
|
if(xmax.lt.4000.) xmax=4000.
|
|
END IF
|
|
C
|
|
IF(IOPTAB.GT.0.AND.IPROF(ITR).EQ.0.AND.ION.NE.IELH) THEN
|
|
IPROF(ITR)=1
|
|
IP=IP+1
|
|
if(ip.gt.mvoigt) CALL QUIT('ip.gt.mvoigt',ip,mvoigt)
|
|
ITRA(JJ,II)=IP
|
|
GAMAR(IP)=0.
|
|
STARK1(IP)=0.
|
|
VDWH(IP)=1.
|
|
LCOMP=.TRUE.
|
|
INTMOD(ITR)=3
|
|
if(ii.eq.ii0+1) then
|
|
if(nf.lt.25) nf=25
|
|
if(xmax.lt.4000.) xmax=4000.
|
|
else if(ii.le.ii0+3) then
|
|
if(nf.lt.21) nf=21
|
|
if(xmax.lt.1000.) xmax=2000.
|
|
else if(ii.le.ii0+5) then
|
|
if(nf.lt.17) nf=17
|
|
if(xmax.lt.300.) xmax=600.
|
|
else if(ii.le.ii0+10) then
|
|
if(nf.lt.13) nf=13
|
|
if(xmax.lt.100.) xmax=200.
|
|
else
|
|
if(nf.lt.9) nf=9
|
|
if(xmax.lt.30.) xmax=60.
|
|
end if
|
|
END IF
|
|
C
|
|
C change the status of treatment of lines, in virtue of:
|
|
C a) too low frequency (FRLMIN); or
|
|
C b) if specified in the "offset-setting" record
|
|
C
|
|
IF(II.LT.ILLIM.OR.FR0(ITR).LE.FRLMIN.OR.FR0(ITR).GE.FRLMAX) THEN
|
|
INDEXP(ITR)=0
|
|
IF (NCOL.NE.0) GO TO 29
|
|
GO TO 20
|
|
END IF
|
|
C
|
|
IF(TSTD.EQ.0.) TSTD=0.75*TEFF
|
|
IF(XMAX.EQ.0.) XMAX=4.55
|
|
if(xmax.gt.0.) then
|
|
xmax=-xmax
|
|
nf=2*nf-1
|
|
end if
|
|
CALL DOPGAM(ITR,1,TSTD,DOP,AGAM)
|
|
INTM=INTMOD(ITR)
|
|
IF(INTM.NE.0) IFR0(ITR)=NLASTE+1
|
|
IF(INTM.NE.0) IFR1(ITR)=NLASTE+NF
|
|
IF(INTM.NE.0) NLASTE=IFR1(ITR)
|
|
CALL LINSET(ITR,IUNIT,IFRQ0,IFRQ1,XMAX,DOP,AGAM)
|
|
|
|
c write(6,631) itr,ilow(itr),iup(itr),ifr0(itr),ifr1(itr),
|
|
c * 2.997925e18/freq(ifr0(itr)),2.997925e18/freq(ifr1(itr))
|
|
c 631 format(i6,2i5,2i7,2f10.1)
|
|
|
|
IF (NCOL.NE.0) GO TO 29
|
|
GO TO 20
|
|
C
|
|
C -----------------------------------------------------------
|
|
C Additional input parameters for a "merged superline" transition
|
|
C (i.e. transition to a merged level, treated by means of an ODF
|
|
C - i.e. for ABS(MODE)=2)
|
|
C -----------------------------------------------------------
|
|
C
|
|
C KDO(1),KDO(2),KDO(3),XDO(1),XDO(2),XDO(3),KDO(4) -
|
|
C have the following meaning:
|
|
C The superline is represented by four frequency intervals.
|
|
C Going away from the peak of ODF, the first interval is
|
|
c represented by a KDO(1)-point Simpson integration, with a
|
|
C distance XDO(1) fiducial Doppler widths between the points.
|
|
C The same for the second and third interval.
|
|
C The rest (the interval between the last point and the
|
|
C coresponding edge) is represented by a KDO(4)-point
|
|
C Simpson integration.
|
|
C The fiducial Doppler width is that corresponding to the
|
|
C effective temperature and the standard turbulent velocity.
|
|
C
|
|
25 NHOD=NHOD+1
|
|
if(ifwop(jj).ge.0) CALL QUIT('ifwop(jj).ge.0',ifwop(jj),jj)
|
|
READ(IUNIT,*) (KDO(IHI,NHOD),IHI=1,3),(XDO(IHI,NHOD),IHI=1,3),
|
|
* KDO(4,NHOD)
|
|
C
|
|
C again, change status of treatment of lines if required
|
|
C
|
|
IF(II.LT.ILLIM.OR.FR0(ITR).LE.FRLMIN.OR.FR0(ITR).GE.FRLMAX) THEN
|
|
INDEXP(ITR)=0
|
|
IF (NCOL.NE.0) GO TO 29
|
|
GO TO 20
|
|
END IF
|
|
JNDODF(ITR)=NHOD
|
|
C ----------------------------------------------
|
|
C Additional input parameters for spectral lines - COLLISIONAL DATA
|
|
C ----------------------------------------------
|
|
29 CONTINUE
|
|
IF (NCOL.NE.0) THEN
|
|
DUM1=0
|
|
DO IIC=1,NCOL
|
|
READ(IUNIT,*) ITYPE, NCTEMP
|
|
IF (ITYPE.GT.MXTCOL) CALL QUIT('itype.gt.mxtcol',ITYPE,MXTCOL)
|
|
READ(IUNIT,*) (CTEMP(ITYPE,IFIT,ITR),IFIT=1,NCTEMP)
|
|
READ(IUNIT,*) (CRATE(ITYPE,IFIT,ITR),IFIT=1,NCTEMP)
|
|
DUM1=DUM1+2**(ITYPE-1)
|
|
idum1=ifix(real(dum1))
|
|
END DO
|
|
IF (MOD(DUM1,TWO).EQ.1) THEN
|
|
ICOL(ITR)=1000*iDUM1
|
|
ELSE
|
|
IF (ICOL(ITR).LT.0) THEN
|
|
ICOL(ITR)=-1000*iDUM1+ICOL(ITR)-1
|
|
ELSE
|
|
ICOL(ITR)=1000*iDUM1+ICOL(ITR)+1
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
IF(II.LT.NLAST(ION)) GO TO 20
|
|
30 CONTINUE
|
|
C
|
|
C -----------------------------------------------------------
|
|
C Additional input parameters for iron-peak superlevels:
|
|
C Energy bands (only read in sampling mode!)
|
|
C -----------------------------------------------------------
|
|
C
|
|
IF(ISPODF.EQ.1 .AND. INODF1(ION).GT.0) THEN
|
|
READ(IUNIT,*,ERR=50,END=50) NEVKU(ION)
|
|
DO I=1,NEVKU(ION)
|
|
READ(IUNIT,*,ERR=50,END=50) XEV(I,ION)
|
|
END DO
|
|
READ(IUNIT,*,ERR=50,END=50) NODKU(ION)
|
|
DO I=1,NODKU(ION)
|
|
READ(IUNIT,*,ERR=50,END=50) XOD(I,ION)
|
|
END DO
|
|
IF(NEVKU(ION).GT.MLEVEL)
|
|
* CALL QUIT('NEVKU(ION).GT.MLEVEL',NEVKU(ION),MLEVEL)
|
|
IF(NODKU(ION).GT.MLEVEL)
|
|
* CALL QUIT('NODKU(ION).GT.MLEVEL',NODKU(ION),MLEVEL)
|
|
END IF
|
|
C
|
|
CLOSE(IUNIT)
|
|
if(itr.gt.mtrans) CALL QUIT('ntrans.gt.mtrans',itr,mtrans)
|
|
c
|
|
c initialization of Lemke hydrogen line broadening tables, if needed
|
|
c
|
|
if(ion.eq.ielh) then
|
|
if(ihydp0.eq.1) ihydpr=21
|
|
if(ihydpr.eq.2) ihydpr=22
|
|
if(ihydp0.gt.0) then
|
|
call lemini
|
|
call xenini
|
|
end if
|
|
end if
|
|
c
|
|
RETURN
|
|
50 CALL QUIT(' Missing data for iron superlevels',0,0)
|
|
END
|
|
c
|
|
c
|
|
C *****************************************************************
|
|
c
|
|
C
|
|
SUBROUTINE NSTPAR(FINSTD)
|
|
C ==========================
|
|
C
|
|
C setting up the default values of various input flags, and
|
|
C input of non-standard values of various input flags and parameters
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
COMMON/FLXAUX/T4,PGAS,PRAD,PGM,PRADM,ITGMAX,ITGMX0
|
|
common/freqcl/frmin,frmax,nfrecl
|
|
common/quasun/tqmprf,iquasi,nunalp,nunbet,nungam,nunbal
|
|
common/hediff/hcmass,radstr
|
|
common/irwint/iirwin
|
|
common/deridt/dert
|
|
common/icnrsp/iconrs
|
|
common/imucnn/imucon
|
|
common/ichndm/ichanm
|
|
common/ipricr/iprcrs,nprcrs
|
|
common/temlim/tfloor
|
|
common/derdif/dift,difp
|
|
common/adiaba/grdad0,itgrad
|
|
common/ifpzpa/ifpzev
|
|
common/moldat/moltab,irwtab
|
|
C
|
|
PARAMETER(MVAR=236)
|
|
PARAMETER(INPFI=4)
|
|
CHARACTER*(*) FINSTD
|
|
CHARACTER*6 PVALUE(MVAR)
|
|
CHARACTER*80 TEXT
|
|
CHARACTER VARNAM(MVAR)*6
|
|
CHARACTER*20 BLNK
|
|
CHARACTER*6 BLNK6
|
|
C
|
|
DATA VARNAM /'ISPLIN','IRTE ','IBC ','ILMCOR','ILPSCT',
|
|
* 'ILASCT','DJMAX ','NTRALI','IPSLTE','IOPTAB',
|
|
* 'IFMOL ','IFENTR','NFRECL','IFRYB ','IFRAYL',
|
|
* 'HCMASS','RADSTR','BERGFC','IHYDPR','IIRWIN',
|
|
* 'ICOMPT','IZSCAL','IBCHE ','IVISC ','ALPHAV',
|
|
* 'ZETA0 ','ZETA1 ','FRACTV','DMVISC','REYNUM',
|
|
* 'IFZ0 ','IHESO6','ICOLHN',
|
|
* 'IFALI ','IFPOPR','JALI ','IFRALI','IFALIH',
|
|
* 'IFPREC','IELCOR','ICHC ','IRSPLT','IATREF',
|
|
* 'MODREF','IACPP ','IACDP ','IFLEV ','IDLTE ',
|
|
* 'POPZER','POPZR2','POPZCH','NITZER','RADZER',
|
|
* 'IFDIEL','IFCHTR','SHFAC ',
|
|
* 'QTLAS ','ITLUCY','IACLT ','IACLDT','IFMOFF',
|
|
* 'IOVER ','ITLAS ','NITER ','NLAMBD','IFRSET',
|
|
* 'ND ','JIDS ','IDMFIX','ITNDRE',
|
|
* 'NMU ','IOSCOR',
|
|
* 'NELSC ','IHECOR','IBFINT','IRDER ',
|
|
* 'CHMAX ','ILDER ','IBPOPE','CHMAXT','NLAMT ',
|
|
* 'INTRPL','ICHANG','IFIXMO','IFIXDE',
|
|
* 'INHE ','INRE ','INPC ','INZD ','INSE ',
|
|
* 'INMP ','INDL ','NDRE ','TAUDIV','IDLST ',
|
|
* 'NRETC ','ICONV ','IPRESS','ITEMP ',
|
|
* 'ITMCOR','ICONRE','IDEEPC','NDCGAP','CRFLIM',
|
|
* 'IOPHMI','IOPH2P','IOPHEM','IOPCH ','IOPOH ',
|
|
* 'IOPH2M','IOH2H2','IOH2HE','IOH2H ','IOHHE ',
|
|
* 'IOPLYM',
|
|
* 'IOPOLD','IRWTAB','MOLTAB',
|
|
* 'IRSCT ','IRSCH2','IRSCHE','KEEPOP',
|
|
* 'IQUASI','NUNALP','NUNBET','TQMPRF',
|
|
* 'IACC ','IACD ','KSNG ','ITEK ','ORELAX',
|
|
* 'IWINBL','ICOMGR',
|
|
* 'ICRSW ','SWPFAC','SWPLIM','SWPINC',
|
|
* 'TAUFIR','TAULAS','ABROS0','TSURF ','ALBAVE',
|
|
* 'DION0 ','NDGREY','IDGREY','NCONIT','IPRING',
|
|
* 'DM1 ','ABPLA0','ABPMIN','ITGMAX','NNEWD ',
|
|
* 'IHM ','IH2 ','IH2P ','IFTENE',
|
|
* 'TRAD ','WDIL ',
|
|
* 'TDISK ','TFLOOR','TMOLIM',
|
|
* 'HMIX0 ','MLTYPE','VTB ','IPTURB','ILGDER',
|
|
* 'XGRAD ','STRL1 ','STRL2 ','STRLX ',
|
|
* 'FRCMAX','FRCMIN','FRLMAX','FRLMIN','CFRMAX',
|
|
* 'DFTAIL','NFTAIL','TSNU ','VTNU ','DDNU ',
|
|
* 'IELNU ','CNU1 ','CNU2 ','ISPODF',
|
|
* 'DPSILG','DPSILT','DPSILN','DPSILD',
|
|
* 'ICOMST','ICOMDE','ICOMBC','ICOMVE','ICOMRT',
|
|
* 'ICMDRA','KNISH ','FRLCOM','ICHCOO',
|
|
* 'NCFOR1','NCFOR2','NCCOUP','NCITOT','NCFULL',
|
|
* 'IFPRD ','XPDIV ','IFPZEV',
|
|
* 'IPRINI','IDCONZ','INTENS',
|
|
* 'ICOOLP','IPRIND','IPRINP','ICHCKP','IPOPAC',
|
|
* 'ILBC ','IUBC ','DERT ','ICONRS','IMUCON',
|
|
* 'IFPRAD','ICHANM','CUTLYM','CUTBAL','IHXENB',
|
|
* 'IHGOM ','HGLIM ','IPRCRS','NPRCRS','FRTLIM',
|
|
* 'DIFT ','DIFP ','GRDAD0','ITGRAD',
|
|
* 'IPRYBH','IPELCH','IPELDO','IPCONF'/
|
|
C
|
|
DATA PVALUE /' 0',' 0',' 3',' 3',' 1',
|
|
* ' 0',' 1.D-3',' 3',' 0',' 0',
|
|
* ' 0',' 1',' 0',' 0',' 1',
|
|
* ' 0.',' 0.',' 1.',' 0',' 1',
|
|
* ' 0',' 0',' 1',' 0',' 0.1',
|
|
* ' 0.0',' 0.0',' -1',' 0.01',' 0.',
|
|
* ' 9',' 0',' 0',
|
|
* ' 5',' 4',' 1',' 0',' 0',
|
|
* ' 1',' -1',' 1',' 1',' 1',
|
|
* ' 1',' 7',' 4',' 0',' 1000',
|
|
* '1.D-20','1.D-20','1.D-15',' 1','1.D-20',
|
|
* ' 0',' 0',' 0.',
|
|
* ' 1.D30',' 0',' 7',' 4',' 0',
|
|
* ' 1',' 100',' 30',' 2',' 0',
|
|
* ' 70',' 0',' 1',' 1',
|
|
* ' 3',' 0',
|
|
* ' 0',' 0',' 1',' 3',
|
|
* ' 1.D-3',' 0',' 1',' 0.01',' 1',
|
|
* ' 0',' 0',' 0',' 0',
|
|
* ' 1',' 2',' 3',' 0',' 4',
|
|
* ' 0',' 0',' 0',' 0.5',' 5',
|
|
* ' 0',' 0',' 0',' 0',
|
|
* ' 0',' 1',' 2',' 2',' 0.7',
|
|
* ' 1',' 1',' 1',' 1',' 1',
|
|
* ' 1',' 1',' 1',' 1',' 1',
|
|
* ' 0',
|
|
* ' 0',' 1',' 1',
|
|
* ' 1',' 1',' 1',' 0',
|
|
* ' 0',' 3',' 0',' 0.',
|
|
* ' 7',' 4',' 0',' 4',' 1.D0',
|
|
* ' -1',' 0',
|
|
* ' 0',' 1.D-1',' 1.D-3',' 3.D0',
|
|
* ' 1.D-7',' 316.0',' 0.4',' 0.',' 0.',
|
|
* ' 1.',' 0',' 0',' 0',' 0',
|
|
* ' 1.D-3',' 3.D-1',' 1.D-5',' 10',' 0',
|
|
* ' 0',' 0',' 0',' 0',
|
|
* ' 0.',' 0.',
|
|
* ' 0.',' 8000.',' 9000.',
|
|
* ' -1.',' 1',' 0.',' 1',' 0',
|
|
* ' 0.',' 0.001',' 0.02','1.D-10',
|
|
* ' 0.',' 1.D12',' 0.',' 1.D13',' 0.',
|
|
* ' 0.25',' 21',' 0.',' 0.',' 0.75',
|
|
* ' 0',' 4.5',' 3.',' 0',
|
|
* ' 10.',' 1.25',' 10.',' 1.25',
|
|
* ' 1',' 1',' 1',' 0',' 0',
|
|
* ' 0',' 0','8.2D14',' 1',
|
|
* ' 0',' 1',' 0',' 1',' 1',
|
|
* ' 0',' 3.D0',' 0',
|
|
* ' 0',' 31',' 10',
|
|
* ' 0',' 0',' 1',' 0',' 0',
|
|
* ' 0',' 0',' 0.01',' 10',' 10',
|
|
* ' 1',' 1',' 0.',' 0.',' 0',
|
|
* ' 0',' 1.D18',' 0',' 0','3.2880',
|
|
* ' 0.01',' 0.01',' 0.',' 0',
|
|
* ' 0',' 0',' 0',' 0'/
|
|
C
|
|
DATA BLNK/' '/,BLNK6/' '/
|
|
C
|
|
IF(FINSTD.NE.BLNK)
|
|
* OPEN(UNIT=INPFI,FILE=FINSTD,STATUS='UNKNOWN')
|
|
C
|
|
DO ID=1,MDEPTH
|
|
CRSW(ID)=UN
|
|
END DO
|
|
C
|
|
INDV=-1
|
|
C
|
|
C go through the input file line by line
|
|
c
|
|
write(6,601)
|
|
601 format(/' INPUT KEYWORD PARAMETERS:'/
|
|
* ' -------------------------')
|
|
10 CONTINUE
|
|
K0=1
|
|
READ(INPFI,500,END=70,ERR=70) TEXT
|
|
500 FORMAT(A)
|
|
WRITE(6,*) TEXT
|
|
20 CONTINUE
|
|
CALL GETWRD(TEXT,K0,K1,K2)
|
|
IF(K1.EQ.0) GO TO 60
|
|
K0=K2+2
|
|
IF(TEXT(K1:K2).EQ.'=') GO TO 20
|
|
INDV=-INDV
|
|
IF(INDV.EQ.1) THEN
|
|
DO I=1,MVAR
|
|
IF(TEXT(K1:K2).EQ.VARNAM(I)(1:K2-K1+1)) GO TO 50
|
|
END DO
|
|
CALL GETWRD(TEXT,K0,K1,K2)
|
|
IF(K1.EQ.0) THEN
|
|
K0=1
|
|
45 READ(INPFI,500,END=70) TEXT
|
|
CALL GETWRD(TEXT,K0,K1,K2)
|
|
IF(K1.EQ.0) GO TO 45
|
|
END IF
|
|
K0=K2+2
|
|
INDV=-INDV
|
|
GO TO 20
|
|
50 CONTINUE
|
|
IVAR=I
|
|
ELSE
|
|
PVALUE(IVAR)=BLNK6
|
|
PVALUE(IVAR)(6-K2+K1:6)=TEXT(K1:K2)
|
|
END IF
|
|
GO TO 20
|
|
60 CONTINUE
|
|
GO TO 10
|
|
70 CONTINUE
|
|
C
|
|
DO I=1,MVAR
|
|
WRITE(84,684) PVALUE(I)
|
|
684 FORMAT(1X,A)
|
|
END DO
|
|
C
|
|
CLOSE(UNIT=84)
|
|
REWIND(84)
|
|
READ(84,*)
|
|
* ISPLIN,IRTE ,IBC ,ILMCOR,ILPSCT,
|
|
* ILASCT,DJMAX ,NTRALI,IPSLTE,IOPTAB,
|
|
* IFMOL ,IFENTR,NFRECL,IFRYB ,IFRAYL,
|
|
* HCMASS,RADSTR,BERGFC,IHYDPR,IIRWIN,
|
|
* ICOMPT,IZSCAL,IBCHE ,IVISC ,ALPHAV,
|
|
* ZETA0 ,ZETA1 ,FRACTV,DMVISC,REYNUM,
|
|
* IFZ0 ,IHESO6,ICOLHN,
|
|
* IFALI ,IFPOPR,JALI ,IFRALI,IFALIH,
|
|
* IFPREC,IELCOR,ICHC ,IRSPLT,IATREF,
|
|
* MODREF,IACPP ,IACDP ,IFLEV ,IDLTE ,
|
|
* POPZER,POPZR2,POPZCH,NITZER,RADZER,
|
|
* IFDIEL,IFCHTR,SHFAC ,
|
|
* QTLAS ,ITLUCY,IACLT ,IACLDT,IFMOFF,
|
|
* IOVER ,ITLAS ,NITER ,NLAMBD,IFRSET,
|
|
* ND ,JIDS ,IDMFIX,ITNDRE,
|
|
* NMU ,IOSCOR,
|
|
* NELSC ,IHECOR,IBFINT,IRDER ,
|
|
* CHMAX ,ILDER ,IBPOPE,CHMAXT,NLAMT ,
|
|
* INTRPL,ICHANG,IFIXMO,IFIXDE,
|
|
* INHE ,INRE ,INPC ,INZD ,INSE ,
|
|
* INMP ,INDL ,NDRE ,TAUDIV,IDLST ,
|
|
* NRETC ,ICONV ,IPRESS,ITEMP ,
|
|
* ITMCOR,ICONRE,IDEEPC,NDCGAP,CRFLIM,
|
|
* IOPHMI,IOPH2P,IOPHEM,IOPCH ,IOPOH ,
|
|
* IOPH2M,IOH2H2,IOH2HE,IOH2H ,IOHHE ,
|
|
* IOPLYM,
|
|
* IOPOLD,IRWTAB,MOLTAB,
|
|
* IRSCT ,IRSCH2,IRSCHE,KEEPOP,
|
|
* IQUASI,NUNALP,NUNBET,TQMPRF,
|
|
* IACC ,IACD ,KSNG ,ITEK ,ORELAX,
|
|
* IWINBL,ICOMGR,
|
|
* ICRSW ,SWPFAC,SWPLIM,SWPINC,
|
|
* TAUFIR,TAULAS,ABROS0,TSURF ,ALBAVE,
|
|
* DION0 ,NDGREY,IDGREY,NCONIT,IPRING,
|
|
* DM1 ,ABPLA0,ABPMIN,ITGMAX,NNEWD ,
|
|
* IHM ,IH2 ,IH2P ,IFTENE,
|
|
* TRAD ,WDIL ,
|
|
* TDISK ,TFLOOR,TMOLIM,
|
|
* HMIX0 ,MLTYPE,VTB ,IPTURB,ILGDER,
|
|
* XGRAD ,STRL1 ,STRL2 ,STRLX ,
|
|
* FRCMAX,FRCMIN,FRLMAX,FRLMIN,CFRMAX,
|
|
* DFTAIL,NFTAIL,TSNU ,VTNU ,DDNU ,
|
|
* IELNU ,CNU1 ,CNU2 ,ISPODF,
|
|
* DPSILG,DPSILT,DPSILN,DPSILD,
|
|
* ICOMST,ICOMDE,ICOMBC,ICOMVE,ICOMRT,
|
|
* ICMDRA,KNISH ,FRLCOM,ICHCOO,
|
|
* NCFOR1,NCFOR2,NCCOUP,NCITOT,NCFULL,
|
|
* IFPRD ,XPDIV ,IFPZEV,
|
|
* IPRINI,IDCONZ,INTENS,
|
|
* ICOOLP,IPRIND,IPRINP,ICHCKP,IPOPAC,
|
|
* ILBC ,IUBC ,DERT ,ICONRS,IMUCON,
|
|
* IFPRAD,ICHANM,CUTLYM,CUTBAL,IHXENB,
|
|
* IHGOM ,HGLIM ,IPRCRS,NPRCRS,FRTLIM,
|
|
* DIFT ,DIFP ,GRDAD0,ITGRAD,
|
|
* IPRYBH,IPELCH,IPELDO,IPCONF
|
|
C
|
|
IF(LTGREY) ISPODF=0
|
|
IF(LTE) IFLEV=1
|
|
IF(IFRYB.GE.1) IDLST=0
|
|
LCHC=.FALSE.
|
|
IF(ICHC.EQ.1) LCHC=.TRUE.
|
|
NFFIX=IFRALI
|
|
IF(IACC.LE.4) IACC=7
|
|
if(frtlim.lt.1.e6) frtlim=frtlim*1.e15
|
|
if(frcmax.lt.1.e6) frcmax=frcmax*1.e15
|
|
if(frlmax.lt.1.e6) frlmax=frlmax*1.e15
|
|
if(frcmin.lt.1.e6) frcmin=frcmin*1.e13
|
|
if(frlmin.lt.1.e6) frlmin=frlmin*1.e13
|
|
IF(FRLMAX.EQ.0.) FRLMAX=max(1.D11*CNU1*TEFF,3.288e15)
|
|
if(idisk.eq.0.and.cfrmax.eq.0.) cfrmax=2.
|
|
if(trad.ne.0.) iwinbl=-1
|
|
if(nitzer.gt.itek) nitzer=itek
|
|
if(nitzer.gt.iacc-iacd) nitzer=iacc-iacd
|
|
if(ielhm.gt.0) iophmi=0
|
|
if(teff.gt.15000.) then
|
|
ioph2p=0
|
|
iopch=0
|
|
iopoh=0
|
|
irsch2=0
|
|
ioph2m=0
|
|
ioh2h2=0
|
|
ioh2he=0
|
|
ioh2h=0
|
|
iohhe=0
|
|
end if
|
|
iopadd=iophmi+ioph2p+iophem+iopch+iopoh
|
|
iopadd=iopadd+ioph2m+ioh2h2+ioh2he+ioh2h+iohhe
|
|
iopadd=iopadd+irsct+irsch2+irsche
|
|
c
|
|
if(ioptab.lt.0.or.ifmol.gt.0) ielcor=-1
|
|
c
|
|
RRDIL=un
|
|
IF(IDISK.EQ.0) IFZ0=-1
|
|
ITGMX0=ITGMAX
|
|
DO ITL=1,NITER+1
|
|
NITLAM(ITL)=0
|
|
END DO
|
|
IF(NLAMBD.LT.0) THEN
|
|
NLAMBD=-NLAMBD
|
|
IF(LTE) NLAMBD=1
|
|
DO ITL=1,12
|
|
NITLAM(ITL)=NLAMBD
|
|
END DO
|
|
DO ITL=13,NITER+1
|
|
NITLAM(ITL)=2
|
|
END DO
|
|
ELSE IF(NLAMBD.GT.0) THEN
|
|
IF(LTE) NLAMBD=1
|
|
DO ITL=1,NITER+1
|
|
NITLAM(ITL)=NLAMBD
|
|
END DO
|
|
END IF
|
|
IF(ILMCOR.GE.3) ILPSCT=1
|
|
C
|
|
IF(IDISK.EQ.1.AND.INZD.EQ.0.AND.IZSCAL.EQ.0.AND.IVISC.LE.1) THEN
|
|
if(ifryb.eq.0) then
|
|
INZD=4
|
|
INSE=5
|
|
end if
|
|
END IF
|
|
C
|
|
IF(IFIXMO.GT.0) THEN
|
|
INHE=0
|
|
INRE=0
|
|
INPC=0
|
|
INZD=0
|
|
INSE=1
|
|
END IF
|
|
c
|
|
IF(IFIXDE.GT.0) THEN
|
|
INHE=1
|
|
INRE=0
|
|
INPC=2
|
|
INZD=0
|
|
INSE=3
|
|
END IF
|
|
C
|
|
if(iprcrs.gt.0) then
|
|
niter=0
|
|
nlambd=1
|
|
end if
|
|
C
|
|
c initialize the convection parameters
|
|
c
|
|
aconml=1./8.
|
|
bconml=half
|
|
cconml=16.
|
|
if(mltype.eq.2) then
|
|
aconml=1.
|
|
bconml=2.
|
|
cconml=16.
|
|
end if
|
|
nungam=0
|
|
nunbal=0
|
|
if(iquasi.gt.0) call getlal
|
|
c
|
|
if(nd.gt.mdepth) CALL QUIT('nd.gt.mdepth',nd,mdepth)
|
|
if(ndgrey.gt.mdepth) CALL QUIT('ndgrey.gt.mdepth',ndgrey,mdepth)
|
|
if(nlambd.gt.mlambd) CALL QUIT('nlambd.gt.mlambd',nlambd,mlambd)
|
|
if(iacc.le.2) CALL QUIT('Ng too early',iacc,iacc)
|
|
if(nmu.gt.mmu) CALL QUIT('nmu.gt.mmu',nmu,mmu)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ***************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE NSTOUT
|
|
C =================
|
|
C
|
|
C Diagnostic print of the input flags and parameters
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
C
|
|
if(lchc) ichc=1
|
|
write(6,602)
|
|
* ISPLIN,IRTE ,IBC ,ILMCOR,ILPSCT,
|
|
* ILASCT,DJMAX ,NTRALI,IPSLTE,
|
|
* ICOMPT,IZSCAL,IBCHE ,IVISC ,
|
|
* IFALI ,IFPOPR,JALI ,IFRALI,
|
|
* IFPREC,IELCOR,ICHC ,IRSPLT,IATREF,
|
|
* MODREF,IACPP ,IACPD ,IFLEV, IDLTE,
|
|
* POPZER,POPZR2,RADZER,NITZER,IFDIEL,
|
|
* IOVER ,ITLAS ,NITER ,NLAMBD,ND,
|
|
* JIDS ,IDMFIX,NMU ,
|
|
* NELSC ,IHECOR,IBFINT,IRDER ,
|
|
* CHMAX ,ILDER ,IBPOPE,CHMAXT,NLAMT
|
|
write(6,603) INTRPL,ICHANG,
|
|
* INHE ,INRE ,INPC ,INSE ,INMP ,
|
|
* INDL ,NDRE ,TAUDIV,IDLST ,NRETC ,
|
|
* ICONV ,IPRESS,ITEMP ,
|
|
* IOPADD,IRSCT ,IOPHMI,IOPH2P,
|
|
* IACC ,IACD ,KSNG ,ITEK ,ORELAX,
|
|
* IWINBL,
|
|
* ICRSW ,SWPFAC,SWPLIM,SWPINC,
|
|
* IFPRD ,XPDIV
|
|
write(6,604) TRAD ,WDIL ,
|
|
* HMIX0 ,VTB/1.e5 ,IPTURB,
|
|
* XGRAD ,STRL1 ,STRL2 ,STRLX ,
|
|
* FRCMAX,FRCMIN,FRLMAX,FRLMIN,CFRMAX,
|
|
* DFTAIL,NFTAIL,TSNU ,VTNU/1.e5 ,DDNU ,
|
|
* IELNU ,CNU1 ,CNU2 ,ISPODF,
|
|
* DPSILG,DPSILT,DPSILN,DPSILD
|
|
write(6,605) ICOMST,ICOMDE,ICOMBC,
|
|
* ICMDRA,KNISH,
|
|
* NCFOR1,NCFOR2,NCCOUP,NCITOT,NCFULL
|
|
IF(LTGREY) WRITE(6,606)
|
|
* TAUFIR,TAULAS,ABROS0,TSURF ,ALBAVE,
|
|
* ABPLA0,ABPMIN,
|
|
* DION0 ,NDGREY,IDGREY,NCONIT,IPRING,
|
|
* IHM ,IH2 ,IH2P
|
|
c
|
|
602 FORMAT(/' VALUES OF SOME KEYWORD PARAMETERS:'/
|
|
* ' =================================='//
|
|
* 'ISPLIN=',I6,2X,'IRTE =',I6,2X,'IBC =',I6,2X,
|
|
* 'ILMCOR=',I6,2X,'ILPSCT=',I6,2X/
|
|
* 'ILASCT=',I6,2X,'DJMAX =',F6.3,2X,'NTRALI=',I6,2X,
|
|
* 'IPSLTE=',I6,2X/
|
|
* 'ICOMPT=',I6/
|
|
* 'IZSCAL=',I6,2X,'IBCHE =',I6,2X,'IVISC =',I6,2X/
|
|
* 'IFALI =',I6,2X,'IFPOPR=',I6,2X,'JALI =',I6,2X,
|
|
* 'IFRALI=',I6,2X/
|
|
* 'IFPREC=',I6,2X,'IELCOR=',I6,2X,'ICHC =',I6,2X,
|
|
* 'IRSPLT=',I6,2X,'IATREF=',I6,2X/
|
|
* 'MODREF=',I6,2X,'IACPP =',I6,2X,'IACPD =',I6,2X,
|
|
* 'IFLEV =',I6,2X,'IDLTE =',I6,2X/
|
|
* 'POPZER=',1PE6.0,2X,'POPZR2=',1PE6.0,2X,
|
|
* 'RADZER=',1PE6.0,2X,'NITZER=',I6,2X,'IFDIEL=',I6,2X/
|
|
* 'IOVER =',I6,2X,'ITLAS =',I6,2X/
|
|
* 'NITER =',I6,2X,'NLAMBD=',I6,2X,'ND =',I6/
|
|
* 'JIDS =',I6,2X,'IDMFIX=',I6/
|
|
* 'NMU =',I6/
|
|
* 'NELSC =',I6,2X,'IHECOR=',I6,2X,'IBFINT=',I6,2X,
|
|
* 'IRDER =',I6,2X,'CHMAX =',0PF6.3,2X/
|
|
* 'ILDER =',I6,2X,'IBPOPE=',I6,2X,
|
|
* 'CHMAXT=',F6.3,2X,'NLAMT =',I6,2X)
|
|
603 FORMAT('INTRPL=',I6,2X,'ICHANG=',I6,2X/
|
|
* 'INHE =',I6,2X,'INRE =',I6,2X,'INPC =',I6,2X,
|
|
* 'INSE =',I6,2X,'INMP =',I6,2X/
|
|
* 'INDL =',I6,2X,'NDRE =',I6,2X,'TAUDIV=',F6.3,2X,
|
|
* 'IDLST =',I6,2X,'NRETC =',I6,2X/
|
|
* 'ICONV =',I6,2X,'IPRESS=',I6,2X,'ITEMP =',I6,2X/
|
|
* 'IOPADD=',I6,2X,'IRSCT =',I6,2X,'IOPHMI=',I6,2X,
|
|
* 'IOPH2P=',I6,2X/
|
|
* 'IACC =',I6,2X,'IACD =',I6,2X,'KSNG =',I6,2X,
|
|
* 'ITEK =',I6,2X,'ORELAX=',F6.3,2X/
|
|
* 'IWINBL=',I6,2X/
|
|
* 'ICRSW =',I6,2X,'SWPFAC=',F6.3,2X,'SWPLIM=',F6.3,2X,
|
|
* 'SWPINC=',F6.3,2X/
|
|
* 'IFPRD =',I6,2X,'XPDIV =',F6.1/)
|
|
604 FORMAT('TRAD =',F6.0,2X,'WDIL =',F5.3/
|
|
* 'HMIX0 =',F6.1,2X,'VTB =',F6.0,2X,I6/
|
|
* 'XGRAD =',F6.2,2X,'STRL1 =',1PE6.0,2X,'STRL2 =',E6.0/
|
|
* 'STRLX =',1PE6.0/
|
|
* 'FRCMAX=',1PE6.0,2X,'FRCMIN=',1PE6.0,2X,
|
|
* 'FRLMAX=',1PE6.0,2X,'FRLMIN=',1PE6.0,/,
|
|
* 'CFRMAX=',0PF6.2,/
|
|
* 'DFTAIL=',0PF6.3,2X,'NFTAIL=',I6,/
|
|
* 'TSNU =',F6.0,2X,'VTNU =',F6.2,2X,'DDNU =',F6.3,/
|
|
* 'IELNU =',I6,2X,'CNU1 =',F6.2,2X,'CNU2 =',F6.2,/
|
|
* 'ISPODF=',I6,/
|
|
* 'DPSILG=',F6.2,2X,'DPSILT=',F6.2,2X,'DPSILN=',F6.2,2X,
|
|
* 'DPSILD=',F6.2,/)
|
|
605 FORMAT('ICOMST=',I6,2X,'ICOMDE=',I6,2X,'ICOMBC=',I6/
|
|
* 'ICMDRA=',I6,2X,'KNISH =',I6/
|
|
* 'NCFOR1=',I6,2X,'NCFOR2=',I6,2X,'NCCOUP=',I6,2X,
|
|
* 'NCITOT=',I6,2X,'NCFULL=',I6)
|
|
606 FORMAT('TAUFIR=',1PE6.0,2X,'TAULAS=',0PF6.1,2X,'ABROS0=',F6.3,2X,
|
|
* 'TSURF =',F6.3,2X,'ALBAVE=',F6.3/
|
|
* 'ABPLAO=',F6.3,2X,'ABPMIN=',1PE6.0/
|
|
* 'DION0 =',0PF6.3,2X,'NDGREY=',I6,2X,'IDGREY=',I6,2X,
|
|
* 'NCONIT=',I6,2X,'IPRING=',I6,2X/
|
|
* 'IHM =',I6,2X,'IH2 =',I6,2X,'IH2P =',I6,2X/)
|
|
C
|
|
C Outdated options (or options not yet implemented
|
|
C for distributed processing!)
|
|
C
|
|
IF(ISPODF.GE.1) THEN
|
|
IF(IFPREC.EQ.0)
|
|
* CALL QUIT('inconsistent ispodf and ipfrec',ispodf,ifprec)
|
|
END IF
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE GETWRD(TEXT,K0,K1,K2)
|
|
C
|
|
C FINDS NEXT WORD IN TEXT FROM INDEX K0. NEXT WORD IS TEXT(K1:K2)
|
|
C THE NEXT WORD STARTS AT THE FIRST ALPHANUMERIC CHARACTER AT K0
|
|
C OR AFTER. IT ENDS WITH THE LAST ALPHANUMERIC CHARACTER IN A ROW
|
|
C FROM THE START
|
|
C
|
|
C TAKEN FROM MULTI - M. CARLSSON (1976)
|
|
C
|
|
C INCLUDE 'IMPLIC.FOR'
|
|
PARAMETER (MSEPAR=7)
|
|
CHARACTER*(*) TEXT
|
|
CHARACTER SEPAR(MSEPAR)
|
|
DATA SEPAR/' ','(',')','=','*','/',','/
|
|
C
|
|
K1=0
|
|
DO I=K0,LEN(TEXT)
|
|
IF(K1.EQ.0) THEN
|
|
DO J=1,MSEPAR
|
|
IF(TEXT(I:I).EQ.SEPAR(J)) GO TO 10
|
|
END DO
|
|
K1=I
|
|
C
|
|
C NOT START OF WORD
|
|
C
|
|
10 CONTINUE
|
|
ELSE
|
|
DO J=1,MSEPAR
|
|
IF(TEXT(I:I).EQ.SEPAR(J)) GO TO 20
|
|
END DO
|
|
END IF
|
|
END DO
|
|
C
|
|
C NO NEW WORD. RETURN K1=K2=0
|
|
C
|
|
K1=0
|
|
K2=0
|
|
GO TO 30
|
|
C
|
|
C NEW WORD IN TEXT(K1:I-1)
|
|
C
|
|
20 CONTINUE
|
|
K2=I-1
|
|
C
|
|
30 CONTINUE
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE STATE(MODE,ID,T,ANE)
|
|
C ===============================
|
|
C
|
|
C For MODE=0 - initialization of the basic parameters for the
|
|
C chemical species
|
|
C for MODE=2 - solves the set of LTE Saha equations to determine
|
|
C the total charge due to ionization of non-explicit
|
|
C chemical species
|
|
C for MODE=3 - similar as MODE=2, but also with derivatives wrt
|
|
C temperature and electron density (called from BPOP,
|
|
C ie. from the linearization step)
|
|
C for MODE=1 - similar as MODE=2, but the total charge is evaluated
|
|
C summing the contributions of both non-explicit and
|
|
C explicit chemical species (called from LTEGR)
|
|
C
|
|
C Input for MODE > 0:
|
|
C
|
|
C T - temperature
|
|
C ANE - electron density
|
|
C
|
|
C Output for MODE > 0 (through COMMON/STATEP)
|
|
C
|
|
C
|
|
C Q - total charge, relative to the reference atom
|
|
C QM - charge of H- (in LTE), evaluated only if H- is not
|
|
C explicit ion, and if desired (if IHM=1)
|
|
C DQT - derivative of Q wrt temperature
|
|
C DQN - derivative of Q wrt electron density
|
|
C DQM - derivative of QM wrt temperature
|
|
C ENER - internal energy (of all species in all considered
|
|
C ionization stages (needed only for evaluating
|
|
C thermodynamic derivatoves if convection is considerd)
|
|
C QREF - total charge due to the reference species
|
|
C DQTR - derivative of QREF wrt temperature
|
|
C DQNR - derivative of QREF wrt electron density
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
CHARACTER*4 TYPAT,DYP
|
|
COMMON/PFSTDS/PFSTD(matom,30),MODPF(matom)
|
|
common/terden/rhoter,anta,entrp
|
|
DIMENSION TYPAT(matom),ABND(matom),D(3,matom),
|
|
* abnref(mdepth),DYP(matom),
|
|
* xio(8,matom),
|
|
* abun0(matom),abun1(matom)
|
|
dimension xio2(9,22), xio3(9,13)
|
|
dimension ffi(matom),pfstu(matom),pfstt(matom),pfstn(matom),
|
|
* entot(matom)
|
|
dimension idat(30),uu(30,17)
|
|
dimension u6(6),u7(7),u8(8),u10(10),u11(11)
|
|
dimension u12(12),u13(13),u14(14),u16(16),u18(18),u20(20)
|
|
dimension u24(24),u25(25),u26(26),u28(28)
|
|
PARAMETER (TH0=5.0404D3,XMX0=2.154D4,THL0=2.3025851,FI0=3.6113D1,
|
|
* TRHA=1.5D0,c1qm=1.0353d-16,c2qm=8762.9,
|
|
* ev2erg=1.6018d-12)
|
|
character*80 dum
|
|
C
|
|
equivalence (u6(1),uu(1,3)),(u7(1),uu(1,4)),(u8(1),uu(1,5))
|
|
equivalence (u10(1),uu(1,6)),(u11(1),uu(1,7)),(u12(1),uu(1,8))
|
|
equivalence (u13(1),uu(1,9)),(u14(1),uu(1,10)),(u16(1),uu(1,11))
|
|
equivalence (u18(1),uu(1,12)),(u20(1),uu(1,13)),(u24(1),uu(1,14))
|
|
equivalence (u25(1),uu(1,15)),(u26(1),uu(1,16)),(u28(1),uu(1,17))
|
|
C
|
|
DATA DYP/' H ',' He ',' Li ',' Be ',' B ',' C ',
|
|
* ' N ',' O ',' F ',' Ne ',' Na ',' Mg ',
|
|
* ' Al ',' Si ',' P ',' S ',' Cl ',' Ar ',
|
|
* ' K ',' Ca ',' Sc ',' Ti ',' V ',' Cr ',
|
|
* ' Mn ',' Fe ',' Co ',' Ni ',' Cu ',' Zn ',
|
|
* ' Ga ',' Ge ',' As ',' Se ',' Br ',' Kr ',
|
|
* ' Rb ',' Sr ',' Y ',' Zr ',' Nb ',' Mo ',
|
|
* ' Tc ',' Ru ',' Rh ',' Pd ',' Ag ',' Cd ',
|
|
* ' In ',' Sn ',' Sb ',' Te ',' I ',' Xe ',
|
|
* ' Cs ',' Ba ',' La ',' Ce ',' Pr ',' Nd ',
|
|
* ' Pm ',' Sm ',' Eu ',' Gd ',' Tb ',' Dy ',
|
|
* ' Ho ',' Er ',' Tm ',' Yb ',' Lu ',' Hf ',
|
|
* ' Ta ',' W ',' Re ',' Os ',' Ir ',' Pt ',
|
|
* ' Au ',' Hg ',' Tl ',' Pb ',' Bi ',' Po ',
|
|
* ' At ',' Rn ',' Fr ',' Ra ',' Ac ',' Th ',
|
|
* ' Pa ',' U ',' Np ',' Pu ',' Am ',' Cm ',
|
|
* ' Bk ',' Cf ',' Es '/
|
|
C
|
|
C Standard atomic constants for first 99 species
|
|
C Abundances for the first 30 from Grevesse & Sauval,
|
|
C (1998, Space Sci. Rev. 85, 161)
|
|
C
|
|
C Element Atomic Solar Std.
|
|
C weight abundance highest
|
|
C
|
|
C ionization stage
|
|
DATA D/ 1.008, 1.0D0, 2.,
|
|
* 4.003, 1.00D-1, 3.,
|
|
* 6.941, 1.26D-11, 3.,
|
|
* 9.012, 2.51D-11, 3.,
|
|
* 10.810, 5.0D-10, 4.,
|
|
* 12.011, 3.31D-4, 5.,
|
|
* 14.007, 8.32D-5, 5.,
|
|
* 16.000, 6.76D-4, 5.,
|
|
* 18.918, 3.16D-8, 4.,
|
|
* 20.179, 1.20D-4, 4.,
|
|
* 22.990, 2.14D-6, 4.,
|
|
* 24.305, 3.80D-5, 4.,
|
|
* 26.982, 2.95D-6, 4.,
|
|
* 28.086, 3.55D-5, 5.,
|
|
* 30.974, 2.82D-7, 5.,
|
|
* 32.060, 2.14D-5, 5.,
|
|
* 35.453, 3.16D-7, 5.,
|
|
* 39.948, 2.52D-6, 5.,
|
|
* 39.098, 1.32D-7, 5.,
|
|
* 40.080, 2.29D-6, 5.,
|
|
* 44.956, 1.48D-9, 5.,
|
|
* 47.900, 1.05D-7, 5.,
|
|
* 50.941, 1.00D-8, 5.,
|
|
* 51.996, 4.68D-7, 5.,
|
|
* 54.938, 2.45D-7, 5.,
|
|
* 55.847, 3.16D-5, 5.,
|
|
* 58.933, 8.32D-8, 5.,
|
|
* 58.700, 1.78D-6, 5.,
|
|
* 63.546, 1.62D-8, 5.,
|
|
* 65.380, 3.98D-8, 5.,
|
|
* 69.72 , 1.34896324e-09 , 3.,
|
|
* 72.60 , 4.26579633e-09 , 3.,
|
|
* 74.92 , 2.34422821e-10 , 3.,
|
|
* 78.96 , 2.23872066e-09 , 3.,
|
|
* 79.91 , 4.26579633e-10 , 3.,
|
|
* 83.80 , 1.69824373e-09 , 3.,
|
|
* 85.48 , 2.51188699e-10 , 3.,
|
|
* 87.63 , 8.51138173e-10 , 3.,
|
|
* 88.91 , 1.65958702e-10 , 3.,
|
|
* 91.22 , 4.07380181e-10 , 3.,
|
|
* 92.91 , 2.51188630e-11 , 3.,
|
|
* 95.95 , 9.12010923e-11 , 3.,
|
|
* 99.00 , 1.00000000e-24 , 3.,
|
|
* 101.1 , 6.60693531e-11 , 3.,
|
|
* 102.9 , 1.23026887e-11 , 3.,
|
|
* 106.4 , 5.01187291e-11 , 3.,
|
|
* 107.9 , 1.73780087e-11 , 3.,
|
|
* 112.4 , 5.75439927e-11 , 3.,
|
|
* 114.8 , 6.60693440e-12 , 3.,
|
|
* 118.7 , 1.38038460e-10 , 3.,
|
|
* 121.8 , 1.09647810e-11 , 3.,
|
|
* 127.6 , 1.73780087e-10 , 3.,
|
|
* 126.9 , 3.23593651e-11 , 3.,
|
|
* 131.3 , 1.69824373e-10 , 3.,
|
|
* 132.9 , 1.31825676e-11 , 3.,
|
|
* 137.4 , 1.62181025e-10 , 3.,
|
|
* 138.9 , 1.58489337e-11 , 3.,
|
|
* 140.1 , 4.07380293e-11 , 3.,
|
|
* 140.9 , 6.02559549e-12 , 3.,
|
|
* 144.3 , 2.95120943e-11 , 3.,
|
|
* 147.0 , 1.00000000e-24 , 3.,
|
|
* 150.4 , 9.33254366e-12 , 3.,
|
|
* 152.0 , 3.46736869e-12 , 3.,
|
|
* 157.3 , 1.17489770e-11 , 3.,
|
|
* 158.9 , 2.13796216e-12 , 3.,
|
|
* 162.5 , 1.41253747e-11 , 3.,
|
|
* 164.9 , 3.16227767e-12 , 3.,
|
|
* 167.3 , 8.91250917e-12 , 3.,
|
|
* 168.9 , 1.34896287e-12 , 3.,
|
|
* 173.0 , 8.91250917e-12 , 3.,
|
|
* 175.0 , 1.31825674e-12 , 3.,
|
|
* 178.5 , 5.37031822e-12 , 3.,
|
|
* 181.0 , 1.34896287e-12 , 3.,
|
|
* 183.9 , 4.78630102e-12 , 3.,
|
|
* 186.3 , 1.86208719e-12 , 3.,
|
|
* 190.2 , 2.39883290e-11 , 3.,
|
|
* 192.2 , 2.34422885e-11 , 3.,
|
|
* 195.1 , 4.78630036e-11 , 3.,
|
|
* 197.0 , 6.76082952e-12 , 3.,
|
|
* 200.6 , 1.23026887e-11 , 3.,
|
|
* 204.4 , 6.60693440e-12 , 3.,
|
|
* 207.2 , 1.12201834e-10 , 3.,
|
|
* 209.0 , 5.12861361e-12 , 3.,
|
|
* 210.0 , 1.00000000e-24 , 3.,
|
|
* 211.0 , 1.00000000e-24 , 3.,
|
|
* 222.0 , 1.00000000e-24 , 3.,
|
|
* 223.0 , 1.00000000e-24 , 3.,
|
|
* 226.1 , 1.00000000e-24 , 3.,
|
|
* 227.1 , 1.00000000e-24 , 3.,
|
|
* 232.0 , 1.20226443e-12 , 3.,
|
|
* 231.0 , 1.00000000e-24 , 3.,
|
|
* 238.0 , 3.23593651e-13 , 3.,
|
|
* 237.0 , 1.00000000e-24 , 3.,
|
|
* 244.0 , 1.00000000e-24 , 3.,
|
|
* 243.0 , 1.00000000e-24 , 3.,
|
|
* 247.0 , 1.00000000e-24 , 3.,
|
|
* 247.0 , 1.00000000e-24 , 3.,
|
|
* 251.0 , 1.00000000e-24 , 3.,
|
|
* 254.0 , 1.00000000e-24 , 3./
|
|
c
|
|
data abun0 /
|
|
* 12.00,10.93, 1.05, 1.38, 2.70, 8.39, 7.78, 8.66, 4.56, 7.84,
|
|
* 6.17, 7.53, 6.37, 7.51, 5.36, 7.14, 5.50, 6.18, 5.08, 6.31,
|
|
* 3.05, 4.90, 4.00, 5.64, 5.39, 7.45, 4.92, 6.23, 4.21, 4.60,
|
|
* 2.88, 3.58, 2.29, 3.33, 2.56, 3.28, 2.60, 2.92, 2.21, 2.59,
|
|
* 1.42, 1.92,-9.99, 1.84, 1.12, 1.69, 0.94, 1.77, 1.60, 2.00,
|
|
* 1.00, 2.19, 1.51, 2.27, 1.07, 2.17, 1.13, 1.58, 0.71, 1.45,
|
|
* -9.99, 1.01, 0.52, 1.12, 0.28, 1.14, 0.51, 0.93, 0.00, 1.08,
|
|
* 0.06, 0.88,-0.17, 1.11, 0.23, 1.45, 1.38, 1.64, 1.01, 1.13,
|
|
* 0.90, 2.00, 0.65,-9.99,-9.99,-9.99,-9.99,-9.99, 9.99, 0.06,
|
|
* -9.99,-0.52,-9.99,-9.99,-9.99,-9.99,-9.99,-9.99,-9.99/
|
|
c
|
|
data abun1 /
|
|
* 12.00,10.93, 3.26, 1.38, 2.79, 8.43, 7.83, 8.69, 4.56, 7.93,
|
|
* 6.24, 7.60, 6.45, 7.51, 5.41, 7.12, 5.50, 6.40, 5.08, 6.34,
|
|
* 3.15, 4.95, 3.93, 5.64, 5.43, 7.50, 4.99, 6.22, 4.19, 4.56,
|
|
* 3.04, 3.65, 2.30, 3.34, 2.54, 3.25, 2.36, 2.87, 2.21, 2.58,
|
|
* 1.46, 1.88,-9.99, 1.75, 1.06, 1.65, 1.20, 1.71, 0.76, 2.04,
|
|
* 1.01, 2.18, 1.55, 2.24, 1.08, 2.18, 1.10, 1.58, 0.72, 1.42,
|
|
* -9.99, 0.96, 0.52, 1.07, 0.30, 1.10, 0.48, 0.92, 0.10, 0.92,
|
|
* 0.10, 0.85,-0.12, 0.65, 0.26, 1.40, 1.38, 1.62, 0.80, 1.17,
|
|
* 0.77, 2.04, 0.65,-9.99,-9.99,-9.99,-9.99,-9.99,-9.99, 0.06,
|
|
* -9.99,-0.54,-9.99,-9.99,-9.99,-9.99,-9.99,-9.99,-9.99/
|
|
C
|
|
C
|
|
C Ionization potentials for first 99 species:
|
|
DATA XIo/
|
|
C
|
|
C Element Ionization potentials (eV)
|
|
C I II III IV V VI VII VIII
|
|
C
|
|
* 13.595, 0. , 0. , 0. , 0. , 0. , 0. , 0. ,
|
|
* 24.580, 54.400, 0. , 0. , 0. , 0. , 0. , 0. ,
|
|
* 5.392, 75.619,122.451, 0. , 0. , 0. , 0. , 0. ,
|
|
* 9.322, 18.206,153.850,217.713, 0. , 0. , 0. , 0. ,
|
|
* 8.296, 25.149, 37.920,259.298,340.22, 0. , 0. , 0. ,
|
|
* 11.264, 24.376, 47.864, 64.476,391.99,489.98, 0. , 0. ,
|
|
* 14.530, 29.593, 47.426, 77.450, 97.86,551.93,667.03, 0. ,
|
|
* 13.614, 35.108, 54.886, 77.394,113.87,138.08,739.11,871.39,
|
|
* 17.418, 34.980, 62.646, 87.140,114.21,157.12,185.14,953.6 ,
|
|
* 21.559, 41.070, 63.500, 97.020,126.30,157.91,207.21,239.0 ,
|
|
* 5.138, 47.290, 71.650, 98.880,138.37,172.09,208.44,264.16,
|
|
* 7.664, 15.030, 80.120,102.290,141.23,186.49,224.9 ,265.96,
|
|
* 5.984, 18.823, 28.440,119.960,153.77,190.42,241.38,284.53,
|
|
* 8.151, 16.350, 33.460, 45.140,166.73,205.11,246.41,303.07,
|
|
* 10.484, 19.720, 30.156, 51.354, 65.01,220.41,263.31,309.26,
|
|
* 10.357, 23.400, 35.000, 47.290, 72.50, 88.03,280.99,328.8 ,
|
|
* 12.970, 23.800, 39.900, 53.500, 67.80, 96.7 ,114.27,348.3 ,
|
|
* 15.755, 27.620, 40.900, 59.790, 75.00, 91.3 ,124.0 ,143.46,
|
|
* 4.339, 31.810, 46.000, 60.900, 82.6 , 99.7 ,118.0 ,155.0 ,
|
|
* 6.111, 11.870, 51.210, 67.700, 84.39,109.0 ,128.0 ,147.0 ,
|
|
* 6.560, 12.890, 24.750, 73.900, 92.0 ,111.1 ,138.0 ,158.7 ,
|
|
* 6.830, 13.630, 28.140, 43.240, 99.8 ,120.0 ,140.8 ,168.5 ,
|
|
* 6.740, 14.200, 29.700, 48.000, 65.2 ,128.9 ,151.0 ,173.7 ,
|
|
* 6.763, 16.490, 30.950, 49.600, 73.0 , 90.6 ,161.1 ,184.7 ,
|
|
* 7.432, 15.640, 33.690, 53.000, 76.0 , 97.0 ,119.24,196.46,
|
|
* 7.870, 16.183, 30.652, 54.800, 75.0 , 99.1 ,125.0 ,151.06,
|
|
* 7.860, 17.060, 33.490, 51.300, 79.5 ,102.0 ,129.0 ,157.0 ,
|
|
* 7.635, 18.168, 35.170, 54.900, 75.5 ,108.0 ,133.0 ,162.0 ,
|
|
* 7.726, 20.292, 36.830, 55.200, 79.9 ,103.0 ,139.0 ,166.0 ,
|
|
* 9.394, 17.964, 39.722, 59.400, 82.6 ,108.0 ,134.0 ,174.0 ,
|
|
* 6.000, 20.509, 30.700, 99.99,99.99,99.99,99.99,99.99,
|
|
* 7.89944,15.93462, 34.058, 45.715,99.99,99.99,99.99,99.99,
|
|
* 9.7887, 18.5892, 28.351, 99.99,99.99,99.99,99.99,99.99,
|
|
* 9.750,21.500, 32.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 11.839,21.600, 35.900, 99.99,99.99,99.99,99.99,99.99,
|
|
* 13.995,24.559, 36.900, 99.99,99.99,99.99,99.99,99.99,
|
|
* 4.175,27.500, 40.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 5.692,11.026, 43.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 6.2171,12.2236, 20.5244,60.607,99.99,99.99,99.99,99.99,
|
|
* 6.63390,13.13,23.17,34.418,80.348,99.99,99.99,99.99,
|
|
* 6.879,14.319, 25.039, 99.99,99.99,99.99,99.99,99.99,
|
|
* 7.099,16.149, 27.149, 99.99,99.99,99.99,99.99,99.99,
|
|
* 7.280,15.259, 30.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 7.364,16.759, 28.460, 99.99,99.99,99.99,99.99,99.99,
|
|
* 7.460,18.070, 31.049, 99.99,99.99,99.99,99.99,99.99,
|
|
* 8.329,19.419, 32.920, 99.99,99.99,99.99,99.99,99.99,
|
|
* 7.574,21.480, 34.819, 99.99,99.99,99.99,99.99,99.99,
|
|
* 8.990,16.903, 37.470, 99.99,99.99,99.99,99.99,99.99,
|
|
* 5.784,18.860, 28.029, 99.99,99.99,99.99,99.99,99.99,
|
|
* 7.342,14.627, 30.490,72.3,99.99,99.99,99.99,99.99,
|
|
* 8.639,16.500, 25.299,44.2,55.7,99.99,99.99,99.99,
|
|
* 9.0096,18.600, 27.96, 37.4,58.7,99.99,99.99,99.99,
|
|
* 10.454,19.090, 32.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 12.12984,20.975,31.05,45.,54.14,99.99,99.99,99.99,
|
|
* 3.893,25.100, 35.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 5.210,10.000, 37.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 5.580,11.060, 19.169, 99.99,99.99,99.99,99.99,99.99,
|
|
* 5.650,10.850, 20.080, 99.99,99.99,99.99,99.99,99.99,
|
|
* 5.419,10.550, 23.200, 99.99,99.99,99.99,99.99,99.99,
|
|
* 5.490,10.730, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 5.550,10.899, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 5.629,11.069, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 5.680,11.250, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 6.159,12.100, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 5.849,11.519, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 5.930,11.670, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 6.020,11.800, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 6.099,11.930, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 6.180,12.050, 23.700, 99.99,99.99,99.99,99.99,99.99,
|
|
* 6.250,12.170, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 6.099,13.899, 19.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 7.000,14.899, 23.299, 99.99,99.99,99.99,99.99,99.99,
|
|
* 7.879,16.200, 24.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 7.86404,17.700, 25.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 7.870,16.600, 26.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 8.500,17.000, 27.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 9.100,20.000, 28.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 8.95868,18.563,33.227, 99.99,99.99,99.99,99.99,99.99,
|
|
* 9.220,20.500, 30.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 10.430,18.750, 34.200, 99.99,99.99,99.99,99.99,99.99,
|
|
* 6.10829,20.4283,29.852,50.72,99.99,99.99,99.99,99.99,
|
|
* 7.416684,15.0325,31.9373,42.33,69.,99.99,99.99,99.99,
|
|
* 7.285519,16.679, 25.563,45.32,56.0,88.,99.99,99.99,
|
|
* 8.430,19.000, 27.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 9.300,20.000, 29.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 10.745,20.000, 30.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 4.000,22.000, 33.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 5.276,10.144, 34.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 6.900,12.100, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 6.000,12.000, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 6.000,12.000, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 6.000,12.000, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 6.000,12.000, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 6.000,12.000, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 6.000,12.000, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 6.000,12.000, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 6.000,12.000, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 6.000,12.000, 20.000, 99.99,99.99,99.99,99.99,99.99,
|
|
* 6.000,12.000, 20.000, 99.99,99.99,99.99,99.99,99.99/
|
|
C
|
|
c additional ionization potentials
|
|
c ix x xi xii xiii xiv xv xvi xvii
|
|
c
|
|
c energies added for Sc, Ti, V, Cr, Co,Ni, Cy,Zn
|
|
c source G. C. Rodrigues et al. ,
|
|
c Systematic calculation of total atomic energies of ground state configurations,
|
|
c Atomic Data and Nuclear Data Tables, Vol. 86, Issue 2, March 2004, P.117-233.
|
|
|
|
data xio2/
|
|
* 1103., 0., 0., 0., 0., 0., 0., 0., 0., ! F
|
|
* 1196., 1362., 0., 0., 0., 0., 0., 0., 0., ! Ne
|
|
* 300., 1465.,1649., 0., 0., 0., 0., 0., 0., ! Na
|
|
* 328., 367.,1762.,1963., 0., 0., 0., 0., 0., ! Mg
|
|
* 330., 398., 442.,2085.,2304., 0., 0., 0., 0., ! Al
|
|
* 351., 401., 476., 523.,2438.,2673., 0., 0., 0., ! Si
|
|
* 372., 424., 480., 560., 612.,2816.,3069., 0., 0., ! P
|
|
* 379., 447., 505., 565., 652., 707.,3223.,3494., 0., ! S
|
|
* 400., 456., 529., 592., 657., 750., 809.,3658.,3946., ! Cl
|
|
* 422., 479., 539., 618., 686., 756., 854., 918.,4121., ! Ar
|
|
* 176., 503., 564., 629., 714., 787., 862., 968.,1034., ! K
|
|
* 188., 211., 591., 656., 726., 817., 895., 974.,1087., ! Ca
|
|
* 180., 225., 250., 686., 755., 830., 926.,1010.,1094., ! Sc
|
|
* 193., 216., 265., 291., 787., 861., 940.,1042.,1132., ! Ti
|
|
* 206., 230., 255., 308., 336., 896., 974.,1060.,1165., ! V
|
|
* 209., 244., 271., 298., 355., 384.,1010.,1095.,1185., ! Cr
|
|
* 222., 248., 286., 314., 344., 404., 435.,1136.,1222., ! Mn
|
|
* 235., 262., 290., 331., 361., 392., 457., 490.,1266., ! Fe
|
|
* 186., 276., 305., 336., 379., 411., 444., 512., 547., ! Co
|
|
* 193., 224., 321., 352., 384., 430., 464., 499., 571., ! Ni
|
|
* 199., 232., 266., 369., 401., 435., 484., 520., 557., ! Cu
|
|
* 203., 238., 274., 311., 420., 454., 490., 542., 579./ ! Zn
|
|
c
|
|
c even higher ionization potentials
|
|
c 18 19 20 21 22 23 24 25 26
|
|
c
|
|
data xio3/
|
|
* 4426., 0., 0., 0., 0., 0., 0., 0., 0., ! Ar
|
|
* 4611., 4934., 0., 0., 0., 0., 0., 0., 0., ! K
|
|
* 1158., 5129.,5470., 0., 0., 0., 0., 0., 0., ! Ca
|
|
* 1206., 1288.,5675.,6034., 0., 0., 0., 0., 0., ! Sc
|
|
* 1222., 1346.,1425.,6249., 0., 0., 0., 0., 0., ! Ti
|
|
* 1261., 1356.,1480.,1569., 0., 0., 0., 0., 0., ! V
|
|
* 1294., 1397.,1497.,1627., 0., 0., 0., 0., 0., ! Cr
|
|
* 1318., 1431.,1540.,1645.,1782., 0., 0., 0., 0., ! Mn
|
|
* 1357., 1459.,1574.,1689.,1799.,1958.,2346.,8828.,9278., ! Fe
|
|
* 1396., 1496.,1603.,1723.,1847.,1963.,2112., 0., 0., ! Co
|
|
* 606., 1538.,1643.,1756.,1880.,2011.,2133.,2288., 0., ! Ni
|
|
* 628., 670.,1688.,1797.,1915.,2043.,2183.,2310.,2472., ! Cu
|
|
* 616., 693., 737.,1844.,1958.,2082.,2214.,2362.,2494./ ! Zn
|
|
C
|
|
C
|
|
C data for additional ionization potentials for the Opacity
|
|
C project species (IDAT sets the internal OP indexing)
|
|
C
|
|
data idat / 1, 2, 0, 0, 0, 3, 4, 5, 0, 6,
|
|
* 7, 8, 9,10, 0,11, 0,12, 0,13,
|
|
* 0, 0, 0,14,15,16, 0,17,0,0/
|
|
data u10/173.93,330.391,511.8,783.3,1018.,1273.8,1671.792,
|
|
* 1928.462,9645.005,10986.876/
|
|
data u11/41.449,381.395,577.8,797.8,1116.2,1388.5,1681.5,2130.8,
|
|
* 2418.7,11817.061,13297.676/
|
|
data u12/61.671,121.268,646.41,881.1,1139.4,1504.3,1814.3,2144.7,
|
|
* 2645.2,2964.4,14210.261,15829.951/
|
|
data u13/48.278,151.86,229.446,967.8,1239.8,1536.3,1947.3,2295.4,
|
|
* 2663.4,3214.8,3565.6,16825.022,18584.138/
|
|
data u14/65.748,131.838,270.139,364.093,1345.1,1653.9,1988.4,
|
|
* 2445.3,2831.9,3237.8,3839.8,4222.4,19661.693,21560.63/
|
|
data u16/83.558,188.2,280.9,381.541,586.2,710.184,2265.9,2647.4,
|
|
* 3057.7,3606.1,4071.4,4554.3,5255.9,5703.6,26002.663,
|
|
* 28182.535/
|
|
data u18/127.11,222.848,328.6,482.4,605.1,734.04,1002.73,1157.08,
|
|
* 3407.3,3860.9,4347.,4986.6,5533.8,6095.5,6894.2,7404.4,
|
|
* 33237.173,35699.936/
|
|
data u20/49.306,95.752,410.642,542.6,681.6,877.4,1026.,1187.6,
|
|
* 1520.64,1704.047,4774.,5301.,5861.,6595.,7215.,7860.,
|
|
* 8770.,9338.,41366.,44177.41/
|
|
data u24/54.576,132.966,249.7,396.5,560.2,731.02,1291.9,1490.,
|
|
* 1688.,1971.,2184.,2404.,2862.,3098.52,8151.,8850.,
|
|
* 9560.,10480.,11260.,12070.,13180.,13882.,60344.,63675.9/
|
|
data u25/59.959,126.145,271.55,413.,584.,771.1,961.44,1569.,
|
|
* 1789.,2003.,2307.,2536.,2771.,3250.,3509.82,9152.,
|
|
* 9872.,10620.,11590.,12410.,13260.,14420.,15162.,
|
|
* 65660.,69137.4/
|
|
data u26/63.737,130.563,247.22,442.,605.,799.,1008.,1218.38,
|
|
* 1884.,2114.,2341.,2668.,2912.,3163.,3686.,3946.82,
|
|
* 10180.,10985.,11850.,12708.,13620.,14510.,15797.,
|
|
* 16500.,71203.,74829.6/
|
|
data u28/61.6,146.542,283.8,443.,613.5,870.,1070.,1310.,1560.,
|
|
* 1812.,2589.,2840.,3100.,3470.,3740.,4020.,4606.,
|
|
* 4896.2,12430.,13290.,14160.,15280.,16220.,17190.,
|
|
* 18510.,19351.,82984.,86909.4/
|
|
C
|
|
IF(MODE.NE.0) GO TO 50
|
|
C
|
|
C For MODE=0, STATE serves as an auxiliary procedure for START
|
|
C Input of basic parameters for individual chemical species
|
|
C
|
|
C An element (hydrogen through zinc) can be considered in one of
|
|
C the three following options:
|
|
C 1. explicitly - some of energy levels of some of its ionization
|
|
C states are considered explicitly, ie. their
|
|
C populations are determined by solving statistical
|
|
C equilibrium
|
|
C 2. implicitly - the atom is assumed not to contribute to
|
|
C opacity; but is allowed to contribute to the
|
|
C total number of particles and to the total charge;
|
|
C the latter is evaluated assuming LTE ionization
|
|
C balance, ie. by solving a set of Saha equations
|
|
C 3. not considered at all
|
|
C
|
|
C Input:
|
|
C NATOMS - the highest atomic number of an element that is
|
|
C considered (explicitly or non-explicitly)
|
|
C < 0 - then NATOMS=-NATOMS, and all Opacity Project
|
|
C species are treated as with MODPF>0, i.e.
|
|
C their partition functions are evaluated from
|
|
C the Opacity Project ionization fractions
|
|
C
|
|
C For each element from 1 (hydrogen) to NATOMS, the following
|
|
C parameters:
|
|
C
|
|
C MA = 0 - if the element is not considered (option 3)
|
|
C = 1 - if the element is non-explicit (option 2)
|
|
C = 2 - if the element is explicit (option 1)
|
|
C ABN - if ABN=0, solar abundance is assumed (given above;
|
|
C abundance here is assumed as relative
|
|
C to hydrogen by number
|
|
C if ABN>0, non-solar abundance ABN is assumed; in an
|
|
C arbitrary scale
|
|
C if ABN<0, non-solar abundance ABN is assumed;
|
|
C (-ABN times the solar value)
|
|
C if ABN>1.e6, depth-dpendent abundance (additional input)
|
|
C
|
|
iabset=0
|
|
read(ibuff,'(a80)') dum
|
|
read(dum,*,iostat=kstat) natoms,iabset
|
|
if(kstat.ne.0) READ(dum,*) NATOMS
|
|
if(natoms.eq.0) then
|
|
do id=1,nd
|
|
ytot(id)=1.11
|
|
wmy(id)=1.41
|
|
wmm(id)=2.17e-24
|
|
end do
|
|
iatref=0
|
|
return
|
|
end if
|
|
c
|
|
do i=1,matom
|
|
iadop(i)=0
|
|
if(iabset.eq.1) then
|
|
d(2,i)=10.**(abun1(i)-12.)
|
|
else if(iabset.ne.2) then
|
|
d(2,i)=10.**(abun0(i)-12.)
|
|
end if
|
|
end do
|
|
c
|
|
WRITE(6,600)
|
|
IAT=0
|
|
IREFA=0
|
|
IFOPPF=0
|
|
IF(NATOMS.LT.0) THEN
|
|
NATOMS=-NATOMS
|
|
IFOPPF=2
|
|
END IF
|
|
C
|
|
natms=natoms
|
|
if(ifmol.gt.0) natms=92
|
|
DO 20 I=1,NATMS
|
|
LGR(I)=.TRUE.
|
|
LRM(I)=.TRUE.
|
|
IATEX(I)=-1
|
|
if(i.le.natoms) then
|
|
READ(IBUFF,*) MA,ABN,MODPF0
|
|
else
|
|
ma=1
|
|
abn=0.
|
|
modpf0=0
|
|
end if
|
|
c IF(MA.EQ.0) GO TO 20
|
|
TYPAT(I)=DYP(I)
|
|
AMAS(I)=D(1,I)
|
|
ABND(I)=D(2,I)
|
|
IF(MA.EQ.0.or.i.gt.natoms) then
|
|
abnd(i)=d(2,i)*1.e-10
|
|
enev(i,1)=xio(1,i)
|
|
enev(i,2)=xio(2,i)
|
|
amas(i)=d(1,i)
|
|
DO ID=1,ND
|
|
ABNDD(I,ID)=ABND(I)
|
|
END DO
|
|
GO TO 20
|
|
end if
|
|
IONIZ(I)=int(D(3,I))
|
|
MODPF(I)=MODPF0
|
|
C
|
|
C increase the standard highest ionization for Teff larger
|
|
C than 50000 K for N, O, Ne, and Fe
|
|
C
|
|
IF(TEFF.GT.5.D4) THEN
|
|
IF(I.EQ.7) IONIZ(I)=6
|
|
IF(I.EQ.8) IONIZ(I)=7
|
|
IF(I.EQ.10) IONIZ(I)=9
|
|
IF(I.EQ.26) IONIZ(I)=9
|
|
END IF
|
|
C
|
|
DO J=1,8
|
|
ENEV(I,J)=xio(J,I)
|
|
END DO
|
|
c
|
|
if(i.ge.9.and.i.le.30) then
|
|
do j=9,17
|
|
enev(i,j)=xio2(j-8,i-8)
|
|
end do
|
|
endif
|
|
if(i.ge.18.and.i.le.30) then
|
|
do j=18,26
|
|
enev(i,j)=xio3(j-17,i-17)
|
|
end do
|
|
end if
|
|
c
|
|
LGR(I)=.FALSE.
|
|
IF(MODPF(I).GT.0) IFOPPF=1
|
|
IF(IFOPPF.EQ.2.and.idat(i).gt.0) MODPF(I)=1
|
|
if(modpf(i).gt.0) then
|
|
if(idat(i).eq.0) modpf(i)=0
|
|
if(modpf(i).gt.0) then
|
|
ioniz(i)=i+1
|
|
if(i.ge.10) then
|
|
do j=9,i
|
|
enev(i,j)=uu(j,idat(i))*0.1239529d0
|
|
end do
|
|
end if
|
|
end if
|
|
end if
|
|
IF(ABN.GT.0) ABND(I)=ABN
|
|
IF(ABN.LT.0) ABND(I)=ABS(ABN)*D(2,I)
|
|
IF(ION.NE.0) IONIZ(I)=ION
|
|
IF(ABN.GT.1.E6) THEN
|
|
READ(IBUFF,*) (ABNDD(I,ID),ID=1,ND)
|
|
ELSE
|
|
DO ID=1,ND
|
|
ABNDD(I,ID)=ABND(I)
|
|
END DO
|
|
END IF
|
|
IF(MA.EQ.1) THEN
|
|
LRM(I)=.FALSE.
|
|
IATEX(I)=0
|
|
ELSE
|
|
IAT=IAT+1
|
|
IIFIX(IAT)=0
|
|
IF(MA.LE.-2) IIFIX(IAT)=1
|
|
IATEX(I)=IAT
|
|
IF(IAT.EQ.IATREF) THEN
|
|
IREFA=I
|
|
DO ID=1,ND
|
|
ABNREF(ID)=ABNDD(I,ID)
|
|
END DO
|
|
END IF
|
|
C
|
|
C store parameters for explicit atoms
|
|
C
|
|
AMASS(IAT)=AMAS(I)*HMASS
|
|
NUMAT(IAT)=I
|
|
if(iabs(ma).eq.3) iadop(i)=1
|
|
END IF
|
|
20 CONTINUE
|
|
C
|
|
C renormalize abundances to have the standard element abundance
|
|
C equal to unity
|
|
C
|
|
if(abnref(1).eq.0.or.ioptab.gt.0) then
|
|
do id=1,nd
|
|
abnref(id)=1.
|
|
end do
|
|
end if
|
|
c
|
|
DO 30 I=1,NATOMS
|
|
IAT=IATEX(I)
|
|
IF(IAT.LT.0) GO TO 30
|
|
DO ID=1,ND
|
|
ABNDD(I,ID)=ABNDD(I,ID)/ABNREF(ID)
|
|
YTOT(ID)=YTOT(ID)+ABNDD(I,ID)
|
|
WMY(ID)=WMY(ID)+ABNDD(I,ID)*AMAS(I)
|
|
END DO
|
|
ABNR=ABND(I)/D(2,I)
|
|
IF(IAT.EQ.0) THEN
|
|
WRITE(6,601) I,TYPAT(I),ABND(I),ABNR
|
|
ELSE
|
|
DO ID=1,ND
|
|
ABUND(IAT,ID)=ABNDD(I,ID)
|
|
END DO
|
|
WRITE(6,602) I,TYPAT(I),ABND(I),ABNR,IAT
|
|
END IF
|
|
30 CONTINUE
|
|
DO ID=1,ND
|
|
WMM(ID)=WMY(ID)*HMASS/YTOT(ID)
|
|
END DO
|
|
c
|
|
c initialization of the Opacity Project ionization fractions
|
|
c (if required)
|
|
c
|
|
if(ifoppf.gt.0) call opfrac(0,0,t,ane,pf,fra)
|
|
c
|
|
600 FORMAT(/' '/' CHEMICAL ELEMENTS INCLUDED'/
|
|
* ' --------------------------'//
|
|
* ' NUMBER ELEMENT ABUNDANCE'/1H ,16X,
|
|
* 'A=N(ELEM)/N(H) A/A(SOLAR)'/)
|
|
601 FORMAT(1H ,I4,3X,A5,1P2E14.2)
|
|
602 FORMAT(1H ,I4,3X,A5,1P2E14.2,3X,
|
|
* 'EXPLICIT: IAT=',I3)
|
|
RETURN
|
|
C
|
|
50 TLN=LOG(T)*TRHA
|
|
TK=BOLK*T
|
|
TKLN15=TRHA*LOG(TK)
|
|
ENTCON=103.973
|
|
THET=TH0/T
|
|
THL=THL0*THET
|
|
XMX=XMX0*SQRT(SQRT(T/ANE))
|
|
DCH=EH/(XMX*XMX*TK)
|
|
Q=0.
|
|
QM=0.
|
|
DQT=0.
|
|
DQN=0.
|
|
DQM=0.
|
|
ENER=0.
|
|
ENTR=0.
|
|
hpop=dens(id)/wmm(id)/ytot(id)
|
|
DO 70 I=1,NATOMS
|
|
IF(MODE.GT.1.AND.LRM(I).OR.MODE.EQ.1.AND.LGR(I)) GO TO 70
|
|
ION=IONIZ(I)
|
|
DRQT=0.
|
|
DRQN=0.
|
|
DRST=0.
|
|
DRSN=0.
|
|
DFT=0.
|
|
DFN=0.
|
|
ENTOT(1)=0.
|
|
RS=UN
|
|
CALL PARTF(I,1,T,ANE,XMX,UM,DUTM,DUNM)
|
|
if(i.eq.1) pfhyd=max(um,two)
|
|
pfstu(1)=um
|
|
pfstt(1)=dutm
|
|
pfstn(1)=dunm
|
|
JMAX=1
|
|
DO J=2,ION
|
|
J1=J-1
|
|
DCHT=DCH*J1
|
|
TE=ENEV(I,J1)*THL
|
|
ENTOT(J)=ENTOT(J1)+TE
|
|
dcht=0.
|
|
FI=FI0+TLN-TE+DCHT
|
|
X=J
|
|
XMAX=XMX*SQRT(X)
|
|
CALL PARTF(I,J,T,ANE,XMAX,U,DUT,DUN)
|
|
pfstu(j)=u
|
|
pfstt(j)=dut
|
|
pfstn(j)=dun
|
|
FFI(J)=0.
|
|
IF(FI.GT.-20.) FFI(J)=EXP(FI)*U/UM/ANE
|
|
IF(FFI(J).GT.UN) JMAX=J
|
|
UM=U
|
|
END DO
|
|
RQ=JMAX-1
|
|
RI=ENTOT(JMAX)
|
|
RE=PFSTT(JMAX)/PFSTU(JMAX)*T
|
|
if(jmax.lt.ion) then
|
|
R=UN
|
|
DO J=JMAX+1,ION
|
|
J1=J-1
|
|
DCHT=DCH*J1
|
|
TE=ENEV(I,J1)*THL
|
|
R=R*FFI(J)
|
|
c RR(I,J)=R/pfstu(j)
|
|
RR(I,J)=R
|
|
RS=RS+R
|
|
RQ=RQ+J1*R
|
|
RI=RI+R*ENTOT(J)
|
|
RE=RE+R*PFSTT(J)/PFSTU(J)*T
|
|
DFIT=pfstt(j)/pfstu(j)-pfstt(j1)/pfstu(j1)
|
|
. +(TRHA+TE-TRHA*DCHT)/T
|
|
DFIN=pfstn(j)/pfstu(j)-pfstn(j1)/pfstu(j1)
|
|
. +(HALF*DCHT-UN)/ANE
|
|
DFT=DFT+DFIT
|
|
DFN=DFN+DFIN
|
|
DFIT=DFT*R
|
|
DFIN=DFN*R
|
|
DRST=DRST+DFIT
|
|
DRSN=DRSN+DFIN
|
|
DRQT=DRQT+J1*DFIT
|
|
DRQN=DRQN+J1*DFIN
|
|
END DO
|
|
end if
|
|
if(jmax.gt.1) then
|
|
R=UN
|
|
DFT=0.
|
|
DFN=0.
|
|
jmin=min(4,jmax-1)
|
|
DO JJ=1,JMIN
|
|
J=JMAX-JJ
|
|
J1=J-1
|
|
JP1=J+1
|
|
DCHT=DCH*J
|
|
TE=ENEV(I,J)*THL
|
|
R=R/FFI(JP1)
|
|
C RR(I,J)=R/pfstu(j)
|
|
RR(I,J)=R
|
|
RS=RS+R
|
|
RQ=RQ+J1*R
|
|
RI=RI+R*ENTOT(J)
|
|
RE=RE+R*PFSTT(J)/PFSTU(J)*T
|
|
DFIT=pfstt(jp1)/pfstu(jp1)-pfstt(j)/pfstu(j)
|
|
* +(TRHA+TE-TRHA*DCHT)/T
|
|
DFIN=pfstn(jp1)/pfstu(jp1)-pfstn(j)/pfstu(j)
|
|
* +(HALF*DCHT-UN)/ANE
|
|
DFT=DFT-DFIT
|
|
DFN=DFN-DFIN
|
|
DFIT=DFT*R
|
|
DFIN=DFN*R
|
|
DRST=DRST+DFIT
|
|
DRSN=DRSN+DFIN
|
|
DRQT=DRQT+J1*DFIT
|
|
DRQN=DRQN+J1*DFIN
|
|
END DO
|
|
endif
|
|
X=RQ/RS
|
|
ABND(I)=ABNDD(I,ID)
|
|
X1=ABND(I)/RS
|
|
RR(I,JMAX)=X1
|
|
DO J=1,ION
|
|
IF(J.NE.JMAX) RR(I,J)=RR(I,J)*X1
|
|
END DO
|
|
c RR(I,JMAX)=RR(I,JMAX)/PFSTU(JMAX)
|
|
c
|
|
c internal energy and entropy (per 1 hydrogen atom)
|
|
c
|
|
chip=0
|
|
c antm=(anta-ane)/ytot(id)
|
|
c do j=1,ion
|
|
do j=1,2
|
|
dulog=0.
|
|
c aden=rr(i,j)*antm
|
|
if(aden.lt.1.e-20) aden=1.e-20
|
|
if(pfstu(j).lt.un) pfstu(j)=un
|
|
if(pfstt(j).gt.0.) dulog=pfstt(j)*t/pfstu(j)
|
|
ener=ener+(chip*ev2erg+tk*dulog)*aden
|
|
entr=entr+(tkln15-log(aden)+log(pfstu(j))+
|
|
* trha*log(amas(i))+dulog+entcon)*aden
|
|
c entr=entr+(tkln15+log(pfstu(j))+
|
|
c * trha*log(amas(i))+dulog+entcon)*aden
|
|
chip=chip+enev(i,j)
|
|
end do
|
|
c
|
|
aref=dens(id)/wmm(id)/ytot(id)
|
|
c
|
|
rr(i,99)=0.
|
|
if(irefa.eq.0) irefa=1
|
|
IF(I.EQ.IREFA) THEN
|
|
QREF=X*ABND(I)
|
|
c DQTR=(DRQT-X*DRST)*X1
|
|
c DQNR=(DRQN-X*DRSN)*X1
|
|
ELSE
|
|
Q=X*ABND(I)+Q
|
|
c DQT=DQT+(DRQT-X*DRST)*X1
|
|
c DQN=DQN+(DRQN-X*DRSN)*X1
|
|
END IF
|
|
do j=2,ion
|
|
rr(i,99)=rr(i,99)+rr(i,j)*aref
|
|
end do
|
|
70 CONTINUE
|
|
c
|
|
c
|
|
c entropy of electrons
|
|
c
|
|
c entel=tkln15-log(ane)+1.5*log(emass(99))+entcon
|
|
entel=tkln15-log(ane)-11.2622+entcon
|
|
entr=entr+entel*ane
|
|
C
|
|
C Negative hydrogen ion
|
|
C
|
|
c IF(IHM.EQ.1) THEN
|
|
tinv=un/t
|
|
QM=C1QM*Tinv/SQRT(T)*EXP(C2QM*Tinv)
|
|
DQM=-QM*Tinv*(TRHA+C2QM*Tinv)
|
|
c END IF
|
|
RETURN
|
|
END
|
|
c
|
|
c
|
|
c **************************************************
|
|
c
|
|
c
|
|
|
|
SUBROUTINE INPMOD
|
|
C =================
|
|
C
|
|
C Read an initial model atmosphere from unit 8
|
|
C File 8 contains:
|
|
C 1. NDPTH - number of depth points in which the initial model is
|
|
C given (if not equal to ND, routine interpolates
|
|
C automatically to the set DM by linear interpolation
|
|
C in log(DM)
|
|
C NUMPAR - number of input model parameters in each depth
|
|
C = 3 for LTE model - ie. N, T, N(electron);
|
|
C > 3 for NLTE model)
|
|
C 2. DEPTH(ID),ID=1,NDPTH - mass-depth points for the input model
|
|
C 3. for each depth:
|
|
C T - temperature
|
|
C ANE - electron density
|
|
C RHO - mass density
|
|
C level populations - only for NLTE input model
|
|
C Number of input level populations need not be
|
|
C equal to NLEVEL; in that case the procedure
|
|
C CHANGE is called from START to calculate the
|
|
C remaining level populations
|
|
C
|
|
C Note: The output file 7, which is created by this program
|
|
C (procedure OUTPUT) has the same structure as file 8
|
|
C and may thus be used as input to another run of the
|
|
C program
|
|
C
|
|
C INTRPL - switch indicating whether (and, if so, how) interpolate
|
|
C the initial model if the depth scales for the input model
|
|
C and the present depth scale are different
|
|
C = 0 - no interpolation, scale DEPTH replaces DM;
|
|
C i.e. DEPTH will be used as DM, regardless of which
|
|
C values of DM were read in subroutine START
|
|
C > 0 - polynomial interpolation of the (INTRPL-1)th order
|
|
C
|
|
C < 0 - reads different initial models (eg. -1 : Kurucz model)
|
|
C
|
|
C If INTRPL > 0, there is an additional input from unit 8, namely
|
|
C new depth scale DM, the one which will be used in the present run
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (MINPUT=MLEVEL+5,
|
|
* MDEPTI=MDEPTH)
|
|
common/eospar/anmol(600,mdepth),
|
|
* anato(100,mdepth),
|
|
* anion(100,mdepth)
|
|
COMMON POPUL0(MLEVEL,MDEPTI),ESEMAT(MLEVEL,MLEVEL),BESE(MLEVEL),
|
|
* TEMP0(MDEPTI),ELEC0(MDEPTI),DENS0(MDEPTI),PPL0(MDEPTI),
|
|
* DEPTH(MDEPTI),PPL(MDEPTH),POPLTE(MLEVEL),X(MINPUT),
|
|
* ZD0(MDEPTH)
|
|
dimension a(mlevel,mlevel),b(mlevel),iifor0(mlevel)
|
|
C
|
|
LCHC0=LCHC
|
|
LCHC=.TRUE.
|
|
LTE0=LTE
|
|
LTE=.TRUE.
|
|
NUMLT=3
|
|
IF(IDISK.EQ.1) NUMLT=4
|
|
IF(IFMOL.GT.0) NUMLT=NUMLT+1
|
|
RRDIL=1.
|
|
TEMPBD=0.
|
|
IF(INTRPL.GE.0) THEN
|
|
READ(8,*) NDPTH,NUMPAR
|
|
ND=NDPTH
|
|
IF(NDPTH.LE.0) CALL QUIT('NDPTH.LE.0 in Unit 8',ndpth,0)
|
|
IF(NDPTH.GT.MDEPTI)
|
|
* CALL QUIT('NDPTH.GT.MDEPTI in Unit 8',ndpth,mdepti)
|
|
READ(8,*) (DM(ID),ID=1,ND)
|
|
IDSTD=0
|
|
NUMP=ABS(NUMPAR)
|
|
DO ID=1,NDPTH
|
|
READ(8,*) (X(I),I=1,NUMP)
|
|
do i=1,nump
|
|
if(x(i).lt.0.) x(i)=0.
|
|
end do
|
|
TEMP(ID)=X(1)
|
|
ELEC(ID)=X(2)
|
|
DENS(ID)=X(3)
|
|
TOTN(ID)=DENS(ID)/WMM(ID)+ELEC(ID)
|
|
IP=3
|
|
IF(NUMPAR.LT.0) THEN
|
|
IP=IP+1
|
|
TOTN(ID)=X(IP)
|
|
END IF
|
|
IF(IDISK.EQ.1) THEN
|
|
IP=IP+1
|
|
ZD(ID)=X(IP)
|
|
END IF
|
|
IF(TEMP(ID).LT.TEFF) IDSTD=ID
|
|
c IF(NUMP.GT.IP.AND..NOT.LTE0.AND.ICHANG.NE.-2) THEN
|
|
t=temp(id)
|
|
if(ifmol.gt.0.and.t.lt.tmolim) then
|
|
ipri=1
|
|
aein=elec(id)
|
|
an=totn(id)
|
|
call moleq(id,t,an,aein,ane,enrg,entt,wm,ipri)
|
|
end if
|
|
IF(NUMP.GT.IP) THEN
|
|
NLEV0=NUMP-IP
|
|
DO I=1,NLEV0
|
|
POPUL(I,ID)=X(NUMLT+I)
|
|
END DO
|
|
ELSE
|
|
NLEV0=NLEVEL
|
|
CALL WNSTOR(ID)
|
|
CALL SABOLF(ID)
|
|
DO I=1,NLEV0
|
|
IIFOR0(I)=I
|
|
END DO
|
|
CALL RATMAT(ID,IIFOR0,-1,A,B)
|
|
CALL LEVSOL(A,B,POPLTE,IIFOR0,NLEV0,1)
|
|
DO I=1,NLEV0
|
|
POPUL(I,ID)=POPLTE(I)
|
|
END DO
|
|
if(ifmol.le.0.or.t.ge.tmolim) then
|
|
if(n0hn.gt.0) then
|
|
anato(1,id)=popul(n0hn,id)
|
|
else
|
|
anato(1,id)=dens(id)/wmm(id)/ytot(id)
|
|
end if
|
|
if(iathe.gt.0) then
|
|
anato(2,id)=popul(n0a(iathe),id)
|
|
else
|
|
anato(2,id)=dens(id)/wmm(id)/ytot(id)*abndd(2,id)
|
|
end if
|
|
end if
|
|
c
|
|
|
|
END IF
|
|
END DO
|
|
ELSTD=ELEC(IDSTD)
|
|
READ(8,*,END=10,ERR=10) INTRPL
|
|
ELSE IF(INTRPL.GT.-10) THEN
|
|
CALL KURUCZ(NDPTH)
|
|
NUMPAR=3
|
|
IF(ND.NE.NDPTH .AND. INTRPL.EQ.0)
|
|
* CALL QUIT('ND.NE.NDPTH in KURUCZ',nd,ndpth)
|
|
ELSE
|
|
CALL INCLDY(NDPTH)
|
|
NUMPAR=3
|
|
IF(ND.NE.NDPTH .AND. INTRPL.EQ.0)
|
|
* CALL QUIT('ND.NE.NDPTH in INCLDY',nd,ndpth)
|
|
END IF
|
|
10 LCHC=LCHC0
|
|
LTE=LTE0
|
|
C
|
|
IF(IDISK.EQ.1) THEN
|
|
ZND=ZD(ND)
|
|
IF(ZND.GT.0.) IFZ0=-1
|
|
END IF
|
|
c
|
|
c !!!!! attention - temporary fix
|
|
c
|
|
if(idisk.eq.1) zd(nd)=0.
|
|
C
|
|
c
|
|
if(ioptab.ge.0) return
|
|
IF(IOPTAB.LT.0) RETURN
|
|
do id=1,nd
|
|
ptotal(id)=dm(id)*grav
|
|
an=ptotal(id)/(bolk*temp(id))
|
|
elec(id)=1.e-16*an
|
|
wmm(id)=dens(id)/an
|
|
end do
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE KURUCZ(NDPTH)
|
|
C ========================
|
|
C
|
|
C Read an initial model atmosphere from unit 8
|
|
C in Kurucz ATLAS' format
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (MINPUT=7)
|
|
CHARACTER KUR*15
|
|
DIMENSION KKFIX0(MLEVEL)
|
|
COMMON POPUL0(MLEVEL,MDEPTH),ESEMAT(MLEVEL,MLEVEL),BESE(MLEVEL),
|
|
* TEMP0(MDEPTH),ELEC0(MDEPTH),DENS0(MDEPTH),PPL0(MDEPTH),
|
|
* DEPTH(MDEPTH),PPL(MDEPTH),POPLTE(MLEVEL),X(MINPUT)
|
|
common/temlim/tfloor
|
|
dimension a(mlevel,mlevel),b(mlevel),iifor0(mlevel)
|
|
C
|
|
do iat=1,natom
|
|
kkfix0(iat)=iifix(iat)
|
|
iifix(iat)=0
|
|
end do
|
|
nlev0=nlevel
|
|
LCHC0=LCHC
|
|
LCHC=.TRUE.
|
|
LTE0=LTE
|
|
LTE=.TRUE.
|
|
C
|
|
if(ifixde.gt.0) then
|
|
READ(8,551) TEF,GRAV
|
|
WRITE(6,600) TEF,GRAV
|
|
READ(8,552) ND
|
|
ND=ND-1
|
|
c write(6,553) nd
|
|
551 FORMAT(4X,F8.0,9X,F8.5)
|
|
552 FORMAT(/////////////////////10X,I3/)
|
|
c 553 format(' nd',i4)
|
|
C
|
|
600 FORMAT(1H1,' INPUT KURUCZ MODEL FOR TEFF=',F7.0,' LOG G =',
|
|
* F7.2//1H ,7X,'MASS',9X,'T',9X,'P',9X,'DENS',9X,'ELEC'//)
|
|
DO ID=1,ND
|
|
READ(8,*) DM(ID),TEMP(ID),P,ane0,a1,a2,a3,vel,rho
|
|
if(temp(id).lt.tfloor) temp(id)=tfloor
|
|
CALL RHONEN(ID,TEMP(ID),RHO,AN,ANE)
|
|
c ELEC(ID)=ANE0
|
|
ELEC(ID)=ANE
|
|
DENS(ID)=RHO
|
|
TOTN(ID)=DENS(ID)/WMM(ID)+ELEC(ID)
|
|
an=rho/wmm(id)+ane0
|
|
rho0=WMM(ID)*(AN-ELEC(ID))
|
|
WRITE(6,651) ID,DM(ID),TEMP(ID),P,DENS(ID),ELEC(ID),rho0,an
|
|
CALL WNSTOR(ID)
|
|
CALL SABOLF(ID)
|
|
DO I=1,NLEV0
|
|
IIFOR0(I)=I
|
|
END DO
|
|
CALL RATMAT(ID,IIFOR0,-1,A,B)
|
|
CALL LEVSOL(A,B,POPLTE,IIFOR0,NLEV0,1)
|
|
DO I=1,NLEV0
|
|
POPUL(I,ID)=POPLTE(I)
|
|
END DO
|
|
end do
|
|
c write(6,553) nd
|
|
go to 100
|
|
end if
|
|
651 FORMAT(1H ,I5,1PE10.3,0PF10.1,1P5D12.3)
|
|
c
|
|
READ(8,801) KUR,GRAVK
|
|
READ(KUR,802) TEFFK
|
|
801 FORMAT(A15,6X,F8.5)
|
|
802 FORMAT(4X,F8.0)
|
|
C
|
|
IF(KUR(1:4).NE.'TEFF')
|
|
* CALL QUIT(' Unit 8 is NOT a Kurucz model as expected',0,0)
|
|
IF(ABS(TEFFK-TEFF).GT.50.) then
|
|
ieff=int(teff)
|
|
ieffk=int(teffk)
|
|
c CALL QUIT(' Teff not corresponding to Kurucz model',ieff,ieffk)
|
|
END IF
|
|
IF(ABS(GRAVK-LOG10(GRAV)).GT.0.02) then
|
|
irav=int(log10(grav)+0.001)
|
|
iravk=int(gravk)
|
|
c CALL QUIT(' Gravity not corresponding to Kurucz model',
|
|
c * irav,iravk)
|
|
END IF
|
|
C
|
|
DO WHILE(KUR(1:9).NE.'READ DECK')
|
|
READ(8,'(A15)') KUR
|
|
END DO
|
|
READ(KUR,803) NDPTH
|
|
803 FORMAT(10X,I3)
|
|
NDPTH=NDPTH-1
|
|
NUMPAR=3
|
|
NLEV0=NLEVEL
|
|
READ(8,*) TTT
|
|
IF(NDPTH.gt.mdepth.and.intrpl.eq.0)
|
|
* CALL QUIT('ndpth.gt.mdepth in KURUCZ',ndpth,mdepth)
|
|
DO ID=1,NDPTH
|
|
READ(8,*) (X(I),I=1,MINPUT)
|
|
DEPTH(ID)=X(1)
|
|
TEMP0(ID)=X(2)
|
|
ELEC0(ID)=X(4)
|
|
AN=X(3)/BOLK/TEMP0(ID)
|
|
DENS0(ID)=WMM(ID)*(AN-ELEC0(ID))
|
|
TEMP(ID)=TEMP0(ID)
|
|
ELEC(ID)=ELEC0(ID)
|
|
DENS(ID)=DENS0(ID)
|
|
ANMA(ID)=DENS(ID)/WMM(ID)
|
|
ANTO(ID)=ANMA(ID)+ELEC(ID)
|
|
TOTN(ID)=ANTO(ID)
|
|
T=TEMP(ID)
|
|
IF(IFMOL.GT.0.AND.T.LT.TMOLIM) THEN
|
|
AN=TOTN(ID)
|
|
AEIN=ELEC(ID)
|
|
CALL MOLEQ(ID,T,AN,AEIN,ANE,ENR,ENT,WM,1)
|
|
END IF
|
|
CALL WNSTOR(ID)
|
|
CALL SABOLF(ID)
|
|
DO I=1,NLEV0
|
|
IIFOR0(I)=I
|
|
END DO
|
|
CALL RATMAT(ID,IIFOR0,-1,A,B)
|
|
CALL LEVSOL(A,B,POPLTE,IIFOR0,NLEV0,1)
|
|
DO I=1,NLEV0
|
|
POPUL0(I,ID)=POPLTE(I)
|
|
END DO
|
|
END DO
|
|
C
|
|
INTRPL=0
|
|
DO WHILE(KUR(1:5).NE.'BEGIN')
|
|
READ(8,'(A15)',END=100,ERR=100) KUR
|
|
END DO
|
|
READ(8,*,END=100,ERR=100) INTRPL
|
|
C
|
|
100 do iat=1,natom
|
|
iifix(iat)=kkfix0(iat)
|
|
end do
|
|
LCHC=LCHC0
|
|
LTE=LTE0
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE INCLDY(NDPTH)
|
|
C ========================
|
|
C
|
|
C Read an initial model atmosphere from unit 8
|
|
C in Cloudy's format as provided by Katya Verner
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (MINPUT=6)
|
|
DIMENSION RS(MDEPTH),KKFIX0(MLEVEL)
|
|
COMMON POPUL0(MLEVEL,MDEPTH),ESEMAT(MLEVEL,MLEVEL),BESE(MLEVEL),
|
|
* TEMP0(MDEPTH),ELEC0(MDEPTH),DENS0(MDEPTH),PPL0(MDEPTH),
|
|
* DEPTH(MDEPTH),PPL(MDEPTH),POPLTE(MLEVEL),X(MINPUT)
|
|
dimension a(mlevel,mlevel),b(mlevel),iifor0(mlevel)
|
|
C
|
|
do iat=1,natom
|
|
kkfix0(iat)=iifix(iat)
|
|
iifix(iat)=0
|
|
end do
|
|
C
|
|
READ(8,*) NDPTH
|
|
NUMPAR=3
|
|
IF(NDPTH.gt.mdepth.and.intrpl.eq.0)
|
|
* CALL QUIT('ndpth.gt.mdepth in INCLDY',ndpth,mdepth)
|
|
NLEV0=NLEVEL
|
|
READ(8,*) TSTARY,RSTARY
|
|
IF(RSTARY.LT.1.E6) RSTARY=RSTARY*6.96E10
|
|
C
|
|
DO ID=NDPTH,1,-1
|
|
READ(8,*) (X(I),I=1,MINPUT)
|
|
RS(ID)=X(1)
|
|
TEMP0(ID)=X(2)
|
|
ELEC0(ID)=X(4)
|
|
AN=X(3)/BOLK/TEMP0(ID)
|
|
DENS0(ID)=WMM(ID)*X(3)
|
|
TEMP(ID)=TEMP0(ID)
|
|
ELEC(ID)=ELEC0(ID)
|
|
DENS(ID)=DENS0(ID)
|
|
ANMA(ID)=DENS(ID)/WMM(ID)
|
|
ANTO(ID)=ANMA(ID)+ELEC(ID)
|
|
END DO
|
|
DM(1)=0.
|
|
DEPTH(1)=0.
|
|
DO ID=2,NDPTH
|
|
DDDM=(DENS(ID-1)+DENS(ID))*(RS(ID-1)-RS(ID))
|
|
DM(ID)=DM(ID-1)+0.5*DDDM
|
|
DEPTH(ID)=DM(ID)
|
|
END DO
|
|
C
|
|
RRDIL=(RSTARY/RS(NDPTH))*(RSTARY/RS(NDPTH))
|
|
TEMPBD=TSTARY
|
|
C
|
|
DO ID=1,NDPTH
|
|
CALL WNSTOR(ID)
|
|
CALL SABOLF(ID)
|
|
DO I=1,NLEV0
|
|
IIFOR0(I)=I
|
|
END DO
|
|
CALL RATMAT(ID,IIFOR0,-1,A,B)
|
|
CALL LEVSOL(A,B,POPLTE,IIFOR0,NLEV0,1)
|
|
DO I=1,NLEV0
|
|
POPUL0(I,ID)=POPLTE(I)
|
|
END DO
|
|
END DO
|
|
C
|
|
INTRPL=0
|
|
do iat=1,natom
|
|
iifix(iat)=kkfix0(iat)
|
|
end do
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE CHANGE
|
|
C =================
|
|
C
|
|
C This procedure controls an evaluation of initial level
|
|
C populations in case where the system of explicit levels
|
|
C (ie. the choice of explicit level, their numbering, or their
|
|
C total number) is not consistent with that for the input level
|
|
C populations read by procedure INPMOD.
|
|
C Obviously, this procedure need be used only for NLTE input models.
|
|
C
|
|
C ICHANG < 0 - general change of populations as described below
|
|
C > 0 - a simplified change; original data for the input
|
|
C model are required to assign the input NLTE populations
|
|
C to the levels in the new models; all additional
|
|
C levels are assumed having LTE populations.
|
|
C ICHANG is the unit number for the data file of old model.
|
|
C
|
|
C Case ICHANG < 0:
|
|
C
|
|
C Input from unit 5:
|
|
C For each explicit level, II=1,NLEVEL, the following parameters:
|
|
C IOLD - NE.0 - means that population of this level is
|
|
C contained in the set of input populations;
|
|
C IOLD is then its index in the "old" (i.e. input)
|
|
C numbering.
|
|
C All the subsequent parameters have no meaning
|
|
C in this case.
|
|
C - EQ.0 - means that this level has no equivalent in the
|
|
C set of "old" levels. Population of this level
|
|
C has thus to be evaluated.
|
|
C MODE - indicates how the population is evaluated:
|
|
C = 0 - population is equal to the population of the "old"
|
|
C level with index ISIOLD, multiplied by REL;
|
|
C = 1 - population assumed to be LTE, with respect to the
|
|
C first state of the next ionization degree whose
|
|
C population must be contained in the set of "old"
|
|
C (ie. input) populations, with index NXTOLD in the
|
|
C "old" numbering.
|
|
C The population determined of this way may further
|
|
C be multiplied by REL.
|
|
C = 2 - population determined assuming that the b-factor
|
|
C (defined as the ratio between the NLTE and
|
|
C LTE population) is the same as the b-factor of
|
|
C the level ISINEW (in the present numbering). The
|
|
C level ISINEW must have the equivalent in the "old"
|
|
C set; its index in the "old" set is ISIOLD, and the
|
|
C index of the first state of the next ionization
|
|
C degree, in the "old" numbering, is NXTSIO.
|
|
C The population determined of this way may further
|
|
C be multiplied by REL.
|
|
C = 3 - level corresponds to an ion or atom which was not
|
|
C explicit in the old system; population is assumed
|
|
C to be LTE.
|
|
C NXTOLD - see above
|
|
C ISINEW - see above
|
|
C ISIOLD - see above
|
|
C NXTSIO - see above
|
|
C REL - population multiplier - see above
|
|
C if REL=0, the program sets up REL=1
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
character*20 fnstd
|
|
dimension n0old(30,30),n1old(30,30)
|
|
dimension katold(2,30),vtbold(mdepth)
|
|
COMMON POPUL0(MLEVEL,MDEPTH),POPULL(MLEVEL,MDEPTH),
|
|
* ESEMAT(MLEVEL,MLEVEL),BESE(MLEVEL),POPL(MLEVEL)
|
|
C
|
|
PARAMETER (S = 2.0706D-16)
|
|
IF(ICHANG.LT.0) THEN
|
|
IFESE=0
|
|
DO 100 II=1,NLEVEL
|
|
READ(IBUFF,*) IOLD,MODE,NXTOLD,ISINEW,ISIOLD,NXTSIO,REL
|
|
IF(REL.EQ.0.) REL=1.
|
|
IF(MODE.GE.3) IFESE=IFESE+1
|
|
DO 90 ID=1,ND
|
|
IF(IOLD.EQ.0) GO TO 10
|
|
POPUL0(II,ID)=POPUL(IOLD,ID)
|
|
GO TO 90
|
|
10 IF(MODE.NE.0) GO TO 20
|
|
POPUL0(II,ID)=POPUL(ISIOLD,ID)*REL
|
|
GO TO 90
|
|
20 T=TEMP(ID)
|
|
ANE=ELEC(ID)
|
|
IF(MODE.GE.3) GO TO 40
|
|
NXTNEW=NNEXT(IEL(II))
|
|
SB=S/T/SQRT(T)*G(II)/G(NXTNEW)*EXP(ENION(II)/T/BOLK)
|
|
IF(MODE.GT.1) GO TO 30
|
|
POPUL0(II,ID)=SB*ANE*POPUL(NXTOLD,ID)*REL
|
|
GO TO 90
|
|
30 KK=ISINEW
|
|
KNEXT=NNEXT(IEL(KK))
|
|
SBK=S/T/SQRT(T)*G(KK)/G(KNEXT)*EXP(ENION(KK)/T/BOLK)
|
|
POPUL0(II,ID)=SB/SBK*POPUL(NXTOLD,ID)/POPUL(NXTSIO,ID)*
|
|
* POPUL(ISIOLD,ID)*REL
|
|
GO TO 90
|
|
40 IF(IFESE.EQ.1) THEN
|
|
LTE0=LTE
|
|
LTE=.TRUE.
|
|
do iii=1,nlevel
|
|
if(wop(iii,id).eq.0.) wop(iii,id)=1.
|
|
end do
|
|
CALL STEQEQ(ID,POPL,0)
|
|
DO III=1,NLEVEL
|
|
POPULL(III,ID)=POPL(III)
|
|
END DO
|
|
LTE=LTE0
|
|
END IF
|
|
POPUL0(II,ID)=POPULL(II,ID)
|
|
90 CONTINUE
|
|
100 CONTINUE
|
|
DO I=1,NLEVEL
|
|
DO ID=1,ND
|
|
POPUL(I,ID)=POPUL0(I,ID)
|
|
END DO
|
|
END DO
|
|
C
|
|
C simplified change - no additional input (the case ICHANG > 0)
|
|
C
|
|
ELSE
|
|
LTE0=LTE
|
|
LTE=.TRUE.
|
|
DO ID=1,ND
|
|
do ii=1,nlevel
|
|
if(wop(ii,id).eq.0.) wop(ii,id)=1.
|
|
end do
|
|
CALL STEQEQ(ID,POPL,0)
|
|
DO II=1,NLEVEL
|
|
POPUL0(II,ID)=POPL(II)
|
|
END DO
|
|
END DO
|
|
C
|
|
IF(ICHANG.EQ.1) THEN
|
|
DO II=NLEV0+1,NLEVEL
|
|
DO ID=1,ND
|
|
POPUL(II,ID)=POPUL0(II,ID)
|
|
END DO
|
|
END DO
|
|
C
|
|
ELSE
|
|
modr=0
|
|
rewind 1
|
|
read(1,*,err=200,end=200) modr
|
|
200 continue
|
|
call readbf(ichang)
|
|
if(modr.eq.0) then
|
|
read(95,*) tfold,grold
|
|
read(95,*) ltd1,ltd2
|
|
read(95,*) fnstd
|
|
read(95,*) nfrd
|
|
if(nfrd.lt.0) then
|
|
nfrd=-nfrd
|
|
do ij=1,nfrd
|
|
read(95,*) frold
|
|
end do
|
|
endif
|
|
read(95,*) natold
|
|
if(natold.lt.0) natold=-natold
|
|
do ia=1,natold
|
|
read(95,*) iao,abnold
|
|
if(abnold.gt.1.e6) read(95,*) (vtbold(i),i=1,ndold)
|
|
end do
|
|
nlold=0
|
|
read(95,*) iato,izo,nlvo,ilasti,ilvi,instd
|
|
if(instd.ne.0) read(95,*) idui
|
|
do while (ilasti.ge.0)
|
|
n0old(iato,izo+1)=nlold+1
|
|
n1old(iato,izo+1)=nlold+nlvo
|
|
nlold=nlold+nlvo
|
|
read(95,*) iato,izo,nlvo,ilasti,ilvi,instd
|
|
if(instd.ne.0) read(95,*) idui
|
|
end do
|
|
else
|
|
read(95,*) tfold,grold,hmold
|
|
read(95,*) ltd1,ltd2,lcold,ispold,chmold
|
|
if(ispold.lt.0) read(95,*,err=203) iol1,iol2,iol3,iol4,
|
|
. iol5,iol6,iol7
|
|
if(iol6.ge.2) read(95,*) djmold
|
|
203 read(95,*,err=204) nitold,ndold,natold,niold,nlvold,
|
|
. iol1,iol2,iarold,iol4
|
|
204 continue
|
|
if(iol1.gt.10) then
|
|
read(95,*,err=205) iol1,iol2,iol3,iol4,iol5
|
|
read(95,*,err=205) iol1,iol2
|
|
read(95,*,err=205) iol1,iol2
|
|
end if
|
|
205 continue
|
|
if(niold.lt.0) then
|
|
niold=-niold
|
|
read(95,*,err=206) iol1,iol2,iol3
|
|
end if
|
|
206 continue
|
|
if(iarold.le.-100 .and. iarold.gt.-200) then
|
|
iarold=-iarold-100
|
|
read(95,*) iol1
|
|
endif
|
|
read(95,*) nfrd
|
|
if(nfrd.gt.0) then
|
|
nfrd=-nfrd
|
|
do ij=1,nfrd
|
|
read(95,*) frold
|
|
end do
|
|
else
|
|
nfrd=-nfrd
|
|
read(95,*) frold
|
|
end if
|
|
read(95,*,err=211) iol1,iol2,iol3
|
|
if(iol3.lt.0) read(95,*) pzold
|
|
211 continue
|
|
read(95,*) iol1,vtbol
|
|
if(iol1.ne.0) read(95,*) (vtbold(i),i=1,ndold)
|
|
read(95,*) natsold
|
|
if(natsold.lt.0) natsold=-natsold
|
|
iat=0
|
|
do ia=1,natsold
|
|
read(95,*) iol1,iol2,iol3,iol4,iol5,abnold
|
|
if(abnold.gt.1.e6) read(95,*) (vtbold(i),i=1,ndold)
|
|
if(iol1.eq.2) then
|
|
iat=iat+1
|
|
katold(1,iat)=iol2
|
|
katold(2,iat)=iol3
|
|
end if
|
|
end do
|
|
do ii=1,niold
|
|
read(95,*) k0old,k1old,k2old,izo
|
|
if(k0old.lt.0) then
|
|
k0old=-k0old
|
|
read(95,*) iol1
|
|
end if
|
|
do ia=1,iat
|
|
if(k0old.ge.katold(1,ia) .and. k1old.ge.katold(2,ia))
|
|
. iaol=ia
|
|
end do
|
|
n0old(iaol,izo)=k0old
|
|
n1old(iaol,izo)=k1old
|
|
n0old(iaol,izo+1)=k2old
|
|
n1old(iaol,izo+1)=k2old
|
|
end do
|
|
end if
|
|
C
|
|
WRITE(6,600)
|
|
600 FORMAT(' Levels: OLD model -> NEW model',/
|
|
. ' ------------------------------')
|
|
DO 300 II=1,NION
|
|
N0NEW=NFIRST(II)
|
|
N1NEW=NLAST(II)
|
|
IANEW=NUMAT(IATM(N0NEW))
|
|
IZNEW=IZ(IEL(N0NEW))
|
|
IF(N1OLD(IANEW,IZNEW).EQ.0) GO TO 300
|
|
KOLD=N1OLD(IANEW,IZNEW)-N0OLD(IANEW,IZNEW)
|
|
KNEW=NLAST(II)-NFIRST(II)
|
|
IF(KOLD.LT.KNEW) KNEW=KOLD
|
|
JL=N0OLD(IANEW,IZNEW)-1
|
|
DO IL=NFIRST(II),NFIRST(II)+KNEW
|
|
JL=JL+1
|
|
WRITE(6,601) JL,IL
|
|
601 FORMAT(10X,I8,5X,I8)
|
|
DO ID=1,ND
|
|
POPUL0(IL,ID)=POPUL(JL,ID)
|
|
END DO
|
|
END DO
|
|
300 CONTINUE
|
|
DO 310 II=1,NATOM
|
|
N0NEW=NKA(II)
|
|
IANEW=NUMAT(IATM(N0NEW))
|
|
IZNEW=IZ(IEL(N0NEW))+1
|
|
IF(N0OLD(IANEW,IZNEW).EQ.0) GO TO 310
|
|
WRITE(6,601) N0OLD(IANEW,IZNEW),N0NEW
|
|
DO ID=1,ND
|
|
POPUL0(N0NEW,ID)=POPUL(N0OLD(IANEW,IZNEW),ID)
|
|
END DO
|
|
310 CONTINUE
|
|
C
|
|
DO II=1,NLEVEL
|
|
DO ID=1,ND
|
|
POPUL(II,ID)=POPUL0(II,ID)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
LTE=LTE0
|
|
C
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE RESOLV
|
|
C =================
|
|
C
|
|
C Control procedure for the formal solution, i.e. all calculations
|
|
C between two consecutive iterations of complete linearization
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
common/icnrsp/iconrs
|
|
DIMENSION PGR(MLVEXP)
|
|
C
|
|
C Initialization - procedure INILAM:
|
|
C
|
|
ilam=0
|
|
CALL INILAM
|
|
if(ioptab.lt.0.or.ioptab.gt.0) call rayset
|
|
call prd(0)
|
|
NLAMBD=NITLAM(ITER)
|
|
IF(NLAMBD.LE.0) GO TO 80
|
|
IF(LFIN.AND.NITER.GT.0) NLAMBD=1
|
|
LAC2P=.FALSE.
|
|
IACC0P=IACPP-3
|
|
C
|
|
C solution of the transfer equation with Compton scattering
|
|
C
|
|
if(icompt.ne.0.and.iter.eq.1) then
|
|
CALL OPAINI(1)
|
|
ilam=0
|
|
do ij=1,nfreq
|
|
call opacf1(ij)
|
|
call rtefr1(ij)
|
|
end do
|
|
CALL RTECOM
|
|
end if
|
|
C
|
|
IF(ITER.LE.1.and.ioptab.eq.0) CALL LINSEL
|
|
C
|
|
C Set of NLAMBD procedures, called overall "lambda" iterations
|
|
C (not to be confused with ordinary lambda iterations)
|
|
C Each "lambda" iteration contains:
|
|
C
|
|
DO ILAM=1,NLAMBD
|
|
CALL OPAINI(1)
|
|
if(icompt.ne.0.and.ilam.gt.1) CALL RTECOM
|
|
C
|
|
C Radiative rates in all transitions, in all depths
|
|
C
|
|
IF(IFPREC.EQ.0) THEN
|
|
CALL RATES1(0)
|
|
ELSE
|
|
CALL RATSP1
|
|
END IF
|
|
c
|
|
call prd(0)
|
|
C
|
|
C ****** evaluation of the new populations,
|
|
C using all the previously calculated radiative rates
|
|
C
|
|
DO ID=1,ND
|
|
c CALL STEQEQ(ID,POP,0)
|
|
CALL STEQEQ(ID,POP,1)
|
|
CALL NEWPOP(ID,POP)
|
|
IF(.NOT.LCHC.and.iter.lt.ielcor) CALL ELCOR(ID)
|
|
END DO
|
|
C
|
|
if(iprind.eq.2) call output
|
|
C
|
|
C ****** acceleration of convergence (if required)
|
|
C
|
|
IF(IACPP.GT.0) THEN
|
|
CALL ACCELP
|
|
END IF
|
|
C
|
|
call lucy
|
|
END DO
|
|
C
|
|
80 IF(ITER.EQ.1.OR.LFIN) CALL ROSSTD(0)
|
|
C
|
|
CALL OUTPUT
|
|
C
|
|
C in case of convection is considered: call pzeval to evaluate pressures
|
|
C and the logarithmic gradient of the total pressure
|
|
C
|
|
if(iter.le.nitzer) call pzert
|
|
C
|
|
if((iheso6.ne.0.or.HMIX0.GT.0.).and.init.eq.1) CALL PZEVAL
|
|
call radpre
|
|
CALL TIMING(1,ITER)
|
|
ipng=1
|
|
if(iacd.gt.0) ipng=mod((iter-iacc),iacd)
|
|
if(ipng.eq.0 .and. iter.ge.iacc .and. lres2) goto 90
|
|
c
|
|
c call prnt
|
|
if(hmix0.eq.0.) then
|
|
write(6,611) iter-1
|
|
611 format(/'** CONVECTIVE FLUX: RESOLV; GLOBAL ITERATION =',I3/)
|
|
call conout(1,ipconf)
|
|
else if(hmix0.gt.0.) then
|
|
if(iconre.gt.0.and.iter.le.iconre.and.iter.ge.iconrs)
|
|
* call conref
|
|
IF(ipconf.gt.0.or.(ipconf.eq.0.and.lfin)) then
|
|
WRITE(6,611) ITER-1
|
|
CALL CONOUT(1,1)
|
|
END IF
|
|
end if
|
|
C
|
|
C evaluate necessary ALI aprameters
|
|
C
|
|
c call prnt
|
|
CALL OPAINI(0)
|
|
c call prnt
|
|
if(icompt.ne.0.and.ilam.gt.1) CALL RTECOM
|
|
IF(KANT(ITER).EQ.1.OR.LFIN) THEN
|
|
CALL ALISK2
|
|
ELSE
|
|
IF(IRDER.EQ.0) THEN
|
|
CALL ALIST1
|
|
ELSE
|
|
CALL ALIST2
|
|
END IF
|
|
END IF
|
|
c
|
|
C if IFPOPR=2 - evaluate new populations
|
|
C
|
|
if(ifpopr.eq.2) then
|
|
DO ID=1,ND
|
|
CALL STEQEQ(ID,POP,1)
|
|
IF(.NOT.LCHC.and.iter.lt.ielcor) CALL ELCOR(ID)
|
|
END DO
|
|
END IF
|
|
90 CONTINUE
|
|
id=1
|
|
do ij=1,nfreqe
|
|
absoe1(ij)=absoex(ij,id)
|
|
end do
|
|
C
|
|
if(ihecor.ge.-2.and.izscal.eq.0) then
|
|
if(inzd.gt.0.or.(idisk.eq.1.and.ifryb.gt.0)) then
|
|
if(iheso6.eq.0) then
|
|
CALL PZEVLD
|
|
else
|
|
CALL HESOL6
|
|
end if
|
|
end if
|
|
end if
|
|
if(izscal.eq.1) call dmeval
|
|
c
|
|
if(ifryb.gt.0) call rybheq
|
|
C
|
|
C Output of condensed model atmosphere to file 7
|
|
C This file can serve as input of initial model atmosphere for
|
|
C another run of the program.
|
|
C
|
|
CALL OUTPUT
|
|
c call prnt
|
|
C
|
|
C Output of computed model atmosphere - standard output file
|
|
C
|
|
IF(LFIN) THEN
|
|
IF(.NOT.LTE) CALL PRINC
|
|
CALL OUTPRI
|
|
IF(ICOOLP.NE.0.OR.IPOPAC.NE.0) CALL COOLRT
|
|
CALL RECHCK
|
|
IF(ICHCKP.NE.0) CALL CHCKSE
|
|
IF(INTENS.GT.0) CALL RTEINT
|
|
if(icompt.gt.0) then
|
|
call rtecmu
|
|
call opaini(0)
|
|
do ij=1,nfreq
|
|
call opacf1(ij)
|
|
call taufr1(ij)
|
|
end do
|
|
end if
|
|
RETURN
|
|
END IF
|
|
C
|
|
C The final part - to store previously calculated
|
|
C mean intensities - RADEX(IJ,ID),
|
|
C and other model parameters (total number density, temperature,
|
|
C electron density, and populations) for
|
|
C further use in procedure SOLVE (actual complete linearization)
|
|
C
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=1,NFREQE
|
|
DO ID=1,ND
|
|
PSY0(IJ,ID)=RADEX(IJ,ID)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
DO ID=1,ND
|
|
DO II=1,NLVEXP
|
|
PSY0(NFREQE+INSE+II-1,ID)=0.
|
|
PGR(II)=0.
|
|
END DO
|
|
DO I=1,NLEVEL
|
|
II=IABS(IIEXP(I))
|
|
IF(II.GT.0) PGR(II)=PGR(II)+POPUL(I,ID)
|
|
END DO
|
|
DO III=1,NLVEXZ
|
|
PSY0(NFREQE+INSE+III-1,ID)=PGR(INDLGZ(III))
|
|
END DO
|
|
TOTN(ID)=DENS(ID)/WMM(ID)+ELEC(ID)
|
|
IF(INRE.NE.0) PSY0(NFREQE+INRE,ID)=TEMP(ID)
|
|
IF(INPC.NE.0) PSY0(NFREQE+INPC,ID)=ELEC(ID)
|
|
IF(INHE.NE.0) PSY0(NFREQE+INHE,ID)=TOTN(ID)
|
|
IF(INZD.NE.0) PSY0(NFREQE+INZD,ID)=ZD(ID)
|
|
IF(INMP.NE.0) PSY0(NFREQE+INMP,ID)=DENS(ID)/WMM(ID)
|
|
IF(INDL.NE.0) PSY0(NFREQE+INDL,ID)=DELTA(ID)
|
|
END DO
|
|
C
|
|
IF(INIT.EQ.1.AND.NATOM.GT.0) THEN
|
|
WRITE(6,600)
|
|
DO ID=1,ND
|
|
WRITE(6,601) ID,(NREFS(I,ID),I=1,NATOM)
|
|
END DO
|
|
600 FORMAT(//' REFERENCE LEVEL INDICES AS FUNCTIONS OF DEPTH'/,
|
|
* 'ITER =',i4)
|
|
601 FORMAT(' ID=',I3,2X,15I4)
|
|
END IF
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE INILAM
|
|
C =================
|
|
C
|
|
C Auxiliary procedure for RESOLV
|
|
C initialization of model parameters for further use in RESOLV
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
DIMENSION COL(MTRANS),DENS0(MDEPTH),SBW(MLEVEL),XE(MDEPTH),
|
|
* CLOC(MTRANS),ANTC(MDEPTH)
|
|
DIMENSION GRD(MDEPTH),pra(mdepth)
|
|
C
|
|
IF(INIT.EQ.1) THEN
|
|
C
|
|
C Before first iteration of complete linearization, ie. just after
|
|
C initialization of basic parameters and reading the initial model
|
|
C atmosphere - i.e. if INIT=1:
|
|
C only evaluation of collisional rates for all transitions, at all
|
|
C depths
|
|
C
|
|
anerel=0.5
|
|
if(teff.lt.8000.) anerel=0.01
|
|
CALL TDPINI
|
|
IF(IDISK.EQ.1) THEN
|
|
AMUV0=DMVISC**(ZETA0+UN)
|
|
AMUV1=UN-AMUV0
|
|
DMTOT=DM(ND)
|
|
EDISC=SIG4P*TEFF**4/DMTOT
|
|
END IF
|
|
DO ID=1,ND
|
|
CALL WNSTOR(ID)
|
|
FCOOL(ID)=0.
|
|
FPRD(ID)=0.
|
|
call sabolf(id)
|
|
c
|
|
c intialize b-factors
|
|
c
|
|
DO I=1,NLEVEL
|
|
BFAC(I,ID)=UN
|
|
SBW(I)=ELEC(ID)*SBF(I)*WOP(I,ID)
|
|
END DO
|
|
IF(.NOT.LTE.AND.IPSLTE.EQ.0 .and. id.lt.idlte) THEN
|
|
DO ION=1,NION
|
|
DO I=NFIRST(ION),NLAST(ION)
|
|
IF(POPUL(NNEXT(ION),ID).GT.0..and.iltlev(i).eq.0)
|
|
* BFAC(I,ID)=POPUL(I,ID)/
|
|
* (POPUL(NNEXT(ION),ID)*SBW(I))
|
|
END DO
|
|
END DO
|
|
END IF
|
|
c
|
|
c fully fixed part of the total charge
|
|
c
|
|
qfix(id)=0.
|
|
do i=1,nlevel
|
|
if(imodl(i).lt.0.or.iifix(iatm(i)).gt.0) then
|
|
ch=iz(iel(i))-1
|
|
il=ilk(i)
|
|
if(il.gt.0) ch=iz(il)+(iz(il)-1)*usum(il)*elec(id)
|
|
qfix(id)=qfix(id)+ch*popul(i,id)
|
|
end if
|
|
end do
|
|
c
|
|
c collisional rates
|
|
c
|
|
IF(.NOT.LTE) THEN
|
|
CALL COLIS(ID,TEMP(ID),COL,CLOC)
|
|
DO I=1,NTRANS
|
|
COLRAT(I,ID)=COL(I)
|
|
COLTAR(I,ID)=CLOC(I)
|
|
END DO
|
|
END IF
|
|
END DO
|
|
CALL ODFMER
|
|
C
|
|
c initialize viscosity parameters for disks
|
|
c
|
|
IF(IDISK.EQ.1) CALL VISINI
|
|
c
|
|
c dielectronic recombination
|
|
c
|
|
if(ifdiel.gt.0) call dietot
|
|
C
|
|
C in case of ISPLIN>4 - (i.e. the DFE solver for transfer equation)
|
|
C evaluate Planck function for the first estimate of RAD for
|
|
C the electron scattering source function
|
|
C
|
|
IF(ISPLIN.GE.5) THEN
|
|
DO ID=1,ND
|
|
DO IJ=1,NFREQ
|
|
RAD(IJ,ID)=BNUE(IJ)/(EXP(HKT1(ID)*FREQ(IJ))-UN)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
RETURN
|
|
END IF
|
|
C
|
|
C ==================================================================
|
|
C Immediately after a completed iteration of complete linearization:
|
|
C ==================================================================
|
|
C
|
|
PRAD=0.
|
|
DO ID=1,ND
|
|
C
|
|
C save some old quantities
|
|
C
|
|
AOLD=DENS(ID)/WMM(ID)+ELEC(ID)
|
|
XE(ID)=UN-ELEC(ID)/AOLD
|
|
C
|
|
C Depth by depth:
|
|
C set up individual arrays of model parameters, namely:
|
|
C temperature - TEMP (if temperature is one of variables,
|
|
C ie. if radiative equilibrium equation is solved)
|
|
C
|
|
IF(INRE.NE.0) TEMP(ID)=PSY0(NFREQE+INRE,ID)
|
|
C
|
|
C electron density - ELEC (if ELEC is one of variables, ie. if
|
|
C particle conservation equation is solved)
|
|
C
|
|
IF(INPC.NE.0) ELEC(ID)=PSY0(NFREQE+INPC,ID)
|
|
C
|
|
C density - DENS, calculated by means of total particle number
|
|
C density and electron density (if total particle
|
|
C number density is one of variables, ie. if hydrostatic
|
|
C equilibrium equation is solved - INHE.GT.0)
|
|
C
|
|
IF(INHE.NE.0) TOTN(ID)=PSY0(NFREQE+INHE,ID)
|
|
C
|
|
IF(IFIXDE.EQ.0) THEN
|
|
DENS0(ID)=DENS(ID)
|
|
IF(INHE.NE.0) THEN
|
|
DENS(ID)=WMM(ID)*(PSY0(NFREQE+INHE,ID)-ELEC(ID))
|
|
DPLP=DENS0(ID)*DPSILN
|
|
DPLM=DENS0(ID)/DPSILN
|
|
IF(DENS(ID).GT.DPLP) DENS(ID)=DPLP
|
|
IF(DENS(ID).LT.DPLM) DENS(ID)=DPLM
|
|
ELSE
|
|
if(ioptab.lt.-1) then
|
|
PGS(ID)=PTOTAL(ID)
|
|
DENS(ID)=RHOEOS(TEMP(ID),PGS(ID))
|
|
end if
|
|
END IF
|
|
END IF
|
|
C
|
|
C or again density, but calculated by means of the
|
|
C massive particle density,
|
|
C if this is one of variables - INMP.GT.0)
|
|
C
|
|
IF(INMP.NE.0) DENS(ID)=WMM(ID)*PSY0(NFREQE+INMP,ID)
|
|
C
|
|
C geometrical distance
|
|
C
|
|
IF(INZD.GT.0) ZD(ID)=PSY0(NFREQE+INZD,ID)
|
|
C
|
|
C the temperature logarithmic gradient delta
|
|
C
|
|
IF(INDL.NE.0) DELTA(ID)=PSY0(NFREQE+INDL,ID)
|
|
C
|
|
ANMA(ID)=DENS(ID)/WMM(ID)
|
|
ANTO(ID)=ANMA(ID)+ELEC(ID)
|
|
END DO
|
|
C
|
|
c avoid oscillations in temperature
|
|
c
|
|
IF(IOSCOR.NE.0) CALL OSCCOR
|
|
C
|
|
C if needed, formal solution of the hydrostatic equilibrium to get
|
|
C new total particle density, and possibly electron density
|
|
C
|
|
IF(IHECOR.GE.2) THEN
|
|
ID=1
|
|
PTUR=HALF*VTURB(ID)*VTURB(ID)*DENS(ID)
|
|
ANTC(ID)=(DM(ID)*GRAV-PRD0-PTUR)/BOLK/TEMP(ID)
|
|
IF(ANTC(ID).LE.0) ANTC(ID)=DENS(ID)/WMM(ID)+ELEC(ID)
|
|
DO ID=2,ND
|
|
PTUR=HALF*VTURB(ID)*VTURB(ID)*DENS(ID)
|
|
PTURM=HALF*VTURB(ID-1)*VTURB(ID-1)*DENS(ID-1)
|
|
ANTC(ID)=(GRAV*(DM(ID)-DM(ID-1))+
|
|
* BOLK*TEMP(ID-1)*ANTC(ID-1)-
|
|
* PRADT(ID)+PRADT(ID-1)-PTUR+PTURM)/
|
|
* BOLK/TEMP(ID)
|
|
END DO
|
|
DO ID=1,ND
|
|
ELEC(ID)=(UN-XE(ID))*ANTC(ID)
|
|
DENS(ID)=WMM(ID)*(ANTC(ID)-ELEC(ID))
|
|
ANMA(ID)=DENS(ID)/WMM(ID)
|
|
ANTO(ID)=ANMA(ID)+ELEC(ID)
|
|
END DO
|
|
END IF
|
|
C
|
|
C other depth-dependent quantities
|
|
C
|
|
do id=1,nd
|
|
PGS(ID)=(DENS(ID)/WMM(ID)+ELEC(ID))*BOLK*TEMP(ID)
|
|
end do
|
|
c
|
|
IF(IOPTAB.GE.0) THEN
|
|
DO ID=1,ND
|
|
C
|
|
C occupation probabilities
|
|
C
|
|
CALL WNSTOR(ID)
|
|
C
|
|
C Evaluation of collision rates for the new temperature
|
|
C
|
|
IF(.NOT.LTE) THEN
|
|
call sabolf(id)
|
|
CALL COLIS(ID,TEMP(ID),COL,CLOC)
|
|
DO I=1,NTRANS
|
|
COLRAT(I,ID)=COL(I)
|
|
COLTAR(I,ID)=CLOC(I)
|
|
END DO
|
|
END IF
|
|
END DO
|
|
END IF
|
|
C
|
|
CALL CONCOR
|
|
CALL TDPINI
|
|
C------------------------
|
|
C
|
|
C new populations
|
|
C
|
|
C 1. first possibility (useful for pure CL) --
|
|
C new populations, ie. those calculated directly
|
|
C by the complete linearization (as old population + corresponding
|
|
C corrections) are not used.
|
|
C Instead, new populations are calculated from the new radiation
|
|
C field basically by lambda iteration, ie.
|
|
C a) evaluation of new radiative rates for explicit transitions
|
|
C (radiative rates in fixed-option transitions are not updated
|
|
C at this step)
|
|
C
|
|
if(ifpopr.le.0.or.lte.OR.IFRYB.GT.0) then
|
|
IMOR=0
|
|
IF(IFRYB.GT.2) IMOR=1
|
|
IF(.NOT.LTE) CALL RATES1(IMOR)
|
|
C
|
|
C b) depth by depth evaluation of new populations by solving
|
|
C statistical equilibrium equation with previously evaluated
|
|
C rates, together with constraints - precisely as in RESOLV
|
|
C
|
|
DO ID=1,ND
|
|
CALL STEQEQ(ID,POP,1)
|
|
IF(.NOT.LCHC.and.iter.lt.ielcor) CALL ELCOR(ID)
|
|
END DO
|
|
if(iprind.eq.2) call output
|
|
c
|
|
C 2. second possibility -- populations from linearization corrections
|
|
C
|
|
ELSE
|
|
DO ID=1,ND
|
|
DO I=1,NLEVEL
|
|
if(iifix(iatm(i)).ne.1) then
|
|
II=IIEXP(I)
|
|
IF(II.GT.0) THEN
|
|
III=IINONZ(II)
|
|
IF(III.GT.0) THEN
|
|
POPUL(I,ID)=PSY0(NFREQE+INSE+III-1,ID)
|
|
ELSE
|
|
POPUL(I,ID)=0.
|
|
END IF
|
|
ELSE IF(II.LT.0) THEN
|
|
III=IINONZ(-II)
|
|
IF(III.GT.0) THEN
|
|
POPUL(I,ID)=PSY0(NFREQE+INSE+III-1,ID)*
|
|
* SBPSI(I,ID)
|
|
ELSE
|
|
POPUL(I,ID)=0.
|
|
END IF
|
|
ELSE
|
|
III=IINONZ(IIEXP(ILTREF(I,ID)))
|
|
IF(III.GT.0) THEN
|
|
POPUL(I,ID)=PSY0(NFREQE+INSE+III-1,ID)*
|
|
* SBPSI(I,ID)
|
|
ELSE
|
|
POPUL(I,ID)=0.
|
|
END IF
|
|
END IF
|
|
END IF
|
|
END DO
|
|
END DO
|
|
END IF
|
|
CALL ODFMER
|
|
c
|
|
c dielectronic recombination
|
|
c
|
|
if(ifdiel.gt.0) call dietot
|
|
C
|
|
if(ifryb.gt.0) call rybheq
|
|
C
|
|
C solution of the transfer equation with Compton scattering
|
|
C
|
|
if(icompt.gt.0) then
|
|
call opaini(1)
|
|
call comset
|
|
call rtecom
|
|
end if
|
|
c
|
|
IF(IDISK.EQ.1) call visini
|
|
c
|
|
c if(ifryb.eq.0) then
|
|
CALL OPAINI(1)
|
|
DO ID=1,ND
|
|
GRD(ID)=0.
|
|
pra(id)=0.
|
|
pradt(id)=0.
|
|
END DO
|
|
prd0=0.
|
|
DO IJ=1,NFREQ
|
|
CALL OPACF1(IJ)
|
|
CALL RTEFR1(IJ)
|
|
GRD(1)=GRD(1)+W(IJ)*ABSO1(1)*FH(IJ)*RAD1(1)
|
|
DO ID=2,ND
|
|
GRD(ID)=GRD(ID)+(RAD1(ID)*FAK1(ID)-RAD1(ID-1)*FAK1(ID-1))*
|
|
* W(IJ)
|
|
pra(id)=pra(id)+RAD1(ID)*FAK1(ID)*W(IJ)
|
|
END DO
|
|
pra(1)=pra(1)+RAD1(1)*FAK1(1)*W(IJ)-ABSO1(1)*W(IJ)*
|
|
* (RAD1(1)*FH(IJ)-HEXTRD(IJ))
|
|
END DO
|
|
GRD(1)=PCK*GRD(1)/DENS(1)
|
|
c
|
|
do id=1,nd
|
|
pra(id)=pra(id)*pck
|
|
pradt(id)=pradt(id)*pck
|
|
c pradfc(id)=pra(id)/(2.5213e-15*temp(id)**4)
|
|
end do
|
|
C
|
|
if(idisk.eq.0) then
|
|
PGS(1)=DM(1)*(GRAV-GRD(1))
|
|
DO ID=2,ND
|
|
PGS(ID)=PGS(ID-1)-PCK*GRD(ID)+GRAV*(DM(ID)-DM(ID-1))
|
|
END DO
|
|
end if
|
|
c
|
|
RETURN
|
|
END
|
|
c
|
|
c
|
|
c *****************************************************************
|
|
c
|
|
c
|
|
subroutine osccor
|
|
c =================
|
|
c
|
|
c routine for finding and removing oscillations in the temperature
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
dimension delt(mdepth),dda(mdepth)
|
|
|
|
c
|
|
ndos=abs(ioscor)+1
|
|
do id=2,ndos
|
|
delt(id)=temp(id)-temp(id-1)
|
|
end do
|
|
do id=2,ndos-1
|
|
dd=delt(id)*delt(id+1)
|
|
dda(id)=1.
|
|
if(dd.ne.0.) dda(id)=dd/abs(dd)
|
|
end do
|
|
c
|
|
iobeg=0
|
|
ioend=0
|
|
do id=2,ndos-1
|
|
if(dda(id).lt.0.and.iobeg.eq.0) iobeg=id
|
|
if(dda(id).gt.0.and.dda(id-1).lt.0) ioend=id
|
|
end do
|
|
iobeg=iobeg-1
|
|
if(iobeg.gt.0) then
|
|
write(6,601) iter,iobeg,ioend,(temp(id),id=iobeg,ioend)
|
|
601 format(/' oscillation in T in iteration',i4,
|
|
* ' between depths',i4,' and ',i4/(10f8.1))
|
|
c
|
|
st=log(temp(ioend)/temp(iobeg))/log(dm(ioend)/dm(iobeg))
|
|
tl0=log(temp(iobeg))
|
|
do id=iobeg,ioend
|
|
dml=log(dm(id)/dm(iobeg))
|
|
tl=tl0+dml*st
|
|
temp(id)=exp(tl)
|
|
end do
|
|
write(6,603) (temp(id),id=iobeg,ioend)
|
|
603 format(/' removed and replaced by the values:'/(10f8.1))
|
|
c
|
|
end if
|
|
c
|
|
c set surface temperature to the minimum one
|
|
c
|
|
if(ioscor.lt.0) then
|
|
tmin=1.e9
|
|
do id=1,nd
|
|
if(temp(id).lt.tmin) then
|
|
tmin=temp(id)
|
|
imin=id
|
|
end if
|
|
end do
|
|
c
|
|
do id=1,imin
|
|
temp(id)=tmin
|
|
end do
|
|
c
|
|
end if
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE ROSSTD(IJ)
|
|
C =====================
|
|
C
|
|
C Rosseland mean opacity
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
c DIMENSION TAUR(MDEPTH)
|
|
dimension pld(mdepth),abpld(mdepth)
|
|
|
|
C
|
|
C for IJ > 0 - contribution from the frequency IJ to the Rosseland
|
|
C opacity integrals
|
|
C
|
|
IF(IJ.GT.0) THEN
|
|
if(ij.eq.1) then
|
|
do id=1,nd
|
|
pld(id)=0.
|
|
abpld(id)=0.
|
|
end do
|
|
end if
|
|
IF(IJX(IJ).GE.0) THEN
|
|
DO ID=1,ND
|
|
PLAN=XKFB(ID)/XKF1(ID)*W(IJ)
|
|
DPLAN=PLAN/XKF1(ID)*FREQ(IJ)*HKT21(ID)
|
|
ABROSD(ID)=ABROSD(ID)+DPLAN/ABSO1(ID)
|
|
SUMDPL(ID)=SUMDPL(ID)+DPLAN
|
|
pld(id)=pld(id)+plan
|
|
abpld(id)=abpld(id)+(abso1(id)-scat1(id))*pld(id)
|
|
END DO
|
|
END IF
|
|
ELSE
|
|
C
|
|
C for IJ=0 - evaluation of the Rosseland optical depth and
|
|
C the radiative equilibrium division point
|
|
C
|
|
ID=1
|
|
IDR=0
|
|
TAURS(ID)=HALF*DEDM1*ABROSD(ID)*DENS(ID)
|
|
DO ID=2,ND
|
|
DTAUR=DELDM(ID-1)*(ABROSD(ID)+ABROSD(ID-1))
|
|
TAURS(ID)=TAURS(ID-1)+DTAUR
|
|
IF(TAURS(ID).LE.TAUDIV) IDR=ID
|
|
END DO
|
|
C
|
|
C in the last iteration, output of The Rosseland opacity and
|
|
C optical depth; skip the rest
|
|
C
|
|
IF(LFIN) THEN
|
|
DO ID=1,ND
|
|
TROSS(ID)=TAURS(ID)
|
|
abpl=abpld(id)/pld(id)/dens(id)
|
|
pll=sig4p*4.*temp(id)**4
|
|
WRITE(11,611) ID,DM(ID),TAURS(ID),ABROSD(ID),
|
|
* TEMP(ID),ELEC(ID),DENS(ID),
|
|
* pld(id),pll,abpl
|
|
END DO
|
|
611 FORMAT(I4,2X,1P6E12.4,2x,3e12.4)
|
|
RETURN
|
|
END IF
|
|
C
|
|
C determination of the radiative equilibrium parameters
|
|
C REINT and REDIF;
|
|
C REINT=1 for all ID .le. ND-idlst
|
|
C REDIF=1 for Rosseland optical depth > taudiv (taur.gt.taudiv)
|
|
C typically 0.1 - 0.5;
|
|
C - this value has been empirically shown to yield
|
|
C the best convergence rate
|
|
C
|
|
IF(ITER.GT.ITNDRE) RETURN
|
|
if(ndre.gt.1) then
|
|
c write(6,600)
|
|
do id=1,nd
|
|
if(id.lt.ndre) then
|
|
reint(id)=1.
|
|
redif(id)=0.
|
|
else
|
|
reint(id)=0.
|
|
redif(id)=1.
|
|
end if
|
|
end do
|
|
idr=ndre
|
|
else if(ndre.eq.-1) then
|
|
write(6,600)
|
|
do id=1,nd
|
|
reint(id)=1.
|
|
redif(id)=0.
|
|
end do
|
|
redif(1)=1.
|
|
else
|
|
c
|
|
DO ID=1,ND
|
|
REINT(ID)=UN
|
|
REDIF(ID)=UN
|
|
IF(ID.GT.ND-IDLST) REINT(ID)=0.
|
|
IF(ID.LT.IDR) THEN
|
|
REDIF(ID)=0.
|
|
IF(MOD(NDRE,10).EQ.-1) THEN
|
|
REDIF(ID)=TAURS(ID)
|
|
ELSE IF(MOD(NDRE,10).EQ.-2) THEN
|
|
REDIF(ID)=TAURS(ID)*TAURS(ID)
|
|
END IF
|
|
END IF
|
|
IF(NDRE.LE.-10) THEN
|
|
REDIF(ID)=REDIF(ID)/SIG4P/TEFF**4
|
|
REINT(ID)=REINT(ID)/ABPLAD(ID)*DENS(ID)
|
|
END IF
|
|
END DO
|
|
ID=1
|
|
IF(MOD(NDRE,10).EQ.-5) REDIF(ID)=UN
|
|
IF(NDRE.LE.-10) THEN
|
|
REDIF(ID)=REDIF(ID)/SIG4P/TEFF**4
|
|
END IF
|
|
NDRE=1
|
|
if(iter.eq.1) then
|
|
WRITE(6,601) IDR,IDR+1,ND-idlst
|
|
WRITE(10,601) IDR,IDR+1,ND-idlst
|
|
endif
|
|
endif
|
|
WRITE(6,601) IDR,IDR+1,ND-idlst
|
|
600 FORMAT(/' id redif reint'/)
|
|
601 FORMAT(/' SCHEME OF RADIATIVE EQUIL. DETERMINED IN RESOLV'/
|
|
* ' ONLY INTEGRAL EQUATION FOR ID <= ',I3/
|
|
* ' BOTH FOR ',I5,' <= ID <= ',I3/)
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE NEWPOP(ID,POP1)
|
|
C ==========================
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
DIMENSION POP1(MLEVEL),DPOP(MLEVEL),DPMAX(MDEPTH),
|
|
* SBW(MLEVEL)
|
|
c
|
|
if(ioptab.lt.0) return
|
|
C
|
|
DPMAX(ID)=0.
|
|
DO I=1,NLEVEL
|
|
IF(POPUL(I,ID).GT.0.)
|
|
* DPOP(I)=(POP1(I)-POPUL(I,ID))/POPUL(I,ID)
|
|
IF(ABS(DPOP(I)).GT.DPMAX(ID)) THEN
|
|
DPMAX(ID)=ABS(DPOP(I))
|
|
IMAX=I
|
|
END IF
|
|
POPUL(I,ID)=POP1(I)
|
|
END DO
|
|
c WRITE(18,601) ITER,ILAM,ID,DPMAX(ID),IMAX
|
|
c 601 FORMAT(3I5,1PE10.2,I6)
|
|
C
|
|
C array of b-factors
|
|
C
|
|
DO I=1,NLEVEL
|
|
BFAC(I,ID)=UN
|
|
SBW(I)=ELEC(ID)*SBF(I)*WOP(I,ID)
|
|
END DO
|
|
IF(.NOT.LTE.AND.IPSLTE.EQ.0) THEN
|
|
DO ION=1,NION
|
|
DO I=NFIRST(ION),NLAST(ION)
|
|
IF(POPUL(NNEXT(ION),ID).GT.0.)
|
|
* BFAC(I,ID)=POPUL(I,ID)/(POPUL(NNEXT(ION),ID)*SBW(I))
|
|
END DO
|
|
END DO
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE SWITCH(INITM)
|
|
C ========================
|
|
C
|
|
C Procedure for evaluating the collisional-radiative switching
|
|
C parameter lambda(R), denoted here CRSW(ID);
|
|
C Original procedure suggested by Hummer and Voels,
|
|
C Astron. Astrophys. 192, 279, 1988, was modified here by a
|
|
C possibility of considering depth dependent switching parameter CRSW
|
|
C
|
|
C Parameters SWPFAC, SWPLIM, SWPINC, and ICRSW are input
|
|
C parameters, having the meaning:
|
|
C
|
|
C ICRSW = 0 - collisional-radiative switching not considered
|
|
C > 0 - collisional-radiative switching is considered
|
|
C SWPFAC - initial CRSW = SWPFAC * min(collis.rate/rad.rate)
|
|
C SWPLIM - has the meaning: if CRSW > SWPLIM, then CRSW = 1
|
|
C SWPINC - CRSW(actual) = CRSW(previous) * SWPINC
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
DIMENSION SWTCH(MDEPTH)
|
|
C
|
|
IF(ICRSW.EQ.0) RETURN
|
|
IF(INITM.EQ.0) GO TO 10
|
|
C
|
|
C Before the first iteration of complete linearization
|
|
C initialisation of the collisional-radiative switching
|
|
C parameters, as described by Hummer and Voels,
|
|
C Astron. Astrophys. 192, 279, 1988;
|
|
C modified here by considering depth-dependent swiching
|
|
C parameter lambda(R) - denoted here CRSW(ID)
|
|
C
|
|
SWMIN=UN
|
|
DO ID=1,ND
|
|
SWTCH(ID)=UN
|
|
DO ITR=1,NTRANS
|
|
C=COLRAT(ITR,ID)
|
|
IF(RRU(ITR,ID).NE.0.) THEN
|
|
C
|
|
C upward rates
|
|
C
|
|
SWU=C/RRU(ITR,ID)
|
|
C
|
|
C downward rates
|
|
C
|
|
IF(LINE(ITR)) THEN
|
|
SWD=C*EXP(HK*FR0(ITR)/TEMP(ID))/RRD(ITR,ID)
|
|
ELSE
|
|
SWD=C/RRD(ITR,ID)
|
|
END IF
|
|
C
|
|
C minimum value
|
|
C
|
|
IF(SWU.LT.SWTCH(ID)) SWTCH(ID)=SWU
|
|
IF(SWD.LT.SWTCH(ID)) SWTCH(ID)=SWD
|
|
END IF
|
|
END DO
|
|
IF(SWTCH(ID).LT.SWMIN) SWMIN=SWTCH(ID)
|
|
END DO
|
|
C
|
|
DO ID=1,ND
|
|
IF(ICRSW.EQ.1) THEN
|
|
CRSW(ID)=SWMIN*SWPFAC
|
|
ELSE
|
|
CRSW(ID)=SWTCH(ID)*SWPFAC
|
|
END IF
|
|
IF(CRSW(ID).GT.SWPLIM) CRSW(ID)=UN
|
|
END DO
|
|
WRITE(6,601) (CRSW(ID),ID=1,ND)
|
|
RETURN
|
|
C
|
|
C After second and further iterations of complete linearization
|
|
C evaluation of new collisional-radiative switching parameters
|
|
C by multiplication of the previous ones by a prechosen factor
|
|
C SWPINC
|
|
C
|
|
10 CONTINUE
|
|
DO ID=1,ND
|
|
CRSW(ID)=CRSW(ID)*SWPINC
|
|
IF(CRSW(ID).GT.SWPLIM) CRSW(ID)=UN
|
|
END DO
|
|
WRITE(6,601) (CRSW(ID),ID=1,ND)
|
|
601 FORMAT(1P8D10.3)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE SABOLF(ID)
|
|
C =====================
|
|
C
|
|
C Saha-Boltzmann factors (SBF)
|
|
C and "upper sums" - sum of Saha-Boltzmann factors for upper, LTE,
|
|
C levels which are not included explicitly (USUM), and derivatives
|
|
C wrt. temperature (T) and electron density (DUSUMN)
|
|
C
|
|
C Input: ID - depth index
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (UH=1.5)
|
|
PARAMETER (CMAX=2.154D4,CCON=2.0706D-16)
|
|
C
|
|
C DCHI - approximate lowering of ionization potential for neutrals
|
|
C Actual lowering is DCHI*effective charge, and is considered only
|
|
C if IUPSUM(ION).GT.0
|
|
C
|
|
c
|
|
if(ioptab.lt.0) return
|
|
c
|
|
T=TEMP(ID)
|
|
SQT=SQRT(T)
|
|
ANE=ELEC(ID)
|
|
STANE=SQRT(T/ANE)
|
|
XMAX=CMAX*SQRT(STANE)
|
|
TK=BOLK*T
|
|
CON=CCON/T/SQT
|
|
C
|
|
C Saha-Boltzmann factors
|
|
C
|
|
DO ION=1,NION
|
|
QZ=IZ(ION)
|
|
CFN=CON/G(NNEXT(ION))
|
|
DCH=0.
|
|
IUPS=IUPSUM(ION)
|
|
SSBF=0.
|
|
DSSBFT=0.
|
|
USUM(ION)=0.
|
|
DUSUMT(ION)=0.
|
|
DUSUMN(ION)=0.
|
|
nlst=nlast(ion)
|
|
if(ifwop(nlst).ge.0) then
|
|
nl1up=nquant(nlst)+1
|
|
else
|
|
nl1up=nquant(nlst)
|
|
end if
|
|
DO II=NFIRST(ION),NLAST(ION)
|
|
if(ifwop(ii).lt.0) then
|
|
E=EH*QZ*QZ/TK
|
|
SUM=0.
|
|
DO J=nl1up,NLMX
|
|
XJ=J
|
|
XI=J*J
|
|
X=E/XI
|
|
FI=XI*EXP(X)*WNHINT(J,ID)
|
|
SUM=SUM+FI
|
|
END DO
|
|
g(ii)=sum*two
|
|
gmer(imrg(ii),id)=g(ii)
|
|
end if
|
|
X=ENION(II)/TK
|
|
if(x.gt.110.) x=110.
|
|
SB=CFN*G(II)*EXP(X)
|
|
SBF(II)=SB
|
|
SSBF=SSBF+SB
|
|
DSBF(II)=-(UH+ENION(II)/TK)/T
|
|
DSSBFT=DSSBFT+SB*DSBF(II)
|
|
END DO
|
|
C
|
|
C Upper sums
|
|
C
|
|
if(ifwop(nlst).ge.0) then
|
|
IF(ION.EQ.IELHM) THEN
|
|
USUM(ION)=0.
|
|
DUSUMT(ION)=0.
|
|
DUSUMN(ION)=0.
|
|
GO TO 50
|
|
END IF
|
|
IF(IUPS.EQ.0) THEN
|
|
C
|
|
C 1. More exact approach - using (exact) partition functions
|
|
C
|
|
IAT=NUMAT(IATM(NFIRST(ION)))
|
|
XMX=XMAX*SQRT(QZ)
|
|
CALL PARTF(IAT,IZ(ION),T,ANE,XMX,U,DUT,DUN)
|
|
EE=ENION(NFIRST(ION))/TK
|
|
IF(EE.GT.110.) EE=110.
|
|
CFE=CFN*EXP(EE)
|
|
USUM(ION)=CFE*U-SSBF
|
|
DUSUMT(ION)=CFE*(DUT-U/T*(UH+EE))-DSSBFT
|
|
DUSUMN(ION)=CFE*DUN
|
|
xx=(ssbf-sbf(nfirst(ion)))/sbf(nfirst(ion))
|
|
IF(USUM(ION).LT.0.or.ee.ge.109.or.xx.lt.1.e-7) THEN
|
|
USUM(ION)=0.
|
|
DUSUMT(ION)=0.
|
|
DUSUMN(ION)=0.
|
|
END IF
|
|
C
|
|
C 2. Approximate approach - summation over fixed number of upper
|
|
C levels, assumed hydrogenic (ie. their ionization energy and
|
|
C statistical weight hydrogenic)
|
|
C
|
|
ELSE IF(IUPS.GT.0) THEN
|
|
SUM=0.
|
|
DSUM=0.
|
|
E=EH*QZ*QZ/TK
|
|
DO J=NQUANT(NLAST(ION))+1,IUPS
|
|
XI=J*J
|
|
X=E/XI
|
|
FI=XI*EXP(X)
|
|
SUM=SUM+FI
|
|
DSUM=DSUM-FI*(UH+X)/T
|
|
END DO
|
|
USUM(ION)=SUM*CON*TWO
|
|
DUSUMT(ION)=DSUM*CON*TWO
|
|
DUSUMN(ION)=0.
|
|
C
|
|
c 3. occupation probability form
|
|
c
|
|
ELSE
|
|
SUM=0.
|
|
DSUM=0.
|
|
E=EH*QZ*QZ/TK
|
|
DO J=NQUANT(NLAST(ION))+1,NLMX
|
|
XJ=J
|
|
XI=J*J
|
|
X=E/XI
|
|
FI=XI*EXP(X)*WNHINT(J,ID)
|
|
SUM=SUM+FI
|
|
DSUM=DSUM-FI*(UH+X)/T
|
|
END DO
|
|
USUM(ION)=SUM*CON*TWO
|
|
DUSUMT(ION)=DSUM*CON*TWO
|
|
DUSUMN(ION)=0.
|
|
END IF
|
|
end if
|
|
50 CONTINUE
|
|
END DO
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
C
|
|
|
|
SUBROUTINE OPACF1(IJ)
|
|
C =====================
|
|
C
|
|
C Absorption, emission, and scattering coefficients
|
|
C at frequency IJ and for all depths
|
|
C
|
|
C Input: IJ opacity and emissivity is calculated for the
|
|
C frequency points with index IJ
|
|
C Output: ABSO1 - array of absorption coefficient
|
|
C EMIS1 - array of emission coefficient
|
|
C SCAT1 - array of scattering coefficient (all scattering
|
|
C mechanisms except electron scattering)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
common/hmolab/anh2(mdepth),anhm(mdepth)
|
|
common/ipricr/iprcrs,nprcrs
|
|
PARAMETER (C14=2.99793D14, c10=c14*1.d-4,CFF1=1.3727D-25)
|
|
dimension pold(mlevel),abtrh(mtrans)
|
|
c
|
|
if(ioptab.lt.0) then
|
|
do id=1,nd
|
|
abso1(id)=0.
|
|
scat1(id)=0.
|
|
emis1(id)=0
|
|
absot(id)=0.
|
|
end do
|
|
call opact1(ij)
|
|
return
|
|
end if
|
|
C
|
|
C initialize
|
|
c
|
|
elscat(id)=elec(id)*sige
|
|
IF(ICOMPT.GT.0) THEN
|
|
DO ID=1,ND
|
|
ELSCAT(ID)=ELEC(ID)*SIGEC(IJ)
|
|
END DO
|
|
END IF
|
|
C
|
|
DO ID=1,ND
|
|
c ABSO1(ID)=ELSCAT(ID)
|
|
ABSO1(ID)=0.
|
|
EMIS1(ID)=0.
|
|
SCAT1(ID)=ELSCAT(ID)
|
|
END DO
|
|
C
|
|
C basic frequency- and depth-dependent quantities
|
|
C
|
|
FR=FREQ(IJ)
|
|
FRINV=UN/FR
|
|
FR3INV=FRINV*FRINV*FRINV
|
|
DO ID=1,ND
|
|
XKF(ID)=EXP(-HKT1(ID)*FR)
|
|
XKF1(ID)=UN-XKF(ID)
|
|
XKFB(ID)=XKF(ID)*BNUE(IJ)
|
|
END DO
|
|
if(ielh.gt.0) n0hn=nfirst(ielh)
|
|
al=2.997925e18/fr
|
|
lpri=al.gt.1579.0.and.al.lt.1579.5
|
|
c
|
|
lfre=freq(ij).gt.frtabm
|
|
if(iprcrs.gt.0) then
|
|
abso1(iprcrs)=0.
|
|
do ii=nfirst(ielh),nlast(ielh)
|
|
if(ii.ne.nprcrs+nfirst(ielh)-1) then
|
|
pold(ii)=popul(ii,iprcrs)
|
|
popul(ii,iprcrs)=0.
|
|
do jj=ii+1,nnext(ielh)
|
|
itrh=itra(ii,jj)
|
|
abtrh(itrh)=abtra(itrh,iprcrs)
|
|
abtra(itrh,iprcrs)=0.
|
|
end do
|
|
end if
|
|
end do
|
|
end if
|
|
C
|
|
C ******** 1a. bound-free contribution - without dielectronic rec.
|
|
C
|
|
if(ifdiel.eq.0) then
|
|
DO IBFT=1,NTRANC
|
|
ITR=ITRBF(IBFT)
|
|
II=ILOW(ITR)
|
|
iad=iadop(iatm(ii))
|
|
lcomop=iad.eq.0.or.(lfre.and.iad.gt.0)
|
|
SG=CROSS(IBFT,IJ)
|
|
IF(SG.GT.0..and.lcomop) THEN
|
|
JJ=IUP(ITR)
|
|
IZZ=IZ(IEL(II))
|
|
IMER=IMRG(II)
|
|
DO ID=1,ND
|
|
SGD=SG
|
|
IF(MCDW(ITR).GT.0) THEN
|
|
CALL DWNFR1(FR,FR0(ITR),ID,IZZ,DW1)
|
|
DWF1(MCDW(ITR),ID)=DW1
|
|
SGD=SG*DW1
|
|
END IF
|
|
IF(IFWOP(II).LT.0) THEN
|
|
CALL SGMER1(FRINV,FR3INV,IMER,ID,SGME1)
|
|
SGMG(IMER,ID)=SGME1
|
|
SGD=SGME1
|
|
END IF
|
|
EMISBF=SGD*EMTRA(ITR,ID)
|
|
ABSO1(ID)=ABSO1(ID)+SGD*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+EMISBF
|
|
c if(lpri.and.id.eq.40)
|
|
c * write(65,621) id,ij,al,itr,ii,jj,typion(iel(ii)),
|
|
c * ii-nfirst(iel(ii))+1,jj-nfirst(iel(ii))+1,
|
|
c * popul(ii,id),sgd*abtra(itr,id),abso1(id),emisbf,emis1(id)
|
|
c end if
|
|
c 621 format('bf',i4,i6,f10.3,3i5,2x,a4,2x,2i4,1p5e14.7)
|
|
END DO
|
|
END IF
|
|
END DO
|
|
else
|
|
C
|
|
C ******** 1b. bound-free contribution - with dielectronic rec.
|
|
C
|
|
DO IBFT=1,NTRANC
|
|
ITR=ITRBF(IBFT)
|
|
II=ILOW(ITR)
|
|
iad=iadop(iatm(ii))
|
|
lcomop=iad.eq.0.or.(lfre.and.iadop(iatm(ii)).gt.0)
|
|
SG=CROSS(IBFT,IJ)
|
|
IF(SG.GT.0..and.lcomop) THEN
|
|
JJ=IUP(ITR)
|
|
IZZ=IZ(IEL(II))
|
|
IMER=IMRG(II)
|
|
DO ID=1,ND
|
|
SG=CROSSD(IBFT,IJ,ID)
|
|
IF(SG.GT.0.) THEN
|
|
SGD=SG
|
|
IF(MCDW(ITR).GT.0) THEN
|
|
CALL DWNFR1(FR,FR0(ITR),ID,IZZ,DW1)
|
|
DWF1(MCDW(ITR),ID)=DW1
|
|
SGD=SG*DW1
|
|
END IF
|
|
IF(IFWOP(II).LT.0) THEN
|
|
CALL SGMER1(FRINV,FR3INV,IMER,ID,SGME1)
|
|
SGMG(IMER,ID)=SGME1
|
|
SGD=SGME1
|
|
END IF
|
|
EMISBF=SGD*EMTRA(ITR,ID)
|
|
ABSO1(ID)=ABSO1(ID)+SGD*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+EMISBF
|
|
END IF
|
|
END DO
|
|
END IF
|
|
END DO
|
|
end if
|
|
C
|
|
C ******** 2. free-free contribution
|
|
C
|
|
DO 40 ION=1,NION
|
|
IT=ITRA(NNEXT(ION),NNEXT(ION))
|
|
iad=iadop(iatm(nnext(ion)))
|
|
if(iad.gt.0.and..not.lfre) go to 40
|
|
C
|
|
C hydrogenic with Gaunt factor = 1
|
|
C
|
|
IF(IT.EQ.1) THEN
|
|
DO ID=1,ND
|
|
SF1=SFF3(ION,ID)*FR3INV
|
|
SF2=SFF2(ION,ID)
|
|
IF(FR.LT.FF(ION)) SF2=UN/XKF(ID)
|
|
ABSOFF=SF1*SF2
|
|
ABSO1(ID)=ABSO1(ID)+ABSOFF
|
|
EMIS1(ID)=EMIS1(ID)+ABSOFF
|
|
c if(lpri.and.mod(id,20).eq.1) then
|
|
c write(6,622) id,ij,ion,typion(ion),sf1,sf2,absoff,abso1(id)
|
|
c end if
|
|
c 622 format('ff',i4,i6,i4,2x,a4,2x,1p4e14.6)
|
|
END DO
|
|
C
|
|
C hydrogenic with exact Gaunt factor
|
|
C
|
|
ELSE IF(IT.EQ.2) THEN
|
|
DO ID=1,ND
|
|
SF1=SFF3(ION,ID)*FR3INV
|
|
SF2=SFF2(ION,ID)
|
|
IF(FR.LT.FF(ION)) SF2=UN/XKF(ID)
|
|
X=C14*CHARG2(ION)/FR
|
|
SF2=SF2-UN+GFREE1(ID,X)
|
|
ABSOFF=SF1*SF2
|
|
ABSO1(ID)=ABSO1(ID)+ABSOFF
|
|
EMIS1(ID)=EMIS1(ID)+ABSOFF
|
|
c if(lpri.and.mod(id,20).eq.1) then
|
|
c sgf=gfree1(id,x)
|
|
c write(6,624) id,ij,ion,typion(ion),ff(ion),sgf,sf2,abso1(id)
|
|
c end if
|
|
c 624 format('ffh',i4,i6,i4,2x,a4,2x,1p4e14.6)
|
|
END DO
|
|
C
|
|
C H minus free-free opacity
|
|
C
|
|
ELSE IF(IT.EQ.3) THEN
|
|
DO ID=1,ND
|
|
T=TEMP(ID)
|
|
ANE=ELEC(ID)
|
|
c ABSOFF=(CFF1+CFFT(ID)*FRINV)*CFFN(ID)*FRINV
|
|
ABSOFF=SFFHMI(POPUL(N0HN,ID),FR,T)*ANE
|
|
ABSO1(ID)=ABSO1(ID)+ABSOFF
|
|
EMIS1(ID)=EMIS1(ID)+ABSOFF
|
|
END DO
|
|
C
|
|
C special evaluation of the cross-section
|
|
C
|
|
ELSE IF(IT.LT.0) THEN
|
|
DO ID=1,ND
|
|
ABSOFF=FFCROS(ION,IT,TEMP(ID),FR)*
|
|
* POPUL(NNEXT(ION),ID)*ELEC(ID)
|
|
ABSO1(ID)=ABSO1(ID)+ABSOFF
|
|
EMIS1(ID)=EMIS1(ID)+ABSOFF
|
|
END DO
|
|
END IF
|
|
40 CONTINUE
|
|
C
|
|
C ******** 3. - additional continuum opacity (OPADD)
|
|
C
|
|
IF(IOPADD.NE.0) THEN
|
|
ICALL=1
|
|
DO ID=1,ND
|
|
CALL OPADD(0,ICALL,IJ,ID)
|
|
ABSO1(ID)=ABSO1(ID)+ABAD
|
|
EMIS1(ID)=EMIS1(ID)+EMAD
|
|
SCAT1(ID)=SCAT1(ID)+SCAD
|
|
c if(lpri.and.mod(id,20).eq.1) then
|
|
c if(lpri.and.id.eq.50) then
|
|
c write(6,623) id,ij,abad,abso1(id),emis1(id),scat1(id)
|
|
c write(6,623) id,ij,abad,emad,scad
|
|
c write(*,*) 'elec',elec(id),sigec(ij),elscat(id)
|
|
c end if
|
|
c 623 format('ad',i4,i6,1p4e14.6)
|
|
END DO
|
|
END IF
|
|
|
|
C
|
|
C ******** 4. - opacity and emissivity in lines
|
|
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)
|
|
iad=iadop(iatm(ilow(itr)))
|
|
if(iad.eq.0.or.(lfre.and.iad.gt.0)) then
|
|
DO ID=1,ND
|
|
SG=PRFLIN(ID,IJ)
|
|
ABSO1(ID)=ABSO1(ID)+SG*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+SG*EMTRA(ITR,ID)
|
|
END DO
|
|
end if
|
|
ENDIF
|
|
IF(NLINES(IJ).GT.0) THEN
|
|
C
|
|
C the "overlapping" lines at the given frequency
|
|
C
|
|
DO 100 ILINT=1,NLINES(IJ)
|
|
ITR=ITRLIN(ILINT,IJ)
|
|
if(linexp(itr)) go to 100
|
|
iad=iadop(iatm(ilow(itr)))
|
|
if(iad.gt.0.and..not.lfre) go to 100
|
|
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))
|
|
A2=UN-A1
|
|
DO ID=1,ND
|
|
SG=A1*PRFLIN(ID,IJ1)+A2*PRFLIN(ID,IJ0)
|
|
ABSO1(ID)=ABSO1(ID)+SG*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+SG*EMTRA(ITR,ID)
|
|
END DO
|
|
c if(lpri.and.mod(id,20).eq.1) write(6,648) ij,id,itr,abso1(id),
|
|
c * emis1(id),sg,abtra(itr,id)
|
|
c 648 format('lin1',i8,i4,i7,1p4e14.6)
|
|
100 CONTINUE
|
|
END IF
|
|
C
|
|
C Opacity sampling option
|
|
C
|
|
ELSE
|
|
IF(NLINES(IJ).LE.0) GO TO 400
|
|
DO 300 ILINT=1,NLINES(IJ)
|
|
ITR=ITRLIN(ILINT,IJ)
|
|
iad=iadop(iatm(ilow(itr)))
|
|
if(iad.gt.0.and..not.lfre) go to 300
|
|
KJ=IJ-IFR0(ITR)+KFR0(ITR)
|
|
INDXPA=IABS(INDEXP(ITR))
|
|
IF(INDXPA.NE.3.AND.INDXPA.NE.4) THEN
|
|
DO ID=1,ND
|
|
SG=PRFLIN(ID,KJ)
|
|
ABSO1(ID)=ABSO1(ID)+SG*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+SG*EMTRA(ITR,ID)
|
|
END DO
|
|
ELSE
|
|
DO ID=1,ND
|
|
KJD=JIDI(ID)
|
|
SG=EXP(XJID(ID)*SIGFE(KJD,KJ)+(UN-XJID(ID))*
|
|
* SIGFE(KJD+1,KJ))
|
|
ABSO1(ID)=ABSO1(ID)+SG*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+SG*EMTRA(ITR,ID)
|
|
END DO
|
|
ENDIF
|
|
c if(lpri.and.mod(id,20).eq.1) write(6,649) ij,id,itr,abso1(id),
|
|
c * emis1(id),sg,abtra(itr,id)
|
|
c 649 format('linodf',i8,i4,i7,1p4e14.6)
|
|
300 CONTINUE
|
|
400 CONTINUE
|
|
ENDIF
|
|
C
|
|
c Lyman alpha and beta quasimolecular opacity
|
|
c
|
|
call quasim(ij)
|
|
c
|
|
C ----------------------------
|
|
C total opacity and emissivity
|
|
C ----------------------------
|
|
C
|
|
DO ID=1,ND
|
|
ABSO1(ID)=ABSO1(ID)-EMIS1(ID)*XKF(ID)+SCAT1(ID)
|
|
EMIS1(ID)=EMIS1(ID)*XKFB(ID)
|
|
absot(id)=abso1(id)
|
|
c if(lpri.and.mod(id,20).eq.1) write(6,641) ij,id,abso1(id),
|
|
c * emis1(id),scat1(id)
|
|
c 641 format('opac1',i8,i4,1p3e14.6)
|
|
END DO
|
|
c
|
|
c ---------------------------------
|
|
c hydrogen pacity from Gomez tables
|
|
c ---------------------------------
|
|
c
|
|
call ghydop(ij)
|
|
c
|
|
c approximate opacity in Lyman lines
|
|
C
|
|
if(ioplym.gt.0) call lymlin(ij)
|
|
C
|
|
c --------------------------------------------------------
|
|
c contribution from precalculated background opacity table
|
|
c --------------------------------------------------------`
|
|
c
|
|
if(ioptab.gt.0) then
|
|
call opact1(ij)
|
|
end if
|
|
C
|
|
C if needed, evaluate the opacity per gram
|
|
C
|
|
if(izscal.eq.0) then
|
|
do id=1,nd
|
|
absot(id)=abso1(id)*dens1(id)
|
|
end do
|
|
end if
|
|
c
|
|
if(ifprd.gt.0) call prd(ij)
|
|
c
|
|
if(iprcrs.gt.0) then
|
|
ih=nfirst(ielh)+nprcrs-1
|
|
crs=abso1(iprcrs)/(popul(ih,iprcrs)*g(ih)*
|
|
* 0.0265*4.1347e-15)
|
|
do ii=nfirst(ielh),nlast(ielh)
|
|
if(ii.ne.ih) then
|
|
popul(ii,iprcrs)=pold(ii)
|
|
do jj=ii+1,nnext(ielh)
|
|
itrh=itra(ii,jj)
|
|
abtra(itrh,iprcrs)=abtrh(itrh)
|
|
end do
|
|
end if
|
|
end do
|
|
end if
|
|
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE LEVSOL(A,B,POPP,IICAL,NLVCAL,IALL)
|
|
C =============================================
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
DIMENSION A(MLEVEL,MLEVEL),B(MLEVEL),POPP(MLEVEL),
|
|
* AP(MLEVEL,MLEVEL),BP(MLEVEL),POPP1(MLEVEL),
|
|
* IICAL(MLEVEL)
|
|
C
|
|
if(ioptab.lt.0) return
|
|
c
|
|
C new populations - solution of the rate equations
|
|
C
|
|
C a) either by inverting the global rate matrix (if IRSPLT=0)
|
|
C
|
|
IF(IRSPLT.EQ.0) THEN
|
|
CALL LINEQS(A,B,POPP,NLVCAL,MLEVEL)
|
|
C
|
|
C b) or by inverting several partial rate matrices for the
|
|
C individual chemical species
|
|
C
|
|
ELSE
|
|
DO 20 IAT=1,NATOM
|
|
IF(IIFIX(IAT).EQ.1.AND.IALL.EQ.0) GO TO 20
|
|
N1=N0A(IAT)
|
|
NK=NKA(IAT)
|
|
N1=IICAL(N1)
|
|
NK=IICAL(NK)
|
|
IF(N1.LE.0) THEN
|
|
DO I=N0A(IAT),NKA(IAT)
|
|
N1=IICAL(I)
|
|
IF(IICAL(I).GT.0) GO TO 10
|
|
END DO
|
|
10 CONTINUE
|
|
END IF
|
|
IF(N1.LE.0) GO TO 20
|
|
NLP=NK-N1+1
|
|
DO I=N1,NK
|
|
DO J=N1,NK
|
|
AP(I-N1+1,J-N1+1)=A(I,J)
|
|
END DO
|
|
BP(I-N1+1)=B(I)
|
|
END DO
|
|
CALL LINEQS(AP,BP,POPP1,NLP,MLEVEL)
|
|
DO I=N1,NK
|
|
POPP(I)=POPP1(I-N1+1)
|
|
END DO
|
|
20 CONTINUE
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE STEQEQ(ID,POP1,MODE)
|
|
C ===============================
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
COMMON/POPSTR/POPP(MLEVEL),
|
|
* POPP1(MLEVEL),POPP2(MLEVEL),POPP3(MLEVEL)
|
|
COMMON/PPAPAR/IPOPST(MATOM),NTERST,ITERST,
|
|
* IACPPP,IACPP0,IACPPD,LACPPP
|
|
|
|
DIMENSION A(MLEVEL,MLEVEL),B(MLEVEL),POP0(MLEVEL)
|
|
DIMENSION POP1(MLEVEL),SBW(MLEVEL)
|
|
C
|
|
if(ioptab.lt.0) return
|
|
c
|
|
t=temp(id)
|
|
aein=elec(id)
|
|
an=dens(id)/wmm(id)+elec(id)
|
|
if(ifmol.gt.0.and.t.lt.tmolim) then
|
|
ipri=0
|
|
call moleq(id,t,an,aein,ane,enrg,entt,wm,ipri)
|
|
C don't change the electron density when
|
|
C charge conservation is not solved
|
|
C elec(id)=ane
|
|
if(INPC.ne.0) elec(id)=ane
|
|
end if
|
|
c
|
|
C evaluation of the global rate matrix
|
|
C
|
|
CALL SABOLF(ID)
|
|
CALL RATMAT(ID,IIFOR,1,A,B)
|
|
C
|
|
C new populations - solution of the rate equations
|
|
C
|
|
CALL LEVSOL(A,B,POP0,IIFOR,NLVFOR,0)
|
|
c
|
|
C array of new populations
|
|
C
|
|
DO I=1,NLEVEL
|
|
SBW(I)=ELEC(ID)*SBF(I)*WOP(I,ID)
|
|
II=IIFOR(I)
|
|
IF(II.GT.0) THEN
|
|
POP1(I)=POP0(II)
|
|
ELSE IF(II.LT.0) THEN
|
|
POP1(I)=POP0(-II)*SBPSI(I,ID)
|
|
ELSE
|
|
if(imodl(i).lt.0.or.iifix(iatm(i)).gt.0) then
|
|
pop1(i)=popul(i,id)
|
|
else
|
|
III=IIFOR(ILTREF(I,ID))
|
|
POP1(I)=SBPSI(I,ID)*POP0(III)
|
|
end if
|
|
END IF
|
|
if(iifix(iatm(i)).gt.0) pop1(i)=popul(i,id)
|
|
if(ipzero(i,id).gt.0) pop1(i)=0.
|
|
END DO
|
|
C
|
|
C set up the parameter IPZERO indicating that a population is "small"
|
|
C and will subsequently be set to zero
|
|
C
|
|
IF(ITER.EQ.0) THEN
|
|
LKIT=.TRUE.
|
|
ELSE
|
|
LKIT=KANT(ITER).EQ.0 .AND. ITER.LT.IACC
|
|
ENDIF
|
|
IF(LKIT) THEN
|
|
DO IAT=1,NATOM
|
|
POPM=DENS(ID)/WMM(ID)/YTOT(ID)*ABUND(IAT,ID)
|
|
DO I=N0A(IAT),NKA(IAT)
|
|
IF(POP1(I)/POPM.LT.POPZER) THEN
|
|
POP1(I)=0.
|
|
IPZERO(I,ID)=1
|
|
END IF
|
|
END DO
|
|
if(nrefs(iat,id).gt.n0a(iat)) then
|
|
do i=nrefs(iat,id),n0a(iat),-1
|
|
if(ipzero(i,id).gt.0.and.ilk(i).gt.0) then
|
|
do iii=nfirst(ilk(i)),nlast(ilk(i))
|
|
ipzero(iii,id)=1
|
|
pop1(iii)=0.
|
|
end do
|
|
end if
|
|
end do
|
|
end if
|
|
END DO
|
|
END IF
|
|
C
|
|
C if required (MODE=1), set up the global array POPUL
|
|
C
|
|
IF(MODE.NE.1) RETURN
|
|
DO I=1,NLEVEL
|
|
POPUL(I,ID)=POP1(I)
|
|
END DO
|
|
C
|
|
C array of b-factors
|
|
C
|
|
DO I=1,NLEVEL
|
|
BFAC(I,ID)=UN
|
|
END DO
|
|
IF(LTE.OR.IPSLTE.NE.0) RETURN
|
|
DO ION=1,NION
|
|
DO I=NFIRST(ION),NLAST(ION)
|
|
IF(POPUL(NNEXT(ION),ID).GT.0..AND.IPZERO(I,ID).EQ.0)
|
|
* BFAC(I,ID)=POPUL(I,ID)/(POPUL(NNEXT(ION),ID)*SBW(I))
|
|
END DO
|
|
END DO
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE PZERT
|
|
C ================
|
|
C
|
|
C driving routine for super-zeroing, i.e. detecting that
|
|
C a given population is small throughout the whole
|
|
C atmosphere, so it is removed completely from linearization
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
DIMENSION POPMA(MLEVEL),INDLEZ(MLEVEL),GZR(MLEVEL)
|
|
c
|
|
if(ioptab.lt.0) return
|
|
C
|
|
C super-zeroing of the individual levels
|
|
C
|
|
POPZRL=1.E5*POPZER
|
|
NLNZX=0
|
|
DO IAT=1,NATOM
|
|
N1=N0A(IAT)
|
|
NK=NKA(IAT)
|
|
DO II=N1,NK
|
|
POPMA(II)=0.
|
|
END DO
|
|
c
|
|
c set-up quantity POPMA(II), which is the maximum
|
|
C (over depths) of the relative population of given
|
|
C level II to the total population of the atom.
|
|
C
|
|
DO ID=1,ND
|
|
POPM=0.
|
|
DO II=N1,NK
|
|
IF(POPUL(II,ID).GT.POPM) POPM=POPUL(II,ID)
|
|
END DO
|
|
DO II=N1,NK
|
|
POPREL=POPUL(II,ID)/POPM
|
|
IF(POPREL.GT.POPMA(II)) POPMA(II)=POPREL
|
|
END DO
|
|
END DO
|
|
C
|
|
C if POPMA(II) is small, level II is super-zeroed
|
|
C
|
|
DO II=N1,NK
|
|
IPZERT(II)=0
|
|
IF(POPMA(II).LT.POPZRL) THEN
|
|
IPZERT(II)=1
|
|
DO ID=1,ND
|
|
IPZERO(II,ID)=1
|
|
POPUL(II,ID)=0.
|
|
END DO
|
|
ELSE
|
|
IF(IIEXP(II).GT.0) THEN
|
|
NLNZX=NLNZX+1
|
|
INDLEZ(NLNZX)=II
|
|
END IF
|
|
END IF
|
|
END DO
|
|
END DO
|
|
c
|
|
c now, check whether all populations within a group were
|
|
C super-zeroed. If so, super-zero the whole group
|
|
C
|
|
DO II=1,NLVEXP
|
|
GZR(II)=1.
|
|
END DO
|
|
DO I=1,NLEVEL
|
|
II=IABS(IIEXP(I))
|
|
IF(II.NE.0) GZR(II)=GZR(II)*IPZERT(I)
|
|
END DO
|
|
NLVEXZ=0
|
|
DO II=1,NLVEXP
|
|
IF(GZR(II).EQ.0) THEN
|
|
IGZERT(II)=0
|
|
NLVEXZ=NLVEXZ+1
|
|
INDLGZ(NLVEXZ)=II
|
|
IINONZ(II)=NLVEXZ
|
|
ELSE
|
|
IGZERT(II)=1
|
|
IINONZ(II)=0
|
|
END IF
|
|
END DO
|
|
NN=NN0-NLVEXP+NLVEXZ
|
|
c
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE RATMAT(ID,IICAL,IMODE,A,B)
|
|
C =====================================
|
|
C
|
|
C Evaluation of the rate matrix
|
|
C
|
|
C More specifically, the set of statistical equilibrium + constraint
|
|
C equations (see further) is represented as
|
|
C
|
|
C A * vector of populations = B
|
|
C
|
|
C (see Mihalas, 1978) pp.138-139 for details
|
|
C
|
|
C Constraint equations:
|
|
C the rows corresponding to the last explicit level of each atom
|
|
C (ie. a one-level ion representing the highest ionization degree
|
|
C of the given atom) are the abundance definition equations
|
|
C
|
|
C Input: ID - depth index
|
|
C Input transmitted by COMMON blocks:
|
|
C RRU - array of upward radiative rates in all transitions
|
|
C RRD - array of downward radiative rates in all transitions
|
|
C COLRAT - array of collisional rates (only upward) in all
|
|
C transitions
|
|
C SBF - array of Saha-Boltzmann factors
|
|
C USUM - array of upper sums
|
|
C
|
|
C Output: A - rate matrix
|
|
C B - the right-hand-side vector
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
DIMENSION A(MLEVEL,MLEVEL),B(MLEVEL)
|
|
DIMENSION AIJ(MTRANS),AJI(MTRANS)
|
|
DIMENSION SBW(MLEVEL),IICAL(MLEVEL)
|
|
DIMENSION LLTE(MLEVEL)
|
|
c DATA ICOMP /0/
|
|
c
|
|
if(ioptab.lt.0) return
|
|
c
|
|
if(ipslte.ne.0) then
|
|
do itr=1,ntrans
|
|
rru(itr,id)=0.
|
|
rrd(itr,id)=0.
|
|
drdt(itr,id)=0.
|
|
end do
|
|
end if
|
|
c
|
|
T=TEMP(ID)
|
|
ANE=ELEC(ID)
|
|
HKT=HK/T
|
|
TK=HKT/H
|
|
DO I=1,NLEVEL
|
|
B(I)=0.
|
|
SBW(I)=ANE*SBF(I)*WOP(I,ID)
|
|
ILT=ILTION(IEL(I))
|
|
LLT=ILT.EQ.1.AND.IMODE.EQ.0
|
|
LLTE(I)=LLT.OR.LTE.OR.ILTLEV(I).GE.1.OR.ILT.GE.2
|
|
LLTE(I)=LLTE(I).OR.ID.GE.IDLTE
|
|
DO J=1,NLEVEL
|
|
A(J,I)=0.
|
|
END DO
|
|
END DO
|
|
C
|
|
C determine reference levels
|
|
C
|
|
CALL REFLEV(ID,IABS(IMODE))
|
|
C
|
|
C ******* First part - the rows corresponding to true statistical
|
|
C equilibrium equations
|
|
C i.e. NLTE rate equations
|
|
C
|
|
C 1) simple expression in the case of LTE
|
|
C
|
|
DO IAT=1,NATOM
|
|
IF(IIFIX(IAT).NE.1.OR.IMODE.LT.0) THEN
|
|
NREFI=NREFS(IAT,ID)
|
|
DO I=N0A(IAT),NKA(IAT)
|
|
II=IABS(IICAL(I))
|
|
IF(I.NE.NREFI.AND.II.NE.0.AND.LLTE(I)) THEN
|
|
A(II,II)=UN
|
|
N=IABS(IICAL(ILTERF(I,ID)))
|
|
A(II,N)=A(II,N)-SBLPSI(I,ID)
|
|
END IF
|
|
END DO
|
|
END IF
|
|
END DO
|
|
C
|
|
C 2) NLTE rate equation
|
|
C
|
|
IF(.NOT.LTE) THEN
|
|
DO 40 ITR=1,NTRANS
|
|
I=ILOW(ITR)
|
|
IF(IIFIX(IATM(I)).EQ.1) GO TO 40
|
|
J=IUP(ITR)
|
|
NKE=NNEXT(IEL(I))
|
|
C
|
|
C upward total rate
|
|
C
|
|
AIJ(ITR)=(COLRAT(ITR,ID)+RRU(ITR,ID))*WOP(J,ID)
|
|
C
|
|
C downward total rate
|
|
C
|
|
IF(LINE(ITR)) THEN
|
|
C
|
|
C bound-bound
|
|
C
|
|
AJI(ITR)=(COLTAR(ITR,ID)+RRD(ITR,ID)*
|
|
* G(I)/G(J)*EXP(HKT*FR0(ITR)))*WOP(I,ID)
|
|
ELSE
|
|
C
|
|
C Bound-free
|
|
C Quantity CORR is a factor which allows the bound-free
|
|
C transition to end at an excited state
|
|
C
|
|
CORR=UN
|
|
IF(NKE.NE.J) CORR=G(NKE)/G(J)*
|
|
* EXP((ENION(NKE)-ENION(J))*TK)
|
|
AJI(ITR)=COLTAR(ITR,ID)*WOP(I,ID)+
|
|
* RRD(ITR,ID)*SBW(I)*CORR
|
|
END IF
|
|
IF(IICAL(I).LT.0.AND.IICAL(J).LT.0) THEN
|
|
AIJ(ITR)=AIJ(ITR)*SBPSI(I,ID)
|
|
AJI(ITR)=AJI(ITR)*SBPSI(J,ID)
|
|
END IF
|
|
40 CONTINUE
|
|
C
|
|
C Elements of the rate matrix
|
|
C
|
|
DO 41 ITR=1,NTRANS
|
|
I=ILOW(ITR)
|
|
IF(IIFIX(IATM(I)).EQ.1) GO TO 41
|
|
NREFI=NREFS(IATM(I),ID)
|
|
J=IUP(ITR)
|
|
II=IABS(IICAL(I))
|
|
JJ=IABS(IICAL(J))
|
|
IF(IPZERO(I,ID).NE.0.OR.IPZERO(J,ID).NE.0) GO TO 41
|
|
IF(I.NE.NREFI.AND.II.GT.0.AND..NOT.LLTE(I)) THEN
|
|
A(II,II)=A(II,II)+AIJ(ITR)
|
|
IF(JJ.GT.0) THEN
|
|
A(II,JJ)=A(II,JJ)-AJI(ITR)
|
|
ELSE
|
|
JJJ=IICAL(ILTREF(J,ID))
|
|
A(II,JJJ)=A(II,JJJ)-AJI(ITR)*SBPSI(J,ID)
|
|
END IF
|
|
END IF
|
|
IF(J.NE.NREFI.AND.JJ.GT.0.AND..NOT.LLTE(J)) THEN
|
|
A(JJ,JJ)=A(JJ,JJ)+AJI(ITR)
|
|
IF(II.GT.0) THEN
|
|
A(JJ,II)=A(JJ,II)-AIJ(ITR)
|
|
ELSE
|
|
III=IICAL(ILTREF(I,ID))
|
|
A(JJ,III)=A(JJ,III)-AIJ(ITR)*SBPSI(I,ID)
|
|
END IF
|
|
END IF
|
|
41 CONTINUE
|
|
END IF
|
|
C
|
|
C reset the rate matrix elements for "small" populations
|
|
C
|
|
DO I=1,NLEVEL
|
|
II=IICAL(I)
|
|
IF(II.GT.0) THEN
|
|
IF(IPZERO(I,ID).GT.0) THEN
|
|
DO J=1,NLEVEL
|
|
A(II,J)=0.
|
|
END DO
|
|
A(II,II)=1.
|
|
END IF
|
|
ELSE IF(II.LT.0) THEN
|
|
IF(IGZERO(-II,ID).GT.0) THEN
|
|
DO J=1,NLEVEL
|
|
A(-II,J)=0.
|
|
END DO
|
|
A(-II,-II)=1.
|
|
END IF
|
|
END IF
|
|
END DO
|
|
C
|
|
C ******** Second part - abundance definition equations
|
|
C
|
|
DO 100 IAT=1,NATOM
|
|
IF(IIFIX(IAT).EQ.1.AND.IMODE.GE.0) GO TO 100
|
|
NREFII=IABS(IICAL(NREFS(IAT,ID)))
|
|
DO I=N0A(IAT),NKA(IAT)
|
|
IL=ILK(I)
|
|
II=IICAL(I)
|
|
IF(II.GT.0) THEN
|
|
A(NREFII,II)=A(NREFII,II)+UN
|
|
IF(IL.NE.0) A(NREFII,II)=A(NREFII,II)+ANE*USUM(IL)
|
|
ELSE IF(II.LT.0) THEN
|
|
A(NREFII,-II)=A(NREFII,-II)+SBPSI(I,ID)
|
|
IF(IL.NE.0) A(NREFII,-II)=A(NREFII,-II)+ANE*USUM(IL)*
|
|
* SBPSI(I,ID)
|
|
ELSE
|
|
III=IICAL(ILTREF(I,ID))
|
|
A(NREFII,III)=A(NREFII,III)+SBPSI(I,ID)
|
|
END IF
|
|
END DO
|
|
B(NREFII)=B(NREFII)+
|
|
* DENS(ID)/WMM(ID)/YTOT(ID)*ABUND(IAT,ID)
|
|
100 CONTINUE
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE RATMAL(ID,A,B)
|
|
C
|
|
C LTE RATE MATRIX (SAHA-BOLTZMANN EQS.)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
DIMENSION A(MLEVEL,MLEVEL),B(MLEVEL)
|
|
C
|
|
ANE=ELEC(ID)
|
|
DO I=1,NLEVEL
|
|
B(I)=0.
|
|
DO J=1,NLEVEL
|
|
A(J,I)=0.
|
|
END DO
|
|
END DO
|
|
C
|
|
DO IAT=1,NATOM
|
|
N0I=N0A(IAT)
|
|
NKI=NKA(IAT)
|
|
N1I=NKI-1
|
|
NREFI=NKI
|
|
DO I=N0I,N1I
|
|
A(I,I)=1.
|
|
N=NNEXT(IEL(I))
|
|
A(I,N)=-ANE*SBF(I)*WOP(I,ID)
|
|
END DO
|
|
DO I=N0I,NKI
|
|
IL=ILK(I)
|
|
A(NREFI,I)=UN
|
|
IF(IL.NE.0) A(NREFI,I)=1.+ANE*USUM(IL)
|
|
END DO
|
|
B(NREFI)=DENS(ID)/WMM(ID)/YTOT(ID)*ABUND(IAT,ID)
|
|
END DO
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE ELCOR(ID)
|
|
C ====================
|
|
C
|
|
C Procedure for a reevaluation of the electron number density
|
|
C from the charge conservation equation in the formal solution
|
|
C step (RESOLV)
|
|
C This procedure is called only if LCHC=false, ie. if the charge
|
|
C conservation equation is not part of the rate matrix
|
|
C
|
|
C Input: ID - depth index
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
COMMON/ADCHAR/QADD(MDEPTH)
|
|
c
|
|
if(ioptab.lt.0.or.ioptab.gt.0) return
|
|
C
|
|
T=TEMP(ID)
|
|
ANE=ELEC(ID)
|
|
AN0=DENS(ID)/WMM(ID)+ANE
|
|
C
|
|
C basic iteration loop for solving simultaneously a non-linear set
|
|
C of statistical equilibrium, charge conservation, and particle
|
|
C conservation equations
|
|
C
|
|
KKK=0
|
|
1 KKK=KKK+1
|
|
IF(IFIXDE.GT.0) THEN
|
|
AN=DENS(ID)/WMM(ID)+ANE
|
|
ELSE
|
|
AN=AN0
|
|
DENS(ID)=(AN-ANE)*WMM(ID)
|
|
END IF
|
|
C
|
|
C determine QQ, the total charge due to non-explicit atoms
|
|
C
|
|
QQ=0.
|
|
ANMNE1=WMM(ID)/DENS(ID)
|
|
if(ifmol.eq.0.or.t.ge.tmolim) then
|
|
CALL STATE(2,ID,T,ANE)
|
|
QQ=Q*ABUND(IATREF,ID)/YTOT(ID)*DENS(ID)/WMM(ID)
|
|
if(ioptab.gt.0) QQ=DENS(ID)/YTOT(ID)/WMM(ID)
|
|
else
|
|
aein=ane
|
|
call moleq(id,t,an,aein,ane,enrg,entt,wm,0)
|
|
qq=qadd(id)
|
|
end if
|
|
C
|
|
RHS=QFIX(ID)+QQ
|
|
DO IAT=1,NATOM
|
|
IF(IIFIX(IAT).NE.1) THEN
|
|
DO I=N0A(IAT),NKA(IAT)
|
|
IL=ILK(I)
|
|
CH=IZ(IEL(I))-1
|
|
IF(IL.GT.0) CH=IZ(IL)+(IZ(IL)-1)*USUM(IL)*ANE
|
|
IF(IMODL(I).GE.0) RHS=RHS+CH*POPUL(I,ID)
|
|
END DO
|
|
END IF
|
|
END DO
|
|
C
|
|
C new electron density
|
|
C
|
|
RHS=HALF*(ANE+RHS)
|
|
ELEC(ID)=RHS
|
|
IF(IFIXDE.EQ.0) DENS(ID)=WMM(ID)*(AN-ELEC(ID))
|
|
ANMA(ID)=DENS(ID)/WMM(ID)
|
|
ANTO(ID)=ANMA(ID)+ELEC(ID)
|
|
RELANE=(RHS-ANE)/ANE
|
|
ANE=RHS
|
|
C
|
|
C second part of the iteration loop - recalculation of all
|
|
C populations with new electron density
|
|
C
|
|
CALL STEQEQ(ID,POP,1)
|
|
C
|
|
C convergence criterion for electron density
|
|
C
|
|
IF(ABS(RELANE).LE.1.D-6) THEN
|
|
CALL WNSTOR(ID)
|
|
RETURN
|
|
ENDIF
|
|
C
|
|
C if convergence is not achieved
|
|
C
|
|
IF(KKK.LT.10) GO TO 1
|
|
WRITE(6,601) ID,RELANE
|
|
WRITE(10,601) ID,RELANE
|
|
601 FORMAT('0 SLOW CONVERGENCE OF ELCOR ID =',I4,' REL =',1PD10.3/)
|
|
CALL WNSTOR(ID)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE REFLEV(ID,IMODE)
|
|
C ===========================
|
|
C
|
|
C determination of the global reference level, and
|
|
C determination of the LTE reference levels and corresponding
|
|
C quantities
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
DIMENSION XSBF(MLEVEL)
|
|
if(ioptab.lt.0) return
|
|
C
|
|
C determination of the reference level (if required)
|
|
C
|
|
LREFP=.TRUE.
|
|
LREFP=.false.
|
|
IF(MODREF.GE.1) THEN
|
|
IF(IMODE.EQ.1.AND.(ITER.LE.1.OR.KANT(ITER).EQ.0)) THEN
|
|
DO IAT=1,NATOM
|
|
PMAX=0.
|
|
IREF=0
|
|
DO I=N0A(IAT),NKA(IAT)
|
|
IF(POPUL(I,ID).GE.PMAX) THEN
|
|
PMAX=POPUL(I,ID)
|
|
IREF=I
|
|
END IF
|
|
END DO
|
|
IF(IREF.NE.NKA(IAT).AND.IREF.NE.NFIRST(IEL(IREF)))
|
|
* IREF=NFIRST(IEL(IREF))
|
|
IF(MODREF.EQ.2.AND.IREF.LT.NFIRST(IEL(NKA(IAT))))
|
|
* IREF=NFIRST(IEL(NKA(IAT)))
|
|
NREF(IAT)=IREF
|
|
LREFP=LREFP .AND. NREFS(IAT,ID).EQ.NREF(IAT)
|
|
NREFS(IAT,ID)=NREF(IAT)
|
|
END DO
|
|
ELSE
|
|
DO IAT=1,NATOM
|
|
NREF(IAT)=NREFS(IAT,ID)
|
|
END DO
|
|
END IF
|
|
ELSE
|
|
DO IAT=1,NATOM
|
|
LREFP=LREFP .AND. NREFS(IAT,ID).EQ.NREF(IAT)
|
|
NREFS(IAT,ID)=NREF(IAT)
|
|
END DO
|
|
END IF
|
|
C
|
|
C set to the zeroing mode levels with SBF*ANE large;
|
|
C check whether reference level is not zerod, and is so, re-establish
|
|
C the reference level.
|
|
C
|
|
IF(ITER.LE.NITZER) THEN
|
|
DO IAT=1,NATOM
|
|
N1=N0A(IAT)
|
|
NK=NKA(IAT)
|
|
ISBMX=0
|
|
XSBMX=0.
|
|
IREF=NREFS(IAT,ID)
|
|
DO II=N1,NK
|
|
IF(ITER.LE.NITZER) IPZERO(II,ID)=0
|
|
XSBF(II)=SBF(II)*ELEC(ID)
|
|
IF(.NOT.LTE) THEN
|
|
ITR=ITRA(II,NNEXT(IEL(II)))
|
|
IF(ITR.GT.0) THEN
|
|
IF(RRU(ITR,ID).GT.1.E-30)
|
|
* XSBF(II)=SBF(II)*ELEC(ID)*RRD(ITR,ID)/RRU(ITR,ID)
|
|
END IF
|
|
END IF
|
|
END DO
|
|
IF(LTE) THEN
|
|
IREF=N1
|
|
DO II=N1+1,NK
|
|
IF(ILK(II).GT.0) THEN
|
|
IREF=II
|
|
IF(XSBF(II).GT.1.) GO TO 10
|
|
END IF
|
|
END DO
|
|
10 CONTINUE
|
|
NREFS(IAT,ID)=IREF
|
|
NREF(IAT)=IREF
|
|
END IF
|
|
IF(IREF.GT.N0A(IAT)) THEN
|
|
X=1.
|
|
DO II=IREF-1,N1,-1
|
|
IF(ILK(II).GT.0.OR.II.EQ.N0A(IAT)) THEN
|
|
X=X*XSBF(II)
|
|
IF(X.LT.POPZR2) THEN
|
|
DO III=N1,NLAST(IEL(II))
|
|
IPZERO(III,ID)=1
|
|
END DO
|
|
GO TO 20
|
|
END IF
|
|
END IF
|
|
END DO
|
|
END IF
|
|
20 CONTINUE
|
|
IF(IREF.LT.NK) THEN
|
|
X=1.
|
|
DO II=IREF+1,NK
|
|
IF(ILK(II).GT.0) THEN
|
|
X=X*XSBF(NFIRST(ILK(II)))
|
|
IF(X.GT.1./POPZR2) THEN
|
|
NFIR=NFIRST(IEL(II))
|
|
IF(II.EQ.NK) NFIR=NK
|
|
DO III=NFIR,NK
|
|
IPZERO(III,ID)=1
|
|
END DO
|
|
GO TO 30
|
|
END IF
|
|
END IF
|
|
END DO
|
|
END IF
|
|
30 CONTINUE
|
|
END DO
|
|
END IF
|
|
C
|
|
C determination of the LTE reference levels and corresponding
|
|
C quantities
|
|
C
|
|
ELEC1(ID)=UN/ELEC(ID)
|
|
DO IAT=1,NATOM
|
|
IFSUP=0
|
|
IREF=NREF(IAT)
|
|
DO I=N0A(IAT),NKA(IAT)
|
|
C
|
|
C generalized LTE reference level formalism
|
|
C
|
|
IF(IABS(IMODL(I)).EQ.1.OR.IABS(IMODL(I)).EQ.2) THEN
|
|
IN=NNEXT(IEL(I))
|
|
IF(I.LT.IREF.OR.POPUL(I,ID).LT.POPUL(IN,ID)) THEN
|
|
ILTREF(I,ID)=IN
|
|
SBPSI(I,ID)=SBF(I)*ELEC(ID)*WOP(I,ID)*BFAC(I,ID)
|
|
DSBPST(I,ID)=DSBF(I)
|
|
DSBPSN(I,ID)=ELEC1(ID)
|
|
ELSE IF(I.GT.IREF) THEN
|
|
I1=NFIRST(IEL(I))
|
|
ILTREF(I,ID)=I1
|
|
SBPSI(I,ID)=SBF(I)*WOP(I,ID)*BFAC(I,ID)/
|
|
* (SBF(I1)*WOP(I1,ID)*BFAC(I1,ID))
|
|
DSBPST(I,ID)=DSBF(I)-DSBF(I1)
|
|
DSBPSN(I,ID)=0.
|
|
END IF
|
|
C
|
|
C original scheme
|
|
C
|
|
ELSE IF(IABS(IMODL(I)).EQ.3.OR.IMODL(I).EQ.0) THEN
|
|
ILTREF(I,ID)=NNEXT(IEL(I))
|
|
SBPSI(I,ID)=SBF(I)*ELEC(ID)*WOP(I,ID)*BFAC(I,ID)
|
|
DSBPST(I,ID)=DSBF(I)
|
|
DSBPSN(I,ID)=ELEC1(ID)
|
|
ELSE IF(IABS(IMODL(I)).EQ.5) THEN
|
|
IFSUP=1
|
|
END IF
|
|
END DO
|
|
C
|
|
C super-reference level formalism
|
|
C
|
|
LRF=LTE.AND.IREF.NE.NKA(IAT)
|
|
IF(IFSUP.EQ.1.OR.LRF) THEN
|
|
XA=UN
|
|
XT=0.
|
|
XN=0.
|
|
ILTREF(IREF,ID)=IREF
|
|
IF(IREF.GT.N0A(IAT)) THEN
|
|
DO I=IREF-1,N0A(IAT),-1
|
|
ILTREF(I,ID)=IREF
|
|
SBPSI(I,ID)=XA*SBF(I)*ELEC(ID)*BFAC(I,ID)*WOP(I,ID)
|
|
if(sbpsi(i,id).lt.popzr2) then
|
|
sbpsi(i,id)=0.
|
|
else
|
|
DSBPST(I,ID)=XT+DSBF(I)
|
|
DSBPSN(I,ID)=XN+ELEC1(ID)
|
|
end if
|
|
IF(I.EQ.NFIRST(IEL(I))) THEN
|
|
XA=SBPSI(I,ID)
|
|
XT=DSBPST(I,ID)
|
|
XN=DSBPSN(I,ID)
|
|
if(xn.eq.0.) ilk(i)=0
|
|
END IF
|
|
END DO
|
|
END IF
|
|
C
|
|
XA=UN
|
|
XT=0.
|
|
XN=0.
|
|
IF(IREF.LT.NKA(IAT)) THEN
|
|
IF(IREF.EQ.NLAST(IEL(IREF))) THEN
|
|
XA=UN/(SBF(IREF)*BFAC(IREF,ID)*WOP(IREF,ID)*ELEC(ID))
|
|
XT=-DSBF(IREF)
|
|
XN=-ELEC1(ID)
|
|
END IF
|
|
DO I=IREF+1,NKA(IAT)-1
|
|
ILTREF(I,ID)=IREF
|
|
I1=NFIRST(IEL(I))
|
|
SBB1=UN/(SBF(I1)*BFAC(I1,ID)*WOP(I1,ID))
|
|
SBPSI(I,ID)=XA*SBF(I)*BFAC(I,ID)*WOP(I,ID)*SBB1
|
|
if(sbpsi(i,id).lt.popzr2) then
|
|
sbpsi(i,id)=0.
|
|
else
|
|
DSBPST(I,ID)=XT+DSBF(I)-DSBF(I1)
|
|
DSBPSN(I,ID)=XN
|
|
end if
|
|
IF(I.EQ.NLAST(IEL(I))) THEN
|
|
XA=XA*SBB1*ELEC1(ID)
|
|
XT=XT-DSBF(I1)
|
|
XN=XN-ELEC1(ID)
|
|
END IF
|
|
END DO
|
|
I=NKA(IAT)
|
|
ILTREF(I,ID)=IREF
|
|
SBPSI(I,ID)=XA
|
|
DSBPST(I,ID)=XT
|
|
DSBPSN(I,ID)=XN
|
|
END IF
|
|
END IF
|
|
C
|
|
C different meaning of SBPSI for IMODL=2, i.e. for levels
|
|
C with fixed ratio of population to that of reference level
|
|
C
|
|
DO I=N0A(IAT),NKA(IAT)
|
|
IF(IABS(IMODL(I)).EQ.2) THEN
|
|
IF(POPUL(I,ID).EQ.0..OR.POPUL(ILTREF(I,ID),ID).EQ.0.)
|
|
* THEN
|
|
IN=NNEXT(IEL(I))
|
|
IF(I.LT.IREF.OR.POPUL(I,ID).LT.POPUL(IN,ID)) THEN
|
|
ILTREF(I,ID)=IN
|
|
SBPSI(I,ID)=SBF(I)*ELEC(ID)*WOP(I,ID)*BFAC(I,ID)
|
|
ELSE IF(I.GT.IREF) THEN
|
|
I1=NFIRST(IEL(I))
|
|
ILTREF(I,ID)=I1
|
|
SBPSI(I,ID)=SBF(I)*WOP(I,ID)*BFAC(I,ID)/
|
|
* (SBF(I1)*WOP(I1,ID)*BFAC(I1,ID))
|
|
END IF
|
|
ELSE
|
|
SBPSI(I,ID)=POPUL(I,ID)/POPUL(ILTREF(I,ID),ID)
|
|
END IF
|
|
DSBPST(I,ID)=0.
|
|
DSBPSN(I,ID)=0.
|
|
END IF
|
|
END DO
|
|
C
|
|
C different meaning of SBPSI for IMODL=6 or 7, i.e. for levels
|
|
C with fixed ratio of population to that of a "guiding" level
|
|
C
|
|
if(imode.eq.1) then
|
|
DO I=N0A(IAT),NKA(IAT)
|
|
IF(IABS(IMODL(I)).EQ.6) THEN
|
|
ILTREF(I,ID)=IGUIDE(I)
|
|
if(POPUL(ILTREF(I,ID),ID).gt.0.) then
|
|
SBPSI(I,ID)=POPUL(I,ID)/POPUL(ILTREF(I,ID),ID)
|
|
end if
|
|
DSBPST(I,ID)=0.
|
|
DSBPSN(I,ID)=0.
|
|
END IF
|
|
END DO
|
|
end if
|
|
END DO
|
|
C
|
|
C true LTE reference level
|
|
C
|
|
DO IAT=1,NATOM
|
|
DO I=N0A(IAT),NKA(IAT)
|
|
IF(IABS(IMODL(I)).LT.6) THEN
|
|
ILTERF(I,ID)=ILTREF(I,ID)
|
|
SBLPSI(I,ID)=SBPSI(I,ID)
|
|
ELSE
|
|
ILTERF(I,ID)=NNEXT(IEL(I))
|
|
SBLPSI(I,ID)=SBF(I)*ELEC(ID)*WOP(I,ID)*BFAC(I,ID)
|
|
END IF
|
|
END DO
|
|
END DO
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE LEVGRP(ID,IICAL,IMODE,POPP)
|
|
C ======================================
|
|
C
|
|
C determination of the total population of a the level groups;
|
|
C and of relative populations of the group consituents
|
|
C
|
|
C Input: ID - depth index
|
|
C IICAL - array of level grouping parameters (IIEXP of IIFOR)
|
|
C IMODE - a mode of input populations:
|
|
C = 0 - input populations are POPUL(I,ID)
|
|
C = 1 - input populations are given by the last
|
|
C formal parameter POP
|
|
C POP - array of input populations (for IMODE=1 only)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
DIMENSION POPP(MLEVEL),IICAL(MLEVEL)
|
|
if(ioptab.lt.0) return
|
|
C
|
|
DO I=1,NLVEXP
|
|
POPGRP(I)=0.
|
|
igzero(i,id)=0
|
|
END DO
|
|
IF(IMODE.EQ.0) THEN
|
|
DO I=1,NLEVEL
|
|
POPP(I)=POPUL(I,ID)
|
|
END DO
|
|
END IF
|
|
C
|
|
C total population of the group
|
|
C
|
|
DO I=1,NLEVEL
|
|
II=IABS(IICAL(I))
|
|
IF(II.NE.0) POPGRP(II)=POPGRP(II)+POPP(I)
|
|
END DO
|
|
C
|
|
C ratios of the popultions of the individual group
|
|
C components w.r.t the total group populations
|
|
C this quantity remains fixed during linearization
|
|
C
|
|
DO I=1,NLEVEL
|
|
II=IICAL(I)
|
|
IF(II.LT.0) THEN
|
|
IF(POPGRP(-II).GT.0.) THEN
|
|
SBPSI(I,ID)=POPP(I)/POPGRP(-II)
|
|
ELSE
|
|
SBPSI(I,ID)=0.
|
|
IGZERO(-II,ID)=1
|
|
END IF
|
|
END IF
|
|
END DO
|
|
C
|
|
C zeroing of the whole group - if the total group population
|
|
C is smaller than POPZER times the total atomic population
|
|
C
|
|
IF(ITER.EQ.0) THEN
|
|
LKIT=.TRUE.
|
|
ELSE
|
|
LKIT=KANT(ITER).EQ.0 .AND. ITER.LT.IACC
|
|
ENDIF
|
|
IF(LKIT) THEN
|
|
DO I=1,NLEVEL
|
|
IAT=IATM(I)
|
|
POPM=DENS(ID)/WMM(ID)/YTOT(ID)*ABUND(IAT,ID)
|
|
II=IICAL(I)
|
|
IF(II.LT.0) THEN
|
|
IF(POPGRP(-II)/POPM.LT.POPZER) THEN
|
|
POPGRP(-II)=0.
|
|
IGZERO(-II,ID)=1
|
|
END IF
|
|
rpop0(-ii,id)=popgrp(-ii)/popm
|
|
else if(ii.gt.0) then
|
|
rpop0(ii,id)=popgrp(ii)/popm
|
|
END IF
|
|
END DO
|
|
END IF
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE RATES1(IMOR)
|
|
C ======================
|
|
C
|
|
C Evaluation of radiative rates
|
|
C
|
|
C Output (transferred by COMMON blocks):
|
|
C RRU(IT,ID) - upward radiative rate in transition IT and
|
|
C depth ID
|
|
C RRD(IT,ID) - analogously the downward rate; more precisely
|
|
C the exact downward rate is given by:
|
|
C lines : RRD * stat.weight(lower)/stat.weight(upper)
|
|
C continua: RRD * n(elec) * Saha-Boltzmann factor
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
DIMENSION RBNE(MDEPTH)
|
|
C DIMENSION EHKL(MFREQL)
|
|
C
|
|
C zero the rates
|
|
C
|
|
DO ID=1,ND
|
|
PRADT(ID)=0.
|
|
PRADA(ID)=0.
|
|
FLRD(ID)=0.
|
|
DO ITR=1,NTRANS
|
|
RRU(ITR,ID)=0.
|
|
RRD(ITR,ID)=0.
|
|
END DO
|
|
DO ITRP=1,NTRPRD
|
|
PJBAR(ITRP,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) GOTO 100
|
|
FR=FREQ(IJ)
|
|
W0=W0E(IJ)
|
|
WW=W(IJ)
|
|
CALL OPACF1(IJ)
|
|
IF(IMOR.EQ.0) THEN
|
|
CALL RTEFR1(IJ)
|
|
ELSE
|
|
RAD1(ID)=RAD(IJ,ID)
|
|
END IF
|
|
IF(LROSS) CALL ROSSTD(IJ)
|
|
FLRD(1)=FLRD(1)+WW*FH(IJ)*RAD1(1)-WW*HEXTRD(IJ)
|
|
DO ID=2,ND
|
|
DT=UN/(ABSOT(ID)+ABSOT(ID-1))/DELDMZ(ID-1)
|
|
FL=(RAD1(ID)*FAK1(ID)-RAD1(ID-1)*FAK1(ID-1))*DT
|
|
FLRD(ID)=FLRD(ID)+WW*FL
|
|
END DO
|
|
if(ioptab.lt.0) go to 100
|
|
C
|
|
C ---------------------
|
|
C Continuum transitions
|
|
C ---------------------
|
|
C
|
|
DO ID=1,ND
|
|
RBNE(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)
|
|
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*RBNE(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)
|
|
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
|
|
SGW=PRFLIN(ID,IJ)*W0
|
|
RRU(ITR,ID)=RRU(ITR,ID)+SGW*RAD1(ID)
|
|
RRD(ITR,ID)=RRD(ITR,ID)+SGW*RBNE(ID)
|
|
50 CONTINUE
|
|
c
|
|
itrprd=iprd(itr)
|
|
if(itrprd.gt.0) then
|
|
s=un/(0.02654*osc0(itr))
|
|
do id=1,nd
|
|
sg=prflin(id,ij)*s
|
|
pjbar(itrprd,id)=pjbar(itrprd,id)+sg*w(ij)*rad1(id)
|
|
end do
|
|
end if
|
|
c
|
|
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)
|
|
II=ILOW(ITR)
|
|
JJ=IUP(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 80 ID=1,ND
|
|
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 80
|
|
SGW=A1*PRFLIN(ID,IJ1)+A2*PRFLIN(ID,IJ0)
|
|
RRU(ITR,ID)=RRU(ITR,ID)+SGW*RAD1(ID)
|
|
RRD(ITR,ID)=RRD(ITR,ID)+SGW*RBNE(ID)
|
|
80 CONTINUE
|
|
c
|
|
itrprd=iprd(itr)
|
|
if(itrprd.gt.0) then
|
|
s=un/(0.02654*osc0(itr))
|
|
do id=1,nd
|
|
SG=(A1*PRFLIN(ID,IJ1)+A2*PRFLIN(ID,IJ0))*s
|
|
pjbar(itrprd,id)=pjbar(itrprd,id)+sg*w(ij)*rad1(id)
|
|
end do
|
|
end if
|
|
c
|
|
90 CONTINUE
|
|
100 CONTINUE
|
|
C
|
|
DO ID=1,ND
|
|
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
|
|
DO ID=1,ND
|
|
PRADT(ID)=PRADT(ID)*PCK
|
|
PRADA(ID)=PRADA(ID)*PCK
|
|
END DO
|
|
PRD0=PRD0/DENS1(1)*DM(1)*PCK
|
|
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
|
|
c
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
|
|
SUBROUTINE RATSP1
|
|
C =================
|
|
C
|
|
C Evaluation of "preconditioned" 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'
|
|
PARAMETER(PGRD=4.1916825D-10)
|
|
DIMENSION EHK(MDEPTH)
|
|
C DIMENSION EHKL(MFREQL)
|
|
C
|
|
C zero the rates
|
|
C
|
|
DO ID=1,ND
|
|
PRADT(ID)=0.
|
|
PRADA(ID)=0.
|
|
FLRD(ID)=0.
|
|
DO ITR=1,NTRANS
|
|
RRU(ITR,ID)=0.
|
|
RRD(ITR,ID)=0.
|
|
END DO
|
|
DO ITRP=1,NTRPRD
|
|
PJBAR(ITRP,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 500 IJ=1,NFREQ
|
|
IF(IJX(IJ).EQ.-1) GO TO 500
|
|
FR=FREQ(IJ)
|
|
W0=W0E(IJ)
|
|
WW=W(IJ)
|
|
CALL OPACF1(IJ)
|
|
CALL RTEFR1(IJ)
|
|
IF(LROSS) CALL ROSSTD(IJ)
|
|
FLUXW=W(IJ)*RAD1(1)*FH(IJ)
|
|
GRADF(1,IJ)=FLUXW*ABSO1(1)/DENS(1)*PGRD
|
|
FLRD(1)=FLRD(1)+WW*FH(IJ)*RAD1(1)-WW*HEXTRD(IJ)
|
|
DO ID=2,ND
|
|
DT=UN/(ABSOT(ID)+ABSOT(ID-1))/DELDMZ(ID-1)
|
|
FL=(RAD1(ID)*FAK1(ID)-RAD1(ID-1)*FAK1(ID-1))*DT
|
|
FLRD(ID)=FLRD(ID)+WW*FL
|
|
END DO
|
|
if(ioptab.lt.0) go to 500
|
|
C
|
|
C ---------------------
|
|
C Continuum transitions
|
|
C ---------------------
|
|
C
|
|
DO ID=1,ND
|
|
EHK(ID)=EXP(-HKT1(ID)*FR)
|
|
if(ilpsct.eq.0) then
|
|
ALAB(ID)=ALI1(ID)/(ABSO1(ID)-ELSCAT(ID))
|
|
else
|
|
ALAB(ID)=ALI1(ID)/ABSO1(ID)
|
|
end if
|
|
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
|
|
RLAM=SG*ALAB(ID)
|
|
ELIN=EMTRA(ITR,ID)*EHK(ID)
|
|
RADRES=RAD1(ID)-RLAM*BNUE(IJ)*ELIN
|
|
BNURES=BNUE(IJ)*(UN-RLAM*(ABTRA(ITR,ID)-ELIN))
|
|
RRU(ITR,ID)=RRU(ITR,ID)+SGW0*RADRES
|
|
RRD(ITR,ID)=RRD(ITR,ID)+SGW0*(RADRES+BNURES)*EHK(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
|
|
SG=PRFLIN(ID,IJ)
|
|
SGW0=SG*W0
|
|
RLAM=SG*ALAB(ID)
|
|
ELIN=EMTRA(ITR,ID)*EHK(ID)
|
|
RADRES=RAD1(ID)-RLAM*BNUE(IJ)*ELIN
|
|
BNURES=BNUE(IJ)*(UN-RLAM*(ABTRA(ITR,ID)-ELIN))
|
|
RRU(ITR,ID)=RRU(ITR,ID)+SGW0*RADRES
|
|
RRD(ITR,ID)=RRD(ITR,ID)+SGW0*(RADRES+BNURES)*EHK(ID)
|
|
50 CONTINUE
|
|
c
|
|
itrprd=iprd(itr)
|
|
if(itrprd.gt.0) then
|
|
s=un/(0.02654*osc0(itr))
|
|
do id=1,nd
|
|
sg=prflin(id,ij)*s
|
|
pjbar(itrprd,id)=pjbar(itrprd,id)+sg*w(ij)*rad1(id)
|
|
end do
|
|
end if
|
|
c
|
|
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)) go to 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))
|
|
A2=UN-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
|
|
SG=A1*PRFLIN(ID,IJ1)+A2*PRFLIN(ID,IJ0)
|
|
SGW0=SG*W0
|
|
RLAM=SG*ALAB(ID)
|
|
ELIN=EMTRA(ITR,ID)*EHK(ID)
|
|
RADRES=RAD1(ID)-RLAM*BNUE(IJ)*ELIN
|
|
BNURES=BNUE(IJ)*(UN-RLAM*(ABTRA(ITR,ID)-ELIN))
|
|
RRU(ITR,ID)=RRU(ITR,ID)+SGW0*RADRES
|
|
RRD(ITR,ID)=RRD(ITR,ID)+SGW0*(RADRES+BNURES)*EHK(ID)
|
|
80 CONTINUE
|
|
c
|
|
itrprd=iprd(itr)
|
|
if(itrprd.gt.0) then
|
|
s=un/(0.02654*osc0(itr))
|
|
do id=1,nd
|
|
SG=(A1*PRFLIN(ID,IJ1)+A2*PRFLIN(ID,IJ0))*s
|
|
pjbar(itrprd,id)=pjbar(itrprd,id)+sg*w(ij)*rad1(id)
|
|
end do
|
|
end if
|
|
c
|
|
90 CONTINUE
|
|
100 CONTINUE
|
|
C
|
|
C Opacity sampling option
|
|
C
|
|
ELSE
|
|
IF(NLINES(IJ).LE.0) GO TO 200
|
|
DO 190 ILINT=1,NLINES(IJ)
|
|
ITR=ITRLIN(ILINT,IJ)
|
|
KJ=IJ-IFR0(ITR)+KFR0(ITR)
|
|
INDXPA=IABS(INDEXP(ITR))
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
IF(INDXPA.NE.3 .AND. INDXPA.NE.4) THEN
|
|
DO 150 ID=1,ND
|
|
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 150
|
|
SG=PRFLIN(ID,KJ)
|
|
SGW0=SG*W0
|
|
RLAM=SG*ALAB(ID)
|
|
ELIN=EMTRA(ITR,ID)*EHK(ID)
|
|
RADRES=RAD1(ID)-RLAM*BNUE(IJ)*ELIN
|
|
BNURES=BNUE(IJ)*(UN-RLAM*(ABTRA(ITR,ID)-ELIN))
|
|
RRU(ITR,ID)=RRU(ITR,ID)+SGW0*RADRES
|
|
RRD(ITR,ID)=RRD(ITR,ID)+SGW0*(RADRES+BNURES)*EHK(ID)
|
|
150 CONTINUE
|
|
ELSE
|
|
DO 160 ID=1,ND
|
|
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 160
|
|
KJD=JIDI(ID)
|
|
SG=EXP(XJID(ID)*SIGFE(KJD,KJ)+
|
|
* (UN-XJID(ID))*SIGFE(KJD+1,KJ))
|
|
SGW0=SG*W0
|
|
RLAM=SG*ALAB(ID)
|
|
ELIN=EMTRA(ITR,ID)*EHK(ID)
|
|
RADRES=RAD1(ID)-RLAM*BNUE(IJ)*ELIN
|
|
BNURES=BNUE(IJ)*(UN-RLAM*(ABTRA(ITR,ID)-ELIN))
|
|
RRU(ITR,ID)=RRU(ITR,ID)+SGW0*RADRES
|
|
RRD(ITR,ID)=RRD(ITR,ID)+SGW0*(RADRES+BNURES)*EHK(ID)
|
|
160 CONTINUE
|
|
END IF
|
|
190 CONTINUE
|
|
200 CONTINUE
|
|
END IF
|
|
500 CONTINUE
|
|
C
|
|
DO ID=1,ND
|
|
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
|
|
C
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
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
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
C
|
|
SUBROUTINE ALIST2
|
|
C =================
|
|
C
|
|
C Evaluation of all nexcessary ALI parameters + radiative rates
|
|
C (the routine is analogous to RATES1)
|
|
C a variant for derivatives of the rate matrix w.r.t. populations
|
|
C
|
|
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 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.
|
|
APT(II,ID)=0.
|
|
APN(II,ID)=0.
|
|
DO JJ=1,NLVEXP
|
|
APP(JJ,II,ID)=0.
|
|
END DO
|
|
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
|
|
dedm1=dm(1)/dens(1)
|
|
IF (IRDER.EQ.3) THEN
|
|
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)
|
|
LRDER=IJALI(IJ).GT.0
|
|
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)
|
|
IF(LRDER) THEN
|
|
APFR=(ABTRA(ITR,ID)-EMTRA(ITR,ID)*EXX(ID))*SGW0
|
|
IE=IABS(IIEXP(II))
|
|
JJ=IUP(ITR)
|
|
JE=IABS(IIEXP(JJ))
|
|
NREFI=NREFS(IATM(II),ID)
|
|
IF(IE.GT.0.AND.II.NE.NREFI.AND.ILTLEV(II).LE.0) THEN
|
|
APT(IE,ID)=APT(IE,ID)+APFR*DSFDT(ID)
|
|
APN(IE,ID)=APN(IE,ID)+APFR*DSFDN(ID)
|
|
DO KK=1,NLVEXP
|
|
APP(KK,IE,ID)=APP(KK,IE,ID)+APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
IF(JE.GT.0.AND.JJ.NE.NREFI.AND.ILTLEV(JJ).LE.0.
|
|
* AND.IABS(IMODL(II)).NE.4) THEN
|
|
APT(JE,ID)=APT(JE,ID)-APFR*DSFDT(ID)
|
|
APN(JE,ID)=APN(JE,ID)-APFR*DSFDN(ID)
|
|
DO KK=1,NLVEXP
|
|
APP(KK,JE,ID)=APP(KK,JE,ID)-APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
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)
|
|
IE=IABS(IIEXP(II))
|
|
JE=IABS(IIEXP(JJ))
|
|
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)
|
|
IF(LRDER) THEN
|
|
APFR=(ABTRA(ITR,ID)-EMTRA(ITR,ID)*EXX(ID))*SGW0
|
|
NREFI=NREFS(IATM(II),ID)
|
|
IF(IE.GT.0.AND.II.NE.NREFI.AND.ILTLEV(II).LE.0) THEN
|
|
APT(IE,ID)=APT(IE,ID)+APFR*DSFDT(ID)
|
|
APN(IE,ID)=APN(IE,ID)+APFR*DSFDN(ID)
|
|
DO KK=1,NLVEXP
|
|
APP(KK,IE,ID)=APP(KK,IE,ID)+APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
IF(JE.GT.0.AND.JJ.NE.NREFI.AND.ILTLEV(JJ).LE.0.
|
|
* AND.IABS(IMODL(II)).NE.4) THEN
|
|
APT(JE,ID)=APT(JE,ID)-APFR*DSFDT(ID)
|
|
APN(JE,ID)=APN(JE,ID)-APFR*DSFDN(ID)
|
|
DO KK=1,NLVEXP
|
|
APP(KK,JE,ID)=APP(KK,JE,ID)-APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
50 CONTINUE
|
|
c 55 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
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
IE=IABS(IIEXP(II))
|
|
JE=IABS(IIEXP(JJ))
|
|
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 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)
|
|
IF(LRDER) THEN
|
|
APFR=(ABTRA(ITR,ID)-EMTRA(ITR,ID)*EXX(ID))*SGW0
|
|
NREFI=NREFS(IATM(II),ID)
|
|
IF(IE.GT.0.AND.II.NE.NREFI.AND.ILTLEV(II).LE.0) THEN
|
|
APT(IE,ID)=APT(IE,ID)+APFR*DSFDT(ID)
|
|
APN(IE,ID)=APN(IE,ID)+APFR*DSFDN(ID)
|
|
DO KK=1,NLVEXP
|
|
APP(KK,IE,ID)=APP(KK,IE,ID)+APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
IF(JE.GT.0.AND.JJ.NE.NREFI.AND.ILTLEV(JJ).LE.0.
|
|
* AND.IABS(IMODL(II)).NE.4) THEN
|
|
APT(JE,ID)=APT(JE,ID)-APFR*DSFDT(ID)
|
|
APN(JE,ID)=APN(JE,ID)-APFR*DSFDN(ID)
|
|
DO KK=1,NLVEXP
|
|
APP(KK,JE,ID)=APP(KK,JE,ID)-APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
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 510 ID=1,ND
|
|
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 510
|
|
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)
|
|
IF(LRDER) THEN
|
|
APFR=(ABTRA(ITR,ID)-EMTRA(ITR,ID)*EXX(ID))*SGW0
|
|
NREFI=NREFS(IATM(II),ID)
|
|
IF(IE.GT.0.AND.II.NE.NREFI.AND.ILTLEV(II).LE.0) THEN
|
|
APT(IE,ID)=APT(IE,ID)+APFR*DSFDT(ID)
|
|
APN(IE,ID)=APN(IE,ID)+APFR*DSFDN(ID)
|
|
DO KK=1,NLVEXP
|
|
APP(KK,IE,ID)=APP(KK,IE,ID)+APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
IF(JE.GT.0.AND.JJ.NE.NREFI.AND.ILTLEV(JJ).LE.0
|
|
* .AND.IABS(IMODL(II)).NE.4) THEN
|
|
APT(JE,ID)=APT(JE,ID)-APFR*DSFDT(ID)
|
|
APN(JE,ID)=APN(JE,ID)-APFR*DSFDN(ID)
|
|
DO KK=1,NLVEXP
|
|
APP(KK,JE,ID)=APP(KK,JE,ID)-APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
510 CONTINUE
|
|
ELSE
|
|
DO 520 ID=1,ND
|
|
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 520
|
|
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)
|
|
IF(LRDER) THEN
|
|
APFR=(ABTRA(ITR,ID)-EMTRA(ITR,ID)*EXX(ID))*SGW0
|
|
NREFI=NREFS(IATM(II),ID)
|
|
IF(IE.GT.0.AND.II.NE.NREFI.AND.ILTLEV(II).LE.0) THEN
|
|
APT(IE,ID)=APT(IE,ID)+APFR*DSFDT(ID)
|
|
APN(IE,ID)=APN(IE,ID)+APFR*DSFDN(ID)
|
|
DO KK=1,NLVEXP
|
|
APP(KK,IE,ID)=APP(KK,IE,ID)+APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
IF(JE.GT.0.AND.JJ.NE.NREFI.AND.ILTLEV(JJ).LE.0
|
|
* .AND.IABS(IMODL(II)).NE.4) THEN
|
|
APT(JE,ID)=APT(JE,ID)-APFR*DSFDT(ID)
|
|
APN(JE,ID)=APN(JE,ID)-APFR*DSFDN(ID)
|
|
DO KK=1,NLVEXP
|
|
APP(KK,JE,ID)=APP(KK,JE,ID)-APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
520 CONTINUE
|
|
END IF
|
|
95 CONTINUE
|
|
END IF
|
|
100 CONTINUE
|
|
C
|
|
ELSE IF (IRDER.EQ.1) THEN
|
|
C
|
|
DO 200 IJ=1,NFREQ
|
|
IF(IJX(IJ).EQ.-1) GO TO 200
|
|
FR=FREQ(IJ)
|
|
W0=W0E(IJ)
|
|
LRDER=IJALI(IJ).GT.0
|
|
CALL OPACFD(IJ)
|
|
CALL RTEFR1(IJ)
|
|
CALL ALIFR1(IJ)
|
|
C
|
|
C ---------------------
|
|
C Continuum transitions
|
|
C ---------------------
|
|
C
|
|
DO 120 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 110 IBFT=1,NTRANC
|
|
ITR=ITRBF(IBFT)
|
|
SG=CROSS(IBFT,IJ)
|
|
IF(SG.LE.0.) GO TO 110
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 110
|
|
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)
|
|
DRDT(ITR,ID)=DRDT(ITR,ID)+SGW0*RBNUF(ID)
|
|
IF(LRDER) THEN
|
|
APFR=(ABTRA(ITR,ID)-EMTRA(ITR,ID)*EXX(ID))*SGW0
|
|
IE=IABS(IIEXP(II))
|
|
JJ=IUP(ITR)
|
|
JE=IABS(IIEXP(JJ))
|
|
NREFI=NREFS(IATM(II),ID)
|
|
IF(IE.GT.0.AND.II.NE.NREFI.AND.ILTLEV(II).LE.0) THEN
|
|
APT(IE,ID)=APT(IE,ID)+APFR*DSFDT(ID)
|
|
APN(IE,ID)=APN(IE,ID)+APFR*DSFDN(ID)
|
|
END IF
|
|
IF(JE.GT.0.AND.JJ.NE.NREFI.AND.ILTLEV(JJ).LE.0.
|
|
* AND.IABS(IMODL(II)).NE.4) THEN
|
|
APT(JE,ID)=APT(JE,ID)-APFR*DSFDT(ID)
|
|
APN(JE,ID)=APN(JE,ID)-APFR*DSFDN(ID)
|
|
END IF
|
|
END IF
|
|
110 CONTINUE
|
|
120 CONTINUE
|
|
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)
|
|
IE=IABS(IIEXP(II))
|
|
JE=IABS(IIEXP(JJ))
|
|
DO 150 ID=1,ND
|
|
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 150
|
|
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)
|
|
IF(LRDER) THEN
|
|
APFR=(ABTRA(ITR,ID)-EMTRA(ITR,ID)*EXX(ID))*SGW0
|
|
NREFI=NREFS(IATM(II),ID)
|
|
IF(IE.GT.0.AND.II.NE.NREFI.AND.ILTLEV(II).LE.0) THEN
|
|
APT(IE,ID)=APT(IE,ID)+APFR*DSFDT(ID)
|
|
APN(IE,ID)=APN(IE,ID)+APFR*DSFDN(ID)
|
|
END IF
|
|
IF(JE.GT.0.AND.JJ.NE.NREFI.AND.ILTLEV(JJ).LE.0.
|
|
* AND.IABS(IMODL(II)).NE.4) THEN
|
|
APT(JE,ID)=APT(JE,ID)-APFR*DSFDT(ID)
|
|
APN(JE,ID)=APN(JE,ID)-APFR*DSFDN(ID)
|
|
END IF
|
|
END IF
|
|
150 CONTINUE
|
|
c 155 CONTINUE
|
|
ENDIF
|
|
IF(NLINES(IJ).LE.0) GO TO 200
|
|
C
|
|
C the "overlapping" lines at the given frequency
|
|
C
|
|
DO 190 ILINT=1,NLINES(IJ)
|
|
ITR=ITRLIN(ILINT,IJ)
|
|
if(linexp(itr)) goto 190
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
IE=IABS(IIEXP(II))
|
|
JE=IABS(IIEXP(JJ))
|
|
IJ0=IFR0(ITR)
|
|
DO 160 IJT=IJ0,IFR1(ITR)
|
|
IF(FREQ(IJT).LE.FR) THEN
|
|
IJ0=IJT
|
|
GO TO 170
|
|
END IF
|
|
160 CONTINUE
|
|
170 IJ1=IJ0-1
|
|
A1=(FR-FREQ(IJ0))/(FREQ(IJ1)-FREQ(IJ0))*W0
|
|
A2=W0-A1
|
|
DO 180 ID=1,ND
|
|
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 180
|
|
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)
|
|
IF(LRDER) THEN
|
|
APFR=(ABTRA(ITR,ID)-EMTRA(ITR,ID)*EXX(ID))*SGW0
|
|
NREFI=NREFS(IATM(II),ID)
|
|
IF(IE.GT.0.AND.II.NE.NREFI.AND.ILTLEV(II).LE.0) THEN
|
|
APT(IE,ID)=APT(IE,ID)+APFR*DSFDT(ID)
|
|
APN(IE,ID)=APN(IE,ID)+APFR*DSFDN(ID)
|
|
END IF
|
|
IF(JE.GT.0.AND.JJ.NE.NREFI.AND.ILTLEV(JJ).LE.0.
|
|
* AND.IABS(IMODL(II)).NE.4) THEN
|
|
APT(JE,ID)=APT(JE,ID)-APFR*DSFDT(ID)
|
|
APN(JE,ID)=APN(JE,ID)-APFR*DSFDN(ID)
|
|
END IF
|
|
END IF
|
|
180 CONTINUE
|
|
190 CONTINUE
|
|
C
|
|
C Opacity sampling option
|
|
C
|
|
ELSE
|
|
IF(NLINES(IJ).LE.0) GO TO 200
|
|
DO 195 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 610 ID=1,ND
|
|
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 610
|
|
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)
|
|
IF(LRDER) THEN
|
|
APFR=(ABTRA(ITR,ID)-EMTRA(ITR,ID)*EXX(ID))*SGW0
|
|
NREFI=NREFS(IATM(II),ID)
|
|
IF(IE.GT.0.AND.II.NE.NREFI.AND.ILTLEV(II).LE.0) THEN
|
|
APT(IE,ID)=APT(IE,ID)+APFR*DSFDT(ID)
|
|
APN(IE,ID)=APN(IE,ID)+APFR*DSFDN(ID)
|
|
END IF
|
|
IF(JE.GT.0.AND.JJ.NE.NREFI.AND.ILTLEV(JJ).LE.0
|
|
* .AND.IABS(IMODL(II)).NE.4) THEN
|
|
APT(JE,ID)=APT(JE,ID)-APFR*DSFDT(ID)
|
|
APN(JE,ID)=APN(JE,ID)-APFR*DSFDN(ID)
|
|
END IF
|
|
END IF
|
|
610 CONTINUE
|
|
ELSE
|
|
DO 620 ID=1,ND
|
|
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 620
|
|
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)
|
|
IF(LRDER) THEN
|
|
APFR=(ABTRA(ITR,ID)-EMTRA(ITR,ID)*EXX(ID))*SGW0
|
|
NREFI=NREFS(IATM(II),ID)
|
|
IF(IE.GT.0.AND.II.NE.NREFI.AND.ILTLEV(II).LE.0) THEN
|
|
APT(IE,ID)=APT(IE,ID)+APFR*DSFDT(ID)
|
|
APN(IE,ID)=APN(IE,ID)+APFR*DSFDN(ID)
|
|
END IF
|
|
IF(JE.GT.0.AND.JJ.NE.NREFI.AND.ILTLEV(JJ).LE.0
|
|
* .AND.IABS(IMODL(II)).NE.4) THEN
|
|
APT(JE,ID)=APT(JE,ID)-APFR*DSFDT(ID)
|
|
APN(JE,ID)=APN(JE,ID)-APFR*DSFDN(ID)
|
|
END IF
|
|
END IF
|
|
620 CONTINUE
|
|
END IF
|
|
195 CONTINUE
|
|
END IF
|
|
200 CONTINUE
|
|
C
|
|
ELSE IF (IRDER.EQ.2) THEN
|
|
C
|
|
DO 300 IJ=1,NFREQ
|
|
IF(IJX(IJ).EQ.-1) GO TO 300
|
|
FR=FREQ(IJ)
|
|
W0=W0E(IJ)
|
|
LRDER=IJALI(IJ).GT.0
|
|
CALL OPACFD(IJ)
|
|
CALL RTEFR1(IJ)
|
|
CALL ALIFR1(IJ)
|
|
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 210 IBFT=1,NTRANC
|
|
ITR=ITRBF(IBFT)
|
|
SG=CROSS(IBFT,IJ)
|
|
IF(SG.LE.0.) GO TO 210
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 210
|
|
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)
|
|
DRDT(ITR,ID)=DRDT(ITR,ID)+SGW0*RBNUF(ID)
|
|
IF(LRDER) THEN
|
|
APFR=(ABTRA(ITR,ID)-EMTRA(ITR,ID)*EXX(ID))*SGW0
|
|
IE=IABS(IIEXP(II))
|
|
JJ=IUP(ITR)
|
|
JE=IABS(IIEXP(JJ))
|
|
NREFI=NREFS(IATM(II),ID)
|
|
IF(IE.GT.0.AND.II.NE.NREFI.AND.ILTLEV(II).LE.0) THEN
|
|
DO KK=1,NLVEXP
|
|
APP(KK,IE,ID)=APP(KK,IE,ID)+APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
IF(JE.GT.0.AND.JJ.NE.NREFI.AND.ILTLEV(JJ).LE.0.
|
|
* AND.IABS(IMODL(II)).NE.4) THEN
|
|
DO KK=1,NLVEXP
|
|
APP(KK,JE,ID)=APP(KK,JE,ID)-APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
210 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)
|
|
IE=IABS(IIEXP(II))
|
|
JE=IABS(IIEXP(JJ))
|
|
DO 250 ID=1,ND
|
|
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 250
|
|
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)
|
|
IF(LRDER) THEN
|
|
APFR=(ABTRA(ITR,ID)-EMTRA(ITR,ID)*EXX(ID))*SGW0
|
|
NREFI=NREFS(IATM(II),ID)
|
|
IF(IE.GT.0.AND.II.NE.NREFI.AND.ILTLEV(II).LE.0) THEN
|
|
DO KK=1,NLVEXP
|
|
APP(KK,IE,ID)=APP(KK,IE,ID)+APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
IF(JE.GT.0.AND.JJ.NE.NREFI.AND.ILTLEV(JJ).LE.0.
|
|
* AND.IABS(IMODL(II)).NE.4) THEN
|
|
DO KK=1,NLVEXP
|
|
APP(KK,JE,ID)=APP(KK,JE,ID)-APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
250 CONTINUE
|
|
ENDIF
|
|
IF(NLINES(IJ).LE.0) GO TO 300
|
|
C
|
|
C the "overlapping" lines at the given frequency
|
|
C
|
|
DO 290 ILINT=1,NLINES(IJ)
|
|
ITR=ITRLIN(ILINT,IJ)
|
|
if(linexp(itr)) goto 290
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
IE=IABS(IIEXP(II))
|
|
JE=IABS(IIEXP(JJ))
|
|
IJ0=IFR0(ITR)
|
|
DO IJT=IJ0,IFR1(ITR)
|
|
IF(FREQ(IJT).LE.FR) THEN
|
|
IJ0=IJT
|
|
GO TO 270
|
|
END IF
|
|
END DO
|
|
270 IJ1=IJ0-1
|
|
A1=(FR-FREQ(IJ0))/(FREQ(IJ1)-FREQ(IJ0))*W0
|
|
A2=W0-A1
|
|
DO 280 ID=1,ND
|
|
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 280
|
|
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)
|
|
IF(LRDER) THEN
|
|
APFR=(ABTRA(ITR,ID)-EMTRA(ITR,ID)*EXX(ID))*SGW0
|
|
NREFI=NREFS(IATM(II),ID)
|
|
IF(IE.GT.0.AND.II.NE.NREFI.AND.ILTLEV(II).LE.0) THEN
|
|
DO KK=1,NLVEXP
|
|
APP(KK,IE,ID)=APP(KK,IE,ID)+APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
IF(JE.GT.0.AND.JJ.NE.NREFI.AND.ILTLEV(JJ).LE.0.
|
|
* AND.IABS(IMODL(II)).NE.4) THEN
|
|
DO KK=1,NLVEXP
|
|
APP(KK,JE,ID)=APP(KK,JE,ID)-APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
280 CONTINUE
|
|
290 CONTINUE
|
|
C
|
|
C Opacity sampling option
|
|
C
|
|
ELSE
|
|
IF(NLINES(IJ).LE.0) GO TO 300
|
|
DO 295 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 710 ID=1,ND
|
|
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 710
|
|
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)
|
|
IF(LRDER) THEN
|
|
APFR=(ABTRA(ITR,ID)-EMTRA(ITR,ID)*EXX(ID))*SGW0
|
|
NREFI=NREFS(IATM(II),ID)
|
|
IF(IE.GT.0.AND.II.NE.NREFI.AND.ILTLEV(II).LE.0) THEN
|
|
DO KK=1,NLVEXP
|
|
APP(KK,IE,ID)=APP(KK,IE,ID)+APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
IF(JE.GT.0.AND.JJ.NE.NREFI.AND.ILTLEV(JJ).LE.0
|
|
* .AND.IABS(IMODL(II)).NE.4) THEN
|
|
DO KK=1,NLVEXP
|
|
APP(KK,JE,ID)=APP(KK,JE,ID)-APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
710 CONTINUE
|
|
ELSE
|
|
DO 720 ID=1,ND
|
|
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 720
|
|
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)
|
|
IF(LRDER) THEN
|
|
APFR=(ABTRA(ITR,ID)-EMTRA(ITR,ID)*EXX(ID))*SGW0
|
|
NREFI=NREFS(IATM(II),ID)
|
|
IF(IE.GT.0.AND.II.NE.NREFI.AND.ILTLEV(II).LE.0) THEN
|
|
DO KK=1,NLVEXP
|
|
APP(KK,IE,ID)=APP(KK,IE,ID)+APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
IF(JE.GT.0.AND.JJ.NE.NREFI.AND.ILTLEV(JJ).LE.0
|
|
* .AND.IABS(IMODL(II)).NE.4) THEN
|
|
DO KK=1,NLVEXP
|
|
APP(KK,JE,ID)=APP(KK,JE,ID)-APFR*DSFDP(KK,ID)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
720 CONTINUE
|
|
END IF
|
|
295 CONTINUE
|
|
END IF
|
|
300 CONTINUE
|
|
C
|
|
ELSE
|
|
CALL QUIT(' Invalid IRDER - ALIST2',irder,irder)
|
|
END IF
|
|
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
|
|
C IF(LRDER) THEN
|
|
IF(IRDER.GT.0) THEN
|
|
DO II=1,NLVEXP
|
|
APT(II,ID)=APT(II,ID)*CRSW(ID)
|
|
APN(II,ID)=APN(II,ID)*CRSW(ID)
|
|
DO JJ=1,NLVEXP
|
|
APP(JJ,II,ID)=APP(JJ,II,ID)*CRSW(ID)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
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
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
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
|
|
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE ALISK2
|
|
C =================
|
|
C
|
|
C Simplified routine ALISET for Kantorovich iteration
|
|
C
|
|
C Evaluation of all nexcessary ALI parameters + radiative rates
|
|
C (the routine is analogous to RATES)
|
|
C
|
|
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
|
|
C
|
|
DO ID=1,ND
|
|
FCOOLI(ID)=0.
|
|
FLFIX(ID)=0.
|
|
FLEXP(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)
|
|
CALL RTEFR1(IJ)
|
|
CALL ALIFRK(IJ)
|
|
IF(LROSS) CALL ROSSTD(IJ)
|
|
if(ioptab.lt.0) go to 100
|
|
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
|
|
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)
|
|
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)
|
|
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)
|
|
50 CONTINUE
|
|
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)) go to 90
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
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 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)
|
|
80 CONTINUE
|
|
90 CONTINUE
|
|
C
|
|
C Opacity sampling option
|
|
C
|
|
ELSE
|
|
IF(NLINES(IJ).LE.0) GO TO 100
|
|
DO 190 ILINT=1,NLINES(IJ)
|
|
ITR=ITRLIN(ILINT,IJ)
|
|
KJ=IJ-IFR0(ITR)+KFR0(ITR)
|
|
INDXPA=IABS(INDEXP(ITR))
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
IF(INDXPA.NE.3 .AND. INDXPA.NE.4) THEN
|
|
DO 150 ID=1,ND
|
|
IF(IPZERO(II,ID).NE.0.OR.IPZERO(JJ,ID).NE.0) GO TO 150
|
|
SGW0=PRFLIN(ID,KJ)*W0
|
|
RRU(ITR,ID)=RRU(ITR,ID)+SGW0*RAD1(ID)
|
|
RRD(ITR,ID)=RRD(ITR,ID)+SGW0*RBNU(ID)
|
|
150 CONTINUE
|
|
ELSE
|
|
DO 160 ID=1,ND
|
|
IF(IPZERO(II,ID).NE.0.OR.
|
|
* IPZERO(JJ,ID).NE.0) GO TO 160
|
|
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)
|
|
160 CONTINUE
|
|
END IF
|
|
190 CONTINUE
|
|
END IF
|
|
100 CONTINUE
|
|
C
|
|
C multiply some quantities by frequency-independent constants
|
|
C
|
|
DO ID=1,ND
|
|
FCO OL(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
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE DOPGAM(ITR,ID,T,DOP,AGAM)
|
|
C ====================================
|
|
C
|
|
C Doppler width and the Voigt damping parameter for the line ITR
|
|
C
|
|
C Input:
|
|
C ITR - index of transition
|
|
C ID - depth index
|
|
C T - temperature
|
|
C Output:
|
|
C DOP - Doppler width
|
|
C AGAM - total damping parameter (in units of Doppler widths;
|
|
C ie. = gam/4pi/DOP, where gam is the "physical" damping
|
|
C parameter expresed in circular frequencies)
|
|
C
|
|
C Damping parameter is calculated only for transitions with
|
|
C |IPROF(ITR)| = 1 (ie. those for which either Voigt or some non-
|
|
C standard profile is assumed)
|
|
C Determination of AGAM:
|
|
C is controlled by input parameters transmitted by COMMON/VOIPAR:
|
|
C
|
|
C GAMAR(IP) - for > 0 - has the meaning of natural damping
|
|
C parameter (=Einstein coefficient for
|
|
C spontaneous emission)
|
|
C = 0 - classical natural damping assumed
|
|
C < 0 - damping is given by a non-standard,
|
|
C user supplied procedure GAMSP
|
|
C STARK1(IP) - = 0 - Stark broadening neglected
|
|
C < 0 - scaled classical expression
|
|
C (ie gam = -STARK1 * classical Stark)
|
|
C > 0 - Stark broadening given by
|
|
C n(el)*[STARK1*T**STARK2 + STARK3]
|
|
C STRAK2, STARK3 - see above
|
|
C VDWH(IP) - .le.0 - Van der Waals broadening neglected
|
|
C > 0 - scaled classical expression
|
|
C
|
|
C the corresponding index IP is given by ITRA(IUP(ITR),ILOW(ITR))
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (BOL2=2.76108D-16, CIN=UN/2.997925D10)
|
|
PARAMETER (R02=2.5,R12=45.,OP4=0.4,VW0=4.5E-9)
|
|
C
|
|
J=IUP(ITR)
|
|
IAT=IATM(J)
|
|
FR=FR0(ITR)
|
|
IE=IEL(J)
|
|
AM=BOL2/AMASS(IAT)*T
|
|
AGAM=0.
|
|
C
|
|
C Doppler width
|
|
C
|
|
DOP=FR*CIN*SQRT(AM+VTURBS(ID)*VTURBS(ID))
|
|
C
|
|
C -----------------
|
|
C damping parameter - only for IPROF = 1
|
|
C
|
|
IF(IABS(IPROF(ITR)).NE.1) RETURN
|
|
IP=ITRA(J,ILOW(ITR))
|
|
ANE=ELEC(ID)
|
|
C
|
|
C Natural (radiation) broadening
|
|
C
|
|
If(GAMAR(IP).GT.0.) THEN
|
|
AGAM=GAMAR(IP)
|
|
ELSE IF (GAMAR(IP).EQ.0.) THEN
|
|
AGAM=2.47342D-22*FR*FR
|
|
ELSE
|
|
C
|
|
C Non-standard expression - for the total damping parameter,
|
|
C not only for radiation damping
|
|
C
|
|
CALL GAMSP(ITR,T,ANE,AGAM)
|
|
END IF
|
|
C
|
|
C Stark broadening
|
|
C
|
|
Z=FLOAT(IZ(IE))
|
|
ANFF=Z*Z*EH/ENION(J)
|
|
IF(STARK1(IP).EQ.0.) THEN
|
|
AGAM=AGAM+1.D-8*ANFF**2.5*ANE
|
|
ELSE IF (STARK1(IP).GT.0.) THEN
|
|
AGAM=AGAM+ANE*(STARK1(IP)*T**STARK2(IP)+STARK3(IP))
|
|
END IF
|
|
C
|
|
C Van der Waals broadening
|
|
C
|
|
IF(IELH.GT.0) THEN
|
|
AH=POPUL(NFIRST(IELH),ID)
|
|
ELSE
|
|
AH=DENS(ID)/WMM(ID)/YTOT(ID)
|
|
END IF
|
|
IF(IELHE1.NE.0) THEN
|
|
AHE=AH*ABUND(IATHE,ID)
|
|
ELSE
|
|
AHE=AH*ABNDD(2,ID)
|
|
END IF
|
|
VDWC=(T*1.E-4)**0.3*(AH+0.42*AHE)
|
|
IF(VDWH(IP).GE.0.) THEN
|
|
IF(IAT.LT.21) THEN
|
|
R2=R02*(ANFF/Z)**2
|
|
ELSE IF(IAT.LT.45) then
|
|
R2=(R12-FLOAT(IAT))/Z
|
|
ELSE
|
|
R2=0.5
|
|
END IF
|
|
GW0=VDWC*VW0*R2**OP4
|
|
AGAM=AGAM+GW0
|
|
ELSE IF (VDWH(IP).LT.0.) THEN
|
|
GW0=VDWC*EXP(2.3025851*VDWH(IP))
|
|
AGAM=AGAM+GW0
|
|
END IF
|
|
c
|
|
C Total damping parameter in units of Doppler widths
|
|
C
|
|
AGAM=AGAM/DOP/12.566370614
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE GAMSP(ITR,T,ANE,AGAM)
|
|
C ================================
|
|
C
|
|
C Non-standard expression for the damping parameter -
|
|
C a user-supplied procedure
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
AGAM=0.
|
|
if(itr.le.0) return
|
|
t1=t
|
|
ane1=ane
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
FUNCTION PROFIL(FR,A,DOP,ITR,IP,ID)
|
|
C ===================================
|
|
C
|
|
C Standard absorption profile - normalized to unity
|
|
C
|
|
C Input:
|
|
C FR - frequency
|
|
C A - Voigt damping parameter
|
|
C DOP - Doppler width
|
|
C ITR - transition index
|
|
C ID - depth index
|
|
C
|
|
C Profile is evaluated differently for different IP=IPROF(ITR):
|
|
C IP = 0 - Doppler profile
|
|
C IP = 1 - Voigt profile
|
|
C IP = 2 - approximate Stark (+ Doppler) profile for hydrogen lines;
|
|
C however, the routine is called with IP=2 only from
|
|
C START, i.e. for the initialization
|
|
C IP > 9 - non-standard profile, given by a user-supplied
|
|
C procedure PROFSP
|
|
C IP = 12 - approximate Stark profile for hydrogen lines
|
|
C (Klaus Wener's routines)
|
|
C
|
|
C V - frequency displacement from the line center in units of
|
|
C Doppler width
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
common/quasun/tqmprf,iquasi,nunalp,nunbet,nungam,nunbal
|
|
PARAMETER (PISQ=1.77245385090551D0,PISQ1=UN/PISQ)
|
|
C
|
|
PROFIL=0.
|
|
V=(FR-FR0(ITR))/DOP
|
|
IPA=IABS(IP)
|
|
IF(IPA.EQ.0) THEN
|
|
IF(V.LE.13.) PROFIL=EXP(-V*V)*PISQ1
|
|
ELSE IF(IPA.EQ.1) THEN
|
|
PROFIL=VOIGT(V,A)*PISQ1
|
|
ELSE IF(IPA.EQ.2) THEN
|
|
IF(ID.GT.0) THEN
|
|
ANE=ELEC(ID)
|
|
ELSE
|
|
ANE=1.e9*grav
|
|
END IF
|
|
if(ane.le.0.) ane=1.e14
|
|
F000=EXP(0.666666667*LOG(ANE))
|
|
II=NQUANT(ILOW(ITR))
|
|
JJ=NQUANT(IUP(ITR))
|
|
IZZ=IZ(IEL(ILOW(ITR)))
|
|
FAC=TWO
|
|
if(iquasi.gt.0.and.ii.eq.1) then
|
|
if(jj.eq.2) fac=un
|
|
if(jj.eq.3.and.iquasi.gt.1) fac=un
|
|
end if
|
|
F00=1.25D-9*F000
|
|
IF(IZZ.EQ.2) THEN
|
|
FAC=UN
|
|
F00=3.906D-11*F000
|
|
END IF
|
|
CALL STARK0(II,JJ,IZZ,XKIJ,WL0,FIJ)
|
|
FXK=F00*XKIJ
|
|
DBETA=WL0*WL0/2.997925D18/FXK
|
|
BETAD=DOP*DBETA
|
|
CALL DIVSTR(IZZ)
|
|
BETA=DBETA*ABS(FR-FR0(ITR))
|
|
SG=STARKA(BETA,fac)*BETAD
|
|
PROFIL=SG
|
|
ELSE IF(IPA.GT.10) THEN
|
|
PROFIL=PROFSP(FR,DOP,ITR,ID)
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION VOIGT(V,AGAM)
|
|
C ======================
|
|
C
|
|
C Voigt function
|
|
C Procedure after Matta and Reichel, 1971, Math.Comp. 25, 339.
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
DIMENSION HN(12),EN(12)
|
|
PARAMETER (PI=3.141592653589793D0, M=12, HH=0.5D0, UN=1.D0)
|
|
PARAMETER (PISQ=1.77245385090551D0,PISQ1=UN/PISQ)
|
|
DATA ICOMP /0/
|
|
SAVE EN,HN,PH,HP,ICOMP
|
|
C
|
|
C Initialization of auxiliary quantities
|
|
C
|
|
IF(ICOMP.EQ.0) THEN
|
|
HP=HH*PISQ1
|
|
PH=PI/HH
|
|
DO I=1,M
|
|
XI=I
|
|
U=XI*XI*HH*HH
|
|
EN(I)=EXP(-U)
|
|
HN(I)=4.D0*U
|
|
END DO
|
|
ICOMP=1
|
|
END IF
|
|
C
|
|
C Main term
|
|
C
|
|
AGAM1=UN/AGAM
|
|
X=V*AGAM1
|
|
T=0.25D0*AGAM1*AGAM1
|
|
X2=X*X
|
|
X4=4.D0*X2
|
|
S1=UN+X2
|
|
S2=UN-X2
|
|
U0=0.
|
|
DO I=1,M
|
|
S0=HN(I)*T
|
|
U=EN(I)/((S2+S0)*(S2+S0)+X4)
|
|
U0=U0+U*(S1+S0)
|
|
END DO
|
|
S2=UN/S1
|
|
U0=HP*(S2+2.D0*U0)
|
|
C
|
|
C Correction term
|
|
C
|
|
IF(T.GE.0.25/(PH*PH)) THEN
|
|
U=X/2.D0/T
|
|
A=COS(U)
|
|
B=SIN(U)
|
|
TSQ1=UN/SQRT(T)
|
|
S1=PH*TSQ1
|
|
S2=S1*X
|
|
C=EXP(-S1)-COS(S2)
|
|
D=SIN(S2)
|
|
T4=0.25D0/T
|
|
U=EXP(-X2*T4-S1+T4)*PISQ*TSQ1/(C*C+D*D)
|
|
U0=U0+U*(A*C-B*D)
|
|
END IF
|
|
C
|
|
VOIGT=U0*AGAM1*PISQ1
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
function voigte(vs,a)
|
|
c =====================
|
|
c
|
|
c computes a voigt function h = h(a,v)
|
|
c a=gamma/(4*pi*dnud) and v=(nu-nu0)/dnud. this is done after
|
|
c traving (landolt-b\rnstein, p. 449).
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
real*4 vs,a
|
|
PARAMETER (UN=1., TWO=2.)
|
|
dimension ak(19),a1(5)
|
|
data ak /-1.12470432, -0.15516677, 3.28867591, -2.34357915,
|
|
* 0.42139162, -4.48480194, 9.39456063, -6.61487486, 1.98919585,
|
|
* -0.22041650, 0.554153432, 0.278711796,-0.188325687, 0.042991293,
|
|
*-0.003278278, 0.979895023,-0.962846325, 0.532770573,-0.122727278/
|
|
data sqp/1.772453851/,sq2/1.414213562/
|
|
c
|
|
v = abs(vs)
|
|
u = a + v
|
|
v2 = v*v
|
|
if (a.eq.0.0) go to 140
|
|
if (a.gt.0.2) go to 120
|
|
if (v.ge.5.0) go to 121
|
|
c
|
|
ex=0.
|
|
if(v2.lt.100.) ex = exp(-v2)
|
|
k = 1
|
|
c
|
|
100 quo = un
|
|
if (v.lt.2.4) go to 101
|
|
quo = un/(v2 - 1.5)
|
|
m = 11
|
|
go to 102
|
|
c
|
|
101 m = 6
|
|
if (v.lt.1.3) m = 1
|
|
102 do 103 i=1,5
|
|
a1(i) = ak(m)
|
|
m = m + 1
|
|
103 continue
|
|
h1 = quo*(a1(1) + v*(a1(2) + v*(a1(3) + v*(a1(4) + v*a1(5)))))
|
|
if (k.gt.1) go to 110
|
|
c
|
|
c a le 0.2 and v lt 5.
|
|
c
|
|
h = h1*a + ex*(un + a*a*(un - two*v2))
|
|
voigte=h
|
|
return
|
|
c
|
|
110 pqs = two/sqp
|
|
h1p = h1 + pqs*ex
|
|
h2p = pqs*h1p - two*v2*ex
|
|
h3p = (pqs*(un - ex*(un - two*v2)) - two*v2*h1p)/3. + pqs*h2p
|
|
h4p = (two*v2*v2*ex - pqs*h1p)/3. + pqs*h3p
|
|
psi = ak(16) + a*(ak(17) + a*(ak(18) + a*ak(19)))
|
|
c
|
|
c 0.2 lt a le 1.4 and a + v le 3.2
|
|
c
|
|
h = psi*(ex + a*(h1p + a*(h2p + a*(h3p + a*h4p))))
|
|
voigte=h
|
|
return
|
|
c
|
|
120 if (a.gt.1.4.or.u.gt.3.2) go to 130
|
|
ex=0.
|
|
if(v2.lt.100.)ex = exp(-v2)
|
|
k = 2
|
|
go to 100
|
|
c
|
|
c a le 0.2 and v ge 5.
|
|
c
|
|
121 h = a*(15. + 6.*v2 + 4.*v2*v2)/(4.*v2*v2*v2*sqp)
|
|
voigte=h
|
|
return
|
|
c
|
|
130 a2 = a*a
|
|
u = sq2*(a2 + v2)
|
|
u2 = un/(u*u)
|
|
c
|
|
c a gt 1.4 or a + v gt 3.2
|
|
c
|
|
h = sq2/sqp*a/u*(1. + u2*(3.*v2 - a2) +
|
|
, u2*u2*(15.*v2*v2 - 30.*v2*a2 + 3.*a2*a2))
|
|
voigte=h
|
|
return
|
|
c
|
|
c a eq 0.
|
|
c
|
|
140 h=0.
|
|
if(v2.lt.100.) h=exp(-v2)
|
|
voigte=h
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
FUNCTION PROFSP(FR,DOP,ITR,ID)
|
|
C ================================
|
|
C
|
|
C Non-standard absorption profile - normalized to unity;
|
|
C a user supplied procedure
|
|
C
|
|
C Input:
|
|
C FR - frequency
|
|
C A - Voigt damping parameter
|
|
C DOP - Doppler width
|
|
C ITR - transition index
|
|
C ID - depth index
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
C
|
|
PROFSP=0.
|
|
IP=IPROF(ITR)
|
|
C
|
|
C Klaus Werner's Voigt+Stark wing profile (formula A.3.4)
|
|
C
|
|
IF(ABS(IP).NE.12) RETURN
|
|
|
|
C 1- Stark wings
|
|
|
|
II=NQUANT(ILOW(ITR))
|
|
JJ=NQUANT(IUP(ITR))
|
|
SIJ=JJ*(JJ-1)+II*(II-1)
|
|
C
|
|
C Micro-field
|
|
C
|
|
ZMIKRO=0.
|
|
DO IAT=1,NATOM
|
|
N0I=N0A(IAT)
|
|
NKI=NKA(IAT)
|
|
DO I=N0I,NKI-1
|
|
IE=IEL(I)
|
|
CH=IZ(IE)-1
|
|
CH32=CH*SQRT(CH)
|
|
ZMIKRO=ZMIKRO+CH32*POPUL(I,ID)
|
|
END DO
|
|
CH=CH+UN
|
|
CH32=CH*SQRT(CH)
|
|
ZMIKRO=ZMIKRO+CH32*POPUL(NKI,ID)
|
|
END DO
|
|
CALL SABOLF(ID)
|
|
DO ION=1,NION
|
|
CH=IZ(ION)-1
|
|
CH32=CH*SQRT(CH)
|
|
ZMIKRO=ZMIKRO+CH32*USUM(ION)
|
|
END DO
|
|
ZMIKRO=ZMIKRO**0.6666667
|
|
C
|
|
IAT=IATM(ILOW(ITR))
|
|
IE=IEL(ILOW(ITR))
|
|
CH=IZ(IE)
|
|
DBETA=1.385*CH/SIJ/ZMIKRO
|
|
C
|
|
C empirical correction in PRO2
|
|
C
|
|
CORRE=UN
|
|
IF(IE.EQ.IELHE2 .AND.ILOW(ITR).GT.(NFIRST(IE)+1))
|
|
* CORRE=HALF
|
|
IF(IAT.NE.IATH .AND. IAT.NE.IATHE) THEN
|
|
CORRE=UN/(CH-UN)
|
|
END IF
|
|
DBETA=DBETA/CORRE
|
|
C
|
|
BETAD=DOP*DBETA
|
|
BETA=DBETA*ABS(FR-FR0(ITR))
|
|
SIGST=UBETA(BETA)*BETAD
|
|
|
|
C 2- Voigt profile
|
|
|
|
AGAMS=5.E-5*ELEC(ID)/SQRT(TEMP(ID))*JJ*JJ/CH/CH
|
|
AGAM=2.47342D-22*FR*FR+AGAMS
|
|
AA=AGAM/12.56637/DOP
|
|
V=(FR-FR0(ITR))/DOP
|
|
SIGVT=VOIGT(V,AA)/1.77245385090551D0
|
|
SGA=SIGVT
|
|
IF(SIGST.GT.SIGVT) SGA=SIGST
|
|
PROFSP=SGA
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
FUNCTION UBETA(BETA)
|
|
C =====================
|
|
C
|
|
C **********************************************************************
|
|
C ***
|
|
C *** CALLED BY: SUBROUTINE PROFSP
|
|
C *** CALLS: SUBROUTINE LAGRAN
|
|
C ***
|
|
C *** Interpolation of function U(beta) in table from Dien (ApJ 109,452)
|
|
C ***
|
|
C **********************************************************************
|
|
INCLUDE 'IMPLIC.FOR'
|
|
C
|
|
DIMENSION B0(46),U0(46)
|
|
C
|
|
DATA (B0(I),U0(I),I= 1,46) /
|
|
1 0.0,.287,0.1,.286,0.2,.283,0.3,.278,0.4,.271,0.5,.262,0.6,.252,
|
|
1 0.7,.240,0.8,.228,0.9,.215,1.0,.202,1.1,.188,1.2,.174,1.3,.161,
|
|
1 1.4,.148,1.5,.135,1.6,.124,1.7,.113,1.8,.1024,1.9,.0928,
|
|
1 2.0,.0839,2.1,.0758,2.2,.0684,2.3,.0617,2.4,.0557,2.5,.0502,
|
|
1 2.6,.0454,2.7,.0411,2.8,.0373,2.9,.0338,3.0,.0310,3.2,.0260,
|
|
1 3.4,.0220,3.6,.0187,3.8,.0160,4.0,.0238,4.2,.0120,4.4,.0104,
|
|
1 4.6,.0091,4.8,.0080,5.0,.0071,6.0,.0041,7.0,.0027,8.0,.0018,
|
|
1 9.0,.0014,10.0,.0011/
|
|
C
|
|
C *** asymptotic value
|
|
C
|
|
IF(BETA.GT.10.) THEN
|
|
UBETA=0.2992*BETA**(-2.5)
|
|
ELSE
|
|
C *** Interpolation
|
|
C
|
|
DO I=3,46
|
|
IF (BETA.LT.B0(I)) GO TO 2
|
|
END DO
|
|
2 CALL LAGRAN (B0(I-2),B0(I-1),B0(I),U0(I-2),U0(I-1),
|
|
* U0(I), BETA,UBETA)
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE LAGRAN(X0,X1,X2,Y0,Y1,Y2,X,Y)
|
|
C =========================================
|
|
C
|
|
C ***
|
|
C *** Lagrange interpolation for three points
|
|
C ***
|
|
INCLUDE 'IMPLIC.FOR'
|
|
C
|
|
XL0=(X-X1)*(X-X2)/(X0-X1)/(X0-X2)
|
|
XL1=(X-X0)*(X-X2)/(X1-X0)/(X1-X2)
|
|
XL2=(X-X0)*(X-X1)/(X2-X0)/(X2-X1)
|
|
|
|
Y=Y0*XL0+Y1*XL1+Y2*XL2
|
|
|
|
RETURN
|
|
END
|
|
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE LINSET(ITR,IUNIT,IFRQ0,IFRQ1,XMAX,DOP,AGAM)
|
|
C ======================================================
|
|
C
|
|
C Set up frequency points and weights for a line
|
|
C Auxiliary procedure for START
|
|
C
|
|
C Input:
|
|
C ITR - index of the transition
|
|
C INMOD - mode of evaluating frequency points in the line
|
|
C = 0 - means that frequency points and weights have
|
|
C already been read;
|
|
C ne 0 - frequency points and weights will be evaluated:
|
|
C the meaning of the individual values:
|
|
C = 1 - equidistant frequencies, trapezoidal integration
|
|
C = 2 - equidistant frequencies, Simpson integration
|
|
C = 3 - modified Simpson integration, i.e. a series of
|
|
C 3-point Simpson integrations with each subsequent
|
|
C integration interval doubled, until the whole
|
|
C integartion area is covered
|
|
C = 4 - frequencies (in units of standard x) and weights
|
|
C (for integration over x) are read;
|
|
C
|
|
C XMAX > 0 - means that the line is assumed symmetric around the
|
|
C center, frequency points are set up between x=0 and
|
|
C x=XMAX, where x is frequency difference from the
|
|
C line center in units of the standard Doppler width
|
|
C < 0 - frequency points are set between x=XMAX and x=-XMAX
|
|
C DOP - Doppler width
|
|
C AGAM - damping parameter (for lines with Voigt or non-standard
|
|
C profile only)
|
|
C
|
|
C Output (to COMMON/FRQEXP)
|
|
C FREQ - array of frequencies
|
|
C Note that LINSET calculates values of frequencies only
|
|
C for frequency points between IFR0(ITR) and IFR1(ITR).
|
|
C W - corresponding integration weights
|
|
C PROF - corresponding values of absorption profile
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (BOL2=2.76108D-16, CIN=UN/2.997925D10, OS0=0.02654,
|
|
* F0C1=1.25D-9, TTW=2./3., PISQ1=UN/1.77245385090551D0,
|
|
* C18IN=UN/CAS,F0C2=3.906D-11)
|
|
DIMENSION X(MFREQL),W0(MFREQL)
|
|
C
|
|
IF(ITR.EQ.0) GO TO 200
|
|
INMOD=INTMOD(ITR)
|
|
INMOD0=MOD(IABS(INMOD),10)
|
|
IJ0=IFR0(ITR)
|
|
IJ1=IFR1(ITR)
|
|
N=IJ1-IJ0+1
|
|
|
|
IF(INMOD.EQ.0) THEN
|
|
S=OSC0(ITR)*0.02654D0
|
|
IP0=IPROF(ITR)
|
|
IP=IABS(IP0)
|
|
DO I=1,N
|
|
PROF(I+IJ0-1)=PROFIL(FREQ(I+IJ0-1),AGAM,DOP,ITR,IP,0)*
|
|
* S/DOP
|
|
IJLIN(I+IJ0-1)=ITR
|
|
END DO
|
|
IF(IP0.GE.0) THEN
|
|
IF(XMAX.LT.0.) THEN
|
|
PROF(IJ0)=0.
|
|
PROF(IJ1)=0.
|
|
ELSE
|
|
PROF(IJ1)=0.
|
|
END IF
|
|
END IF
|
|
IF(IPROF(ITR).GE.0) THEN
|
|
IF(XMAX.LT.0.) THEN
|
|
INTMOD(ITR)=-2
|
|
ELSE
|
|
INTMOD(ITR)=-1
|
|
END IF
|
|
ELSE
|
|
IF(XMAX.LT.0.) THEN
|
|
INTMOD(ITR)=2
|
|
ELSE
|
|
INTMOD(ITR)=1
|
|
END IF
|
|
END IF
|
|
RETURN
|
|
END IF
|
|
|
|
X0=0.
|
|
IF(XMAX.LT.0) X0=XMAX
|
|
M=(N-1)/2
|
|
X(1)=0.
|
|
W0(1)=UN
|
|
IF(N.LE.1) GO TO 100
|
|
C
|
|
IF(INMOD0.LE.2) THEN
|
|
C
|
|
C Trapezoidal integration
|
|
C
|
|
HH=ABS(X0+XMAX)/(N-1)
|
|
DO I=1,N
|
|
X(I)=X0+(I-1)*HH
|
|
END DO
|
|
IF(INMOD0.EQ.2) GO TO 40
|
|
DO I=1,N
|
|
W0(I)=HH
|
|
END DO
|
|
W0(1)=HALF *HH
|
|
W0(N)=HALF *HH
|
|
GO TO 100
|
|
C
|
|
C Ordinary Simpson integration
|
|
C
|
|
40 HH=HH/3.D0
|
|
IF(MOD(N,2).NE.1)
|
|
* CALL QUIT('even number of points in Simpson - LINSET',n,n)
|
|
DO I=1,M
|
|
W0(2*I)=4.D0*HH
|
|
W0(2*I+1)=2.D0*HH
|
|
END DO
|
|
W0(1)=HH
|
|
W0(N)=HH
|
|
ELSE IF(INMOD0.EQ.3) THEN
|
|
C
|
|
C Modified Simpson integration - a set of 3-point Simpson
|
|
C integrations with continuosly increasing distance between the
|
|
C integration points (schematically, distances between points are
|
|
C h,h,2h,2h,4h,4h, etc.)
|
|
C
|
|
TWI=UN
|
|
MM=M
|
|
IF(MOD(N,2).NE.1)
|
|
* CALL QUIT('even number of points in MSimpson - LINSET',n,n)
|
|
IF(XMAX.LT.0) MM=M/2
|
|
DO I=1,MM
|
|
TWI=TWI*2.D0
|
|
X(2*I+1)= TWI-UN
|
|
X(2*I)=TWI-UN-TWI/4.D0
|
|
W0(2*I)=2.D0*TWI
|
|
W0(2*I+1)=1.5D0*TWI
|
|
END DO
|
|
TWN=TWI-UN
|
|
TWA=ABS(XMAX)/TWN
|
|
HH=TWA/6.D0
|
|
DO I=1,MM
|
|
X(2*I+1)=X(2*I+1)*TWA
|
|
X(2*I)=X(2*I)*TWA
|
|
W0(2*I)=W0(2*I)*HH
|
|
W0(2*I+1)=W0(2*I+1)*HH
|
|
END DO
|
|
W0(1)=HH
|
|
W0(N)=TWI*HH/2.D0
|
|
X(1)=0.
|
|
IF(M.EQ.MM) GO TO 100
|
|
IF(MOD(N,4).NE.1)
|
|
* CALL QUIT('conflict in MSimpson - LINSET',n,n)
|
|
DO I=1,M
|
|
X(M+1+I)=X(I+1)
|
|
W0(M+1+I)=W0(I+1)
|
|
END DO
|
|
M2=2*(M+1)
|
|
DO I=1,M
|
|
X(I)=-X(M2-I)
|
|
W0(I)=W0(M2-I)
|
|
END DO
|
|
X(M+1)=0.
|
|
W0(M+1)=2.D0*HH
|
|
C
|
|
C frequencies (in units of standard x) and weights
|
|
C (for integration over x) are read;
|
|
C
|
|
ELSE IF(INMOD0.EQ.4) THEN
|
|
READ(IUNIT,*) (X(I),I=1,N),(W0(I),I=1,N)
|
|
END IF
|
|
C
|
|
C For all types of integration:
|
|
C set up arrays FR,WW,PRF
|
|
C
|
|
100 S=OSC0(ITR)*0.02654D0
|
|
IP0=IPROF(ITR)
|
|
IP=IABS(IP0)
|
|
DO I=1,N
|
|
FREQ(I+IJ0-1)=FR0(ITR)-DOP*X(I)
|
|
W(I+IJ0-1)=DOP*W0(I)
|
|
PROF(I+IJ0-1)=PROFIL(FREQ(I+IJ0-1),AGAM,DOP,ITR,IP,0)*S/DOP
|
|
END DO
|
|
C
|
|
C for IPROF(ITR) ge 0 - endpoint(s) of the line profile are forced to
|
|
C have zero cross-section
|
|
C
|
|
IF(IP0.GE.0) THEN
|
|
IF(XMAX.LT.0.) THEN
|
|
PROF(IJ0)=0.
|
|
PROF(IJ1)=0.
|
|
ELSE
|
|
PROF(IJ1)=0.
|
|
END IF
|
|
END IF
|
|
C
|
|
C Recalculation of quadrature weights in order to enforce exact
|
|
C normalization of the integral (absorption profile * weights)
|
|
C
|
|
SUM=0.
|
|
DO I=1,N
|
|
SUM=SUM+PROF(I+IJ0-1)*W(I+IJ0-1)
|
|
END DO
|
|
SUM=S/SUM
|
|
DO I=1,N
|
|
W(I+IJ0-1)=W(I+IJ0-1)*SUM
|
|
END DO
|
|
C
|
|
C reset the switch INTMOD
|
|
C
|
|
IF(IPROF(ITR).GE.0) THEN
|
|
IF(XMAX.LT.0.) THEN
|
|
INTMOD(ITR)=-2
|
|
ELSE
|
|
INTMOD(ITR)=-1
|
|
END IF
|
|
ELSE
|
|
IF(XMAX.LT.0.) THEN
|
|
INTMOD(ITR)=2
|
|
ELSE
|
|
INTMOD(ITR)=1
|
|
END IF
|
|
END IF
|
|
IF(ABS(INMOD).GE.10) INTMOD(ITR)=0
|
|
C
|
|
IF(INDEXP(ITR).NE.0) THEN
|
|
CALL IJALIS(ITR,IFRQ0,IFRQ1)
|
|
END IF
|
|
RETURN
|
|
C
|
|
200 CONTINUE
|
|
IF(ISPODF.GT.0) RETURN
|
|
DO 220 IT=1,NTRANS
|
|
IF(.NOT.LINE(IT)) GO TO 220
|
|
IP=IABS(IPROF(IT))
|
|
IF(IP.NE.2) GO TO 220
|
|
IAT=IATM(ILOW(IT))
|
|
AM=BOL2/AMASS(IAT)*TEFF
|
|
DOPP=FR0(IT)*CIN*SQRT(AM+VTB*VTB)
|
|
DOP1=UN/DOPP
|
|
ANE=ELSTD
|
|
IF(ANE.LE.0.) ANE=1.E14
|
|
F000=EXP(TTW*LOG(ANE))
|
|
II=NQUANT(ILOW(IT))
|
|
JJ=NQUANT(IUP(IT))
|
|
IZZ=IZ(IEL(ILOW(IT)))
|
|
FAC=TWO
|
|
F00=F0C1*F000
|
|
IF(IZZ.EQ.2) THEN
|
|
FAC=UN
|
|
F00=F0C2*F000
|
|
END IF
|
|
CALL STARK0(II,JJ,IZZ,XKIJ,WL0,FIJ)
|
|
FXK=F00*XKIJ
|
|
DBETA=WL0*WL0*C18IN/FXK
|
|
BETAD=DOPP*DBETA
|
|
FID=OS0*FIJ*DBETA
|
|
FID0=OS0*(OSC0(IT)-FIJ)*DOP1*PISQ1
|
|
CALL DIVSTR(IZZ)
|
|
DO IJ=IFR0(IT),IFR1(IT)
|
|
BETA=DBETA*ABS(FREQ(IJ)-FR0(IT))
|
|
SG=STARKA(BETA,fac)*FID
|
|
SG0=0.
|
|
V=(FREQ(IJ)-FR0(IT))*DOP1
|
|
IF(ABS(V).LE.13.) SG0=EXP(-V*V)*FID0
|
|
PROF(IJ)=SG+SG0
|
|
END DO
|
|
220 CONTINUE
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE LINSPL(ITR,DOP,AGAM)
|
|
C ===============================
|
|
C
|
|
C Set up depth-independent profile for a line
|
|
C Analog to LINSET used in sampling mode
|
|
C
|
|
C Input:
|
|
C ITR - index of the transition
|
|
C DOP - Doppler width
|
|
C AGAM - damping parameter (for lines with Voigt or non-standard
|
|
C profile only)
|
|
C
|
|
C Output (to COMMON/FRQEXP)
|
|
C PROF - values of absorption profile
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (OS0=0.02654)
|
|
C
|
|
IJ0=IFR0(ITR)
|
|
IJ1=IFR1(ITR)
|
|
N=IJ1-IJ0+1
|
|
KJ0=KFR0(ITR)
|
|
KJ1=KFR1(ITR)
|
|
C
|
|
C For all types of integration:
|
|
C
|
|
S=OSC0(ITR)*OS0
|
|
IP0=IPROF(ITR)
|
|
IP=IABS(IP0)
|
|
DO I=1,N
|
|
PROF(KJ0+I-1)=PROFIL(FREQ(IJ0+I-1),AGAM,DOP,ITR,IP,0)*S/DOP
|
|
END DO
|
|
C
|
|
C for IPROF(ITR) ge 0 - endpoint(s) of the line profile are forced to
|
|
C have zero cross-section
|
|
C
|
|
IF(IP0.GE.0) THEN
|
|
PROF(KJ0)=0.
|
|
PROF(KJ1)=0.
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE LINPRO(ITR,ID,PRF)
|
|
C =============================
|
|
C
|
|
C Line profile coefficient for the line ITR;
|
|
C for "classical" lines (i.e. those which are not represented by ODF's).
|
|
C It is either calculated for each depth (if LCOMP=true), or is
|
|
C just taken as constant, depth-independent quantity, already
|
|
C calculated in START and stored in array PROF
|
|
C
|
|
C Input: ITR - index of transition
|
|
C ID - depth index
|
|
C Output: PRF - array of absorption profile
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
common/quasun/tqmprf,iquasi,nunalp,nunbet,nungam,nunbal
|
|
PARAMETER (BOL2=2.76108D-16, CIN=UN/2.997925D10, OS0=0.02654,
|
|
* F0C1=1.25D-9, TTW=2./3., PISQ1=UN/1.77245385090551D0,
|
|
* C18IN=UN/CAS,F0C2=3.906D-11,cca=2.997925e18,
|
|
* CINV=UN/cca,AL10=2.3025851)
|
|
DIMENSION PRF(MFREQL),PRF0(MHWL),prfb(mfreql),prfr(mfreql)
|
|
C
|
|
MODE=IABS(INDEXP(ITR))
|
|
IJ0=IFR0(ITR)
|
|
IJ1=IFR1(ITR)
|
|
INTM0=INTMOD(ITR)
|
|
INTM=IABS(INTM0)
|
|
IP=IABS(IPROF(ITR))
|
|
C
|
|
C Doppler width
|
|
C
|
|
IF(LCOMP(ITR).OR.IP.EQ.2) THEN
|
|
IAT=IATM(ILOW(ITR))
|
|
AM=BOL2/AMASS(IAT)*TEMP(ID)
|
|
DOP=FR0(ITR)*CIN*SQRT(AM+VTURBS(ID)*VTURBS(ID))
|
|
DOP1=UN/DOP
|
|
END IF
|
|
IF(LCOMP(ITR).AND.IP.EQ.1.OR.IP.LT.0) THEN
|
|
CALL DOPGAM(ITR,ID,TEMP(ID),DOP,AGAM)
|
|
DOP1=UN/DOP
|
|
END IF
|
|
S=OSC0(ITR)*OS0
|
|
XNORM=PISQ1*S*DOP1
|
|
C
|
|
C Depth-independent profile
|
|
C
|
|
IF(ISPODF.EQ.0) THEN
|
|
DO IJ=IJ0,IJ1
|
|
PRF(IJ-IJ0+1)=PROF(IJ)
|
|
END DO
|
|
ELSE
|
|
DO IJ=KFR0(ITR),KFR1(ITR)
|
|
PRF(IJ-KFR0(ITR)+1)=PROF(IJ)
|
|
END DO
|
|
END IF
|
|
IF(.NOT.LCOMP(ITR)) RETURN
|
|
c
|
|
c evaluation of the depth-dependent profile
|
|
C
|
|
IF(IP.EQ.0) THEN
|
|
DO IJ=IJ0,IJ1
|
|
V=(FREQ(IJ)-FR0(ITR))*DOP1
|
|
IF(ABS(V).LE.13.) PRF(IJ-IJ0+1)=EXP(-V*V)*XNORM
|
|
END DO
|
|
ELSE IF(IP.EQ.1) THEN
|
|
DO IJ=IJ0,IJ1
|
|
V=(FREQ(IJ)-FR0(ITR))*DOP1
|
|
PRF(IJ-IJ0+1)=VOIGT(V,AGAM)*XNORM
|
|
END DO
|
|
ELSE IF(IP.EQ.2) THEN
|
|
C
|
|
C for IP=2 - approximate Stark profile for hydrogen lines,
|
|
C evaluate necessary frequency-independent quantities
|
|
C
|
|
ANE=ELEC(ID)
|
|
F000=EXP(TTW*LOG(ANE))
|
|
II=NQUANT(ILOW(ITR))
|
|
JJ=NQUANT(IUP(ITR))
|
|
IZZ=IZ(IEL(ILOW(ITR)))
|
|
FAC=TWO
|
|
F00=F000*F0C1
|
|
if(iquasi.gt.0.and.ii.eq.1) then
|
|
if(jj.eq.2) fac=un
|
|
if(jj.eq.3.and.iquasi.gt.1) fac=un
|
|
end if
|
|
IF(IZZ.EQ.2) THEN
|
|
FAC=UN
|
|
F00=F000*F0C2
|
|
END IF
|
|
CALL STARK0(II,JJ,IZZ,XKIJ0,WL00,FIJ0)
|
|
FXK=F00*XKIJ0
|
|
DBETA=WL00*WL00*C18IN/FXK
|
|
BETAD=DOP*DBETA
|
|
FID=OS0*FIJ0*DBETA
|
|
FID0=OS0*(OSC0(ITR)-FIJ0)*DOP1*PISQ1
|
|
CALL DIVSTR(IZZ)
|
|
C
|
|
C loop over frequencies
|
|
C
|
|
DO IJ=IJ0,IJ1
|
|
BETA=DBETA*ABS(FREQ(IJ)-FR0(ITR))
|
|
SG=STARKA(BETA,fac)*FID
|
|
SG0=0.
|
|
V=(FREQ(IJ)-FR0(ITR))*DOP1
|
|
IF(ABS(V).LE.13.) SG0=EXP(-V*V)*FID0
|
|
PRF(IJ-IJ0+1)=SG+SG0
|
|
sgmax=max(sgmax,sg+sg0)
|
|
END DO
|
|
ELSE IF(IP.EQ.3.or.ip.eq.4) THEN
|
|
C
|
|
C for IP=3 - exact Stark profile for hydrogen lines (Lemke tables)
|
|
C
|
|
II=NQUANT(ILOW(ITR))
|
|
JJ=NQUANT(IUP(ITR))
|
|
ANE=ELEC(ID)
|
|
F00=F0C1*EXP(TTW*LOG(ANE))
|
|
FID=OS0*OSC0(ITR)
|
|
anel=log10(ane)
|
|
tl=log10(temp(id))
|
|
c
|
|
c switch to either original Lemke/Tremblay of Xenomorph
|
|
c
|
|
if(ilxen(ii,jj).eq.0.or.anel.lt.xnemin) then
|
|
c
|
|
c original Lemke/Tremblay
|
|
c
|
|
WLI0=cca/fr0(itr)
|
|
fac=un
|
|
if(iquasi.gt.0.and.ii.eq.1) then
|
|
if(jj.eq.2) fac=half
|
|
if(jj.eq.3.and.iquasi.gt.1) fac=half
|
|
end if
|
|
iline=0
|
|
if(ip.eq.3) then
|
|
IF(II.LE.4.AND.JJ.LE.22) iline=ilinh(ii,jj)
|
|
else
|
|
IF(II.LE.2.AND.JJ.LE.10) iline=ilinh(ii,jj)
|
|
end if
|
|
c
|
|
if(iline.gt.0) then
|
|
CALL INTLEM(PRF0,WLI0,ILINE,ID)
|
|
NWL=NWLHYD(ILINE)
|
|
DO IJ=IJ0,IJ1
|
|
al=abs(wli0-cca/freq(ij))
|
|
IF(AL.LT.1.E-4) AL=1.E-4
|
|
AL=AL/F00
|
|
AL=LOG10(AL)
|
|
DO IWL=1,NWL-1
|
|
IW0=IWL
|
|
IF(AL.LE.WLHYD(ILINE,IWL+1)) GO TO 40
|
|
END DO
|
|
40 IW1=IW0+1
|
|
PRFF=(PRF0(IW0)*(WLHYD(ILINE,IW1)-AL)+PRF0(IW1)*
|
|
* (AL-WLHYD(ILINE,IW0)))/
|
|
* (WLHYD(ILINE,IW1)-WLHYD(ILINE,IW0))
|
|
SG=EXP(PRFF*AL10)*FID
|
|
SG=SG*WLI0**2*CINV/F00
|
|
PRF(IJ-IJ0+1)=SG*fac
|
|
END DO
|
|
end if
|
|
c
|
|
c XENOMORPH data for selected lines
|
|
c
|
|
else
|
|
ixn=ilxen(ii,jj)
|
|
nwl=nwlxen(ixn)
|
|
do iwl=1,nwl
|
|
call intxen(prfb0,prfr0,tl,anel,iwl,ixn,id)
|
|
prfb(iwl)=prfb0
|
|
prfr(iwl)=prfb0
|
|
end do
|
|
do ij=ij0,ij1
|
|
al=(freq(ij)-fr0(itr))/f00
|
|
if(abs(al).lt.1.e-4) al=1.e-4
|
|
all=log10(abs(al))
|
|
do iwl=1,nwl-1
|
|
iw0=iwl
|
|
if(all.le.alxen(ixn,iwl+1)) go to 50
|
|
end do
|
|
50 iw1=iw0+1
|
|
if(al.gt.0.) then
|
|
prff=(prfb(iw0)*(alxen(ixn,iw1)-all)+
|
|
* prfb(iw1)*(all-alxen(ixn,iw0)))/
|
|
* (alxen(ixn,iw1)-alxen(ixn,iw0))
|
|
else
|
|
prff=(prfr(iw0)*(alxen(ixn,iw1)-all)+
|
|
* prfr(iw1)*(all-alxen(ixn,iw0)))/
|
|
* (alxen(ixn,iw1)-alxen(ixn,iw0))
|
|
end if
|
|
sg=exp(prff*al10)*fid/f00
|
|
prf(ij-ij0+1)=sg
|
|
end do
|
|
END IF
|
|
c
|
|
c for IP ge 10 - special line profile
|
|
c
|
|
ELSE IF(IP.GE.10) THEN
|
|
DO IJ=IJ0,IJ1
|
|
PRF(IJ-IJ0+1)=PROFSP(FREQ(IJ),DOP,ITR,ID)
|
|
END DO
|
|
END IF
|
|
C
|
|
C if required, force the profile at the endpoints to zero
|
|
C
|
|
IF(INTM0.EQ.-1) THEN
|
|
PRF(IJ1-IJ0+1)=0.
|
|
ELSE IF(INTM0.EQ.-2) THEN
|
|
PRF(1)=0.
|
|
PRF(IJ1-IJ0+1)=0.
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION SIGK(FR,ITR,MODE)
|
|
C ==========================
|
|
C
|
|
C Photoionization cross-sections
|
|
C
|
|
C Input: FR - frequency
|
|
C ITR - index of the transition
|
|
C MODE- =0 - cross-section equal to zero longward of edge
|
|
C >0 - cross-section non-zero (extrapolated) longward
|
|
C of edge
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
PARAMETER (SIH0=2.815D29, E10=2.3025851)
|
|
DIMENSION XFIT(MFIT) , ! local array containing x for OP data
|
|
+ SFIT(MFIT) ! local array containing sigma for OP data
|
|
C
|
|
PEACH(X,S,A,B) =A*X**S*(B+X*(1.-B))*1.D-18
|
|
HENRY(X,S,A,B,C)=A*X**S*(C+X*(B-2.*C+X*(1.+C-B)))*1.D-18
|
|
C
|
|
SIGK=0.
|
|
IF(INDEXP(ITR).EQ.0) RETURN
|
|
IF(MODE.EQ.0.AND.FR.LT.FR0(ITR)) RETURN
|
|
C
|
|
C IC is the index of the given transition in the special numbering
|
|
C of continua (given by ITRCON(ITR)
|
|
C IBF(IC) is the switch controlling the mode of evaluation of the
|
|
C cross-section:
|
|
C = 0 hydrogenic cross-section, with Gaunt factor set to 1
|
|
C = 1 hydrogenic cross-section with exact Gaunt factor
|
|
C = 2 Peach-type expression (see function PEACH)
|
|
C = 3 Henry-type expression (see function HENRY)
|
|
C = 4 Butler fit formula (polynomial fits to the OP results);
|
|
C = 5 Verner fit formula (OP results & HDS calculations at high
|
|
C energies); ONLY for GROUND states;
|
|
C = 6 DETAIL's fit formula from Klaus Werner
|
|
C (similar to Butler's fit but up to 5th order)
|
|
C = 7 hydrogenic cross-section with Gaunt factor after Werner
|
|
C = 9 Opacity project fits (routine TOPBAS - interpolations)
|
|
C > 100 - cross-sections extracted form TOPBASE, for several points
|
|
C In this case, IBF-100 is the number of points
|
|
C < 0 non-standard, user supplied expression (user should update
|
|
C subroutine SPSIGK)
|
|
C
|
|
C for H- : for any IBF > 0 - standard expression
|
|
C
|
|
C for He I:
|
|
C for IBF = 11 or = 13 - Opacity Project cross section
|
|
C Seaton-Ferney's cubic fits, Hummer's procedure (HEPHOT)
|
|
C IBF = 11 means that the multiplicity S=1 (singlet)
|
|
C IBF = 13 means that the multiplicity S=3 (triplet)
|
|
C for IBF = 10 - cross section, based on Opacity Project, but
|
|
C appropriately averaged for an averaged level
|
|
C (see explanation in SBFHE1)
|
|
C
|
|
C for IBF = 21 or 23 Koester's fit (A&A 149, 423)
|
|
C
|
|
C IBF = 21 means that the multiplicity S=1 (singlet)
|
|
C IBF = 23 means that the multiplicity S=3 (triplet)
|
|
C
|
|
IC=ITRCON(ITR)
|
|
IB=IBF(IC)
|
|
II=ILOW(ITR)
|
|
IQ=NQUANT(II)
|
|
IE=IEL(ILOW(ITR))
|
|
IF(IB.LT.0) GO TO 60
|
|
IF(IE.EQ.IELHM) GO TO 40
|
|
IF(IE.EQ.IELHE1.AND.IB.GE.10.AND.IB.LE.23) GO TO 50
|
|
CH=IZ(IE)*IZ(IE)
|
|
IQ5=IQ*IQ*IQ*IQ*IQ
|
|
C
|
|
IF(IB.EQ.0) THEN
|
|
C
|
|
C hydrogenic expression (for IBF = 0)
|
|
C
|
|
SIGK=SIH0/FR/FR/FR*CH*CH/IQ5
|
|
C
|
|
C exact hydrogenic - with Gaunt factor (for IBF=1)
|
|
C
|
|
ELSE IF(IB.EQ.1) THEN
|
|
SIGK=SIH0/FR/FR/FR*CH*CH/IQ5
|
|
frd=fr0(itr)
|
|
fr0l=0.95*frd
|
|
if(fr.ge.frd) then
|
|
gau0=gaunt(iq,fr/ch)
|
|
sigk=sigk*gaunt(iq,fr/ch)
|
|
else if(fr.ge.fr0l) then
|
|
gau0=gaunt(iq,frd/ch)
|
|
corg=(fr-fr0l)/(frd-fr0l)*(gau0-1.)+1.
|
|
sigk=sigk*corg
|
|
end if
|
|
ELSE IF(IB.EQ.2) THEN
|
|
C
|
|
C Peach-type formula (for IBF=2)
|
|
C
|
|
FREL=FR0(ITR)/FR
|
|
IF(GAMCS(IC).GT.0) THEN
|
|
IF(GAMCS(IC).LT.1.E6) THEN
|
|
FR00=2.997925E18/GAMCS(IC)
|
|
ELSE
|
|
FR00=GAMCS(IC)
|
|
END IF
|
|
IF(FR.LT.FR00) RETURN
|
|
FREL=FR00/FR
|
|
END IF
|
|
if(frel.gt.0.)
|
|
* SIGK=PEACH (FREL,S0CS(IC),ALFCS(IC),BETCS(IC))
|
|
ELSE IF(IB.EQ.3) THEN
|
|
C
|
|
C Henry-type formula (for IBF=3)
|
|
C
|
|
FREL=FR0(ITR)/FR
|
|
if(frel.gt.0.)
|
|
* SIGK=HENRY(FREL,S0CS(IC),ALFCS(IC),BETCS(IC),GAMCS(IC))
|
|
C
|
|
C Butler expression
|
|
C
|
|
ELSE IF(IB.EQ.4) THEN
|
|
FREL=FR0(ITR)/FR
|
|
XL=LOG(FREL)
|
|
SL=S0CS(IC)+XL*(ALFCS(IC)+XL*BETCS(IC))
|
|
SIGK=EXP(SL)
|
|
C
|
|
C Verner expression
|
|
C
|
|
ELSE IF(IB.EQ.5) THEN
|
|
SIGK=VERNER(FR,ITR)
|
|
C
|
|
C DETAIL expression
|
|
C
|
|
ELSE IF(IB.EQ.6) THEN
|
|
FREL=FR0(ITR)/FR
|
|
XL=LOG(FREL)
|
|
XL2=XL*XL
|
|
XL3=XL2*XL
|
|
SL=CTOP(1,IC)+XL*CTOP(2,IC)+XL2*CTOP(3,IC)+XL3*CTOP(4,IC)
|
|
SL=SL+XL2*XL2*CTOP(5,IC)+XL3*XL2*CTOP(6,IC)
|
|
SIGK=EXP(SL)
|
|
C
|
|
C exact hydrogenic - with Gaunt factor from K Werner (for IBF=7)
|
|
C
|
|
ELSE IF(IB.EQ.7) THEN
|
|
IQ5=IQ*IQ*IQ*IQ*IQ
|
|
SIGK=SIH0/(FR*FR*FR)*CH*CH/IQ5*GNTK(IQ,FR/CH)
|
|
C
|
|
C selected Opacity Project data (for IBF=9)
|
|
C (c.-s. evaluated by routine TOPBAS which needs an input file RBF.DAT)
|
|
C
|
|
ELSE IF(IB.EQ.9) THEN
|
|
SIGK=TOPBAS(FR,FR0(ITR),TYPLEV(II))
|
|
C
|
|
C other Opacity Project data (for IBF>100)
|
|
C (c.-s. evaluated by interpolating from direct input data)
|
|
C
|
|
ELSE IF(IB.GT.100) THEN
|
|
NFIT=IB-100
|
|
X = LOG10(FR/FR0(ITR))
|
|
SIGM=0.
|
|
IF(X.GE.XTOP(1,IC)) THEN
|
|
DO IFIT = 1,NFIT
|
|
XFIT(IFIT) = XTOP(IFIT,IC)
|
|
SFIT(IFIT) = CTOP(IFIT,IC)
|
|
END DO
|
|
SIGM = YLINTP (X,XFIT,SFIT,NFIT,MFIT)
|
|
SIGM = 1.D-18*EXP(E10*SIGM)
|
|
ENDIF
|
|
SIGK=SIGM
|
|
END IF
|
|
if(iatm(ii).eq.iath.and.ii.gt.n0hn+2.
|
|
* and.ib.le.1.and.fr.lt.fr0(itr)) then
|
|
fr1=fr0pc(ii)
|
|
frdec=min(fr1*1.25,fr0(itr))
|
|
if(fr.gt.fr1.and.fr.lt.frdec)
|
|
* sigk=sigk*(fr-fr1)/(frdec-fr1)
|
|
end if
|
|
c
|
|
RETURN
|
|
C
|
|
C special expression for H-
|
|
C
|
|
40 SIGK=SBFHMI(FR)
|
|
RETURN
|
|
C
|
|
C He I cross-sections
|
|
C
|
|
50 SIGK=SBFHE1(II,IB,FR,G(II))
|
|
RETURN
|
|
C
|
|
C non-standard, user supplied form of cross-section (for IBF < 0)
|
|
C
|
|
60 CALL SPSIGK(IB,FR,SIGSP)
|
|
SIGK=SIGSP
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
FUNCTION VERNER(FR,ITR)
|
|
C =======================
|
|
C
|
|
C Photoionization cross-sections for ground states
|
|
C of atoms and ions. Analytical fits from:
|
|
C Verner D.A. et al. 1996, ApJ 465
|
|
C Verner & Yakovlev 1995, A&AS 109, 125
|
|
C
|
|
C 10-July-1996: Version for H to Si, S, Ar, Ca and Fe.
|
|
C No test on threshold energy as given by Verner et al.
|
|
C to avoid inconsistencies with limits FR0 as read by Tlusty
|
|
C
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
C
|
|
PARAMETER (HHEV=H/1.6022D-12,T18=1.D-18,MVER=105)
|
|
DIMENSION S0(MVER),E0(MVER),EMX(MVER)
|
|
DIMENSION Y0(MVER),Y1(MVER),YW(MVER),YA(MVER),PV(MVER)
|
|
DIMENSION S95(MVER),E95(MVER),Y95(MVER),YW95(MVER),P95(MVER)
|
|
DIMENSION IV0(14)
|
|
C
|
|
DATA IV0/0,1,3,6,10,15,21,28,36,45,55,66,78,91/
|
|
DATA S0/5.475D4,9.492D2,1.369D4,6.245D1,3.201D2,6.083D3,2.932D5,
|
|
+ 2.678D2,5.458D2,3.422D3,5.466D0,1.859D4,5.393D1,2.846D2,
|
|
+ 2.190D3,5.027D2,8.709D0,1.539D4,1.068D2,2.344D2,1.521D3,
|
|
+ 8.235D2,1.944D0,9.375D-1,1.690D4,8.376D1,1.519D2,1.117D3,
|
|
+ 1.745D3,5.967D1,6.753D2,8.659D-1,1.642D4,6.864D1,1.329D2,
|
|
+ 8.554D2,3.803D3,8.013D1,1.541D2,3.165D0,4.690D-1,1.157D4,
|
|
+ 6.930D1,1.039D2,6.759D2,4.287D3,1.583D3,5.708D0,1.685D3,
|
|
+ 2.430D0,9.854D-1,1.198D4,5.631D1,6.695D1,5.475D2,1.601D0,
|
|
+ 1.04D3,1.885D3,2.33D0,2.346D1,7.101D1,1.609D0,7.215D3,
|
|
+ 4.729D1,3.995D1,4.525D2,1.372D8,3.278D0,5.377D2,1.394D3,
|
|
+ 1.728D0,2.185D0,3.104D0,6.344D-2,9.008D2,4.427D1,6.14D1,
|
|
+ 3.802D2,7.195D0,6.948D-2,4.915D0,1.513D1,2.925D2,1.962D-2,
|
|
+ 1.889D2,2.35D-1,4.982D-1,1.774D4,3.388D1,4.036D1,3.239D2,
|
|
+ 2.506D1,4.14D0,5.79D-4,6.083D0,8.863D-1,7.293D1,6.68D-2,
|
|
+ 3.477D-1,1.465D-1,1.95D-1,1.992D4,2.539D1,4.754D1,2.793D2/
|
|
DATA E0/0.4298,13.61,1.72,3.107,20.06,3.871,9.539,1.181,17.6,
|
|
+ 6.879,0.5213,2.869,1.041,33.36,10.75,2.144,0.4058,4.614,
|
|
+ 3.506,46.24,15.48,4.034,0.06128,0.242,5.494,4.471,69.43,
|
|
+ 21.08,1.24,1.386,0.1723,0.2044,2.854,7.824,87.09,27.54,
|
|
+ 12.97,1.763,2.542,0.7744,0.7286,4.008,2.563,113.1,34.85,
|
|
+ 4.87,12.47,0.7753,5.566,1.248,1.499,4.888,10.03,158.6,
|
|
+ 43.04,6.139,8.203,10.69,0.669,5.408,48.46,2.096,153.5,
|
|
+ 13.91,226.8,52.11,11.97,8.139,10.86,29.12,0.9762,1.711,
|
|
+ 3.57,0.4884,34.82,14.52,204.2,62.03,13.81,0.2048,10.27,
|
|
+ 3.13,24.14,0.3483,2.636,0.4866,1.842,8.044,23.55,273.8,
|
|
+ 72.81,23.17,2.556,0.1659,1.288,0.7761,63.05,0.3277,0.7655,
|
|
+ 0.3343,0.8787,12.05,35.6,275.2,84.47/
|
|
DATA EMX/5.D4,5.D4,5.D4,64.39,5.D4,5.D4,11.93,12.99,5.D4,5.D4,
|
|
+ 194.0,209.8,227.4,5.D4,5.D4,291.0,307.6,328.9,352.2,
|
|
+ 5.D4,5.D4,404.8,423.6,447.3,475.3,504.3,5.D4,5.D4,
|
|
+ 538.0,558.1,584.0,614.4,649.1,683.7,5.D4,5.D4,694.0,
|
|
+ 712.2,739.2,770.9,809.1,850.2,890.5,5.D4,5.D4,870.1,
|
|
+ 883.1,913.1,948.0,987.3,1031.,1078.,1125.,5.D4,5.D4,
|
|
+ 38.14,1074.,1110.,1143.,1185.,1230.,1281.,1335.,1386.,
|
|
+ 5.D4,5.D4,54.9,65.69,1317.,1356.,1400.,1449.,1501.,
|
|
+ 1558.,1618.,1675.,5.D4,5.D4,80.4,89.97,102.6,1588.,
|
|
+ 1634.,1688.,1739.,1799.,1862.,1929.,1992.,5.D4,5.D4,
|
|
+ 106.,118.6,131.1,146.6,1887.,1946.,2001.,2058.,2125.,
|
|
+ 2194.,2268.,2336.,5.D4,5.D4/
|
|
DATA Y0/0.,0.4434,0.,0.,0.,0.,8.278D-4,0.,0.,0.,1.319D1,4.96D-3,
|
|
+ 0.,0.,0.,1.133,4.929D1,4.378D-3,0.,0.,0.,8.598D-1,4.28D2,
|
|
+ 1.877D2,6.415D-3,0.,0.,0.,8.698,2.131D1,3.839D-3,3.328D2,
|
|
+ 3.036D-2,0.,0.,0.,1.701D-4,1.715D1,1.641D1,9.531D1,
|
|
+ 1.506D2,2.071D-2,0.,0.,0.,4.236D-2,1.52,7.654D1,5.149,
|
|
+ 9.169D1,1.042D2,2.536D-2,0.,0.,0.,0.,3.375,3.725,1.383D2,
|
|
+ 2.204D1,9.603D-4,9.94D1,0.1667,0.,0.,0.,0.,0.,4.86,
|
|
+ 9.402D-1,1.276D2,1.007D2,5.452D1,5.348D2,5.444,0.,0.,0.,
|
|
+ 2.041D-1,9.149D1,0.,3.994D1,3.495,5.675D-2,3.552D1,
|
|
+ 5.704D2,1.719D2,2.538D-2,0.,0.,0.,1.672D-5,6.634,9.613D1,
|
|
+ 0.,2.009D2,1.115,1.149D-2,3.85D2,1.036D3,4.528D2,1.99D-2,
|
|
+ 0.,0.,0./
|
|
DATA Y1/0.,2.136,0.,0.,0.,0.,1.269D-2,0.,0.,0.,4.556,3.4D-2,0.,
|
|
+ 0.,0.,1.607,3.234,2.528D-2,0.,0.,0.,2.325,2.03D1,3.999,
|
|
+ 1.937D-2,0.,0.,0.,1.271D-1,1.503D-2,4.569D-1,4.285D1,
|
|
+ 5.554D-2,0.,0.,0.,1.345D-2,7.724D-1,5.124,9.781,2.574D-1,
|
|
+ 3.998D-2,0.,0.,0.,5.873,1.084D-1,2.023,6.687,3.702D-1,
|
|
+ 1.435,4.417D-2,0.,0.,0.,0.,4.01,0.2279,4.26,0.7577,
|
|
+ 6.378D-3,3.278,1.766D-2,0.,0.,0.,0.,0.,3.722,0.1135,
|
|
+ 3.979,1.729,2.078,3.997D-3,7.918D-2,0.,0.,0.,0.4753,
|
|
+ 0.6565,0.,4.803,0.2701,0.2768,8.223D-3,0.158,6.595,
|
|
+ 1.203D-2,0.,0.,0.,0.4207,0.1272,0.6442,0.,4.537,8.051D-2,
|
|
+ 0.6396,8.999D-2,0.2936,1.015,1.007D-2,0.,0.,0./
|
|
DATA YW/0.,2.039,0.,0.,0.,0.,3.655D-1,0.,0.,0.,1.887D1,3.503,0.,
|
|
+ 0.,0.,9.157D-2,2.093,5.922,0.,0.,0.,9.097D-2,1.043D1,
|
|
+ 1.85,7.904,0.,0.,0.,7.589D-2,1.934D-2,1.191D-1,3.143,
|
|
+ 2.836D1,0.,0.,0.,2.17D-3,5.103D-1,1.115,6.812,2.57D-1,
|
|
+ 2.411D1,0.,0.,0.,2.434D-1,6.558D-2,4.633D-1,8.29D-3,
|
|
+ 6.855D-1,1.656,2.811D1,0.,0.,0.,0.,2.328,8.579D-2,0.7365,
|
|
+ 0.9275,1.285D-2,1.895,0.9121,0.,0.,0.,0.2805,0.,2.604,
|
|
+ 4.326D-2,0.809,0.6325,1.422,0.6666,2.751,0.,0.,0.,0.3166,
|
|
+ 0.4615,0.,5.342,0.1,8.839,1.836,0.2773,0.6945,29.53,0.,
|
|
+ 0.,0.,0.2837,1.57,0.8626,0.,1.303,2.989D-3,3.28,1.476D-3,
|
|
+ 1.646,0.4489,2.392D1,0.,0.,0./
|
|
DATA YA/3.288D1,1.469D0,3.288D1,1.501D1,7.391D0,3.288D1,4.301D-1,
|
|
+ 5.645D0,1.719D1,3.288D1,8.618D0,1.783D0,1.767D1,2.163D1,
|
|
+ 3.288D1,6.216D1,1.261D2,1.737D0,1.436D1,2.183D1,3.288D1,
|
|
+ 8.033D1,8.163D2,2.788D2,1.714D0,3.297D1,2.627D1,3.288D1,
|
|
+ 3.784D0,3.175D1,3.852D2,4.931D2,1.792D0,3.210D1,2.535D1,
|
|
+ 3.288D1,2.587D0,1.667D1,5.742D1,1.099D2,1.400D2,1.848D0,
|
|
+ 7.547D1,2.657D1,3.288D1,5.798D0,3.935D0,6.725D1,6.409D2,
|
|
+ 1.066D2,1.350D2,1.788D0,3.628D1,3.352D1,3.288D1,6.148D3,
|
|
+ 8.259D0,3.613D0,1.205D2,2.913D1,3.945D1,2.473D2,3.886D-1,
|
|
+ 3.889D1,5.315D1,3.288D1,2.228D-1,4.341D7,9.779D0,2.895D0,
|
|
+ 9.184D1,9.350D1,6.060D1,5.085D2,1.823D0,3.826D1,2.778D1,
|
|
+ 3.288D1,1.621D3,5.675D2,1.990D6,1.674D1,6.973D0,1.856D1,
|
|
+ 1.338D2,7.216D2,2.568D2,1.653D0,3.432D1,3.567D1,3.288D1,
|
|
+ 2.057D1,1.337D1,1.474D2,1.356D6,1.541D2,1.558D2,4.132D1,
|
|
+ 3.733D2,1.404D3,7.461D2,1.582D0,3.307D1,2.848D1,3.288D1/
|
|
DATA PV/2.963,31.88,2.963,4.895,2.916,2.963,10.52,11.7,3.157,
|
|
+ 2.963,17.28,16.18,9.54,2.624,2.963,5.101,8.578,15.93,
|
|
+ 7.457,2.581,2.963,3.928,8.773,9.156,17.06,6.003,2.315,
|
|
+ 2.963,17.64,8.943,6.822,8.785,26.47,5.495,2.336,2.963,
|
|
+ 7.275,10.5,6.614,9.203,9.718,24.46,6.448,2.255,2.963,
|
|
+ 8.355,7.81,10.05,3.056,8.999,8.836,25.5,5.585,2.002,
|
|
+ 2.963,3.839,7.362,9.803,9.714,8.26,2.832,7.681,8.476,
|
|
+ 5.265,1.678,2.963,15.74,3.61,7.117,6.487,10.06,9.202,
|
|
+ 8.857,9.385,14.44,5.46,2.161,2.963,3.642,9.049,3.477,
|
|
+ 11.8,6.724,20.84,6.204,8.659,8.406,26.55,5.085,1.915,
|
|
+ 2.963,3.546,11.91,13.36,3.353,9.98,2.4,16.06,8.986,
|
|
+ 8.503,8.302,24.25,4.728,2.135,2.963/
|
|
DATA S95/5.475D4,4.47D3,1.369D4,1.564D2,3.201D2,6.083D3,1.306D2,
|
|
+ 9.796D1,5.458D2,3.422D3,9.698D1,1.037D2,8.605D1,2.846D2,
|
|
+ 2.19D3,7.421D1,6.649D1,8.067D1,8.111D1,2.344D2,1.521D3,
|
|
+ 4.748D1,5.002D1,5.235D1,7.046D1,7.304D1,1.519D2,1.117D3,
|
|
+ 3.237D1,3.584D1,3.939D1,4.123D1,5.735D1,6.029D1,1.329D2,
|
|
+ 8.554D2,2.295D1,4.798D1,3.144D1,5.302D1,3.680D1,4.668D1,
|
|
+ 4.890D1,1.039D2,6.759D2,1.664D1,2.783D1,2.943D1,3.027D1,
|
|
+ 3.097D1,3.232D1,5.011D1,3.719D1,6.695D1,5.475D2,2.486D2,
|
|
+ 1.889D1,3.466D1,2.551D1,3.753D1,2.654D1,2.745D1,3.613D1,
|
|
+ 3.850D1,3.995D1,4.525D2,2.023D2,2.049D2,1.877D1,2.212D1,
|
|
+ 2.350D1,3.278D1,3.407D1,2.721D1,3.699D1,3.290D1,6.140D1,
|
|
+ 3.802D2,1.735D2,1.842D2,1.990D2,2.494D1,2.572D1,2.786D1,
|
|
+ 2.653D1,2.989D1,2.857D1,3.223D1,3.272D1,4.036D1,3.239D2,
|
|
+ 1.532D2,1.832D2,2.197D2,2.326D2,3.100D1,2.398D1,2.474D1,
|
|
+ 3.135D1,2.641D1,3.343D1,2.832D1,3.880D1,4.754D1,2.793D2/
|
|
DATA E95/0.4298,5.996,1.72,27.4,20.06,3.871,40.93,47.59,17.6,
|
|
+ 6.879,61.55,59.84,65.92,33.36,10.75,86.55,91.13,83.7,
|
|
+ 84.12,46.24,15.48,127.,124.2,122.,107.,106.,69.43,21.08,
|
|
+ 177.4,169.,162.,159.3,137.7,135.4,87.09,27.54,239.,166.,
|
|
+ 205.5,160.3,192.5,173.7,171.1,113.1,34.85,314.4,245.2,
|
|
+ 238.7,236.,234.3,230.8,188.6,219.3,158.6,43.04,36.55,
|
|
+ 326.6,242.6,284.1,236.,280.6,277.7,246.4,240.6,226.8,
|
|
+ 52.11,49.37,49.4,360.7,334.5,325.9,277.7,274.2,308.2,
|
|
+ 267.1,285.8,204.2,62.03,64.45,61.54,60.16,348.2,343.2,
|
|
+ 326.8,339.6,319.3,330.5,311.7,313.7,273.8,72.81,78.08,
|
|
+ 71.54,66.52,64.82,346.,379.9,375.9,344.2,367.9,335.6,
|
|
+ 359.9,315.,275.2,84.47/
|
|
DATA Y95/3.288D1,2.199D0,3.288D1,3.382D1,7.391D0,3.288D1,1.212D2,
|
|
+ 1.166D3,1.719D1,3.288D1,7.354D1,7.915D1,1.906D2,2.163D1,
|
|
+ 3.288D1,5.498D1,9.609D1,7.471D1,7.459D1,2.183D1,3.288D1,
|
|
+ 1.380D2,9.100D1,9.428D1,5.342D1,5.547D1,2.627D1,3.288D1,
|
|
+ 3.812D2,1.894D2,1.104D2,1.141D2,5.486D1,5.682D1,2.535D1,
|
|
+ 3.288D1,1.257D3,5.000D1,1.230D2,5.000D1,7.933D1,5.876D1,
|
|
+ 6.137D1,2.657D1,3.288D1,2.042D5,6.075D1,6.525D1,6.734D1,
|
|
+ 6.907D1,7.167D1,5.000D1,8.181D1,3.352D1,3.288D1,3.222D2,
|
|
+ 2.527D2,5.000D1,6.977D1,5.000D1,7.237D1,7.512D1,4.968D1,
|
|
+ 5.198D1,5.315D1,3.288D1,1.079D4,4.112D4,1.401D2,7.147D1,
|
|
+ 6.173D1,5.000D1,5.000D1,5.108D1,5.000D1,5.384D1,2.778D1,
|
|
+ 3.288D1,1.131D4,2.404D3,5.082D2,3.260D1,3.376D1,5.000D1,
|
|
+ 3.478D1,5.000D1,3.660D1,5.000D1,4.295D1,3.567D1,3.288D1,
|
|
+ 5.765D6,3.537D2,1.169D2,1.188D2,1.979D1,5.000D1,5.000D1,
|
|
+ 2.260D1,5.000D1,2.487D1,5.000D1,3.034D1,2.848D1,3.288D1/
|
|
DATA YW95/55*0.,0.1465,10*0.,1.463D-2,2.223D-5,10*0.,2.337D-2,
|
|
+ 7.839D-3,2.016D-2,10*0.,2.774D-4,2.87D-4,8.658D-4,
|
|
+ 8.417D-4,10*0./
|
|
DATA P95/2.963,6.098,2.963,1.49,2.916,2.963,1.348,1.022,3.157,
|
|
+ 2.963,1.438,1.436,1.21,2.624,2.963,1.503,1.338,1.442,
|
|
+ 1.428,2.581,2.963,1.252,1.335,1.335,1.552,1.538,2.315,
|
|
+ 2.963,1.083,1.185,1.289,1.287,1.540,1.533,2.336,2.963,
|
|
+ 0.9638,1.65,1.263,1.65,1.377,1.511,1.501,2.255,2.963,
|
|
+ 0.845,1.42,1.424,1.422,1.416,1.411,1.65,1.396,2.002,
|
|
+ 2.963,3.57,1.12,1.65,1.414,1.65,1.405,1.397,1.579,
|
|
+ 1.575,1.678,2.963,2.96,2.995,1.238,1.413,1.464,1.65,
|
|
+ 1.65,1.539,1.65,1.56,2.161,2.963,2.762,2.92,3.11,1.732,
|
|
+ 1.73,1.65,1.721,1.65,1.712,1.65,1.676,1.915,2.963,2.639,
|
|
+ 3.133,3.529,3.547,2.094,1.65,1.65,2.02,1.65,1.982,1.65,
|
|
+ 1.925,2.135,2.963/
|
|
C
|
|
VERNER=0.
|
|
E=HHEV*FR
|
|
C
|
|
II=ILOW(ITR)
|
|
N1=NFIRST(IEL(II))
|
|
IF(II.NE.N1)
|
|
+ CALL QUIT('Verner fits only for ground states',ii,n1)
|
|
IAT=NUMAT(IATM(II))
|
|
IZZ=IZ(IEL(II))
|
|
IF(IAT.GT.14) GO TO 10
|
|
IVER=IV0(IAT)+IZZ
|
|
C
|
|
C 1996 Expression
|
|
C
|
|
IF(E.LT.EMX(IVER)) THEN
|
|
XX=E/E0(IVER)-Y0(IVER)
|
|
YY=SQRT(XX*XX+Y1(IVER)*Y1(IVER))
|
|
AA=(XX-UN)*(XX-UN)+YW(IVER)*YW(IVER)
|
|
BB=YY**(HALF*PV(IVER)-5.5)
|
|
CC=(UN+SQRT(YY/YA(IVER)))**PV(IVER)
|
|
FY=AA*BB/CC
|
|
VERNER=S0(IVER)*T18*FY
|
|
ELSE
|
|
C
|
|
C 1995 Expression for high energies
|
|
C (ionization of inner shell electron)
|
|
C
|
|
YY=E/E95(IVER)
|
|
XL=0.
|
|
IF((IAT-IZZ).GE.10) XL=UN
|
|
Q=HALF*P95(IVER)-5.5-XL
|
|
AA=(YY-UN)*(YY-UN)+YW95(IVER)*YW95(IVER)
|
|
BB=YY**Q
|
|
CC=(UN+SQRT(YY/Y95(IVER)))**P95(IVER)
|
|
FY=AA*BB/CC
|
|
VERNER=S95(IVER)*T18*FY
|
|
END IF
|
|
RETURN
|
|
C
|
|
C Heavier elements
|
|
C
|
|
10 IF(IAT.EQ.26) THEN
|
|
VERNER=VERN26(E,IZZ)
|
|
ELSE IF(IAT.EQ.16) THEN
|
|
VERNER=VERN16(E,IZZ)
|
|
ELSE IF(IAT.EQ.18) THEN
|
|
VERNER=VERN18(E,IZZ)
|
|
ELSE IF(IAT.EQ.20) THEN
|
|
VERNER=VERN20(E,IZZ)
|
|
ELSE
|
|
CALL QUIT('VERNER - No data for this element',iat,izz)
|
|
ENDIF
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
FUNCTION VERN26(E,IZZ)
|
|
C ======================
|
|
C
|
|
C Photoionization cross-sections for ground states
|
|
C of all Fe ions.
|
|
C Verner D.A. et al. 1996, ApJ 465
|
|
C Verner & Yakovlev 1995, A&AS 109, 125
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
PARAMETER (T18=1.D-18,MVER=26)
|
|
DIMENSION S0(MVER),E0(MVER),EMX(MVER)
|
|
DIMENSION Y0(MVER),Y1(MVER),YW(MVER),YA(MVER),PV(MVER)
|
|
DIMENSION S95(MVER),E95(MVER),Y95(MVER),YW95(MVER),P95(MVER)
|
|
C
|
|
DATA S0/3.062D-1,4.365D3,6.107D0,3.653D2,1.523D-3,5.259D-1,2.42D4,
|
|
+ 1.979D1,2.687D1,6.470D1,3.281D0,1.738D0,2.791D-3,1.454D-1,
|
|
+ 2.108D2,1.207D1,1.452D0,2.388D0,6.066D-5,4.455D-1,1.098D1,
|
|
+ 7.204D-2,2.580D4,1.276D1,1.195D1,8.099D1/
|
|
DATA E0/0.05461,0.1761,0.1698,25.44,0.7256,2.656,5.059,0.07098,
|
|
+ 6.741,68.86,8.284,6.295,0.1317,0.8509,0.05555,28.73,
|
|
+ 0.3444,31.9,7.519D-4,20.11,9.243,9.713,45.75,73.26,
|
|
+ 1057.,293.2/
|
|
DATA EMX/66.,76.17,87.05,106.7,128.8,152.7,178.3,205.5,921.1,
|
|
+ 959.,998.3,1039.,1081.,1125.,1181.,1216.,7651.,7769.,
|
|
+ 7918.,8041.,8184.,8350.,8484.,8638.,5.D4,5.D4/
|
|
DATA Y0/1.382D2,9.272D1,1.76D2,0.,8.871D1,3.361D1,0.4546,2.542D3,
|
|
+ 2.494D1,1.19D-5,2.971D1,4.671D1,2.17D3,4.505D2,2.706D-4,
|
|
+ 0.,2.891D1,3.805D1,1.915D6,6.847D1,4.446D1,1.702D2,
|
|
+ 3.582D-2,0.,0.,0./
|
|
DATA Y1/0.2481,1.075D2,1.847D1,0.,5.28D-2,3.743D-3,2.683D1,
|
|
+ 4.672D2,8.251,6.57D-3,0.522,0.1425,6.852D-3,2.504,
|
|
+ 1.628,0.,3.404,0.4805,3.14D1,3.989,3.512,4.263,8.712D-3,
|
|
+ 0.,0.,0./
|
|
DATA YW/2.069D1,1.141D1,8.698,0.5602,5.064D1,1.558D1,2.516D-3,
|
|
+ 2.158D2,2.387D-4,2.778D-4,0.3279,0.3096,0.6938,0.4937,
|
|
+ 1.885D-3,0.,1.264,2.902D-2,4.398,2.757,1.748,9.551D-3,
|
|
+ 2.723D1,0.,0.,0./
|
|
DATA YA/2.671D7,6.298D3,1.555D3,8.913D0,3.736D1,1.450D1,4.850D4,
|
|
+ 1.745D4,1.807D2,2.062D1,5.360D1,1.130D2,2.487D3,1.239D3,
|
|
+ 2.045D4,5.150D2,3.960D2,2.186D1,1.606D6,4.236D1,7.637D1,
|
|
+ 1.853D2,1.358D0,4.914D1,5.769D1,3.288D1/
|
|
DATA PV/7.923,5.204,8.055,6.538,17.67,16.32,2.374,6.75,6.29,
|
|
+ 4.111,8.571,8.037,9.791,8.066,6.033,3.846,10.13,9.589,
|
|
+ 8.813,9.724,7.962,8.843,26.04,4.941,1.718,2.963/
|
|
DATA S95/6.298D1,4.624D1,4.422D1,4.81D1,5.143D1,5.246D1,5.21D1,
|
|
+ 5.336D1,2.205D2,2.392D2,2.449D2,3.325D2,3.316D2,3.367D2,
|
|
+ 1.496D2,3.383D2,1.15D1,8.327D0,1.155D1,8.619D0,8.773D0,
|
|
+ 1.181D1,9.098D1,1.157D1,1.195D1,8.099D1/
|
|
DATA E95/76.3,77.5,77.77,76.25,72.73,72.6,74.33,75.56,171.5,
|
|
+ 164.7,163.2,138.3,139.2,138.7,213.6,139.6,1067.,1249.,
|
|
+ 1068.,1235.,1228.,1066.,1215.,1087.,1057.,293.2/
|
|
DATA Y95/1.479D1,2.155D1,2.336D1,2.286D1,2.428D1,2.751D1,3.306D1,
|
|
+ 3.855D1,5.298D1,5.276D1,5.452D1,5.09D1,5.237D1,5.279D1,
|
|
+ 7.000D1,5.459D1,3.412D1,5.000D1,3.578D1,5.000D1,5.000D1,
|
|
+ 4.116D1,5.000D1,5.086D1,5.769D1,3.288D1/
|
|
DATA YW95/0.2646,0.2599,0.2557,0.2449,0.1365,0.02105,0.02404,
|
|
+ 0.02667,1.508D-5,1.574D-5,1.594D-4,1.114D-5,1.107D-5,
|
|
+ 1.111D-5,0.1,1.179D-5,10*0./
|
|
DATA P95/7.672,7.138,7.017,7.043,7.028,6.823,6.509,6.265,4.154,
|
|
+ 4.204,4.187,4.446,4.41,4.407,3.7,4.366,1.922,1.65,1.895,
|
|
+ 1.65,1.65,1.827,1.65,1.722,1.718,2.963/
|
|
C
|
|
VERN26=0.
|
|
IVER=IZZ
|
|
C
|
|
C 1996 Expression
|
|
C
|
|
IF(E.LT.EMX(IVER)) THEN
|
|
XX=E/E0(IVER)-Y0(IVER)
|
|
YY=SQRT(XX*XX+Y1(IVER)*Y1(IVER))
|
|
AA=(XX-UN)*(XX-UN)+YW(IVER)*YW(IVER)
|
|
BB=YY**(HALF*PV(IVER)-5.5)
|
|
CC=(UN+SQRT(YY/YA(IVER)))**PV(IVER)
|
|
FY=AA*BB/CC
|
|
VERN26=S0(IVER)*T18*FY
|
|
ELSE
|
|
C
|
|
C 1995 Expression for high energies
|
|
C (ionization of inner shell electron)
|
|
C
|
|
YY=E/E95(IVER)
|
|
XL=0.
|
|
IF(IZZ.LE.16) XL=UN
|
|
Q=HALF*P95(IVER)-5.5-XL
|
|
AA=(YY-UN)*(YY-UN)+YW95(IVER)*YW95(IVER)
|
|
BB=YY**Q
|
|
CC=(UN+SQRT(YY/Y95(IVER)))**P95(IVER)
|
|
FY=AA*BB/CC
|
|
VERN26=S95(IVER)*T18*FY
|
|
END IF
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
FUNCTION VERN16(E,IZZ)
|
|
C ======================
|
|
C
|
|
C Photoionization cross-sections for ground states
|
|
C of all Sulfur ions.
|
|
C Verner D.A. et al. 1996, ApJ 465
|
|
C Verner & Yakovlev 1995, A&AS 109, 125
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
PARAMETER (T18=1.D-18,MVER=16)
|
|
DIMENSION S0(MVER),E0(MVER),EMX(MVER)
|
|
DIMENSION Y0(MVER),Y1(MVER),YW(MVER),YA(MVER),PV(MVER)
|
|
DIMENSION S95(MVER),E95(MVER),Y95(MVER),YW95(MVER),P95(MVER)
|
|
C
|
|
DATA S0/4.564D4,3.136D2,6.666D0,2.606D0,5.072D-4,9.139D0,5.703D-1,
|
|
+ 3.161D1,9.646D3,5.364D1,1.275D1,3.49D-1,2.294D4,2.555D1,
|
|
+ 2.453D1,2.139D2/
|
|
DATA E0/18.08,8.787,2.027,2.173,0.1713,14.13,0.3757,14.62,0.1526,
|
|
+ 10.4,6.485,2.443,14.74,33.1,439.,110.4/
|
|
DATA EMX/170.,184.6,199.5,216.4,235.,255.7,2569.,2641.,2705.,
|
|
+ 2782.,2859.,2941.,3029.,3107.,5.D4,5.D4/
|
|
DATA Y0/0.9935,2.782,15.68,19.75,94.24,0.,222.2,18.69,1.615D-3,
|
|
+ 17.75,34.26,227.9,2.203D-2,0.,0.,0./
|
|
DATA Y1/0.2486,0.1788,9.421,3.361,0.6265,0.,4.606,0.3037,0.4049,
|
|
+ 1.663,0.137,1.172,1.073D-2,0.,0.,0./
|
|
DATA YW/0.6385,0.7354,4.109,1.863,0.788,0.,1.503,1.153D-3,1.492,
|
|
+ 2.31,1.678,0.7033,27.38,0.,0.,0./
|
|
DATA YA/1.,3.442,54.54,66.41,198.6,1656.,146.,16.11,1438.,36.41,
|
|
+ 65.83,541.1,1.529,38.21,44.05,32.88/
|
|
DATA PV/13.61,12.81,8.611,8.655,13.07,3.626,11.35,8.642,5.977,
|
|
+ 7.09,7.692,7.769,25.68,5.037,1.765,2.963/
|
|
DATA S95/1.883D2,1.896D2,1.780D2,2.037D2,2.919D2,4.712D2,1.916D1,
|
|
+ 1.931D1,1.946D1,2.041D1,2.101D1,2.087D1,2.233D1,2.293D1,
|
|
+ 2.453D1,2.139D2/
|
|
DATA E95/91.52,90.58,92.46,87.44,74.11,57.47,495.2,489.1,493.7,
|
|
+ 480.2,475.8,482.8,466.9,466.7,439.,110.4/
|
|
DATA Y95/71.93,75.38,149.8,93.1,48.64,36.1,35.55,50.,35.68,50.,
|
|
+ 50.,37.42,50.,44.59,44.05,32.88/
|
|
DATA YW95/0.2485,0.2934,0.02142,9.497D-3,0.02785,0.0248,10*0./
|
|
DATA P95/3.633,3.635,3.319,3.565,4.142,4.742,1.742,1.65,1.737,
|
|
+ 1.65,1.65,1.72,1.65,1.668,1.765,2.963/
|
|
C
|
|
VERN16=0.
|
|
IVER=IZZ
|
|
C
|
|
C 1996 Expression
|
|
C
|
|
IF(E.LT.EMX(IVER)) THEN
|
|
XX=E/E0(IVER)-Y0(IVER)
|
|
YY=SQRT(XX*XX+Y1(IVER)*Y1(IVER))
|
|
AA=(XX-UN)*(XX-UN)+YW(IVER)*YW(IVER)
|
|
BB=YY**(HALF*PV(IVER)-5.5)
|
|
CC=(UN+SQRT(YY/YA(IVER)))**PV(IVER)
|
|
FY=AA*BB/CC
|
|
VERN16=S0(IVER)*T18*FY
|
|
ELSE
|
|
C
|
|
C 1995 Expression for high energies
|
|
C (ionization of inner shell electron)
|
|
C
|
|
YY=E/E95(IVER)
|
|
XL=0.
|
|
IF(IZZ.LE.6) XL=UN
|
|
Q=HALF*P95(IVER)-5.5-XL
|
|
AA=(YY-UN)*(YY-UN)+YW95(IVER)*YW95(IVER)
|
|
BB=YY**Q
|
|
CC=(UN+SQRT(YY/Y95(IVER)))**P95(IVER)
|
|
FY=AA*BB/CC
|
|
VERN16=S95(IVER)*T18*FY
|
|
END IF
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
FUNCTION VERN18(E,IZZ)
|
|
C ======================
|
|
C
|
|
C Photoionization cross-sections for ground states
|
|
C of all Argon ions.
|
|
C Verner D.A. et al. 1996, ApJ 465
|
|
C Verner & Yakovlev 1995, A&AS 109, 125
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
PARAMETER (T18=1.D-18,MVER=18)
|
|
DIMENSION S0(MVER),E0(MVER),EMX(MVER)
|
|
DIMENSION Y0(MVER),Y1(MVER),YW(MVER),YA(MVER),PV(MVER)
|
|
DIMENSION S95(MVER),E95(MVER),Y95(MVER),YW95(MVER),P95(MVER)
|
|
C
|
|
DATA S0/2.106D1,2.503D1,3.58D1,2.035D1,9.946D0,1.080D0,3.693D0,
|
|
+ 3.295D1,8.279D-1,8.204D0,1.76D3,7.018D-1,2.459D-2,
|
|
+ 4.997D-2,2.571D4,2.135D1,3.108D1,1.69D2/
|
|
DATA E0/17.09,24.94,14.17,6.953,10.31,0.544,0.02966,3.844,
|
|
+ 0.1926,10.4,0.1257,5.31,0.3209,1.557,18.88,41.54,
|
|
+ 446.8,139.9/
|
|
DATA EMX/249.2,266.2,280.1,298.7,320.,342.6,366.7,392.5,3361.,
|
|
+ 3446.,3523.,3613.,3702.,3798.,3898.,3988.,5.D4,5.D4/
|
|
DATA Y0/1.688,0.9299,2.384,7.501,6.406,1.7D2,4.383D-4,0.,38.14,
|
|
+ 38.04,3.286D-3,1.099D2,2.068D3,4.552D2,2.445D-2,0.,0.,0./
|
|
DATA Y1/0.8943,0.7195,1.794,0.1806,3.659D-3,15.87,2.513,0.,4.649,
|
|
+ 0.639,0.3226,0.2202,21.13,6.459,1.054D-2,0.,0.,0./
|
|
DATA YW/0.4185,0.5108,0.6316,0.8842,0.4885,11.07,1.363D-2,0.,
|
|
+ 1.434,9.203D-4,1.975,0.4987,0.6692,0.2938,29.09,0.,0.,0./
|
|
DATA YA/2.645D2,1.272D2,3.776D1,1.4D1,7.444D1,9.419D2,9.951D3,
|
|
+ 7.082D2,2.392D2,1.495D1,1.579D3,1.001D2,2.285D3,5.031D2,
|
|
+ 1.475D0,4.118D1,3.039D1,3.288D1/
|
|
DATA PV/4.796,4.288,5.742,9.595,6.261,7.582,7.313,4.645,11.21,
|
|
+ 11.15,6.714,8.939,8.81,8.966,26.34,4.945,2.092,2.963/
|
|
DATA S95/8.372D1,1.937D2,2.281D2,2.007D2,2.474D2,2.786D2,3.204D2,
|
|
+ 4.198D2,2.931D1,1.585D1,2.796D1,1.666D1,2.888D1,2.874D1,
|
|
+ 2.883D1,3.003D1,3.108D1,1.69D2/
|
|
DATA E95/164.7,108.5,102.5,107.3,98.35,92.33,85.63,73.68,467.9,
|
|
+ 612.6,478.9,602.8,473.1,474.9,475.6,468.,466.8,139.9/
|
|
DATA Y95/54.52,70.,43.8,70.,42.84,42.2,42.3,44.19,17.44,50.,
|
|
+ 19.17,50.,20.42,22.35,26.15,28.54,30.39,32.88/
|
|
DATA YW95/0.627,0.1,7.167D-3,0.1,7.283D-3,7.408D-3,7.258D-3,
|
|
+ 7.712D-3,10*0./
|
|
DATA P95/3.328,3.7,4.046,3.7,4.125,4.227,4.329,4.492,2.362,
|
|
+ 1.65,2.271,1.65,2.234,2.171,2.074,2.037,2.092,2.963/
|
|
C
|
|
VERN18=0.
|
|
IVER=IZZ
|
|
C
|
|
C 1996 Expression
|
|
C
|
|
IF(E.LT.EMX(IVER)) THEN
|
|
XX=E/E0(IVER)-Y0(IVER)
|
|
YY=SQRT(XX*XX+Y1(IVER)*Y1(IVER))
|
|
AA=(XX-UN)*(XX-UN)+YW(IVER)*YW(IVER)
|
|
BB=YY**(HALF*PV(IVER)-5.5)
|
|
CC=(UN+SQRT(YY/YA(IVER)))**PV(IVER)
|
|
FY=AA*BB/CC
|
|
VERN18=S0(IVER)*T18*FY
|
|
ELSE
|
|
C
|
|
C 1995 Expression for high energies
|
|
C (ionization of inner shell electron)
|
|
C
|
|
YY=E/E95(IVER)
|
|
XL=0.
|
|
IF(IZZ.LE.8) XL=UN
|
|
Q=HALF*P95(IVER)-5.5-XL
|
|
AA=(YY-UN)*(YY-UN)+YW95(IVER)*YW95(IVER)
|
|
BB=YY**Q
|
|
CC=(UN+SQRT(YY/Y95(IVER)))**P95(IVER)
|
|
FY=AA*BB/CC
|
|
VERN18=S95(IVER)*T18*FY
|
|
END IF
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
FUNCTION VERN20(E,IZZ)
|
|
C ======================
|
|
C
|
|
C Photoionization cross-sections for ground states
|
|
C of all Calcium ions.
|
|
C Verner D.A. et al. 1996, ApJ 465
|
|
C Verner & Yakovlev 1995, A&AS 109, 125
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
PARAMETER (T18=1.D-18,MVER=20)
|
|
DIMENSION S0(MVER),E0(MVER),EMX(MVER)
|
|
DIMENSION Y0(MVER),Y1(MVER),YW(MVER),YA(MVER),PV(MVER)
|
|
DIMENSION S95(MVER),E95(MVER),Y95(MVER),YW95(MVER),P95(MVER)
|
|
C
|
|
DATA S0/5.37D5,1.064D7,3.815D1,7.736D0,1.523D-1,7.642D1,4.76D-1,
|
|
+ 6.641D-1,2.076D2,1.437D1,9.384D-1,1.227D1,1.849D3,
|
|
+ 1.116D0,5.513D1,1.293D0,2.028D4,1.105D1,1.936D1,1.369D2/
|
|
DATA E0/12.78,15.53,24.36,4.255,0.6882,9.515,0.808,1.366,0.0552,
|
|
+ 16.05,0.2288,23.45,10.08,9.98,130.9,4.293,26.18,94.72,
|
|
+ 629.7,172.9/
|
|
DATA EMX/34.43,40.9,373.1,394.4,417.5,442.3,468.7,496.7,527.,
|
|
+ 556.9,4265.,4362.,4453.,4555.,4659.,4767.,4880.,4982.,
|
|
+ 5.D4,5.D4/
|
|
DATA Y0/1.012D-3,2.161D-3,1.802,14.67,121.,4.829,148.7,103.9,
|
|
+ 2.826D-4,0.,24.78,24.17,6.138D-3,71.04,1.833D-2,0.9363,
|
|
+ 2.402D-2,0.,0.,0./
|
|
DATA Y1/1.851D-2,6.706D-2,1.233,3.298D-2,3.876,5.824,1.283,3.329,
|
|
+ 1.657,0.,3.1,0.5469,69.31,5.311,0.9359,4.589D-2,9.323D-3,
|
|
+ 0.,0.,0./
|
|
DATA YW/0.4477,0.6453,0.3126,1.369,8.277,2.471,0.572,0.2806,
|
|
+ 1.843D-3,0.,1.39,6.842D-4,241.,3.879,9.084D-2,3.461D-5,
|
|
+ 28.03,0.,0.,0./
|
|
DATA YA/0.3162,0.779,293.1,13.55,150.2,89.73,368.2,318.8,1.79D4,
|
|
+ 698.9,254.9,13.12,1.792D4,59.18,382.8,16.91,1.456,38.18,
|
|
+ 39.21,32.88/
|
|
DATA PV/12.42,21.3,3.944,12.36,10.61,5.141,8.634,8.138,5.893,
|
|
+ 3.857,11.03,9.771,2.868,9.005,2.023,14.38,25.6,4.192,
|
|
+ 1.862,2.963/
|
|
DATA S95/9.017D1,7.314D1,1.945D2,1.542D2,1.622D2,1.855D2,2.181D2,
|
|
+ 2.788D2,1.934D2,6.616D2,1.547D1,1.324D1,1.57D1,1.384D1,
|
|
+ 1.417D1,1.665D1,1.486D1,1.82D1,1.936D1,1.369D2/
|
|
DATA E95/44.87,44.98,126.,141.3,138.4,130.3,120.8,107.,129.3,
|
|
+ 65.11,701.,750.3,698.9,739.6,734.2,686.2,723.5,664.,
|
|
+ 629.7,172.9/
|
|
DATA Y95/14.65,18.98,68.19,99.06,88.11,69.93,58.16,47.68,70.,
|
|
+ 43.71,31.97,50.,32.18,50.,50.,34.43,50.,39.79,39.21,
|
|
+ 32.88/
|
|
DATA YW95/0.2754,0.2735,4.791D-4,1.107D-3,4.384D-4,1.4D-5,
|
|
+ 4.346D-6,4.591D-6,0.1,7.881D-6,10*0./
|
|
DATA P95/7.498,7.152,3.77,3.446,3.521,3.707,3.907,4.2,3.7,4.937,
|
|
+ 1.858,1.65,1.851,1.65,1.65,1.823,1.65,1.777,1.862,
|
|
+ 2.963/
|
|
C
|
|
VERN20=0.
|
|
IVER=IZZ
|
|
C
|
|
C 1996 Expression
|
|
C
|
|
IF(E.LT.EMX(IVER)) THEN
|
|
XX=E/E0(IVER)-Y0(IVER)
|
|
YY=SQRT(XX*XX+Y1(IVER)*Y1(IVER))
|
|
AA=(XX-UN)*(XX-UN)+YW(IVER)*YW(IVER)
|
|
BB=YY**(HALF*PV(IVER)-5.5)
|
|
CC=(UN+SQRT(YY/YA(IVER)))**PV(IVER)
|
|
FY=AA*BB/CC
|
|
VERN20=S0(IVER)*T18*FY
|
|
ELSE
|
|
C
|
|
C 1995 Expression for high energies
|
|
C (ionization of inner shell electron)
|
|
C
|
|
YY=E/E95(IVER)
|
|
XL=0.
|
|
IF(IZZ.LE.10) XL=UN
|
|
Q=HALF*P95(IVER)-5.5-XL
|
|
AA=(YY-UN)*(YY-UN)+YW95(IVER)*YW95(IVER)
|
|
BB=YY**Q
|
|
CC=(UN+SQRT(YY/Y95(IVER)))**P95(IVER)
|
|
FY=AA*BB/CC
|
|
VERN20=S95(IVER)*T18*FY
|
|
END IF
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION GAUNT(I,FR)
|
|
C ====================
|
|
C
|
|
C Hydrogenic bound-free Gaunt factor for the principal quantum
|
|
C number I and frequency FR
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
PARAMETER (UN=1.)
|
|
DIMENSION CGT(7,10),X(7),FRKW(10)
|
|
DATA CGT/0.,12.803223,-5.5759888,1.2302628,-2.9094219D-3,
|
|
* 7.3993579D-6,-8.7356966D-9,-2.0244141,2.1325684,-1.2709045,
|
|
* 1.1595421,-2.0735860D-3,2.7033384D-6,0.,-0.23387146,
|
|
* 0.52471924,-0.55936432,1.1450949,-1.9366592D-3,2.3572356D-6,
|
|
* 0.,-5.4418565D-2,0.19683564,-0.31190730,1.1306695,
|
|
* -1.3482273D-3,-4.6949424D-6,2.3548636D-8,-8.9182854D-3,
|
|
* 5.5545091D-2,-0.16051018,1.1190904,-1.0401085D-3,
|
|
* -6.9943488D-6,2.8496742D-8,-5.5303574D-3,4.1921183D-2,
|
|
* -0.13075417,1.1168376,-8.9466573D-4,-8.8393133D-6,
|
|
* 3.4696768D-8,-2.2752881D-3,2.3350812D-2,-9.5441161D-2,
|
|
* 1.1128632,-7.4833260D-4,-1.0244504D-5,3.8595771D-8,
|
|
* -9.7200274D-4,1.3298411D-2,-7.1010560D-2,1.1093137,
|
|
* -6.2619148D-4,-1.1342068D-5,4.1477731D-8,-4.9576163D-4,
|
|
* 8.5139736D-3,-5.6046560D-2,1.1078717,-5.4837392D-4,
|
|
* -1.2157943D-5,4.3796716D-8,-2.9467046D-4,6.1516856D-3,
|
|
* -4.7326370D-2,1.1052734,-4.4341570D-4,-1.3235905D-5,
|
|
* 4.7003140D-8/
|
|
DATA FRKW/6.6D15,9*3.3D15/
|
|
|
|
IF(I.LE.10) THEN
|
|
X(5)=FR/2.99793D14
|
|
X(6)=X(5)*X(5)
|
|
X(7)=X(6)*X(5)
|
|
X(4)=UN
|
|
X(3)=UN/X(5)
|
|
X(2)=X(3)*X(3)
|
|
X(1)=X(2)*X(3)
|
|
GAUNT=0.
|
|
DO 10 J=1,7
|
|
GAUNT=GAUNT+CGT(J,I)*X(J)
|
|
10 CONTINUE
|
|
ELSE
|
|
GAUNT=UN
|
|
ENDIF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION GNTK(I,FR)
|
|
C ===================
|
|
C
|
|
C Hydrogenic bound-free Gaunt factor for the principal quantum
|
|
C number I and frequency FR (from Klaus Werner)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
GNTK=1.
|
|
Y=1./FR
|
|
IF(I.EQ.1) THEN
|
|
GNTK=0.9916+Y*(2.71852D13-Y*2.26846D30)
|
|
ELSE IF(I.EQ.2) THEN
|
|
GNTK=1.1050-Y*(2.37490D14-Y*4.07677D28)
|
|
ELSE IF(I.EQ.3) THEN
|
|
GNTK=1.1010-Y*(0.98632D14-Y*1.03540D28)
|
|
END IF
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE SPSIGK(IB,FR,SIGSP)
|
|
C ==============================
|
|
C
|
|
C Non-standard evaluation of the photoionization cross-sections
|
|
C Basically user-suppled procedure; here are some examples
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
SIGSP=0.
|
|
C
|
|
C Special formula for the He I ground state
|
|
C
|
|
IF(IB.EQ.-201) SIGSP=7.3D-18*EXP(1.373-2.311E-16*FR)
|
|
C
|
|
C Special formula for the averaged <n=2> level of He I
|
|
C
|
|
IF(IB.EQ.-202) SIGSP=SGHE12(FR)
|
|
C
|
|
C Carbon ground configuration levels 2p2 1D and 1S
|
|
C
|
|
IF(IB.EQ.-602.OR.IB.EQ.-603) THEN
|
|
CALL CARBON(IB,FR,SG)
|
|
SIGSP=SG
|
|
END IF
|
|
C
|
|
C Hidalgo (Ap.J. 153, 981, 1968) photoionization data
|
|
C
|
|
IF(IB.LE.-101.AND.IB.GE.-137) SIGSP=HIDALG(IB,FR)
|
|
C
|
|
C Reilman and Manson (Ap.J. Suppl. 40, 815, 1979) photoionization data
|
|
C
|
|
IF(IB.LE.-301.AND.IB.GE.-337) SIGSP=REIMAN(IB,FR)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C *********************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION HIDALG(IB,FR)
|
|
C ======================
|
|
C
|
|
C Read table of wavelengths and photo-ionization cross-sections
|
|
C from Hidalgo (1968, Ap. J., 153, 981) for the species indicated by IB
|
|
C (Hidalgo's number = INDEX = -IB-100).
|
|
C Compute linearly interpolated value of the cross-section
|
|
C at the frequency FR.
|
|
C
|
|
C (At the moment, only a few transitions are considered)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
DIMENSION WL1(20),WL2(20),WL(20),SIG0(20,24),SIGS(20)
|
|
C
|
|
DATA WL1 /
|
|
* 39.1, 80.9, 97.6,100.1,104.3,107.2,108.7,111.9,113.6,115.4,
|
|
* 117.1,119.0,124.8,126.9,129.1,131.3,133.6,136.0,138.5,141.1/
|
|
DATA WL2 /
|
|
* 68.5, 80.9,100.1,120.9,158.8,165.7,177.3,190.6,200.7,206.2,
|
|
* 211.9,218.0,224.5,231.3,246.3,5*0./
|
|
DATA SIG0 /
|
|
* 120*0.,
|
|
*.0460,.2400,.3500,.3700,.4000,.4300,.4400,.4600,.4700,.4900,
|
|
*.5000,.5200,.5700,.6200, 6*0.,
|
|
* 80*0.,
|
|
*.0092,.1000,.1900,.2100,.2300,.2500,.2600,.2900,.3000,.3200,
|
|
*.3400,.3500,.4100,.4300,.4500,.4800,.5000,.5300,.5600,.5900,
|
|
* 20*0.,
|
|
*.3400,.4600,.6300,.7700,.9100,1.080, 14*0.,
|
|
* 20*0.,
|
|
*.0064,.1100,.2200,.4100,.9400,1.000,1.300,1.600, 12*0.,
|
|
* 80*0.,
|
|
*.0370,.0650,.1300,.2400,.5500,.6300,.7700,.9500,1.100,1.250,
|
|
* 10*0.,
|
|
* 20*0.,
|
|
* 20*0.,
|
|
*.0220,.0390,.0800,.1500,.3500,.4000,.4900,.6200,.7200,.7800,
|
|
*.8500,.9300,1.020,
|
|
* 7*0./
|
|
SAVE WL1,WL2,SIG0
|
|
C
|
|
|
|
INDEX=-IB-100
|
|
NUM=20
|
|
IF(INDEX.GE.13.AND.INDEX.LE.27) NUM=15
|
|
DO I=1,NUM
|
|
IF(INDEX.LT.13) WL(I)=WL1(I)
|
|
IF(INDEX.GE.13) WL(I)=WL2(I)
|
|
SIGS(I)=SIG0(I,INDEX)
|
|
END DO
|
|
C
|
|
WLAM=2.997925D18/FR
|
|
IL=1
|
|
IR=NUM
|
|
DO I=1,NUM-1
|
|
IF(WLAM.GE.WL(I).AND.WLAM.LE.WL(I+1)) THEN
|
|
IL=I
|
|
IR=I+1
|
|
GO TO 60
|
|
END IF
|
|
END DO
|
|
C
|
|
C LINEAR INTERPOLATION:
|
|
C
|
|
60 SIGM=(SIGS(IR)-SIGS(IL))*(WLAM-WL(IL))/(WL(IR)-WL(IL))
|
|
* + SIGS(IL)
|
|
C
|
|
C IF OUTSIDE WAVELENGTH RANGE SET TO FIRST(LAST) VALUE:
|
|
C
|
|
IF(WLAM.LE.WL(1)) SIGM=SIGS(1)
|
|
IF(WLAM.GE.WL(NUM)) SIGM=SIGS(NUM)
|
|
C
|
|
C IF LAST NON-ZERO SIG VALUES, NO INTERPOLATION:
|
|
C
|
|
c IF(SIGS(IR).EQ.0.) SIGM=SIGS(IL)
|
|
C
|
|
HIDALG=SIGM*1.D-18
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C *********************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION REIMAN(IB,FR)
|
|
C ======================
|
|
C
|
|
C Read table of photon energies and photo-ionization cross-sections
|
|
C from Reilman & Manson (1979, Ap. J. Suppl., 40, 815) for the species
|
|
C indicated by IB
|
|
C
|
|
C Compute linearly interpolated value of the cross-section
|
|
C at the frequency FR.
|
|
C
|
|
C (At the moment, only a few transitions are considered)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
DIMENSION HEV(30),F0(30),SIG0(30,2),SIGS(30)
|
|
C
|
|
DATA HEV /
|
|
* 130.,160.,190.,210.,240.,270.,300.,330.,360.,390.,
|
|
* 420.,450.,480.,510.,540.,570.,600.,630.,660.,690.,
|
|
* 720.,750.,780.,810.,840.,870.,900.,930.,960.,990./
|
|
DATA SIG0 /
|
|
* 3*0., 4.422D-1, 3.478D-1,
|
|
* 2.794D-1, 2.286D-1, 1.899D-1, 1.598D-1, 1.360D-1,
|
|
* 1.169D-1, 1.013D-1, 8.845D-2, 7.776D-2, 6.877D-2,
|
|
* 6.114D-2, 5.463D-2, 4.904D-2, 4.419D-2, 3.998D-2,
|
|
* 3.629D-2, 3.305D-2, 3.019D-2, 2.766D-2, 2.540D-2,
|
|
* 2.339D-2, 2.158D-2, 1.996D-2, 1.850D-2, 1.718D-2,
|
|
* 4*0., 1.981D-1, 1.584D-1,
|
|
* 1.290D-1, 1.066D-1, 8.932D-2, 7.567D-2, 6.475D-2,
|
|
* 5.589D-2, 4.862D-2, 4.259D-2, 3.754D-2, 3.329D-2,
|
|
* 2.966D-2, 2.656D-2, 2.388D-2, 2.157D-2, 1.954D-2,
|
|
* 1.777D-2, 1.621D-2, 1.484D-2, 1.362D-2, 1.253D-2,
|
|
* 1.155D-2, 1.067D-2, 9.888D-3, 9.179D-3/
|
|
SAVE HEV,SIG0
|
|
C
|
|
INDEX=-IB-300
|
|
NUM=30
|
|
DO I=1,NUM
|
|
F0(I)=HEV(I)*2.418573D14
|
|
SIGS(I)=SIG0(I,INDEX)
|
|
END DO
|
|
C
|
|
IL=1
|
|
IR=NUM
|
|
DO I=1,NUM-1
|
|
IF(FR.GE.F0(I).AND.FR.LE.F0(I+1)) THEN
|
|
IL=I
|
|
IR=I+1
|
|
GO TO 60
|
|
END IF
|
|
END DO
|
|
C
|
|
C LINEAR INTERPOLATION:
|
|
C
|
|
60 SIGM=(SIGS(IR)-SIGS(IL))*(FR-F0(IL))/(F0(IR)-F0(IL))
|
|
* + SIGS(IL)
|
|
C
|
|
C IF OUTSIDE WAVELENGTH RANGE SET TO FIRST(LAST) VALUE:
|
|
C
|
|
IF(FR.LE.F0(1)) SIGM=SIGS(1)
|
|
IF(FR.GE.F0(NUM)) SIGM=SIGS(NUM)
|
|
C
|
|
C IF LAST NON-ZERO SIG VALUES, NO INTERPOLATION:
|
|
C
|
|
c IF(SIGS(IR).EQ.0.) SIGM=SIGS(IL)
|
|
C
|
|
REIMAN=SIGM*1.D-18
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE CARBON(IB,FR,SG)
|
|
C ===========================
|
|
C
|
|
C Photoionization cross-section for neutral carbon 2p1D and 2p1S
|
|
C levels (G.B.Taylor - private communication)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
DIMENSION FR2(34),SG2(34),FR3(45),SG3(45)
|
|
PARAMETER (FR0=3.28805D15, NC2=34, NC3=45)
|
|
DATA FR2/ 0.74, 0.75, 0.76, 0.77, 0.78, 0.79, 0.80, 0.81, 0.82,
|
|
* 0.83, 0.85, 0.86, 0.87, 0.88, 0.89, 0.90,
|
|
* 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98, 0.99,
|
|
* 1.00, 1.10, 1.20, 1.30, 1.45, 1.50, 1.60, 1.80, 2./
|
|
DATA SG2/ 12.04, 12.03, 12.09, 12.26, 12.60, 13.24, 14.36, 16.24,
|
|
* 19.28, 23.94, 37.41, 42.88, 44.76, 43.41, 40.46, 37.19,
|
|
* 34.26, 31.82, 29.96, 28.57, 27.68, 27.37, 27.84, 29.69,
|
|
* 34.45, 46.35, 13.80, 11.54, 10.40, 8.96, 8.54, 7.47,
|
|
* 6.53, 5.66/
|
|
DATA FR3/ 0.66, 0.68, 0.70, 0.72, 0.74, 0.76, 0.78, 0.80, 0.82,
|
|
* 0.84, 0.86, 0.864,0.866,0.868,0.87, 0.874,0.876,0.88,
|
|
* 0.882,0.884,0.886,0.888,0.89 ,0.894,0.896,0.898,0.90,
|
|
* 0.904,0.908,0.910,0.920,0.94, 0.98, 1.00, 1.10, 1.20,
|
|
* 1.26, 1.34, 1.36, 1.40, 1.46, 1.60, 1.70, 1.80, 2./
|
|
DATA SG3/ 13.94, 13.29, 12.56, 11.73, 10.82, 10.18, 8.62, 7.27,
|
|
* 5.74, 4.14, 4.61, 5.92, 6.94, 8.34, 10.21, 16.12,
|
|
* 20.64, 34.56, 44.82, 57.71, 73.09, 89.99,106.38,127.08,
|
|
* 128.38,124.44,117.17, 99.32, 82.95, 76.05, 52.65, 33.23,
|
|
* 21.29, 18.69, 12.62, 11.44, 9.77, 7.53, 10.47, 9.65,
|
|
* 10.19, 7.28, 6.70, 6.11, 4.96/
|
|
SAVE FR2,SG2,FR3,SG3
|
|
C
|
|
F=FR/FR0
|
|
IF(IB.NE.-602) GO TO 25
|
|
J=2
|
|
IF(F.LE.FR2(1)) GO TO 20
|
|
DO I=2,NC2
|
|
J=I
|
|
IF(F.GT.FR2(I-1).AND.F.LE.FR2(I)) GO TO 20
|
|
END DO
|
|
20 SG=(F-FR2(J-1))/(FR2(J)-FR2(J-1))*(SG2(J)-SG2(J-1))+SG2(J-1)
|
|
SG=SG*1.D-18
|
|
25 IF(IB.NE.-603) GO TO 50
|
|
J=2
|
|
IF(F.LE.FR3(1)) GO TO 40
|
|
DO I=2,NC3
|
|
J=I
|
|
IF(F.GT.FR3(I-1).AND.F.LE.FR3(I)) GO TO 40
|
|
END DO
|
|
40 SG=(F-FR3(J-1))/(FR3(J)-FR3(J-1))*(SG3(J)-SG3(J-1))+SG3(J-1)
|
|
SG=SG*1.D-18
|
|
50 CONTINUE
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
|
|
FUNCTION SGHE12(FR)
|
|
C ===================
|
|
C
|
|
C Special formula for the photoionization cross-section from the
|
|
C averaged <n=2> level of He I
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
PARAMETER (C1=3.D0,C2=9.D0,C3=1.6D1,T15=1.D-15,
|
|
* A1=6.45105D-18,A2=3.02D-19,A3=9.9847D-18,A4=1.1763673D-17,
|
|
* A5=3.63662D-19,A6=-2.783D2,A7=1.488D1,A8=-2.311D-1,
|
|
* E1=3.5D0,E2=3.6D0,E3=1.91D0,E4=2.9D0,E5=3.3D0)
|
|
C
|
|
X=FR*T15
|
|
XX=LOG(FR)
|
|
SGHE12=(C1*(A1/X**E1+A2/X**E2)+A3/X**E3+C2*(A4/X**E4+A5/X**E5)+
|
|
* C1*EXP(A6+XX*(A7+XX*A8)))/C3
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION SBFHE1(II,IB,FR,GG)
|
|
C ============================
|
|
C
|
|
C Calculates photoionization cross sections of neutral helium
|
|
C from states with n = 1, 2, 3, 4.
|
|
C
|
|
C The levels are either non-averaged (l,s) states, or some
|
|
C averaged levels.
|
|
C The program allows only two standard possibilities of
|
|
C constructing averaged levels:
|
|
C i) all states within given principal quantum number n (>1) are
|
|
C lumped together
|
|
C ii) all siglet states for given n, and all triplet states for
|
|
C given n are lumped together separately (there are thus two
|
|
C explicit levels for a given n)
|
|
C
|
|
C The cross sections are calculated using appropriate averages
|
|
C of the Opacity Project cross sections, calculated by procedure
|
|
C HEPHOT
|
|
C
|
|
C For IB=21 or IB=23, Koester (1985, AA 149, 423) fits
|
|
C
|
|
C Input parameters:
|
|
C II - index of the lower level (in the numbering of explicit
|
|
C levels)
|
|
C IB - photoionization switch IBF for the given transition
|
|
C = 10 - means that the given transition is from an
|
|
C averaged level
|
|
C = 11 or 21 - the given transition is from non-averaged
|
|
C singlet state
|
|
C = 13 or 23 - the given transition is from non-averaged
|
|
C triplet state
|
|
C FR - frequency
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
C
|
|
NI=NQUANT(II)
|
|
IGI=INT(G(II)+0.01)
|
|
IS=IB-10
|
|
IF(IB.GT.20) IS=IB-20
|
|
sbfhe1=0.
|
|
C
|
|
C ----------------------------------------------------------------
|
|
C IB=11 or 13 - photoionization from an non-averaged (l,s) level
|
|
C ----------------------------------------------------------------
|
|
C
|
|
IF(IS.EQ.1.OR.IS.EQ.3) THEN
|
|
IL=(IGI/IS-1)/2
|
|
IF(IB.LT.20) THEN
|
|
SBFHE1=HEPHOT(IS,IL,NI,FR)
|
|
ELSE
|
|
SBFHE1=CKOEST(IS,IL,NI,FR,GG)
|
|
ENDIF
|
|
END IF
|
|
C
|
|
C ----------------------------------------------------------------
|
|
C IS=10 - photoionization from an averaged level
|
|
C ----------------------------------------------------------------
|
|
C
|
|
IF(IS.EQ.0) THEN
|
|
IF(NI.EQ.2) THEN
|
|
C
|
|
C ******** photoionization from an averaged level with n=2
|
|
C
|
|
IF(IGI.EQ.4) THEN
|
|
C
|
|
C a) lower level is an averaged singlet state
|
|
C
|
|
SBFHE1=(HEPHOT(1,0,2,FR)+3.D0*HEPHOT(1,1,2,FR))/9.D0
|
|
ELSE IF(IGI.EQ.12) THEN
|
|
C
|
|
C b) lower level is an averaged triplet state
|
|
C
|
|
SBFHE1=(HEPHOT(3,0,2,FR)+3.D0*HEPHOT(3,1,2,FR))/9.D0
|
|
ELSE IF(IGI.EQ.16) THEN
|
|
C
|
|
C c) lower level is an average of both singlet and triplet states
|
|
C
|
|
SBFHE1=(HEPHOT(1,0,2,FR)+3.D0*(HEPHOT(1,1,2,FR)+
|
|
* HEPHOT(3,0,2,FR))+9.D0*HEPHOT(3,1,2,FR))/1.6D1
|
|
ELSE
|
|
GO TO 10
|
|
END IF
|
|
C
|
|
C
|
|
C ******** photoionization from an averaged level with n=3
|
|
C
|
|
ELSE IF(NI.EQ.3) THEN
|
|
IF(IGI.EQ.9) THEN
|
|
C
|
|
C a) lower level is an averaged singlet state
|
|
C
|
|
SBFHE1=(HEPHOT(1,0,3,FR)+3.D0*HEPHOT(1,1,3,FR)+
|
|
* 5.D0*HEPHOT(1,2,3,FR))/9.D0
|
|
ELSE IF(IGI.EQ.27) THEN
|
|
C
|
|
C b) lower level is an averaged triplet state
|
|
C
|
|
SBFHE1=(HEPHOT(3,0,3,FR)+3.D0*HEPHOT(3,1,3,FR)+
|
|
* 5.D0*HEPHOT(3,2,3,FR))/9.D0
|
|
ELSE IF(IGI.EQ.36) THEN
|
|
C
|
|
C c) lower level is an average of both singlet and triplet states
|
|
C
|
|
SBFHE1=(HEPHOT(1,0,3,FR)+3.D0*HEPHOT(1,1,3,FR)+
|
|
* 5.D0*HEPHOT(1,2,3,FR)+
|
|
* 3.D0*HEPHOT(3,0,3,FR)+9.D0*HEPHOT(3,1,3,FR)+
|
|
* 15.D0*HEPHOT(3,2,3,FR))/3.6D0
|
|
ELSE
|
|
GO TO 10
|
|
END IF
|
|
ELSE IF(NI.EQ.4) THEN
|
|
C
|
|
C ******** photoionization from an averaged level with n=4
|
|
C
|
|
IF(IGI.EQ.16) THEN
|
|
C
|
|
C a) lower level is an averaged singlet state
|
|
C
|
|
SBFHE1=(HEPHOT(1,0,4,FR)+3.D0*HEPHOT(1,1,4,FR)+
|
|
* 5.D0*HEPHOT(1,2,4,FR)+
|
|
* 7.D0*HEPHOT(1,3,4,FR))/1.6D1
|
|
ELSE IF(IGI.EQ.48) THEN
|
|
C
|
|
C b) lower level is an averaged triplet state
|
|
C
|
|
SBFHE1=(HEPHOT(3,0,4,FR)+3.D0*HEPHOT(3,1,4,FR)+
|
|
* 5.D0*HEPHOT(3,2,4,FR)+
|
|
* 7.D0*HEPHOT(3,3,4,FR))/1.6D1
|
|
ELSE IF(IGI.EQ.64) THEN
|
|
C
|
|
C c) lower level is an average of both singlet and triplet states
|
|
C
|
|
SBFHE1=(HEPHOT(1,0,4,FR)+3.D0*HEPHOT(1,1,4,FR)+
|
|
* 5.D0*HEPHOT(1,2,4,FR)+
|
|
* 7.D0*HEPHOT(1,3,4,FR)+
|
|
* 3.D0*HEPHOT(3,0,4,FR)+
|
|
* 9.D0*HEPHOT(3,1,4,FR)+
|
|
* 15.D0*HEPHOT(3,2,4,FR)+
|
|
* 21.D0*HEPHOT(3,3,4,FR))/6.4D1
|
|
ELSE
|
|
GO TO 10
|
|
END IF
|
|
ELSE
|
|
GO TO 10
|
|
END IF
|
|
END IF
|
|
RETURN
|
|
10 WRITE(6,601) NI,IGI,IS
|
|
WRITE(10,601) NI,IGI,IS
|
|
601 FORMAT(1H0/' INCONSISTENT INPUT TO PROCEDURE SBFHE1'/
|
|
* ' QUANTUM NUMBER =',I3,' STATISTICAL WEIGHT',I4,' S=',I3)
|
|
call quit(' ',ni,igi)
|
|
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION HEPHOT(S,L,N,FREQ)
|
|
C ===========================
|
|
C
|
|
C EVALUATES HE I PHOTOIONIZATION CROSS SECTION USING SEATON
|
|
C FERNLEY'S CUBIC FITS TO THE OPACITY PROJECT CROSS SECTIONS
|
|
C UP TO SOME ENERGY "EFITM" IN THE RESONANCE-FREE ZONE. BEYOND
|
|
C THIS ENERGY LINEAR FITS TO LOG SIGMA IN LOG (E/E0) ARE USED.
|
|
C THIS EXTRAPOLATION SHOULD BE USED UP TO THE BEGINNING OF THE
|
|
C RESONANCE ZONE "XMAX", BUT AT PRESENT IT IS USED THROUGH IT.
|
|
C BY CHANGING A FEW LINES THAT ARE PRESENTLY COMMENTED OUT,
|
|
C FOR ENERGIES IN THE RESONANCE ZONE A VALUE OF 1/100 OF THE
|
|
C THRESHOLD CROSS SECTION IS USED -- THIS IS PURELY AD HOC AND
|
|
C ONLY A TEMPORARY MEASURE. OBVIOUSLY ANY OTHER VALUE OR FUNCTIONAL
|
|
C FORM CAN BE INSERTED HERE.
|
|
C
|
|
C CALLING SEQUENCE INCLUDES:
|
|
C S = MULTIPLICITY, EITHER 1 OR 3
|
|
C L = ANGULAR MOMENTUM, 0, 1, OR 2;
|
|
C for L > 2 - hydrogenic expresion
|
|
C FREQ = FREQUENCY
|
|
C
|
|
C DGH JUNE 1988 JILA, slightly modified by I.H.
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INTEGER S,L,SS,LL
|
|
PARAMETER (TENM18=1.D-18, FRH=3.28805D15, TWO=2.D0,
|
|
* TENLG=2.302585093, PHOT0=2.815D29)
|
|
DIMENSION COEF(4,53),IST(3,2),N0(3,2),
|
|
* FL0(53),A(53),B(53),XFITM(53)
|
|
C
|
|
DATA IST/1,36,20,11,45,28/
|
|
DATA N0/1,2,3,2,2,3/
|
|
C
|
|
DATA FL0/
|
|
. 2.521D-01,-5.381D-01,-9.139D-01,-1.175D+00,-1.375D+00,-1.537D+00,
|
|
.-1.674D+00,-1.792D+00,-1.896D+00,-1.989D+00,-4.555D-01,-8.622D-01,
|
|
.-1.137D+00,-1.345D+00,-1.512D+00,-1.653D+00,-1.774D+00,-1.880D+00,
|
|
.-1.974D+00,-9.538D-01,-1.204D+00,-1.398D+00,-1.556D+00,-1.690D+00,
|
|
.-1.806D+00,-1.909D+00,-2.000D+00,-9.537D-01,-1.204D+00,-1.398D+00,
|
|
.-1.556D+00,-1.690D+00,-1.806D+00,-1.909D+00,-2.000D+00,-6.065D-01,
|
|
.-9.578D-01,-1.207D+00,-1.400D+00,-1.558D+00,-1.692D+00,-1.808D+00,
|
|
.-1.910D+00,-2.002D+00,-5.749D-01,-9.352D-01,-1.190D+00,-1.386D+00,
|
|
.-1.547D+00,-1.682D+00,-1.799D+00,-1.902D+00,-1.995D+00/
|
|
C
|
|
DATA XFITM/
|
|
. 3.262D-01, 6.135D-01, 9.233D-01, 8.438D-01, 1.020D+00, 1.169D+00,
|
|
. 1.298D+00, 1.411D+00, 1.512D+00, 1.602D+00, 7.228D-01, 1.076D+00,
|
|
. 1.206D+00, 1.404D+00, 1.481D+00, 1.464D+00, 1.581D+00, 1.685D+00,
|
|
. 1.777D+00, 9.586D-01, 1.187D+00, 1.371D+00, 1.524D+00, 1.740D+00,
|
|
. 1.854D+00, 1.955D+00, 2.046D+00, 9.585D-01, 1.041D+00, 1.371D+00,
|
|
. 1.608D+00, 1.739D+00, 1.768D+00, 1.869D+00, 1.803D+00, 7.360D-01,
|
|
. 1.041D+00, 1.272D+00, 1.457D+00, 1.611D+00, 1.741D+00, 1.855D+00,
|
|
. 1.870D+00, 1.804D+00, 9.302D-01, 1.144D+00, 1.028D+00, 1.210D+00,
|
|
. 1.362D+00, 1.646D+00, 1.761D+00, 1.863D+00, 1.954D+00/
|
|
C
|
|
DATA A/
|
|
. 6.95319D-01, 1.13101D+00, 1.36313D+00, 1.51684D+00, 1.64767D+00,
|
|
. 1.75643D+00, 1.84458D+00, 1.87243D+00, 1.85628D+00, 1.90889D+00,
|
|
. 9.01802D-01, 1.25389D+00, 1.39033D+00, 1.55226D+00, 1.60658D+00,
|
|
. 1.65930D+00, 1.68855D+00, 1.62477D+00, 1.66726D+00, 1.83599D+00,
|
|
. 2.50403D+00, 3.08564D+00, 3.56545D+00, 4.25922D+00, 4.61346D+00,
|
|
. 4.91417D+00, 5.19211D+00, 1.74181D+00, 2.25756D+00, 2.95625D+00,
|
|
. 3.65899D+00, 4.04397D+00, 4.13410D+00, 4.43538D+00, 4.19583D+00,
|
|
. 1.79027D+00, 2.23543D+00, 2.63942D+00, 3.02461D+00, 3.35018D+00,
|
|
. 3.62067D+00, 3.85218D+00, 3.76689D+00, 3.49318D+00, 1.16294D+00,
|
|
. 1.86467D+00, 2.02110D+00, 2.24231D+00, 2.44240D+00, 2.76594D+00,
|
|
. 2.93230D+00, 3.08109D+00, 3.21069D+00/
|
|
C
|
|
DATA B/
|
|
.-1.29000D+00,-2.15771D+00,-2.13263D+00,-2.10272D+00,-2.10861D+00,
|
|
.-2.11507D+00,-2.11710D+00,-2.08531D+00,-2.03296D+00,-2.03441D+00,
|
|
.-1.85905D+00,-2.04057D+00,-2.02189D+00,-2.05930D+00,-2.03403D+00,
|
|
.-2.02071D+00,-1.99956D+00,-1.92851D+00,-1.92905D+00,-4.58608D+00,
|
|
.-4.40022D+00,-4.39154D+00,-4.39676D+00,-4.57631D+00,-4.57120D+00,
|
|
.-4.56188D+00,-4.55915D+00,-4.41218D+00,-4.12940D+00,-4.24401D+00,
|
|
.-4.40783D+00,-4.39930D+00,-4.25981D+00,-4.26804D+00,-4.00419D+00,
|
|
.-4.47251D+00,-3.87960D+00,-3.71668D+00,-3.68461D+00,-3.67173D+00,
|
|
.-3.65991D+00,-3.64968D+00,-3.48666D+00,-3.23985D+00,-2.95758D+00,
|
|
.-3.07110D+00,-2.87157D+00,-2.83137D+00,-2.82132D+00,-2.91084D+00,
|
|
.-2.91159D+00,-2.91336D+00,-2.91296D+00/
|
|
C
|
|
DATA ((COEF(I,J),I=1,4),J=1,10)/
|
|
. 8.734D-01,-1.545D+00,-1.093D+00, 5.918D-01, 9.771D-01,-1.567D+00,
|
|
.-4.739D-01,-1.302D-01, 1.174D+00,-1.638D+00,-2.831D-01,-3.281D-02,
|
|
. 1.324D+00,-1.692D+00,-2.916D-01, 9.027D-02, 1.445D+00,-1.761D+00,
|
|
.-1.902D-01, 4.401D-02, 1.546D+00,-1.817D+00,-1.278D-01, 2.293D-02,
|
|
. 1.635D+00,-1.864D+00,-8.252D-02, 9.854D-03, 1.712D+00,-1.903D+00,
|
|
.-5.206D-02, 2.892D-03, 1.782D+00,-1.936D+00,-2.952D-02,-1.405D-03,
|
|
. 1.845D+00,-1.964D+00,-1.152D-02,-4.487D-03/
|
|
DATA ((COEF(I,J),I=1,4),J=11,19)/
|
|
. 7.377D-01,-9.327D-01,-1.466D+00, 6.891D-01, 9.031D-01,-1.157D+00,
|
|
.-7.151D-01, 1.832D-01, 1.031D+00,-1.313D+00,-4.517D-01, 9.207D-02,
|
|
. 1.135D+00,-1.441D+00,-2.724D-01, 3.105D-02, 1.225D+00,-1.536D+00,
|
|
.-1.725D-01, 7.191D-03, 1.302D+00,-1.602D+00,-1.300D-01, 7.345D-03,
|
|
. 1.372D+00,-1.664D+00,-8.204D-02,-1.643D-03, 1.434D+00,-1.715D+00,
|
|
.-4.646D-02,-7.456D-03, 1.491D+00,-1.760D+00,-1.838D-02,-1.152D-02/
|
|
DATA ((COEF(I,J),I=1,4),J=20,27)/
|
|
. 1.258D+00,-3.442D+00,-4.731D-01,-9.522D-02, 1.553D+00,-2.781D+00,
|
|
.-6.841D-01,-4.083D-03, 1.727D+00,-2.494D+00,-5.785D-01,-6.015D-02,
|
|
. 1.853D+00,-2.347D+00,-4.611D-01,-9.615D-02, 1.955D+00,-2.273D+00,
|
|
.-3.457D-01,-1.245D-01, 2.041D+00,-2.226D+00,-2.669D-01,-1.344D-01,
|
|
. 2.115D+00,-2.200D+00,-1.999D-01,-1.410D-01, 2.182D+00,-2.188D+00,
|
|
.-1.405D-01,-1.460D-01/
|
|
DATA ((COEF(I,J),I=1,4),J=28,35)/
|
|
. 1.267D+00,-3.417D+00,-5.038D-01,-1.797D-02, 1.565D+00,-2.781D+00,
|
|
.-6.497D-01,-5.979D-03, 1.741D+00,-2.479D+00,-6.099D-01,-2.227D-02,
|
|
. 1.870D+00,-2.336D+00,-4.899D-01,-6.616D-02, 1.973D+00,-2.253D+00,
|
|
.-3.972D-01,-8.729D-02, 2.061D+00,-2.212D+00,-3.072D-01,-1.060D-01,
|
|
. 2.137D+00,-2.189D+00,-2.352D-01,-1.171D-01, 2.205D+00,-2.186D+00,
|
|
.-1.621D-01,-1.296D-01/
|
|
DATA ((COEF(I,J),I=1,4),J=36,44)/
|
|
. 1.129D+00,-3.149D+00,-1.910D-01,-5.244D-01, 1.431D+00,-2.511D+00,
|
|
.-3.710D-01,-1.933D-01, 1.620D+00,-2.303D+00,-3.045D-01,-1.391D-01,
|
|
. 1.763D+00,-2.235D+00,-1.829D-01,-1.491D-01, 1.879D+00,-2.215D+00,
|
|
.-9.003D-02,-1.537D-01, 1.978D+00,-2.213D+00,-2.066D-02,-1.541D-01,
|
|
. 2.064D+00,-2.220D+00, 3.258D-02,-1.527D-01, 2.140D+00,-2.225D+00,
|
|
. 6.311D-02,-1.455D-01, 2.208D+00,-2.229D+00, 7.977D-02,-1.357D-01/
|
|
DATA ((COEF(I,J),I=1,4),J=45,53)/
|
|
. 1.204D+00,-2.809D+00,-3.094D-01, 1.100D-01, 1.455D+00,-2.254D+00,
|
|
.-4.795D-01, 6.872D-02, 1.619D+00,-2.109D+00,-3.357D-01,-2.532D-02,
|
|
. 1.747D+00,-2.065D+00,-2.317D-01,-5.224D-02, 1.853D+00,-2.058D+00,
|
|
.-1.517D-01,-6.647D-02, 1.943D+00,-2.055D+00,-1.158D-01,-6.081D-02,
|
|
. 2.023D+00,-2.070D+00,-6.470D-02,-6.800D-02, 2.095D+00,-2.088D+00,
|
|
.-2.357D-02,-7.250D-02, 2.160D+00,-2.107D+00, 1.065D-02,-7.542D-02/
|
|
C
|
|
SAVE COEF,IST,N0,FL0,A,B,XFITM
|
|
C
|
|
IF(L.GT.2) GO TO 20
|
|
C
|
|
C SELECT BEGINNING AND END OF COEFFICIENTS
|
|
C
|
|
SS=(S+1)/2
|
|
LL=L+1
|
|
NSL0=N0(LL,SS)
|
|
I=IST(LL,SS)+N-NSL0
|
|
C
|
|
C EVALUATE CROSS SECTION
|
|
C
|
|
FL=LOG10(FREQ/FRH)
|
|
X=FL-FL0(I)
|
|
IF(X.GE.-0.001D0) THEN
|
|
IF(X.LT.XFITM(I)) THEN
|
|
P=COEF(4,I)
|
|
DO K=1,3
|
|
P=X*P+COEF(4-K,I)
|
|
END DO
|
|
HEPHOT=TENM18*EXP(TENLG*P)
|
|
ELSE
|
|
HEPHOT=TENM18*EXP(TENLG*(A(I)+B(I)*X))
|
|
END IF
|
|
ELSE
|
|
HEPHOT=0.
|
|
END IF
|
|
RETURN
|
|
C
|
|
C Hydrogenic expression for L > 2
|
|
C [multiplied by relative population of state (s,l,n), ie.
|
|
C by stat.weight(s,l)/stat.weight(n)]
|
|
C
|
|
20 GN=TWO*N*N
|
|
HEPHOT=PHOT0/FREQ/FREQ/FREQ/N**5*(2*L+1)*S/GN
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION CKOEST(S,L,N,FREQ,GG)
|
|
C ==============================
|
|
C
|
|
C EVALUATES HE I PHOTOIONIZATION CROSS SECTION USING
|
|
C KOESTER'S FITS (1985, AA 149, 423)
|
|
C
|
|
C CALLING SEQUENCE INCLUDES:
|
|
C S = MULTIPLICITY, EITHER 1 OR 3
|
|
C L = ANGULAR MOMENTUM, 0, 1, OR 2;
|
|
C for L > 2 - hydrogenic expresion
|
|
C N = PRINCIPAL QUANTUM NUMBER
|
|
C FREQ = FREQUENCY
|
|
C GG = STATISTICAL WEIGHT
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INTEGER S,L,SS,LL
|
|
PARAMETER (PHOT0=2.815D29)
|
|
DIMENSION COEF(3,11),IST(3)
|
|
C
|
|
DATA IST/1,2,6/
|
|
C
|
|
DATA COEF/
|
|
. -58.229, 4.3965, -0.22134 ,
|
|
. -68.438, 5.7453, -0.26277 ,
|
|
. -67.310, 6.1831, -0.32244 ,
|
|
. -92.020, 10.313 , -0.45090 ,
|
|
. -68.936, 5.2666, -0.15812 ,
|
|
. -63.408, 3.8797, -0.12479 ,
|
|
. -63.778, 4.5102, -0.18213 ,
|
|
. -76.903, 6.3639, -0.21565 ,
|
|
. -61.027, 3.1833, -0.043675,
|
|
. -83.287, 7.1751, -0.20821 ,
|
|
. -83.287, 7.1751, -0.20821 /
|
|
C
|
|
SAVE COEF,IST
|
|
C
|
|
IF(L.GT.2) GO TO 20
|
|
C
|
|
C SELECT BEGINNING AND END OF COEFFICIENTS
|
|
C
|
|
SS=(S-1)/2
|
|
LL=2*L
|
|
NSL=IST(N)+LL+SS
|
|
C
|
|
C EVALUATE CROSS SECTION
|
|
C
|
|
X=LOG(CAS/FREQ)
|
|
CKOEST=EXP(COEF(1,NSL)+X*(COEF(2,NSL)+X*COEF(3,NSL)))/GG
|
|
RETURN
|
|
C
|
|
C Hydrogenic expression for L > 2
|
|
C [multiplied by relative population of state (s,l,n), ie.
|
|
C by stat.weight(s,l)/stat.weight(n)]
|
|
C
|
|
20 GN=TWO*N*N
|
|
CKOEST=PHOT0/FREQ/FREQ/FREQ/N**5*(2*L+1)*S/GN
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ******************************************************************
|
|
C
|
|
C
|
|
FUNCTION TOPBAS(FREQ,FREQ0,TYPLV)
|
|
C ==================================
|
|
C
|
|
C Procedure calculates the photo-ionisation cross section SIGMA in
|
|
C [cm^2] at frequency FREQ. FREQ0 is the threshold frequency from
|
|
C level I of ion KI. Threshold cross-sections will be of the order
|
|
C of the numerical value of 10^-18.
|
|
C Opacity-Project (OP) interpolation fit formula
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
PARAMETER (E10=2.3025851)
|
|
PARAMETER (MMAXOP = 200,! maximum number of levels in OP data
|
|
+ MOP = 15 )! maximum number of fit points per level
|
|
CHARACTER*10 IDLVOP(MMAXOP) ! level identifyer Opacity-Project data
|
|
CHARACTER*10 TYPLV
|
|
LOGICAL*2 LOPREA
|
|
COMMON /TOPB/ SOP(MOP,MMAXOP) ,! sigma = alog10(sigma/10^-18) of fit point
|
|
+ XOP(MOP,MMAXOP) ,! x = alog10(nu/nu0) of fit point
|
|
+ NOP(MMAXOP) ,! number of fit points for current level
|
|
+ NTOTOP ,! total number of levels in OP data
|
|
+ IDLVOP ,! level identifyer Opacity-Project data
|
|
+ LOPREA ! .T. OP data read in; .F. OP data not yer read in
|
|
DIMENSION XFIT(MOP) ,! local array containing x for OP data
|
|
+ SFIT(MOP) ! local array containing sigma for OP data
|
|
C
|
|
TOPBAS=0.
|
|
C
|
|
C Read OP data if not yet done
|
|
C
|
|
IF (.NOT.LOPREA) CALL OPDATA
|
|
X = LOG10(FREQ/FREQ0)
|
|
DO IOP = 1,NTOTOP
|
|
IF (IDLVOP(IOP).EQ.TYPLV) THEN
|
|
C level has been detected in OP-data file
|
|
IF (NOP(IOP).LE.0) GO TO 20
|
|
DO IFIT = 1,NOP(IOP)
|
|
XFIT(IFIT) = XOP(IFIT,IOP)
|
|
SFIT(IFIT) = SOP(IFIT,IOP)
|
|
END DO
|
|
SIGM = YLINTP (X,XFIT,SFIT,NOP(IOP),MOP)
|
|
SIGM = 1.D-18*EXP(E10*SIGM)
|
|
TOPBAS=SIGM
|
|
GO TO 10
|
|
END IF
|
|
END DO
|
|
10 RETURN
|
|
C Level is not found ,or no data for this level, in RBF.DAT
|
|
20 WRITE (61,100) TYPLV
|
|
100 FORMAT ('SIGMA.......: OP DATA NOT AVAILABLE FOR LEVEL ',A10)
|
|
RETURN
|
|
END
|
|
C
|
|
|
|
C ******************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE OPDATA
|
|
C =================
|
|
C
|
|
C Procedure reads photo-ionization cross sections fit coefficients
|
|
C based on Opacity-Project (OP) data from file RBF.DAT
|
|
C Data, as stored, requires linear interpolation.
|
|
C
|
|
C Meaning of global variables:
|
|
C NTOTOP = total number of levels in Opacity Project data
|
|
C IDLVOP() = level identifyer of current level
|
|
C NOP() = number of fit points for current level
|
|
C XOP(,) = x = alog10(nu/nu0) of fit point
|
|
C SOP(,) = sigma = alog10(sigma/10^-18) of fit point
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
PARAMETER (MMAXOP = 200,! maximum number of levels in OP data
|
|
+ MOP = 15 )! maximum number of fit points per level
|
|
CHARACTER*10 IDLVOP(MMAXOP) ! level identifyer Opacity-Project data
|
|
LOGICAL*2 LOPREA
|
|
COMMON /TOPB/ SOP(MOP,MMAXOP) ,! sigma = alog10(sigma/10^-18) of fit point
|
|
+ XOP(MOP,MMAXOP) ,! x = alog10(nu/nu0) of fit point
|
|
+ NOP(MMAXOP) ,! number of fit points for current level
|
|
+ NTOTOP ,! total number of levels in OP data
|
|
+ IDLVOP ,! level identifyer Opacity-Project data
|
|
+ LOPREA ! .T. OP data read in; .F. OP data not yer read in
|
|
CHARACTER*4 IONID
|
|
C
|
|
OPEN (UNIT=40,FILE='RBF.DAT',STATUS='OLD')
|
|
C Skip header
|
|
DO IREAD = 1, 21
|
|
READ (40,*)
|
|
END DO
|
|
IOP = 0
|
|
C = initialize sequential level index op Opacity Project data
|
|
C Read number of elements in file
|
|
READ (40,*) NEOP
|
|
DO IEOP = 1, NEOP
|
|
C Skip element name header
|
|
DO IREAD = 1, 3
|
|
READ (40,*)
|
|
END DO
|
|
C Read number of ionization stages of current element in file
|
|
READ (40,*) NIOP
|
|
DO IIOP = 1, NIOP
|
|
C Read ion identifyer, atomic & electron number, # of levels
|
|
C for current ion
|
|
READ (40,*) IONID, IATOM_OP, IELEC_OP, NLEVEL_OP
|
|
DO ILOP = 1, NLEVEL_OP
|
|
C Increase sequential level index of Opacity Project data
|
|
IOP = IOP+1
|
|
C Read level identifyer and number of sigma fit points
|
|
READ (40,*) IDLVOP(IOP), NOP(IOP)
|
|
C Read normalized log10 frequency and log10 cross section values
|
|
DO IS = 1, NOP(IOP)
|
|
READ (40,*) INDEX, XOP(IS,IOP), SOP(IS,IOP)
|
|
END DO
|
|
END DO
|
|
END DO
|
|
END DO
|
|
NTOTOP = IOP
|
|
C = total number of levels in Opacity Project data
|
|
LOPREA = .TRUE.
|
|
C = set flag as data has been read in
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C
|
|
C ******************************************************************
|
|
C
|
|
C
|
|
FUNCTION YLINTP (XINT,X,Y,N,NTOT)
|
|
C =================================
|
|
C
|
|
C linear interpolation routine. Determines YINT = Y(XINT) from
|
|
C grid Y(X) with N points and dimension NTOT.
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
DIMENSION X(NTOT),Y(NTOT)
|
|
C
|
|
C bisection (see Numerical Recipes par 3.4 page 90)
|
|
JL = 0
|
|
JU = N+1
|
|
10 IF (JU-JL.GT.1) THEN
|
|
JM = (JU+JL)/2
|
|
IF ((X(N).GT.X(1)).EQV.(XINT.GT.X(JM))) THEN
|
|
JL = JM
|
|
ELSE
|
|
JU = JM
|
|
END IF
|
|
GO TO 10
|
|
END IF
|
|
J = JL
|
|
IF (J.EQ.N) J = J-1
|
|
IF (J.EQ.0) J = J+1
|
|
CM42 version: enable extrapolation
|
|
C
|
|
RC = (Y(J+1)-Y(J))/(X(J+1)-X(J))
|
|
YLINTP = RC*(XINT-X(J))+Y(J)
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE GFREE0(ID)
|
|
C =====================
|
|
C
|
|
C depth-dependent quantities for the hydrogenic free-free Gaunt factor
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (THET0=5.0404D3,
|
|
* THET1=UN/THET0,
|
|
* A0=1.0823d0,
|
|
* B0=2.98D-2,
|
|
* C0=6.70D-3,
|
|
* D0=1.12D-2,
|
|
* A1=3.9999187d-3,
|
|
* B1=-7.8622889d-5,
|
|
* C1=1.070192d0,
|
|
* A2=6.4628601d-2,
|
|
* B2=-6.1953813d-4,
|
|
* C2=2.6061249d-1,
|
|
* A3=3.7542343d-2,
|
|
* B3=1.3983474d-5,
|
|
* C3=5.7917786d-1,
|
|
* A4=3.4169006d-1,
|
|
* B4=1.1852264d-2,
|
|
* XMIN=0.2D0,
|
|
* XMINI=UN/XMIN,
|
|
* THMIN=4.0D-2)
|
|
C
|
|
T=TEMP(ID)
|
|
THET=UN/MAX(THET0/T,THMIN)
|
|
GF0(ID)=(A0+B0*THET)
|
|
GF1(ID)=(A1+B1*THET)*THET+C1
|
|
GF2(ID)=(A2+B2*THET)*THET+C2
|
|
GF3(ID)=(A3+B3*THET)*THET+C3
|
|
GF4(ID)=A4+B4*THET
|
|
GF5(ID)=C0+D0*THET
|
|
GF6(ID)=GF0(ID)+GF5(ID)*XMINI
|
|
C
|
|
C auxiliary quantities for derivatives
|
|
C
|
|
THT=THET0/T
|
|
IF(THT.GE.THMIN) THEN
|
|
THET=THT
|
|
GF0D(ID)=B0*THET1
|
|
GF1D(ID)=(A1+B1*THET*TWO)*THET1
|
|
GF2D(ID)=(A2+B2*THET*TWO)*THET1
|
|
GF3D(ID)=(A3+B3*THET*TWO)*THET1
|
|
GF4D(ID)=B4*THET1
|
|
GF5D(ID)=D0*THET1
|
|
GF6D(ID)=GF0D(ID)+GF5D(ID)*XMINI
|
|
ELSE
|
|
GF0D(ID)=0.
|
|
GF1D(ID)=0.
|
|
GF2D(ID)=0.
|
|
GF3D(ID)=0.
|
|
GF4D(ID)=0.
|
|
GF5D(ID)=0.
|
|
GF6D(ID)=0.
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION GFREE1(ID,X)
|
|
C =====================
|
|
C
|
|
C Hydrogenic free-free Gaunt factor, for depth ID,
|
|
C frequency FR, and charge CH
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (XMIN=0.2D0,
|
|
* XMINI=UN/XMIN)
|
|
C
|
|
IF(X.LT.UN) THEN
|
|
GFREE1=((GF4(ID)*X-GF3(ID))*X+GF2(ID))*X+GF1(ID)
|
|
ELSE IF(X.LT.XMINI) THEN
|
|
GFREE1=GF0(ID)+GF5(ID)*X
|
|
ELSE
|
|
GFREE1=GF6(ID)
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE GFREED(ID,FR,CH,GFR,GFRD)
|
|
C ====================================
|
|
C
|
|
C Hydrogenic free-free Gaunt factor (GFR) and its derivative (GFRD)
|
|
C for depth ID, frequency FR, and charge CH
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (C14=2.997925D14,
|
|
* XMIN=0.2D0,
|
|
* XMINI=UN/XMIN)
|
|
C
|
|
X=C14*CH/FR
|
|
IF(X.LT.UN) THEN
|
|
GFR=((GF4(ID)*X-GF3(ID))*X+GF2(ID))*X+GF1(ID)
|
|
GFRD=((GF4D(ID)*X-GF3D(ID))*X+GF2D(ID))*X+GF1D(ID)
|
|
ELSE IF(X.LT.XMINI) THEN
|
|
GFR=GF0(ID)+GF5(ID)*X
|
|
GFRD=GF0D(ID)+GF5D(ID)*X
|
|
ELSE
|
|
GFR=GF6(ID)
|
|
GFRD=GF6D(ID)
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION FFCROS(IEL,IFR,T,FR)
|
|
C ==================================
|
|
C
|
|
C Non-standard evaluation of free-free cross section;
|
|
C a user supplied procedure
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
FFCROS=0.
|
|
if(iel.eq.0.or.ifr.eq.0) return
|
|
t1=t
|
|
fr1=fr
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION SBFHMI_old(FR)
|
|
C ===================
|
|
C
|
|
C Bound-free cross-section for H- (negative hydrogen ion)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
PARAMETER (UN=1.D0)
|
|
SBFHMI_old=0.
|
|
FR0=1.8259D14
|
|
IF(FR.LT.FR0) RETURN
|
|
IF(FR.LT.2.111D14) GO TO 10
|
|
X=2.997925D15/FR
|
|
SBFHMI=(6.80133D-3+X*(1.78708D-1+X*(1.6479D-1+X*(-2.04842D-2+X*
|
|
* 5.95244D-4))))*1.D-17
|
|
SBFHMI_old=sbfhmi
|
|
RETURN
|
|
10 X=2.997925D15*(UN/FR0-UN/FR)
|
|
SBFHMI=(2.69818D-1+X*(2.2019D-1+X*(-4.11288D-2+X*2.73236D-3)))
|
|
1 *X*1.D-17
|
|
SBFHMI_old=sbfhmi
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
FUNCTION SBFHMI(FR)
|
|
C ===================
|
|
C
|
|
C Bound-free cross-section for H- (negative hydrogen ion)
|
|
C Taken from Kurucz ATLAS9
|
|
C
|
|
C FROM MATHISEN (1984), AFTER WISHART(1979) AND BROAD AND REINHARDT (1976)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
DIMENSION WBF(85),BF(85)
|
|
DATA WBF/ 18.00, 19.60, 21.40, 23.60, 26.40, 29.80, 34.30,
|
|
1 40.40, 49.10, 62.60, 111.30, 112.10, 112.67, 112.95, 113.05,
|
|
2 113.10, 113.20, 113.23, 113.50, 114.40, 121.00, 139.00, 164.00,
|
|
3 175.00, 200.00, 225.00, 250.00, 275.00, 300.00, 325.00, 350.00,
|
|
4 375.00, 400.00, 425.00, 450.00, 475.00, 500.00, 525.00, 550.00,
|
|
5 575.00, 600.00, 625.00, 650.00, 675.00, 700.00, 725.00, 750.00,
|
|
6 775.00, 800.00, 825.00, 850.00, 875.00, 900.00, 925.00, 950.00,
|
|
7 975.00,1000.00,1025.00,1050.00,1075.00,1100.00,1125.00,1150.00,
|
|
8 1175.00,1200.00,1225.00,1250.00,1275.00,1300.00,1325.00,1350.00,
|
|
9 1375.00,1400.00,1425.00,1450.00,1475.00,1500.00,1525.00,1550.00,
|
|
A 1575.00,1600.00,1610.00,1620.00,1630.00,1643.91/
|
|
DATA BF/ 0.067, 0.088, 0.117, 0.155, 0.206, 0.283, 0.414,
|
|
1 0.703, 1.24, 2.33, 11.60, 13.90, 24.30, 66.70, 95.00,
|
|
2 56.60, 20.00, 14.60, 8.50, 7.10, 5.43, 5.91, 7.29,
|
|
3 7.918, 9.453, 11.08, 12.75, 14.46, 16.19, 17.92, 19.65,
|
|
4 21.35, 23.02, 24.65, 26.24, 27.77, 29.23, 30.62, 31.94,
|
|
5 33.17, 34.32, 35.37, 36.32, 37.17, 37.91, 38.54, 39.07,
|
|
6 39.48, 39.77, 39.95, 40.01, 39.95, 39.77, 39.48, 39.06,
|
|
7 38.53, 37.89, 37.13, 36.25, 35.28, 34.19, 33.01, 31.72,
|
|
8 30.34, 28.87, 27.33, 25.71, 24.02, 22.26, 20.46, 18.62,
|
|
9 16.74, 14.85, 12.95, 11.07, 9.211, 7.407, 5.677, 4.052,
|
|
A 2.575, 1.302, 0.8697, 0.4974, 0.1989, 0. /
|
|
C Bell and Berrington J.Phys.B,vol. 20, 801-806,1987.
|
|
c
|
|
HMINBF=0.
|
|
IF(FR.GT.1.82365E14) THEN
|
|
WAVE=2.99792458E17/FR
|
|
HMINBF=YLINTP(WAVE,WBF,BF,85,85)*1.E-18
|
|
END IF
|
|
SBFHMI=HMINBF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION SFFHMI(POPI,FR,T)
|
|
C ==========================
|
|
C
|
|
C Free-free cross-section for H- (negative hydrogen ion)
|
|
C Taken from Kurucz ATLAS9
|
|
C
|
|
C From Bell and Berrington J.Phys.B,vol. 20, 801-806,1987.
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
PARAMETER (CONFF=5040.*1.380658E-16, CONTH=5040.)
|
|
PARAMETER (HK = 4.79928144D-11)
|
|
DIMENSION FFLOG(22,11),FFCS(11,22),FFLOG2(22)
|
|
DIMENSION FFBEG(11,11),FFEND(11,11),FFTT(11),WFFLOG(22)
|
|
DIMENSION THETAFF(11),WAVEK(22)
|
|
EQUIVALENCE (FFCS(1,1),FFBEG(1,1)),(FFCS(1,12),FFEND(1,1))
|
|
C
|
|
DATA WAVEK/.50,.40,.35,.30,.25,.20,.18,.16,.14,.12,.10,.09,.08,
|
|
1 .07,.06,.05,.04,.03,.02,.01,.008,.006/
|
|
DATA THETAFF/
|
|
1 0.5, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.8, 3.6/
|
|
DATA FFBEG/
|
|
1.0178,.0222,.0308,.0402,.0498,.0596,.0695,.0795,.0896, .131, .172,
|
|
2.0228,.0280,.0388,.0499,.0614,.0732,.0851,.0972, .110, .160, .211,
|
|
3.0277,.0342,.0476,.0615,.0760,.0908, .105, .121, .136, .199, .262,
|
|
4.0364,.0447,.0616,.0789,.0966, .114, .132, .150, .169, .243, .318,
|
|
5.0520,.0633,.0859, .108, .131, .154, .178, .201, .225, .321, .418,
|
|
6.0791,.0959, .129, .161, .194, .227, .260, .293, .327, .463, .602,
|
|
7.0965, .117, .157, .195, .234, .272, .311, .351, .390, .549, .711,
|
|
8 .121, .146, .195, .241, .288, .334, .381, .428, .475, .667, .861,
|
|
9 .154, .188, .249, .309, .367, .424, .482, .539, .597, .830, 1.07,
|
|
A .208, .250, .332, .409, .484, .557, .630, .702, .774, 1.06, 1.36,
|
|
B .293, .354, .468, .576, .677, .777, .874, .969, 1.06, 1.45, 1.83/
|
|
DATA FFEND/
|
|
1 .358, .432, .572, .702, .825, .943, 1.06, 1.17, 1.28, 1.73, 2.17,
|
|
2 .448, .539, .711, .871, 1.02, 1.16, 1.29, 1.43, 1.57, 2.09, 2.60,
|
|
3 .579, .699, .924, 1.13, 1.33, 1.51, 1.69, 1.86, 2.02, 2.67, 3.31,
|
|
4 .781, .940, 1.24, 1.52, 1.78, 2.02, 2.26, 2.48, 2.69, 3.52, 4.31,
|
|
5 1.11, 1.34, 1.77, 2.17, 2.53, 2.87, 3.20, 3.51, 3.80, 4.92, 5.97,
|
|
6 1.73, 2.08, 2.74, 3.37, 3.90, 4.50, 5.01, 5.50, 5.95, 7.59, 9.06,
|
|
7 3.04, 3.65, 4.80, 5.86, 6.86, 7.79, 8.67, 9.50, 10.3, 13.2, 15.6,
|
|
8 6.79, 8.16, 10.7, 13.1, 15.3, 17.4, 19.4, 21.2, 23.0, 29.5, 35.0,
|
|
9 27.0, 32.4, 42.6, 51.9, 60.7, 68.9, 76.8, 84.2, 91.4, 117., 140.,
|
|
A 42.3, 50.6, 66.4, 80.8, 94.5, 107., 120., 131., 142., 183., 219.,
|
|
B 75.1, 90.0, 118., 144., 168., 191., 212., 234., 253., 325., 388./
|
|
DATA ISTART/0/
|
|
C
|
|
IF(ISTART.EQ.0) THEN
|
|
ISTART=1
|
|
DO IWAVE=1,22
|
|
WFFLOG(IWAVE)=LOG(91.134D0/WAVEK(IWAVE))
|
|
DO ITHETA=1,11
|
|
FFLOG(IWAVE,ITHETA)=LOG(FFCS(ITHETA,IWAVE)*1.E-26)
|
|
END DO
|
|
END DO
|
|
ENDIF
|
|
C
|
|
WAVE=2.99792458E17/FR
|
|
WAVELOG=LOG(WAVE)
|
|
C
|
|
DO ITHETA=1,11
|
|
DO IWAVE=1,22
|
|
FFLOG2(IWAVE)=FFLOG(IWAVE,ITHETA)
|
|
END DO
|
|
FFTLOG=YLINTP(WAVELOG,WFFLOG,FFLOG2,22,22)
|
|
FFTT(ITHETA)=EXP(FFTLOG)/THETAFF(ITHETA)*CONFF
|
|
END DO
|
|
c
|
|
THETA=CONTH/T
|
|
FFTH=YLINTP(THETA,THETAFF,FFTT,11,11)
|
|
SFFHMI=FFTH*POPI/(1.-exp(-hk*fr/t))
|
|
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE COLIS(ID,T,COL,CLOC)
|
|
C ===============================
|
|
C
|
|
C Driving procedure for evaluation of the collisional rates
|
|
C
|
|
C Input: T - temperature
|
|
C Output: COL - array of quantities proportional to the
|
|
C collisional rates in all transitions
|
|
C for a given temperature (ie. at a given depth)
|
|
C Precisely, COL(IT)*Nlow(IT) is the UPWARD
|
|
C collisional rate of the transition IT
|
|
C Output: CLOC - array of quantities proportional to the
|
|
C collisional rates in all transitions
|
|
C for a given temperature (ie. at a given depth)
|
|
C Precisely, CLOC(IT)*Nupp(IT) is the DOWNWARD
|
|
C collisional rate of the transition IT
|
|
C
|
|
C Procedure COLIS calls procedures COLH and COLHE for evaluating
|
|
C the collisional rates in hydrogen and helium,
|
|
C and itself evaluates collisional rates for other species
|
|
C
|
|
C Evaluation is controlled by input parameter ICOL(ITR).
|
|
C Meaning of ICOL for all species, excluding hydrogen and helium:
|
|
C
|
|
C a) for ionization
|
|
C ICOL = 0 - Seatons formula ; here the value of the photo-
|
|
C ionization cross section at the threshold is
|
|
C transmitted in array OSC0
|
|
C = 1 - Allen's formula; again, OSC0 has the meaning of
|
|
C the necessary multiplicative parameter
|
|
C = 2 - the so-called SIMPLE1 mode - see below
|
|
C = 3 - the so-called SIMPLE2 mode - see below
|
|
C b) for excitation
|
|
C ICOL = 0 - Van Regemorter formula, with standard g(bar)=0.25
|
|
C = 1 - Van Regemorter formula, with "exact" g(bar)
|
|
C = 2 - the so-called SIMPLE1 mode - see below
|
|
C = 3 - the so-called SIMPLE2 mode - see below
|
|
C = 4 - Eissner-Seaton formula - see below
|
|
C
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
PARAMETER (EXPIA1=-0.57721566,EXPIA2=0.99999193,
|
|
* EXPIA3=-0.24991055,EXPIA4=0.05519968,
|
|
* EXPIA5=-0.00976004,EXPIA6=0.00107857,
|
|
* EXPIB1=0.2677734343,EXPIB2=8.6347608925,
|
|
* EXPIB3=18.059016973,EXPIB4=8.5733287401,
|
|
* EXPIC1=3.9584969228,EXPIC2=21.0996530827,
|
|
* EXPIC3=25.6329561486,EXPIC4=9.5733223454)
|
|
DIMENSION COL(MTRANS),TYPEARR(MXTCOL),CCRATE(MCFIT),
|
|
* CCTEMP(MCFIT),CLOC(MTRANS)
|
|
C
|
|
COMMON/CTRTEMP/ te
|
|
C
|
|
CREGER(X,U,A,GG)=19.7363*X*EXP(-U)/U*GG*A
|
|
CSEATN(X,U,A)=1.55D13*X/ABS(U)*EXP(-U)*A
|
|
CALLEN(X,U,A)=X*A*EXP(-U)/U/U
|
|
CSMPL1(X,U,A)=5.465D-11*X*EXP(-U)*A
|
|
CSMPL2(X,U,A)=5.465D-11*X*EXP(-U)*A*(1.+U)
|
|
CUPSX(X,U,A)=8.631D-6/X*EXP(-U)*A
|
|
C
|
|
DO I=1,NTRANS
|
|
CLOC(I)=0.
|
|
COL(I)=0.
|
|
END DO
|
|
C
|
|
C calculate collider's populations: e, p, H(1s)
|
|
C ANE : Electron
|
|
C ANP : Proton
|
|
C ANHM: H-
|
|
C ANH : H(1s)
|
|
|
|
ANE=ELEC(ID)
|
|
c
|
|
IF (IELH.gt.0) THEN ! if H is an explicit atom
|
|
ANP=POPUL(NNEXT(IELH),ID) ! Protons
|
|
ANH=POPUL(NFIRST(IELH),ID) ! H(1s)
|
|
else
|
|
anh=ahtot-anp
|
|
ENDIF
|
|
IF (IELHM.gt.0) THEN
|
|
ANHM=POPUL(NFIRST(IELHM),ID) ! if H- is an explicit atom
|
|
else
|
|
anhm=1.0353e-16/t/sqrt(t)*exp(8762.9/t)*anh*ane
|
|
ENDIF
|
|
C
|
|
HKT=HK/T
|
|
SRT=SQRT(T)
|
|
T32=UN/T/SRT
|
|
TK=HKT/H
|
|
CSTD=0.25
|
|
T0=TEFF
|
|
if(t0.gt.0.) then
|
|
TT0=UN-T/T0
|
|
SRT0=SQRT(T0)/SRT
|
|
end if
|
|
C
|
|
C Call procedures COLH and COLHE for hydrogen and helium
|
|
C
|
|
IF(IATH.NE.0) CALL COLH(ID,T,COL)
|
|
IF(IATHE.NE.0) CALL COLHE(T,COL)
|
|
IF(IATH.NE.0.OR.IATHE.NE.0) THEN
|
|
DO I=1, NTRANS
|
|
COL(I)=COL(I) * ANE
|
|
IF (LINE(I)) THEN
|
|
CLOC(I)=COL(I) * EXP(FR0(I)*HKT)*G(ILOW(I))/G(IUP(I))
|
|
ELSE
|
|
CORR=UN
|
|
NKE=NNEXT(IEL(ILOW(I)))
|
|
IF(NKE.NE.IUP(I)) CORR=G(NKE)/G(IUP(I))*
|
|
* EXP((ENION(NKE)-ENION(IUP(I)))*TK)
|
|
CLOC(I)=COL(I) * ANE * SBF(ILOW(I))*CORR
|
|
ENDIF
|
|
ENDDO
|
|
ENDIF
|
|
C
|
|
C Loop over all explicit species, excluding hydrogen and helium
|
|
C
|
|
DO 100 IAT=1,NATOM
|
|
IF(IAT.EQ.IATH.OR.IAT.EQ.IATHE) GO TO 100
|
|
N0I=N0A(IAT)
|
|
NKI=NKA(IAT)
|
|
DO 50 I=N0I,NKI-1
|
|
IE=IEL(I)
|
|
DO 40 J=I+1,NKI
|
|
IT=ITRA(I,J)
|
|
IF(IT.EQ.0) GO TO 40
|
|
IC=ICOL(IT)
|
|
COL(IT)=0.0
|
|
CLOC(IT)=0.0
|
|
C1=OSC0(IT)
|
|
C2=CPAR(IT)
|
|
U0=FR0(IT)*HKT
|
|
U0HM=U0-8752.072/T ! including H-minus potential !
|
|
U0P =U0-157821.5/T ! including H-proton potential!
|
|
DO K=1, MXTCOL
|
|
TYPEARR(K)=0
|
|
ENDDO
|
|
IF(LINE(IT)) GO TO 30
|
|
C
|
|
C the detailed balancing factor for an inverse process
|
|
C
|
|
CORR=UN
|
|
NKE=NNEXT(IEL(I))
|
|
IF(NKE.NE.J) CORR=G(NKE)/G(J)*
|
|
* EXP((ENION(NKE)-ENION(J))*TK)
|
|
CINV=ANE*SBF(I)*CORR
|
|
C
|
|
C *********** tabulated data ***************
|
|
C For collisional processes that change the total
|
|
C charge of the target atom, there are three
|
|
C processes considered here:
|
|
C - TYPE 1 Electron Collisional ionization
|
|
C - TYPE 2 Charge exchange with protons
|
|
C - TYPE 3 Charge exchange with hydrogen
|
|
C
|
|
C There are several 'calculated' options in the code for
|
|
C electron collisional excitation that are
|
|
C neglected if TYPE 1 tabulated data are present.
|
|
C
|
|
C There is also an option for TYPE 2 that is calculated
|
|
C here (ICOL ge 10) that is also overriden if TYPE 2 is
|
|
C present.
|
|
IF (IC.GE.1000) THEN
|
|
IORICE=1
|
|
IF (IC.LT.0) IORICE=-1
|
|
IC=ABS(IC)
|
|
ITYPE=IC/1000
|
|
IC=IORICE*(MOD(IC,1000)-1) !ICOL RECOVERED
|
|
DO K=1, MXTCOL
|
|
TYPEARR(K)=MOD(ITYPE/(2**(K-1)),2)
|
|
ENDDO
|
|
C
|
|
C ****** START 'GENCOL' FOR IONIZATION **********
|
|
C
|
|
C ****** ELECTRON COLLISIONAL IONIZATION *****
|
|
IF (TYPEARR(1).EQ.1) THEN
|
|
NX=0
|
|
DO K=1,MCFIT
|
|
IF (CTEMP(1,K,IT).NE.0) THEN
|
|
CCRATE(K)=log(CRATE(1,K,IT))
|
|
CCTEMP(K)=CTEMP(1,k,IT)
|
|
NX=NX+1
|
|
ELSE ! CLEAN CC**** ARRAYS
|
|
CCRATE(K)=0.
|
|
CCTEMP(K)=0.
|
|
ENDIF
|
|
ENDDO
|
|
cs=ylintp(t,cctemp,ccrate,nx,mcfit)
|
|
CS=ANE*exp(CS)
|
|
COL(IT)=COL(IT) + CS !UPPWARD
|
|
CLOC(IT)=CLOC(IT) + CS*CINV !DOWNWARD
|
|
ENDIF
|
|
C ****** CHARGE EXCHANGE WITH PROTONS *******
|
|
IF (TYPEARR(2).EQ.1) THEN
|
|
NX=0
|
|
DO K=1,MCFIT
|
|
IF (CTEMP(2,K,IT).NE.0) THEN
|
|
CCRATE(K)=log(CRATE(2,K,IT))
|
|
CCTEMP(K)=CTEMP(2,K,IT)
|
|
NX=NX+1
|
|
ELSE ! CLEAN CC**** ARRAYS
|
|
CCRATE(K)=0.
|
|
CCTEMP(K)=0.
|
|
ENDIF
|
|
ENDDO
|
|
cs=ylintp(t,cctemp,ccrate,nx,mcfit)
|
|
cs=exp(cs)*ANP
|
|
COL(IT)=COL(IT) + CS ! UPPWARD
|
|
CINH=G(I)/G(J)*0.5*EXP(U0P)
|
|
CLOC(IT)=CLOC(IT) + CS*CINH*ANH !DOWNWARD
|
|
ENDIF
|
|
C ******* CHARGE EXCHANGE WITH HYDROGEN *****
|
|
IF (TYPEARR(3).EQ.1) THEN
|
|
NX=0
|
|
DO K=1,MCFIT
|
|
IF (CTEMP(3,K,IT).NE.0) THEN
|
|
CCRATE(K)=log(CRATE(3,K,IT))
|
|
CCTEMP(K)=CTEMP(3,K,IT)
|
|
NX=NX+1
|
|
ELSE ! CLEAN CC**** ARRAYS
|
|
CCRATE(K)=0.
|
|
CCTEMP(K)=0.
|
|
ENDIF
|
|
ENDDO
|
|
cs=ylintp(t,cctemp,ccrate,nx,mcfit)
|
|
cs=exp(cs)*ANH
|
|
COL(IT)=COL(IT) + CS ! UPPWARD
|
|
CINH=G(I)/G(J)*TWO*EXP(U0HM)
|
|
CLOC(IT)=CLOC(IT) + CS*CINH*ANHM !DOWNWARD
|
|
ENDIF
|
|
C ************** END GENCOL ******************
|
|
IF (IC.EQ.-1) GO TO 40
|
|
ENDIF
|
|
C
|
|
C ********* Charge transfer with protons reactions- an old scheme
|
|
C
|
|
IF(IC.GE.10) THEN
|
|
IF(TYPEARR(2).NE.1) THEN
|
|
C radiative charge transfer ionization of neutrals in the
|
|
C grround state with protons
|
|
te=T
|
|
CS=HCTIon(1,NUMAT(IAT))
|
|
CS=CS*ANP
|
|
COL(IT)=COL(IT) + CS !UPPWARD
|
|
CS=CS*0.5*G(I)/G(J) * EXP(U0P)
|
|
CLOC(IT)=CLOC(IT) + CS*ANH !DOWNWARD
|
|
ENDIF
|
|
IC=IC-10
|
|
IF(TYPEARR(1).eq.1) GO TO 40
|
|
ENDIF
|
|
|
|
C
|
|
C ********* Electron collisional ionization
|
|
C
|
|
IF(IC.EQ.0) THEN
|
|
CS=CSEATN(UN/SRT,U0,C1)*ANE
|
|
COL(IT)=COL(IT)+CS
|
|
ELSE IF(IC.EQ.1) THEN
|
|
CS=CALLEN(T32,U0,C1)*ANE
|
|
COL(IT)=COL(IT)+CS
|
|
ELSE IF(IC.EQ.2) THEN
|
|
CS=CSMPL1(SRT,U0,C1)*ANE
|
|
COL(IT)=COL(IT)+CS
|
|
ELSE IF(IC.EQ.3) THEN
|
|
CS=CSMPL2(SRT,U0,C1)*ANE
|
|
COL(IT)=COL(IT)+CS
|
|
ELSE IF(IC.EQ.4) THEN
|
|
ia=numat(iatm(i))
|
|
CS=cion(ia,iz(iel(i)),enion(i)*6.24298e11,t)*ANE
|
|
COL(IT)=COL(IT)+CS
|
|
ELSE IF(IC.EQ.5) THEN
|
|
ia=numat(iatm(i))
|
|
izc=iz(ie)
|
|
rno=16.
|
|
ii=i-nfirst(ie)+1
|
|
call irc(ii,t,izc,rno,cs)
|
|
CS=CS*ANE
|
|
col(it)=COL(IT)+CS
|
|
ELSE IF(IC.LT.0) THEN
|
|
CALL CSPEC(I,J,IC,C1,C2,U0,T,CS)
|
|
CS=CS*ANE
|
|
COL(IT)=COL(IT)+CS
|
|
END IF
|
|
CLOC(IT)=CLOC(IT)+CS*CINV !DOWNWARD
|
|
if(ic.eq.4) go to 40
|
|
C
|
|
C collisional excitations from level I to higher, non-explicit
|
|
C levels are lumped into the collisional ionization rate
|
|
C (the so-called modified collision ionization rate)
|
|
C
|
|
N0Q=NQUANT(NLAST(IE))+1
|
|
N1Q=ICUP(IE)
|
|
IF(N1Q.EQ.0) GO TO 40
|
|
IQ=NQUANT(I)
|
|
REL=G(I)/2./IQ/IQ
|
|
DO 20 JQ=N0Q,N1Q
|
|
XJ=JQ
|
|
U0=(ENION(I)-EH/XJ/XJ)*TK
|
|
IF(JQ.LE.20) CC1=OSH(IQ,JQ)*REL
|
|
IF(JQ.GT.20) CC1=OSH(IQ,20)*(20./XJ)**3*REL
|
|
GG=CSTD
|
|
if(u0.gt.35.) go to 20
|
|
IF(U0.LE.UN) THEN
|
|
EXPIU0=-LOG(U0)+EXPIA1+U0*(EXPIA2+
|
|
* U0*(EXPIA3+U0*(EXPIA4+
|
|
* U0*(EXPIA5+U0*EXPIA6))))
|
|
ELSE
|
|
EXPIU0=EXP(-U0)*((EXPIB1+U0*(EXPIB2+
|
|
* U0*(EXPIB3+
|
|
* U0*(EXPIB4+U0))))/(EXPIC1+U0*(EXPIC2+
|
|
* U0*(EXPIC3+U0*(EXPIC4+U0)))))/U0
|
|
END IF
|
|
GG0=0.276*EXP(U0)*EXPIU0
|
|
IF(GG0.GT.GG) GG=GG0
|
|
CS=CREGER(T32,U0,CC1,GG)*ANE
|
|
COL(IT)=COL(IT)+CS !UPPWARD
|
|
CLOC(IT)=CLOC(IT)+CS*ANE*SBF(I)*WOP(I,ID)*CORR !DOWNWARD
|
|
20 CONTINUE
|
|
GO TO 40
|
|
C
|
|
C ********* Collisional excitation
|
|
C
|
|
30 CONTINUE
|
|
C
|
|
C the detailed balancing factor for an inverse process
|
|
C
|
|
CINV=EXP(U0)*G(I)/G(J)
|
|
C
|
|
c ********** Tabulated Data
|
|
IF (IC.GE.1000) THEN
|
|
IORICE=1
|
|
IF (IC.LT.0) IORICE=-1
|
|
IC=ABS(IC)
|
|
ITYPE=IC/1000
|
|
IC=IORICE*(MOD(IC,1000)-1) !ICOL RECOVERED
|
|
DO K=1, MXTCOL
|
|
TYPEARR(K)=MOD(ITYPE/(2**(K-1)),2)
|
|
END DO
|
|
|
|
|
|
C ****** START 'GENCOL' FOR EXCITATION **********
|
|
C
|
|
C ****** ELECTRON COLLISIONAL EXCITATION *****
|
|
IF (TYPEARR(1).EQ.1) THEN
|
|
NX=0
|
|
DO K=1,MCFIT
|
|
IF (CTEMP(1,K,IT).NE.0) THEN
|
|
CCRATE(K)=log(CRATE(1,K,IT))
|
|
CCTEMP(K)=CTEMP(1,K,IT)
|
|
NX=NX+1
|
|
ELSE !CLEAN CC**** ARRAYS
|
|
CCRATE(K)=0.
|
|
CCTEMP(K)=0.
|
|
ENDIF
|
|
END DO
|
|
cs=ylintp(t,cctemp,ccrate,nx,mcfit)
|
|
CS=exp(CS)*ANE
|
|
COL(IT)=COL(IT) + CS ! UPPWARD
|
|
CLOC(IT)=CLOC(IT) + CS*CINV ! DOWNWARD
|
|
END IF
|
|
C ****** PROTON COLLISIONAL EXCITATION *******
|
|
IF (TYPEARR(2).EQ.1) THEN
|
|
NX=0
|
|
DO K=1,MCFIT
|
|
IF (CTEMP(2,K,IT).NE.0) THEN
|
|
CCRATE(K)=log(CRATE(2,K,IT))
|
|
CCTEMP(K)=CTEMP(2,K,IT)
|
|
NX=NX+1
|
|
ELSE !CLEAN CC**** ARRAYS
|
|
CCRATE(K)=0.
|
|
CCTEMP(K)=0.
|
|
ENDIF
|
|
END DO
|
|
cs=ylintp(t,cctemp,ccrate,nx,mcfit)
|
|
CS=exp(CS)*ANP
|
|
COL(IT)=COL(IT) + CS ! UPPWARD
|
|
CLOC(IT)=CLOC(IT) + CS*CINV ! DOWNWARD
|
|
END IF
|
|
C ******* HYDROGEN COLLISIONAL EXCITATION *****
|
|
IF (TYPEARR(3).EQ.1) THEN
|
|
NX=0
|
|
DO K=1,MCFIT
|
|
IF (CTEMP(3,K,IT).NE.0) THEN
|
|
CCRATE(K)=log(CRATE(3,K,IT))
|
|
CCTEMP(K)=CTEMP(3,K,IT)
|
|
NX=NX+1
|
|
ELSE !CLEAN CC**** ARRAYS
|
|
CCRATE(K)=0.
|
|
CCTEMP(K)=0.
|
|
ENDIF
|
|
END DO
|
|
cs=ylintp(t,cctemp,ccrate,nx,mcfit)
|
|
CS=exp(CS)*ANH
|
|
COL(IT)=COL(IT) + CS ! UPPWARD
|
|
CLOC(IT)=CLOC(IT) + CS*CINV ! DOWNWARD
|
|
END IF
|
|
C ************** END GENCOL ******************
|
|
IF (IC.EQ.-1) GO TO 40
|
|
END IF
|
|
IF(IC.LE.1.AND.IC.GT.0) THEN
|
|
GG=CSTD
|
|
IF(IC.EQ.1) GG=C2
|
|
IF(U0.LE.UN) THEN
|
|
EXPIU0=-LOG(U0)+EXPIA1+
|
|
* U0*(EXPIA2+U0*(EXPIA3+U0*(EXPIA4+
|
|
* U0*(EXPIA5+U0*EXPIA6))))
|
|
ELSE
|
|
EXPIU0=EXP(-U0)*((EXPIB1+U0*
|
|
* (EXPIB2+U0*(EXPIB3+
|
|
* U0*(EXPIB4+U0))))/(EXPIC1+U0*(EXPIC2+
|
|
* U0*(EXPIC3+U0*(EXPIC4+U0)))))/U0
|
|
END IF
|
|
GG0=0.276*EXP(U0)*EXPIU0
|
|
IF(GG0.GT.GG) GG=GG0
|
|
CS=CREGER(T32,U0,C1,GG)*ANE
|
|
COL(IT)=COL(IT) + CS ! UPPWARD
|
|
ELSE IF(IC.EQ.2) THEN
|
|
CS=CSMPL1(SRT,U0,C1*C2)*ANE
|
|
COL(IT)=COL(IT) + CS ! UPPWARD
|
|
ELSE IF(IC.EQ.3) THEN
|
|
CS=CSMPL2(SRT,U0,C2)*ANE
|
|
COL(IT)=COL(IT) + CS ! UPPWARD
|
|
ELSE IF(IC.EQ.4) THEN
|
|
CS=CUPSX(SRT,U0,C2/G(I))*ANE
|
|
COL(IT)=COL(IT) + CS ! UPPWARD
|
|
ELSE IF(IC.EQ.9) THEN
|
|
CS=OMECOL(I,J)*SRT0*EXP(-U0*TT0) * ANE
|
|
COL(IT)=COL(IT) + CS ! UPPWARD
|
|
ELSE IF(IC.LT.0) THEN
|
|
CALL CSPEC(I,J,IC,C1,C2,U0,T,CS)
|
|
CS=CS*ANE
|
|
COL(IT)=COL(IT) + CS ! UPPWARD
|
|
END IF
|
|
CLOC(IT)=CLOC(IT) + CS*CINV ! DOWNWARD
|
|
40 CONTINUE
|
|
50 CONTINUE
|
|
100 CONTINUE
|
|
RETURN
|
|
END
|
|
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
|
|
function HCTRecom(ion,nelem)
|
|
c ============================
|
|
c
|
|
c Code by Jim Kingdon, in collaboration with G.J. Ferland
|
|
c ion is stage of ionization, 2 for the ion going to the atom
|
|
c nelem is atomic number of element, 2 up to 30
|
|
c Example: O+ + H => O + H+ is HCTRecom(2,8)
|
|
c integer ion , nelem
|
|
INCLUDE 'IMPLIC.FOR'
|
|
common/CTRTEMP/ te
|
|
common/CTRecomb/ CTRecomb(6,4,30)
|
|
c
|
|
c local variables
|
|
* real tused
|
|
c integer ipIon
|
|
c
|
|
ipIon = ion - 1
|
|
c
|
|
if( ipIon.gt.4 ) then
|
|
c use statistical charge transfer for ion > 4
|
|
HCTRecom = 1.92e-9 * ipIon
|
|
return
|
|
endif
|
|
c
|
|
c Make sure te is between temp. boundaries; set constant outside of range
|
|
tused = max( te,CTRecomb(5,ipIon,nelem) )
|
|
tused = min( tused , CTRecomb(6,ipIon,nelem) )
|
|
tused = tused * 1e-4
|
|
c
|
|
c the interpolation equation
|
|
HCTRecom = CTRecomb(1,ipIon,nelem)* 1e-9 *
|
|
1 (tused**CTRecomb(2,ipIon,nelem)) *
|
|
2 (1. +
|
|
3 CTRecomb(3,ipIon,nelem) * exp(CTRecomb(4,ipIon,nelem)*tused) )
|
|
c
|
|
end
|
|
******************************************************************************
|
|
function HCTIon(ion,nelem)
|
|
c ion is stage of ionization, 1 for atom
|
|
c nelem is atomic number of element, 2 up to 30
|
|
c Example: O + H+ => O+ + H is HCTIon(1,8)
|
|
c integer ion , nelem
|
|
INCLUDE 'IMPLIC.FOR'
|
|
common/CTRTEMP/ te
|
|
common/CTIon/ CTIon(7,4,30)
|
|
c
|
|
c local variables
|
|
c real tused
|
|
c integer ipIon
|
|
c
|
|
ipIon = ion
|
|
c
|
|
c Make sure te is between temp. boundaries; set constant outside of range
|
|
tused = max( te,CTIon(5,ipIon,nelem) )
|
|
tused = min( tused , CTIon(6,ipIon,nelem) )
|
|
tused = tused * 1e-4
|
|
c
|
|
c the interpolation equation
|
|
HCTIon = CTIon(1,ipIon,nelem)* 1e-9 *
|
|
1 (tused**CTIon(2,ipIon,nelem)) *
|
|
2 (1. +
|
|
3 CTIon(3,ipIon,nelem) * exp(CTIon(4,ipIon,nelem)*tused) ) *
|
|
4 exp(-CTIon(7,ipIon,nelem)/tused)
|
|
c
|
|
end
|
|
|
|
********************************************************************************
|
|
block data ctdata
|
|
c
|
|
c real CTIon
|
|
c second dimension is ionization stage,
|
|
c 1=+0 for parent, etc
|
|
c third dimension is atomic number of atom
|
|
INCLUDE 'IMPLIC.FOR'
|
|
common/CTIon/ CTIon(7,4,30)
|
|
c real CTRecomb
|
|
c second dimension is ionization stage,
|
|
c 1=+1 for parent, etc
|
|
c third dimension is atomic number of atom
|
|
common/CTRecomb/ CTRecomb(6,4,30)
|
|
c
|
|
c local variables
|
|
c integer i
|
|
c
|
|
c digital form of the fits to the charge transfer
|
|
c ionization rate coefficients
|
|
c
|
|
c Note: First parameter is in units of 1e-9!
|
|
c Note: Seventh parameter is in units of 1e4 K
|
|
c ionization
|
|
data (CTIon(i,1,3),i=1,7)/2.84e-3,1.99,375.54,-54.07,1e2,1e4,0.0/
|
|
data (CTIon(i,2,3),i=1,7)/7*0./
|
|
data (CTIon(i,3,3),i=1,7)/7*0./
|
|
data (CTIon(i,1,4),i=1,7)/7*0./
|
|
data (CTIon(i,2,4),i=1,7)/7*0./
|
|
data (CTIon(i,3,4),i=1,7)/7*0./
|
|
data (CTIon(i,1,5),i=1,7)/7*0./
|
|
data (CTIon(i,2,5),i=1,7)/7*0./
|
|
data (CTIon(i,3,5),i=1,7)/7*0./
|
|
data (CTIon(i,1,6),i=1,7)/1.07e-6,3.15,176.43,-4.29,1e3,1e5,0.0/
|
|
data (CTIon(i,2,6),i=1,7)/7*0./
|
|
data (CTIon(i,3,6),i=1,7)/7*0./
|
|
data (CTIon(i,1,7),i=1,7)/4.55e-3,-0.29,-0.92,-8.38,1e2,5e4,1.086/
|
|
data (CTIon(i,2,7),i=1,7)/7*0./
|
|
data (CTIon(i,3,7),i=1,7)/7*0./
|
|
data (CTIon(i,1,8),i=1,7)/7.40e-2,0.47,24.37,-0.74,1e1,1e4,0.023/
|
|
data (CTIon(i,2,8),i=1,7)/7*0./
|
|
data (CTIon(i,3,8),i=1,7)/7*0./
|
|
data (CTIon(i,1,9),i=1,7)/7*0./
|
|
data (CTIon(i,2,9),i=1,7)/7*0./
|
|
data (CTIon(i,3,9),i=1,7)/7*0./
|
|
data (CTIon(i,1,10),i=1,7)/7*0./
|
|
data (CTIon(i,2,10),i=1,7)/7*0./
|
|
data (CTIon(i,3,10),i=1,7)/7*0./
|
|
data (CTIon(i,1,11),i=1,7)/3.34e-6,9.31,2632.31,-3.04,1e3,2e4,0.0/
|
|
data (CTIon(i,2,11),i=1,7)/7*0./
|
|
data (CTIon(i,3,11),i=1,7)/7*0./
|
|
data (CTIon(i,1,12),i=1,7)/9.76e-3,3.14,55.54,-1.12,5e3,3e4,0.0/
|
|
data (CTIon(i,2,12),i=1,7)/7.60e-5,0.00,-1.97,-4.32,1e4,3e5,1.670/
|
|
data (CTIon(i,3,12),i=1,7)/7*0./
|
|
data (CTIon(i,1,13),i=1,7)/7*0./
|
|
data (CTIon(i,2,13),i=1,7)/7*0./
|
|
data (CTIon(i,3,13),i=1,7)/7*0./
|
|
data (CTIon(i,1,14),i=1,7)/0.92,1.15,0.80,-0.24,1e3,2e5,0.0/
|
|
data (CTIon(i,2,14),i=1,7)/2.26,7.36e-2,-0.43,-0.11,2e3,1e5,
|
|
1 3.031/
|
|
data (CTIon(i,3,14),i=1,7)/7*0./
|
|
data (CTIon(i,1,15),i=1,7)/7*0./
|
|
data (CTIon(i,2,15),i=1,7)/7*0./
|
|
data (CTIon(i,3,15),i=1,7)/7*0./
|
|
data (CTIon(i,1,16),i=1,7)/1.00e-5,0.00,0.00,0.00,1e3,1e4,0.0/
|
|
data (CTIon(i,2,16),i=1,7)/7*0./
|
|
data (CTIon(i,3,16),i=1,7)/7*0./
|
|
data (CTIon(i,1,17),i=1,7)/7*0./
|
|
data (CTIon(i,2,17),i=1,7)/7*0./
|
|
data (CTIon(i,3,17),i=1,7)/7*0./
|
|
data (CTIon(i,1,18),i=1,7)/7*0./
|
|
data (CTIon(i,2,18),i=1,7)/7*0./
|
|
data (CTIon(i,3,18),i=1,7)/7*0./
|
|
data (CTIon(i,1,19),i=1,7)/7*0./
|
|
data (CTIon(i,2,19),i=1,7)/7*0./
|
|
data (CTIon(i,3,19),i=1,7)/7*0./
|
|
data (CTIon(i,1,20),i=1,7)/7*0./
|
|
data (CTIon(i,2,20),i=1,7)/7*0./
|
|
data (CTIon(i,3,20),i=1,7)/7*0./
|
|
data (CTIon(i,1,21),i=1,7)/7*0./
|
|
data (CTIon(i,2,21),i=1,7)/7*0./
|
|
data (CTIon(i,3,21),i=1,7)/7*0./
|
|
data (CTIon(i,1,22),i=1,7)/7*0./
|
|
data (CTIon(i,2,22),i=1,7)/7*0./
|
|
data (CTIon(i,3,22),i=1,7)/7*0./
|
|
data (CTIon(i,1,23),i=1,7)/7*0./
|
|
data (CTIon(i,2,23),i=1,7)/7*0./
|
|
data (CTIon(i,3,23),i=1,7)/7*0./
|
|
data (CTIon(i,1,24),i=1,7)/7*0./
|
|
data (CTIon(i,2,24),i=1,7)/4.39,0.61,-0.89,-3.56,1e3,3e4,3.349/
|
|
data (CTIon(i,3,24),i=1,7)/7*0./
|
|
data (CTIon(i,1,25),i=1,7)/7*0./
|
|
data (CTIon(i,2,25),i=1,7)/2.83e-1,6.80e-3,6.44e-2,-9.70,1e3,3e4,
|
|
1 2.368/
|
|
data (CTIon(i,3,25),i=1,7)/7*0./
|
|
data (CTIon(i,1,26),i=1,7)/7*0./
|
|
data (CTIon(i,2,26),i=1,7)/2.10,7.72e-2,-0.41,-7.31,1e4,1e5,3.005/
|
|
data (CTIon(i,3,26),i=1,7)/7*0./
|
|
data (CTIon(i,1,27),i=1,7)/7*0./
|
|
data (CTIon(i,2,27),i=1,7)/1.20e-2,3.49,24.41,-1.26,1e3,3e4,4.044/
|
|
data (CTIon(i,3,27),i=1,7)/7*0./
|
|
data (CTIon(i,1,28),i=1,7)/7*0./
|
|
data (CTIon(i,2,28),i=1,7)/7*0./
|
|
data (CTIon(i,3,28),i=1,7)/7*0./
|
|
data (CTIon(i,1,29),i=1,7)/7*0./
|
|
data (CTIon(i,2,29),i=1,7)/7*0./
|
|
data (CTIon(i,3,29),i=1,7)/7*0./
|
|
data (CTIon(i,1,30),i=1,7)/7*0./
|
|
data (CTIon(i,2,30),i=1,7)/7*0./
|
|
data (CTIon(i,3,30),i=1,7)/7*0./
|
|
c
|
|
c digital form of the fits to the charge transfer
|
|
c recombination rate coefficients (total)
|
|
c
|
|
c Note: First parameter is in units of 1e-9!
|
|
c recombination
|
|
data (CTRecomb(i,1,2),i=1,6)/7.47e-6,2.06,9.93,-3.89,6e3,1e5/
|
|
data (CTRecomb(i,2,2),i=1,6)/1.00e-5,0.,0.,0.,1e3,1e7/
|
|
data (CTRecomb(i,1,3),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,3),i=1,6)/1.26,0.96,3.02,-0.65,1e3,3e4/
|
|
data (CTRecomb(i,3,3),i=1,6)/1.00e-5,0.,0.,0.,2e3,5e4/
|
|
data (CTRecomb(i,1,4),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,4),i=1,6)/1.00e-5,0.,0.,0.,2e3,5e4/
|
|
data (CTRecomb(i,3,4),i=1,6)/1.00e-5,0.,0.,0.,2e3,5e4/
|
|
data (CTRecomb(i,4,4),i=1,6)/5.17,0.82,-0.69,-1.12,2e3,5e4/
|
|
data (CTRecomb(i,1,5),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,5),i=1,6)/2.00e-2,0.,0.,0.,1e3,1e9/
|
|
data (CTRecomb(i,3,5),i=1,6)/1.00e-5,0.,0.,0.,2e3,5e4/
|
|
data (CTRecomb(i,4,5),i=1,6)/2.74,0.93,-0.61,-1.13,2e3,5e4/
|
|
data (CTRecomb(i,1,6),i=1,6)/4.88e-7,3.25,-1.12,-0.21,5.5e3,1e5/
|
|
data (CTRecomb(i,2,6),i=1,6)/1.67e-4,2.79,304.72,-4.07,5e3,5e4/
|
|
data (CTRecomb(i,3,6),i=1,6)/3.25,0.21,0.19,-3.29,1e3,1e5/
|
|
data (CTRecomb(i,4,6),i=1,6)/332.46,-0.11,-9.95e-1,-1.58e-3,1e1,
|
|
1 1e5/
|
|
data (CTRecomb(i,1,7),i=1,6)/1.01e-3,-0.29,-0.92,-8.38,1e2,5e4/
|
|
data (CTRecomb(i,2,7),i=1,6)/3.05e-1,0.60,2.65,-0.93,1e3,1e5/
|
|
data (CTRecomb(i,3,7),i=1,6)/4.54,0.57,-0.65,-0.89,1e1,1e5/
|
|
data (CTRecomb(i,4,7),i=1,6)/2.95,0.55,-0.39,-1.07,1e3,1e6/
|
|
data (CTRecomb(i,1,8),i=1,6)/1.04,3.15e-2,-0.61,-9.73,1e1,1e4/
|
|
data (CTRecomb(i,2,8),i=1,6)/1.04,0.27,2.02,-5.92,1e2,1e5/
|
|
data (CTRecomb(i,3,8),i=1,6)/3.98,0.26,0.56,-2.62,1e3,5e4/
|
|
data (CTRecomb(i,4,8),i=1,6)/2.52e-1,0.63,2.08,-4.16,1e3,3e4/
|
|
data (CTRecomb(i,1,9),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,9),i=1,6)/1.00e-5,0.,0.,0.,2e3,5e4/
|
|
data (CTRecomb(i,3,9),i=1,6)/9.86,0.29,-0.21,-1.15,2e3,5e4/
|
|
data (CTRecomb(i,4,9),i=1,6)/7.15e-1,1.21,-0.70,-0.85,2e3,5e4/
|
|
data (CTRecomb(i,1,10),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,10),i=1,6)/1.00e-5,0.,0.,0.,5e3,5e4/
|
|
data (CTRecomb(i,3,10),i=1,6)/14.73,4.52e-2,-0.84,-0.31,5e3,5e4/
|
|
data (CTRecomb(i,4,10),i=1,6)/6.47,0.54,3.59,-5.22,1e3,3e4/
|
|
data (CTRecomb(i,1,11),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,11),i=1,6)/1.00e-5,0.,0.,0.,2e3,5e4/
|
|
data (CTRecomb(i,3,11),i=1,6)/1.33,1.15,1.20,-0.32,2e3,5e4/
|
|
data (CTRecomb(i,4,11),i=1,6)/1.01e-1,1.34,10.05,-6.41,2e3,5e4/
|
|
data (CTRecomb(i,1,12),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,12),i=1,6)/8.58e-5,2.49e-3,2.93e-2,-4.33,1e3,
|
|
1 3e4/
|
|
data (CTRecomb(i,3,12),i=1,6)/6.49,0.53,2.82,-7.63,1e3,3e4/
|
|
data (CTRecomb(i,4,12),i=1,6)/6.36,0.55,3.86,-5.19,1e3,3e4/
|
|
data (CTRecomb(i,1,13),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,13),i=1,6)/1.00e-5,0.,0.,0.,1e3,3e4/
|
|
data (CTRecomb(i,3,13),i=1,6)/7.11e-5,4.12,1.72e4,-22.24,1e3,3e4/
|
|
data (CTRecomb(i,4,13),i=1,6)/7.52e-1,0.77,6.24,-5.67,1e3,3e4/
|
|
data (CTRecomb(i,1,14),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,14),i=1,6)/6.77,7.36e-2,-0.43,-0.11,5e2,1e5/
|
|
data (CTRecomb(i,3,14),i=1,6)/4.90e-1,-8.74e-2,-0.36,-0.79,1e3,
|
|
1 3e4/
|
|
data (CTRecomb(i,4,14),i=1,6)/7.58,0.37,1.06,-4.09,1e3,5e4/
|
|
data (CTRecomb(i,1,15),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,15),i=1,6)/1.74e-4,3.84,36.06,-0.97,1e3,3e4/
|
|
data (CTRecomb(i,3,15),i=1,6)/9.46e-2,-5.58e-2,0.77,-6.43,1e3,3e4/
|
|
data (CTRecomb(i,4,15),i=1,6)/5.37,0.47,2.21,-8.52,1e3,3e4/
|
|
data (CTRecomb(i,1,16),i=1,6)/3.82e-7,11.10,2.57e4,-8.22,1e3,1e4/
|
|
data (CTRecomb(i,2,16),i=1,6)/1.00e-5,0.,0.,0.,1e3,3e4/
|
|
data (CTRecomb(i,3,16),i=1,6)/2.29,4.02e-2,1.59,-6.06,1e3,3e4/
|
|
data (CTRecomb(i,4,16),i=1,6)/6.44,0.13,2.69,-5.69,1e3,3e4/
|
|
data (CTRecomb(i,1,17),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,17),i=1,6)/1.00e-5,0.,0.,0.,1e3,3e4/
|
|
data (CTRecomb(i,3,17),i=1,6)/1.88,0.32,1.77,-5.70,1e3,3e4/
|
|
data (CTRecomb(i,4,17),i=1,6)/7.27,0.29,1.04,-10.14,1e3,3e4/
|
|
data (CTRecomb(i,1,18),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,18),i=1,6)/1.00e-5,0.,0.,0.,1e3,3e4/
|
|
data (CTRecomb(i,3,18),i=1,6)/4.57,0.27,-0.18,-1.57,1e3,3e4/
|
|
data (CTRecomb(i,4,18),i=1,6)/6.37,0.85,10.21,-6.22,1e3,3e4/
|
|
data (CTRecomb(i,1,19),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,19),i=1,6)/1.00e-5,0.,0.,0.,1e3,3e4/
|
|
data (CTRecomb(i,3,19),i=1,6)/4.76,0.44,-0.56,-0.88,1e3,3e4/
|
|
data (CTRecomb(i,4,19),i=1,6)/1.00e-5,0.,0.,0.,1e3,3e4/
|
|
data (CTRecomb(i,1,20),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,20),i=1,6)/0.,0.,0.,0.,1e1,1e9/
|
|
data (CTRecomb(i,3,20),i=1,6)/3.17e-2,2.12,12.06,-0.40,1e3,3e4/
|
|
data (CTRecomb(i,4,20),i=1,6)/2.68,0.69,-0.68,-4.47,1e3,3e4/
|
|
data (CTRecomb(i,1,21),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,21),i=1,6)/0.,0.,0.,0.,1e1,1e9/
|
|
data (CTRecomb(i,3,21),i=1,6)/7.22e-3,2.34,411.50,-13.24,1e3,3e4/
|
|
data (CTRecomb(i,4,21),i=1,6)/1.20e-1,1.48,4.00,-9.33,1e3,3e4/
|
|
data (CTRecomb(i,1,22),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,22),i=1,6)/0.,0.,0.,0.,1e1,1e9/
|
|
data (CTRecomb(i,3,22),i=1,6)/6.34e-1,6.87e-3,0.18,-8.04,1e3,3e4/
|
|
data (CTRecomb(i,4,22),i=1,6)/4.37e-3,1.25,40.02,-8.05,1e3,3e4/
|
|
data (CTRecomb(i,1,23),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,23),i=1,6)/1.00e-5,0.,0.,0.,1e3,3e4/
|
|
data (CTRecomb(i,3,23),i=1,6)/5.12,-2.18e-2,-0.24,-0.83,1e3,3e4/
|
|
data (CTRecomb(i,4,23),i=1,6)/1.96e-1,-8.53e-3,0.28,-6.46,1e3,3e4/
|
|
data (CTRecomb(i,1,24),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,24),i=1,6)/5.27e-1,0.61,-0.89,-3.56,1e3,3e4/
|
|
data (CTRecomb(i,3,24),i=1,6)/10.90,0.24,0.26,-11.94,1e3,3e4/
|
|
data (CTRecomb(i,4,24),i=1,6)/1.18,0.20,0.77,-7.09,1e3,3e4/
|
|
data (CTRecomb(i,1,25),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,25),i=1,6)/1.65e-1,6.80e-3,6.44e-2,-9.70,1e3,
|
|
1 3e4/
|
|
data (CTRecomb(i,3,25),i=1,6)/14.20,0.34,-0.41,-1.19,1e3,3e4/
|
|
data (CTRecomb(i,4,25),i=1,6)/4.43e-1,0.91,10.76,-7.49,1e3,3e4/
|
|
data (CTRecomb(i,1,26),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,26),i=1,6)/1.26,7.72e-2,-0.41,-7.31,1e3,1e5/
|
|
data (CTRecomb(i,3,26),i=1,6)/3.42,0.51,-2.06,-8.99,1e3,1e5/
|
|
data (CTRecomb(i,4,26),i=1,6)/14.60,3.57e-2,-0.92,-0.37,1e3,3e4/
|
|
data (CTRecomb(i,1,27),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,27),i=1,6)/5.30,0.24,-0.91,-0.47,1e3,3e4/
|
|
data (CTRecomb(i,3,27),i=1,6)/3.26,0.87,2.85,-9.23,1e3,3e4/
|
|
data (CTRecomb(i,4,27),i=1,6)/1.03,0.58,-0.89,-0.66,1e3,3e4/
|
|
data (CTRecomb(i,1,28),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,28),i=1,6)/1.05,1.28,6.54,-1.81,1e3,1e5/
|
|
data (CTRecomb(i,3,28),i=1,6)/9.73,0.35,0.90,-5.33,1e3,3e4/
|
|
data (CTRecomb(i,4,28),i=1,6)/6.14,0.25,-0.91,-0.42,1e3,3e4/
|
|
data (CTRecomb(i,1,29),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,29),i=1,6)/1.47e-3,3.51,23.91,-0.93,1e3,3e4/
|
|
data (CTRecomb(i,3,29),i=1,6)/9.26,0.37,0.40,-10.73,1e3,3e4/
|
|
data (CTRecomb(i,4,29),i=1,6)/11.59,0.20,0.80,-6.62,1e3,3e4/
|
|
data (CTRecomb(i,1,30),i=1,6)/6*0./
|
|
data (CTRecomb(i,2,30),i=1,6)/1.00e-5,0.,0.,0.,1e3,3e4/
|
|
data (CTRecomb(i,3,30),i=1,6)/6.96e-4,4.24,26.06,-1.24,1e3,3e4/
|
|
data (CTRecomb(i,4,30),i=1,6)/1.33e-2,1.56,-0.92,-1.20,1e3,3e4/
|
|
c
|
|
end
|
|
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
|
|
SUBROUTINE COLH(ID,T,COL)
|
|
C =========================
|
|
C
|
|
C Hydrogen collision rates
|
|
C
|
|
C All standard expressions are taken from Mihalas, Heasley, and
|
|
C Auer, NCAR-TN/STR-104 (1975)
|
|
C
|
|
C New expressions (also from Mihalas) for collisional ionization
|
|
C for first 10 levels taken from Klaus Werner.
|
|
C
|
|
C New standard expressions from Giovanardi et al. (1987, AAS, 70, 29)
|
|
C for collisional excitation (valid from 3000K to 500000K)
|
|
C
|
|
C Meaning of ICOL:
|
|
C a) for ionization - .ge.0 - standard expression
|
|
C < 0 - non-standard, user suplied formula
|
|
C b) for 1 - 2 transition =0 - standard theoretical formula
|
|
C = 1 - experimental fit (formula quted in
|
|
C Mihalas et al.)
|
|
C = 2 - formula by Crandall et al (procedure
|
|
C CEH12)
|
|
C c) for all other line transitions
|
|
C .ge.0 - standard expression
|
|
C < 0 - non-standard, user supplie formula
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (CC0 = 5.465D-11,
|
|
* CEX1 = -30.20581,
|
|
* CEX2 = 3.8608704,
|
|
* CEX3 = 305.63574,
|
|
* CI1 = 0.3,
|
|
* CI2 = 0.435,
|
|
* CA1 = 5.444416D7,
|
|
* CA2 = -2.8185937D4,
|
|
* CA3 = 19.987261,
|
|
* CA4 = -5.8906298D-5,
|
|
* CB1 = 1.3935312D3,
|
|
* CB2 = -1.6805859D2,
|
|
* CB3 = -2.539D3,
|
|
* CC1 = 2.0684609D3,
|
|
* CC2 = -3.341582D2,
|
|
* CC3 = -7.6440625D3,
|
|
* CD1 = 3.2174844D3,
|
|
* CD2 = -5.5882422D2,
|
|
* CD3 = -6.86325D3,
|
|
* CE1 = 5.759125D3,
|
|
* CE2 = 81.75,
|
|
* CE3 = -1.5163D3,
|
|
* CF1 = 1.461475D4,
|
|
* CF2 = 393.4,
|
|
* CF3 = -4.8284D3,
|
|
* ALF0 = 1.8,
|
|
* ALF1 = 0.4,
|
|
* BET0 = 3.0,
|
|
* BET1 = 1.2,
|
|
* O148 = 0.148,
|
|
* CHMI = 5.59D-15)
|
|
PARAMETER (EXPIA1=-0.57721566,EXPIA2=0.99999193,
|
|
* EXPIA3=-0.24991055,EXPIA4=0.05519968,
|
|
* EXPIA5=-0.00976004,EXPIA6=0.00107857,
|
|
* EXPIB1=0.2677734343,EXPIB2=8.6347608925,
|
|
* EXPIB3=18.059016973,EXPIB4=8.5733287401,
|
|
* EXPIC1=3.9584969228,EXPIC2=21.0996530827,
|
|
* EXPIC3=25.6329561486,EXPIC4=9.5733223454)
|
|
DIMENSION COL(MTRANS),A(6,10)
|
|
DIMENSION CCOOL(4,14,15),CHOT(4,14,15),XTT(4)
|
|
DATA ((A(I,J),J=1,10),I=1,6) /
|
|
* -86.7633398, 2632.8369 , 7478.9556 ,-4202.8442 ,-47995.930 ,
|
|
* -120942.89 ,-202300.81 ,-261373.03 ,-266337.91 ,-192293.20 ,
|
|
* 100.919188 ,-2738.7485 ,-8495.4590 , 1937.3763 , 45825.371 ,
|
|
* 122209.39 , 211928.67 , 285044.75 , 309455.47 , 258802.22 ,
|
|
* -45.7813807, 1121.3976 , 3794.6826 , 340.35764 ,-16617.055 ,
|
|
* -47390.313 ,-84973.688 ,-117833.95 ,-133243.61 ,-120363.95 ,
|
|
* 10.1978559 ,-224.30670 ,-822.83636 ,-290.10489 , 2905.7393 ,
|
|
* 8944.6025 , 16556.992 , 23544.543 , 27419.742 , 26002.143 ,
|
|
* -1.11223557, 21.923729 , 86.619110 , 48.840523 ,-246.99014 ,
|
|
* -828.41028 ,-1581.2722 ,-2297.9321 ,-2738.1743 ,-2686.4087 ,
|
|
* .0474198818,-.83974838,-3.5534720 ,-2.6097214 , 8.1972208 ,
|
|
* 30.267115 , 59.521984 , 88.178680 , 107.05288 , 107.73775 /
|
|
C
|
|
DATA ((CCOOL(I, 1, K),I=1,4),K=1,15)/ 4*0.,
|
|
& 5.742D-01, 1.818D-05,-1.093D-10, 8.687D-16,
|
|
& 1.934D-01,-4.698D-07, 8.352D-11,-5.576D-16,
|
|
& 6.323D-03, 2.237D-06,-1.620D-11, 8.955D-17,
|
|
& 2.035D-02, 6.076D-07,-2.175D-13,-2.495D-18,
|
|
& 1.136D-02, 3.428D-07,-1.467D-13,-1.300D-18,
|
|
& 6.999D-03, 2.126D-07,-9.963D-14,-7.672D-19,
|
|
& 4.624D-03, 1.410D-07,-6.969D-14,-4.927D-19,
|
|
& 3.217D-03, 9.836D-08,-5.031D-14,-3.361D-19,
|
|
& 2.329D-03, 7.135D-08,-3.737D-14,-2.400D-19,
|
|
& 1.741D-03, 5.342D-08,-2.845D-14,-1.775D-19,
|
|
& 1.336D-03, 4.103D-08,-2.213D-14,-1.351D-19,
|
|
& 1.048D-03, 3.220D-08,-1.754D-14,-1.053D-19,
|
|
& 8.369D-04, 2.574D-08,-1.413D-14,-8.368D-20,
|
|
& 6.791D-04, 2.090D-08,-1.154D-14,-6.763D-20/
|
|
DATA ((CCOOL(I, 2, K),I=1,4),K=1,15)/ 8*0.,
|
|
& 2.253D+01, 9.350D-04, 1.215D-08,-9.969D-14,
|
|
& 7.816D-01, 5.414D-04,-1.827D-09, 5.140D-17,
|
|
& 1.459D+00, 2.858D-04,-2.207D-09, 9.028D-15,
|
|
& 7.172D-01, 1.440D-04,-1.139D-09, 4.755D-15,
|
|
& 4.107D-01, 8.360D-05,-6.699D-10, 2.823D-15,
|
|
& 2.591D-01, 5.319D-05,-4.293D-10, 1.819D-15,
|
|
& 1.747D-01, 3.608D-05,-2.925D-10, 1.243D-15,
|
|
& 1.237D-01, 2.567D-05,-2.087D-10, 8.891D-16,
|
|
& 9.097D-02, 1.893D-05,-1.539D-10, 6.585D-16,
|
|
& 6.896D-02, 1.438D-05,-1.174D-10, 5.017D-16,
|
|
& 5.356D-02, 1.119D-05,-9.150D-11, 3.913D-16,
|
|
& 4.247D-02, 8.887D-06,-7.272D-11, 3.112D-16,
|
|
& 3.425D-02, 7.176D-06,-5.877D-11, 2.516D-16/
|
|
DATA ((CCOOL(I, 3, K),I=1,4),K=1,15)/ 12*0.,
|
|
& -1.290D+01, 2.059D-02, 5.461D-08,-9.082D-13,
|
|
& 3.562D+02, 7.337D-03,-9.622D-08, 5.596D-13,
|
|
& 5.744D+00, 3.570D-03,-3.259D-08, 1.452D-13,
|
|
& 2.968D+00, 1.813D-03,-1.703D-08, 7.744D-14,
|
|
& 1.756D+00, 1.065D-03,-1.016D-08, 4.667D-14,
|
|
& 1.135D+00, 6.865D-04,-6.601D-09, 3.053D-14,
|
|
& 7.802D-01, 4.713D-04,-4.558D-09, 2.116D-14,
|
|
& 5.615D-01, 3.390D-04,-3.292D-09, 1.532D-14,
|
|
& 4.189D-01, 2.528D-04,-2.461D-09, 1.148D-14,
|
|
& 3.213D-01, 1.939D-04,-1.891D-09, 8.833D-15,
|
|
& 2.523D-01, 1.522D-04,-1.487D-09, 6.953D-15,
|
|
& 2.018D-01, 1.218D-04,-1.192D-09, 5.576D-15/
|
|
DATA ((CCOOL(I, 4, K),I=1,4),K=1,15)/ 16*0.,
|
|
& 4.139D+03, 4.645D-01,-7.097D-06, 4.388D-11,
|
|
& 1.794D+03, 4.443D-02,-6.484D-07, 3.936D-12,
|
|
& 1.536D+01, 2.042D-02,-2.065D-07, 9.734D-13,
|
|
& 8.730D+00, 1.033D-02,-1.074D-07, 5.161D-13,
|
|
& 5.434D+00, 6.084D-03,-6.423D-08, 3.116D-13,
|
|
& 3.628D+00, 3.938D-03,-4.196D-08, 2.048D-13,
|
|
& 2.554D+00, 2.718D-03,-2.914D-08, 1.428D-13,
|
|
& 1.873D+00, 1.967D-03,-2.119D-08, 1.041D-13,
|
|
& 1.418D+00, 1.476D-03,-1.594D-08, 7.843D-14,
|
|
& 1.102D+00, 1.138D-03,-1.232D-08, 6.075D-14,
|
|
& 8.744D-01, 8.987D-04,-9.746D-09, 4.809D-14/
|
|
DATA ((CCOOL(I, 5, K),I=1,4),K=1,15)/ 20*0.,
|
|
& -9.122D+02, 1.260D+00,-1.070D-05, 4.290D-11,
|
|
& 3.959D+01, 2.108D-01,-2.162D-06, 1.020D-11,
|
|
& 3.691D+01, 7.806D-02,-8.485D-07, 4.166D-12,
|
|
& 2.352D+01, 3.911D-02,-4.365D-07, 2.179D-12,
|
|
& 1.542D+01, 2.296D-02,-2.601D-07, 1.310D-12,
|
|
& 1.062D+01, 1.487D-02,-1.699D-07, 8.608D-13,
|
|
& 7.642D+00, 1.029D-02,-1.183D-07, 6.014D-13,
|
|
& 5.695D+00, 7.464D-03,-8.621D-08, 4.394D-13,
|
|
& 4.368D+00, 5.617D-03,-6.508D-08, 3.323D-13,
|
|
& 3.430D+00, 4.348D-03,-5.051D-08, 2.583D-13/
|
|
DATA ((CCOOL(I, 6, K),I=1,4),K=1,15)/ 24*0.,
|
|
& -3.431D+03, 4.116D+00,-3.853D-05, 1.679D-10,
|
|
& 4.397D+01, 6.434D-01,-7.008D-06, 3.431D-11,
|
|
& 8.927D+01, 2.325D-01,-2.667D-06, 1.350D-11,
|
|
& 6.153D+01, 1.152D-01,-1.354D-06, 6.957D-12,
|
|
& 4.165D+01, 6.729D-02,-8.024D-07, 4.156D-12,
|
|
& 2.923D+01, 4.349D-02,-5.232D-07, 2.724D-12,
|
|
& 2.130D+01, 3.008D-02,-3.641D-07, 1.902D-12,
|
|
& 1.603D+01, 2.185D-02,-2.656D-07, 1.391D-12,
|
|
& 1.239D+01, 1.647D-02,-2.008D-07, 1.054D-12/
|
|
DATA ((CCOOL(I, 7, K),I=1,4),K=1,15)/ 28*0.,
|
|
& -9.280D+03, 1.116D+01,-1.122D-04, 5.167D-10,
|
|
& 6.658D+01, 1.651D+00,-1.884D-05, 9.487D-11,
|
|
& 2.172D+02, 5.833D-01,-6.977D-06, 3.615D-11,
|
|
& 1.535D+02, 2.858D-01,-3.499D-06, 1.838D-11,
|
|
& 1.049D+02, 1.660D-01,-2.060D-06, 1.090D-11,
|
|
& 7.412D+01, 1.070D-01,-1.339D-06, 7.118D-12,
|
|
& 5.428D+01, 7.389D-02,-9.304D-07, 4.963D-12,
|
|
& 4.103D+01, 5.366D-02,-6.786D-07, 3.629D-12/
|
|
DATA ((CCOOL(I, 8, K),I=1,4),K=1,15)/ 32*0.,
|
|
& -2.069D+04, 2.637D+01,-2.802D-04, 1.342D-09,
|
|
& 2.055D+02, 3.731D+00,-4.420D-05, 2.276D-10,
|
|
& 5.123D+02, 1.292D+00,-1.599D-05, 8.442D-11,
|
|
& 3.578D+02, 6.265D-01,-7.922D-06, 4.235D-11,
|
|
& 2.438D+02, 3.616D-01,-4.633D-06, 2.494D-11,
|
|
& 1.721D+02, 2.322D-01,-3.000D-06, 1.622D-11,
|
|
& 1.260D+02, 1.601D-01,-2.081D-06, 1.129D-11/
|
|
DATA ((CCOOL(I, 9, K),I=1,4),K=1,15)/ 36*0.,
|
|
& -4.032D+04, 5.614D+01,-6.231D-04, 3.073D-09,
|
|
& 6.989D+02, 7.655D+00,-9.352D-05, 4.903D-10,
|
|
& 1.141D+03, 2.605D+00,-3.313D-05, 1.777D-10,
|
|
& 7.755D+02, 1.250D+00,-1.624D-05, 8.808D-11,
|
|
& 5.234D+02, 7.175D-01,-9.437D-06, 5.153D-11,
|
|
& 3.677D+02, 4.590D-01,-6.087D-06, 3.338D-11/
|
|
DATA ((CCOOL(I,10, K),I=1,4),K=1,15)/ 40*0.,
|
|
& -7.097D+04, 1.101D+02,-1.266D-03, 6.390D-09,
|
|
& 2.018D+03, 1.455D+01,-1.824D-04, 9.708D-10,
|
|
& 2.383D+03, 4.875D+00,-6.348D-05, 3.449D-10,
|
|
& 1.569D+03, 2.319D+00,-3.081D-05, 1.691D-10,
|
|
& 1.046D+03, 1.323D+00,-1.779D-05, 9.830D-11/
|
|
DATA ((CCOOL(I,11, K),I=1,4),K=1,15)/ 44*0.,
|
|
& -1.150D+05, 2.020D+02,-2.392D-03, 1.231D-08,
|
|
& 4.988D+03, 2.601D+01,-3.334D-04, 1.797D-09,
|
|
& 4.675D+03, 8.595D+00,-1.142D-04, 6.273D-10,
|
|
& 2.986D+03, 4.054D+00,-5.491D-05, 3.046D-10/
|
|
DATA ((CCOOL(I,12, K),I=1,4),K=1,15)/ 48*0.,
|
|
& -1.737D+05, 3.511D+02,-4.263D-03, 2.227D-08,
|
|
& 1.094D+04, 4.419D+01,-5.774D-04, 3.146D-09,
|
|
& 8.673D+03, 1.442D+01,-1.950D-04, 1.082D-09/
|
|
DATA ((CCOOL(I,13, K),I=1,4),K=1,15)/ 52*0.,
|
|
& -2.459D+05, 5.829D+02,-7.233D-03, 3.830D-08,
|
|
& 2.191D+04, 7.194D+01,-9.561D-04, 5.259D-09/
|
|
DATA ((CCOOL(I,14, K),I=1,4),K=1,15)/ 56*0.,
|
|
& -3.273D+05, 9.312D+02,-1.178D-02, 6.306D-08/
|
|
DATA ((CHOT(I, 1, K),I=1,4),K=1,15)/ 4*0.,
|
|
& 5.856D-01, 1.551D-05,-9.669D-12, 5.716D-19,
|
|
& 1.537D-01, 3.548D-06,-3.224D-12, 7.626D-19,
|
|
& 2.400D-02, 1.419D-06,-2.008D-12, 1.356D-18,
|
|
& 2.002D-02, 6.325D-07,-7.070D-13, 4.096D-19,
|
|
& 1.123D-02, 3.549D-07,-3.998D-13, 2.331D-19,
|
|
& 6.940D-03, 2.194D-07,-2.483D-13, 1.453D-19,
|
|
& 4.593D-03, 1.453D-07,-1.648D-13, 9.667D-20,
|
|
& 3.199D-03, 1.012D-07,-1.150D-13, 6.758D-20,
|
|
& 2.318D-03, 7.334D-08,-8.349D-14, 4.910D-20,
|
|
& 1.727D-03, 5.493D-08,-6.270D-14, 3.695D-20,
|
|
& 1.326D-03, 4.218D-08,-4.821D-14, 2.844D-20,
|
|
& 1.040D-03, 3.310D-08,-3.786D-14, 2.236D-20,
|
|
& 8.305D-04, 2.645D-08,-3.028D-14, 1.790D-20,
|
|
& 6.740D-04, 2.147D-08,-2.460D-14, 1.455D-20/
|
|
DATA ((CHOT(I, 2, K),I=1,4),K=1,15)/ 8*0.,
|
|
& 1.710D+01, 1.530D-03,-2.553D-09, 1.924D-15,
|
|
& 8.237D+00, 3.554D-04,-7.566D-10, 6.420D-16,
|
|
& 5.932D+00, 1.301D-04,-2.912D-10, 2.535D-16,
|
|
& 2.987D+00, 6.419D-05,-1.444D-10, 1.260D-16,
|
|
& 1.733D+00, 3.689D-05,-8.324D-11, 7.267D-17,
|
|
& 1.102D+00, 2.334D-05,-5.273D-11, 4.605D-17,
|
|
& 7.472D-01, 1.576D-05,-3.567D-11, 3.116D-17,
|
|
& 5.312D-01, 1.118D-05,-2.532D-11, 2.212D-17,
|
|
& 3.919D-01, 8.232D-06,-1.865D-11, 1.630D-17,
|
|
& 2.977D-01, 6.245D-06,-1.416D-11, 1.237D-17,
|
|
& 2.315D-01, 4.855D-06,-1.101D-11, 9.622D-18,
|
|
& 1.838D-01, 3.851D-06,-8.734D-12, 7.635D-18,
|
|
& 1.484D-01, 3.108D-06,-7.050D-12, 6.164D-18/
|
|
DATA ((CHOT(I, 3, K),I=1,4),K=1,15)/ 12*0.,
|
|
& 1.940D+02, 1.949D-02,-3.832D-08, 3.137D-14,
|
|
& 4.729D+02, 1.927D-03,-4.171D-09, 3.628D-15,
|
|
& 6.741D+01, 1.315D-03,-3.145D-09, 2.814D-15,
|
|
& 3.444D+01, 6.477D-04,-1.560D-09, 1.399D-15,
|
|
& 2.031D+01, 3.744D-04,-9.054D-10, 8.130D-16,
|
|
& 1.311D+01, 2.388D-04,-5.789D-10, 5.203D-16,
|
|
& 9.007D+00, 1.629D-04,-3.955D-10, 3.556D-16,
|
|
& 6.484D+00, 1.166D-04,-2.835D-10, 2.550D-16,
|
|
& 4.837D+00, 8.666D-05,-2.108D-10, 1.896D-16,
|
|
& 3.711D+00, 6.631D-05,-1.614D-10, 1.452D-16,
|
|
& 2.914D+00, 5.194D-05,-1.265D-10, 1.138D-16,
|
|
& 2.332D+00, 4.150D-05,-1.011D-10, 9.100D-17/
|
|
DATA ((CHOT(I, 4, K),I=1,4),K=1,15)/ 16*0.,
|
|
& 7.204D+03, 1.627D-01,-5.181D-07, 5.605D-13,
|
|
& 2.507D+03, 9.370D-03,-2.091D-08, 1.842D-14,
|
|
& 3.823D+02, 6.480D-03,-1.600D-08, 1.452D-14,
|
|
& 1.950D+02, 3.161D-03,-7.869D-09, 7.157D-15,
|
|
& 1.154D+02, 1.823D-03,-4.561D-09, 4.154D-15,
|
|
& 7.486D+01, 1.165D-03,-2.924D-09, 2.665D-15,
|
|
& 5.178D+01, 7.977D-04,-2.006D-09, 1.830D-15,
|
|
& 3.752D+01, 5.737D-04,-1.444D-09, 1.318D-15,
|
|
& 2.816D+01, 4.283D-04,-1.080D-09, 9.858D-16,
|
|
& 2.174D+01, 3.293D-04,-8.307D-10, 7.587D-16,
|
|
& 1.717D+01, 2.592D-04,-6.544D-10, 5.978D-16/
|
|
DATA ((CHOT(I, 5, K),I=1,4),K=1,15)/ 20*0.,
|
|
& 2.166D+04, 4.690D-01,-1.122D-06, 1.008D-12,
|
|
& 3.874D+03, 6.443D-02,-1.596D-07, 1.452D-13,
|
|
& 1.465D+03, 2.207D-02,-5.556D-08, 5.082D-14,
|
|
& 7.410D+02, 1.062D-02,-2.698D-08, 2.476D-14,
|
|
& 4.374D+02, 6.096D-03,-1.556D-08, 1.430D-14,
|
|
& 2.841D+02, 3.889D-03,-9.962D-09, 9.167D-15,
|
|
& 1.969D+02, 2.663D-03,-6.838D-09, 6.297D-15,
|
|
& 1.431D+02, 1.918D-03,-4.935D-09, 4.547D-15,
|
|
& 1.078D+02, 1.436D-03,-3.698D-09, 3.409D-15,
|
|
& 8.353D+01, 1.107D-03,-2.854D-09, 2.632D-15/
|
|
DATA ((CHOT(I, 6, K),I=1,4),K=1,15)/ 24*0.,
|
|
& 7.146D+04, 1.379D+00,-3.346D-06, 3.023D-12,
|
|
& 1.187D+04, 1.794D-01,-4.501D-07, 4.118D-13,
|
|
& 4.380D+03, 5.990D-02,-1.527D-07, 1.405D-13,
|
|
& 2.192D+03, 2.846D-02,-7.324D-08, 6.759D-14,
|
|
& 1.288D+03, 1.621D-02,-4.197D-08, 3.881D-14,
|
|
& 8.351D+02, 1.031D-02,-2.678D-08, 2.480D-14,
|
|
& 5.790D+02, 7.050D-03,-1.837D-08, 1.702D-14,
|
|
& 4.213D+02, 5.079D-03,-1.326D-08, 1.229D-14,
|
|
& 3.179D+02, 3.804D-03,-9.944D-09, 9.226D-15/
|
|
DATA ((CHOT(I, 7, K),I=1,4),K=1,15)/ 28*0.,
|
|
& 1.954D+05, 3.426D+00,-8.397D-06, 7.624D-12,
|
|
& 3.057D+04, 4.266D-01,-1.080D-06, 9.917D-13,
|
|
& 1.103D+04, 1.392D-01,-3.582D-07, 3.309D-13,
|
|
& 5.458D+03, 6.530D-02,-1.696D-07, 1.572D-13,
|
|
& 3.189D+03, 3.693D-02,-9.653D-08, 8.966D-14,
|
|
& 2.062D+03, 2.338D-02,-6.136D-08, 5.707D-14,
|
|
& 1.429D+03, 1.595D-02,-4.200D-08, 3.910D-14,
|
|
& 1.039D+03, 1.148D-02,-3.029D-08, 2.282D-14/
|
|
DATA ((CHOT(I, 8, K),I=1,4),K=1,15)/ 32*0.,
|
|
& 4.651D+05, 7.527D+00,-1.859D-05, 1.694D-11,
|
|
& 6.930D+04, 9.038D-01,-2.302D-06, 2.121D-12,
|
|
& 2.450D+04, 2.891D-01,-7.487D-07, 6.939D-13,
|
|
& 1.200D+04, 1.340D-01,-3.505D-07, 3.260D-13,
|
|
& 6.970D+03, 7.523D-02,-1.981D-07, 1.846D-13,
|
|
& 4.493D+03, 4.741D-02,-1.254D-07, 1.170D-13,
|
|
& 3.106D+03, 3.226D-02,-8.559D-08, 7.997D-14/
|
|
DATA ((CHOT(I, 9, K),I=1,4),K=1,15)/ 36*0.,
|
|
& 9.956D+05, 1.506D+01,-3.741D-05, 3.418D-11,
|
|
& 1.425D+05, 1.754D+00,-4.489D-06, 4.146D-12,
|
|
& 4.949D+04, 5.510D-01,-1.435D-06, 1.333D-12,
|
|
& 2.401D+04, 2.526D-01,-6.645D-07, 6.196D-13,
|
|
& 1.386D+04, 1.408D-01,-3.729D-07, 3.485D-13,
|
|
& 8.904D+03, 8.835D-02,-2.350D-07, 2.200D-13/
|
|
DATA ((CHOT(I,10, K),I=1,4),K=1,15)/ 40*0.,
|
|
& 1.961D+06, 2.798D+01,-6.982D-05, 6.394D-11,
|
|
& 2.715D+05, 3.175D+00,-8.158D-06, 7.551D-12,
|
|
& 9.279D+04, 9.821D-01,-2.567D-06, 2.390D-12,
|
|
& 4.460D+04, 4.458D-01,-1.178D-06, 1.100D-12,
|
|
& 2.561D+04, 2.468D-01,-6.566D-07, 6.150D-13/
|
|
DATA ((CHOT(I,11, K),I=1,4),K=1,15)/ 44*0.,
|
|
& 3.613D+06, 4.898D+01,-1.227D-04, 1.125D-10,
|
|
& 4.861D+05, 5.434D+00,-1.401D-05, 1.299D-11,
|
|
& 1.638D+05, 1.658D+00,-4.348D-06, 4.054D-12,
|
|
& 7.810D+04, 7.456D-01,-1.976D-06, 1.850D-12/
|
|
DATA ((CHOT(I,12, K),I=1,4),K=1,15)/ 48*0.,
|
|
& 6.300D+06, 8.163D+01,-2.051D-04, 1.884D-10,
|
|
& 8.271D+05, 8.881D+00,-2.296D-05, 2.131D-11,
|
|
& 2.753D+05, 2.676D+00,-7.037D-06, 6.571D-12/
|
|
DATA ((CHOT(I,13, K),I=1,4),K=1,15)/ 52*0.,
|
|
& 1.049D+07, 1.305D+02,-3.288D-04, 3.025D-10,
|
|
& 1.348D+06, 1.396D+01,-3.617D-05, 3.361D-11/
|
|
DATA ((CHOT(I,14, K),I=1,4),K=1,15)/ 56*0.,
|
|
& 1.680D+07, 2.016D+02,-5.089D-04, 4.687D-10/
|
|
C
|
|
HKT=HK/T
|
|
CT=CC0*SQRT(T)
|
|
TK=HKT/H
|
|
t0=t
|
|
X=LOG10(T)
|
|
X2=X*X
|
|
X3=X*X2
|
|
X4=X2*X2
|
|
X5=X3*X2
|
|
XTT(1)=1.
|
|
XTT(2)=T
|
|
XTT(3)=T*T
|
|
XTT(4)=T*T*T
|
|
SQT=SQRT(T)
|
|
N0HN=NFIRST(IELH)
|
|
N1H=NLAST(IELH)
|
|
NKH=NKA(IATH)
|
|
N0Q=NQUANT(N1H)+1
|
|
N1Q=ICUP(IELH)
|
|
DO 200 II=N0HN,N1H
|
|
I=II-N0HN+1
|
|
IT=ITRA(II,NKH)
|
|
IF(IT.EQ.0) GO TO 100
|
|
C
|
|
C *************** Collisional ionization
|
|
C
|
|
c for high temperature, use XSTAR formulae
|
|
C
|
|
if(t0.gt.1.e6) then
|
|
rno=16.
|
|
izc=1
|
|
call irc(i,t0,izc,rno,cs)
|
|
col(it)=cs
|
|
go to 100
|
|
end if
|
|
C
|
|
IC=ICOL(IT)
|
|
U0=FR0(IT)*HKT
|
|
IF(IC.LT.0) GO TO 90
|
|
if(ifwop(ii).lt.0) go to 95
|
|
GAM=I*I*I
|
|
IF(I.GT.10) GO TO 80
|
|
GAM=A(1,I)+A(2,I)*X+A(3,I)*X2+A(4,I)*X3
|
|
* +A(5,I)*X4+A(6,I)*X5
|
|
80 COL(IT)=CT*EXP(-U0)*GAM
|
|
GO TO 100
|
|
C
|
|
C non-standard (user supplied) formula
|
|
C
|
|
90 CALL CSPEC(II,NKH,IC,OSC0(IT),CPAR(IT),U0,T,COL(IT))
|
|
go to 100
|
|
c
|
|
c ionization from the merged state
|
|
c
|
|
95 sum1=0.
|
|
sum2=0.
|
|
ehk=eh/tk
|
|
n00q=nquant(n1h-1)+1
|
|
n11q=nlmx
|
|
do img=n00q,n11q
|
|
xi=img
|
|
xii=xi*xi
|
|
sum1=sum1+xii*xii*xi*wnhint(img,id)
|
|
sum2=sum2+xii*wnhint(img,id)*exp(ehk/xii)
|
|
end do
|
|
col(it)=ct*sum1/sum2
|
|
go to 200
|
|
C
|
|
C ***************** Collisional excitation
|
|
C
|
|
100 CONTINUE
|
|
I1=I+1
|
|
XI=I
|
|
VI=XI*XI
|
|
ALF=ALF0-ALF1/VI
|
|
BET=BET0-BET1/XI
|
|
NHL=N1H-N0HN+1
|
|
IF(N1Q.GT.0) NHL=N1Q
|
|
N1HC=N1H
|
|
IF(IFWOP(N1H).LT.0) THEN
|
|
NHL=NLMX
|
|
N1HC=N1H-1
|
|
END IF
|
|
CSUM=0.
|
|
IF(I1.GT.NHL) GO TO 200
|
|
CSCA=8.63D-6/2./VI/SQT
|
|
DO 190 J=I1,NHL
|
|
XJ=J
|
|
VJ=XJ*XJ
|
|
IC=0
|
|
JJ=J+N0HN-1
|
|
IF(JJ.GT.N1HC) GO TO 150
|
|
ICT=ITRA(II,JJ)
|
|
IF(ICT.EQ.0) GO TO 190
|
|
IC=ICOL(ICT)
|
|
U0=FR0(ICT)*HKT
|
|
E=U0/EH/TK
|
|
C1=OSC0(ICT)
|
|
IF(IC.LT.0) THEN
|
|
CALL CSPEC(II,JJ,IC,C1,CPAR(ICT),U0,T,COL(ICT))
|
|
ELSE IF(IC.EQ.0) THEN
|
|
GO TO 160
|
|
ELSE IF(IC.EQ.1) THEN
|
|
COL(ICT)=CT*EXP(-U0)*(CEX1+CEX2*X+CEX3/X/X)
|
|
ELSE IF(IC.GE.2) THEN
|
|
COL(ICT)=CEH12(T)
|
|
END IF
|
|
GO TO 190
|
|
C
|
|
C collisional excitations from level I to higher, non-explicit
|
|
C levels are lumped into the collisional ionization rate
|
|
C (the so-called modified collision ionization rate)
|
|
C
|
|
150 CONTINUE
|
|
E=UN/VI-UN/VJ
|
|
U0=EH*E*TK
|
|
IF(J.LE.20) C1=OSH(I,J)
|
|
IF(J.GT.20) THEN
|
|
C1=OSH(I,20)*((400.-VI)/20.*XJ/(VJ-VI))**3
|
|
end if
|
|
160 CONTINUE
|
|
C
|
|
IF(ICOLHN.EQ.1.AND.J.LE.7) GO TO 250
|
|
IF(ICOLHN.EQ.2.AND.J.LE.15) GO TO 260
|
|
C
|
|
C Old standard formula for the collisional excitation rate - used for
|
|
C rates in explicit transitions as well as for evaluation of the
|
|
C modified collisional rate
|
|
C
|
|
IF(ICOLHN.EQ.1.AND.J.LE.7) GO TO 250
|
|
IF(ICOLHN.EQ.2.AND.J.LE.15) GO TO 260
|
|
CS=4.*CT*C1/E/E
|
|
EX=EXP(-U0)
|
|
IF(U0.LE.UN) THEN
|
|
E1=-LOG(U0)+EXPIA1+U0*(EXPIA2+U0*(EXPIA3+U0*(EXPIA4+
|
|
* U0*(EXPIA5+U0*EXPIA6))))
|
|
ELSE
|
|
E1=EXP(-U0)*((EXPIB1+U0*(EXPIB2+U0*(EXPIB3+
|
|
* U0*(EXPIB4+U0))))/(EXPIC1+U0*(EXPIC2+
|
|
* U0*(EXPIC3+U0*(EXPIC4+U0)))))/U0
|
|
END IF
|
|
E5=E1
|
|
DO IX=1,4
|
|
E5=(EX-U0*E5)/IX
|
|
END DO
|
|
CS=CS*U0*(E1+O148*U0*E5)
|
|
IF(J-I.NE.1) CS=CS*(BET+TWO*(ALF-BET)/(XJ-XI))
|
|
GO TO 180
|
|
C End of the old standard formula (Mihalas et al 1975)
|
|
C
|
|
c Butler new calculations
|
|
c
|
|
250 call butler(i,j,t,u0,cs,ierr)
|
|
go to 180
|
|
c
|
|
C Giovanardi et al. 1987, AAS, 70, 269
|
|
C Cool: T<=60000K ; Hot: T>60000K
|
|
C
|
|
260 IF(T.GT.60000.) GO TO 270
|
|
CS=CCOOL(1,I,J)
|
|
DO ICA=2,4
|
|
CS=CS+CCOOL(ICA,I,J)*XTT(ICA)
|
|
END DO
|
|
GO TO 280
|
|
270 CS=CHOT(1,I,J)
|
|
DO ICA=2,4
|
|
CS=CS+CHOT(ICA,I,J)*XTT(ICA)
|
|
END DO
|
|
280 CS=CSCA*CS*EXP(-U0)
|
|
C
|
|
180 IF(JJ.GT.N1HC) THEN
|
|
CSUM=CSUM+CS
|
|
ELSE
|
|
COL(ICT)=CS
|
|
END IF
|
|
190 CONTINUE
|
|
IF(IT.NE.0.AND.N1Q.GT.0) COL(IT)=COL(IT)+CSUM
|
|
ITH=ITRA(II,N1H)
|
|
IF(IFWOP(N1H).LT.0.AND.ITH.GT.0) COL(ITH)=CSUM
|
|
200 CONTINUE
|
|
C
|
|
C special standard formula for collisional ionization of H-
|
|
C
|
|
IF(IELHM.EQ.0) RETURN
|
|
IT=ITRA(NFIRST(IELHM),N0HN)
|
|
IF(IT.EQ.0) RETURN
|
|
IC=ICOL(IT)
|
|
IF(IC.GE.0) THEN
|
|
COL(IT)=CHMI*T*SQRT(T)
|
|
ELSE
|
|
C
|
|
C if desired, non-standard, user supplied, formula for H-
|
|
C
|
|
U0=ENION(NFIRST(IELHM))*TK
|
|
CALL CSPEC(NFIRST(IELHM),N0HN,IC,OSC0(IT),CPAR(IT),U0,T,CS)
|
|
COL(IT)=CS
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE BUTLER (NI,NJ,T,U0,COL,IERR)
|
|
C =======================================
|
|
C
|
|
C Rate coefficients for collisional excitation of hydrogen
|
|
C by electrons. Interpolates in Table 3 of Przybilla & Butler
|
|
C (2004, ApJ).
|
|
C
|
|
C
|
|
C Input:
|
|
C NI Principal quantum number lower level
|
|
C NJ "" upper level
|
|
C T Temperature
|
|
C U0 =h*nu/K/T
|
|
C Output:
|
|
C COL collisional rate (cm3 s-1)
|
|
C IERR error flat (0=ok, 1=T exceeds table range,
|
|
C 2=NI higher than 6 or lower than 1
|
|
C NJ higher than 7 or lower than 2)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
|
|
DIMENSION COLSTR(16,21),TREF(16)
|
|
|
|
DATA (TREF(I), I=1,16) /
|
|
* 2.5d3, 5d3, 7.5d3, 1d4, 1.5d4, 2d4, 2.5d4, 3d4, 4d4, 5d4, 6d4,
|
|
* 8d4, 1d5, 1.5d5, 2d5, 2.5d5 /
|
|
|
|
DATA ((COLSTR(I,J),J=1,21),I=1,16) /
|
|
C J=1,21 corresponds to (NI,NJ)={(1,2),(1,3),...,(1,NL),(2,3),...}
|
|
C where NL=7 (higher n covered in Table)
|
|
C I=1,16 corresponds to T={2.5e3,5e3,7.5e3,1e4,1.5e4,2e4,2.5e4,3e4,
|
|
C 4e4,5e4,6e4,8e4,1e5,1.5e5,2e5,2.5e5}
|
|
* 6.40d-1, 2.20d-1, 9.93d-2, 4.92d-2, 2.97d-2, 5.03d-2, 2.35d+1,
|
|
* 1.07d+1, 5.22d+0, 2.91d+0, 5.25d+0, 1.50d+2, 7.89d+1, 4.13d+1,
|
|
* 7.60d+1, 5.90d+2, 2.94d+2, 4.79d+2, 1.93d+3, 1.95d+3, 6.81d+3,
|
|
|
|
* 6.98d-1, 2.40d-1, 1.02d-1, 5.84d-2, 4.66d-2, 6.72d-2, 2.78d+1,
|
|
* 1.15d+1, 5.90d+0, 4.53d+0, 7.26d+0, 1.90d+2, 9.01d+1, 6.11d+1,
|
|
* 1.07d+2, 8.17d+2, 4.21d+2, 7.06d+2, 2.91d+3, 3.24d+3, 1.17d+4,
|
|
|
|
* 7.57d-1, 2.50d-1, 1.10d-1, 7.17d-2, 6.28d-2, 7.86d-2, 3.09d+1,
|
|
* 1.23d+1, 6.96d+0, 6.06d+0, 8.47d+0, 2.28d+2, 1.07d+2, 8.21d+1,
|
|
* 1.25d+2, 1.07d+3, 5.78d+2, 8.56d+2, 4.00d+3, 4.20d+3, 1.50d+4,
|
|
|
|
* 8.09d-1, 2.61d-1, 1.22d-1, 8.58d-2, 7.68d-2, 8.74d-2, 3.38d+1,
|
|
* 1.34d+1, 8.15d+0, 7.32d+0, 9.27d+0, 2.70d+2, 1.26d+2, 1.01d+2,
|
|
* 1.37d+2, 1.35d+3, 7.36d+2, 9.66d+2, 5.04d+3, 4.95d+3, 1.73d+4,
|
|
|
|
* 8.97d-1, 2.88d-1, 1.51d-1, 1.12d-1, 9.82d-2, 1.00d-1, 4.01d+1,
|
|
* 1.62d+1, 1.04d+1, 9.17d+0, 1.03d+1, 3.64d+2, 1.66d+2, 1.31d+2,
|
|
* 1.52d+2, 1.93d+3, 1.02d+3, 1.11d+3, 6.81d+3, 6.02d+3, 2.03d+4,
|
|
|
|
* 9.78d-1, 3.22d-1, 1.80d-1, 1.33d-1, 1.14d-1, 1.10d-1, 4.71d+1,
|
|
* 1.90d+1, 1.23d+1, 1.05d+1, 1.08d+1, 4.66d+2, 2.03d+2, 1.54d+2,
|
|
* 1.61d+2, 2.47d+3, 1.26d+3, 1.21d+3, 8.20d+3, 6.76d+3, 2.21d+4,
|
|
|
|
* 1.06d+0, 3.59d-1, 2.06d-1, 1.50d-1, 1.25d-1, 1.16d-1, 5.45d+1,
|
|
* 2.18d+1, 1.39d+1, 1.14d+1, 1.12d+1, 5.70d+2, 2.37d+2, 1.72d+2,
|
|
* 1.68d+2, 2.96d+3, 1.46d+3, 1.29d+3, 9.29d+3, 7.29d+3, 2.33d+4,
|
|
|
|
* 1.15d+0, 3.96d-1, 2.28d-1, 1.64d-1, 1.33d-1, 1.21d-1, 6.20d+1,
|
|
* 2.44d+1, 1.52d+1, 1.21d+1, 1.14d+1, 6.72d+2, 2.68d+2, 1.86d+2,
|
|
* 1.72d+2, 3.40d+3, 1.64d+3, 1.34d+3, 1.02d+4, 7.70d+3, 2.41d+4,
|
|
|
|
* 1.32d+0, 4.64d-1, 2.66d-1, 1.85d-1, 1.45d-1, 1.27d-1, 7.71d+1,
|
|
* 2.89d+1, 1.74d+1, 1.31d+1, 1.17d+1, 8.66d+2, 3.19d+2, 2.08d+2,
|
|
* 1.78d+2, 4.14d+3, 1.92d+3, 1.41d+3, 1.15d+4, 8.26d+3, 2.52d+4,
|
|
|
|
* 1.51d+0, 5.26d-1, 2.95d-1, 2.01d-1, 1.53d-1, 1.31d-1, 9.14d+1,
|
|
* 3.27d+1, 1.90d+1, 1.38d+1, 1.18d+1, 1.04d+3, 3.62d+2, 2.24d+2,
|
|
* 1.81d+2, 4.75d+3, 2.15d+3, 1.46d+3, 1.26d+4, 8.63d+3, 2.60d+4,
|
|
|
|
* 1.68d+0, 5.79d-1, 3.18d-1, 2.12d-1, 1.58d-1, 1.34d-1, 1.05d+2,
|
|
* 3.60d+1, 2.03d+1, 1.44d+1, 1.19d+1, 1.19d+3, 3.98d+2, 2.36d+2,
|
|
* 1.83d+2, 5.25d+3, 2.33d+3, 1.50d+3, 1.34d+4, 8.88d+3, 2.69d+4,
|
|
|
|
* 2.02d+0, 6.70d-1, 3.55d-1, 2.29d-1, 1.65d-1, 1.35d-1, 1.29d+2,
|
|
* 4.14d+1, 2.23d+1, 1.51d+1, 1.19d+1, 1.46d+3, 4.53d+2, 2.53d+2,
|
|
* 1.85d+2, 6.08d+3, 2.61d+3, 1.55d+3, 1.49d+4, 9.21d+3, 2.90d+4,
|
|
|
|
* 2.33d+0, 7.43d-1, 3.83d-1, 2.39d-1, 1.70d-1, 1.37d-1, 1.51d+2,
|
|
* 4.56d+1, 2.37d+1, 1.56d+1, 1.20d+1, 1.67d+3, 4.95d+2, 2.65d+2,
|
|
* 1.86d+2, 6.76d+3, 2.81d+3, 1.57d+3, 1.63d+4, 9.43d+3, 3.17d+4,
|
|
|
|
* 2.97d+0, 8.80d-1, 4.30d-1, 2.59d-1, 1.77d-1, 1.39d-1, 1.93d+2,
|
|
* 5.31d+1, 2.61d+1, 1.63d+1, 1.19d+1, 2.08d+3, 5.68d+2, 2.83d+2,
|
|
* 1.87d+2, 8.08d+3, 3.15d+3, 1.61d+3, 1.97d+4, 9.78d+3, 3.94d+4,
|
|
|
|
* 3.50d+0, 9.79d-1, 4.63d-1, 2.71d-1, 1.82d-1, 1.39d-1, 2.26d+2,
|
|
* 5.83d+1, 2.78d+1, 1.68d+1, 1.19d+1, 2.39d+3, 6.16d+2, 2.94d+2,
|
|
* 1.86d+2, 9.13d+3, 3.36d+3, 1.62d+3, 2.27d+4, 1.00d+4, 4.73d+4,
|
|
|
|
* 3.95d+0, 1.06d+0, 4.88d-1, 2.81d-1, 1.85d-1, 1.40d-1, 2.52d+2,
|
|
* 6.23d+1, 2.89d+1, 1.71d+1, 1.19d+1, 2.62d+3, 6.51d+2, 3.02d+2,
|
|
* 1.87d+2, 1.00d+4, 3.51d+3, 1.63d+3, 2.54d+4, 1.02d+4, 5.50d+4 /
|
|
|
|
NL=7
|
|
IERR=0
|
|
COL=0.0d0
|
|
|
|
IF (T.LT.2.5d3.OR.T.GE.2.5d5) IERR=1
|
|
IF (NI.LT.1.OR.NI.GT.NL-1.OR.NJ.LT.2.OR.NJ.GT.NL) IERR=2
|
|
|
|
IF (IERR.EQ.0) THEN
|
|
J=0
|
|
DO I=1,NI-1
|
|
J=J+(NL-I)
|
|
END DO
|
|
DO K=I+1,NJ
|
|
J=J+1
|
|
END DO
|
|
|
|
C find out nearest points in TREF
|
|
|
|
ILOW=1
|
|
DO WHILE (T.GE.TREF(ILOW+1))
|
|
ILOW=ILOW+1
|
|
END DO
|
|
|
|
IHIG=16
|
|
DO WHILE (T.LT.TREF(IHIG-1))
|
|
IHIG=IHIG-1
|
|
END DO
|
|
|
|
IF (IHIG.EQ.ILOW) IHIG=IHIG+1
|
|
|
|
C interpolate linearly (log-log) the collision strength
|
|
|
|
SL=LOG10(COLSTR(IHIG,J))-LOG10(COLSTR(ILOW,J))
|
|
SL=SL/(LOG10(TREF(IHIG))-LOG10(TREF(ILOW)))
|
|
OR=LOG10(COLSTR(IHIG,J))-SL*LOG10(TREF(IHIG))
|
|
COL=LOG10(T)*SL+OR
|
|
COL=10.**COL
|
|
|
|
C derive the rate
|
|
|
|
COL=8.631d-6/(2.d0*NI**2)/SQRT(T)*EXP(-U0)*COL
|
|
END IF
|
|
|
|
RETURN
|
|
END
|
|
|
|
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE COLHE(T,COL)
|
|
C =======================
|
|
C
|
|
C Helium (both neutral and ionized) collision rates
|
|
C
|
|
C Meaning of ICOL: for all kinds of transitions and for both HeI
|
|
C and HeII:
|
|
C ICOL = 0 - approximate expressions taken from Mihalas, Heasley
|
|
C and Auer, NCAR-TN/STR-104 (1975) - for He I and II
|
|
C
|
|
C New expression for He II collisional ionization from Klaus Werner
|
|
C (ICOL >= 1) (also originally from Mihalas)
|
|
C
|
|
C For He I bound-bound transitions, the following standard
|
|
C possibilities are also available:
|
|
C
|
|
C ICOL = 1, 2, or 3 - much more accurate Storey's rates,
|
|
C subroutine written by D.G.Hummer (COLLHE).
|
|
C This procedure can be used only for transitions
|
|
C between states with n = 1, 2, 3, 4.
|
|
C ICOL = 1 - means that a given transition is a transition
|
|
C between non-averaged (l,s) states. In this case,
|
|
C labeling of the He I energy levels must agree
|
|
C with that given in subroutine COLLHE, ie. states
|
|
C have to be labeled sequentially in order of
|
|
C increasing frequency.
|
|
C ICOL = 2 - means that a given transition is a transition between
|
|
C a non-averaged (l,s) lower state and averaged upper
|
|
C state.
|
|
C ICOL = 3 - means that a given transition is a transition between
|
|
C two averaged states.
|
|
C Note:
|
|
C The program allows only two standard possibilities of
|
|
C constructing averaged levels of He I:
|
|
C i) all states within given principal quantum number n (>1) are
|
|
C lumped together
|
|
C ii) all siglet states for given n, and all triplet states for
|
|
C given n are lumped together separately (there are thus two
|
|
C explicit levels for a given n).
|
|
C If the user wants to use another averaging, he had to take care
|
|
C of appropriate averaged collisional rates himself (by updating
|
|
C subroutine CSPEC)
|
|
C
|
|
C
|
|
C ICOL < 0 - non-standard, user supplied formula
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
DIMENSION COL(MTRANS)
|
|
DIMENSION FHE1(16),G0(3),G1(3),G2(3),G3(3),A(6,10)
|
|
PARAMETER (EXPIA1=-0.57721566,EXPIA2=0.99999193,
|
|
* EXPIA3=-0.24991055,EXPIA4=0.05519968,
|
|
* EXPIA5=-0.00976004,EXPIA6=0.00107857,
|
|
* EXPIB1=0.2677734343,EXPIB2=8.6347608925,
|
|
* EXPIB3=18.059016973,EXPIB4=8.5733287401,
|
|
* EXPIC1=3.9584969228,EXPIC2=21.0996530827,
|
|
* EXPIC3=25.6329561486,EXPIC4=9.5733223454)
|
|
DATA FHE1/0.,2.75D-1,7.29D-2,2.96D-2,1.48 D-2,8.5D-3,5.3D-3,
|
|
* 3.5D-3,2.5D-3,1.8D-3,1.5D-3,1.2D-3,9.4D-4,7.5D-4,
|
|
* 6.1D-4,5.3D-4/
|
|
DATA G0/ 7.3399521D-2, 1.7252867, 8.6335087 /,
|
|
* G1/-1.4592763D-7, 2.0944117D-6, 2.7575544D-5 /,
|
|
* G2/ 7.6621299D5, 5.4254879D6, 6.6395519D6 /,
|
|
* G3/ 2.3775439D2, 2.2177891D3, 5.20725D3 /
|
|
DATA ((A(I,J),J=1,10),I=1,6) /
|
|
* -8.5931587 , 85.014091 , 923.64099, 2018.6470, 1551.5061 ,
|
|
* -2327.4819 ,-10701.481 ,-27619.789,-41099.602,-61599.023 ,
|
|
* 9.3868790 ,-78.834488 ,-969.18451,-2243.1768,-2059.9768 ,
|
|
* 1546.7107 , 9834.3447 , 27067.436, 41421.254, 63594.133 ,
|
|
* -4.0027571 , 28.360615 , 401.23965, 983.83374, 1051.4103 ,
|
|
* -204.82320 ,-3335.4211 ,-10100.119,-15863.257,-24949.125 ,
|
|
* 0.83941799 ,-4.7963457 ,-81.122566,-209.86169,-251.30855 ,
|
|
* -43.175175 , 530.37292 , 1826.1049, 2941.6460, 4740.8364 ,
|
|
* -.86396709E-01,0.37385577 , 8.0078983, 21.757591, 28.375637 ,
|
|
* 11.890312 ,-39.536087 ,-161.52513,-266.86011,-440.88257 ,
|
|
* 0.34853835E-02,-.10401310E-01,-.30957383,-.87988985,-1.2254572 ,
|
|
* -.72724497 , 1.0879648 , 5.6239786, 9.5323009, 16.150818 /
|
|
SAVE FHE1,G0,G1,G2,G3
|
|
C
|
|
HKT=HK/T
|
|
TK=HKT/H
|
|
SRT=SQRT(T)
|
|
t0=t
|
|
CT=5.465D-11*SRT
|
|
CT1=5.4499487/T/SRT
|
|
C
|
|
C --------------
|
|
C Neutral helium
|
|
C --------------
|
|
C
|
|
IF(IELHE1.EQ.0) GO TO 60
|
|
ICALL=0
|
|
N0I=NFIRST(IELHE1)
|
|
N1I=NLAST(IELHE1)
|
|
NKI=NNEXT(IELHE1)
|
|
N0Q=NQUANT(NLAST(IELHE1))+1
|
|
N1Q=ICUP(IELHE1)
|
|
DO 50 II=N0I,N1I
|
|
IT=ITRA(II,NKI)
|
|
IF(IT.EQ.0) GO TO 10
|
|
C
|
|
C ******** Collisional ionization
|
|
C
|
|
IC=ICOL(IT)
|
|
C1=OSC0(IT)
|
|
C2=CPAR(IT)
|
|
U0=ENION(II)*TK
|
|
IF(IC.GE.0) THEN
|
|
U1=U0+0.27
|
|
U2=(U0+3.43)/(U0+1.43)**3
|
|
IF(U0.LE.UN) THEN
|
|
EXPIU0=-LOG(U0)+EXPIA1+U0*(EXPIA2+U0*(EXPIA3+U0*(EXPIA4+
|
|
* U0*(EXPIA5+U0*EXPIA6))))
|
|
ELSE
|
|
EXPIU0=EXP(-U0)*((EXPIB1+U0*(EXPIB2+U0*(EXPIB3+
|
|
* U0*(EXPIB4+U0))))/(EXPIC1+U0*(EXPIC2+
|
|
* U0*(EXPIC3+U0*(EXPIC4+U0)))))/U0
|
|
END IF
|
|
IF(U1.LE.UN) THEN
|
|
EXPIU1=-LOG(U1)+EXPIA1+U1*(EXPIA2+U1*(EXPIA3+U1*(EXPIA4+
|
|
* U1*(EXPIA5+U1*EXPIA6))))
|
|
ELSE
|
|
EXPIU1=EXP(-U1)*((EXPIB1+U1*(EXPIB2+U1*(EXPIB3+
|
|
* U1*(EXPIB4+U1))))/(EXPIC1+U1*(EXPIC2+
|
|
* U1*(EXPIC3+U1*(EXPIC4+U1)))))/U1
|
|
END IF
|
|
COL(IT)=CT*C1*U0*(EXPIU0-U0*(0.728*EXPIU1/U1+
|
|
* 0.189*EXP(-U0)*U2))
|
|
ELSE
|
|
CALL CSPEC(II,NKI,IC,C1,C2,U0,T,COL(IT))
|
|
END IF
|
|
10 IF(II.GE.N1I) GO TO 30
|
|
C
|
|
C ********* Collisional excitation
|
|
C
|
|
DO 20 JJ=II+1,N1I
|
|
ICT=ITRA(II,JJ)
|
|
IF(ICT.EQ.0) GO TO 20
|
|
IC=ICOL(ICT)
|
|
C1=OSC0(ICT)
|
|
C2=CPAR(ICT)
|
|
U0=FR0(ICT)*HKT
|
|
IF(IC.EQ.0) THEN
|
|
C
|
|
C *** ICOL = 0 Formula used by Mihalas, Heasley, and Auer
|
|
C
|
|
IF(U0.LE.UN) THEN
|
|
EX=-LOG(U0)+EXPIA1+U0*(EXPIA2+U0*(EXPIA3+U0*(EXPIA4+
|
|
* U0*(EXPIA5+U0*EXPIA6))))
|
|
ELSE
|
|
EX=EXP(-U0)*((EXPIB1+U0*(EXPIB2+U0*(EXPIB3+
|
|
* U0*(EXPIB4+U0))))/(EXPIC1+U0*(EXPIC2+
|
|
* U0*(EXPIC3+U0*(EXPIC4+U0)))))/U0
|
|
END IF
|
|
IF(II.EQ.N0I) THEN
|
|
C
|
|
C excitation from the ground state
|
|
C
|
|
COL(ICT)=CT1*EX/U0*C1
|
|
ELSE
|
|
C
|
|
C transitions between excited states
|
|
C
|
|
U1=U0+0.2
|
|
IF(U1.LE.UN) THEN
|
|
EXPIU1=-LOG(U1)+EXPIA1+U1*(EXPIA2+U1*(EXPIA3+U1*(EXPIA4+
|
|
* U1*(EXPIA5+U1*EXPIA6))))
|
|
ELSE
|
|
EXPIU1=EXP(-U1)*((EXPIB1+U1*(EXPIB2+U1*(EXPIB3+
|
|
* U1*(EXPIB4+U1))))/(EXPIC1+U1*(EXPIC2+
|
|
* U1*(EXPIC3+U1*(EXPIC4+U1)))))/U1
|
|
END IF
|
|
COL(ICT)=CT1/U0*(EX-U0/U1*0.81873*EXPIU1)*C1
|
|
END IF
|
|
ELSE IF(IC.EQ.1) THEN
|
|
C
|
|
C *** ICOL = 1 Storey - Hummer collisional rates between
|
|
C non-averaged states
|
|
C (Note: procedure COLLHE, which calculates all rates,
|
|
C is called only once)
|
|
C
|
|
IF(ICALL.EQ.0) CALL COLLHE(T,COLHE1)
|
|
ICALL=1
|
|
COL(ICT)=COLHE1(II-N0I+1,JJ-N0I+1)
|
|
ELSE IF(IC.EQ.2.OR.IC.EQ.3) THEN
|
|
C
|
|
C *** ICOL = 2 or 3 Storey - Hummer collisional rates between
|
|
C averaged states
|
|
C
|
|
IF(ICALL.EQ.0) CALL COLLHE(T,COLHE1)
|
|
ICALL=1
|
|
COL(ICT)=CHEAV(II,JJ,IC)
|
|
ELSE IF(IC.LT.0) THEN
|
|
C
|
|
C Non-standard, user supplied formula
|
|
C
|
|
CALL CSPEC(II,JJ,IC,C1,CPAR(ICT),U0,T,COL(ICT))
|
|
END IF
|
|
20 CONTINUE
|
|
C
|
|
C collisional excitations from level II to higher, non-explicit
|
|
C levels are lumped into the collisional ionization rate
|
|
C (the so-called modified collision ionization rate);
|
|
C the individual rates are calculated by expressions used by
|
|
C Mihalas, Heasley, and Auer
|
|
C
|
|
30 IF(N1Q.EQ.0.OR.IT.EQ.0) GO TO 50
|
|
I=NQUANT(II)
|
|
REL=G(II)/2./I/I
|
|
DO 40 J=N0Q,N1Q
|
|
XJ=J
|
|
U0=(ENION(II)-EH/XJ/XJ)*TK
|
|
IF(I.EQ.1) THEN
|
|
GAM=0.
|
|
C1=FHE1(J)
|
|
ELSE
|
|
C1=OSH(I,J)*REL
|
|
U1=U0+0.2
|
|
IF(U1.LE.UN) THEN
|
|
EXPIU1=-LOG(U1)+EXPIA1+U1*(EXPIA2+U1*(EXPIA3+U1*(EXPIA4+
|
|
* U1*(EXPIA5+U1*EXPIA6))))
|
|
ELSE
|
|
EXPIU1=EXP(-U1)*((EXPIB1+U1*(EXPIB2+U1*(EXPIB3+
|
|
* U1*(EXPIB4+U1))))/(EXPIC1+U1*(EXPIC2+
|
|
* U1*(EXPIC3+U1*(EXPIC4+U1)))))/U1
|
|
END IF
|
|
GAM=U0/U1*0.81873*EXPIU1
|
|
END IF
|
|
IF(U0.LE.UN) THEN
|
|
EXPIU0=-LOG(U0)+EXPIA1+U0*(EXPIA2+U0*(EXPIA3+U0*(EXPIA4+
|
|
* U0*(EXPIA5+U0*EXPIA6))))
|
|
ELSE
|
|
EXPIU0=EXP(-U0)*((EXPIB1+U0*(EXPIB2+U0*(EXPIB3+
|
|
* U0*(EXPIB4+U0))))/(EXPIC1+U0*(EXPIC2+
|
|
* U0*(EXPIC3+U0*(EXPIC4+U0)))))/U0
|
|
END IF
|
|
COL(IT)=COL(IT)+CT1/U0*C1*(EXPIU0-GAM)
|
|
40 CONTINUE
|
|
50 CONTINUE
|
|
C
|
|
C --------------
|
|
C Ionized helium
|
|
C --------------
|
|
C
|
|
60 IF(IELHE2.EQ.0) RETURN
|
|
N0I=NFIRST(IELHE2)
|
|
N1I=NLAST(IELHE2)
|
|
NKI=NNEXT(IELHE2)
|
|
N0Q=NQUANT(NLAST(IELHE2))+1
|
|
N1Q=ICUP(IELHE2)
|
|
X=LOG10(T)
|
|
X2=X*X
|
|
X3=X2*X
|
|
X4=X3*X
|
|
X5=X4*X
|
|
CT2=3.7036489/T/SRT
|
|
C
|
|
DO 200 II=N0I,N1I
|
|
I=II-N0I+1
|
|
IT=ITRA(II,NKI)
|
|
IF(IT.EQ.0) GO TO 100
|
|
C
|
|
C ********* Collisional ionization
|
|
C
|
|
c for high temperature, use XSTAR formulae
|
|
C
|
|
if(t0.gt.1.e5) then
|
|
rno=16.
|
|
izc=2
|
|
call irc(i,t0,izc,rno,cs)
|
|
col(it)=cs
|
|
go to 100
|
|
end if
|
|
C
|
|
IC=ICOL(IT)
|
|
U0=FR0(IT)*HKT
|
|
IF(IC.EQ.0) THEN
|
|
IF(I.LE.3) THEN
|
|
GAM=G0(I)-G1(I)*T+(G2(I)/T-G3(I))/T
|
|
ELSE IF(I.EQ.4) THEN
|
|
GAM=-95.23828+(62.656249-8.1454078*X)*X
|
|
ELSE IF(I.EQ.5) THEN
|
|
GAM=472.99219-74.144287*X-1869.6562/X2
|
|
ELSE IF(I.EQ.6) THEN
|
|
GAM=825.17186-134.23096*X-2739.4375/X2
|
|
ELSE IF(I.EQ.7) THEN
|
|
GAM=1181.3516-200.71191*X-2810.7812/X2
|
|
ELSE IF(I.EQ.8) THEN
|
|
GAM=1440.1016-259.75781*X-1283.5625/X2
|
|
ELSE IF(I.EQ.9) THEN
|
|
GAM=2492.1250-624.84375*X+30.101562*X2
|
|
ELSE IF(I.EQ.10) THEN
|
|
GAM=4663.3129-1390.1250*X+97.671874*X2
|
|
ELSE
|
|
GAM=I*I*I
|
|
END IF
|
|
COL(IT)=CT*EXP(-U0)*GAM
|
|
ELSE IF(IC.GE.1) THEN
|
|
GAM=I*I*I
|
|
IF(I.LE.10) GAM=A(1,I)+A(2,I)*X+A(3,I)*X2+
|
|
* A(4,I)*X3+A(5,I)*X4+A(6,I)*X5
|
|
COL(IT)=CT*EXP(-U0)*GAM
|
|
ELSE
|
|
CALL CSPEC(II,NKI,IC,OSC0(IT),CPAR(IT),U0,T,COL(IT))
|
|
END IF
|
|
C
|
|
100 I1=I+1
|
|
XI=I
|
|
VI=XI*XI
|
|
NHL=N1I-N0I+1
|
|
IF(N1Q.GT.0) NHL=N1Q
|
|
IF(I1.GT.NHL) GO TO 200
|
|
C
|
|
C ********** collisional excitation
|
|
C
|
|
C both explicit transitions as well as contributions to the
|
|
C modified collisional ionization rate
|
|
C
|
|
DO 150 J=I1,NHL
|
|
JJ=J+N0I-1
|
|
IC=0
|
|
IF(JJ.GT.N1I) GO TO 110
|
|
ICT=ITRA(II,JJ)
|
|
IF(ICT.EQ.0) GO TO 150
|
|
IC=ICOL(ICT)
|
|
110 XJ=J
|
|
VJ=XJ*XJ
|
|
U0=ENION(N0I)*(1./VI-1./VJ)*TK
|
|
IF(J.LE.20) C1=OSH(I,J)
|
|
IF(J.GT.20) C1=OSH(I,20)*(20./XJ)**3
|
|
IF(IC.LT.0) GO TO 120
|
|
GAM=XI-(XI-1.)/(XJ-XI)
|
|
IF(GAM.GT.XJ-XI) GAM=XJ-XI
|
|
IF(I.GT.1) GAM=GAM*1.1
|
|
IF(U0.LE.UN) THEN
|
|
EXPIU0=-LOG(U0)+EXPIA1+U0*(EXPIA2+U0*(EXPIA3+U0*(EXPIA4+
|
|
* U0*(EXPIA5+U0*EXPIA6))))
|
|
ELSE
|
|
EXPIU0=EXP(-U0)*((EXPIB1+U0*(EXPIB2+U0*(EXPIB3+
|
|
* U0*(EXPIB4+U0))))/(EXPIC1+U0*(EXPIC2+
|
|
* U0*(EXPIC3+U0*(EXPIC4+U0)))))/U0
|
|
END IF
|
|
CS=CT2/U0*C1*(0.693*EXP(-U0)+EXPIU0)*GAM
|
|
GO TO 130
|
|
120 CALL CSPEC(II,JJ,IC,C1,CPAR(ICT),U0,T,COL(ICT))
|
|
GO TO 150
|
|
130 IF(JJ.GT.N1I) GO TO 140
|
|
COL(ICT)=CS
|
|
GO TO 150
|
|
140 IF(IT.NE.0) COL(IT)=COL(IT)+CS
|
|
150 CONTINUE
|
|
200 CONTINUE
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION CEH12(T)
|
|
C =================
|
|
C
|
|
C Special formula for collisional rate in hydrogen Lyman-alpha
|
|
C transition
|
|
C After Crandall et al. Ap.J. 191, 789 (1974)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
DIMENSION A(6),B(8)
|
|
PARAMETER (C=-118353.41)
|
|
DATA A/ 2.579997D-10, -1.629166D-10, 7.713069D-11,
|
|
* -2.668768D-11, 6.642513D-12, -9.422885D-13/
|
|
SAVE A
|
|
c
|
|
DO I=1,8
|
|
B(I)=0.
|
|
END DO
|
|
X=LOG10(T)-4.
|
|
DO I=1,6
|
|
J=7-I
|
|
B(J)=2.*X*B(J+1)-B(J+2)+A(J)
|
|
END DO
|
|
CEH12=2.4*SQRT(T)*(B(1)-B(3))*EXP(C/T)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE CSPEC(I,J,IC,OS,CP,U0,T,CS)
|
|
C ======================================
|
|
C
|
|
C Non-standard evaluation of collision rates
|
|
C Basically user-supplied procedure; here is an example
|
|
C
|
|
C Van Regemorter's formula following the recommendations of
|
|
C Mihalas (1978, Stellar Atmospheres, 2nd edition)
|
|
C IC=-1 for neutrals
|
|
C IC=-2 for ions
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
DIMENSION CHE1FB(3,4)
|
|
DATA CHE1FB/ 9.63675,-2.22941,-17.30103,
|
|
* 10.85578,-2.40931,-27.00903,
|
|
* 8.38043,-2.04791,-7.36621,
|
|
* 6.95825,-2.01967,-5.98779/
|
|
PARAMETER (EXPIA1=-0.57721566,EXPIA2=0.99999193,
|
|
* EXPIA3=-0.24991055,EXPIA4=0.05519968,
|
|
* EXPIA5=-0.00976004,EXPIA6=0.00107857,
|
|
* EXPIB1=0.2677734343,EXPIB2=8.6347608925,
|
|
* EXPIB3=18.059016973,EXPIB4=8.5733287401,
|
|
* EXPIC1=3.9584969228,EXPIC2=21.0996530827,
|
|
* EXPIC3=25.6329561486,EXPIC4=9.5733223454)
|
|
|
|
CS=0.
|
|
|
|
IF(IC.GT.-10) THEN
|
|
|
|
IF(U0.LE.UN) THEN
|
|
EXPIU0=-LOG(U0)+EXPIA1+U0*(EXPIA2+U0*(EXPIA3+U0*(EXPIA4+
|
|
* U0*(EXPIA5+U0*EXPIA6))))
|
|
ELSE
|
|
EXPIU0=EXP(-U0)*((EXPIB1+U0*(EXPIB2+U0*(EXPIB3+
|
|
* U0*(EXPIB4+U0))))/(EXPIC1+U0*(EXPIC2+
|
|
* U0*(EXPIC3+U0*(EXPIC4+U0)))))/U0
|
|
END IF
|
|
|
|
CCCCCC Neutrals (See Auer & Mihalas 1973)
|
|
IF(IC.EQ.-1) THEN
|
|
|
|
IF(U0.LE.14.) THEN
|
|
GG=0.276*EXP(U0)*EXPIU0
|
|
ELSE
|
|
GG=0.066*(1.+1.5/U0)/SQRT(U0)
|
|
ENDIF
|
|
|
|
CCCCCC Ions (See Mihalas 1972)
|
|
ELSE IF(IC.EQ.-2) THEN
|
|
|
|
GG0=0.276*EXP(U0)*EXPIU0
|
|
GG=CP
|
|
IF(GG0.GT.CP) GG=GG0
|
|
|
|
END IF
|
|
T32=T**(-1.5)
|
|
CS=CS+19.7363*T32*EXP(-U0)/U0*GG*OS
|
|
|
|
RETURN
|
|
END IF
|
|
C
|
|
IF(IC.EQ.-11) THEN
|
|
XR=-1.68D0
|
|
CS=CS+2.16*U0**XR/T/SQRT(T)*EXP(-U0)*OS
|
|
C
|
|
C Forbidden transitions between n=2 He I sublevels
|
|
C (from Klaus Werner)
|
|
C
|
|
ELSE IF(IC.EQ.-12) THEN
|
|
N0I=NFIRST(IELHE1)
|
|
I=I-N0I+1
|
|
J=J-N0I+1
|
|
IFORB=0
|
|
IF(I.EQ.2 .AND. J.EQ.3) IFORB=1
|
|
IF(I.EQ.2 .AND. J.EQ.5) IFORB=2
|
|
IF(I.EQ.3 .AND. J.EQ.4) IFORB=3
|
|
IF(I.EQ.4 .AND. J.EQ.5) IFORB=4
|
|
IF(IFORB.EQ.0) CALL QUIT(' Inconsistent ICOL - CSPEC',iforb,0)
|
|
XT=LOG10(T)
|
|
GAM=CHE1FB(1,IFORB)+CHE1FB(2,IFORB)*XT+CHE1FB(3,IFORB)/XT/XT
|
|
GAM=EXP(2.30258509299405*GAM)
|
|
CS=CS+5.465D-11*SQRT(T)*EXP(-U0)*GAM
|
|
|
|
END IF
|
|
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE COLLHE(TEMP,COLHE1)
|
|
C ==============================
|
|
C
|
|
C GENERATES COLLISIONAL RATE COEFFICIENTS AMONG THE 19 STATES OF
|
|
C HELIUM WITH N = 1, 2, 3, AND 4, USING RATES EVALUATED FROM THE
|
|
C CROSS SECTIONS CALCULATED BY BERRINGTON AND KINGSTON (J. PHYS.B. 20,
|
|
C 6631(1987)). COLLISIONAL RATE COEFFICIENTS HAVE BEEN EVALUATED
|
|
C NUMERICALLY BY P.J.STOREY FROM THE UNPUBLISHED COMPUTER OUTPUT
|
|
C FILES OF BERRINGTON AND KINGSTON.
|
|
C
|
|
C THE STATES INCLUDED IN THE CALCULATION ARE LABELLED SEQUENTIALLY
|
|
C IN ORDER OF INCREASING ENERGY:
|
|
C 1 1 SING S
|
|
C 2 2 TRIP S
|
|
C 3 2 SING S
|
|
C 4 2 TRIP P
|
|
C 5 2 SING P
|
|
C 6 3 TRIP S
|
|
C 7 3 SING S
|
|
C 8 3 TRIP P
|
|
C 9 3 TRIP D
|
|
C 10 3 SING D
|
|
C 11 3 SING P
|
|
C 12 4 TRIP S
|
|
C 13 4 SING S
|
|
C 14 4 TRIP P
|
|
C 15 4 TRIP D
|
|
C 16 4 SING D
|
|
C 17 4 TRIP F
|
|
C 18 4 SING F
|
|
C 19 4 SING P
|
|
C
|
|
C THIS ORDERING DIFFERS SLIGHTLY FROM THAT OF BERRINGTON AND KINGSTON,
|
|
C IN WHICH 15 AND 16, AND 17 AND 18, WERE INTERCHANGED.
|
|
C
|
|
C THE INTRINSIC ACCURACY OF TRANSITIONS AMONG STATES WITH N = 1, 2,
|
|
C AND 3 IS EXPECTED TO BE CONSIDERABLY BETTER THAN THOSE WITH N = 4
|
|
C AS DISCUSSED BY BERRINGTON AND KINGSTON. THE FITTING ACCURACY IS
|
|
C EVERYWHERE BETTER THAN 2%. THE ENERGIES OF THE LEVELS ARE TAKEN
|
|
C FROM W. C. MARTIN, PHYS. CHEM. REF. DATA., VOL.2, 257 (1973) AND
|
|
C ARE GIVEN IN ELECTRON VOLTS. (BOLTZMANN'S CONSTANT = 8.62E-5)
|
|
C
|
|
C FIRST REVISED VERSION: D.G.HUMMER, MAY 1988, JILA
|
|
C slightly modified by I.H., July 1988
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
PARAMETER (UN=1.D0,
|
|
* C1=3.849485D0,
|
|
* C2=8.49485002D-1,
|
|
* N=19)
|
|
DIMENSION ENER(19),COLHE1(19,19),
|
|
* NSTART(172),A(929),B(10),STWT(19)
|
|
C
|
|
DATA ENER/ 0.0D0,19.8198D0,20.6160D0,20.96432D0,21.2182D0,
|
|
.22.7187D0,22.9206D0,23.00731D0,23.0739D0,23.0743D0,23.0873D0,
|
|
.23.5942D0,23.6738D0,23.7081D0,23.7363D0,23.7366D0,23.7373D0,
|
|
.23.7373D0,23.7423D0/
|
|
C
|
|
DATA STWT/1.0D0,3.0D0,1.0D0,9.0D0,3.0D0,3.0D0,1.0D0,9.0D0,
|
|
.1.5D1,5.0D0,3.0D0,3.0D0,1.0D0,9.0D0,1.5D1,5.0D0,2.1D1,
|
|
.7.0D0,3.0D0/
|
|
C
|
|
DATA NSTART/
|
|
. 1, 6, 11, 16, 20, 28, 32, 40, 44, 52, 57, 62, 67, 72, 77, 82,
|
|
. 88, 92, 98,104,110,114,120,125,129,135,139,147,151,157,164,170,
|
|
.177,183,190,195,202,208,213,220,225,232,236,243,247,251,260,266,
|
|
.273,278,285,290,300,304,309,316,320,324,329,333,338,343,347,352,
|
|
.357,362,367,372,376,382,386,391,395,401,405,410,414,421,425,431,
|
|
.435,440,445,449,454,459,465,470,475,480,487,491,497,503,508,515,
|
|
.520,525,530,536,542,547,552,559,564,571,576,581,587,592,598,603,
|
|
.608,613,617,623,630,635,642,646,650,655,660,666,671,677,683,689,
|
|
.695,702,707,713,718,723,728,732,737,741,745,750,754,759,765,771,
|
|
.777,782,789,796,801,805,810,815,819,824,831,837,844,850,856,861,
|
|
.868,873,877,882,890,895,905,909,913,920,925,930/
|
|
C
|
|
DATA (A(I),I=1,95)/
|
|
. 1.7339D-07, 2.7997D-08,-1.3812D-08, 2.6639D-09, 1.7776D-09,
|
|
. 2.9820D-07, 7.5210D-08,-3.5975D-09, 3.2270D-09, 1.5245D-09,
|
|
. 1.5601D-05, 1.5340D-06,-2.2122D-06,-1.1073D-07, 1.9249D-07,
|
|
. 2.3682D-08, 1.0638D-08, 2.0959D-09, 2.8381D-10, 3.0497D-05,
|
|
. 1.9252D-05, 6.3109D-06, 6.9098D-07,-2.8039D-07,-2.1128D-07,
|
|
.-1.2192D-07,-4.4417D-08, 1.3896D-06, 1.5715D-07,-8.4358D-08,
|
|
.-2.8800D-08, 5.9599D-08, 3.4756D-08, 1.2183D-08, 3.7999D-09,
|
|
. 8.5500D-10,-3.9428D-10,-5.3999D-10,-2.2962D-10, 2.2510D-06,
|
|
. 6.1436D-07,-1.2437D-07,-7.1718D-08, 5.9026D-05, 3.8150D-05,
|
|
. 1.1426D-05, 9.2886D-07,-6.4827D-07,-4.4270D-07,-1.8611D-07,
|
|
.-5.6403D-08, 5.8752D-06, 2.5167D-06, 2.0787D-07,-2.3353D-07,
|
|
.-8.9900D-08, 5.6334D-08, 2.9313D-09, 1.7775D-09, 5.5494D-10,
|
|
.-5.8914D-10, 8.1939D-06, 2.4014D-07, 3.8681D-07, 2.8446D-07,
|
|
.-6.1936D-08, 1.8173D-06,-4.7530D-07,-6.6432D-08, 5.4898D-08,
|
|
.-1.2377D-08, 2.0732D-05, 6.5991D-07, 1.5840D-06, 4.9920D-07,
|
|
.-1.8332D-07, 3.2273D-06,-4.9880D-07,-2.4929D-07, 1.1964D-07,
|
|
.-2.1996D-08, 9.7096D-08, 1.3557D-08, 7.4404D-09, 1.3858D-09,
|
|
.-1.3778D-09,-8.4885D-10, 3.5068D-06,-5.0675D-07,-1.2252D-07,
|
|
. 6.0514D-08, 7.0524D-06, 1.4454D-06, 8.3966D-07, 2.7203D-07/
|
|
DATA (A(I),I=96,190)/
|
|
.-2.3854D-08,-8.6693D-08, 7.1193D-06, 8.3111D-09,-9.3916D-07,
|
|
.-2.7944D-08, 1.7803D-07,-3.9216D-08, 9.2760D-06, 2.4761D-06,
|
|
. 1.0095D-06, 3.4039D-07,-8.6900D-08,-1.1156D-07, 2.5036D-05,
|
|
.-5.7791D-06,-1.8197D-06, 1.0630D-06, 9.8746D-09, 3.1048D-09,
|
|
. 1.2172D-09, 1.8411D-10,-1.5835D-10,-1.4443D-10, 1.9240D-06,
|
|
. 1.5012D-07, 7.9741D-08, 2.9323D-08,-1.2796D-08, 5.0457D-07,
|
|
.-5.5146D-08,-2.7506D-08, 1.4341D-09, 1.3321D-05, 2.6960D-06,
|
|
. 2.8059D-07, 1.7548D-08,-2.3623D-07,-1.4619D-07, 1.5294D-06,
|
|
.-9.4925D-08,-1.1347D-07, 8.1980D-09, 1.3324D-04, 7.8068D-05,
|
|
. 2.9238D-05, 4.2718D-06,-1.6556D-06,-1.4529D-06,-8.6046D-07,
|
|
.-2.1062D-07, 2.8510D-06,-4.7936D-07,-2.4042D-07, 6.2333D-08,
|
|
. 1.3493D-09, 3.5113D-10,-4.7269D-11, 2.4872D-11,-9.7136D-12,
|
|
.-1.4217D-11, 1.5680D-06, 8.9272D-07, 2.8313D-07, 5.2456D-08,
|
|
.-2.3404D-08,-2.7304D-08,-8.4539D-09, 1.7967D-07, 6.2133D-08,
|
|
.-3.2814D-09,-3.7299D-09,-1.9587D-09,-1.6685D-09, 1.2707D-05,
|
|
. 7.5029D-06, 2.8330D-06, 6.7478D-07,-1.5012D-07,-2.3916D-07,
|
|
.-8.9594D-08, 7.6160D-07, 2.0422D-07,-2.5881D-08,-1.7624D-08,
|
|
.-8.3518D-09,-4.1743D-09, 4.6044D-05, 2.2425D-05, 3.3079D-06,
|
|
. 3.6752D-07,-8.4476D-08,-4.8455D-07,-2.5391D-07, 7.0824D-07/
|
|
DATA (A(I),I=191,285)/
|
|
. 1.4917D-07,-1.2005D-07,-1.6983D-08, 1.1545D-08, 7.2866D-04,
|
|
. 3.8907D-04, 9.6365D-05, 2.3153D-05, 1.8462D-07,-9.0627D-06,
|
|
.-5.4332D-06, 1.0458D-08, 1.6430D-09, 5.6453D-10, 2.0276D-10,
|
|
.-1.6501D-10,-1.0656D-10, 5.2198D-07, 4.2898D-08,-1.0332D-08,
|
|
.-5.6754D-09,-7.1960D-09, 3.0390D-06, 1.5385D-06, 6.2110D-07,
|
|
. 1.4111D-07,-3.7415D-08,-4.8395D-08,-1.7219D-08, 2.7227D-06,
|
|
. 1.4381D-07,-5.5030D-08,-2.2192D-10,-2.8583D-08, 1.8417D-05,
|
|
. 9.3860D-06, 3.9999D-06, 1.0424D-06,-2.1337D-07,-3.3271D-07,
|
|
.-1.2684D-07, 4.6063D-06,-6.7185D-07,-2.5830D-07, 2.9976D-08,
|
|
. 7.8012D-05, 3.4921D-05, 8.3012D-06, 1.5643D-06,-4.3892D-07,
|
|
.-9.5318D-07,-4.6534D-07, 1.7584D-05,-2.8817D-06,-1.0081D-06,
|
|
. 1.3259D-07, 1.8561D-05, 2.6602D-06,-1.7243D-06,-3.5533D-07,
|
|
. 2.3315D-08, 1.6239D-08, 7.3739D-09, 1.9570D-09,-2.5667D-10,
|
|
.-5.8101D-10,-2.3947D-10, 4.5821D-12, 4.5024D-11, 3.8796D-07,
|
|
. 1.1239D-07,-2.9033D-08,-5.7237D-09, 2.4186D-09,-2.9670D-09,
|
|
. 1.0887D-06, 4.3737D-07, 8.3753D-08, 3.6771D-08, 1.6545D-09,
|
|
.-1.3849D-08,-5.8855D-09, 2.1028D-06, 4.3725D-07,-1.7621D-07,
|
|
.-3.0743D-08, 1.7119D-08, 8.4698D-06, 4.5395D-06, 1.5774D-06,
|
|
. 4.1647D-07,-7.9865D-08,-1.6003D-07,-6.0171D-08, 3.1692D-06/
|
|
DATA (A(I),I=286,380)/
|
|
. 3.6965D-07,-4.9333D-07,-2.8856D-08, 4.2819D-08, 2.0492D-04,
|
|
. 1.3705D-04, 4.0972D-05, 2.9565D-06,-1.4061D-06,-1.8775D-06,
|
|
.-1.6306D-06,-3.6380D-07, 3.1213D-07, 2.0912D-07, 1.1965D-05,
|
|
. 9.9088D-07,-1.3565D-06,-2.3128D-07, 1.1379D-05, 2.6632D-06,
|
|
.-1.6877D-06,-4.0541D-07, 9.8921D-08, 5.9262D-03, 3.2332D-03,
|
|
. 9.2954D-04, 1.6597D-04,-3.7972D-05,-7.1646D-05,-4.0073D-05,
|
|
. 2.5789D-08, 5.2124D-09,-2.2517D-10,-7.9400D-10, 3.3181D-06,
|
|
. 1.9117D-07, 1.0299D-07,-7.7443D-08, 2.2953D-06,-1.0879D-06,
|
|
. 3.4368D-07,-1.1230D-07, 1.6826D-08, 6.9774D-06, 9.2721D-07,
|
|
.-1.8983D-08,-1.6068D-07, 1.5843D-06,-3.5616D-08,-1.1262D-07,
|
|
.-4.3051D-08, 8.8140D-09, 3.4244D-05, 8.0163D-06, 2.9703D-06,
|
|
.-1.6480D-07,-6.3282D-07, 2.3791D-06,-4.9305D-07,-1.7122D-07,
|
|
. 1.2147D-07, 7.2131D-05, 1.7699D-05, 8.4281D-06,-9.3966D-07,
|
|
.-6.8048D-07, 5.3785D-05, 6.9745D-06,-2.3554D-06,-7.2141D-07,
|
|
. 3.8501D-07, 4.4794D-06,-6.2435D-07,-2.7340D-07, 2.3127D-08,
|
|
. 4.2314D-08, 3.3784D-06,-5.1356D-07,-2.4321D-07,-6.2698D-09,
|
|
. 3.0812D-08, 5.6419D-08, 1.6889D-08, 2.7037D-09,-1.7433D-09,
|
|
.-9.4507D-10, 1.9714D-06, 4.2743D-08,-7.4114D-08,-2.9304D-08,
|
|
. 2.8973D-06, 1.0079D-06, 2.9561D-07,-6.2977D-09,-4.5782D-08/
|
|
DATA (A(I),I=381,475)/
|
|
.-2.4331D-08, 4.3284D-06, 2.8398D-07,-3.2705D-07,-1.5079D-07,
|
|
. 5.2686D-06, 1.6539D-06, 3.6079D-07,-1.1589D-07,-5.4904D-08,
|
|
. 7.0939D-06,-1.9534D-06, 3.2391D-08, 5.5702D-08, 3.9072D-05,
|
|
. 1.7299D-05, 5.1530D-06,-6.0911D-07,-1.2652D-06,-4.6507D-07,
|
|
. 1.1506D-05,-2.0422D-06,-6.1195D-07, 5.8641D-08, 1.0150D-05,
|
|
.-4.6977D-07,-6.9446D-07, 2.2516D-08, 1.1109D-07, 3.6715D-05,
|
|
. 5.6186D-06,-3.2309D-06,-1.6403D-06, 4.1051D-05, 2.3335D-05,
|
|
. 7.8106D-06, 2.0279D-07,-8.1139D-07,-3.7619D-07,-1.4982D-07,
|
|
. 2.5621D-05,-1.0798D-05, 1.4607D-06, 3.2421D-07, 6.5478D-09,
|
|
. 2.7233D-09, 3.8646D-10,-1.9143D-10,-1.0483D-10,-4.8664D-11,
|
|
. 1.0698D-06, 2.7752D-07,-2.6636D-08,-3.7583D-08, 2.6989D-07,
|
|
. 3.0325D-08,-2.4613D-08,-1.0828D-08, 2.2522D-09, 8.0777D-06,
|
|
. 2.2558D-06, 7.4760D-08,-2.4140D-07,-5.4292D-08, 8.8362D-07,
|
|
. 9.5045D-08,-5.0543D-08,-1.9134D-08, 1.1284D-05, 4.0659D-06,
|
|
. 7.6246D-07,-9.0394D-08,-8.7408D-08, 1.2192D-06,-2.0362D-07,
|
|
.-1.0700D-07, 2.1990D-08, 1.2519D-08, 5.2758D-05, 2.0175D-05,
|
|
. 3.6690D-06,-4.9014D-07,-7.0474D-07,-3.9931D-07, 4.7638D-05,
|
|
. 1.5546D-05, 6.2294D-07,-1.3428D-06,-1.8177D-07, 4.1203D-06,
|
|
.-4.9340D-07,-3.0198D-07,-1.5902D-08, 2.8567D-08, 2.2397D-06/
|
|
DATA (A(I),I=476,570)/
|
|
.-2.1306D-08,-1.7897D-07, 2.8178D-08, 4.1722D-08, 2.0594D-04,
|
|
. 1.2838D-04, 5.8219D-05, 1.1735D-05,-6.9778D-06,-6.2486D-06,
|
|
.-1.3800D-06, 2.9170D-06,-7.0833D-07,-1.2673D-07, 4.5069D-08,
|
|
. 1.0974D-09, 4.7908D-10, 3.0294D-11,-7.0815D-11,-1.2039D-11,
|
|
. 5.6357D-12, 8.1274D-07, 4.5158D-07, 1.1655D-07,-2.1481D-08,
|
|
.-2.2493D-08,-6.5884D-09, 9.8696D-08, 3.6499D-08, 1.4768D-09,
|
|
.-8.0141D-09,-2.8147D-09, 5.8287D-06, 3.2469D-06, 9.4927D-07,
|
|
.-7.2550D-08,-1.4231D-07,-5.8408D-08,-1.4468D-08, 4.6070D-07,
|
|
. 1.5956D-07,-3.2311D-09,-3.3487D-08,-7.9013D-09, 4.0092D-06,
|
|
. 1.2195D-06, 1.1192D-07,-1.3870D-07,-6.2194D-08, 5.4918D-07,
|
|
.-5.1133D-08,-5.4844D-08,-3.1054D-09, 6.1049D-09, 2.4833D-05,
|
|
. 1.1280D-05, 2.2680D-06,-4.4637D-07,-2.8942D-07,-1.2382D-07,
|
|
. 6.8223D-05, 3.6505D-05, 7.8792D-06,-1.7946D-06,-1.4925D-06,
|
|
.-4.6018D-07, 2.5677D-06,-7.2440D-08,-2.2441D-07,-4.1769D-08,
|
|
. 2.3833D-08, 1.1885D-06, 4.0457D-09,-1.2273D-07,-2.3271D-08,
|
|
. 1.5149D-08, 9.1912D-05, 5.6621D-05, 1.4338D-05,-2.6072D-06,
|
|
.-2.3688D-06,-6.2490D-07,-1.4386D-07, 1.0821D-06,-1.6304D-07,
|
|
.-7.9756D-08,-4.9881D-09, 9.9527D-09, 1.5288D-03, 9.8517D-04,
|
|
. 3.4966D-04, 3.4238D-05,-4.3610D-05,-3.2734D-05,-8.3676D-06/
|
|
DATA (A(I),I=571,665)/
|
|
. 9.6630D-09, 3.2976D-09, 2.1545D-10,-3.3938D-10,-1.4397D-10,
|
|
. 3.4140D-07, 7.6536D-08,-2.2485D-08,-1.8244D-08,-2.0611D-09,
|
|
. 1.3128D-06, 6.4165D-07, 1.4728D-07,-2.7600D-08,-3.0125D-08,
|
|
.-1.0320D-08, 1.6295D-06, 3.3697D-07,-5.7547D-08,-7.3134D-08,
|
|
.-1.5301D-08, 8.0375D-06, 4.0695D-06, 1.1441D-06,-5.8423D-08,
|
|
.-1.6488D-07,-7.5920D-08, 2.1173D-06,-1.9184D-07,-2.4986D-07,
|
|
. 7.2656D-09, 2.7560D-08, 7.9040D-06, 3.3963D-06, 4.8082D-07,
|
|
.-3.1619D-07,-1.6501D-07, 5.8017D-06,-5.5173D-07,-6.3613D-07,
|
|
. 1.9633D-08, 7.8681D-08, 9.4568D-06, 9.8227D-08,-7.8983D-07,
|
|
.-2.0343D-07, 7.0351D-05, 3.6017D-05, 8.0504D-06,-1.7276D-06,
|
|
.-1.5329D-06,-4.7799D-07, 3.5263D-05, 1.8639D-05, 4.2070D-06,
|
|
.-4.2643D-07,-5.2726D-07,-2.5481D-07,-1.0144D-07, 4.4613D-06,
|
|
.-8.7802D-07,-3.9633D-07, 6.7953D-08, 4.1539D-08, 1.8780D-04,
|
|
. 1.0547D-04, 2.0983D-05,-3.7076D-06,-3.7090D-06,-1.5934D-06,
|
|
.-2.6146D-07, 1.6384D-05,-3.3765D-06,-7.8390D-07, 1.2382D-07,
|
|
. 1.5748D-05,-9.4352D-07,-4.8936D-07,-4.9967D-07, 3.8177D-10,
|
|
. 9.6781D-11,-1.9622D-11,-1.7859D-11,-4.4781D-12, 3.0310D-07,
|
|
. 1.1193D-07,-5.4059D-09,-1.4249D-08,-1.9549D-09, 4.7664D-08,
|
|
. 8.5684D-09,-5.0948D-09,-3.1313D-09, 4.9557D-10, 4.2702D-10/
|
|
DATA (A(I),I=666,760)/
|
|
. 2.3433D-06, 8.3824D-07, 2.6585D-08,-7.5944D-08,-1.5093D-08,
|
|
. 1.8775D-07, 2.7614D-08,-2.1193D-08,-1.0264D-08, 1.9660D-09,
|
|
. 1.1637D-09, 7.7890D-06, 3.2901D-06,-2.9753D-07,-5.3153D-07,
|
|
.-5.2098D-08, 3.3947D-08, 5.5937D-07, 5.1363D-08,-8.5390D-08,
|
|
.-2.2580D-08, 1.0857D-08, 3.5157D-09, 4.1303D-05, 2.1947D-05,
|
|
. 3.9480D-06,-1.4234D-06,-9.0220D-07,-2.4485D-07, 1.1031D-04,
|
|
. 6.6726D-05, 1.9581D-05,-4.3637D-07,-2.8911D-06,-1.4332D-06,
|
|
.-3.2332D-07, 3.0922D-06, 2.0624D-07,-4.0771D-07,-1.0402D-07,
|
|
. 4.8807D-08, 1.2491D-06, 2.1187D-07,-1.5951D-07,-7.2537D-08,
|
|
. 1.4035D-08, 9.6514D-09, 2.5146D-05,-9.4490D-08,-3.4103D-06,
|
|
. 2.4020D-07, 2.9564D-07, 6.6566D-07,-3.0772D-08,-1.0055D-07,
|
|
.-3.1082D-09, 1.4897D-08, 7.7189D-04, 3.3710D-04, 3.9258D-05,
|
|
.-1.5271D-05,-6.0652D-06, 2.1986D-04,-3.3135D-05,-8.5682D-06,
|
|
.-9.2988D-07, 3.8085D-06,-1.3259D-07,-3.8517D-07,-5.7276D-08,
|
|
. 3.7226D-08, 2.0825D-09, 1.6707D-10,-1.2443D-10,-3.9117D-11,
|
|
. 1.0068D-07, 6.2278D-09,-5.9169D-09,-3.9535D-09, 5.3334D-07,
|
|
. 2.2022D-07, 1.4522D-08,-2.8440D-08,-8.1406D-09, 6.0187D-07,
|
|
. 5.8318D-08,-2.7772D-08,-2.6639D-08, 3.0929D-06, 1.0648D-06,
|
|
. 1.2317D-07,-9.9233D-08,-4.0796D-08, 1.5217D-06, 8.3095D-08/
|
|
DATA (A(I),I=761,855)/
|
|
.-1.9819D-07,-6.0417D-08, 2.9553D-08, 9.0905D-09, 8.6651D-06,
|
|
. 3.9125D-06,-2.2871D-07,-6.4651D-07,-7.4440D-08, 4.3543D-08,
|
|
. 4.4505D-06, 2.7350D-07,-4.6428D-07,-2.2293D-07, 5.5275D-08,
|
|
. 3.6505D-08, 8.3471D-06, 5.0215D-07,-1.1189D-06,-2.5404D-07,
|
|
. 1.3175D-07, 1.1687D-04, 7.0674D-05, 2.0219D-05,-1.2136D-06,
|
|
.-3.2299D-06,-1.3981D-06,-2.8271D-07, 3.7298D-05, 2.2054D-05,
|
|
. 5.5510D-06,-9.1515D-07,-1.0832D-06,-3.6657D-07,-4.8581D-08,
|
|
. 2.2506D-06,-2.9469D-07,-2.1641D-07,-3.9630D-08, 5.2879D-08,
|
|
. 2.7894D-05,-3.9312D-06,-2.6413D-06, 5.5848D-07, 8.7829D-06,
|
|
.-1.4800D-06,-7.0982D-07,-2.1645D-08, 1.3258D-07, 1.2248D-05,
|
|
.-1.4244D-06,-7.6696D-07,-1.5029D-07, 6.8467D-08, 1.9392D-04,
|
|
.-2.6676D-05,-8.0536D-06,-6.3609D-07, 2.3074D-05, 7.2856D-07,
|
|
.-2.3751D-06,-5.8464D-07, 1.3685D-07, 1.9646D-08, 1.2918D-08,
|
|
. 4.6924D-09, 5.1593D-10,-4.4715D-10,-3.4091D-10,-9.7254D-11,
|
|
. 3.4117D-07, 1.2731D-07,-2.2300D-08,-2.5297D-08,-1.1877D-10,
|
|
. 2.3436D-09, 9.4463D-07, 4.9464D-07, 8.9138D-08,-2.2158D-08,
|
|
.-1.2008D-08,-4.3715D-09,-2.8719D-09, 1.4091D-06, 4.8184D-07,
|
|
.-9.6135D-08,-1.0945D-07,-9.3174D-09, 9.0166D-09, 4.3747D-06,
|
|
. 2.1053D-06, 1.7702D-07,-3.0956D-07,-1.2902D-07,-8.9418D-09/
|
|
DATA (A(I),I=856,929)/
|
|
. 1.4297D-06, 7.7612D-08,-1.7188D-07, 6.4348D-10, 1.1572D-08,
|
|
. 7.4828D-06, 4.0177D-06, 1.0890D-06, 8.6393D-08,-5.4701D-08,
|
|
.-5.7656D-08,-3.3030D-08, 5.0379D-06, 1.2861D-07,-7.1313D-07,
|
|
.-3.3703D-09, 7.9367D-08, 6.2235D-06, 9.8196D-07,-4.6416D-07,
|
|
.-2.3278D-07, 2.9519D-05, 1.5275D-05, 3.1448D-06,-6.4571D-07,
|
|
.-3.4445D-07, 3.6508D-05, 2.0524D-05, 3.1203D-06,-2.3606D-06,
|
|
.-1.5012D-06,-2.5807D-07, 1.3807D-07, 9.9656D-08, 3.1628D-06,
|
|
.-5.6361D-08,-3.8861D-07,-1.0385D-09, 2.9930D-08, 3.1351D-04,
|
|
. 2.3774D-04, 1.0342D-04, 1.2429D-05,-1.4107D-05,-9.2597D-06,
|
|
.-1.7338D-06, 8.4903D-07, 7.3795D-07, 2.2065D-07, 1.2134D-05,
|
|
. 4.6651D-07,-9.3659D-07,-2.7485D-07, 1.2462D-05, 6.2559D-07,
|
|
.-6.1634D-07,-5.1080D-07, 1.2493D-02, 8.2057D-03, 2.9562D-03,
|
|
. 3.3090D-04,-3.7349D-04,-2.8886D-04,-7.4606D-05, 1.2726D-05,
|
|
.-1.6480D-07,-1.5006D-06,-1.1181D-07, 1.4846D-07, 8.7160D-03,
|
|
. 4.2652D-03, 5.2455D-04,-2.6363D-04,-7.9836D-05/
|
|
SAVE ENER,NSTART,A,STWT
|
|
C
|
|
C SET ALL ELEMENTS OF COLHE1 = 0
|
|
C
|
|
DO I=1,N
|
|
DO J=1,N
|
|
COLHE1(I,J)=0.
|
|
END DO
|
|
END DO
|
|
C
|
|
C EVALUATE GAMMAS FOR REQUESTED LEVELS
|
|
C
|
|
XXX=2.D0*(LOG10(TEMP)-C1)/C2
|
|
TFAC=UN/SQRT(TEMP)
|
|
C
|
|
C LOOPS OVER LEVELS
|
|
C
|
|
DO IL=1,N-1
|
|
DO IU=IL+1,N
|
|
J=((IU*IU-3*IU+4)/2)+IL-1
|
|
N1=NSTART(J)
|
|
NF=NSTART(J+1)-1
|
|
NT=NF-N1+1
|
|
NTM2=NT-2
|
|
C
|
|
C CLENSHAW SUMMATION
|
|
C
|
|
B(NT)=A(NF)
|
|
B(NT-1)=XXX*B(NT)+A(NF-1)
|
|
IR=NTM2
|
|
JJ=NF-2
|
|
DO J=1,NTM2
|
|
B(IR)=XXX*B(IR+1)-B(IR+2)+A(JJ)
|
|
IR=IR-1
|
|
JJ=JJ-1
|
|
END DO
|
|
COLHE1(IU,IL)=(B(1)-B(3))*TFAC
|
|
X=(ENER(IL)-ENER(IU))/8.62D-5/TEMP
|
|
COLHE1(IL,IU)=COLHE1(IU,IL)*STWT(IU)/STWT(IL)*EXP(X)
|
|
END DO
|
|
END DO
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
FUNCTION CHEAV(II,JJ,IC)
|
|
C ========================
|
|
C
|
|
C Calculates collisional excitation rates of neutral helium
|
|
C between states with n= 1, 2, 3, 4; with either the upper state
|
|
C alone, or both upper and lower states are some averaged states
|
|
C The program allows only two standard possibilities of
|
|
C constructing averaged levels:
|
|
C i) all states within given principal quantum number n (>1) are
|
|
C lumped together
|
|
C ii) all siglet states for given n, and all triplet states for
|
|
C given n are lumped together separately (there are thus two
|
|
C explicit levels for a given n)
|
|
C
|
|
C The rates are calculated using appropriate summations and/or
|
|
C averages of the Storey-Hummer rates (calculated by procedure
|
|
C COLLHE and stored in array COLHE1)
|
|
C
|
|
C Input parameters:
|
|
C II,JJ - indices of the lower and the upper level (in the
|
|
C numbering of the explicit levels)
|
|
C IC - collisional switch ICOL for the given transition
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
C
|
|
CHEAV=0.
|
|
NI=NQUANT(II)
|
|
NJ=NQUANT(JJ)
|
|
IGI=INT(G(II)+0.01)
|
|
IGJ=INT(G(JJ)+0.01)
|
|
C
|
|
C ----------------------------------------------------------------
|
|
C IC=2 - transition from an (l,s) lower level to an averaged upper
|
|
C level
|
|
C ----------------------------------------------------------------
|
|
C
|
|
IF(IC.EQ.2) THEN
|
|
I=II-NFIRST(IELHE1)+1
|
|
CHEAV=CHEAVJ(I,NJ,IGJ)
|
|
END IF
|
|
C
|
|
C ----------------------------------------------------------------
|
|
C IC=3 - transition from an averaged lower level to an averaged
|
|
C upper level
|
|
C ----------------------------------------------------------------
|
|
C
|
|
IF(IC.EQ.3) THEN
|
|
IF(NI.EQ.2) THEN
|
|
C
|
|
C ******** transitions from an averaged level with n=2
|
|
C
|
|
IF(IGI.EQ.4) THEN
|
|
C
|
|
C a) lower level is an averaged singlet state
|
|
C
|
|
CHEAV=(CHEAVJ(3,NJ,IGJ)+3.D0*CHEAVJ(5,NJ,IGJ))/4.D0
|
|
ELSE IF(IGI.EQ.12) THEN
|
|
C
|
|
C b) lower level is an averaged triplet state
|
|
C
|
|
CHEAV=(CHEAVJ(2,NJ,IGJ)+3.D0*CHEAVJ(4,NJ,IGJ))/4.D0
|
|
ELSE IF(IGI.EQ.16) THEN
|
|
C
|
|
C c) lower level is an average of both singlet and triplet states
|
|
C
|
|
CHEAV=(CHEAVJ(3,NJ,IGJ)+3.D0*(CHEAVJ(5,NJ,IGJ)+
|
|
* CHEAVJ(2,NJ,IGJ))+9.D0*CHEAVJ(4,NJ,IGJ))/1.6D1
|
|
ELSE
|
|
GO TO 10
|
|
END IF
|
|
C
|
|
C
|
|
C ******** transitions from an averaged level with n=3
|
|
C
|
|
ELSE IF(NI.EQ.3) THEN
|
|
IF(IGI.EQ.9) THEN
|
|
C
|
|
C a) lower level is an averaged singlet state
|
|
C
|
|
CHEAV=(CHEAVJ(7,NJ,IGJ)+3.D0*CHEAVJ(11,NJ,IGJ)+
|
|
* 5.D0*CHEAVJ(10,NJ,IGJ))/9.D0
|
|
ELSE IF(IGI.EQ.27) THEN
|
|
C
|
|
C b) lower level is an averaged triplet state
|
|
C
|
|
CHEAV=(CHEAVJ(6,NJ,IGJ)+3.D0*CHEAVJ(8,NJ,IGJ)+
|
|
* 5.D0*CHEAVJ(9,NJ,IGJ))/9.D0
|
|
ELSE IF(IGI.EQ.36) THEN
|
|
C
|
|
C c) lower level is an average of both singlet and triplet states
|
|
C
|
|
CHEAV=(CHEAVJ(7,NJ,IGJ)+3.D0*CHEAVJ(11,NJ,IGJ)+
|
|
* 5.D0*CHEAVJ(10,NJ,IGJ)+
|
|
* 3.D0*CHEAVJ(6,NJ,IGJ)+9.D0*CHEAVJ(8,NJ,IGJ)+
|
|
* 1.5D1*CHEAVJ(9,NJ,IGJ))/3.6D1
|
|
ELSE
|
|
GO TO 10
|
|
END IF
|
|
C
|
|
C ******** transitions from an averaged level with n=4
|
|
C
|
|
ELSE IF(NI.EQ.4) THEN
|
|
IF(IGI.EQ.16) THEN
|
|
C
|
|
C a) lower level is an averaged singlet state
|
|
C
|
|
CHEAV=(CHEAVJ(13,NJ,IGJ)+
|
|
* 3.D0*CHEAVJ(19,NJ,IGJ)+
|
|
* 5.D0*CHEAVJ(16,NJ,IGJ)+
|
|
* 7.D0*CHEAVJ(18,NJ,IGJ))/1.6D1
|
|
ELSE IF(IGI.EQ.48) THEN
|
|
C
|
|
C b) lower level is an averaged triplet state
|
|
C
|
|
CHEAV=(CHEAVJ(12,NJ,IGJ)+
|
|
* 3.D0*CHEAVJ(14,NJ,IGJ)+
|
|
* 5.D0*CHEAVJ(15,NJ,IGJ)+
|
|
* 7.D0*CHEAVJ(17,NJ,IGJ))/1.6D1
|
|
ELSE IF(IGI.EQ.64) THEN
|
|
C
|
|
C c) lower level is an average of both singlet and triplet states
|
|
C
|
|
CHEAV=(CHEAVJ(13,NJ,IGJ)+
|
|
* 3.D0*CHEAVJ(19,NJ,IGJ)+
|
|
* 5.D0*CHEAVJ(16,NJ,IGJ)+
|
|
* 7.D0*CHEAVJ(18,NJ,IGJ)+
|
|
* 3.D0*CHEAVJ(12,NJ,IGJ)+
|
|
* 9.D0*CHEAVJ(14,NJ,IGJ)+
|
|
* 15.D0*CHEAVJ(15,NJ,IGJ)+
|
|
* 21.D0*CHEAVJ(17,NJ,IGJ))/6.4D1
|
|
ELSE
|
|
GO TO 10
|
|
END IF
|
|
ELSE
|
|
GO TO 10
|
|
END IF
|
|
END IF
|
|
RETURN
|
|
|
|
10 WRITE(6,601) NI,NJ,IGI,IGJ
|
|
write(10,601) NI,NJ,IGI,IGJ
|
|
601 FORMAT(1H0/' INCONSISTENT INPUT TO PROCEDURE CHEAV'/
|
|
* ' QUANTUM NUMBERS =',2I3,' STATISTICAL WEIGHTS',2I4)
|
|
call quit(' ',ni,nj)
|
|
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION CHEAVJ(I,NJ,IGJ)
|
|
C =========================
|
|
C
|
|
C Calculates collisional excitation rates from a non-averaged (l,s)
|
|
C state of He I, with n=1, 2, 3, to some averaged state
|
|
C with n = 2, 3, 4.
|
|
C
|
|
C The rates are calculated using appropriate summations of the
|
|
C Storey-Hummer rates (calculated by procedure COLLHE, and stored
|
|
C in array COLHE1)
|
|
C
|
|
C Input:
|
|
C I - index of the lower state, using the ordering defined in
|
|
C COLLHE, ie. I=1 for 1 sing S, I=2 for 2 trip S, etc.
|
|
C NJ - principal quantum number of the (averaged) upper level
|
|
C IGJ - statistical weight of the upper level
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
|
|
CHEAVJ=0.
|
|
C
|
|
C -----------------------------------------------------
|
|
C ******** transitions to an averaged level with n=2
|
|
C -----------------------------------------------------
|
|
C
|
|
IF(NJ.EQ.2) THEN
|
|
IF(IGJ.EQ.4) THEN
|
|
C
|
|
C a) upper level is an averaged singlet state
|
|
C
|
|
CHEAVJ=COLHE1(1,3)+COLHE1(1,5)
|
|
ELSE IF(IGJ.EQ.12) THEN
|
|
C
|
|
C b) upper level is an averaged triplet state
|
|
C
|
|
CHEAVJ=COLHE1(1,2)+COLHE1(1,4)
|
|
ELSE IF(IGJ.EQ.16) THEN
|
|
C
|
|
C c) upper level is an average of both siglet and triplet states
|
|
C
|
|
CHEAVJ=COLHE1(1,3)+COLHE1(1,5)+COLHE1(1,2)+COLHE1(1,4)
|
|
ELSE
|
|
GO TO 10
|
|
END IF
|
|
C
|
|
C -----------------------------------------------------
|
|
C ******** transitions to an averaged level with n=3
|
|
C -----------------------------------------------------
|
|
C
|
|
ELSE IF(NJ.EQ.3) THEN
|
|
IF(IGJ.EQ.9) THEN
|
|
C
|
|
C a) upper level is an averaged singlet state
|
|
C
|
|
CHEAVJ=COLHE1(I,7)+COLHE1(I,11)+COLHE1(I,10)
|
|
ELSE IF(IGJ.EQ.27) THEN
|
|
C
|
|
C b) upper level is an averaged triplet state
|
|
C
|
|
CHEAVJ=COLHE1(I,6)+COLHE1(I,8)+COLHE1(I,9)
|
|
ELSE IF(IGJ.EQ.36) THEN
|
|
C
|
|
C c) upper level is an average of both siglet and triplet states
|
|
C
|
|
CHEAVJ=COLHE1(I,7)+COLHE1(I,11)+COLHE1(I,10)+
|
|
* COLHE1(I,6)+COLHE1(I,8)+COLHE1(I,9)
|
|
ELSE
|
|
GO TO 10
|
|
END IF
|
|
C
|
|
C -----------------------------------------------------
|
|
C ******** transitions to an averaged level with n=4
|
|
C -----------------------------------------------------
|
|
C
|
|
ELSE IF(NJ.EQ.4) THEN
|
|
IF(IGJ.EQ.16) THEN
|
|
C
|
|
C a) upper level is an averaged singlet state
|
|
C
|
|
CHEAVJ=COLHE1(I,13)+COLHE1(I,19)+COLHE1(I,16)+
|
|
* COLHE1(I,18)
|
|
ELSE IF(IGJ.EQ.48) THEN
|
|
C
|
|
C b) upper level is an averaged triplet state
|
|
C
|
|
CHEAVJ=COLHE1(I,12)+COLHE1(I,14)+COLHE1(I,15)+
|
|
* COLHE1(I,17)
|
|
ELSE IF(IGJ.EQ.64) THEN
|
|
C
|
|
C c) upper level is an average of both siglet and triplet states
|
|
C
|
|
CHEAVJ=COLHE1(I,13)+COLHE1(I,19)+COLHE1(I,16)+
|
|
* COLHE1(I,18)+COLHE1(I,12)+COLHE1(I,14)+
|
|
* COLHE1(I,15)+COLHE1(I,17)
|
|
ELSE
|
|
GO TO 10
|
|
END IF
|
|
ELSE
|
|
GO TO 10
|
|
END IF
|
|
RETURN
|
|
|
|
10 WRITE(6,601) NJ,IGJ
|
|
WRITE(10,601) NJ,IGJ
|
|
601 FORMAT(1H0/' INCONSISTENT INPUT TO PROCEDURE CHEAVJ'/
|
|
* ' QUANTUM NUMBER =',I3,' STATISTICAL WEIGHT',2I4)
|
|
call quit(' ',nj,igj)
|
|
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE MATINV(A,N,NR)
|
|
C =========================
|
|
C
|
|
C Matrix inversion
|
|
C by LU decomposition
|
|
C
|
|
C A - matrix of actual size (N x N) and maximum size (NR x NR)
|
|
C to be inverted;
|
|
C Inversion is accomplished in place and the original matrix is
|
|
C replaced by its inverse
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
DIMENSION A(NR,NR)
|
|
C
|
|
DO I=2,N
|
|
IM1=I-1
|
|
DO J=1,IM1
|
|
JM1=J-1
|
|
DIV=A(J,J)
|
|
SUM=0.
|
|
IF(JM1.GE.1) THEN
|
|
DO K=1,JM1
|
|
SUM=SUM+A(I,K)*A(K,J)
|
|
END DO
|
|
END IF
|
|
A(I,J)=(A(I,J)-SUM)/DIV
|
|
END DO
|
|
DO J=I,N
|
|
SUM=0.
|
|
DO K=1,IM1
|
|
SUM=SUM+A(I,K)*A(K,J)
|
|
END DO
|
|
A(I,J)=A(I,J)-SUM
|
|
END DO
|
|
END DO
|
|
C
|
|
DO II=2,N
|
|
I=N+2-II
|
|
IM1=I-1
|
|
IF(IM1.GE.1) THEN
|
|
DO JJ=1,IM1
|
|
J=I-JJ
|
|
JP1=J+1
|
|
SUM=0.
|
|
IF(JP1.LE.IM1) THEN
|
|
DO K=JP1,IM1
|
|
SUM=SUM+A(I,K)*A(K,J)
|
|
END DO
|
|
END IF
|
|
A(I,J)=-A(I,J)-SUM
|
|
END DO
|
|
END IF
|
|
END DO
|
|
C
|
|
DO II=1,N
|
|
I=N+1-II
|
|
DIV=A(I,I)
|
|
IP1=I+1
|
|
IF(IP1.LE.N) THEN
|
|
DO JJ=IP1,N
|
|
J=N+IP1-JJ
|
|
SUM=0.
|
|
DO K=IP1,J
|
|
SUM=SUM+A(I,K)*A(K,J)
|
|
END DO
|
|
A(I,J)=-SUM/DIV
|
|
END DO
|
|
END IF
|
|
A(I,I)=1.0D0/A(I,I)
|
|
END DO
|
|
C
|
|
DO I=1,N
|
|
DO 230 J=1,N
|
|
K0=I
|
|
IF(J.GE.I) GO TO 220
|
|
SUM=0.
|
|
200 DO K=K0,N
|
|
SUM=SUM+A(I,K)*A(K,J)
|
|
END DO
|
|
GO TO 230
|
|
220 K0=J
|
|
SUM=A(I,K0)
|
|
IF(K0.EQ.N) GO TO 230
|
|
K0=K0+1
|
|
GO TO 200
|
|
230 A(I,J)=SUM
|
|
END DO
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE MINV3(A)
|
|
C ===================
|
|
C
|
|
C Special routine for an invresion of a 3 x 3 matrix
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
PARAMETER (UN=1.D0)
|
|
DIMENSION A(3,3)
|
|
C
|
|
A(2,1)=A(2,1)/A(1,1)
|
|
A(2,2)=A(2,2)-A(2,1)*A(1,2)
|
|
A(2,3)=A(2,3)-A(2,1)*A(1,3)
|
|
A(3,1)=A(3,1)/A(1,1)
|
|
A(3,2)=(A(3,2)-A(3,1)*A(1,2))/A(2,2)
|
|
A(3,3)=A(3,3)-A(3,1)*A(1,3)-A(3,2)*A(2,3)
|
|
C
|
|
A(3,2)=-A(3,2)
|
|
A(3,1)=-A(3,1)-A(3,2)*A(2,1)
|
|
A(2,1)=-A(2,1)
|
|
C
|
|
A(3,3)=UN/A(3,3)
|
|
A(2,3)=-A(2,3)*A(3,3)/A(2,2)
|
|
A(2,2)=UN/A(2,2)
|
|
A(1,3)=-(A(1,2)*A(2,3)+A(1,3)*A(3,3))/A(1,1)
|
|
A(1,2)=-A(1,2)*A(2,2)/A(1,1)
|
|
A(1,1)=UN/A(1,1)
|
|
C
|
|
A(1,1)=A(1,1)+A(1,2)*A(2,1)+A(1,3)*A(3,1)
|
|
A(1,2)=A(1,2)+A(1,3)*A(3,2)
|
|
A(2,1)=A(2,2)*A(2,1)+A(2,3)*A(3,1)
|
|
A(2,2)=A(2,2)+A(2,3)*A(3,2)
|
|
A(3,1)=A(3,3)*A(3,1)
|
|
A(3,2)=A(3,3)*A(3,2)
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ******************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE LINEQS(A,B,X,N,NR)
|
|
C =============================
|
|
C
|
|
C Solution of the linear system A*X=B
|
|
C by Gaussian elimination with partial pivoting
|
|
C
|
|
C Input: A - matrix of the linear system, with actual size (N x N),
|
|
C and maximum size (NR x NR)
|
|
C B - the rhs vector
|
|
C Output: X - solution vector
|
|
C Note that matrix A and vector B are destroyed here
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
DIMENSION A(NR,NR),B(NR),X(NR),D(MLEVEL),IP(MLEVEL)
|
|
c
|
|
if(n.eq.2) then
|
|
a11=a(1,1)
|
|
a12=a(1,2)
|
|
a21=a(2,1)
|
|
a22=a(2,2)
|
|
x(1)=(a(2,2)*b(1)-a(1,2)*b(2))/
|
|
* (a(1,1)*a(2,2)-a(1,2)*a(2,1))
|
|
x(2)=(b(2)-a(2,1)*x(1))/a(2,2)
|
|
return
|
|
end if
|
|
c
|
|
DO I=1,N
|
|
DO J=1,N
|
|
D(J)=A(J,I)
|
|
END DO
|
|
IM1=I-1
|
|
IF(IM1.GE.1) THEN
|
|
DO J=1,IM1
|
|
IT=IP(J)
|
|
A(J,I)=D(IT)
|
|
D(IT)=D(J)
|
|
JP1=J+1
|
|
DO K=JP1,N
|
|
D(K)=D(K)-A(K,J)*A(J,I)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
AM=ABS(D(I))
|
|
IP(I)=I
|
|
DO K=I,N
|
|
IF(AM.LT.ABS(D(K))) THEN
|
|
IP(I)=K
|
|
AM=ABS(D(K))
|
|
END IF
|
|
END DO
|
|
IT=IP(I)
|
|
A(I,I)=D(IT)
|
|
D(IT)=D(I)
|
|
IP1=I+1
|
|
IF(IP1.GT.N) GO TO 10
|
|
DO K=IP1,N
|
|
A(K,I)=D(K)/A(I,I)
|
|
END DO
|
|
END DO
|
|
C
|
|
10 CONTINUE
|
|
DO I=1,N
|
|
IT=IP(I)
|
|
X(I)=B(IT)
|
|
B(IT)=B(I)
|
|
IP1=I+1
|
|
IF(IP1.GT.N) GO TO 20
|
|
DO J=IP1,N
|
|
B(J)=B(J)-A(J,I)*X(I)
|
|
END DO
|
|
END DO
|
|
C
|
|
20 CONTINUE
|
|
DO I=1,N
|
|
K=N-I+1
|
|
SUM=0.
|
|
KP1=K+1
|
|
IF(KP1.LE.N) THEN
|
|
DO J=KP1,N
|
|
SUM=SUM+A(K,J)*X(J)
|
|
END DO
|
|
END IF
|
|
X(K)=(X(K)-SUM)/A(K,K)
|
|
END DO
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION EXPINT(X)
|
|
C ==================
|
|
C
|
|
C First exponential integral function E1(X)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
PARAMETER (A1 = -0.57721566,
|
|
* A2 = 0.99999193,
|
|
* A3 = -0.24991055,
|
|
* A4 = 0.05519968,
|
|
* A5 = -0.00976004,
|
|
* A6 = 0.00107857,
|
|
* B1 = 0.2677734343,
|
|
* B2 = 8.6347608925,
|
|
* B3 = 18.059016973,
|
|
* B4 = 8.5733287401,
|
|
* C1 = 3.9584969228,
|
|
* C2 = 21.0996530827,
|
|
* C3 = 25.6329561486,
|
|
* C4 = 9.5733223454,
|
|
* UN = 1.0)
|
|
C
|
|
IF(X.LE.UN) THEN
|
|
EXPINT=-LOG(X)+A1+X*(A2+X*(A3+X*(A4+X*(A5+X*A6))))
|
|
ELSE
|
|
EXPINT=EXP(-X)*((B1+X*(B2+X*(B3+X*(B4+X))))/
|
|
* (C1+X*(C2+X*(C3+X*(C4+X)))))/X
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE INTERP(X,Y,XX,YY,NX,NXX,NPOL,ILOGX,ILOGY)
|
|
C ====================================================
|
|
C
|
|
C General interpolation procedure of the (NPOL-1)-th order
|
|
C
|
|
C for ILOGX = 1 logarithmic interpolation in X
|
|
C for ILOGY = 1 logarithmic interpolation in Y
|
|
C
|
|
C Input:
|
|
C X - array of original x-coordinates
|
|
C Y - array of corresponding functional values Y=y(X)
|
|
C NX - number of elements in arrays X or Y
|
|
C XX - array of new x-coordinates (to which is to be
|
|
C interpolated
|
|
C NXX - number of elements in array XX
|
|
C Output:
|
|
C YY - interpolated functional values YY=y(XX)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
DIMENSION X(MDEPTH),Y(MDEPTH),XX(MDEPTH),YY(MDEPTH)
|
|
C
|
|
C no interpolation for NPOL.LE.0 or NX.le.0
|
|
C
|
|
IF(NPOL.LE.0.OR.NX.LE.0) THEN
|
|
N=NX
|
|
IF(NXX.GE.NX) N=NXX
|
|
DO I=1,N
|
|
XX(I)=X(I)
|
|
YY(I)=Y(I)
|
|
END DO
|
|
RETURN
|
|
END IF
|
|
C
|
|
C interpolation
|
|
C
|
|
C if required, compute logarithms to be interpolated
|
|
C
|
|
IF(ILOGX.GT.0) THEN
|
|
DO I=1,NX
|
|
X(I)=LOG10(X(I))
|
|
END DO
|
|
DO I=1,NXX
|
|
XX(I)=LOG10(XX(I))
|
|
END DO
|
|
END IF
|
|
IF(ILOGY.GT.0) THEN
|
|
DO I=1,NX
|
|
Y(I)=LOG10(Y(I))
|
|
END DO
|
|
END IF
|
|
C
|
|
NM=(NPOL+1)/2
|
|
NM1=NM+1
|
|
NUP=NX+NM1-NPOL
|
|
DO ID=1,NXX
|
|
XXX=XX(ID)
|
|
DO I=NM1,NUP
|
|
IF(XXX.LE.X(I)) GO TO 10
|
|
END DO
|
|
I=NUP
|
|
10 J=I-NM
|
|
JJ=J+NPOL-1
|
|
YYY=0.
|
|
DO K=J,JJ
|
|
T=1.
|
|
DO 20 M=J,JJ
|
|
IF(K.EQ.M) GO TO 20
|
|
T=T*(XXX-X(M))/(X(K)-X(M))
|
|
20 CONTINUE
|
|
YYY=Y(K)*T+YYY
|
|
END DO
|
|
YY(ID)=YYY
|
|
END DO
|
|
C
|
|
IF(ILOGX.GT.0) THEN
|
|
DO I=1,NX
|
|
X(I)=EXP(X(I)*2.30258509299405)
|
|
END DO
|
|
DO I=1,NXX
|
|
XX(I)=EXP(XX(I)*2.30258509299405)
|
|
END DO
|
|
END IF
|
|
IF(ILOGY.GT.0) THEN
|
|
DO I=1,NX
|
|
Y(I)=EXP(Y(I)*2.30258509299405)
|
|
END DO
|
|
DO I=1,NXX
|
|
YY(I)=EXP(YY(I)*2.30258509299405)
|
|
END DO
|
|
END IF
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE OUTPUT
|
|
C =================
|
|
C
|
|
C Output of computed model atmosphere on file 7
|
|
C This file may be used as input file 8 (initial model atmosphere)
|
|
C for a subsequent run of the program
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
|
|
C
|
|
NUMLT=3
|
|
IF(IDISK.EQ.1) NUMLT=4
|
|
IF(IFMOL.EQ.1) NUMLT=NUMLT+1
|
|
NUMPAR=NLEVEL+NUMLT
|
|
IF(LTE.AND.IPRINP.EQ.0) NUMPAR=NUMLT
|
|
IF(IFMOL.GT.0) NUMPAR=-NUMPAR
|
|
C
|
|
C NUMPAR - number of model parameters in each depth
|
|
C = NUMLT for LTE model, ie. TEMP - temperature
|
|
C ELEC - electron density
|
|
C DENS - density
|
|
C = NUMLT+NLEVEL for NLTE model, ie. the above + populations
|
|
C ---------------------------------------------------------------------
|
|
C 2. DM(ID),ID=1,ND - mass-depth points for the input model
|
|
C ---------------------------------------------------------------------
|
|
C 3. for each depth:
|
|
C T - temperature
|
|
C ANE - electron density
|
|
C RHO - mass density
|
|
C level populations - only for NLTE input model
|
|
C
|
|
REWIND 7
|
|
WRITE(7,501) ND,NUMPAR
|
|
WRITE(7,502) (DM(ID),ID=1,ND)
|
|
IF(IDISK.EQ.0) THEN
|
|
DO ID=1,ND
|
|
IF(LTE.AND.IPRINP.EQ.0) THEN
|
|
IF(IFMOL.EQ.0) THEN
|
|
WRITE(7,503) TEMP(ID),ELEC(ID),DENS(ID)
|
|
ELSE
|
|
WRITE(7,503) TEMP(ID),ELEC(ID),DENS(ID),TOTN(ID)
|
|
END IF
|
|
ELSE
|
|
IF(IFMOL.EQ.0) THEN
|
|
WRITE(7,503) TEMP(ID),ELEC(ID),DENS(ID),
|
|
* (POPUL(J,ID),J=1,NLEVEL)
|
|
ELSE
|
|
WRITE(7,503) TEMP(ID),ELEC(ID),DENS(ID),TOTN(ID),
|
|
* (POPUL(J,ID),J=1,NLEVEL)
|
|
END IF
|
|
END IF
|
|
END DO
|
|
ELSE
|
|
DO ID=1,ND
|
|
IF(LTE.AND.IPRINP.EQ.0) THEN
|
|
IF(IFMOL.EQ.0) THEN
|
|
WRITE(7,503) TEMP(ID),ELEC(ID),
|
|
* DENS(ID),ZD(ID)
|
|
ELSE
|
|
WRITE(7,503) TEMP(ID),ELEC(ID),
|
|
* DENS(ID),TOTN(ID),ZD(ID)
|
|
END IF
|
|
ELSE
|
|
IF(IFMOL.EQ.0) THEN
|
|
WRITE(7,503) TEMP(ID),ELEC(ID),DENS(ID),ZD(ID),
|
|
* (POPUL(J,ID),J=1,NLEVEL)
|
|
ELSE
|
|
WRITE(7,503) TEMP(ID),ELEC(ID),DENS(ID),TOTN(ID),ZD(ID),
|
|
* (POPUL(J,ID),J=1,NLEVEL)
|
|
END IF
|
|
END IF
|
|
END DO
|
|
END IF
|
|
CLOSE(7)
|
|
|
|
IF(IPRIND.GT.0) THEN
|
|
WRITE(17,501) ND,NUMPAR
|
|
WRITE(17,502) (DM(I),I=1,ND)
|
|
IF(IDISK.EQ.0) THEN
|
|
IF(LTE) THEN
|
|
DO ID=1,ND
|
|
WRITE(17,503) TEMP(ID),ELEC(ID),DENS(ID)
|
|
END DO
|
|
ELSE
|
|
WRITE(20,501) ND,NUMPAR
|
|
WRITE(20,502) (DM(ID),ID=1,ND)
|
|
DO ID=1,ND
|
|
WRITE(17,503) TEMP(ID),ELEC(ID),DENS(ID),
|
|
* (POPUL(J,ID),J=1,NLEVEL)
|
|
WRITE(20,503) TEMP(ID),ELEC(ID),DENS(ID),
|
|
* (BFAC(J,ID),J=1,NLEVEL)
|
|
END DO
|
|
END IF
|
|
ELSE
|
|
IF(LTE) THEN
|
|
DO ID=1,ND
|
|
WRITE(17,503) TEMP(ID),ELEC(ID),DENS(ID),ZD(ID)
|
|
END DO
|
|
ELSE
|
|
WRITE(20,501) ND,NUMPAR
|
|
WRITE(20,502) (DM(ID),ID=1,ND)
|
|
DO ID=1,ND
|
|
WRITE(17,503) TEMP(ID),ELEC(ID),DENS(ID),ZD(ID),
|
|
* (POPUL(J,ID),J=1,NLEVEL)
|
|
WRITE(20,503) TEMP(ID),ELEC(ID),DENS(ID),ZD(ID),
|
|
* (BFAC(J,ID),J=1,NLEVEL)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
END IF
|
|
501 FORMAT(2I5)
|
|
502 FORMAT(1P6E13.6)
|
|
503 FORMAT(1P5E15.6)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE OUTPRI
|
|
C =================
|
|
C
|
|
C Output on unit 6 (printer)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
common/grdpra/GRD(MDEPTH),pra(mdepth),pgs0(mdepth),ANTP(MDEPTH)
|
|
dimension aes(mlevel,mlevel),bes(mlevel),poplte(mlevel),
|
|
* bfab(mlevel,mdepth)
|
|
C
|
|
C ************ Print emergent radiation field on unit 13, namely
|
|
C
|
|
C FREQ(IJ) - value of frequency
|
|
C FLUX(IJ) - emergent flux, precisely the second moment H(freq)
|
|
C at the surface, in ergs/cm**2/s/sterad/Hz
|
|
C FH(IJ) - Eddington factor f(H), ie the ratio H/J, J is the
|
|
C mean intensity of radiation
|
|
C
|
|
WRITE(6,600) ITER-1
|
|
FLTT=SIG4P*TEFF**4
|
|
TOTF=0.
|
|
DO IJ=1,NFREQ
|
|
IJP=IJ
|
|
IF(ispodf.eq.0) IJP=JIK(IJ)
|
|
IF(IJX(IJP).NE.-1) THEN
|
|
WRITE(13,602) FREQ(IJP),FLUX(IJP),FH(IJP)
|
|
TOTF=TOTF+FLUX(IJP)*W(IJP)
|
|
FLAM=FLUX(IJP)*FREQ(IJP)*FREQ(IJP)/2.997925E18
|
|
write(14,614) 2.997925e18/freq(ijp),flam
|
|
END IF
|
|
END DO
|
|
WRITE(6,603) TOTF
|
|
C
|
|
C ************ For partial opacity table, print electron
|
|
C densities - actual, and that from opacity table
|
|
C
|
|
if(ioptab.ne.0) call eldenc
|
|
C
|
|
C ************ Print basic model parameters, namely
|
|
C
|
|
C ID - depth index
|
|
C DM(ID) - mass-depth variable (in g/cm**2)
|
|
C TEMP(ID) - temperature (in K)
|
|
C ELEC(ID) - electron density (cm**-3)
|
|
C AN - total particle number density (cm**-3)
|
|
C DENS(ID) - mass density (g/cm**3)
|
|
C P - total gas pressure (cgs)
|
|
C GR - radiative acceleration (cgs)
|
|
C FLTOT(ID)- total (integrated over frequencies) radiative flux
|
|
C
|
|
if(idisk.eq.0) then
|
|
WRITE(6,611)
|
|
else
|
|
WRITE(6,613)
|
|
end if
|
|
DO IJ=1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
CALL OPACF1(IJT)
|
|
DO ID=1,ND
|
|
ABSOEX(IJ,ID)=ABSO1(ID)
|
|
END DO
|
|
END DO
|
|
DO ID=1,ND
|
|
C
|
|
C contributions from explicit (linearized) frequencies to the
|
|
C flux and radiation pressure
|
|
C
|
|
GRP=0.
|
|
FLEX=0.
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=1,NFREQE
|
|
RAD0(IJ)=RADEX(IJ,ID)
|
|
FK0(IJ)=FAKEX(IJ,ID)
|
|
ABSO0(IJ)=ABSOEX(IJ,ID)
|
|
IJT=IJFR(IJ)
|
|
WD0C=W(IJT)
|
|
IF(ID.EQ.1) THEN
|
|
FLUXW=FH(IJT)*RAD0(IJ)-HEXTRD(IJT)
|
|
IF(.NOT.LSKIP(ID,IJT)) GRP=GRP+W(ijt)*FLUXW*ABSO0(IJ)
|
|
FLEX=FLEX+WD0C*FLUXW
|
|
ELSE
|
|
RADM(IJ)=RADEX(IJ,ID-1)
|
|
FKM(IJ)=FAKEX(IJ,ID-1)
|
|
ABSOM(IJ)=ABSOEX(IJ,ID-1)
|
|
FRD=FK0(IJ)*RAD0(IJ)-FKM(IJ)*RADM(IJ)
|
|
IF(.NOT.LSKIP(ID,IJFR(IJ))) GRP=GRP+W(ijt)*FRD
|
|
DTAUM=(ABSO0(IJ)*DENS1(ID)+ABSOM(IJ)*DENS1(ID-1))*
|
|
* DELDM(ID-1)
|
|
FLEX=FLEX+WD0C*FRD/DTAUM
|
|
END IF
|
|
END DO
|
|
END IF
|
|
GRAD(ID)=GRP+FPRD(ID)
|
|
if(ifryb.gt.0) GRAD(ID)=GRD(ID)
|
|
IF(ID.EQ.1) THEN
|
|
GRAD(ID)=GRAD(ID)/DENS(ID)
|
|
ELSE
|
|
GRAD(ID)=GRAD(ID)/(DM(ID)-DM(ID-1))
|
|
END IF
|
|
FLTOT(ID)=FLEX
|
|
C
|
|
C other quantities
|
|
C
|
|
AN=DENS(ID)/WMM(ID)+ELEC(ID)
|
|
P=AN*TEMP(ID)*BOLK
|
|
IF(ID.LT.ND.AND.GRAD(ID).GT.0.)
|
|
* GR=LOG10(GRAD(ID)*4.1916825D-10)
|
|
FLTO=FLTOT(ID)+FLFIX(ID)+flxc(id)
|
|
flto=flrd(id)+flxc(id)
|
|
ptotal(id)=pgs(id)+pradt(id)
|
|
if(idisk.eq.0) then
|
|
WRITE(6,612) ID,DM(ID),TROSS(ID),TEMP(ID),ELEC(ID),DENS(ID),
|
|
* P,GR,
|
|
* flrd(id)/fltt,flxc(id)/fltt,flto/fltt
|
|
else
|
|
IF(ID.EQ.1) THEN
|
|
GRV=QGRAV*ZD(ID)
|
|
pgint=pgs(1)/dens(1)*dm(1)
|
|
ptint=ptotal(1)/dens(1)*dm(1)
|
|
ELSE
|
|
GRV=QGRAV*(ZD(ID)+ZD(ID-1))*HALF
|
|
pgint=pgint+(dm(id)-dm(id-1))*(pgs(id)/dens(id)+
|
|
* pgs(id-1)/dens(id-1))*half
|
|
ptint=ptint+(dm(id)-dm(id-1))*(ptotal(id)/dens(id)+
|
|
* ptotal(id-1)/dens(id-1))*half
|
|
END IF
|
|
GRVL=0.
|
|
IF(GRV.GT.0.) GRVL=LOG10(GRV)
|
|
HMECH=SIG4P*TEFF**4*(UN-THETAV(ID))
|
|
WRITE(6,622) ID,DM(ID),TROSS(ID),TEMP(ID),ELEC(ID),
|
|
* dens(id),pgs(id),
|
|
* flxc(id)/FLTO,FLTO,HMECH,hmech/flto,ZD(ID),GRVL,GR
|
|
622 format(i4,1p2e10.2,0pf10.1,1p10e10.2)
|
|
wbar=wbarm/dm(nd)
|
|
if(p.gt.0.) alpg=omeg32*wbar*dens(id)*viscd(id)/p
|
|
pto=ptotal(id)
|
|
if(pto.gt.0.) alpt=omeg32*wbar*dens(id)*viscd(id)/pto
|
|
disip=viscd(id)*dens(id)*edisc
|
|
write(98,698) id,dm(id),zd(id),abrosd(id),temp(id),pgint,
|
|
* ptotal(id),p,dens(id),disip,alpg,alpt
|
|
|
|
if(id.eq.nd) write(98,698) id,edisc,viscd(id),dens(id),p,
|
|
* omeg32,wbar
|
|
698 format(i3,1p11d11.4)
|
|
end if
|
|
END DO
|
|
C
|
|
if(idisk.eq.1) then
|
|
if(pgint.gt.0.) alpgav=omeg32*wbar/pgint*dm(nd)
|
|
if(ptint.gt.0.) alptav=omeg32*wbar/ptint*dm(nd)
|
|
write(6,606) omeg32,wbar,alpgav,alptav
|
|
606 format(//
|
|
* ' omega*3/2 ',1pe10.2/
|
|
* ' wbar ',1pe10.2/
|
|
* ' equivalent alpha for Pg ',1pe10.2/
|
|
* ' equivalent alpha for Ptot',1pe10.2)
|
|
end if
|
|
C
|
|
IF(.NOT.LTE) THEN
|
|
C
|
|
C ************ Print b-factors on unit 12 and
|
|
C "absolute" b-factors on unit 22
|
|
c the traditional b-factors are already computed (BFAC),
|
|
c here we compute the absolute ones
|
|
c
|
|
LTE=.TRUE.
|
|
DO ID=1,ND
|
|
CALL WNSTOR(ID)
|
|
CALL SABOLF(ID)
|
|
CALL RATMAL(ID,AES,BES)
|
|
CALL LEVSOL(AES,BES,POPLTE,IIFOR,NLEVEL,0)
|
|
DO I=1,NLEVEL
|
|
BFAB(I,ID)=1.
|
|
IF(POPLTE(I).GT.0.) BFAB(I,ID)=POPUL(I,ID)/POPLTE(I)
|
|
END DO
|
|
END DO
|
|
LTE=.FALSE.
|
|
idlte=idlt0
|
|
C
|
|
NUMP=NLEVEL+3
|
|
IF(IFMOL.GT.0) NUMP=NLEVEL+4
|
|
IF(IDISK.EQ.0) THEN
|
|
NUMPAR=NUMP
|
|
IF(IFMOL.GT.0) NUMPAR=-NUMPAR
|
|
WRITE(12,701) ND,NUMPAR
|
|
WRITE(12,702) (DM(ID),ID=1,ND)
|
|
WRITE(22,701) ND,NUMPAR
|
|
WRITE(22,704) (DM(ID),ID=1,ND)
|
|
DO ID=1,ND
|
|
IF(IFMOL.EQ.0) THEN
|
|
WRITE(12,703) TEMP(ID),ELEC(ID),DENS(ID),
|
|
* (BFAC(J,ID),J=1,NLEVEL)
|
|
WRITE(22,703) TEMP(ID),ELEC(ID),DENS(ID),
|
|
* (BFAB(J,ID),J=1,NLEVEL)
|
|
ELSE
|
|
WRITE(12,703) TEMP(ID),ELEC(ID),DENS(ID),TOTN(ID),
|
|
* (BFAC(J,ID),J=1,NLEVEL)
|
|
WRITE(22,703) TEMP(ID),ELEC(ID),DENS(ID),TOTN(ID),
|
|
* (BFAB(J,ID),J=1,NLEVEL)
|
|
END IF
|
|
END DO
|
|
ELSE
|
|
NUMPAR=NUMP+1
|
|
IF(IFMOL.GT.0) NUMPAR=-NUMPAR
|
|
WRITE(12,701) ND,NUMPAR
|
|
WRITE(12,702) (DM(ID),ID=1,ND)
|
|
WRITE(22,701) ND,NUMPAR
|
|
WRITE(22,704) (DM(ID),ID=1,ND)
|
|
DO ID=1,ND
|
|
IF(IFMOL.EQ.0) THEN
|
|
WRITE(12,703) TEMP(ID),ELEC(ID),DENS(ID),ZD(ID),
|
|
* (BFAC(J,ID),J=1,NLEVEL)
|
|
WRITE(22,703) TEMP(ID),ELEC(ID),DENS(ID),ZD(ID),
|
|
* (BFAB(J,ID),J=1,NLEVEL)
|
|
ELSE
|
|
WRITE(12,703) TEMP(ID),ELEC(ID),DENS(ID),TOTN(ID),
|
|
* ZD(ID),(BFAC(J,ID),J=1,NLEVEL)
|
|
WRITE(22,703) TEMP(ID),ELEC(ID),DENS(ID),TOTN(ID),
|
|
* ZD(ID),(BFAB(J,ID),J=1,NLEVEL)
|
|
END IF
|
|
END DO
|
|
END IF
|
|
END IF
|
|
C
|
|
600 FORMAT(/' ************************************'/
|
|
* ' FINAL RESULTS:'/' '/
|
|
* ' MODEL QUANTITIES IN',I3,'. ITERATION'/
|
|
* ' ************************************'/)
|
|
c 601 FORMAT(' IJ',8X,'FREQ',11X,'LAMBDA',8X,'FLUX',9X,
|
|
c * 'FH',4X,'LOG(FNU)',3X,'LOG(FLAM)'/)
|
|
602 FORMAT(1PE15.8,1PE12.4,0PF7.3)
|
|
603 FORMAT(' TOTAL SURFACE FLUX',1PD15.8)
|
|
611 FORMAT(/' ----------------------'/
|
|
* ' FINAL MODEL ATMOSPHERE'/
|
|
* ' ----------------------'/
|
|
* ' ID MASS',6X,'TAUROSS',5X,'TEMP',7X,'NE',9X,'DENS',
|
|
* 6X,'P_gas',4X,'LOG(G_rad)',3x,'RAD/TOT',3x,'CON/TOT',
|
|
* 2x,'(RAD+CON)/TOT'/)
|
|
612 FORMAT(1H ,I3,1P2E11.3,0PF10.1,1P6E11.3,3E13.5)
|
|
613 FORMAT(/' ---------------------'/
|
|
* ' FINAL DISK RING MODEL'/
|
|
* ' ---------------------'/
|
|
*' ID MASS',4X,'TAUROSS',5X,'TEMP',7X,'NE',7X,'RHO',
|
|
* 7X,'PGAS'5X,'CON/TOT RAD.FLX DISSIP',2X,
|
|
* 'FLX/DISSIP',4X,'Z',7X,
|
|
* 'LOG G',2X,'LOG G(RAD)'/)
|
|
614 FORMAT(F15.3,1pe15.3)
|
|
701 FORMAT(2I5)
|
|
702 FORMAT(1P8E10.3)
|
|
703 FORMAT(1P5E15.6)
|
|
704 FORMAT(1P6E13.6)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
C
|
|
|
|
SUBROUTINE SOLVE
|
|
C ================
|
|
C
|
|
C Driving procedure for complete linearization
|
|
C Solution of the system
|
|
C
|
|
C A * del(PSI{ID-1}) + B * del(PSI{ID}) + C * del(PSI{ID+1}) = VECL
|
|
C
|
|
C where PSI{ID} means vector PSI at depth ID,
|
|
C del(PSI{ID}) linearization corrections to PSI;
|
|
C Vector PSI is a vector composed of all unknown model parameters,
|
|
C the choice and order of which is given by input parameters INHE,
|
|
C INRE,INPC,INSE, and INMP (see START).
|
|
C A,B,C are the so-called matrices of complete linearization
|
|
C and VECL is the corressponding rhs vector, pertinent to depth ID.
|
|
C
|
|
C The above block tridiagonal system is solved by the standard
|
|
C Gaussian elimination, ie.
|
|
C
|
|
C del(PSI{ID}) = BET{ID} - ALF{ID} * del{PSI{ID+1}),
|
|
C
|
|
C (the so-called back-solution),
|
|
C where the auxiliary matrix ALF and vector BET, at each depth,
|
|
C are given by (the so-called forward elimination)
|
|
C
|
|
C ALF{ID} = (B - A * ALF{ID-1})**-1 * C ,
|
|
C and
|
|
C BET{ID} = (B - A * ALF{ID-1})**-1 * (VECL - A * BET{ID-1})
|
|
C
|
|
C Programming notes:
|
|
C Although matrices A,B,C have size (NN x NN), only matrix B is
|
|
C represented as array (MTOT x MTOT), MTOT being the maximum value
|
|
C of NN; other matrices have large parts void, so that
|
|
C A - is represented as array (MAROWS x MTOT), the maximum number of
|
|
C rows of A is MFREX+2 (because only the transfer equations, the
|
|
C hydrostatic equilibrium, and optionally radiative equilibrium
|
|
C equations couple the depth point ID and ID-1)
|
|
C C - is represented as array (MFREX x MCCOLS), ie.
|
|
C the maximum number of rows is MFREX (only the transfer
|
|
C equations couple the depth point ID and ID+1);
|
|
C and since the upper square block (NFREQE x NFREQE), corresponding
|
|
C to the radiative transfer equations, is diagonal, all the
|
|
C transfer equations may be represemted as one column, thus
|
|
C reducing the number of columns of C to number of constraint
|
|
C equations + 1, ie. the maximum number to MCCOLS=MLEVEL+5.
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
COMMON/CMATZD/CZZ,CZN,CZE,CZM
|
|
DIMENSION ALF(MTOT,MTOT),BET(MTOT,MDEPTH),DPSI(MTOT)
|
|
EQUIVALENCE (DPSI(1),Y2(1))
|
|
C
|
|
REWIND 91
|
|
REWIND 92
|
|
REWIND 93
|
|
N=NN
|
|
M=NFREQE
|
|
IF(IFALI.LE.5) THEN
|
|
M1=NFREQE+2
|
|
IF(ICONV.GT.0.OR.NRETC.NE.0) M1=NFREQE+3
|
|
ELSE
|
|
M1=N
|
|
END IF
|
|
C
|
|
C --------------------------------
|
|
C First part - forward elimination
|
|
C --------------------------------
|
|
C
|
|
LMKA=.FALSE.
|
|
IF(ITER.LT.NITER) LMKA=KANT(ITER+1).EQ.1
|
|
LASO=KANT(ITER).EQ.1
|
|
DO ID=1,ND
|
|
C
|
|
C evaluate matrices A,B,C, and rhs vector VECL, corresponding
|
|
C to depth ID
|
|
C
|
|
CALL WNSTOR(ID)
|
|
IF(.NOT.LASO) THEN
|
|
CALL MATGEN(ID)
|
|
IF(LMKA) WRITE(93) ((A(I,J),I=1,M1),J=1,N)
|
|
ELSE
|
|
CALL RHSGEN(ID)
|
|
READ(93) ((A(I,J),I=1,M1),J=1,N)
|
|
ENDIF
|
|
IF(ID.GT.1) THEN
|
|
C
|
|
C expression VECL-A*BET
|
|
C
|
|
DO I=1,M1
|
|
SUM=0.
|
|
DO J=1,N
|
|
SUM=SUM+A(I,J)*BET(J,ID-1)
|
|
eND DO
|
|
VECL(I)=VECL(I)-SUM
|
|
END DO
|
|
C
|
|
C expression B-A*ALF, stored in array B
|
|
C
|
|
IF(.NOT.LASO) THEN
|
|
DO I=1,M1
|
|
DO J=1,N
|
|
SUM=0.
|
|
DO K=1,N
|
|
SUM=SUM+A(I,K)*ALF(K,J)
|
|
END DO
|
|
B(I,J)=B(I,J)-SUM
|
|
END DO
|
|
END DO
|
|
END IF
|
|
END IF
|
|
C
|
|
C expression (B-A*ALF)**-1, stored in array B
|
|
C
|
|
IF(LASO) THEN
|
|
READ(92) ((B(I,J),I=1,N),J=1,N)
|
|
ELSE
|
|
CALL MATINV(B,N,MTOT)
|
|
IF(LMKA) WRITE(92) ((B(I,J),I=1,N),J=1,N)
|
|
END IF
|
|
C
|
|
C auxiliary vector BET = (B-A*ALF)**-1 * (L-A*BET)
|
|
C
|
|
DO I=1,N
|
|
SUM=0.
|
|
DO J=1,N
|
|
SUM=SUM+B(I,J)*VECL(J)
|
|
END DO
|
|
BET(I,ID)=SUM
|
|
END DO
|
|
C
|
|
IF(ID.LT.ND) THEN
|
|
C
|
|
C auxiliary matrix ALF = (B-A*ALF)**-1 * C
|
|
C
|
|
IF(LASO) THEN
|
|
IF(ID.LT.(ND-1)) THEN
|
|
READ(91) ALF(1,1)
|
|
ELSE
|
|
READ(91) ((ALF(I,J),I=1,N),J=1,N)
|
|
ENDIF
|
|
ELSE
|
|
DO I=1,N
|
|
DO J=1,M
|
|
ALF(I,J)=B(I,J)*C(J,J)
|
|
END DO
|
|
END DO
|
|
DO I=1,N
|
|
DO J=M+1,N
|
|
SUM=0.
|
|
DO K=1,M
|
|
SUM=SUM+B(I,K)*C(K,J)
|
|
END DO
|
|
IF(IFALI.GT.5.OR.ICONV.LE.2) THEN
|
|
DO K=M+1,N
|
|
SUM=SUM+B(I,K)*C(K,J)
|
|
END DO
|
|
END IF
|
|
ALF(I,J)=SUM
|
|
END DO
|
|
C
|
|
C taking into account the separate elements of matrix C
|
|
C
|
|
BZ=0.
|
|
IF(INZD.GT.0) BZ=B(I,M+INZD)
|
|
IF(INZD.GT.0) ALF(I,M+INZD)=ALF(I,M+INZD)+BZ*CZZ
|
|
IF(INHE.GT.0) ALF(I,M+INHE)=ALF(I,M+INHE)+BZ*CZN
|
|
IF(INPC.GT.0) ALF(I,M+INPC)=ALF(I,M+INPC)+BZ*CZE
|
|
IF(INMP.GT.0) ALF(I,M+INMP)=ALF(I,M+INMP)+BZ*CZM
|
|
END DO
|
|
C
|
|
C store the auxiliary matrix ALF
|
|
C
|
|
WRITE(91) ((ALF(I,J),I=1,N),J=1,N)
|
|
END IF
|
|
END IF
|
|
END DO
|
|
C
|
|
C --------------------------
|
|
C Second part - backsolution
|
|
C --------------------------
|
|
C
|
|
DO I=1,N
|
|
VECL(I)=0.
|
|
END DO
|
|
DO IID=1,ND
|
|
ID=ND-IID+1
|
|
IF(ID.LT.ND) THEN
|
|
C
|
|
C read old PSI
|
|
C
|
|
DO I=1,N
|
|
PSI0(I)=PSY0(I,ID)
|
|
END DO
|
|
C
|
|
C read auxiliary matrix ALF and vector BET
|
|
C
|
|
BACKSPACE 91
|
|
READ(91) ((ALF(I,J),I=1,N),J=1,N)
|
|
BACKSPACE 91
|
|
C
|
|
C expression ALF * delta(PSI{previous depth}), stored
|
|
C in array VECL
|
|
C
|
|
DO I=1,N
|
|
SUM=0.
|
|
DO J=1,N
|
|
SUM=SUM+ALF(I,J)*DPSI(J)
|
|
END DO
|
|
VECL(I)=SUM
|
|
END DO
|
|
END IF
|
|
C
|
|
C finally, evaluate delta(PSI) and corresponding relative changes
|
|
C delta(PSI)/PSI
|
|
C
|
|
DO I=1,N
|
|
DPSI(I)=BET(I,ID)-VECL(I)
|
|
CHAN=0.
|
|
IF(PSI0(I).GT.0.) CHAN=DPSI(I)/PSI0(I)
|
|
BET(I,ID)=CHAN
|
|
C
|
|
C over-relaxation
|
|
C
|
|
IF(I.GE.NFREQE+INSE) CHAN=ORELAX*CHAN
|
|
C
|
|
C To avoid instabilities, relative changes of all quantities
|
|
C are artificially limited not to exceed certain predefined values
|
|
C
|
|
IF(CHAN.LE.UN/DPSILG-UN) CHAN=UN/DPSILG-UN
|
|
IF(CHAN.GE.DPSILG-UN) CHAN=DPSILG-UN
|
|
IF(INRE.GT.0) THEN
|
|
DPLP=DPSILT-UN
|
|
DPLM=UN/DPSILT-UN
|
|
IF(CHAN.LE.DPLM.AND.I.EQ.NFREQE+INRE) CHAN=DPLM
|
|
IF(CHAN.GT.DPLP.AND.I.EQ.NFREQE+INRE) CHAN=DPLP
|
|
END IF
|
|
IF(INHE.GT.0) THEN
|
|
DPLP=DPSILN-UN
|
|
DPLM=UN/DPSILN-UN
|
|
IF(CHAN.LE.DPLM.AND.I.EQ.NFREQE+INHE) CHAN=DPLM
|
|
IF(CHAN.GT.DPLP.AND.I.EQ.NFREQE+INHE) CHAN=DPLP
|
|
END IF
|
|
IF(INPC.GT.0) THEN
|
|
DPLP=DPSILN-UN
|
|
DPLM=UN/DPSILN-UN
|
|
IF(CHAN.LE.DPLM.AND.I.EQ.NFREQE+INPC) CHAN=DPLM
|
|
IF(CHAN.GT.DPLP.AND.I.EQ.NFREQE+INPC) CHAN=DPLP
|
|
END IF
|
|
IF(INDL.GT.0) THEN
|
|
DPLP=DPSILD-UN
|
|
DPLM=UN/DPSILD-UN
|
|
IF(CHAN.LE.DPLM.AND.I.EQ.NFREQE+INDL) CHAN=DPLM
|
|
IF(CHAN.GT.DPLP.AND.I.EQ.NFREQE+INDL) CHAN=DPLP
|
|
END IF
|
|
C
|
|
C new vector PSI
|
|
C
|
|
PSI0(I)=PSI0(I)*(CHAN+UN)
|
|
END DO
|
|
IF(INRE.GT.0) CHANT(ID)=BET(NFREQE+INRE,ID)
|
|
C
|
|
C new vector PSI is stored
|
|
C
|
|
DO I=1,N
|
|
PSY0(I,ID)=PSI0(I)
|
|
END DO
|
|
END DO
|
|
C
|
|
c call lucy
|
|
C
|
|
C print out the relative changes of vector PSI
|
|
C
|
|
CALL PRCHAN(BET,CHMX,CHMT)
|
|
C
|
|
C STOP if changes become too large
|
|
C
|
|
IF(ITER.NE.1 .AND. ABS(CHMX).GT.1.D16) THEN
|
|
WRITE(6,610) ITER,CHMX
|
|
WRITE(10,610) ITER,CHMX
|
|
STOP
|
|
END IF
|
|
|
|
C Reset iron lines cross-sections if changes are still large
|
|
|
|
if(iter.le.1) LIROST=.FALSE.
|
|
LITEK=.FALSE.
|
|
if(iter.eq.7 .or. iter.eq.11 .or. iter.eq.15) LITEK=.TRUE.
|
|
if(chmt.gt.chmaxt .and. ispodf.ge.1) LIROST=.TRUE.
|
|
if(LITEK.and.LIROST) then
|
|
call iroset
|
|
LIROST=.FALSE.
|
|
end if
|
|
|
|
C Set up Kantorovich method
|
|
|
|
IF(LASO) THEN
|
|
WRITE(6,600) ITER
|
|
WRITE(10,600) ITER
|
|
END IF
|
|
c END IF
|
|
C
|
|
C Finally, set up quantity LFIN that indicates whether or not
|
|
C this iteration of complete linearization is the last one
|
|
C
|
|
LFIN=ABS(CHMX).LE.CHMAX.OR.ITER.GE.NITER
|
|
RETURN
|
|
600 FORMAT(' **** KANTOROVICH acceleration: ITER',I4)
|
|
610 FORMAT(' **** STOP in SOLVE after ITER',I4,/,
|
|
* ' Max change:',1PE12.2)
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE SOLVES
|
|
C =================
|
|
C
|
|
C Same routine than SOLVE, but used for small systems of
|
|
C equations (NN<=MSMX) to keep matrices in memory and to avoid I/O
|
|
C
|
|
C Driving procedure for complete linearization
|
|
C Solution of the system
|
|
C
|
|
C A * del(PSI{ID-1}) + B * del(PSI{ID}) + C * del(PSI{ID+1}) = VECL
|
|
C
|
|
C where PSI{ID} means vector PSI at depth ID,
|
|
C del(PSI{ID}) linearization corrections to PSI;
|
|
C Vector PSI is a vector composed of all unknown model parameters,
|
|
C the choice and order of which is given by input parameters INHE,
|
|
C INRE,INPC,INSE, and INMP (see START).
|
|
C A,B,C are the so-called matrices of complete linearization
|
|
C and VECL is the corressponding rhs vector, pertinent to depth ID.
|
|
C
|
|
C The above block tridiagonal system is solved by the standard
|
|
C Gaussian elimination, ie.
|
|
C
|
|
C del(PSI{ID}) = BET{ID} - ALF{ID} * del{PSI{ID+1}),
|
|
C
|
|
C (the so-called back-solution),
|
|
C where the auxiliary matrix ALF and vector BET, at each depth,
|
|
C are given by (the so-called forward elimination)
|
|
C
|
|
C ALF{ID} = (B - A * ALF{ID-1})**-1 * C ,
|
|
C and
|
|
C BET{ID} = (B - A * ALF{ID-1})**-1 * (VECL - A * BET{ID-1})
|
|
C
|
|
C Programming notes:
|
|
C Although matrices A,B,C have size (NN x NN), only matrix B is
|
|
C represented as array (MTOT x MTOT), MTOT being the maximum value
|
|
C of NN; other matrices have large parts void, so that
|
|
C A - is represented as array (MAROWS x MTOT), the maximum number of
|
|
C rows of A is MFREX+2 (because only the transfer equations, the
|
|
C hydrostatic equilibrium, and optionally radiative equilibrium
|
|
C equations couple the depth point ID and ID-1)
|
|
C C - is represented as array (MFREX x MCCOLS), ie.
|
|
C the maximum number of rows is MFREX (only the transfer
|
|
C equations couple the depth point ID and ID+1);
|
|
C and since the upper square block (NFREQE x NFREQE), corresponding
|
|
C to the radiative transfer equations, is diagonal, all the
|
|
C transfer equations may be represemted as one column, thus
|
|
C reducing the number of columns of C to number of constraint
|
|
C equations + 1, ie. the maximum number to MCCOLS=MLEVEL+5.
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
DIMENSION ALF(MTOT,MTOT),BET(MTOT,MDEPTH),DPSI(MTOT)
|
|
COMMON/STOMAT/STOA(MSMX,MSMX,MDEPTH),STOB(MSMX,MSMX,MDEPTH),
|
|
* STOALF(MSMX,MSMX,MDEPTH)
|
|
COMMON/CMATZD/CZZ,CZN,CZE,CZM
|
|
EQUIVALENCE (DPSI(1),Y2(1))
|
|
C
|
|
N=NN
|
|
M=NFREQE
|
|
IF(IFALI.LE.5) THEN
|
|
M1=NFREQE+2
|
|
IF(ICONV.GT.0.OR.NRETC.NE.0) M1=NFREQE+3
|
|
ELSE
|
|
M1=N
|
|
END IF
|
|
C
|
|
C --------------------------------
|
|
C First part - forward elimination
|
|
C --------------------------------
|
|
C
|
|
LMKA=.FALSE.
|
|
IF(ITER.LT.NITER) LMKA=KANT(ITER+1).EQ.1
|
|
LASO=KANT(ITER).EQ.1
|
|
DO ID=1,ND
|
|
C
|
|
C evaluate matrices A,B,C, and rhs vector VECL, corresponding
|
|
C to depth ID
|
|
C
|
|
CALL WNSTOR(ID)
|
|
IF(.NOT.LASO) THEN
|
|
CALL MATGEN(ID)
|
|
IF(LMKA) THEN
|
|
DO J=1,N
|
|
DO I=1,M1
|
|
STOA(I,J,ID)=A(I,J)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
ELSE
|
|
CALL RHSGEN(ID)
|
|
DO J=1,N
|
|
DO I=1,M1
|
|
A(I,J)=STOA(I,J,ID)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
IF(ID.GT.1) THEN
|
|
C
|
|
C expression VECL-A*BET
|
|
C
|
|
DO 20 I=1,M1
|
|
SUM=0.
|
|
DO 10 J=1,N
|
|
SUM=SUM+A(I,J)*BET(J,ID-1)
|
|
10 CONTINUE
|
|
VECL(I)=VECL(I)-SUM
|
|
20 CONTINUE
|
|
C
|
|
C expression B-A*ALF, stored in array B
|
|
C
|
|
IF(.NOT.LASO) THEN
|
|
DO I=1,M1
|
|
DO J=1,N
|
|
SUM=0.
|
|
DO K=1,N
|
|
SUM=SUM+A(I,K)*ALF(K,J)
|
|
END DO
|
|
B(I,J)=B(I,J)-SUM
|
|
END DO
|
|
END DO
|
|
END IF
|
|
END IF
|
|
C
|
|
C expression (B-A*ALF)**-1, stored in array B
|
|
C
|
|
IF(LASO) THEN
|
|
DO J=1,N
|
|
DO I=1,N
|
|
B(I,J)=STOB(I,J,ID)
|
|
END DO
|
|
END DO
|
|
ELSE
|
|
CALL MATINV(B,N,MTOT)
|
|
IF(LMKA) THEN
|
|
DO J=1,N
|
|
DO I=1,N
|
|
STOB(I,J,ID)=B(I,J)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
END IF
|
|
C
|
|
C auxiliary vector BET = (B-A*ALF)**-1 * (L-A*BET)
|
|
C
|
|
DO I=1,N
|
|
SUM=0.
|
|
DO J=1,N
|
|
SUM=SUM+B(I,J)*VECL(J)
|
|
END DO
|
|
BET(I,ID)=SUM
|
|
END DO
|
|
C
|
|
IF(ID.LT.ND) THEN
|
|
C
|
|
C auxiliary matrix ALF = (B-A*ALF)**-1 * C
|
|
C
|
|
IF(LASO) THEN
|
|
DO J=1,N
|
|
DO I=1,N
|
|
ALF(I,J)=STOALF(I,J,ID)
|
|
END DO
|
|
END DO
|
|
ELSE
|
|
DO I=1,N
|
|
DO J=1,M
|
|
ALF(I,J)=B(I,J)*C(J,J)
|
|
END DO
|
|
END DO
|
|
DO I=1,N
|
|
DO J=M+1,N
|
|
SUM=0.
|
|
DO K=1,M
|
|
SUM=SUM+B(I,K)*C(K,J)
|
|
END DO
|
|
IF(IFALI.GT.5.OR.ICONV.LE.2) THEN
|
|
DO K=M+1,N
|
|
SUM=SUM+B(I,K)*C(K,J)
|
|
END DO
|
|
END IF
|
|
ALF(I,J)=SUM
|
|
END DO
|
|
C
|
|
C taking into account the separate elements of matrix C
|
|
C
|
|
BZ=0.
|
|
IF(INZD.GT.0) BZ=B(I,M+INZD)
|
|
IF(INZD.GT.0) ALF(I,M+INZD)=ALF(I,M+INZD)+BZ*CZZ
|
|
IF(INHE.GT.0) ALF(I,M+INHE)=ALF(I,M+INHE)+BZ*CZN
|
|
IF(INPC.GT.0) ALF(I,M+INPC)=ALF(I,M+INPC)+BZ*CZE
|
|
IF(INMP.GT.0) ALF(I,M+INMP)=ALF(I,M+INMP)+BZ*CZM
|
|
END DO
|
|
C
|
|
C store the auxiliary matrix ALF
|
|
C
|
|
DO J=1,N
|
|
DO I=1,N
|
|
STOALF(I,J,ID)=ALF(I,J)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
END IF
|
|
END DO
|
|
C
|
|
C --------------------------
|
|
C Second part - backsolution
|
|
C --------------------------
|
|
C
|
|
DO I=1,N
|
|
VECL(I)=0.
|
|
END DO
|
|
C
|
|
DO IID=1,ND
|
|
ID=ND-IID+1
|
|
IF(ID.LT.ND) THEN
|
|
C
|
|
C read old PSI
|
|
C
|
|
DO I=1,N
|
|
PSI0(I)=PSY0(I,ID)
|
|
END DO
|
|
C
|
|
C read auxiliary matrix ALF and vector BET
|
|
C
|
|
DO J=1,N
|
|
DO I=1,N
|
|
ALF(I,J)=STOALF(I,J,ID)
|
|
END DO
|
|
END DO
|
|
C
|
|
C expression ALF * delta(PSI{previous depth}), stored
|
|
C in array VECL
|
|
C
|
|
DO I=1,N
|
|
SUM=0.
|
|
DO J=1,N
|
|
SUM=SUM+ALF(I,J)*DPSI(J)
|
|
END DO
|
|
VECL(I)=SUM
|
|
END DO
|
|
END IF
|
|
C
|
|
C finally, evaluate delta(PSI) and corresponding relative changes
|
|
C delta(PSI)/PSI
|
|
C
|
|
DO I=1,N
|
|
DPSI(I)=BET(I,ID)-VECL(I)
|
|
CHAN=0.
|
|
IF(PSI0(I).GT.0.) CHAN=DPSI(I)/PSI0(I)
|
|
BET(I,ID)=CHAN
|
|
C
|
|
C over-relaxation
|
|
C
|
|
IF(I.GE.NFREQE+INSE) CHAN=ORELAX*CHAN
|
|
C
|
|
C To avoid instabilities, relative changes of all quantities
|
|
C are artificially limited not to exceed certain predefined values
|
|
C
|
|
IF(CHAN.LE.UN/DPSILG-UN) CHAN=UN/DPSILG-UN
|
|
IF(CHAN.GE.DPSILG-UN) CHAN=DPSILG-UN
|
|
IF(INRE.GT.0) THEN
|
|
DPLP=DPSILT-UN
|
|
DPLM=UN/DPSILT-UN
|
|
IF(CHAN.LE.DPLM.AND.I.EQ.NFREQE+INRE) CHAN=DPLM
|
|
IF(CHAN.GT.DPLP.AND.I.EQ.NFREQE+INRE) CHAN=DPLP
|
|
END IF
|
|
IF(INHE.GT.0) THEN
|
|
DPLP=DPSILN-UN
|
|
DPLM=UN/DPSILN-UN
|
|
IF(CHAN.LE.DPLM.AND.I.EQ.NFREQE+INHE) CHAN=DPLM
|
|
IF(CHAN.GT.DPLP.AND.I.EQ.NFREQE+INHE) CHAN=DPLP
|
|
END IF
|
|
IF(INPC.GT.0) THEN
|
|
DPLP=DPSILN-UN
|
|
DPLM=UN/DPSILN-UN
|
|
IF(CHAN.LE.DPLM.AND.I.EQ.NFREQE+INPC) CHAN=DPLM
|
|
IF(CHAN.GT.DPLP.AND.I.EQ.NFREQE+INPC) CHAN=DPLP
|
|
END IF
|
|
IF(INDL.GT.0) THEN
|
|
DPLP=DPSILD-UN
|
|
DPLM=UN/DPSILD-UN
|
|
IF(CHAN.LE.DPLM.AND.I.EQ.NFREQE+INDL) CHAN=DPLM
|
|
IF(CHAN.GT.DPLP.AND.I.EQ.NFREQE+INDL) CHAN=DPLP
|
|
END IF
|
|
C
|
|
C new vector PSI
|
|
C
|
|
PSI0(I)=PSI0(I)*(CHAN+UN)
|
|
END DO
|
|
IF(INRE.GT.0) CHANT(ID)=BET(NFREQE+INRE,ID)
|
|
C
|
|
C new vector PSI is stored
|
|
C
|
|
DO I=1,N
|
|
PSY0(I,ID)=PSI0(I)
|
|
END DO
|
|
END DO
|
|
C
|
|
C print out the relative changes of vector PSI
|
|
C
|
|
CALL PRCHAN(BET,CHMX,CHMT)
|
|
C
|
|
C STOP if changes become too large
|
|
C
|
|
IF(ITER.NE.1 .AND. ABS(CHMX).GT.1.D16) THEN
|
|
WRITE(6,610) ITER,CHMX
|
|
WRITE(10,610) ITER,CHMX
|
|
STOP
|
|
END IF
|
|
|
|
C Reset iron lines cross-sections if changes are still large
|
|
|
|
if(iter.le.1) LIROST=.FALSE.
|
|
LITEK=.FALSE.
|
|
if(iter.eq.7 .or. iter.eq.11 .or. iter.eq.15) LITEK=.TRUE.
|
|
if(chmt.gt.chmaxt .and. ispodf.ge.1) LIROST=.TRUE.
|
|
if(LITEK.and.LIROST) then
|
|
call iroset
|
|
LIROST=.FALSE.
|
|
end if
|
|
|
|
C Set up Kantorovich method
|
|
|
|
IF(LASO) THEN
|
|
WRITE(6,600) ITER
|
|
WRITE(10,600) ITER
|
|
END IF
|
|
C
|
|
C Finally, set up quantity LFIN that indicates whether or not
|
|
C this iteration of complete linearization is the last one
|
|
C
|
|
LFIN=ABS(CHMX).LE.CHMAX.OR.ITER.GE.NITER
|
|
C
|
|
600 FORMAT(' **** KANTOROVICH acceleration: ITER',I4)
|
|
610 FORMAT(' **** STOP in SOLVE after ITER',I4,/,
|
|
* ' Max change:',1PE12.2)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE MATGEN(ID)
|
|
C =====================
|
|
C
|
|
C Auxiliary procedure for SOLVE
|
|
C controls evaluation of matrices A,B, and C
|
|
C
|
|
C Input: ID - depth index
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
C
|
|
C
|
|
C evaluation of the opacity, emissivity, scattering, and
|
|
C their derivatives, at the current depth point ID;
|
|
C
|
|
DO I=1,NN
|
|
PSI0(I)=PSY0(I,ID)
|
|
END DO
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
WDEP0(IJ)=W(IJT)
|
|
RAD0(IJ)=RADEX(IJ,ID)
|
|
FK0(IJ)=FAKEX(IJ,ID)
|
|
ABSO0(IJ)=ABSOEX(IJ,ID)
|
|
EMIS0(IJ)=EMISEX(IJ,ID)
|
|
SCAT0(IJ)=SCATEX(IJ,ID)
|
|
DABT0(IJ)=DABTEX(IJ,ID)
|
|
DEMT0(IJ)=DEMTEX(IJ,ID)
|
|
DABN0(IJ)=DABNEX(IJ,ID)
|
|
DEMN0(IJ)=DEMNEX(IJ,ID)
|
|
DABM0(IJ)=DABMEX(IJ,ID)
|
|
DEMM0(IJ)=DEMMEX(IJ,ID)
|
|
DO II=1,NLVEXP
|
|
DRCH0(II,IJ)=DRCHEX(II,IJ,ID)
|
|
DRET0(II,IJ)=DRETEX(II,IJ,ID)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
C
|
|
IF(ID.GT.1) THEN
|
|
DO I=1,NN
|
|
PSIM(I)=PSY0(I,ID-1)
|
|
END DO
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
RADM(IJ)=RADEX(IJ,ID-1)
|
|
FKM(IJ)=FAKEX(IJ,ID-1)
|
|
ABSOM(IJ)=ABSOEX(IJ,ID-1)
|
|
EMISM(IJ)=EMISEX(IJ,ID-1)
|
|
SCATM(IJ)=SCATEX(IJ,ID-1)
|
|
DABTM(IJ)=DABTEX(IJ,ID-1)
|
|
DEMTM(IJ)=DEMTEX(IJ,ID-1)
|
|
DABNM(IJ)=DABNEX(IJ,ID-1)
|
|
DEMNM(IJ)=DEMNEX(IJ,ID-1)
|
|
DABMM(IJ)=DABMEX(IJ,ID-1)
|
|
DEMMM(IJ)=DEMMEX(IJ,ID-1)
|
|
DO II=1,NLVEXP
|
|
DRCHM(II,IJ)=DRCHEX(II,IJ,ID-1)
|
|
DRETM(II,IJ)=DRETEX(II,IJ,ID-1)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
END IF
|
|
C
|
|
IF(ID.LT.ND) THEN
|
|
DO I=1,NN
|
|
PSIP(I)=PSY0(I,ID+1)
|
|
END DO
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
RADP(IJ)=RADEX(IJ,ID+1)
|
|
FKP(IJ)=FAKEX(IJ,ID+1)
|
|
ABSOP(IJ)=ABSOEX(IJ,ID+1)
|
|
EMISP(IJ)=EMISEX(IJ,ID+1)
|
|
SCATP(IJ)=SCATEX(IJ,ID+1)
|
|
DABTP(IJ)=DABTEX(IJ,ID+1)
|
|
DEMTP(IJ)=DEMTEX(IJ,ID+1)
|
|
DABNP(IJ)=DABNEX(IJ,ID+1)
|
|
DEMNP(IJ)=DEMNEX(IJ,ID+1)
|
|
DABMP(IJ)=DABMEX(IJ,ID+1)
|
|
DEMMP(IJ)=DEMMEX(IJ,ID+1)
|
|
DO II=1,NLVEXP
|
|
DRCHP(II,IJ)=DRCHEX(II,IJ,ID+1)
|
|
DRETP(II,IJ)=DRETEX(II,IJ,ID+1)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
END IF
|
|
C
|
|
C
|
|
C ------------------------------------------------------------
|
|
C Actual evaluation of matrices A,B,C, and the rhs vector VECL
|
|
C ------------------------------------------------------------
|
|
C
|
|
C First null arrays A,B,C,VECL
|
|
C
|
|
DO I=1,NN0
|
|
VECL(I)=0.
|
|
DO J=1,NN0
|
|
B(J,I)=0.
|
|
A(J,I)=0.
|
|
C(J,I)=0.
|
|
E(J,I)=0.
|
|
END DO
|
|
END DO
|
|
C
|
|
C for the sake of clarity, the matrices are evaluated by several
|
|
C different subroutines
|
|
C
|
|
IF(IDISK.EQ.0) THEN
|
|
CALL BRTE(ID)
|
|
IF(INHE.NE.0) CALL BHE(ID)
|
|
IF(INRE.NE.0) CALL BRE(ID)
|
|
ELSE
|
|
IF(IZSCAL.EQ.0) THEN
|
|
CALL BRTE(ID)
|
|
IF(INHE.NE.0.or.inzd.ne.0) CALL BHED(ID)
|
|
IF(INRE.NE.0) CALL BRE(ID)
|
|
ELSE
|
|
CALL BRTEZ(ID)
|
|
IF(INHE.NE.0.or.inzd.ne.0) CALL BHEZ(ID)
|
|
IF(INRE.NE.0) CALL BREZ(ID)
|
|
END IF
|
|
END IF
|
|
C
|
|
C contribution to matrix elements due to convection
|
|
C
|
|
CALL MATCON(ID)
|
|
C
|
|
IF(INSE.GT.0) THEN
|
|
CALL SABOLF(ID)
|
|
CALL BPOP(ID)
|
|
CALL EMAT(ID)
|
|
C
|
|
C skip rows corresponding to fully-zeroed populations
|
|
C
|
|
NSE=NFREQE+INSE
|
|
INONZ=NSE
|
|
DO II=NSE,NN0
|
|
IF(IGZERT(II-NSE+1).EQ.0) THEN
|
|
IF(INONZ.NE.II) THEN
|
|
DO JJ=1,NN0
|
|
B(INONZ,JJ)=B(II,JJ)
|
|
A(INONZ,JJ)=A(II,JJ)
|
|
C(INONZ,JJ)=C(II,JJ)
|
|
END DO
|
|
VECL(INONZ)=VECL(II)
|
|
END IF
|
|
INONZ=INONZ+1
|
|
END IF
|
|
END DO
|
|
C
|
|
C skip also corresponding columns
|
|
C
|
|
INONZ=NSE
|
|
DO II=NSE,NN0
|
|
IF(IGZERT(II-NSE+1).EQ.0) THEN
|
|
IF(INONZ.NE.II) THEN
|
|
DO JJ=1,NN
|
|
B(JJ,INONZ)=B(JJ,II)
|
|
A(JJ,INONZ)=A(JJ,II)
|
|
C(JJ,INONZ)=C(JJ,II)
|
|
END DO
|
|
END IF
|
|
INONZ=INONZ+1
|
|
END IF
|
|
END DO
|
|
END IF
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE BRTE(ID)
|
|
C ===================
|
|
C
|
|
C The part of matrices A,B,C corresponding to the linearized
|
|
C radiative transfer equation
|
|
C i.e. the first NFREQE rows
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
PARAMETER (XCON=8.0935D-21,YCON=1.68638E-10)
|
|
PARAMETER (SIXTH=UN/6.D0,
|
|
* THIRD=UN/3.D0)
|
|
C
|
|
IF(NFREQE.LE.0) RETURN
|
|
ispl=isplin
|
|
if(isplin.ge.5) isplin=isplin-5
|
|
NHE=NFREQE+INHE
|
|
NRE=NFREQE+INRE
|
|
NPC=NFREQE+INPC
|
|
NSE=NFREQE+INSE-1
|
|
NMP=NFREQE+INMP
|
|
C
|
|
GP=0.
|
|
GN=UN
|
|
IF(INMP.GT.0) THEN
|
|
GP=UN
|
|
GN=0.
|
|
END IF
|
|
c
|
|
c in the case of Compton scattering - boundary condition
|
|
c for the highest frequency
|
|
C
|
|
IJ1=1
|
|
if(icompt.gt.0.and.icombc.gt.0.and.ijex(1).gt.0) then
|
|
IJ1=2
|
|
ij=1
|
|
iji=nfreq
|
|
zj1=exp(-hk*freq(ij)/temp(id))
|
|
zj2=exp(-hk*freq(ij+1)/temp(id))
|
|
dlt=delj(iji-1,id)
|
|
if(ichcoo.eq.0) then
|
|
zj0=un/(hk*sqrt(freq(ij)*freq(ij+1))/temp(id))
|
|
zxx=un-3.*zj0+(un-dlt)*zj1+dlt*zj2
|
|
combid=zj0/dlnfr(iji-1)+(un-dlt)*zxx
|
|
comaid=-zj0/dlnfr(iji-1)+dlt*zxx
|
|
else
|
|
e2=ycon*temp(id)
|
|
zxx0=xcon*freq(ij)*(un+zj1)-3.*e2
|
|
zxxm=xcon*freq(ij+1)*(un+zj2)-3.*e2
|
|
zxx=(un-dlt)*zxx0+dlt*zxxm
|
|
combid=e2/dlnfr(iji-1)+(un-dlt)*zxx
|
|
comaid=-e2/dlnfr(iji-1)+dlt*zxx
|
|
end if
|
|
b(ij,ij)=combid
|
|
b(ij,ij+1)=comaid
|
|
vecl(ij)=-b(ij,ij)*rad(iji,id)-b(ij,ij+1)*rad(iji-1,id)
|
|
end if
|
|
C
|
|
C ----------------------------------------
|
|
C For ID = 1 - upper boundary condition
|
|
C ----------------------------------------
|
|
C
|
|
IF(ID.GT.1) GO TO 50
|
|
DDP=(DM(2)-DM(1))*HALF
|
|
DO IJ=IJ1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
OMEG0=ABSO0(IJ)/DENS(ID)
|
|
OMEGP=ABSOP(IJ)/DENS(ID+1)
|
|
DZP=OMEG0+OMEGP
|
|
DTAUP=DZP*DDP
|
|
ALF1=(FK0(IJ)*RAD0(IJ)-FKP(IJ)*RADP(IJ))/DTAUP
|
|
CHIEL0=SCAT0(IJ)
|
|
CHIELP=SCATP(IJ)
|
|
S0=(EMIS0(IJ)+CHIEL0*RAD0(IJ))/ABSO0(IJ)
|
|
BS=HALF*DTAUP
|
|
CS=0.
|
|
C2=0.
|
|
GAM2=0.
|
|
BET2=0.
|
|
SP=0.
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.0) then
|
|
call compt0(ijt,id,abso0(ij),cma,cmb,cmc,cme,cms,cmd)
|
|
s0=s0+cms
|
|
end if
|
|
C
|
|
IF(MOD(ISPLIN,3).GT.0) THEN
|
|
C
|
|
C Spline collocation and/or Hermitian method (ISPLIN=1 or 2) -
|
|
C both give the same expression for the boundary conditions
|
|
C
|
|
BS=DTAUP*THIRD
|
|
CS=HALF *BS
|
|
SP=(EMISP(IJ)+CHIELP*RADP(IJ))/ABSOP(IJ)
|
|
C2=CS/ABSOP(IJ)
|
|
GAM2=CS*(RADP(IJ)-SP)
|
|
END IF
|
|
C
|
|
C auxiliary quantities
|
|
C
|
|
ALF2=BS*(RAD0(IJ)-S0)
|
|
BET2=ALF2+GAM2
|
|
X1=(ALF1-BET2)/DZP
|
|
B2=(BS+Q0(IJT))/ABSO0(IJ)
|
|
B1=X1/DENS(1)
|
|
B1=B1+UU0(IJT)*S0*DM(1)*HALF/DENS(1)
|
|
C1=X1/DENS(2)
|
|
C
|
|
C *** elements of the IJ-th row of matrices B and C
|
|
C
|
|
RTN=OMEG0*WMM(1)*B1
|
|
B(IJ,NHE)=-GN*RTN
|
|
B1=B1-B2*S0
|
|
C
|
|
RTNC=OMEGP*WMM(2)*C1
|
|
C(IJ,NHE)=-GN*RTNC
|
|
C1=C1-C2*SP
|
|
C
|
|
B(IJ,NRE)=B1*DABT0(IJ)+B2*(DEMT0(IJ)+DST*RAD0(IJ))
|
|
C(IJ,NRE)=C1*DABTP(IJ)+C2*(DEMTP(IJ)+DST*RADP(IJ))
|
|
B(IJ,NPC)=B1*DABN0(IJ)+
|
|
* B2*(DEMN0(IJ)+(DSN+SIGEC(IJT))*RAD0(IJ))+
|
|
* GN*RTN
|
|
C(IJ,NPC)=C1*DABNP(IJ)+
|
|
* C2*(DEMNP(IJ)+(DSN+SIGEC(IJT))*RADP(IJ))+
|
|
* GN*RTNC
|
|
B(IJ,NMP)=B1*DABM0(IJ)+B2*DEMM0(IJ)-GP*RTN
|
|
C(IJ,NMP)=C1*DABMP(IJ)+C2*DEMMP(IJ)-GP*RTNC
|
|
DO II=1,NLVEXP
|
|
B(IJ,NSE+II)=B(IJ,NSE+II)+
|
|
* B1*DRCH0(II,IJ)+B2*DRET0(II,IJ)
|
|
C(IJ,NSE+II)=C(IJ,NSE+II)+
|
|
* C1*DRCHP(II,IJ)+C2*DRETP(II,IJ)
|
|
END DO
|
|
B(IJ,NFREQE)=0.
|
|
B(IJ,IJ)=-FK0(IJ)/DTAUP-FH(IJT)-BS*(UN-CHIEL0/ABSO0(IJ))
|
|
* +Q0(IJT)*CHIEL0/ABSO0(IJ)
|
|
C(IJ,NFREQE)=0.
|
|
C(IJ,IJ)=FKP(IJ)/DTAUP-CS*(UN-CHIELP/ABSOP(IJ))
|
|
C
|
|
C *** the IJ-th element of the rhs vector
|
|
C
|
|
VECL(IJ)=ALF1+BET2+FH(IJT)*RAD0(IJ)
|
|
* -S0*Q0(IJT)
|
|
IF(IWINBL.LT.0) VECL(IJ)=VECL(IJ)-HEXTRD(IJT)
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.4) then
|
|
iji=nfreq-kij(ijt)+1
|
|
b(ij,ij)=b(ij,ij)+bs*(cmb+cme)
|
|
if(iji.gt.1) then
|
|
ijm=ijex(ijorig(iji-1))
|
|
if(ijm.gt.0) b(ij,ijm)=b(ij,ijm)+bs*cma
|
|
end if
|
|
if(iji.lt.nfreq) then
|
|
ijp=ijex(ijorig(iji+1))
|
|
if(ijp.gt.0) b(ij,ijp)=b(ij,ijp)+bs*cmc
|
|
end if
|
|
if(inre.gt.0) b(ij,nre)=b(ij,nre)+cmd*bs
|
|
if(inpc.gt.0) b(ij,npc)=b(ij,npc)+cms*bs/elec(id)
|
|
end if
|
|
c
|
|
END DO
|
|
isplin=ispl
|
|
go to 500
|
|
C
|
|
C ---------------------------------------
|
|
C For 1 < ID < ND - normal depth point
|
|
C ---------------------------------------
|
|
C
|
|
50 DDM=(DM(ID)-DM(ID-1))*HALF
|
|
IF(ID.EQ.ND) GO TO 150
|
|
DDP=(DM(ID+1)-DM(ID))*HALF
|
|
DO IJ=IJ1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
OMEG0=ABSO0(IJ)/DENS(ID)
|
|
OMEGP=ABSOP(IJ)/DENS(ID+1)
|
|
OMEGM=ABSOM(IJ)/DENS(ID-1)
|
|
DZP=OMEG0+OMEGP
|
|
DZM=OMEG0+OMEGM
|
|
DTAUP=DZP*DDP
|
|
DTAUM=DZM*DDM
|
|
DTAU0=HALF *(DTAUP+DTAUM)
|
|
FRD=FK0(IJ)*RAD0(IJ)
|
|
ALF1=(FRD-FKP(IJ)*RADP(IJ))/DTAUP/DTAU0
|
|
GAM1=(FRD-FKM(IJ)*RADM(IJ))/DTAUM/DTAU0
|
|
BET1=ALF1+GAM1
|
|
X1=HALF *BET1/DTAU0
|
|
A1=(GAM1+X1*DTAUM)/DZM
|
|
C1=(ALF1+X1*DTAUP)/DZP
|
|
B1=(A1+C1)/DENS(ID)
|
|
A1=A1/DENS(ID-1)
|
|
C1=C1/DENS(ID+1)
|
|
BS=UN
|
|
CHIELM=SCATM(IJ)
|
|
CHIEL0=SCAT0(IJ)
|
|
CHIELP=SCATP(IJ)
|
|
S0=(EMIS0(IJ)+CHIEL0*RAD0(IJ))/ABSO0(IJ)
|
|
AS=0.
|
|
CS=0.
|
|
A2=0.
|
|
C2=0.
|
|
A3=0.
|
|
C3=0.
|
|
BET2=0.
|
|
SM=0.
|
|
SP=0.
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.0) then
|
|
call compt0(ijt,id,abso0(ij),cma,cmb,cmc,cme,cms,cmd)
|
|
s0=s0+cms
|
|
end if
|
|
C
|
|
IF(MOD(ISPLIN,3).EQ.0) GO TO 60
|
|
SM=(EMISM(IJ)+RADM(IJ)*CHIELM)/ABSOM(IJ)
|
|
SP=(EMISP(IJ)+RADP(IJ)*CHIELP)/ABSOP(IJ)
|
|
IF(ISPLIN.EQ.1) THEN
|
|
C
|
|
C spline collocation (ISPLIN=1)
|
|
C
|
|
AS=DTAUM/DTAU0*SIXTH
|
|
CS=DTAUP/DTAU0*SIXTH
|
|
BS=0.666666666666667D0
|
|
ALF2=AS*(RADM(IJ)-SM)
|
|
GAM2=CS*(RADP(IJ)-SP)
|
|
BET2=ALF2+GAM2
|
|
X =HALF *BET2/DTAU0
|
|
A2=(GAM2-X*DTAUM)/DZM
|
|
C2=(ALF2-X*DTAUP)/DZP
|
|
ELSE
|
|
C
|
|
C Hermitian method (ISPLIN=2)
|
|
C
|
|
AS=DTAUP*DTAUP/DTAUM/DTAU0
|
|
CS=DTAUM*DTAUM/DTAUP/DTAU0
|
|
AL3=(RADP(IJ)-SP-RAD0(IJ)+S0)*SIXTH
|
|
GA3=(RADM(IJ)-SM-RAD0(IJ)+S0)*SIXTH
|
|
AV=AL3*CS
|
|
CV=GA3*AS
|
|
AS=(UN-HALF *AS)*SIXTH
|
|
CS=(UN-HALF *CS)*SIXTH
|
|
BS=UN-AS-CS
|
|
X=(AV+CV)/DTAU0/4.D0
|
|
A2=(X*DTAUM+HALF *CV-AV)/DZM
|
|
C2=(X*DTAUP+HALF *AV-CV)/DZP
|
|
BET2=AS*(RADM(IJ)-SM)+CS*(RADP(IJ)-SP)
|
|
END IF
|
|
C
|
|
C auxiliary quantities
|
|
C
|
|
B1=B1-(A2+C2)/DENS(ID)
|
|
A1=A1-A2/DENS(ID-1)
|
|
C1=C1-C2/DENS(ID+1)
|
|
A2=AS/ABSOM(IJ)
|
|
C2=CS/ABSOP(IJ)
|
|
A3=A2*SM
|
|
C3=C2*SP
|
|
60 B2=BS/ABSO0(IJ)
|
|
B3=B2*S0
|
|
C
|
|
C *** elements of the IJ-th row of matrices A, B, and C
|
|
C
|
|
RTNA=OMEGM*WMM(ID-1)*A1
|
|
A(IJ,NHE)=-GN*RTNA
|
|
A1=A1-A3
|
|
C
|
|
RTN=OMEG0*WMM(ID)*B1
|
|
B(IJ,NHE)=-GN*RTN
|
|
B1=B1-B3
|
|
C
|
|
RTNC=OMEGP*WMM(ID+1)*C1
|
|
C(IJ,NHE)=-GN*RTNC
|
|
C1=C1-C3
|
|
C
|
|
A(IJ,NRE)= A1*DABTM(IJ)+A2*(DEMTM(IJ)+DST*RADM(IJ))
|
|
B(IJ,NRE)= B1*DABT0(IJ)+B2*(DEMT0(IJ)+DST*RAD0(IJ))
|
|
C(IJ,NRE)= C1*DABTP(IJ)+C2*(DEMTP(IJ)+DST*RADP(IJ))
|
|
A(IJ,NPC)= A1*DABNM(IJ)+
|
|
* A2*(DEMNM(IJ)+(DSN+SIGEC(IJT))*RADM(IJ))+
|
|
* GN*RTNA
|
|
B(IJ,NPC)= B1*DABN0(IJ)+
|
|
* B2*(DEMN0(IJ)+(DSN+SIGEC(IJT))*RAD0(IJ))+
|
|
* GN*RTN
|
|
C(IJ,NPC)= C1*DABNP(IJ)+
|
|
* C2*(DEMNP(IJ)+(DSN+SIGEC(IJT))*RADP(IJ))+
|
|
* GN*RTNC
|
|
A(IJ,NMP)= A1*DABMM(IJ)+A2*DEMMM(IJ)-GP*RTNA
|
|
B(IJ,NMP)= B1*DABM0(IJ)+B2*DEMM0(IJ)-GP*RTN
|
|
C(IJ,NMP)= C1*DABMP(IJ)+C2*DEMMP(IJ)-GP*RTNC
|
|
DO II=1,NLVEXP
|
|
A(IJ,NSE+II)=A(IJ,NSE+II)+
|
|
* A1*DRCHM(II,IJ)+A2*DRETM(II,IJ)
|
|
B(IJ,NSE+II)=B(IJ,NSE+II)+
|
|
* B1*DRCH0(II,IJ)+B2*DRET0(II,IJ)
|
|
C(IJ,NSE+II)=C(IJ,NSE+II)+
|
|
* C1*DRCHP(II,IJ)+C2*DRETP(II,IJ)
|
|
END DO
|
|
A(IJ,NFREQE)=0.
|
|
A(IJ,IJ)=FKM(IJ)/DTAUM/DTAU0-AS*(UN-CHIELM/ABSOM(IJ))
|
|
B(IJ,NFREQE)=0.
|
|
B(IJ,IJ)=-FK0(IJ)/DTAU0*(UN/DTAUP+UN/DTAUM)-
|
|
* BS*(UN-CHIEL0/ABSO0(IJ))
|
|
C(IJ,NFREQE)=0.
|
|
C(IJ,IJ)=FKP(IJ)/DTAUP/DTAU0-CS*(UN-CHIELP/ABSOP(IJ))
|
|
C
|
|
C *** the IJ-th element of the rhs vector
|
|
C
|
|
VECL(IJ)=BET1+BET2+BS*(RAD0(IJ)-S0)
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.4) then
|
|
iji=nfreq-kij(ijt)+1
|
|
b(ij,ij)=b(ij,ij)+bs*(cmb+cme)
|
|
if(iji.gt.1) then
|
|
ijm=ijex(ijorig(iji-1))
|
|
if(ijm.gt.0) b(ij,ijm)=b(ij,ijm)+bs*cma
|
|
end if
|
|
if(iji.lt.nfreq) then
|
|
ijp=ijex(ijorig(iji+1))
|
|
if(ijp.gt.0) b(ij,ijp)=b(ij,ijp)+bs*cmc
|
|
end if
|
|
if(inre.gt.0) b(ij,nre)=b(ij,nre)+cmd*bs
|
|
if(inpc.gt.0) b(ij,npc)=b(ij,npc)+cms*bs/elec(id)
|
|
end if
|
|
c
|
|
END DO
|
|
isplin=ispl
|
|
go to 500
|
|
C
|
|
C --------------------------------------
|
|
C For ID=ND - lower boundary condition
|
|
C --------------------------------------
|
|
C
|
|
150 CONTINUE
|
|
IF(IDISK.EQ.0.OR.IFZ0.LT.0) THEN
|
|
T=TEMP(ID)
|
|
TM=TEMP(ID-1)
|
|
IF(TEMPBD.NE.0.) THEN
|
|
T=TEMPBD
|
|
TM=T
|
|
END IF
|
|
HKT=HK/T
|
|
HKTM=HK/TM
|
|
C
|
|
C auxiliary quantites
|
|
C
|
|
DO IJ=IJ1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
CHIELM=SCATM(IJ)
|
|
CHIEL0=SCAT0(IJ)
|
|
OMEGM=ABSOM(IJ)/DENS(ID-1)
|
|
OMEG0=ABSO0(IJ)/DENS(ID)
|
|
DZM=OMEG0+OMEGM
|
|
DTAUM=DZM*DDM
|
|
FRD=FK0(IJ)*RAD0(IJ)-FKM(IJ)*RADM(IJ)
|
|
GAM1=FRD/DTAUM
|
|
A1=GAM1/DZM
|
|
AS=0.
|
|
BS=0.
|
|
A2=0.
|
|
B2=0.
|
|
A3=0.
|
|
B3=0.
|
|
ALF2=0.
|
|
BET2=0.
|
|
GAM2=0.
|
|
C
|
|
C second-order boundary condition
|
|
C
|
|
IF(IBC.GT.0.AND.IBC.LT.4) THEN
|
|
BS=DTAUM*HALF
|
|
S0=(EMIS0(IJ)+CHIEL0*RAD0(IJ))/ABSO0(IJ)
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.0) then
|
|
call compt0(ijt,id,abso0(ij),cma,cmb,cmc,cme,cms,cmd)
|
|
s0=s0+cms
|
|
end if
|
|
C
|
|
GAM2=BS*(RAD0(IJ)-S0)
|
|
BET2=GAM2
|
|
X1=BET2/DZM
|
|
A1=A1-X1
|
|
B2=BS/ABSO0(IJ)
|
|
B3=B2*S0
|
|
END IF
|
|
C
|
|
C auxiliary parameters
|
|
C
|
|
FR=FREQ(IJT)
|
|
FR15=FR*1.D-15
|
|
X=HKT*FR
|
|
EX=EXP(X)
|
|
XM=HKTM*FR
|
|
EXM=EXP(XM)
|
|
PLAN=BN*FR15*FR15*FR15/(EX-UN)*RRDIL
|
|
IF(INRE.EQ.0.OR.ID.GE.NDRE) THEN
|
|
PLANM=BN*FR15*FR15*FR15/(EXM-UN)*RRDIL
|
|
GAM3=(PLAN-PLANM)/DTAUM*THIRD
|
|
A1=A1-GAM3/DZM
|
|
GAM1=GAM1-GAM3
|
|
END IF
|
|
C1=A1
|
|
A1=C1/DENS(ID-1)
|
|
B1=C1/DENS(ID)
|
|
C
|
|
C *** elements of the IJ-th row of matrices A and B
|
|
C
|
|
RTNA=OMEGM*WMM(ID-1)*A1
|
|
A(IJ,NHE)=-GN*RTNA
|
|
A1=A1-A3
|
|
C
|
|
RTN=OMEG0*WMM(ID)*B1
|
|
B(IJ,NHE)=-GN*RTN
|
|
B1=B1-B3
|
|
C
|
|
DPLANM=PLANM*XM/TM/(UN-UN/EXM)
|
|
A(IJ,NRE)=A1*DABTM(IJ)+A2*(DEMTM(IJ)+DST*RADM(IJ))-
|
|
* DPLANM/DTAUM*THIRD
|
|
A(IJ,NPC)=A1*DABNM(IJ)+
|
|
* A2*(DEMNM(IJ)+(DSN+SIGEC(IJT))*RADM(IJ))+
|
|
* GN*RTNA
|
|
BB=HALF+THIRD/DTAUM
|
|
DPLAN=PLAN*X/T/(UN-UN/EX)
|
|
B(IJ,NRE)= B1*DABT0(IJ)+B2*(DEMT0(IJ)+DST*RAD0(IJ))+
|
|
* BB*DPLAN
|
|
B(IJ,NPC)= B1*DABN0(IJ)+
|
|
* B2*(DEMN0(IJ)+(DSN+SIGEC(IJT))*RAD0(IJ))+
|
|
* GN*RTN
|
|
A(IJ,NMP)= A1*DABMM(IJ)+A2*DEMMM(IJ)-GP*RTNA
|
|
B(IJ,NMP)= B1*DABM0(IJ)+B2*DEMM0(IJ)-GP*RTN
|
|
DO II=1,NLVEXP
|
|
A(IJ,NSE+II)=A(IJ,NSE+II)+
|
|
* A1*DRCHM(II,IJ)+A2*DRETM(II,IJ)
|
|
B(IJ,NSE+II)=B(IJ,NSE+II)+
|
|
* B1*DRCH0(II,IJ)+B2*DRET0(II,IJ)
|
|
END DO
|
|
A(IJ,NFREQE)=0.
|
|
A(IJ,IJ)=FKM(IJ)/DTAUM-AS*(UN-CHIELM/ABSOM(IJ))
|
|
B(IJ,NFREQE)=0.
|
|
C
|
|
C *** the IJ-th element of the rhs vector
|
|
C
|
|
IF(IBC.EQ.0.OR.IBC.EQ.4) THEN
|
|
B(IJ,IJ)=B(IJ,IJ)-FK0(IJ)/DTAUM-
|
|
* BS*(UN-CHIEL0/ABSO0(IJ))-HALF
|
|
VECL(IJ)=GAM1+BET2-HALF*(PLAN-RAD0(IJ))
|
|
ELSE
|
|
B(IJ,IJ)=B(IJ,IJ)-FK0(IJ)/DTAUM-
|
|
* BS*(UN-CHIEL0/ABSO0(IJ))-FHD(IJT)
|
|
VECL(IJ)=GAM1+BET2-HALF*PLAN+FHD(IJT)*RAD0(IJ)
|
|
END IF
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.4) then
|
|
iji=nfreq-kij(ijt)+1
|
|
b(ij,ij)=b(ij,ij)+bs*(cmb+cme)
|
|
if(iji.gt.1) then
|
|
ijm=ijex(ijorig(iji-1))
|
|
if(ijm.gt.0) b(ij,ijm)=b(ij,ijm)+bs*cma
|
|
end if
|
|
if(iji.lt.nfreq) then
|
|
ijp=ijex(ijorig(iji+1))
|
|
if(ijp.gt.0) b(ij,ijp)=b(ij,ijp)+bs*cmc
|
|
end if
|
|
if(inre.gt.0) b(ij,nre)=b(ij,nre)+cmd*bs
|
|
if(inpc.gt.0) b(ij,npc)=b(ij,npc)+cms*bs/elec(id)
|
|
end if
|
|
c
|
|
END DO
|
|
C
|
|
ELSE
|
|
C
|
|
C --------------------------------------
|
|
C For ID=ND - lower boundary condition
|
|
C --------------------------------------
|
|
C
|
|
C for disks -
|
|
C lower b.c. expresses just I(taumax,-mu,nu)=I(taumax,+mu,nu)
|
|
C
|
|
DO IJ=IJ1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
CHIELM=SCATM(IJ)
|
|
CHIEL0=SCAT0(IJ)
|
|
OMEGM=ABSOM(IJ)/DENS(ID-1)
|
|
OMEG0=ABSO0(IJ)/DENS(ID)
|
|
DZM=OMEG0+OMEGM
|
|
DTAUM=DZM*DDM
|
|
FRD=FK0(IJ)*RAD0(IJ)-FKM(IJ)*RADM(IJ)
|
|
GAM1=FRD/DTAUM
|
|
A1=GAM1/DZM
|
|
AS=0.
|
|
A2=0.
|
|
A3=0.
|
|
ALF2=0.
|
|
GAM2=0.
|
|
BS=DTAUM*HALF
|
|
S0=(EMIS0(IJ)+CHIEL0*RAD0(IJ))/ABSO0(IJ)
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.0) then
|
|
call compt0(ijt,id,abso0(ij),cma,cmb,cmc,cme,cms,cmd)
|
|
s0=s0+cms
|
|
end if
|
|
C
|
|
GAM2=BS*(RAD0(IJ)-S0)
|
|
BET2=ALF2+GAM2
|
|
X1=BET2/DZM
|
|
A1=A1-X1
|
|
B2=BS/ABSO0(IJ)
|
|
B3=B2*S0
|
|
C1=A1
|
|
A1=C1/DENS(ID-1)
|
|
B1=C1/DENS(ID)
|
|
C
|
|
C *** elements of the IJ-th row of matrix A
|
|
C
|
|
RTN=OMEGM*WMM(ID)*A1
|
|
A(IJ,NHE)=-GN*RTN
|
|
A(IJ,NMP)=-GP*RTN
|
|
A1=A1-A3
|
|
A(IJ,NRE)=A1*DABTM(IJ)+A2*(DEMTM(IJ)+DST*RADM(IJ))
|
|
A(IJ,NPC)=A1*DABNM(IJ)+
|
|
* A2*(DEMNM(IJ)+(DSN+SIGEC(IJT))*RADM(IJ))+
|
|
* GN*RTN
|
|
A(IJ,NMP)= A1*DABMM(IJ)+A2*DEMMM(IJ)-GP*RTNA
|
|
DO I=1,NLVEXP
|
|
A(IJ,NSE+I)=A1*DRCHM(I,IJ)+A2*DRETM(I,IJ)
|
|
END DO
|
|
A(IJ,NFREQE)=0.
|
|
A(IJ,IJ)=FKM(IJ)/DTAUM-AS*(UN-CHIELM/ABSOM(IJ))
|
|
C
|
|
C *** elements of the IJ-th row of matrix B
|
|
C
|
|
RTN=OMEG0*WMM(ID)*B1
|
|
B(IJ,NHE)=-GN*RTN
|
|
B(IJ,NMP)=-GP*RTN
|
|
B1=B1-B3
|
|
B(IJ,NRE)=B1*DABT0(IJ)+B2*(DEMT0(IJ)+DST*RAD0(IJ))
|
|
B(IJ,NPC)=B1*DABN0(IJ)+
|
|
* B2*(DEMN0(IJ)+(DSN+SIGEC(IJT))*RAD0(IJ))+
|
|
* GN*RTN
|
|
B(IJ,NMP)= B1*DABM0(IJ)+B2*DEMM0(IJ)-GP*RTN
|
|
DO I=1,NLVEXP
|
|
B(IJ,NSE+I)=B1*DRCH0(I,IJ)+B2*DRET0(I,IJ)
|
|
END DO
|
|
B(IJ,NFREQE)=0.
|
|
B(IJ,IJ)=-FK0(IJ)/DTAUM-BS*(UN-CHIEL0/ABSO0(IJ))
|
|
C
|
|
C *** the IJ-th element of the rhs vector
|
|
C
|
|
VECL(IJ)=GAM1+BET2
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.4) then
|
|
iji=nfreq-kij(ijt)+1
|
|
b(ij,ij)=b(ij,ij)+bs*(cmb+cme)
|
|
if(iji.gt.1) then
|
|
ijm=ijex(ijorig(iji-1))
|
|
if(ijm.gt.0) b(ij,ijm)=b(ij,ijm)+bs*cma
|
|
end if
|
|
if(iji.lt.nfreq) then
|
|
ijp=ijex(ijorig(iji+1))
|
|
if(ijp.gt.0) b(ij,ijp)=b(ij,ijp)+bs*cmc
|
|
end if
|
|
if(inre.gt.0) b(ij,nre)=b(ij,nre)+cmd*bs
|
|
if(inpc.gt.0) b(ij,npc)=b(ij,npc)+cms*bs/elec(id)
|
|
end if
|
|
c
|
|
END DO
|
|
END IF
|
|
isplin=ispl
|
|
500 CONTINUE
|
|
c
|
|
c zeroing radiation field for very low intensities (if required)
|
|
c
|
|
if(radzer.gt.0) then
|
|
c
|
|
C find the peak in nu*rad_nu:
|
|
c
|
|
radsum=0.
|
|
DO IJ=IJ1,NFREQE
|
|
radsum=max(freq(ij)*radex(ij,id),radsum)
|
|
END DO
|
|
C
|
|
C if much smaller than peak in nu*rad_nu, then set to zero:
|
|
C
|
|
DO IJ=IJ1,NFREQE
|
|
if(freq(ij)*radex(ij,id).lt.radzer*radsum) then
|
|
do ii=1,nn0
|
|
a(ij,ii)=0.
|
|
b(ij,ii)=0.
|
|
c(ij,ii)=0.
|
|
end do
|
|
vecl(ij)=0.
|
|
b(ij,ij)=un
|
|
end if
|
|
end do
|
|
end if
|
|
isplin=ispl
|
|
isplin=ispl
|
|
c
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE BRTEZ(ID)
|
|
C ====================
|
|
C
|
|
C The part of matrices A,B,C corresponding to the linearized
|
|
C radiative transfer equation
|
|
C i.e. the first NFREQE rows
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
PARAMETER (XCON=8.0935D-21,YCON=1.68638E-10)
|
|
PARAMETER (SIXTH=UN/6.D0,
|
|
* THIRD=UN/3.D0)
|
|
C
|
|
IF(NFREQE.LE.0) RETURN
|
|
ispl=isplin
|
|
if(isplin.ge.5) isplin=isplin-5
|
|
NHE=NFREQE+INHE
|
|
NRE=NFREQE+INRE
|
|
NPC=NFREQE+INPC
|
|
NSE=NFREQE+INSE-1
|
|
NMP=NFREQE+INMP
|
|
C
|
|
GP=0.
|
|
GN=UN
|
|
IF(INMP.GT.0) THEN
|
|
GP=UN
|
|
GN=0.
|
|
END IF
|
|
c
|
|
c in the case of Compton scattering - boundary condition
|
|
c for the highest frequency
|
|
C
|
|
IJ1=1
|
|
if(icompt.gt.0.and.icombc.gt.0.and.ijex(1).gt.0) then
|
|
IJ1=2
|
|
ij=1
|
|
iji=nfreq
|
|
zj1=exp(-hk*freq(ij)/temp(id))
|
|
zj2=exp(-hk*freq(ij+1)/temp(id))
|
|
dlt=delj(iji-1,id)
|
|
if(ichcoo.eq.0) then
|
|
zj0=un/(hk*sqrt(freq(ij)*freq(ij+1))/temp(id))
|
|
zxx=un-3.*zj0+(un-dlt)*zj1+dlt*zj2
|
|
combid=zj0/dlnfr(iji-1)+(un-dlt)*zxx
|
|
comaid=-zj0/dlnfr(iji-1)+dlt*zxx
|
|
else
|
|
e2=ycon*temp(id)
|
|
zxx0=xcon*freq(ij)*(un+zj1)-3.*e2
|
|
zxxm=xcon*freq(ij+1)*(un+zj2)-3.*e2
|
|
zxx=(un-dlt)*zxx0+dlt*zxxm
|
|
combid=e2/dlnfr(iji-1)+(un-dlt)*zxx
|
|
comaid=-e2/dlnfr(iji-1)+dlt*zxx
|
|
end if
|
|
b(ij,ij)=combid
|
|
b(ij,ij+1)=comaid
|
|
vecl(ij)=-b(ij,ij)*rad(iji,id)-b(ij,ij+1)*rad(iji-1,id)
|
|
end if
|
|
C
|
|
C
|
|
C ----------------------------------------
|
|
C For ID = 1 - upper boundary condition
|
|
C ----------------------------------------
|
|
C
|
|
IF(ID.GT.1) GO TO 50
|
|
DDP=(ZD(1)-ZD(2))*HALF
|
|
DO IJ=IJ1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
OMEG0=ABSO0(IJ)
|
|
OMEGP=ABSOP(IJ)
|
|
DZP=OMEG0+OMEGP
|
|
DTAUP=DZP*DDP
|
|
ALF1=(FK0(IJ)*RAD0(IJ)-FKP(IJ)*RADP(IJ))/DTAUP
|
|
CHIEL0=SCAT0(IJ)
|
|
CHIELP=SCATP(IJ)
|
|
S0=(EMIS0(IJ)+CHIEL0*RAD0(IJ))/ABSO0(IJ)
|
|
BS=HALF*DTAUP
|
|
CS=0.
|
|
C2=0.
|
|
GAM2=0.
|
|
BET2=0.
|
|
SP=0.
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.0) then
|
|
call compt0(ijt,id,abso0(ij),cma,cmb,cmc,cme,cms,cmd)
|
|
s0=s0+cms
|
|
end if
|
|
C
|
|
IF(MOD(ISPLIN,3).GT.0) THEN
|
|
C
|
|
C Spline collocation and/or Hermitian method (ISPLIN=1 or 2) -
|
|
C both give the same expression for the boundary conditions
|
|
C
|
|
BS=DTAUP*THIRD
|
|
CS=HALF *BS
|
|
SP=(EMISP(IJ)+CHIELP*RADP(IJ))/ABSOP(IJ)
|
|
C2=CS/ABSOP(IJ)
|
|
GAM2=CS*(RADP(IJ)-SP)
|
|
END IF
|
|
C
|
|
C auxiliary quantities
|
|
C
|
|
ALF2=BS*(RAD0(IJ)-S0)
|
|
BET2=ALF2+GAM2
|
|
X1=(ALF1-BET2)/DZP
|
|
B2=(BS+Q0(IJ))/ABSO0(IJ)
|
|
B1=X1
|
|
B1=B1+UU0(IJ)*S0*DM(1)/DENS(1)
|
|
C1=X1
|
|
B1=B1-B2*S0
|
|
C1=C1-C2*SP
|
|
C
|
|
C *** elements of the IJ-th row of matrices B and C
|
|
C
|
|
B(IJ,NRE)=B1*DABT0(IJ)+B2*(DEMT0(IJ)+DST*RAD0(IJ))
|
|
C(IJ,NRE)=C1*DABTP(IJ)+C2*(DEMTP(IJ)+DST*RADP(IJ))
|
|
B(IJ,NPC)=B1*DABN0(IJ)+
|
|
* B2*(DEMN0(IJ)+(DSN+SIGEC(IJT))*RAD0(IJ))
|
|
C(IJ,NPC)=C1*DABNP(IJ)+
|
|
* C2*(DEMNP(IJ)+(DSN+SIGEC(IJT))*RADP(IJ))
|
|
B(IJ,NMP)=B1*DABM0(IJ)+B2*DEMM0(IJ)-GP*RTN
|
|
C(IJ,NMP)=C1*DABMP(IJ)+C2*DEMMP(IJ)-GP*RTNC
|
|
DO II=1,NLVEXP
|
|
B(IJ,NSE+II)=B(IJ,NSE+II)+
|
|
* B1*DRCH0(II,IJ)+B2*DRET0(II,IJ)
|
|
C(IJ,NSE+II)=C(IJ,NSE+II)+
|
|
* C1*DRCHP(II,IJ)+C2*DRETP(II,IJ)
|
|
END DO
|
|
B(IJ,NFREQE)=0.
|
|
B(IJ,IJ)=-FK0(IJ)/DTAUP-FH(IJT)-BS*(UN-CHIEL0/ABSO0(IJ))+
|
|
* Q0(IJ)*CHIEL0/ABSO0(IJ)
|
|
C(IJ,NFREQE)=0.
|
|
C(IJ,IJ)=FKP(IJ)/DTAUP-CS*(UN-CHIELP/ABSOP(IJ))
|
|
C
|
|
C *** the IJ-th element of the rhs vector
|
|
C
|
|
VECL(IJ)=ALF1+BET2+FH(IJT)*RAD0(IJ)-S0*Q0(IJ)
|
|
IF(IWINBL.LT.0) VECL(IJ)=VECL(IJ)-HEXTRD(IJT)
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.4) then
|
|
iji=nfreq-kij(ijt)+1
|
|
b(ij,ij)=b(ij,ij)+bs*(cmb+cme)
|
|
if(iji.gt.1) then
|
|
ijm=ijex(ijorig(iji-1))
|
|
if(ijm.gt.0) b(ij,ijm)=b(ij,ijm)+bs*cma
|
|
end if
|
|
if(iji.lt.nfreq) then
|
|
ijp=ijex(ijorig(iji+1))
|
|
if(ijp.gt.0) b(ij,ijp)=b(ij,ijp)+bs*cmc
|
|
end if
|
|
if(inre.gt.0) b(ij,nre)=b(ij,nre)+cmd*bs
|
|
if(inpc.gt.0) b(ij,npc)=b(ij,npc)+cms*bs/elec(id)
|
|
end if
|
|
c
|
|
END DO
|
|
isplin=ispl
|
|
go to 500
|
|
C
|
|
C ---------------------------------------
|
|
C For 1 < ID < ND - normal depth point
|
|
C ---------------------------------------
|
|
C
|
|
50 DDM=(ZD(ID-1)-ZD(ID))*HALF
|
|
IF(ID.EQ.ND) GO TO 150
|
|
DDP=(ZD(ID)-ZD(ID+1))*HALF
|
|
DO IJ=IJ1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
OMEG0=ABSO0(IJ)
|
|
OMEGP=ABSOP(IJ)
|
|
OMEGM=ABSOM(IJ)
|
|
DZP=OMEG0+OMEGP
|
|
DZM=OMEG0+OMEGM
|
|
DTAUP=DZP*DDP
|
|
DTAUM=DZM*DDM
|
|
DTAU0=HALF *(DTAUP+DTAUM)
|
|
FRD=FK0(IJ)*RAD0(IJ)
|
|
ALF1=(FRD-FKP(IJ)*RADP(IJ))/DTAUP/DTAU0
|
|
GAM1=(FRD-FKM(IJ)*RADM(IJ))/DTAUM/DTAU0
|
|
BET1=ALF1+GAM1
|
|
X1=HALF *BET1/DTAU0
|
|
A1=(GAM1+X1*DTAUM)/DZM
|
|
C1=(ALF1+X1*DTAUP)/DZP
|
|
B1=A1+C1
|
|
BS=UN
|
|
CHIELM=SCATM(IJ)
|
|
CHIEL0=SCAT0(IJ)
|
|
CHIELP=SCATP(IJ)
|
|
S0=(EMIS0(IJ)+CHIEL0*RAD0(IJ))/ABSO0(IJ)
|
|
AS=0.
|
|
CS=0.
|
|
A2=0.
|
|
C2=0.
|
|
A3=0.
|
|
C3=0.
|
|
BET2=0.
|
|
SM=0.
|
|
SP=0.
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.0) then
|
|
call compt0(ijt,id,abso0(ij),cma,cmb,cmc,cme,cms,cmd)
|
|
s0=s0+cms
|
|
end if
|
|
C
|
|
IF(MOD(ISPLIN,3).EQ.0) GO TO 60
|
|
SM=(EMISM(IJ)+RADM(IJ)*CHIELM)/ABSOM(IJ)
|
|
SP=(EMISP(IJ)+RADP(IJ)*CHIELP)/ABSOP(IJ)
|
|
IF(ISPLIN.EQ.1) THEN
|
|
C
|
|
C spline collocation (ISPLIN=1)
|
|
C
|
|
AS=DTAUM/DTAU0*SIXTH
|
|
CS=DTAUP/DTAU0*SIXTH
|
|
BS=0.666666666666667D0
|
|
ALF2=AS*(RADM(IJ)-SM)
|
|
GAM2=CS*(RADP(IJ)-SP)
|
|
BET2=ALF2+GAM2
|
|
X =HALF *BET2/DTAU0
|
|
A2=(GAM2-X*DTAUM)/DZM
|
|
C2=(ALF2-X*DTAUP)/DZP
|
|
ELSE
|
|
C
|
|
C Hermitian method (ISPLIN=2)
|
|
C
|
|
AS=DTAUP*DTAUP/DTAUM/DTAU0
|
|
CS=DTAUM*DTAUM/DTAUP/DTAU0
|
|
AL3=(RADP(IJ)-SP-RAD0(IJ)+S0)*SIXTH
|
|
GA3=(RADM(IJ)-SM-RAD0(IJ)+S0)*SIXTH
|
|
AV=AL3*CS
|
|
CV=GA3*AS
|
|
AS=(UN-HALF *AS)*SIXTH
|
|
CS=(UN-HALF *CS)*SIXTH
|
|
BS=UN-AS-CS
|
|
X=(AV+CV)/DTAU0/4.D0
|
|
A2=(X*DTAUM+HALF *CV-AV)/DZM
|
|
C2=(X*DTAUP+HALF *AV-CV)/DZP
|
|
BET2=AS*(RADM(IJ)-SM)+CS*(RADP(IJ)-SP)
|
|
END IF
|
|
C
|
|
C auxiliary quantities
|
|
C
|
|
B1=B1-(A2+C2)
|
|
A1=A1-A2
|
|
C1=C1-C2
|
|
A2=AS/ABSOM(IJ)
|
|
C2=CS/ABSOP(IJ)
|
|
A3=A2*SM
|
|
C3=C2*SP
|
|
60 B2=BS/ABSO0(IJ)
|
|
B3=B2*S0
|
|
A1=A1-A3
|
|
B1=B1-B3
|
|
C1=C1-C3
|
|
C
|
|
C *** elements of the IJ-th row of matrices A, B, and C
|
|
C
|
|
A(IJ,NRE)= A1*DABTM(IJ)+A2*(DEMTM(IJ)+DST*RADM(IJ))
|
|
B(IJ,NRE)= B1*DABT0(IJ)+B2*(DEMT0(IJ)+DST*RAD0(IJ))
|
|
C(IJ,NRE)= C1*DABTP(IJ)+C2*(DEMTP(IJ)+DST*RADP(IJ))
|
|
A(IJ,NPC)= A1*DABNM(IJ)+
|
|
* A2*(DEMNM(IJ)+(DSN+SIGEC(IJT))*RADM(IJ))
|
|
B(IJ,NPC)= B1*DABN0(IJ)+
|
|
* B2*(DEMN0(IJ)+(DSN+SIGEC(IJT))*RAD0(IJ))
|
|
C(IJ,NPC)= C1*DABNP(IJ)+
|
|
* C2*(DEMNP(IJ)+(DSN+SIGEC(IJT))*RADP(IJ))
|
|
A(IJ,NMP)= A1*DABMM(IJ)+A2*DEMMM(IJ)-GP*RTNA
|
|
B(IJ,NMP)= B1*DABM0(IJ)+B2*DEMM0(IJ)-GP*RTN
|
|
C(IJ,NMP)= C1*DABMP(IJ)+C2*DEMMP(IJ)-GP*RTNC
|
|
DO II=1,NLVEXP
|
|
A(IJ,NSE+II)=A(IJ,NSE+II)+
|
|
* A1*DRCHM(II,IJ)+A2*DRETM(II,IJ)
|
|
B(IJ,NSE+II)=B(IJ,NSE+II)+
|
|
* B1*DRCH0(II,IJ)+B2*DRET0(II,IJ)
|
|
C(IJ,NSE+II)=C(IJ,NSE+II)+
|
|
* C1*DRCHP(II,IJ)+C2*DRETP(II,IJ)
|
|
END DO
|
|
A(IJ,NFREQE)=0.
|
|
A(IJ,IJ)=FKM(IJ)/DTAUM/DTAU0-AS*(UN-CHIELM/ABSOM(IJ))
|
|
B(IJ,NFREQE)=0.
|
|
B(IJ,IJ)=-FK0(IJ)/DTAU0*(UN/DTAUP+UN/DTAUM)-
|
|
* BS*(UN-CHIEL0/ABSO0(IJ))
|
|
C(IJ,NFREQE)=0.
|
|
C(IJ,IJ)=FKP(IJ)/DTAUP/DTAU0-CS*(UN-CHIELP/ABSOP(IJ))
|
|
C
|
|
C *** the IJ-th element of the rhs vector
|
|
C
|
|
VECL(IJ)=BET1+BET2+BS*(RAD0(IJ)-S0)
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.4) then
|
|
iji=nfreq-kij(ijt)+1
|
|
b(ij,ij)=b(ij,ij)+bs*(cmb+cme)
|
|
if(iji.gt.1) then
|
|
ijm=ijex(ijorig(iji-1))
|
|
if(ijm.gt.0) b(ij,ijm)=b(ij,ijm)+bs*cma
|
|
end if
|
|
if(iji.lt.nfreq) then
|
|
ijp=ijex(ijorig(iji+1))
|
|
if(ijp.gt.0) b(ij,ijp)=b(ij,ijp)+bs*cmc
|
|
end if
|
|
if(inre.gt.0) b(ij,nre)=b(ij,nre)+cmd*bs
|
|
if(inpc.gt.0) b(ij,npc)=b(ij,npc)+cms*bs/elec(id)
|
|
end if
|
|
c
|
|
END DO
|
|
isplin=ispl
|
|
go to 500
|
|
C
|
|
C --------------------------------------
|
|
C For ID=ND - lower boundary condition
|
|
C --------------------------------------
|
|
C
|
|
150 CONTINUE
|
|
IF(IDISK.EQ.0.OR.IFZ0.LT.0) THEN
|
|
T=TEMP(ID)
|
|
TM=TEMP(ID-1)
|
|
HKT=HK/T
|
|
HKTM=HK/TM
|
|
C
|
|
C auxiliary quantites for both options
|
|
C
|
|
DO IJ=1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
CHIELM=SCATM(IJ)
|
|
CHIEL0=SCAT0(IJ)
|
|
OMEGM=ABSOM(IJ)
|
|
OMEG0=ABSO0(IJ)
|
|
DZM=OMEG0+OMEGM
|
|
DTAUM=DZM*DDM
|
|
FRD=FK0(IJ)*RAD0(IJ)-FKM(IJ)*RADM(IJ)
|
|
GAM1=FRD/DTAUM
|
|
A1=GAM1/DZM
|
|
AS=0.
|
|
BS=0.
|
|
A2=0.
|
|
B2=0.
|
|
A3=0.
|
|
B3=0.
|
|
ALF2=0.
|
|
BET2=0.
|
|
GAM2=0.
|
|
C
|
|
C second-order boundary condition
|
|
C
|
|
IF(IBC.GT.0.AND.IBC.LT.4) THEN
|
|
BS=DTAUM*HALF
|
|
S0=(EMIS0(IJ)+CHIEL0*RAD0(IJ))/ABSO0(IJ)
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.0) then
|
|
call compt0(ijt,id,abso0(ij),cma,cmb,cmc,cme,cms,cmd)
|
|
s0=s0+cms
|
|
end if
|
|
C
|
|
GAM2=BS*(RAD0(IJ)-S0)
|
|
BET2=GAM2
|
|
X1=BET2/DZM
|
|
A1=A1-X1
|
|
B2=BS/ABSO0(IJ)
|
|
B3=B2*S0
|
|
END IF
|
|
C
|
|
C auxiliary parameters
|
|
C
|
|
FR=FREQ(IJT)
|
|
FR15=FR*1.D-15
|
|
X=HKT*FR
|
|
EX=EXP(X)
|
|
XM=HKTM*FR
|
|
EXM=EXP(XM)
|
|
PLAN=BN*FR15*FR15*FR15/(EX-UN)
|
|
IF(INRE.EQ.0.OR.ID.GE.NDRE) THEN
|
|
PLANM=BN*FR15*FR15*FR15/(EXM-UN)
|
|
GAM3=(PLAN-PLANM)/DTAUM*THIRD
|
|
A1=A1-GAM3/DZM
|
|
GAM1=GAM1-GAM3
|
|
END IF
|
|
C1=A1
|
|
B1=C1
|
|
A1=A1-A3
|
|
B1=B1-B3
|
|
C
|
|
C *** elements of the IJ-th row of matrices A and B
|
|
C
|
|
IF(INRE.EQ.0.OR.ID.GE.NDRE) THEN
|
|
DPLANM=PLANM*XM/TM/(UN-UN/EXM)
|
|
A(IJ,NRE)=A1*DABTM(IJ)+A2*(DEMTM(IJ)+DST*RADM(IJ))-
|
|
* DPLANM/DTAUM*THIRD
|
|
A(IJ,NPC)=A1*DABNM(IJ)+
|
|
* A2*(DEMNM(IJ)+(DSN+SIGEC(IJT))*RADM(IJ))
|
|
BB=HALF+THIRD/DTAUM
|
|
DPLAN=PLAN*X/T/(UN-UN/EX)
|
|
B(IJ,NRE)= B1*DABT0(IJ)+B2*(DEMT0(IJ)+DST*RAD0(IJ))+
|
|
* BB*DPLAN
|
|
B(IJ,NPC)= B1*DABN0(IJ)+
|
|
* B2*(DEMN0(IJ)+(DSN+SIGEC(IJT))*RAD0(IJ))
|
|
A(IJ,NMP)= A1*DABMM(IJ)+A2*DEMMM(IJ)-GP*RTNA
|
|
B(IJ,NMP)= B1*DABM0(IJ)+B2*DEMM0(IJ)-GP*RTN
|
|
DO II=1,NLVEXP
|
|
A(IJ,NSE+II)=A(IJ,NSE+II)+
|
|
* A1*DRCHM(II,IJ)+A2*DRETM(II,IJ)
|
|
B(IJ,NSE+II)=B(IJ,NSE+II)+
|
|
* B1*DRCH0(II,IJ)+B2*DRET0(II,IJ)
|
|
END DO
|
|
A(IJ,NFREQE)=0.
|
|
A(IJ,IJ)=FKM(IJ)/DTAUM-AS*(UN-CHIELM/ABSOM(IJ))
|
|
B(IJ,NFREQE)=0.
|
|
END IF
|
|
C
|
|
C *** the IJ-th element of the rhs vector
|
|
C
|
|
IF(IBC.EQ.0.OR.IBC.EQ.4) THEN
|
|
B(IJ,IJ)=B(IJ,IJ)-FK0(IJ)/DTAUM-
|
|
* BS*(UN-CHIEL0/ABSO0(IJ))-HALF
|
|
VECL(IJ)=GAM1+BET2-HALF*(PLAN-RAD0(IJ))
|
|
ELSE
|
|
B(IJ,IJ)=B(IJ,IJ)-FK0(IJ)/DTAUM-
|
|
* BS*(UN-CHIEL0/ABSO0(IJ))-FHD(IJT)
|
|
VECL(IJ)=GAM1+BET2-HALF*PLAN+FHD(IJT)*RAD0(IJ)
|
|
END IF
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.4) then
|
|
iji=nfreq-kij(ijt)+1
|
|
b(ij,ij)=b(ij,ij)+bs*(cmb+cme)
|
|
if(iji.gt.1) then
|
|
ijm=ijex(ijorig(iji-1))
|
|
if(ijm.gt.0) b(ij,ijm)=b(ij,ijm)+bs*cma
|
|
end if
|
|
if(iji.lt.nfreq) then
|
|
ijp=ijex(ijorig(iji+1))
|
|
if(ijp.gt.0) b(ij,ijp)=b(ij,ijp)+bs*cmc
|
|
end if
|
|
if(inre.gt.0) b(ij,nre)=b(ij,nre)+cmd*bs
|
|
if(inpc.gt.0) b(ij,npc)=b(ij,npc)+cms*bs/elec(id)
|
|
end if
|
|
c
|
|
END DO
|
|
C
|
|
ELSE
|
|
C
|
|
C --------------------------------------
|
|
C For ID=ND - lower boundary condition
|
|
C --------------------------------------
|
|
C
|
|
C for disks -
|
|
C lower b.c. expresses just I(taumax,-mu,nu)=I(taumax,+mu,nu)
|
|
C
|
|
DO IJ=IJ1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
CHIELM=SCATM(IJ)
|
|
CHIEL0=SCAT0(IJ)
|
|
OMEGM=ABSOM(IJ)
|
|
OMEG0=ABSO0(IJ)
|
|
DZM=OMEG0+OMEGM
|
|
DTAUM=DZM*DDM
|
|
FRD=FK0(IJ)*RAD0(IJ)-FKM(IJ)*RADM(IJ)
|
|
GAM1=FRD/DTAUM
|
|
A1=GAM1/DZM
|
|
AS=0.
|
|
A2=0.
|
|
A3=0.
|
|
ALF2=0.
|
|
GAM2=0.
|
|
BS=DTAUM*HALF
|
|
S0=(EMIS0(IJ)+CHIEL0*RAD0(IJ))/ABSO0(IJ)
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.0) then
|
|
call compt0(ijt,id,abso0(ij),cma,cmb,cmc,cme,cms,cmd)
|
|
s0=s0+cms
|
|
end if
|
|
C
|
|
GAM2=BS*(RAD0(IJ)-S0)
|
|
BET2=ALF2+GAM2
|
|
X1=BET2/DZM
|
|
A1=A1-X1
|
|
B2=BS/ABSO0(IJ)
|
|
B3=B2*S0
|
|
B1=A1
|
|
A1=A1-A3
|
|
B1=B1-B3
|
|
C
|
|
C *** elements of the IJ-th row of matrix A
|
|
C
|
|
A(IJ,NRE)=A1*DABTM(IJ)+A2*(DEMTM(IJ)+DST*RADM(IJ))
|
|
A(IJ,NPC)=A1*DABNM(IJ)+
|
|
* A2*(DEMNM(IJ)+(DSN+SIGEC(IJT))*RADM(IJ))
|
|
A(IJ,NMP)= A1*DABMM(IJ)+A2*DEMMM(IJ)-GP*RTNA
|
|
DO I=1,NLVEXP
|
|
A(IJ,NSE+I)=A1*DRCHM(I,IJ)+A2*DRETM(I,IJ)
|
|
END DO
|
|
A(IJ,NFREQE)=0.
|
|
A(IJ,IJ)=FKM(IJ)/DTAUM-AS*(UN-CHIELM/ABSOM(IJ))
|
|
C
|
|
C *** elements of the IJ-th row of matrix B
|
|
C
|
|
B(IJ,NRE)=B1*DABT0(IJ)+B2*(DEMT0(IJ)+DST*RAD0(IJ))
|
|
B(IJ,NPC)=B1*DABN0(IJ)+
|
|
* B2*(DEMN0(IJ)+(DSN+SIGEC(IJT))*RAD0(IJ))
|
|
B(IJ,NMP)= B1*DABM0(IJ)+B2*DEMM0(IJ)-GP*RTN
|
|
DO I=1,NLVEXP
|
|
B(IJ,NSE+I)=B1*DRCH0(I,IJ)+B2*DRET0(I,IJ)
|
|
END DO
|
|
B(IJ,NFREQE)=0.
|
|
B(IJ,IJ)=-FK0(IJ)/DTAUM-BS*(UN-CHIEL0/ABSO0(IJ))
|
|
C
|
|
C *** the IJ-th element of the rhs vector
|
|
C
|
|
VECL(IJ)=GAM1+BET2
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.4) then
|
|
iji=nfreq-kij(ijt)+1
|
|
b(ij,ij)=b(ij,ij)+bs*(cmb+cme)
|
|
if(iji.gt.1) then
|
|
ijm=ijex(ijorig(iji-1))
|
|
if(ijm.gt.0) b(ij,ijm)=b(ij,ijm)+bs*cma
|
|
end if
|
|
if(iji.lt.nfreq) then
|
|
ijp=ijex(ijorig(iji+1))
|
|
if(ijp.gt.0) b(ij,ijp)=b(ij,ijp)+bs*cmc
|
|
end if
|
|
if(inre.gt.0) b(ij,nre)=b(ij,nre)+cmd*bs
|
|
if(inpc.gt.0) b(ij,npc)=b(ij,npc)+cms*bs/elec(id)
|
|
end if
|
|
c
|
|
END DO
|
|
END IF
|
|
isplin=ispl
|
|
500 CONTINUE
|
|
c
|
|
c zeroing radiation field for very low intensities (if required)
|
|
c
|
|
if(radzer.gt.0) then
|
|
c
|
|
C find the peak in nu*rad_nu:
|
|
c
|
|
radsum=0.
|
|
DO IJ=IJ1,NFREQE
|
|
radsum=max(freq(ij)*radex(ij,id),radsum)
|
|
END DO
|
|
C
|
|
C if much smaller than peak in nu*rad_nu, then set to zero:
|
|
C
|
|
DO IJ=IJ1,NFREQE
|
|
if(freq(ij)*radex(ij,id).lt.radzer*radsum) then
|
|
do ii=1,nn0
|
|
a(ij,ii)=0.
|
|
b(ij,ii)=0.
|
|
c(ij,ii)=0.
|
|
end do
|
|
vecl(ij)=0.
|
|
b(ij,ij)=un
|
|
end if
|
|
end do
|
|
end if
|
|
isplin=ispl
|
|
c
|
|
RETURN
|
|
END
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE BHE(ID)
|
|
C ==================
|
|
C
|
|
C The part of matrices A and B corresponding to the hydrostatic
|
|
C equilibrium equation,
|
|
C i.e. the (NFREQE+INHE)-th row;
|
|
C and, if desired (INMP > 0), the part corresponding to the
|
|
C definition equation for the fictitious massive particle density,
|
|
C ie. the (NFREQE+INMP)-th row.
|
|
C
|
|
C Input: ID - depth index
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
C
|
|
NHE=NFREQE+INHE
|
|
NRE=NFREQE+INRE
|
|
NPC=NFREQE+INPC
|
|
NSE=NFREQE+INSE-1
|
|
c
|
|
c the case of fixed mass density
|
|
c
|
|
if(ifixde.gt.0) then
|
|
b(nhe,nhe)=un
|
|
b(nhe,npc)=-un
|
|
vecl(nhe)=dens(id)/wmm(id)+elec(id)-totn(id)
|
|
return
|
|
end if
|
|
C
|
|
C *********** Linearized equation for the fictitious massive particle
|
|
C density
|
|
C
|
|
IF(INMP.GT.0) THEN
|
|
NMP=NFREQE+INMP
|
|
B(NMP,NMP)=-UN
|
|
B(NMP,NHE)=UN
|
|
IF(INPC.GT.0) B(NMP,NPC)=-UN
|
|
END IF
|
|
C
|
|
C *********** Linearized hydrostatic equilibrium
|
|
C
|
|
HEXT=0.
|
|
HEXN=0.
|
|
GRD=0.
|
|
FLUXW=0.
|
|
IF(ID.GT.1) GO TO 50
|
|
C
|
|
C *** Upper boundary condition (ID=1)
|
|
C Basically, linearized eq. (7-10) of Mihalas (1978)
|
|
C
|
|
DO I=1,NLVEXP
|
|
HEX(I)=0.
|
|
END DO
|
|
x1=0.
|
|
IF(NFREQE.GT.0.AND.IFPRAD.GT.0) THEN
|
|
X1=PCK/DENS(ID)
|
|
DO IJ=1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
IF(.NOT.LSKIP(ID,IJT)) THEN
|
|
FLUXW=W(IJT)*(FH(IJT)*RAD0(IJ)-HEXTRD(IJT))
|
|
GRD=GRD+FLUXW*ABSO0(IJ)
|
|
HEXN=HEXN+FLUXW*DABN0(IJ)
|
|
HEXT=HEXT+FLUXW*DABT0(IJ)
|
|
DO I=1,NLVEXP
|
|
HEX(I)=HEX(I)+FLUXW*DRCH0(I,IJ)
|
|
END DO
|
|
C
|
|
C Columns corresponding to mean intensities
|
|
C
|
|
B(NHE,IJ)=X1*W(IJT)*FH(IJT)*ABSO0(IJ)
|
|
END IF
|
|
END DO
|
|
END IF
|
|
C
|
|
RTN=X1*WMM(ID)/DENS(ID)*(GRD+FPRD(ID))
|
|
VT0=HALF*VTURB(ID)*VTURB(ID)/DM(ID)*WMM(ID)
|
|
C
|
|
C columns corresponding to total particle density, fictitious
|
|
C massive particle density, temperature, and electron density,
|
|
C respectively
|
|
C
|
|
B(NHE,NHE)=BOLK*TEMP(ID)/DM(ID)-GN*(RTN-VT0)
|
|
IF(INMP.GT.0) B(NHE,NFREQE+INMP)=GP*(VT0-RTN)
|
|
IF(INRE.GT.0) THEN
|
|
B(NHE,NRE)=BOLK*TOTN(ID)/DM(1)+X1*(HEXT+HEIT(ID))
|
|
C(NHE,NRE)=X1*HEITP(ID)
|
|
END IF
|
|
IF(INPC.GT.0) THEN
|
|
B(NHE,NPC)=X1*(HEXN+HEIN(ID))+GN*(RTN-VT0)
|
|
C(NHE,NPC)=X1*HEINP(ID)
|
|
END IF
|
|
C
|
|
C Columns corresponding to populations
|
|
C
|
|
DO II=1,NLVEXP
|
|
B(NHE,NSE+II)=B(NHE,NSE+II)+X1*(HEX(II)+HEIP(II,ID))
|
|
C(NHE,NSE+II)=C(NHE,NSE+II)+X1*HEIPP(II,ID)
|
|
END DO
|
|
C
|
|
C The rhs vector also accounts for the total radiation pressure in
|
|
C the fixed-option transitions (array FPRD, generated by FIXLIN)
|
|
C
|
|
VECL(NHE)=GRAV-BOLK*TEMP(ID)*TOTN(ID)/DM(ID)-
|
|
* X1*(GRD+FPRD(ID))-VT0/WMM(ID)*DENS(ID)
|
|
RETURN
|
|
C
|
|
C *** Normal depth point (ID > 1)
|
|
C
|
|
C Columns (for matrices A and B) corresponding to mean intensities
|
|
C
|
|
50 CONTINUE
|
|
IF(NFREQE.GT.0.and.ifprad.gt.0) THEN
|
|
DO IJ=1,NFREQE
|
|
IF(.NOT.LSKIP(ID,IJFR(IJ))) THEN
|
|
GRD=GRD+(FK0(IJ)*RAD0(IJ)-FKM(IJ)*RADM(IJ))*W(IJFR(IJ))
|
|
A(NHE,IJ)=-PCK*W(IJFR(IJ))*FKM(IJ)
|
|
B(NHE,IJ)=PCK*W(IJFR(IJ))*FK0(IJ)
|
|
END IF
|
|
END DO
|
|
END IF
|
|
C
|
|
VT0=HALF*VTURB(ID)*VTURB(ID)*WMM(ID)
|
|
VTM=HALF*VTURB(ID-1)*VTURB(ID-1)*WMM(ID-1)
|
|
C
|
|
C columns corresponding to total particle density
|
|
C
|
|
A(NHE,NHE)=-BOLK*TEMP(ID-1)-GN*VTM
|
|
B(NHE,NHE)=BOLK*TEMP(ID)+GN*VT0
|
|
C
|
|
C columns corresponding to temperature
|
|
C
|
|
IF(INRE.GT.0) THEN
|
|
A(NHE,NRE)=-BOLK*TOTN(ID-1)+PCK*HEITM(ID)
|
|
B(NHE,NRE)=BOLK*TOTN(ID)+PCK*HEIT(ID)
|
|
C(NHE,NRE)=PCK*HEITP(ID)
|
|
END IF
|
|
C
|
|
C columns corresponding to electron density
|
|
C
|
|
IF(INPC.GT.0) THEN
|
|
A(NHE,NPC)=GN*VTM+PCK*HEINM(ID)
|
|
B(NHE,NPC)=-GN*VT0+PCK*HEIN(ID)
|
|
C(NHE,NPC)=PCK*HEINP(ID)
|
|
END IF
|
|
C
|
|
C columns corresponding to NMP
|
|
C
|
|
IF(INMP.GT.0) THEN
|
|
A(NHE,NFREQE+INMP)=-GP*VTM
|
|
B(NHE,NFREQE+INMP)=GP*VT0
|
|
END IF
|
|
C
|
|
C columns corresponding to populations
|
|
C
|
|
DO II=1,NLVEXP
|
|
A(NHE,NSE+II)=A(NHE,NSE+II)+PCK*HEIPM(II,ID)
|
|
B(NHE,NSE+II)=B(NHE,NSE+II)+PCK*HEIP(II,ID)
|
|
C(NHE,NSE+II)=C(NHE,NSE+II)+PCK*HEIPP(II,ID)
|
|
END DO
|
|
C
|
|
C the rhs vector
|
|
C again, which accounts for the total radiation pressure in the
|
|
C fixed-option transitions (array FPRD)
|
|
C
|
|
VECL(NHE)=GRAV*(DM(ID)-DM(ID-1))-
|
|
* BOLK*(TEMP(ID)*TOTN(ID)-TEMP(ID-1)*TOTN(ID-1))-
|
|
* PCK*(GRD+FPRD(ID))-
|
|
* VT0/WMM(ID)*DENS(ID)+VTM/WMM(ID-1)*DENS(ID-1)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE BHED(ID)
|
|
C ==================
|
|
C
|
|
C The part of matrices A and B corresponding to the hydrostatic
|
|
C equilibrium equation,
|
|
C i.e. the (NFREQE+INHE)-th row;
|
|
C ii) if desired (INMP > 0), the part corresponding to the
|
|
C definition equation for the fictitious massive particle density,
|
|
C ie. the (NFREQE+INMP)-th row;
|
|
C iii) the part of matrices B and C corresponding to the
|
|
C z-m (z-distance versus mass-depth coordinate) relation,
|
|
C ie. the (NFREQE+INZD)-th row of matrices B and C, however, the
|
|
C elements of C are treated separately
|
|
C
|
|
C Input: ID - depth index
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
COMMON/SURFEX/EXTJ(MFREQ),EXTH(MFREQ)
|
|
COMMON/CMATZD/CZZ,CZN,CZE,CZM
|
|
C
|
|
NHE=NFREQE+INHE
|
|
NRE=NFREQE+INRE
|
|
NPC=NFREQE+INPC
|
|
NSE=NFREQE+INSE-1
|
|
c
|
|
if(inhe.le.0) go to 100
|
|
IJ1=1
|
|
C
|
|
C *********** Linearized equation for the fictitious massive particle
|
|
C density
|
|
C
|
|
IF(INMP.GT.0) THEN
|
|
NMP=NFREQE+INMP
|
|
B(NMP,NMP)=-UN
|
|
B(NMP,NHE)=UN
|
|
IF(INPC.GT.0) B(NMP,NPC)=-UN
|
|
END IF
|
|
C
|
|
C *********** Linearized hydrostatic equilibrium
|
|
C
|
|
HEXT=0.
|
|
HEXN=0.
|
|
GRD=0.
|
|
FLUXW=0.
|
|
DO I=1,NLVEXP
|
|
HEX(I)=0.
|
|
END DO
|
|
C
|
|
IF(ID.GT.1) GO TO 50
|
|
C
|
|
C *** Upper boundary condition (ID=1)
|
|
C
|
|
C 1. possibility - the same as in stellar atmospheres
|
|
C Basically, linearized eq. (7-10) of Mihalas (1978)
|
|
C
|
|
IF(IBCHE.LE.0) THEN
|
|
X1=PCK/DENS(ID)
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=IJ1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
IF(.NOT.LSKIP(ID,IJT)) THEN
|
|
FLUXW=W(IJT)*(FH(IJT)*RAD0(IJ)-HEXTRD(IJT))
|
|
GRD=GRD+FLUXW*ABSO0(IJ)
|
|
HEXN=HEXN+FLUXW*DABN0(IJ)
|
|
HEXT=HEXT+FLUXW*DABT0(IJ)
|
|
DO I=1,NLVEXP
|
|
HEX(I)=HEX(I)+FLUXW*DRCH0(I,IJ)
|
|
END DO
|
|
C
|
|
C Columns corresponding to mean intensities
|
|
C
|
|
B(NHE,IJ)=X1*WDEP0(IJ)*FH(IJT)*ABSO0(IJ)
|
|
END IF
|
|
END DO
|
|
END IF
|
|
C
|
|
RTN=X1*WMM(ID)/DENS(ID)*(GRD+FPRD(ID))
|
|
VT0=HALF*VTURB(ID)*VTURB(ID)/DM(ID)*WMM(ID)
|
|
C
|
|
C columns corresponding to total particle density, fictitious
|
|
C massive particle density, temperature, and electron density,
|
|
C respectively
|
|
C
|
|
B(NHE,NHE)=BOLK*TEMP(ID)/DM(ID)-GN*(RTN-VT0)
|
|
IF(INMP.GT.0) B(NHE,NFREQE+INMP)=GP*(VT0-RTN)
|
|
IF(INRE.GT.0) THEN
|
|
B(NHE,NRE)=BOLK*PSI0(NHE)/DM(1)+X1*(HEXT+HEIT(ID))
|
|
C(NHE,NRE)=X1*HEITP(ID)
|
|
END IF
|
|
IF(INPC.GT.0) THEN
|
|
B(NHE,NPC)=X1*(HEXN+HEIN(ID))+GN*(RTN-VT0)
|
|
C(NHE,NPC)=X1*HEINP(ID)
|
|
END IF
|
|
C
|
|
C Columns corresponding to populations
|
|
C
|
|
DO II=1,NLVEXP
|
|
B(NHE,NSE+II)=B(NHE,NSE+II)+X1*(HEX(II)+HEIP(II,ID))
|
|
C(NHE,NSE+II)=C(NHE,NSE+II)+X1*HEIPP(II,ID)
|
|
END DO
|
|
C
|
|
C The rhs vector also accounts for the total radiation pressure in
|
|
C the fixed-option transitions (array FPRD)
|
|
C
|
|
GRAV=QGRAV*ZD(1)
|
|
VECL(NHE)=GRAV-BOLK*TEMP(ID)*PSI0(NHE)/DM(ID)-
|
|
* X1*(GRD+FPRD(ID))-VT0/WMM(ID)*DENS(ID)
|
|
GO TO 100
|
|
ELSE IF(IBCHE.EQ.1) THEN
|
|
C
|
|
C 2. possibility - specifically disk - Hubeny (1990), Eq. (4.19)
|
|
C newer variant
|
|
C
|
|
C
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=IJ1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
IF(.NOT.LSKIP(ID,IJT)) THEN
|
|
FLUXW=W(IJT)*(FH(IJT)*RAD0(IJ)-HEXTRD(IJT))
|
|
GRD=GRD+FLUXW*ABSO0(IJ)
|
|
HEXN=HEXN+FLUXW*DABN0(IJ)
|
|
HEXT=HEXT+FLUXW*DABT0(IJ)
|
|
DO I=1,NLVEXP
|
|
HEX(I)=HEX(I)+FLUXW*DRCH0(I,IJ)
|
|
END DO
|
|
END IF
|
|
END DO
|
|
END IF
|
|
C
|
|
CCC=PCK/QGRAV
|
|
HR1=CCC*(GRD+FPRD(1))/DENS(1)
|
|
PG1=BOLK*PSI0(NHE)*TEMP(1)
|
|
HG1=SQRT(TWO*PG1/DENS(1)/QGRAV)
|
|
X=(ZD(1)-HR1)/HG1
|
|
IF(X.LT.3.) THEN
|
|
IF(X.LT.0.) X=0.
|
|
F1=8.86226925D-1*EXP(X*X)*ERFCX(X)
|
|
ELSE
|
|
F1=HALF*(UN-HALF/X/X)/X
|
|
END IF
|
|
X1=X*1.01
|
|
F1D=0.
|
|
IF(X1.LT.3.) THEN
|
|
F1D=8.86226925D-1*EXP(X1*X1)*ERFCX(X1)
|
|
ELSE
|
|
F1D=HALF*(UN-HALF/X1/X1)/X1
|
|
END IF
|
|
IF(X.GT.0.) F1D=(F1D-F1)*100./X
|
|
GGG=DENS(1)*HG1*F1
|
|
RF1=DENS(1)*F1D
|
|
CCD=CCC*F1D
|
|
C
|
|
DO IJ=1,NFREQE
|
|
B(NHE,IJ)=-CCD*WDEP0(IJ)*FH(IJFR(IJ))*ABSO0(IJ)
|
|
END DO
|
|
C
|
|
C columns corresponding to total particle density and temperature
|
|
C
|
|
B(NHE,NHE)=B(NHE,NHE)+(GGG+HR1*RF1)/PSI0(NHE)
|
|
IF(INRE.GT.0) B(NHE,NRE)=
|
|
* (GGG-RF1*ZD(1)+RF1*HR1)*HALF/TEMP(1)-CCD*(HEXT+HEIT(ID))
|
|
IF(INZD.GT.0) B(NHE,NZD)=RF1
|
|
IF(INPC.GT.0) B(NHE,NPC)=-CCD*(HEXN+HEIN(ID))
|
|
DO II=1,NLVEXP
|
|
B(NHE,NSE+II)=-CCD*(HEX(II)+HEIP(II,ID))
|
|
END DO
|
|
C
|
|
C The rhs vector
|
|
C
|
|
VECL(NHE)=DM(1)-GGG
|
|
GO TO 100
|
|
ELSE IF(IBCHE.EQ.2) THEN
|
|
C
|
|
C 3. possibility - specifically disk - Hubeny (1990), Eq. (4.19)
|
|
C older variant
|
|
C
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=IJ1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
IF(.NOT.LSKIP(ID,IJT)) THEN
|
|
FLUXW=W(IJT)*(FH(IJT)*RAD0(IJ)-HEXTRD(IJT))
|
|
GRD=GRD+FLUXW*ABSO0(IJ)
|
|
END IF
|
|
END DO
|
|
END IF
|
|
CCC=PCK/QGRAV
|
|
PR1=CCC*(GRD+FPRD(1))/DENS(1)
|
|
PG1=BOLK*PSI0(NHE)*TEMP(1)
|
|
HG1=SQRT(TWO*PG1/DENS(1)/QGRAV)
|
|
X=(ZD(1)-PR1)/HG1
|
|
IF(X.LT.3.) THEN
|
|
IF(X.LT.0.) X=0.
|
|
F1=8.86226925D-1*EXP(X*X)*ERFCX(X)
|
|
ELSE
|
|
F1=HALF*(UN-HALF/X/X)/X
|
|
END IF
|
|
GGG=HG1*QGRAV*HALF/F1
|
|
C
|
|
C columns corresponding to total particle density and temperature
|
|
C
|
|
B(NHE,NHE)=BOLK*TEMP(1)
|
|
IF(INRE.GT.0) B(NHE,NFREQE+INRE)=PG1/TEMP(1)
|
|
C
|
|
C The rhs vector
|
|
C
|
|
VECL(NHE)=DM(1)*GGG-PG1
|
|
GO TO 100
|
|
END IF
|
|
C
|
|
C *** Normal depth point (ID > 1)
|
|
C
|
|
C Columns (for matrices A and B) corresponding to mean intensities
|
|
C
|
|
50 IF(NFREQE.GT.0) THEN
|
|
DO IJ=IJ1,NFREQE
|
|
IF(.NOT.LSKIP(ID,IJFR(IJ))) THEN
|
|
GRD=GRD+(FK0(IJ)*RAD0(IJ)-FKM(IJ)*RADM(IJ))*W(IJFR(IJ))
|
|
A(NHE,IJ)=-PCK*W(IJFR(IJ))*FKM(IJ)
|
|
B(NHE,IJ)=PCK*W(IJFR(IJ))*FK0(IJ)
|
|
END IF
|
|
END DO
|
|
END IF
|
|
C
|
|
VT0=HALF*VTURB(ID)*VTURB(ID)*WMM(ID)
|
|
VTM=HALF*VTURB(ID-1)*VTURB(ID-1)*WMM(ID)
|
|
C
|
|
C columns corresponding to total particle density
|
|
C
|
|
A(NHE,NHE)=-BOLK*TEMP(ID-1)-GN*VTM
|
|
B(NHE,NHE)=BOLK*TEMP(ID)+GN*VT0
|
|
C
|
|
C columns corresponding to temperature
|
|
C
|
|
IF(INRE.GT.0) THEN
|
|
A(NHE,NRE)=-BOLK*PSIM(NHE)+PCK*HEITM(ID)
|
|
B(NHE,NRE)=BOLK*PSI0(NHE)+PCK*HEIT(ID)
|
|
C(NHE,NRE)=PCK*HEITP(ID)
|
|
END IF
|
|
C
|
|
C columns corresponding to electron density
|
|
C
|
|
IF(INPC.GT.0) THEN
|
|
A(NHE,NPC)=GN*VTM+PCK*HEINM(ID)
|
|
B(NHE,NPC)=-GN*VT0+PCK*HEIN(ID)
|
|
C(NHE,NPC)=PCK*HEINP(ID)
|
|
END IF
|
|
C
|
|
C columns corresponding to NMP
|
|
C
|
|
IF(INMP.GT.0) THEN
|
|
A(NHE,NFREQE+INMP)=-GP*VTM
|
|
B(NHE,NFREQE+INMP)=GP*VT0
|
|
END IF
|
|
C
|
|
C column corresponding to ZD (z-distance)
|
|
C
|
|
IF(INZD.GT.0) THEN
|
|
A(NHE,NFREQE+INZD)=-QGRAV*(DM(ID)-DM(ID-1))*HALF
|
|
B(NHE,NFREQE+INZD)=-QGRAV*(DM(ID)-DM(ID-1))*HALF
|
|
END IF
|
|
C
|
|
C columns corresponding to populations
|
|
C
|
|
DO II=1,NLVEXP
|
|
A(NHE,NSE+II)=A(NHE,NSE+II)+PCK*HEIPM(II,ID)
|
|
B(NHE,NSE+II)=B(NHE,NSE+II)+PCK*HEIP(II,ID)
|
|
C(NHE,NSE+II)=C(NHE,NSE+II)+PCK*HEIPP(II,ID)
|
|
END DO
|
|
C
|
|
C the rhs vector
|
|
C again, which accounts for the total radiation pressure in the
|
|
C fixed-option transitions (array FPRD)
|
|
C
|
|
C Since ZD(ID) is in fact z-distance corresponding to a midpoint
|
|
C between depth points ID and ID+1 (as follows from the numerical
|
|
C representation of the relation between DM and ZD), and ZD(ID-1)
|
|
C corresponds to a midpoint between ID and ID-1, z-distance for
|
|
C the point ID is better approximated by the mean value of ZD(ID)
|
|
C and ZD(ID-1)
|
|
C
|
|
GRAV=QGRAV*(ZD(ID)+ZD(ID-1))*HALF
|
|
VECL(NHE)=GRAV*(DM(ID)-DM(ID-1))-
|
|
* BOLK*(TEMP(ID)*PSI0(NHE)-TEMP(ID-1)*PSIM(NHE))-
|
|
* PCK*(GRD+FPRD(ID))-
|
|
* VT0/WMM(ID)*DENS(ID)+VTM/WMM(ID)*DENS(ID-1)
|
|
C
|
|
C *********** Linearized z-m (z-distance vers. mass-depth) relation
|
|
C
|
|
C Note: since there are only at most four non-zero elements of
|
|
C matrix C, they are stored separately in CZZ,CZN,CZE,CZM;
|
|
C when multiplying any matrix by matrix C, these terms must be
|
|
C treated separately - see SOLVE
|
|
C
|
|
100 IF(INZD.LE.0) RETURN
|
|
NZD=NFREQE+INZD
|
|
C
|
|
C *** lower boundary condition [ie. z(ND)=0 ]
|
|
C
|
|
B(NZD,NZD)=UN
|
|
IF(ID.EQ.ND) RETURN
|
|
C
|
|
C *** normal depth point
|
|
C
|
|
DDP=(DM(ID+1)-DM(ID))*HALF
|
|
C
|
|
C column corresponding to ZD
|
|
C
|
|
B(NZD,NZD)=UN
|
|
CZZ=-UN
|
|
C
|
|
C column corresponding to total particle density
|
|
C
|
|
X1=GN*WMM(ID)*DDP
|
|
IF(INHE.GT.0) THEN
|
|
B(NZD,NFREQE+INHE)=X1/DENS(ID)/DENS(ID)
|
|
CZN=X1/DENS(ID+1)/DENS(ID+1)
|
|
END IF
|
|
C
|
|
C column corresponding to electron density
|
|
C
|
|
IF(INPC.GT.0) THEN
|
|
B(NZD,NFREQE+INPC)=-X1/DENS(ID)/DENS(ID)
|
|
CZE=-X1/DENS(ID+1)/DENS(ID+1)
|
|
END IF
|
|
C
|
|
C column corresponding to NMP
|
|
C
|
|
IF(INMP.GT.0) THEN
|
|
B(NZD,NFREQE+INMP)=DDP/DENS(ID)/PSI0(NFREQE+INMP)
|
|
CZM=DDP/DENS(ID+1)/PSIP(NFREQE+INMP)
|
|
END IF
|
|
C
|
|
C the element of the rhs vector
|
|
C
|
|
VECL(NZD)=ZD(ID+1)-ZD(ID)+DDP/DENS(ID)+DDP/DENS(ID+1)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE BHEZ(ID)
|
|
C ==================
|
|
C
|
|
C The part of matrices A and B corresponding to the hydrostatic
|
|
C equilibrium equation,
|
|
C i.e. the (NFREQE+INHE)-th row;
|
|
C
|
|
C Input: ID - depth index
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
COMMON/SURFEX/EXTJ(MFREQ),EXTH(MFREQ)
|
|
C
|
|
NHE=NFREQE+INHE
|
|
NRE=NFREQE+INRE
|
|
NPC=NFREQE+INPC
|
|
NZD=NFREQE+INZD
|
|
NSE=NFREQE+INSE-1
|
|
c
|
|
if(inhe.le.0) return
|
|
IJ1=1
|
|
C
|
|
C *********** Linearized equation for the fictitious massive particle
|
|
C density
|
|
C
|
|
IF(INMP.GT.0) THEN
|
|
NMP=NFREQE+INMP
|
|
B(NMP,NMP)=-UN
|
|
B(NMP,NHE)=UN
|
|
IF(INPC.GT.0) B(NMP,NPC)=-UN
|
|
END IF
|
|
C
|
|
C *********** Linearized hydrostatic equilibrium
|
|
C
|
|
HEXT=0.
|
|
HEXN=0.
|
|
GRD=0.
|
|
FLUXW=0.
|
|
DO I=1,NLVEXP
|
|
HEX(I)=0.
|
|
END DO
|
|
C
|
|
IF(ID.GT.1) GO TO 50
|
|
C
|
|
C *** Upper boundary condition (ID=1)
|
|
C
|
|
C 1. possibility - the same as in stellar atmospheres
|
|
C Basically, linearized eq. (7-10) of Mihalas (1978)
|
|
C
|
|
IF(IBCHE.EQ.0) THEN
|
|
X1=PCK/DENS(ID)
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=IJ1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
IF(.NOT.LSKIP(ID,IJT)) THEN
|
|
FLUXW=W(IJT)*(FH(IJT)*RAD0(IJ)-HEXTRD(IJT))
|
|
GRD=GRD+FLUXW*ABSO0(IJ)
|
|
HEXN=HEXN+FLUXW*DABN0(IJ)
|
|
HEXT=HEXT+FLUXW*DABT0(IJ)
|
|
DO I=1,NLVEXP
|
|
HEX(I)=HEX(I)+FLUXW*DRCH0(I,IJ)
|
|
END DO
|
|
C
|
|
C Columns corresponding to mean intensities
|
|
C
|
|
B(NHE,IJ)=X1*WDEP0(IJ)*FH(IJT)*ABSO0(IJ)
|
|
END IF
|
|
END DO
|
|
END IF
|
|
C
|
|
RTN=X1*WMM(ID)/DENS(ID)*(GRD+FPRD(ID))
|
|
VT0=HALF*VTURB(ID)*VTURB(ID)/DM(ID)*WMM(ID)
|
|
C
|
|
C columns corresponding to total particle density, fictitious
|
|
C massive particle density, temperature, and electron density,
|
|
C respectively
|
|
C
|
|
B(NHE,NHE)=BOLK*TEMP(ID)/DM(ID)-GN*(RTN-VT0)
|
|
IF(INMP.GT.0) B(NHE,NFREQE+INMP)=GP*(VT0-RTN)
|
|
IF(INRE.GT.0) THEN
|
|
B(NHE,NRE)=BOLK*PSI0(NHE)/DM(1)+X1*(HEXT+HEIT(ID))
|
|
C(NHE,NRE)=X1*HEITP(ID)
|
|
END IF
|
|
IF(INPC.GT.0) THEN
|
|
B(NHE,NPC)=X1*(HEXN+HEIN(ID))+GN*(RTN-VT0)
|
|
C(NHE,NPC)=X1*HEINP(ID)
|
|
END IF
|
|
C
|
|
C Columns corresponding to populations
|
|
C
|
|
DO II=1,NLVEXP
|
|
B(NHE,NSE+II)=B(NHE,NSE+II)+X1*(HEX(II)+HEIP(II,ID))
|
|
C(NHE,NSE+II)=C(NHE,NSE+II)+X1*HEIPP(II,ID)
|
|
END DO
|
|
C
|
|
C The rhs vector also accounts for the total radiation pressure in
|
|
C the fixed-option transitions (array FPRD)
|
|
C
|
|
GRAV=QGRAV*ZD(1)
|
|
VECL(NHE)=GRAV-BOLK*TEMP(ID)*PSI0(NHE)/DM(ID)-
|
|
* X1*(GRD+FPRD(ID))-VT0/WMM(ID)*DENS(ID)
|
|
C
|
|
RETURN
|
|
ELSE IF(IBCHE.EQ.1) THEN
|
|
C
|
|
C 2. possibility - specifically disk - Hubeny (1990), Eq. (4.19)
|
|
C newer variant
|
|
C
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=IJ1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
IF(.NOT.LSKIP(ID,IJT)) THEN
|
|
FLUXW=W(IJT)*(FH(IJT)*RAD0(IJ)-HEXTRD(IJT))
|
|
GRD=GRD+FLUXW*ABSO0(IJ)
|
|
HEXN=HEXN+FLUXW*DABN0(IJ)
|
|
HEXT=HEXT+FLUXW*DABT0(IJ)
|
|
DO I=1,NLVEXP
|
|
HEX(I)=HEX(I)+FLUXW*DRCH0(I,IJ)
|
|
END DO
|
|
END IF
|
|
END DO
|
|
END IF
|
|
c
|
|
CCC=PCK/QGRAV
|
|
HR1=CCC*(GRD+FPRD(1))/DENS(1)
|
|
PG1=BOLK*PSI0(NHE)*TEMP(1)
|
|
HG1=SQRT(TWO*PG1/DENS(1)/QGRAV)
|
|
X=(ZD(1)-HR1)/HG1
|
|
IF(X.LT.3.) THEN
|
|
IF(X.LT.0.) X=0.
|
|
F1=8.86226925D-1*EXP(X*X)*ERFCX(X)
|
|
ELSE
|
|
F1=HALF*(UN-HALF/X/X)/X
|
|
END IF
|
|
X1=X*1.01
|
|
F1D=0.
|
|
IF(X1.LT.3.) THEN
|
|
F1D=8.86226925D-1*EXP(X1*X1)*ERFCX(X1)
|
|
ELSE
|
|
F1D=HALF*(UN-HALF/X1/X1)/X1
|
|
END IF
|
|
IF(X.GT.0.) F1D=(F1D-F1)*100./X
|
|
GGG=DENS(1)*HG1*F1
|
|
RF1=DENS(1)*F1D
|
|
CCD=CCC*F1D
|
|
C
|
|
DO IJ=1,NFREQE
|
|
B(NHE,IJ)=-CCD*WDEP0(IJ)*FH(IJFR(IJ))*ABSO0(IJ)
|
|
END DO
|
|
C
|
|
C columns corresponding to total particle density and temperature
|
|
C
|
|
B(NHE,NHE)=B(NHE,NHE)+(GGG+HR1*RF1)/PSI0(NHE)
|
|
IF(INRE.GT.0) B(NHE,NRE)=
|
|
* (GGG-RF1*ZD(1)+RF1*HR1)*HALF/TEMP(1)-CCD*(HEXT+HEIT(ID))
|
|
IF(INZD.GT.0) B(NHE,NZD)=RF1
|
|
IF(INPC.GT.0) B(NHE,NPC)=-CCD*(HEXN+HEIN(ID))
|
|
DO II=1,NLVEXP
|
|
B(NHE,NSE+II)=-CCD*(HEX(II)+HEIP(II,ID))
|
|
END DO
|
|
C
|
|
C The rhs vector
|
|
C
|
|
VECL(NHE)=DM(1)-GGG
|
|
RETURN
|
|
ELSE IF(IBCHE.EQ.2) THEN
|
|
C
|
|
C 3. possibility - specifically disk - Hubeny (1990), Eq. (4.19)
|
|
C older variant
|
|
C
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=IJ1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
IF(.NOT.LSKIP(ID,IJT)) THEN
|
|
FLUXW=W(IJT)*(FH(IJT)*RAD0(IJ)-HEXTRD(IJT))
|
|
GRD=GRD+FLUXW*ABSO0(IJ)
|
|
END IF
|
|
END DO
|
|
END IF
|
|
CCC=PCK/QGRAV
|
|
PR1=CCC*(GRD+FPRD(1))/DENS(1)
|
|
PG1=BOLK*PSI0(NHE)*TEMP(1)
|
|
HG1=SQRT(TWO*PG1/DENS(1)/QGRAV)
|
|
X=(ZD(1)-PR1)/HG1
|
|
IF(X.LT.3.) THEN
|
|
IF(X.LT.0.) X=0.
|
|
F1=8.86226925D-1*EXP(X*X)*ERFCX(X)
|
|
ELSE
|
|
F1=HALF*(UN-HALF/X/X)/X
|
|
END IF
|
|
GGG=HG1*QGRAV*HALF/F1
|
|
C
|
|
C columns corresponding to total particle density and temperature
|
|
C
|
|
B(NHE,NHE)=BOLK*TEMP(1)
|
|
IF(INRE.GT.0) B(NHE,NFREQE+INRE)=PG1/TEMP(1)
|
|
C
|
|
C The rhs vector
|
|
C
|
|
VECL(NHE)=DM(1)*GGG-PG1
|
|
RETURN
|
|
ELSE
|
|
C
|
|
C 4. a simple form of the bounary condition P_gas(ID=1)=PGAS0,
|
|
C where PGAS0 is an input parameter
|
|
C
|
|
B(NHE,NHE)=BOLK*TEMP(1)
|
|
IF(INRE.GT.0) B(NHE,NRE)=BOLK*PSI0(NHE)
|
|
VECL(NHE)=PGAS0-BOLK*TEMP(1)*PSI0(NHE)
|
|
RETURN
|
|
END IF
|
|
C
|
|
C *** Normal depth point (ID > 1)
|
|
C
|
|
C Columns (for matrices A and B) corresponding to mean intensities
|
|
C
|
|
50 CONTINUE
|
|
GRAV=QGRAV*(ZD(ID)+ZD(ID-1))*HALF
|
|
GRAVZ=GRAV*(ZD(ID)-ZD(ID-1))
|
|
DGRV=GRAVZ*HALF*WMM(ID)
|
|
GRD=0.
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=IJ1,NFREQE
|
|
IF(.NOT.LSKIP(ID,IJFR(IJ))) THEN
|
|
GRD=GRD+(FK0(IJ)*RAD0(IJ)-FKM(IJ)*RADM(IJ))*W(IJFR(IJ))
|
|
A(NHE,IJ)=-PCK*W(IJFR(IJ))*FKM(IJ)
|
|
B(NHE,IJ)=PCK*W(IJFR(IJ))*FK0(IJ)
|
|
END IF
|
|
END DO
|
|
END IF
|
|
C
|
|
VT0=HALF*VTURB(ID)*VTURB(ID)*WMM(ID)
|
|
VTM=HALF*VTURB(ID-1)*VTURB(ID-1)*WMM(ID)
|
|
C
|
|
C columns corresponding to total particle density
|
|
C
|
|
A(NHE,NHE)=-BOLK*TEMP(ID-1)-GN*(VTM+DGRV)
|
|
B(NHE,NHE)=BOLK*TEMP(ID)+GN*(VT0+DGRV)
|
|
C
|
|
C columns corresponding to temperature
|
|
C
|
|
IF(INRE.GT.0) THEN
|
|
A(NHE,NRE)=-BOLK*PSIM(NHE)+PCK*HEITM(ID)
|
|
B(NHE,NRE)=BOLK*PSI0(NHE)+PCK*HEIT(ID)
|
|
C(NHE,NRE)=PCK*HEITP(ID)
|
|
END IF
|
|
C
|
|
C columns corresponding to electron density
|
|
C
|
|
IF(INPC.GT.0) THEN
|
|
A(NHE,NPC)=GN*(VTM+DGRV)+PCK*HEINM(ID)
|
|
B(NHE,NPC)=-GN*(VT0+DGRV)+PCK*HEIN(ID)
|
|
C(NHE,NPC)=PCK*HEINP(ID)
|
|
END IF
|
|
C
|
|
C columns corresponding to NMP
|
|
C
|
|
IF(INMP.GT.0) THEN
|
|
A(NHE,NFREQE+INMP)=-GP*(VTM+DGRV)
|
|
B(NHE,NFREQE+INMP)=GP*(VT0+DGRV)
|
|
END IF
|
|
C
|
|
C columns corresponding to populations
|
|
C
|
|
DO II=1,NLVEXP
|
|
A(NHE,NSE+II)=A(NHE,NSE+II)+PCK*HEIPM(II,ID)
|
|
B(NHE,NSE+II)=B(NHE,NSE+II)+PCK*HEIP(II,ID)
|
|
C(NHE,NSE+II)=C(NHE,NSE+II)+PCK*HEIPP(II,ID)
|
|
END DO
|
|
C
|
|
C the rhs vector
|
|
C
|
|
VECL(NHE)=-GRAVZ*(DENS(ID)+DENS(ID-1))*HALF-
|
|
* BOLK*(TEMP(ID)*PSI0(NHE)-TEMP(ID-1)*PSIM(NHE))-
|
|
* PCK*(GRD+FPRD(ID))-
|
|
* VT0/WMM(ID)*DENS(ID)+VTM/WMM(ID)*DENS(ID-1)
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE BRE(ID)
|
|
C ==================
|
|
C
|
|
C The part of matrices A and B corresponding to the radiative
|
|
C equilibrium equation
|
|
C i.e. the (NFREQE+INRE)-th row
|
|
C
|
|
C Input: ID - depth index
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
DIMENSION REXB(MLEVEL)
|
|
EQUIVALENCE (REX(1),REXB(1))
|
|
C
|
|
NHE=NFREQE+INHE
|
|
NRE=NFREQE+INRE
|
|
NPC=NFREQE+INPC
|
|
NMP=NFREQE+INMP
|
|
NSE=NFREQE+INSE-1
|
|
IJ1=1
|
|
if(icompt.gt.0.and.icombc.gt.0.and.ijex(1).gt.0) IJ1=2
|
|
C
|
|
ittc=abs(nretc)/100
|
|
if(iter.gt.ittc) then
|
|
if(id.le.mod(abs(nretc),100)) then
|
|
b(nre,nre)=1.
|
|
if(nretc.lt.0) then
|
|
c(nre,nre)=-1.
|
|
vecl(nre)=temp(id+1)-temp(id)
|
|
end if
|
|
return
|
|
end if
|
|
end if
|
|
C
|
|
C the rhs vector accounts for total net cooling in ALI
|
|
C transitions (FCOOL)
|
|
C
|
|
VECL(NRE)=FCOOL(ID)
|
|
IF(IDISK.EQ.1) VECL(NRE)=FCOOL(ID)-reint(id)*TVISC(ID)
|
|
if(reint(id).le.0) go to 100
|
|
C
|
|
C ********* integral equation part of the radiative
|
|
C equilibrium equation
|
|
C
|
|
BREPC=0.
|
|
BREMP=0.
|
|
DO I=1,NLVEXP
|
|
REXB(I)=0.
|
|
END DO
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=IJ1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
BREPC=BREPC+((DABN0(IJ)-SIGEC(IJT))*RAD0(IJ)-
|
|
* DEMN0(IJ))*WDEP0(IJ)
|
|
BREMP=BREMP+(DABM0(IJ)*RAD0(IJ)-DEMM0(IJ))*WDEP0(IJ)
|
|
DO I=1,NLVEXP
|
|
REXB(I)=REXB(I)+(DRCH0(I,IJ)*RAD0(IJ)-
|
|
* DRET0(I,IJ))*WDEP0(IJ)
|
|
END DO
|
|
B(NRE,NRE)=B(NRE,NRE)+(DABT0(IJ)*RAD0(IJ)-
|
|
* DEMT0(IJ))*WDEP0(IJ)*reint(id)
|
|
HEAT=ABSO0(IJ)-SCAT0(IJ)
|
|
B(NRE,IJ)=WDEP0(IJ)*HEAT*reint(id)
|
|
VECL(NRE)=VECL(NRE)-(HEAT*RAD0(IJ)-EMIS0(IJ))*WDEP0(IJ)*
|
|
* reint(id)
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.5) then
|
|
ijt=ijfr(ij)
|
|
call compt0(ijt,id,abso0(ij),cma,cmb,cmc,cme,cms,cmd)
|
|
vecl(nre)=vecl(nre)+abso0(ij)*cms*wdep0(ij)*reint(id)
|
|
if(icompt.gt.6) then
|
|
if(icmdra.gt.0) then
|
|
b(nre,ij)=b(nre,ij)-abso0(ij)*(cmb+cme)*wdep0(ij)*reint(id)
|
|
else
|
|
b(nre,ij)=b(nre,ij)-abso0(ij)*(cmb+cme)*reint(id)
|
|
end if
|
|
iji=nfreq-kij(ijt)+1
|
|
if(iji.gt.1) then
|
|
ijm=ijex(ijorig(iji-1))
|
|
if(ijm.gt.0) then
|
|
if(icmdra.gt.0) then
|
|
b(nre,ijm)=b(nre,ijm)-abso0(ij)*cma*wdep0(ij)*reint(id)
|
|
else
|
|
b(nre,ijm)=b(nre,ijm)-abso0(ij)*cma*reint(id)
|
|
end if
|
|
end if
|
|
end if
|
|
if(iji.lt.nfreq) then
|
|
ijp=ijex(ijorig(iji+1))
|
|
if(ijp.gt.0) then
|
|
if(icmdra.gt.0) then
|
|
b(nre,ijp)=b(nre,ijp)-abso0(ij)*cmc*wdep0(ij)*reint(id)
|
|
else
|
|
b(nre,ijp)=b(nre,ijp)-abso0(ij)*cmc*reint(id)
|
|
end if
|
|
end if
|
|
end if
|
|
b(nre,nre)=b(nre,nre)-cmd*abso0(ij)*wdep0(ij)*reint(id)
|
|
b(nre,npc)=b(nre,npc)-cms*abso0(ij)/elec(id)*wdep0(ij)*
|
|
* reint(id)
|
|
end if
|
|
end if
|
|
C
|
|
END DO
|
|
END IF
|
|
C
|
|
C corrections for ALI frequency points
|
|
C
|
|
B(NRE,NRE)=B(NRE,NRE)+REIT(ID)*reint(id)
|
|
IF(INPC.GT.0) B(NRE,NPC)=B(NRE,NPC)+(BREPC+REIN(ID))*reint(id)
|
|
IF(INMP.GT.0) B(NRE,NMP)=B(NRE,NMP)+(BREMP+REIM(ID))*reint(id)
|
|
IF(INHE.GT.0) B(NRE,NHE)=REIX(ID)*reint(id)
|
|
IF(IFALI.GT.5) THEN
|
|
A(NRE,NRE)=AREIT(ID)*reint(id)
|
|
IF(INPC.GT.0) A(NRE,NPC)=AREIN(ID)*reint(id)
|
|
IF(INMP.GT.0) A(NRE,NMP)=AREIM(ID)*reint(id)
|
|
C(NRE,NRE)=CREIT(ID)*reint(id)
|
|
IF(INPC.GT.0) C(NRE,NPC)=CREIN(ID)*reint(id)
|
|
IF(INMP.GT.0) C(NRE,NMP)=CREIM(ID)*reint(id)
|
|
IF(INHE.GT.0) C(NRE,NHE)=CREIX(ID)*reint(id)
|
|
END IF
|
|
C
|
|
C additional terms for disks because of viscosity
|
|
C
|
|
IF(IDISK.EQ.1) THEN
|
|
B(NRE,NRE)=B(NRE,NRE)+DTVIST(ID)*reint(id)
|
|
IF(INPC.GT.0) B(NRE,NPC)=B(NRE,NPC)-DTVISR(ID)*reint(id)
|
|
IF(INHE.GT.0) B(NRE,NFREQE+INHE)=
|
|
* (DTVISR(ID)+DTVISN(ID))*reint(id)
|
|
IF(INMP.GT.0) B(NRE,NFREQE+INMP)=
|
|
* DTVISR(ID)*HMASS/WMM(ID)*reint(id)
|
|
END IF
|
|
C
|
|
DO II=1,NLVEXP
|
|
B(NRE,NSE+II)=B(NRE,NSE+II)+(REXB(II)+REIP(II,ID))*reint(id)
|
|
END DO
|
|
IF(IFALI.GT.5.AND.ID.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
A(NRE,NSE+II)=A(NRE,NSE+II)+AREIP(II,ID)*reint(id)
|
|
END DO
|
|
END IF
|
|
IF(IFALI.GT.5.AND.ID.LT.ND) THEN
|
|
DO II=1,NLVEXP
|
|
C(NRE,NSE+II)=C(NRE,NSE+II)+CREIP(II,ID)*reint(id)
|
|
END DO
|
|
END IF
|
|
C
|
|
C ********* differential equation part of the
|
|
C radiative equilibrium equation
|
|
C
|
|
100 CONTINUE
|
|
if(redif(id).eq.0) return
|
|
C
|
|
TEFFD=TEFF**4
|
|
IF(IDISK.EQ.1) TEFFD=TEFF**4*(UN-THETAV(ID))
|
|
VECL(NRE)=VECL(NRE)+SIG4P*TEFFD*redif(id)
|
|
c
|
|
if(id.eq.1) go to 200
|
|
C
|
|
DDM=(DM(ID)-DM(ID-1))*HALF
|
|
AREN=0.
|
|
BREN=0.
|
|
AREPC=0.
|
|
BREPC=0.
|
|
C
|
|
GP=0.
|
|
GN=UN
|
|
IF(INMP.GT.0) THEN
|
|
GP=UN
|
|
GN=0.
|
|
END IF
|
|
C
|
|
DO I=1,NLVEXP
|
|
REXB(I)=0.
|
|
REXA(I)=0.
|
|
END DO
|
|
C
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=1,NFREQE
|
|
OMEG0=ABSO0(IJ)*DENS1(ID)
|
|
OMEGM=ABSOM(IJ)*DENS1(ID-1)
|
|
DTAUM=(OMEG0+OMEGM)*DDM
|
|
FRD=FK0(IJ)*RAD0(IJ)-FKM(IJ)*RADM(IJ)
|
|
GAMR=FRD/DTAUM
|
|
A1=GAMR/(OMEG0+OMEGM)
|
|
A3R=A1*DENS1(ID-1)*WDEP0(IJ)
|
|
B3R=A1*DENS1(ID)*WDEP0(IJ)
|
|
C
|
|
C Corresponding elements of matrix A
|
|
C
|
|
A(NRE,IJ)=-WDEP0(IJ)*FKM(IJ)/DTAUM*redif(id)
|
|
RTR=OMEGM*WMM(ID-1)*A3R
|
|
AREN=AREN+RTR*GN
|
|
AREPC=AREPC-A3R*DABNM(IJ)-RTR*GN
|
|
IF(INMP.NE.0) A(NRE,NFREQE+INMP)=A(NRE,NFREQE+INMP)+RTR*GP*
|
|
* redif(id)
|
|
A(NRE,NRE)=A(NRE,NRE)-A3R*DABTM(IJ)*redif(id)
|
|
C
|
|
C Corresponding elements of matrix B
|
|
C Columns corresponding to mean intensities
|
|
C
|
|
B(NRE,IJ)=B(NRE,IJ)+WDEP0(IJ)*FK0(IJ)/DTAUM*redif(id)
|
|
RTR=OMEG0*WMM(ID)*B3R
|
|
BREN=BREN+RTR*GN
|
|
BREPC=BREPC-B3R*DABN0(IJ)-RTR*GN
|
|
IF(INMP.NE.0) B(NRE,NFREQE+INMP)=B(NRE,NFREQE+INMP)+
|
|
* (RTR+REDX(ID))*GP*redif(id)
|
|
C
|
|
C Column corresponding to temperature
|
|
C
|
|
B(NRE,NRE)=B(NRE,NRE)-B3R*DABT0(IJ)*redif(id)
|
|
C
|
|
C auxiliary vectors for columns corresponding to populations
|
|
C
|
|
DO I=1,NLVEXP
|
|
REXA(I)=REXA(I)-A3R*DRCHM(I,IJ)
|
|
REXB(I)=REXB(I)-B3R*DRCH0(I,IJ)
|
|
END DO
|
|
C
|
|
C The rhs vector
|
|
C
|
|
VECL(NRE)=VECL(NRE)-WDEP0(IJ)*GAMR*redif(id)
|
|
END DO
|
|
END IF
|
|
C
|
|
C Column corresponding to N (total particle number density)
|
|
C for both A and B matrices
|
|
C
|
|
IF(INHE.NE.0) THEN
|
|
A(NRE,NFREQE+INHE)=(AREN+REDXM(ID))*redif(id)
|
|
B(NRE,NFREQE+INHE)=B(NRE,NFREQE+INHE)+(BREN+REDX(ID))*redif(id)
|
|
END IF
|
|
C
|
|
C Column corresponding to temperature
|
|
C
|
|
A(NRE,NRE)=A(NRE,NRE)+REDTM(ID)*REDIF(ID)
|
|
B(NRE,NRE)=B(NRE,NRE)+REDT(ID)*REDIF(ID)
|
|
C(NRE,NRE)=C(NRE,NRE)+REDTP(ID)*REDIF(ID)
|
|
C
|
|
C Column corresponding to electron density (for matrices A and B)
|
|
C
|
|
IF(INPC.NE.0) THEN
|
|
A(NRE,NPC)=A(NRE,NPC)+(AREPC+REDNM(ID)-REDXM(ID))*redif(id)
|
|
B(NRE,NPC)=B(NRE,NPC)+(BREPC+REDN(ID)-REDX(ID))*redif(id)
|
|
C(NRE,NPC)=C(NRE,NPC)+REDNP(ID)*redif(id)
|
|
END IF
|
|
C
|
|
C Columns corresponding to populations (for matrices A and B)
|
|
C Note that auxiliary arrays REXA and REX, which contain derivatives
|
|
C of the absorption and emission coefficients wrt populations, have
|
|
C been generated by BRTE
|
|
C
|
|
DO II=1,NLVEXP
|
|
A(NRE,NSE+II)=A(NRE,NSE+II)+(REXA(II)+REDPM(II,ID))*redif(id)
|
|
B(NRE,NSE+II)=B(NRE,NSE+II)+(REXB(II)+REDP(II,ID))*redif(id)
|
|
C(NRE,NSE+II)=C(NRE,NSE+II)+REDPP(II,ID)*redif(id)
|
|
END DO
|
|
RETURN
|
|
c
|
|
C upper boundary condition for the differential form
|
|
c
|
|
200 CONTINUE
|
|
C
|
|
C Columns corresponding to mean intensities; rhs vector
|
|
C
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
WF=WDEP0(IJ)*FH(IJT)*REDIF(ID)
|
|
B(NRE,IJ)=B(NRE,IJ)+WF
|
|
VECL(NRE)=VECL(NRE)-WF*RAD0(IJ)-WDEP0(IJ)*HEXTRD(IJT)*
|
|
* REDIF(ID)
|
|
END DO
|
|
END IF
|
|
C
|
|
C Column corresponding to temperature
|
|
C
|
|
B(NRE,NRE)=B(NRE,NRE)+REDT(ID)*REDIF(ID)
|
|
C(NRE,NRE)=C(NRE,NRE)+REDTP(ID)*REDIF(ID)
|
|
C
|
|
C Column corresponding to N and electron density
|
|
C
|
|
IF(INHE.NE.0) B(NRE,NHE)=B(NRE,NHE)+REDX(ID)*redif(id)
|
|
IF(INPC.NE.0) B(NRE,NPC)=B(NRE,NPC)+REDN(ID)*redif(id)
|
|
IF(INHE.NE.0) C(NRE,NHE)=C(NRE,NHE)+REDXP(ID)*redif(id)
|
|
IF(INPC.NE.0) C(NRE,NPC)=C(NRE,NPC)+REDNP(ID)*redif(id)
|
|
C
|
|
C Columns corresponding to populations
|
|
C
|
|
DO II=1,NLVEXP
|
|
B(NRE,NSE+II)=B(NRE,NSE+II)+REDP(II,ID)*redif(id)
|
|
C(NRE,NSE+II)=C(NRE,NSE+II)+REDPP(II,ID)*redif(id)
|
|
END DO
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE BREZ(ID)
|
|
C ===================
|
|
C
|
|
C The part of matrices A and B corresponding to the radiative
|
|
C equilibrium equation
|
|
C i.e. the (NFREQE+INRE)-th row
|
|
C
|
|
C Input: ID - depth index
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
DIMENSION REXB(MLEVEL)
|
|
EQUIVALENCE (REX(1),REXB(1))
|
|
C
|
|
NRE=NFREQE+INRE
|
|
NHE=NFREQE+INHE
|
|
NPC=NFREQE+INPC
|
|
NMP=NFREQE+INMP
|
|
NSE=NFREQE+INSE-1
|
|
IJ1=1
|
|
if(icompt.gt.0.and.icombc.gt.0.and.ijex(1).gt.0) IJ1=2
|
|
C
|
|
ittc=abs(nretc)/100
|
|
if(iter.gt.ittc) then
|
|
if(id.le.mod(abs(nretc),100)) then
|
|
b(nre,nre)=1.
|
|
if(nretc.lt.0) then
|
|
c(nre,nre)=-1.
|
|
vecl(nre)=temp(id+1)-temp(id)
|
|
end if
|
|
return
|
|
end if
|
|
end if
|
|
C
|
|
C the rhs vector accounts for total net cooling in ALI
|
|
C transitions (FCOOL)
|
|
C
|
|
VECL(NRE)=FCOOL(ID)-reint(id)*TVISC(ID)
|
|
if(reint(id).le.0) go to 100
|
|
C
|
|
C ********* integral equation part of the radiative
|
|
C equilibrium equation
|
|
C
|
|
BREPC=0.
|
|
BREMP=0.
|
|
DO I=1,NLVEXP
|
|
REXB(I)=0.
|
|
END DO
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=IJ1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
BREPC=BREPC+((DABN0(IJ)-SIGEC(IJT))*RAD0(IJ)-
|
|
* DEMN0(IJ))*WDEP0(IJ)
|
|
BREMP=BREMP+(DABM0(IJ)*RAD0(IJ)-DEMM0(IJ))*WDEP0(IJ)
|
|
DO I=1,NLVEXP
|
|
REXB(I)=REXB(I)+(DRCH0(I,IJ)*RAD0(IJ)-
|
|
* DRET0(I,IJ))*WDEP0(IJ)
|
|
END DO
|
|
B(NRE,NRE)=B(NRE,NRE)+(DABT0(IJ)*RAD0(IJ)-
|
|
* DEMT0(IJ))*WDEP0(IJ)*reint(id)
|
|
HEAT=ABSO0(IJ)-SCAT0(IJ)
|
|
B(NRE,IJ)=WDEP0(IJ)*HEAT*reint(id)
|
|
VECL(NRE)=VECL(NRE)-(HEAT*RAD0(IJ)-EMIS0(IJ))*WDEP0(IJ)*
|
|
* reint(id)
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.5) then
|
|
ijt=ijfr(ij)
|
|
call compt0(ijt,id,abso0(ij),cma,cmb,cmc,cme,cms,cmd)
|
|
vecl(nre)=vecl(nre)+abso0(ij)*cms*wdep0(ij)*reint(id)
|
|
if(icompt.gt.6) then
|
|
if(icmdra.gt.0) then
|
|
b(nre,ij)=b(nre,ij)-abso0(ij)*(cmb+cme)*wdep0(ij)*reint(id)
|
|
else
|
|
b(nre,ij)=b(nre,ij)-abso0(ij)*(cmb+cme)*reint(id)
|
|
end if
|
|
iji=nfreq-kij(ijt)+1
|
|
if(iji.gt.1) then
|
|
ijm=ijex(ijorig(iji-1))
|
|
if(ijm.gt.0) then
|
|
if(icmdra.gt.0) then
|
|
b(nre,ijm)=b(nre,ijm)-abso0(ij)*cma*wdep0(ij)*reint(id)
|
|
else
|
|
b(nre,ijm)=b(nre,ijm)-abso0(ij)*cma*reint(id)
|
|
end if
|
|
end if
|
|
end if
|
|
if(iji.lt.nfreq) then
|
|
ijp=ijex(ijorig(iji+1))
|
|
if(ijp.gt.0) then
|
|
if(icmdra.gt.0) then
|
|
b(nre,ijp)=b(nre,ijp)-abso0(ij)*cmc*wdep0(ij)*reint(id)
|
|
else
|
|
b(nre,ijp)=b(nre,ijp)-abso0(ij)*cmc*reint(id)
|
|
end if
|
|
end if
|
|
end if
|
|
b(nre,nre)=b(nre,nre)-cmd*abso0(ij)*wdep0(ij)*reint(id)
|
|
b(nre,npc)=b(nre,npc)-cms*abso0(ij)/elec(id)*wdep0(ij)*
|
|
* reint(id)
|
|
end if
|
|
end if
|
|
C
|
|
END DO
|
|
END IF
|
|
C
|
|
C corrections for ALI frequency points
|
|
C
|
|
B(NRE,NRE)=B(NRE,NRE)+REIT(ID)*reint(id)
|
|
IF(INPC.GT.0) B(NRE,NPC)=B(NRE,NPC)+(BREPC+REIN(ID))*reint(id)
|
|
IF(INPC.GT.0) B(NRE,NPC)=B(NRE,NPC)+(BREPC+REIN(ID))*reint(id)
|
|
IF(INMP.GT.0) B(NRE,NMP)=B(NRE,NMP)+(BREMP+REIM(ID))*reint(id)
|
|
IF(INHE.GT.0) B(NRE,NHE)=REIX(ID)*reint(id)
|
|
A(NRE,NRE)=AREIT(ID)*reint(id)
|
|
IF(INPC.GT.0) A(NRE,NPC)=AREIN(ID)*reint(id)
|
|
C(NRE,NRE)=CREIT(ID)*reint(id)
|
|
IF(INPC.GT.0) C(NRE,NPC)=CREIN(ID)*reint(id)
|
|
IF(INMP.GT.0) C(NRE,NMP)=CREIM(ID)*reint(id)
|
|
IF(INHE.GT.0) C(NRE,NHE)=CREIX(ID)*reint(id)
|
|
c END IF
|
|
C
|
|
C terms arising because of viscosity
|
|
C
|
|
B(NRE,NRE)=B(NRE,NRE)+DTVIST(ID)*reint(id)
|
|
IF(INPC.GT.0) B(NRE,NPC)=B(NRE,NPC)-DTVISR(ID)*reint(id)
|
|
IF(INHE.GT.0) B(NRE,NFREQE+INHE)=
|
|
* (DTVISR(ID)+DTVISN(ID))*reint(id)
|
|
IF(INMP.GT.0) B(NRE,NFREQE+INMP)=
|
|
* DTVISR(ID)*HMASS/WMM(ID)*reint(id)
|
|
C
|
|
DO II=1,NLVEXP
|
|
B(NRE,NSE+II)=B(NRE,NSE+II)+(REXB(II)+REIP(II,ID))*reint(id)
|
|
END DO
|
|
IF(IFALI.GT.5.AND.ID.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
A(NRE,NSE+II)=A(NRE,NSE+II)+AREIP(II,ID)*reint(id)
|
|
END DO
|
|
END IF
|
|
IF(IFALI.GT.5.AND.ID.LT.ND) THEN
|
|
DO II=1,NLVEXP
|
|
C(NRE,NSE+II)=C(NRE,NSE+II)+CREIP(II,ID)*reint(id)
|
|
END DO
|
|
END IF
|
|
C
|
|
C ********* differential equation part of the
|
|
C radiative equilibrium equation
|
|
C
|
|
100 CONTINUE
|
|
if(redif(id).eq.0) return
|
|
C
|
|
TEFFD=TEFF**4*(UN-THETAV(ID))
|
|
VECL(NRE)=VECL(NRE)+SIG4P*TEFFD*redif(id)
|
|
if(id.eq.1) go to 200
|
|
C
|
|
DDM=(ZD(ID-1)-ZD(ID))*HALF
|
|
AREN=0.
|
|
BREN=0.
|
|
AREPC=0.
|
|
BREPC=0.
|
|
C
|
|
GP=0.
|
|
GN=UN
|
|
IF(INMP.GT.0) THEN
|
|
GP=UN
|
|
GN=0.
|
|
END IF
|
|
C
|
|
DO I=1,NLVEXP
|
|
REXB(I)=0.
|
|
REXA(I)=0.
|
|
END DO
|
|
C
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=1,NFREQE
|
|
OMEG0=ABSO0(IJ)
|
|
OMEGM=ABSOM(IJ)
|
|
DTAUM=(OMEG0+OMEGM)*DDM
|
|
FRD=FK0(IJ)*RAD0(IJ)-FKM(IJ)*RADM(IJ)
|
|
GAMR=FRD/DTAUM
|
|
A1=GAMR/(OMEG0+OMEGM)*WDEP0(IJ)
|
|
C
|
|
C Corresponding elements of matrix A
|
|
C
|
|
A(NRE,IJ)=-WDEP0(IJ)*FKM(IJ)/DTAUM*redif(id)
|
|
AREPC=AREPC-A1*DABNM(IJ)
|
|
A(NRE,NRE)=A(NRE,NRE)-A1*DABTM(IJ)*redif(id)
|
|
C
|
|
C Corresponding elements of matrix B
|
|
C Columns corresponding to mean intensities
|
|
C
|
|
B(NRE,IJ)=B(NRE,IJ)+WDEP0(IJ)*FK0(IJ)/DTAUM*redif(id)
|
|
BREPC=BREPC-A1*DABN0(IJ)
|
|
C
|
|
C Column corresponding to temperature
|
|
C
|
|
B(NRE,NRE)=B(NRE,NRE)-A1*DABT0(IJ)*redif(id)
|
|
C
|
|
C auxiliary vectors for columns corresponding to populations
|
|
C
|
|
DO I=1,NLVEXP
|
|
REXA(I)=REXA(I)-A1*DRCHM(I,IJ)
|
|
REXB(I)=REXB(I)-A1*DRCH0(I,IJ)
|
|
END DO
|
|
C
|
|
C The rhs vector
|
|
C
|
|
VECL(NRE)=VECL(NRE)-WDEP0(IJ)*GAMR*redif(id)
|
|
END DO
|
|
END IF
|
|
C
|
|
C Column corresponding to temperature
|
|
C
|
|
A(NRE,NRE)=A(NRE,NRE)+REDTM(ID)*REDIF(ID)
|
|
B(NRE,NRE)=B(NRE,NRE)+REDT(ID)*REDIF(ID)
|
|
C(NRE,NRE)=C(NRE,NRE)+REDTP(ID)*REDIF(ID)
|
|
C
|
|
C Column corresponding to electron density (for matrices A and B)
|
|
C
|
|
IF(INPC.NE.0) THEN
|
|
A(NRE,NPC)=A(NRE,NPC)+(AREPC+REDNM(ID))*redif(id)
|
|
B(NRE,NPC)=B(NRE,NPC)+(BREPC+REDN(ID))*redif(id)
|
|
C(NRE,NPC)=C(NRE,NPC)+REDNP(ID)*redif(id)
|
|
END IF
|
|
C
|
|
C Columns corresponding to populations (for matrices A and B)
|
|
C Note that auxiliary arrays REXA and REX, which contain derivatives
|
|
C of the absorption and emission coefficients wrt populations, have
|
|
C been generated by BRTE
|
|
C
|
|
DO II=1,NLVEXP
|
|
A(NRE,NSE+II)=A(NRE,NSE+II)+(REXA(II)+REDPM(II,ID))*redif(id)
|
|
B(NRE,NSE+II)=B(NRE,NSE+II)+(REXB(II)+REDP(II,ID))*redif(id)
|
|
C(NRE,NSE+II)=C(NRE,NSE+II)+REDPP(II,ID)*redif(id)
|
|
END DO
|
|
RETURN
|
|
c
|
|
C upper boundary condition for the differential form
|
|
c
|
|
200 CONTINUE
|
|
C
|
|
C Columns corresponding to mean intensities; rhs vector
|
|
C
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
WF=WDEP0(IJ)*FH(IJT)*REDIF(ID)
|
|
B(NRE,IJ)=B(NRE,IJ)+WF
|
|
VECL(NRE)=VECL(NRE)-WF*RAD0(IJ)
|
|
END DO
|
|
END IF
|
|
C
|
|
C Column corresponding to temperature
|
|
C
|
|
B(NRE,NRE)=B(NRE,NRE)+REDT(ID)*REDIF(ID)
|
|
C
|
|
C Column corresponding to electron density
|
|
C
|
|
IF(INPC.NE.0) THEN
|
|
B(NRE,NPC)=B(NRE,NPC)+REDN(ID)*redif(id)
|
|
END IF
|
|
C
|
|
C Columns corresponding to populations
|
|
C
|
|
DO II=1,NLVEXP
|
|
B(NRE,NSE+II)=B(NRE,NSE+II)+REDP(II,ID)*redif(id)
|
|
END DO
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE BPOP(ID)
|
|
C ===================
|
|
C
|
|
C The part of matrix B corresponding to the statistical
|
|
C equilibrium equations
|
|
C i.e. the (NFREQE+INSE)-th thru (NFREQE+INSE+NLVEXP-1)-th rows;
|
|
C and to the charge conservation equation, ie. the (NFREQE+INPC)-th
|
|
C row
|
|
C
|
|
C The formalism is similar to that described in Mihalas, Stellar
|
|
C Atmospheres, 1978, pp. 143-145
|
|
C
|
|
C Input: ID - depth index
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
dimension sbw(mlevel)
|
|
dimension popp(mlevel)
|
|
C
|
|
if(ioptab.lt.0) return
|
|
DO I=1,NLVEXP
|
|
ATT(I)=0.
|
|
ANN(I)=0.
|
|
END DO
|
|
C
|
|
IF(.NOT.LTE .AND. IFPOPR.EQ.5.AND.IPSLTE.EQ.0) THEN
|
|
CALL RATMAT(ID,IIFOR,0,ESEMAT,BESE)
|
|
CALL LEVSOL(ESEMAT,BESE,POPP,IIFOR,NLVFOR,0)
|
|
DO I=1,NLEVEL
|
|
II=IIEXP(I)
|
|
IF(II.EQ.0.AND.IMODL(I).EQ.6) THEN
|
|
III=ILTREF(I,ID)
|
|
SBPSI(I,ID)=POPP(I)/POPP(III)
|
|
END IF
|
|
END DO
|
|
DO ION=1,NION
|
|
DO I=NFIRST(ION),NLAST(ION)
|
|
SBW(I)=ELEC(ID)*SBF(I)*WOP(I,ID)
|
|
IF(POPUL(NNEXT(ION),ID).GT.0..AND.IPZERO(I,ID).EQ.0)
|
|
* BFAC(I,ID)=POPP(I)/(POPP(NNEXT(ION))*SBW(I))
|
|
END DO
|
|
END DO
|
|
END IF
|
|
C
|
|
CALL LEVGRP(ID,IIEXP,0,POPP)
|
|
CALL RATMAT(ID,IIEXP,0,ESEMAT,BESE)
|
|
C
|
|
IF(IFPOPR.LE.3) CALL MATINV(ESEMAT,NLVEXP,MLEVEL)
|
|
C
|
|
C Split BPOP in separate subroutines
|
|
C
|
|
if(ipslte.eq.0) then
|
|
IF(.NOT.LTE.AND.IBPOPE.GT.0.AND.ID.LT.IDLTE) THEN
|
|
CALL BPOPE(ID)
|
|
CALL BPOPF(ID)
|
|
END IF
|
|
end if
|
|
CALL BPOPT(ID)
|
|
IF(INPC.GT.0) CALL BPOPC(ID)
|
|
C
|
|
C reset matrix elements for "small" populations
|
|
C
|
|
DO I=1,NLVEXP
|
|
IF(IGZERO(I,ID).NE.0) THEN
|
|
DO J=1,NLVEXP
|
|
B(NFREQE+INSE-1+I,NFREQE+INSE-1+J)=0.
|
|
END DO
|
|
B(NFREQE+INSE-1+I,NFREQE+INSE-1+I)=1.
|
|
VECL(NFREQE+INSE-1+I)=0.
|
|
END IF
|
|
END DO
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE BPOPE(ID)
|
|
C ====================
|
|
C
|
|
C the part of B-matrix corresponding to the population rows and
|
|
C the explicit frequency columns
|
|
C -- a variant for the full overlap case
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
DIMENSION AJIJ(MFREX,MLVEXP),EHKE(MFREX)
|
|
C
|
|
IF(NFREQE.LE.0) RETURN
|
|
NSE=NFREQE+INSE-1
|
|
DO I=1,NLVEXP
|
|
DO IJE=1,NFREQE
|
|
AJIJ(IJE,I)=0.
|
|
END DO
|
|
END DO
|
|
HKT=HK/TEMP(ID)
|
|
DO IJE=1,NFREQE
|
|
EHKE(IJE)=EXP(-HKT1(ID)*FREQ(IJFR(IJE)))
|
|
END DO
|
|
C
|
|
DO 100 IJ=1,NFREQ
|
|
IF(IJEX(IJ).LE.0) GO TO 100
|
|
IF(IJX(IJ).EQ.-1) GOTO 100
|
|
IJE=IJEX(IJ)
|
|
FR=FREQ(IJ)
|
|
FRINV=UN/FR
|
|
FR3INV=FRINV*FRINV*FRINV
|
|
C
|
|
C ---------------------
|
|
C Continuum transitions
|
|
C ---------------------
|
|
C
|
|
DO 10 IBFT=1,NTRANC
|
|
ITR=ITRBF(IBFT)
|
|
SG=CROSS(IBFT,IJ)
|
|
IF(SG.LE.0.) GO TO 10
|
|
I=ILOW(ITR)
|
|
IF(ILTION(IEL(I)).GE.1.OR.IIFIX(IATM(I)).EQ.1) GO TO 10
|
|
ICDW=MCDW(ITR)
|
|
IMER=IMRG(I)
|
|
II=IABS(IIEXP(I))
|
|
J=IUP(ITR)
|
|
IF(IPZERO(I,ID).NE.0.OR.IPZERO(J,ID).NE.0) GO TO 10
|
|
JJ=IABS(IIEXP(J))
|
|
NREFI=NREFS(IATM(I),ID)
|
|
IF(IFWOP(I).GE.0) THEN
|
|
IF(ICDW.GE.1) THEN
|
|
IZZ=IZ(IEL(I))
|
|
CALL DWNFR1(FR,FR0(ITR),ID,IZZ,DW1)
|
|
SG=SG*DW1
|
|
END IF
|
|
ELSE
|
|
CALL SGMER1(FRINV,FR3INV,IMER,ID,SGME1)
|
|
SG=SGME1
|
|
ENDIF
|
|
W0=W0E(IJ)
|
|
SGW0=SG*W0
|
|
APFR=(ABTRA(ITR,ID)-EMTRA(ITR,ID)*EHKE(IJE))*SGW0
|
|
IF(II.GT.0.AND.I.NE.NREFI.AND.ILTLEV(I).LE.0)
|
|
* AJIJ(IJE,II)=AJIJ(IJE,II)+APFR
|
|
IF(JJ.GT.0.AND.J.NE.NREFI.AND.ILTLEV(J).LE.0.
|
|
* and.iabs(imodl(i)).ne.4)
|
|
* AJIJ(IJE,JJ)=AJIJ(IJE,JJ)-APFR
|
|
10 CONTINUE
|
|
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)
|
|
IF(LINEXP(ITR)) GO TO 20
|
|
IF(.NOT.LEXP(ITR)) GO TO 20
|
|
I=ILOW(ITR)
|
|
IF(ILTION(IEL(I)).GE.1.OR.IIFIX(IATM(I)).EQ.1) GO TO 20
|
|
J=IUP(ITR)
|
|
IF(IPZERO(I,ID).NE.0.OR.IPZERO(J,ID).NE.0) GO TO 20
|
|
II=IABS(IIEXP(I))
|
|
JJ=IABS(IIEXP(J))
|
|
IF(II.LE.0.AND.JJ.LE.0) GO TO 20
|
|
NREFI=NREFS(IATM(I),ID)
|
|
SGW=PRFLIN(ID,IJ)*W0E(IJ)
|
|
APFR=(ABTRA(ITR,ID)-EMTRA(ITR,ID)*EHKE(IJE))*SGW
|
|
IF(II.GT.0.AND.I.NE.NREFI.AND.ILTLEV(I).LE.0)
|
|
* AJIJ(IJE,II)=AJIJ(IJE,II)+APFR
|
|
IF(JJ.GT.0.AND.J.NE.NREFI.AND.ILTLEV(J).LE.0.
|
|
* and.iabs(imodl(i)).ne.4)
|
|
* AJIJ(IJE,JJ)=AJIJ(IJE,JJ)-APFR
|
|
END IF
|
|
C
|
|
C the "overlapping" lines at the given frequency
|
|
C
|
|
20 IF(NLINES(IJ).LE.0) GO TO 100
|
|
DO 50 ILINT=1,NLINES(IJ)
|
|
ITR=ITRLIN(ILINT,IJ)
|
|
IF(LINEXP(ITR)) GO TO 50
|
|
I=ILOW(ITR)
|
|
IF(ILTION(IEL(I)).GE.1.OR.IIFIX(IATM(I)).EQ.1) GO TO 50
|
|
J=IUP(ITR)
|
|
IF(IPZERO(I,ID).NE.0.OR.IPZERO(J,ID).NE.0) GO TO 50
|
|
II=IABS(IIEXP(I))
|
|
JJ=IABS(IIEXP(J))
|
|
IF(II.LE.0.AND.JJ.LE.0) GO TO 50
|
|
NREFI=NREFS(IATM(I),ID)
|
|
IJ0=IFR0(ITR)
|
|
DO IJT=IJ0,IFR1(ITR)
|
|
IF(FREQ(IJT).LE.FR) THEN
|
|
IJ0=IJT
|
|
GO TO 40
|
|
END IF
|
|
END DO
|
|
40 IJ1=IJ0-1
|
|
X=W0E(IJ)/(FREQ(IJ1)-FREQ(IJ0))
|
|
A1=(FR-FREQ(IJ0))*X
|
|
A2=(FREQ(IJ1)-FR)*X
|
|
SGW=A1*PRFLIN(ID,IJ1)+A2*PRFLIN(ID,IJ0)
|
|
APFR=(ABTRA(ITR,ID)-EMTRA(ITR,ID)*EHKE(IJE))*SGW
|
|
IF(II.GT.0.AND.I.NE.NREFI.AND.ILTLEV(I).LE.0)
|
|
* AJIJ(IJE,II)=AJIJ(IJE,II)+APFR
|
|
IF(JJ.GT.0.AND.J.NE.NREFI.AND.ILTLEV(J).LE.0.
|
|
* and.iabs(imodl(i)).ne.4)
|
|
* AJIJ(IJE,JJ)=AJIJ(IJE,JJ)-APFR
|
|
50 CONTINUE
|
|
C
|
|
C Opacity sampling option
|
|
C
|
|
ELSE
|
|
IF(NLINES(IJ).LE.0) GO TO 100
|
|
DO 150 ILINT=1,NLINES(IJ)
|
|
ITR=ITRLIN(ILINT,IJ)
|
|
I=ILOW(ITR)
|
|
IF(ILTION(IEL(I)).GE.1.OR.IIFIX(IATM(I)).EQ.1) GO TO 150
|
|
J=IUP(ITR)
|
|
IF(IPZERO(I,ID).NE.0.OR.IPZERO(J,ID).NE.0) GO TO 150
|
|
KJ=IJ-IFR0(ITR)+KFR0(ITR)
|
|
II=IABS(IIEXP(I))
|
|
JJ=IABS(IIEXP(J))
|
|
IF(II.LE.0.AND.JJ.LE.0) GO TO 150
|
|
NREFI=NREFS(IATM(I),ID)
|
|
INDXPA=IABS(INDEXP(ITR))
|
|
IF(INDXPA.NE.3 .AND. INDXPA.NE.4) THEN
|
|
SG=PRFLIN(ID,KJ)
|
|
ELSE
|
|
KJD=JIDI(ID)
|
|
SG=EXP(XJID(ID)*SIGFE(KJD,KJ)+
|
|
* (UN-XJID(ID))*SIGFE(KJD+1,KJ))
|
|
END IF
|
|
APFR=(ABTRA(ITR,ID)-EMTRA(ITR,ID)*EHKE(IJE))*SG*W0E(IJ)
|
|
IF(II.GT.0.AND.I.NE.NREFI.AND.ILTLEV(I).LE.0)
|
|
* AJIJ(IJE,II)=AJIJ(IJE,II)+APFR
|
|
IF(JJ.GT.0.AND.J.NE.NREFI.AND.ILTLEV(J).LE.0.
|
|
* and.iabs(imodl(i)).ne.4)
|
|
* AJIJ(IJE,JJ)=AJIJ(IJE,JJ)-APFR
|
|
150 CONTINUE
|
|
END IF
|
|
100 CONTINUE
|
|
C
|
|
C elements of the B-matrix
|
|
C
|
|
DO I=1,NLVEXP
|
|
DO IJE=1,NFREQE
|
|
IF(IFPOPR.LE.3) THEN
|
|
SUM=0.
|
|
DO J=1,NLVEXP
|
|
SUM=SUM-ESEMAT(I,J)*AJIJ(IJE,J)
|
|
END DO
|
|
ELSE
|
|
SUM=AJIJ(IJE,I)
|
|
END IF
|
|
B(NSE+I,IJE)=SUM*CRSW(ID)
|
|
END DO
|
|
END DO
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE BPOPF(ID)
|
|
C =====================
|
|
C
|
|
C the part of B-matrix corresponding to the population rows and
|
|
C populations - i.e. derivatives of the ALI points intensities
|
|
C wrt. populations
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
C
|
|
NSE=NFREQE+INSE-1
|
|
NRE=NFREQE+INRE
|
|
NPC=NFREQE+INPC
|
|
C
|
|
C matrix B of complete linearization
|
|
C
|
|
DO I=1,NLVEXP
|
|
SUMT=0.
|
|
SUMN=0.
|
|
DO II=1,NLVEXP
|
|
IF(IFPOPR.LE.3) THEN
|
|
SUMT=SUMT-ESEMAT(I,II)*APT(II,ID)
|
|
SUMN=SUMN-ESEMAT(I,II)*APN(II,ID)
|
|
SUM=0.
|
|
DO J=1,NLVEXP
|
|
SUM=SUM-ESEMAT(I,J)*APP(II,J,ID)
|
|
END DO
|
|
ELSE
|
|
SUM=APP(II,I,ID)
|
|
END IF
|
|
B(NSE+I,NSE+II)=B(NSE+I,NSE+II)+SUM
|
|
END DO
|
|
IF(IFPOPR.GT.3) THEN
|
|
SUMT=APT(I,ID)
|
|
SUMN=APN(I,ID)
|
|
END IF
|
|
IF(INRE.NE.0) B(NSE+I,NRE)=B(NSE+I,NRE)+SUMT
|
|
IF(INPC.NE.0) B(NSE+I,NPC)=B(NSE+I,NPC)+SUMN
|
|
END DO
|
|
IF(CRSW(ID).NE.UN) THEN
|
|
DO I=1,NLVEXP
|
|
DO II=1,NLVEXP
|
|
B(NSE+I,NSE+II)=B(NSE+I,NSE+II)*CRSW(ID)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
C
|
|
C matrix A and C of complete linearization
|
|
C
|
|
IF(IFALI.GE.6) THEN
|
|
DO I=1,NLVEXP
|
|
ASUMT=0.
|
|
ASUMN=0.
|
|
CSUMT=0.
|
|
CSUMN=0.
|
|
DO II=1,NLVEXP
|
|
IF(IFPOPR.LE.3) THEN
|
|
ASUMT=ASUMT-ESEMAT(I,II)*AAPT(II,ID)
|
|
ASUMN=ASUMN-ESEMAT(I,II)*AAPN(II,ID)
|
|
CSUMT=CSUMT-ESEMAT(I,II)*CAPT(II,ID)
|
|
CSUMN=CSUMN-ESEMAT(I,II)*CAPN(II,ID)
|
|
ASUM=0.
|
|
CSUM=0.
|
|
DO J=1,NLVEXP
|
|
ASUM=ASUM-ESEMAT(I,J)*AAPP(II,J,ID)
|
|
CSUM=CSUM-ESEMAT(I,J)*CAPP(II,J,ID)
|
|
END DO
|
|
ELSE
|
|
ASUM=AAPP(II,I,ID)
|
|
CSUM=CAPP(II,I,ID)
|
|
END IF
|
|
A(NSE+I,NSE+II)=ASUM
|
|
C(NSE+I,NSE+II)=CSUM
|
|
END DO
|
|
IF(IFPOPR.GT.3) THEN
|
|
ASUMT=AAPT(I,ID)
|
|
ASUMN=AAPN(I,ID)
|
|
CSUMT=CAPT(I,ID)
|
|
CSUMN=CAPN(I,ID)
|
|
END IF
|
|
IF(INRE.NE.0) THEN
|
|
A(NSE+I,NRE)=A(NSE+I,NRE)+ASUMT
|
|
C(NSE+I,NRE)=C(NSE+I,NRE)+CSUMT
|
|
END IF
|
|
IF(INPC.NE.0) THEN
|
|
A(NSE+I,NPC)=A(NSE+I,NPC)+ASUMN
|
|
C(NSE+I,NPC)=C(NSE+I,NPC)+CSUMN
|
|
END IF
|
|
END DO
|
|
C
|
|
IF(CRSW(ID).NE.UN) THEN
|
|
DO I=1,NLVEXP
|
|
DO II=1,NLVEXP
|
|
A(NSE+I,NSE+II)=A(NSE+I,NSE+II)*CRSW(ID)
|
|
C(NSE+I,NSE+II)=C(NSE+I,NSE+II)*CRSW(ID)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
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
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE BPOPC(ID)
|
|
C ====================
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
COMMON/ADCHAR/QADD(MDEPTH)
|
|
DIMENSION AJ(MLEVEL)
|
|
C
|
|
NSE=NFREQE+INSE-1
|
|
NPC=NFREQE+INPC
|
|
IF(IELH.GT.0) N0HN=NFIRST(IELH)
|
|
NKH=NREFS(IATREF,ID)
|
|
NKH=IABS(IIEXP(NKH))
|
|
T=TEMP(ID)
|
|
ANE=ELEC(ID)
|
|
HKT=HK/T
|
|
TK=HKT/H
|
|
ANMNE1=WMM(ID)*DENS1(ID)
|
|
DO I=1,NLEVEL
|
|
AJ(I)=0.
|
|
END DO
|
|
C
|
|
C *************************
|
|
C remaining equation - (NFREQE+INPC)-th row
|
|
C linearized charge conservation equation
|
|
C *************************
|
|
C
|
|
C This part is very similar to procedure ELCOR (obviously);
|
|
C array AJ has the meaning of coefficients of the charge conserv.
|
|
C ie. charge conservation is written
|
|
C AJ * (vector of populations) = electron density
|
|
C then
|
|
C APTT = (vector of populations) * (derivative AJ wrt temp)
|
|
C APNN = (vector of populations) * (derivative AJ wrt n(el))
|
|
C APM = (vector of populations) * (derivative AJ wrt N)
|
|
C
|
|
IF(INPC.EQ.0) RETURN
|
|
QQ=0.
|
|
if(ifmol.eq.0.or.t.gt.tmolim) then
|
|
CALL STATE(3,ID,T,ANE)
|
|
QQ=Q*ABUND(IATREF,ID)/YTOT(ID)
|
|
if(ioptab.gt.0) QQ=Q/YTOT(ID)
|
|
else
|
|
qq=qadd(id)*anmne1
|
|
dqt=0.
|
|
dqn=0.
|
|
end if
|
|
C
|
|
APTT=0.
|
|
APNN=0.
|
|
APM=0.
|
|
VPC=QFIX(ID)+QQ/ANMNE1
|
|
DO IAT=1,NATOM
|
|
IF(IIFIX(IAT).NE.1) THEN
|
|
DO I=N0A(IAT),NKA(IAT)
|
|
IF(IPZERO(I,ID).EQ.0) THEN
|
|
IL=ILK(I)
|
|
II=IIEXP(I)
|
|
IF(IL.EQ.0) THEN
|
|
CH=IZ(IEL(I))-1
|
|
DCHT=0.
|
|
DCHN=0.
|
|
ELSE
|
|
CH=IZ(IL)+(IZ(IL)-1)*USUM(IL)*ANE
|
|
DCHT=(IZ(IL)-1)*ANE*DUSUMT(IL)*POPUL(I,ID)
|
|
DCHN=(IZ(IL)-1)*(ANE*DUSUMN(IL)+USUM(IL))*POPUL(I,ID)
|
|
END IF
|
|
IF(IMODL(I).GE.0) VPC=VPC+CH*POPUL(I,ID)
|
|
IF(II.GT.0) THEN
|
|
AJ(II)=AJ(II)+CH
|
|
APTT=APTT+DCHT
|
|
APNN=APNN+DCHN
|
|
ELSE IF(II.LT.0) THEN
|
|
AJ(-II)=AJ(-II)+CH*SBPSI(I,ID)
|
|
APTT=APTT+DCHT*SBPSI(I,ID)
|
|
APNN=APNN+DCHN*SBPSI(I,ID)
|
|
ELSE
|
|
III=IIEXP(ILTREF(I,ID))
|
|
AJ(III)=AJ(III)+CH*SBPSI(I,ID)
|
|
APTT=APTT+CH*POPUL(I,ID)*DSBPST(I,ID)
|
|
APNN=APNN+CH*POPUL(I,ID)*DSBPSN(I,ID)
|
|
END IF
|
|
END IF
|
|
END DO
|
|
END IF
|
|
END DO
|
|
C
|
|
C (NFREQE+INPC)-th row of matrix B
|
|
C
|
|
NPC=NFREQE+INPC
|
|
QQQ=ABUND(IATREF,ID)/YTOT(ID)/ANMNE1
|
|
if(ioptab.gt.0) QQQ=UN/YTOT(ID)/ANMNE1
|
|
IF(INHE.NE.0) B(NPC,NFREQE+INHE)=APM+QQ
|
|
IF(INRE.NE.0) B(NPC,NFREQE+INRE)=APTT+QQQ*DQT
|
|
B(NPC,NPC)=APNN-QQ-UN+QQQ*DQN
|
|
DO II=1,NLVEXP
|
|
B(NPC,NSE+II)=AJ(II)
|
|
END DO
|
|
C
|
|
C (NFREQE+INPC)-th element of the rhs vector VECL
|
|
C
|
|
VECL(NPC)=ANE-VPC
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE OPACFD(IJ)
|
|
C =====================
|
|
C
|
|
C Absorption and emission coefficients, and their derivatives
|
|
C
|
|
C This procedure is very similar to OPACF1, the only differences is
|
|
C the evaluation of derivatives
|
|
C
|
|
C Input:
|
|
C IJ - depth index
|
|
C Output:
|
|
C ABSO1 - array of absorption coefficient
|
|
C EMIS1 - array of emission coefficient
|
|
C SCAT1 - array of scattering coefficient
|
|
C Dxxy - array of derivatives of xx (=AB for absorption, =EM for
|
|
C emission) coefficient wrt y (=T for temperature, =N for
|
|
C electron density)
|
|
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'
|
|
PARAMETER (C14=2.99793D14, CFF1=1.3727D-25)
|
|
PARAMETER (DELT=1.D-3, DELR=1.D-3)
|
|
common/hmolab/anh2(mdepth),anhm(mdepth)
|
|
DIMENSION DABP0(MLEVEL),DEMP0(MLEVEL)
|
|
DIMENSION DABN1A(MDEPTH),DEMN1A(MDEPTH),DSCN1A(MDEPTH)
|
|
common/dsctva/dsct1(mdepth),dscn1(mdepth)
|
|
common/rhoder/drhodt(mdepth)
|
|
c
|
|
if(ioptab.lt.0) then
|
|
call opactd(ij)
|
|
return
|
|
end if
|
|
C
|
|
C initialize
|
|
c
|
|
DO ID=1,ND
|
|
ELSCAT(ID)=ELEC(ID)*SIGEC(IJ)
|
|
END DO
|
|
C
|
|
DO ID=1,ND
|
|
ABSO1(ID)=0.
|
|
EMIS1(ID)=0.
|
|
SCAT1(ID)=ELSCAT(ID)
|
|
DABT1(ID)=0.
|
|
DEMT1(ID)=0.
|
|
DABN1(ID)=SIGEC(IJ)
|
|
DEMN1(ID)=0.
|
|
ABSFF(ID)=0.
|
|
DABFT(ID)=0.
|
|
DABFN(ID)=0.
|
|
DO II=1,NLEVEL
|
|
DABP1(II,ID)=0.
|
|
DEMP1(II,ID)=0.
|
|
END DO
|
|
END DO
|
|
C
|
|
C basic frequency- and depth-dependent quantities
|
|
C
|
|
FR=FREQ(IJ)
|
|
lfre=fr.gt.frtabm
|
|
FRINV=UN/FR
|
|
FR3INV=FRINV*FRINV*FRINV
|
|
DO ID=1,ND
|
|
XKF(ID)=EXP(-HKT1(ID)*FR)
|
|
XKF1(ID)=UN-XKF(ID)
|
|
XKFB(ID)=XKF(ID)*BNUE(IJ)
|
|
END DO
|
|
C
|
|
C ******** 1a. bound-free contribution - without dielectronic rec.
|
|
C
|
|
if(ifdiel.eq.0) then
|
|
DO IBFT=1,NTRANC
|
|
ITR=ITRBF(IBFT)
|
|
II=ILOW(ITR)
|
|
iad=iadop(iatm(ii))
|
|
lcomop=iad.eq.0.or.(lfre.and.iad.gt.0)
|
|
SG=CROSS(IBFT,IJ)
|
|
IF(SG.GT.0..and.lcomop) THEN
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
IZZ=IZ(IEL(II))
|
|
IMER=IMRG(II)
|
|
DO ID=1,ND
|
|
SGD=SG
|
|
IF(MCDW(ITR).GT.0) THEN
|
|
CALL DWNFR1(FR,FR0(ITR),ID,IZZ,DW1)
|
|
DWF1(MCDW(ITR),ID)=DW1
|
|
SGD=SG*DW1
|
|
END IF
|
|
IF(IFWOP(II).LT.0) THEN
|
|
CALL SGMER1(FRINV,FR3INV,IMER,ID,SGME1)
|
|
SGMG(IMER,ID)=SGME1
|
|
SGD=SGME1
|
|
END IF
|
|
EMISBF=SGD*EMTRA(ITR,ID)
|
|
ABSO1(ID)=ABSO1(ID)+SGD*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+EMISBF
|
|
if(iifix(iatm(ii)).le.0) then
|
|
DEMT1(ID)=DEMT1(ID)+EMISBF*DEMLT(ITR,ID)
|
|
DEMN1(ID)=DEMN1(ID)+EMISBF*ELEC1(ID)
|
|
DEMP1(JJ,ID)=DEMP1(JJ,ID)+EMISBF*POPINV(JJ,ID)
|
|
if(ipzero(ii,id).eq.0) DABP1(II,ID)=DABP1(II,ID)+SGD
|
|
end if
|
|
END DO
|
|
END IF
|
|
END DO
|
|
C
|
|
C ******** 1b. bound-free contribution - with dielectronic rec.
|
|
C
|
|
else
|
|
DO IBFT=1,NTRANC
|
|
ITR=ITRBF(IBFT)
|
|
II=ILOW(ITR)
|
|
SG=CROSS(IBFT,IJ)
|
|
iad=iadop(iatm(ii))
|
|
lcomop=iad.eq.0.or.(lfre.and.iad.gt.0)
|
|
IF(SG.GT.0..and.lcomop) THEN
|
|
JJ=IUP(ITR)
|
|
IZZ=IZ(IEL(II))
|
|
IMER=IMRG(II)
|
|
DO ID=1,ND
|
|
SG=CROSSD(IBFT,IJ,ID)
|
|
if(sg.gt.0.) then
|
|
SGD=SG
|
|
IF(MCDW(ITR).GT.0) THEN
|
|
CALL DWNFR1(FR,FR0(ITR),ID,IZZ,DW1)
|
|
DWF1(MCDW(ITR),ID)=DW1
|
|
SGD=SG*DW1
|
|
END IF
|
|
IF(IFWOP(II).LT.0) THEN
|
|
CALL SGMER1(FRINV,FR3INV,IMER,ID,SGME1)
|
|
SGMG(IMER,ID)=SGME1
|
|
SGD=SGME1
|
|
END IF
|
|
EMISBF=SGD*EMTRA(ITR,ID)
|
|
ABSO1(ID)=ABSO1(ID)+SGD*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+EMISBF
|
|
if(iifix(iatm(ii)).le.0) then
|
|
DEMT1(ID)=DEMT1(ID)+EMISBF*DEMLT(ITR,ID)
|
|
DEMN1(ID)=DEMN1(ID)+EMISBF*ELEC1(ID)
|
|
DEMP1(JJ,ID)=DEMP1(JJ,ID)+EMISBF*POPINV(JJ,ID)
|
|
if(ipzero(ii,id).eq.0) DABP1(II,ID)=DABP1(II,ID)+SGD
|
|
end if
|
|
end if
|
|
END DO
|
|
END IF
|
|
END DO
|
|
end if
|
|
C
|
|
C ******** 2. free-free contribution
|
|
C
|
|
DO 40 ION=1,NION
|
|
II=NNEXT(ION)
|
|
IT=ITRA(II,II)
|
|
C
|
|
C hydrogenic (with Gaunt factor = 1 for IT=1; exact for IT=2)
|
|
C (derivative of Gaunt factor wrt T is neglected)
|
|
C
|
|
iad=iadop(iatm(nnext(ion)))
|
|
if(iad.gt.0.and..not.lfre) go to 40
|
|
IF(IT.LE.2) THEN
|
|
DO ID=1,ND
|
|
SF1=SFF3(ION,ID)*FR3INV
|
|
SF2=SFF2(ION,ID)
|
|
DSF2=DSFF(ION,ID)
|
|
IF(FR.LT.FF(ION)) THEN
|
|
SF2=UN/XKF(ID)
|
|
DSF2=(HKT1(ID)*FR+HALF)*TEMP1(ID)
|
|
END IF
|
|
IF(IT.EQ.2) THEN
|
|
X=C14*CHARG2(ION)/FR
|
|
SF2=SF2-UN+GFREE1(ID,X)
|
|
ELSE IF(IT.EQ.3) THEN
|
|
CALL GFREED(ID,FR,CHARG2(ION),GFR,DGFR)
|
|
SF2=SF2-UN+GFR
|
|
DSF2=DSF2-(DGFR-(GFR-UN)*TEMP1(ID)*HALF)/SF2
|
|
END IF
|
|
ABSOFF=SF1*SF2
|
|
ABSFF(ID)=ABSFF(ID)+ABSOFF
|
|
if(iifix(iatm(ii)).eq.0) then
|
|
DABFT(ID)=DABFT(ID)-ABSOFF*DSF2
|
|
DABFN(ID)=DABFN(ID)+ABSOFF*ELEC1(ID)
|
|
DABPP=ABSOFF*POPINV(II,ID)
|
|
DABP1(II,ID)=DABP1(II,ID)+DABPP
|
|
DEMP1(II,ID)=DEMP1(II,ID)+DABPP
|
|
end if
|
|
END DO
|
|
C
|
|
C H minus free-free opacity
|
|
C (all derivatives are neglected)
|
|
C
|
|
ELSE IF(IT.EQ.3) THEN
|
|
DO ID=1,ND
|
|
ABSOFF=SFFHMI(POPUL(NFIRST(IELH),ID),FR,TEMP(ID))*
|
|
* ELEC(ID)
|
|
ABSFF(ID)=ABSFF(ID)+ABSOFF
|
|
END DO
|
|
C
|
|
C special evaluation of the cross-section
|
|
C (all derivatives are neglected)
|
|
C
|
|
ELSE IF(IT.LT.0) THEN
|
|
DO ID=1,ND
|
|
ABSOFF=FFCROS(ION,IT,TEMP(ID),FR)*
|
|
* POPUL(NNEXT(ION),ID)*ELEC(ID)
|
|
ABSFF(ID)=ABSFF(ID)+ABSOFF
|
|
END DO
|
|
END IF
|
|
40 CONTINUE
|
|
|
|
C ******** 3. - additional opacity (OPADD)
|
|
C
|
|
IF(IOPADD.NE.0) THEN
|
|
ICALL=1
|
|
DO ID=1,ND
|
|
CALL OPADD(0,ICALL,IJ,ID)
|
|
ABSO1(ID)=ABSO1(ID)+ABAD
|
|
EMIS1(ID)=EMIS1(ID)+EMAD
|
|
SCAT1(ID)=SCAT1(ID)+SCAD
|
|
DABT1(ID)=DABT1(ID)+DAT
|
|
DEMT1(ID)=DEMT1(ID)+DET
|
|
DABN1(ID)=DABN1(ID)+DAN
|
|
DEMN1(ID)=DEMN1(ID)+DEN
|
|
END DO
|
|
END IF
|
|
C
|
|
C -----------------------
|
|
C total continuum opacity
|
|
C -----------------------
|
|
C
|
|
DO ID=1,ND
|
|
ABSO1(ID)=ABSO1(ID)+ABSFF(ID)
|
|
DABT1(ID)=DABT1(ID)+DABFT(ID)
|
|
DABN1(ID)=DABN1(ID)+DABFN(ID)
|
|
EMIS1(ID)=EMIS1(ID)+ABSFF(ID)
|
|
DEMT1(ID)=DEMT1(ID)+DABFT(ID)
|
|
DEMN1(ID)=DEMN1(ID)+DABFN(ID)
|
|
END DO
|
|
C
|
|
C ******** 4. - opacity and emissivity in lines
|
|
C
|
|
LASER=ITER.GT.ITLAS
|
|
IF(ISPODF.EQ.0) THEN
|
|
IF(IJLIN(IJ).GT.0) THEN
|
|
ITR=IJLIN(IJ)
|
|
iad=iadop(iatm(ilow(itr)))
|
|
if(iad.eq.0.or.(lfre.and.iad.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
|
|
SG=PRFLIN(ID,IJ)
|
|
SGPI=SG*ABTRA(ITR,ID)
|
|
IF(SGPI.LE.0.AND.LASER) GO TO 50
|
|
SGPJ=SG*EMTRA(ITR,ID)
|
|
ABSO1(ID)=ABSO1(ID)+SGPI
|
|
EMIS1(ID)=EMIS1(ID)+SGPJ
|
|
if(iifix(iatm(ii)).gt.0) go to 50
|
|
DEMT1(ID)=DEMT1(ID)+SGPJ*DEMLT(ITR,ID)
|
|
DABP1(II,ID)=DABP1(II,ID)+SGPI*POPINV(II,ID)
|
|
DEMP1(JJ,ID)=DEMP1(JJ,ID)+SGPJ*POPINV(JJ,ID)
|
|
50 CONTINUE
|
|
end if
|
|
ENDIF
|
|
IF(NLINES(IJ).LE.0) GO TO 200
|
|
C
|
|
C the "overlapping" lines at the given frequency
|
|
C
|
|
DO 100 ILINT=1,NLINES(IJ)
|
|
ITR=ITRLIN(ILINT,IJ)
|
|
if(linexp(itr)) goto 100
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
IJ0=IFR0(ITR)
|
|
iad=iadop(iatm(ii))
|
|
if(iad.gt.0.and..not.lfre) go to 100
|
|
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))
|
|
A2=UN-A1
|
|
DO 80 ID=1,ND
|
|
SG=A1*PRFLIN(ID,IJ1)+A2*PRFLIN(ID,IJ0)
|
|
SGPI=SG*ABTRA(ITR,ID)
|
|
IF(SGPI.LE.0.AND.LASER) GO TO 80
|
|
SGPJ=SG*EMTRA(ITR,ID)
|
|
ABSO1(ID)=ABSO1(ID)+SGPI
|
|
EMIS1(ID)=EMIS1(ID)+SGPJ
|
|
if(iifix(iatm(ii)).gt.0) go to 80
|
|
DEMT1(ID)=DEMT1(ID)+SGPJ*DEMLT(ITR,ID)
|
|
DABP1(II,ID)=DABP1(II,ID)+SGPI*POPINV(II,ID)
|
|
DEMP1(JJ,ID)=DEMP1(JJ,ID)+SGPJ*POPINV(JJ,ID)
|
|
80 CONTINUE
|
|
100 CONTINUE
|
|
200 CONTINUE
|
|
C
|
|
C Opacity sampling option
|
|
C
|
|
ELSE
|
|
IF(NLINES(IJ).LE.0) GO TO 400
|
|
DO 300 ILINT=1,NLINES(IJ)
|
|
ITR=ITRLIN(ILINT,IJ)
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
iad=iadop(iatm(ii))
|
|
if(iad.gt.0.and..not.lfre) go to 300
|
|
KJ=IJ-IFR0(ITR)+KFR0(ITR)
|
|
INDXPA=IABS(INDEXP(ITR))
|
|
IF(INDXPA.NE.3 .AND. INDXPA.NE.4) THEN
|
|
DO 310 ID=1,ND
|
|
SGPI=PRFLIN(ID,KJ)*ABTRA(ITR,ID)
|
|
IF(SGPI.LE.0.AND.LASER) GO TO 310
|
|
SGPJ=PRFLIN(ID,KJ)*EMTRA(ITR,ID)
|
|
ABSO1(ID)=ABSO1(ID)+SGPI
|
|
EMIS1(ID)=EMIS1(ID)+SGPJ
|
|
if(iifix(iatm(ii)).gt.0) go to 310
|
|
DEMT1(ID)=DEMT1(ID)+SGPJ*DEMLT(ITR,ID)
|
|
DABP1(II,ID)=DABP1(II,ID)+SGPI*POPINV(II,ID)
|
|
DEMP1(JJ,ID)=DEMP1(JJ,ID)+SGPJ*POPINV(JJ,ID)
|
|
310 CONTINUE
|
|
ELSE
|
|
DO 320 ID=1,ND
|
|
KJD=JIDI(ID)
|
|
SG=EXP(XJID(ID)*SIGFE(KJD,KJ)+(UN-XJID(ID))*
|
|
* SIGFE(KJD+1,KJ))
|
|
SGPI=SG*ABTRA(ITR,ID)
|
|
IF(SGPI.LE.0.AND.LASER) GO TO 320
|
|
SGPJ=SG*EMTRA(ITR,ID)
|
|
ABSO1(ID)=ABSO1(ID)+SGPI
|
|
EMIS1(ID)=EMIS1(ID)+SGPJ
|
|
if(iifix(iatm(ii)).gt.0) go to 320
|
|
DEMT1(ID)=DEMT1(ID)+SGPJ*DEMLT(ITR,ID)
|
|
DABP1(II,ID)=DABP1(II,ID)+SGPI*POPINV(II,ID)
|
|
DEMP1(JJ,ID)=DEMP1(JJ,ID)+SGPJ*POPINV(JJ,ID)
|
|
320 CONTINUE
|
|
END IF
|
|
300 CONTINUE
|
|
400 CONTINUE
|
|
END IF
|
|
C
|
|
c Lyman alpha and beta quasimolecular opacity
|
|
c
|
|
call quasim(ij)
|
|
C
|
|
C ------------------------------------------
|
|
C total opacity, emissivity, and derivatives
|
|
C ------------------------------------------
|
|
C
|
|
DO ID=1,ND
|
|
DEMT1(ID)=DEMT1(ID)+EMIS1(ID)*FR*HKT21(ID)
|
|
ABSO1(ID)=ABSO1(ID)-EMIS1(ID)*XKF(ID)+SCAT1(ID)
|
|
DABN1(ID)=DABN1(ID)-DEMN1(ID)*XKF(ID)
|
|
DABT1(ID)=DABT1(ID)-DEMT1(ID)*XKF(ID)
|
|
EMIS1(ID)=EMIS1(ID)*XKFB(ID)
|
|
DEMN1(ID)=DEMN1(ID)*XKFB(ID)
|
|
DEMT1(ID)=DEMT1(ID)*XKFB(ID)
|
|
DO II=1,NLEVEL
|
|
DABP1(II,ID)=DABP1(II,ID)-DEMP1(II,ID)*XKF(ID)
|
|
DEMP1(II,ID)=DEMP1(II,ID)*XKFB(ID)
|
|
END DO
|
|
absot(id)=abso1(id)
|
|
END DO
|
|
c
|
|
IF(IOPLYM.GT.0) CALL LYMLIN(IJ)
|
|
|
|
if(ifprd.gt.0) call prd(ij)
|
|
C
|
|
C ---------------------------------------------
|
|
C
|
|
C derivatives in the linearized explicit levels
|
|
C
|
|
IF(NLVEXP.LT.NLEVEL) THEN
|
|
DO ID=1,ND
|
|
DO I=1,NLVEXP
|
|
DABP0(I)=0.
|
|
DEMP0(I)=0.
|
|
END DO
|
|
DO I=1,NLEVEL
|
|
if(iifix(iatm(i)).eq.0) then
|
|
II=IIEXP(I)
|
|
IF(II.GT.0) THEN
|
|
DABP0(II)=DABP0(II)+DABP1(I,ID)
|
|
DEMP0(II)=DEMP0(II)+DEMP1(I,ID)
|
|
ELSE IF(II.LT.0) THEN
|
|
DABP0(-II)=DABP0(-II)+DABP1(I,ID)*PP(I,ID)
|
|
DEMP0(-II)=DEMP0(-II)+DEMP1(I,ID)*PP(I,ID)
|
|
ELSE
|
|
JJ=IIEXP(ILTREF(I,ID))
|
|
if(jj.gt.0) then
|
|
DABP0(JJ)=DABP0(JJ)+DABP1(I,ID)*PP(I,ID)
|
|
DEMP0(JJ)=DEMP0(JJ)+DEMP1(I,ID)*PP(I,ID)
|
|
endif
|
|
IF(IABS(IMODL(I)).LE.5) THEN
|
|
DABT1(ID)=DABT1(ID)+DABP1(I,ID)*PT(I,ID)
|
|
DEMT1(ID)=DEMT1(ID)+DEMP1(I,ID)*PT(I,ID)
|
|
DABN1(ID)=DABN1(ID)+DABP1(I,ID)*PN(I,ID)
|
|
DEMN1(ID)=DEMN1(ID)+DEMP1(I,ID)*PN(I,ID)
|
|
END IF
|
|
END IF
|
|
end if
|
|
END DO
|
|
DO II=1,NLVEXP
|
|
DABP1(II,ID)=DABP0(II)
|
|
DEMP1(II,ID)=DEMP0(II)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
c
|
|
c contribution from the background opacity table
|
|
c
|
|
if(ioptab.gt.0) then
|
|
c
|
|
imodf=0
|
|
FR=FREQ(IJ)
|
|
if(fr.lt.frtabm) then
|
|
DO ID=1,ND
|
|
T=TEMP(ID)
|
|
T1=T*(UN+DELT)
|
|
RHO=DENS(ID)
|
|
RHO1=RHO*(UN+DELR)
|
|
PLAN=XKFB(ID)/XKF1(ID)
|
|
DPLAN=PLAN/XKF1(ID)*HKT1(ID)*FR/T
|
|
CALL OPCTAB(FR,IJ,ID,T,RHO,AB,SC,SCT,imodf)
|
|
CALL OPCTAB(FR,IJ,ID,T1,RHO,AB1,SC1,SCT1,imodf)
|
|
CALL OPCTAB(FR,IJ,ID,T,RHO1,AB2,SC2,SCT2,imodf)
|
|
ABSO1(ID)=ABSO1(id)+AB
|
|
EMIS1(ID)=EMIS1(ID)+AB*PLAN
|
|
scat1(id)=scat1(id)+sct
|
|
c
|
|
c derivatives w.r.t. temperature
|
|
c
|
|
DABTAB=(AB1-AB)/T/DELT
|
|
dabtab=0.
|
|
DABT1(ID)=DABT1(ID)+DABTAB
|
|
DEMT1(ID)=DEMT1(ID)+AB*DPLAN+DABTAB*PLAN
|
|
DSCT1(ID)=DSCT1(ID)+(SCT1-SCT)/T/DELT
|
|
dabt1(id)=dabt1(id)+dsct1(id)
|
|
c
|
|
c derivatives w.r.t. density
|
|
c
|
|
DABN1A(ID)=(AB2-AB)/RHO/DELR
|
|
DEMN1A(ID)=DABN1(ID)*PLAN
|
|
c DSCN1A(ID)=(SCT2-SCT)/RHO/DELR
|
|
c dabn1A(id)=dabn1a(id)+dscn1a(id)
|
|
DABN1A(ID)=0.
|
|
DEMN1A(ID)=0.
|
|
DSCN1A(ID)=0.
|
|
c
|
|
c modify derivatives in case density is not a state parameter
|
|
c
|
|
IF(INHE.LE.0) THEN
|
|
DABT1(ID)=DABT1(ID)+DABN1A(ID)*DRHODT(ID)
|
|
DEMT1(ID)=DEMT1(ID)+DEMN1A(ID)*DRHODT(ID)
|
|
DSCT1(ID)=DSCT1(ID)+DSCN1A(ID)*DRHODT(ID)
|
|
ELSE
|
|
DABN1(ID)=DABN1(ID)+DABN1A(ID)
|
|
DEMN1(ID)=DEMN1(ID)+DEMN1A(ID)
|
|
DSCN1(ID)=DSCN1(ID)+DSCN1A(ID)
|
|
END IF
|
|
c
|
|
if(ifryb.gt.5) then
|
|
abso1(id)=abso1(id)/dens(id)
|
|
emis1(id)=emis1(id)/dens(id)
|
|
scat1(id)=scat1(id)/dens(id)
|
|
dabt1(id)=dabt1(id)/dens(id)
|
|
demt1(id)=demt1(id)/dens(id)
|
|
dsct1(id)=dsct1(id)/dens(id)
|
|
end if
|
|
c
|
|
END DO
|
|
end if
|
|
end if
|
|
c
|
|
c if needed, evaluate the opacity per gram
|
|
c
|
|
if(izscal.eq.0) then
|
|
do id=1,nd
|
|
absot(id)=abso1(id)/dens(id)
|
|
end do
|
|
id=1
|
|
|
|
c if(mod(ij,1000).le.3)
|
|
c * write(*,*) '+++++++opacfd',ij,abso1(id),absot(id)
|
|
|
|
end if
|
|
C
|
|
C store quantities for explicit (linearized) frequencies
|
|
C
|
|
IF(IJEX(IJ).LE.0) RETURN
|
|
IJE=IJEX(IJ)
|
|
DO ID=1,ND
|
|
ABSOEX(IJE,ID)=ABSO1(ID)
|
|
EMISEX(IJE,ID)=EMIS1(ID)
|
|
SCATEX(IJE,ID)=SCAT1(ID)
|
|
DABTEX(IJE,ID)=DABT1(ID)
|
|
DEMTEX(IJE,ID)=DEMT1(ID)
|
|
DABNEX(IJE,ID)=DABN1(ID)
|
|
DEMNEX(IJE,ID)=DEMN1(ID)
|
|
DABMEX(IJE,ID)=DABM1(ID)
|
|
DEMMEX(IJE,ID)=DEMM1(ID)
|
|
DO II=1,NLVEXP
|
|
DRCHEX(II,IJE,ID)=DABP1(II,ID)
|
|
DRETEX(II,IJE,ID)=DEMP1(II,ID)
|
|
END DO
|
|
END DO
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE ALIFR1(IJ)
|
|
C =====================
|
|
C
|
|
C hydrostatic and radiative equilibrium quantities -
|
|
C derivatives of the total heating and cooling rates in the
|
|
C ALI points with respect to the
|
|
C temperature, electron density, and populations
|
|
C a variant for consistent tridiagonal operator
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
PARAMETER (T23=TWO/3.D0, T43=4.D0/3.D0)
|
|
DIMENSION DSFP1(MLVEXP),DSFP1M(MLVEXP),DSFP1D(MLVEXP),
|
|
* DSFP1P(MLVEXP),DSFPMM(MLVEXP)
|
|
C
|
|
IF(IFALI.LE.1) RETURN
|
|
IF(IFALI.GT.5) THEN
|
|
CALL ALIFR3(IJ)
|
|
RETURN
|
|
END IF
|
|
|
|
WW=WC(IJ)
|
|
C
|
|
DSFT1M=0.
|
|
DSFN1M=0.
|
|
DSFM1M=0.
|
|
DSFT1D=0.
|
|
DSFN1D=0.
|
|
DSFM1D=0.
|
|
DSFX1=0.
|
|
DSFX1D=0.
|
|
DO II=1,NLVEXP
|
|
DSFP1M(II)=0.
|
|
DSFP1D(II)=0.
|
|
END DO
|
|
|
|
c Non-standard value of ILASCT & ILMCOR
|
|
|
|
IF(ILMCOR.NE.3) GO TO 199
|
|
c
|
|
c ****1. Special expressions for the first depth - id=1
|
|
c
|
|
ID=1
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
c
|
|
c Basic auxliliary quantities - derivatives of the source function
|
|
c
|
|
if(emis1(id).lt.1.e-35) emis1(id)=1.e-35
|
|
EMISIV=UN/EMIS1(ID)
|
|
ABST=UN/ABSO1(ID)
|
|
S0=EMIS1(ID)*ABST
|
|
c SC=ELEC(ID)*SIGEC(IJ)
|
|
c
|
|
c contribution from the improved boundary condition
|
|
c
|
|
dt=(abso1(id)/dens(id)+abso1(id+1)/dens(id+1))*
|
|
* (dm(id+1)-dm(id))*half
|
|
sa=s0*(un+4./dt*q0(ij))
|
|
s0=s0*(un+two/dt*q0(ij))
|
|
c sa=s0
|
|
sc=scat1(id)
|
|
SCT=SC*ABST
|
|
ST=S0+SCT*RAD1(ID)
|
|
CORR=UN/(UN-ALI1(ID)*SCT)
|
|
DSFT1=CORR*(S0*DEMT1(ID)*EMISIV-S0*DABT1(ID)*ABST)
|
|
DSFN1=CORR*(S0*DEMN1(ID)*EMISIV
|
|
c +SIGEC(IJ)*RAD1(ID)*ABST-
|
|
* -S0*DABN1(ID)*ABST)
|
|
DSFM1=CORR*(S0*DEMM1(ID)*EMISIV-S0*DABM1(ID)*ABST)
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=CORR*(S0*DEMP1(II,ID)*EMISIV-SA*DABP1(II,ID)*ABST)
|
|
END DO
|
|
if(emis1(id+1).lt.1.e-35) emis1(id+1)=1.e-35
|
|
EMISIP=UN/EMIS1(ID+1)
|
|
ABSTP=UN/ABSO1(ID+1)
|
|
S0P=EMIS1(ID+1)*ABSTP
|
|
scp=scat1(id+1)
|
|
SCTP=SCP*ABSTP
|
|
STP=S0P+SCTP*RAD1(ID+1)
|
|
CORRP=UN/(UN-ALI1(ID+1)*SCTP)
|
|
DSFT1P=CORRP*(S0P*DEMT1(ID+1)*EMISIP-S0P*DABT1(ID+1)*ABSTP)
|
|
DSFN1P=CORRP*(S0P*DEMN1(ID+1)*EMISIP
|
|
* -S0P*DABN1(ID+1)*ABSTP)
|
|
DSFM1P=CORRP*(S0P*DEMM1(ID+1)*EMISIP-S0P*DABM1(ID+1)*ABSTP)
|
|
DO II=1,NLVEXP
|
|
DSFP1P(II)=CORRP*(S0P*DEMP1(II,ID+1)*EMISIP-
|
|
* S0P*DABP1(II,ID+1)*ABSTP)
|
|
END DO
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
DSFDM(ID)=DSFM1*ALI1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Hydrostatic equilibrium quantities
|
|
c
|
|
WF=WW*FH(IJ)
|
|
IF(LNSKIP) THEN
|
|
FPRD(ID)=FPRD(ID)+WF*ABSO1(ID)*RAD1(ID)-
|
|
* WW*HEXTRD(IJ)*ABSO1(ID)
|
|
E0=WF*RAD1(ID)
|
|
D0=WF*ABSO1(ID)*ALI1(ID)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1+E0*DABN1(ID)
|
|
HEIM(ID)=HEIM(ID)+D0*DSFM1+E0*DABM1(ID)
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Differential equation part of radiative equilibrium
|
|
c
|
|
FLFIX(ID)=FLFIX(ID)+WF*RAD1(ID)-WW*HEXTRD(IJ)
|
|
FLRD(ID)=FLRD(ID)+W(IJ)*FH(IJ)*RAD1(ID)-W(IJ)*HALF*EXTRAD(IJ)
|
|
IF(REDIF(ID).GT.0.) THEN
|
|
WF=WF*ALI1(ID)
|
|
REDT(ID)=REDT(ID)+WF*DSFT1
|
|
REDN(ID)=REDN(ID)+WF*DSFN1
|
|
REDM(ID)=REDM(ID)+WF*DSFM1
|
|
REDX(ID)=REDX(ID)+WF*DSFX1
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+WF*DSFP1(II)
|
|
END DO
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
ABST=ABSO1(ID)-ELSCAT(ID)
|
|
D0=ABST*ALI1(ID)
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABST*RAD1(ID))
|
|
REIT(ID)=REIT(ID)+WW*(D0*DSFT1+RAD1(ID)*DABT1(ID)-DEMT1(ID))
|
|
REIN(ID)=REIN(ID)+WW*(D0*DSFN1+
|
|
& RAD1(ID)*(DABN1(ID)-SIGEC(IJ))-DEMN1(ID))
|
|
REIM(ID)=REIM(ID)+WW*(D0*DSFM1+RAD1(ID)*DABM1(ID)-DEMM1(ID))
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+WW*(D0*DSFP1(II)+
|
|
& RAD1(ID)*DABP1(II,ID)-DEMP1(II,ID))
|
|
END DO
|
|
END IF
|
|
|
|
C
|
|
c ****2. loop over depths
|
|
c
|
|
DO ID=2,ND-1
|
|
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
|
|
DSFTMM=DSFT1M
|
|
DSFNMM=DSFN1M
|
|
DSFMMM=DSFM1M
|
|
DO II=1,NLVEXP
|
|
DSFPMM(II)=DSFP1M(II)
|
|
END DO
|
|
DSFT1M=DSFT1
|
|
DSFN1M=DSFN1
|
|
DSFM1M=DSFM1
|
|
DO II=1,NLVEXP
|
|
DSFP1M(II)=DSFP1(II)
|
|
END DO
|
|
S0=S0P
|
|
DSFT1=DSFT1P
|
|
DSFN1=DSFN1P
|
|
DSFM1=DSFM1P
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1P(II)
|
|
END DO
|
|
c
|
|
if(emis1(id+1).lt.1.e-35) emis1(id+1)=1.e-35
|
|
EMISIP=UN/EMIS1(ID+1)
|
|
ABSTP=UN/ABSO1(ID+1)
|
|
S0P=EMIS1(ID+1)*ABSTP
|
|
scp=scat1(id+1)
|
|
SCTP=SCP*ABSTP
|
|
STP=S0P+SCTP*RAD1(ID+1)
|
|
CORRP=UN/(UN-ALI1(ID+1)*SCTP)
|
|
DSFT1P=CORRP*(S0P*DEMT1(ID+1)*EMISIP-S0P*DABT1(ID+1)*ABSTP)
|
|
DSFN1P=CORRP*(S0P*DEMN1(ID+1)*EMISIP
|
|
* -S0P*DABN1(ID+1)*ABSTP)
|
|
DSFM1P=CORRP*(S0P*DEMM1(ID+1)*EMISIP-STP*DABM1(ID+1)*ABSTP)
|
|
DO II=1,NLVEXP
|
|
DSFP1P(II)=CORRP*(S0P*DEMP1(II,ID+1)*EMISIP-
|
|
* S0P*DABP1(II,ID+1)*ABSTP)
|
|
END DO
|
|
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
DSFDM(ID)=DSFM1*ALI1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Hydrostatic equilibrium equation
|
|
c
|
|
IF(LNSKIP) THEN
|
|
D0=WW*FAK1(ID)
|
|
A0=WW*FAK1(ID-1)
|
|
FPRD(ID)=FPRD(ID)+D0*RAD1(ID)-A0*RAD1(ID-1)
|
|
E0=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1
|
|
HEIM(ID)=HEIM(ID)+D0*DSFM1
|
|
HEITM(ID)=HEITM(ID)+E0*DSFT1M
|
|
HEINM(ID)=HEINM(ID)+E0*DSFN1M
|
|
HEIMM(ID)=HEIMM(ID)+E0*DSFM1M
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)
|
|
HEIPM(II,ID)=HEIPM(II,ID)+E0*DSFP1M(II)
|
|
END DO
|
|
END IF
|
|
C
|
|
C Differential equation part of radiative equilibrium
|
|
C
|
|
DDT=UN/(ABSOT(ID)+ABSOT(ID-1))
|
|
DT=DDT/DELDMZ(ID-1)
|
|
FL=(RAD1(ID)*FAK1(ID)-RAD1(ID-1)*FAK1(ID-1))*DT
|
|
FLFIX(ID)=FLFIX(ID)+WW*FL
|
|
FLRD(ID)=FLRD(ID)+W(IJ)*FL
|
|
IF(REDIF(ID).GT.0) THEN
|
|
if(ifalih.eq.0) then
|
|
D0=WW*FAK1(ID)*DT
|
|
A0=WW*FAK1(ID-1)*DT
|
|
D0M=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0P=D0*ALIP1(ID)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
E0=WW*FL*DDT
|
|
REDX(ID)=REDX(ID)+E0*ABSO1(ID)
|
|
REDXM(ID)=REDXM(ID)+E0*ABSO1(ID-1)
|
|
E0M=E0*DENSI(ID-1)
|
|
E0=E0*DENSI(ID)
|
|
REDT(ID)=REDT(ID)+D0*DSFT1-E0*DABT1(ID)
|
|
REDTM(ID)=REDTM(ID)+D0M*DSFT1M-E0M*DABT1(ID-1)
|
|
REDN(ID)=REDN(ID)+D0*DSFN1-E0*DABN1(ID)
|
|
REDNM(ID)=REDNM(ID)+D0M*DSFN1M-E0M*DABN1(ID-1)
|
|
REDM(ID)=REDM(ID)+D0*DSFM1-E0*DABM1(ID)
|
|
REDMM(ID)=REDMM(ID)+D0M*DSFM1M-E0M*DABM1(ID-1)
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+D0*DSFP1(II)-E0*DABP1(II,ID)
|
|
REDPM(II,ID)=REDPM(II,ID)+D0M*DSFP1M(II)-
|
|
* E0M*DABP1(II,ID-1)
|
|
END DO
|
|
else
|
|
d0=ww*alih1(id)
|
|
REDT(ID)=REDT(ID)+D0*DSFT1
|
|
REDN(ID)=REDN(ID)+D0*DSFN1
|
|
REDM(ID)=REDM(ID)+D0*DSFM1
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+D0*DSFP1(II)
|
|
END DO
|
|
end if
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
ABST=ABSO1(ID)-ELSCAT(ID)
|
|
D0=ABST*ALI1(ID)
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABST*RAD1(ID))
|
|
REIN(ID)=REIN(ID)+WW*(D0*DSFN1+
|
|
* RAD1(ID)*(DABN1(ID)-SIGEC(IJ))-DEMN1(ID))
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+WW*(D0*DSFP1(II)+
|
|
* RAD1(ID)*DABP1(II,ID)-DEMP1(II,ID))
|
|
END DO
|
|
REIT(ID)=REIT(ID)+WW*(D0*DSFT1+
|
|
* RAD1(ID)*DABT1(ID)-DEMT1(ID))
|
|
REIM(ID)=REIM(ID)+WW*(D0*DSFM1+
|
|
* RAD1(ID)*DABM1(ID)-DEMM1(ID))
|
|
END IF
|
|
|
|
END DO
|
|
|
|
C
|
|
c ****3. deepest point - ID=ND
|
|
c
|
|
ID=ND
|
|
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
|
|
DSFTMM=DSFT1M
|
|
DSFNMM=DSFN1M
|
|
DSFMMM=DSFM1M
|
|
DO II=1,NLVEXP
|
|
DSFPMM(II)=DSFP1M(II)
|
|
END DO
|
|
DSFT1M=DSFT1
|
|
DSFN1M=DSFN1
|
|
DSFM1M=DSFM1
|
|
DO II=1,NLVEXP
|
|
DSFP1M(II)=DSFP1(II)
|
|
END DO
|
|
S0=S0P
|
|
DSFT1=DSFT1P
|
|
DSFN1=DSFN1P
|
|
DSFM1=DSFM1P
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1P(II)
|
|
END DO
|
|
DSFT1D=0.
|
|
DSFN1D=0.
|
|
DSFM1D=0.
|
|
DO II=1,NLVEXP
|
|
DSFP1D(II)=0.
|
|
END DO
|
|
C
|
|
C Improved lower boundary condition
|
|
C
|
|
IF(IBC.GT.0.AND.IDISK.EQ.0) THEN
|
|
DT=UN/(DELDMZ(ID-1)*(ABSOT(ID)+ABSOT(ID-1)))
|
|
PLAD=XKFB(ID)/XKF1(ID)
|
|
DBDT=PLAD/XKF1(ID)*HKT21(ID)*FREQ(IJ)*DT
|
|
IF(IBC.EQ.1) THEN
|
|
DSFT1=DSFT1+DBDT
|
|
ELSE IF(IBC.GE.2) THEN
|
|
PLAM=XKFB(ID-1)/XKF1(ID-1)
|
|
TAU23=T23*DT
|
|
TAU43=T43*DT
|
|
D0=(PLAD*(UN+TAU43)-T43*PLAM*DT)*DT*DT
|
|
RHD=DELDMZ(ID-1)*DENSI(ID)
|
|
E0=D0*RHD
|
|
DSFT1=DSFT1+DBDT*(UN+TAU23)-E0*DABT1(ID)
|
|
DSFN1=DSFN1-E0*(DABN1(ID)+ABSO1(ID)*DENSIM(ID))
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1(II)-E0*DABP1(II,ID)
|
|
END DO
|
|
IF(IBC.GE.3) THEN
|
|
DBDTM=PLAM/XKF1(ID-1)*HKT21(ID-1)*FREQ(IJ)*DT
|
|
RHD=DELDMZ(ID-1)*DENSI(ID-1)
|
|
E0=D0*RHD
|
|
DSFT1D=-DBDTM*DT*T23-E0*DABT1(ID-1)
|
|
DSFN1D=-E0*(DABN1(ID-1)+ABSO1(ID-1)*DENSIM(ID-1))
|
|
DO II=1,NLVEXP
|
|
DSFP1D(II)=-E0*DABP1(II,ID-1)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
END IF
|
|
C
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
DSFDM(ID)=DSFM1*ALI1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Hydrostatic equilibrium equation
|
|
c
|
|
IF(LNSKIP) THEN
|
|
D0=WW*FAK1(ID)
|
|
A0=WW*FAK1(ID-1)
|
|
FPRD(ID)=FPRD(ID)+D0*RAD1(ID)-A0*RAD1(ID-1)
|
|
E0=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1
|
|
HEIM(ID)=HEIM(ID)+D0*DSFM1
|
|
HEITM(ID)=HEITM(ID)+E0*DSFT1M
|
|
HEINM(ID)=HEINM(ID)+E0*DSFN1M
|
|
HEIMM(ID)=HEIMM(ID)+E0*DSFM1M
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)
|
|
HEIPM(II,ID)=HEIPM(II,ID)+E0*DSFP1M(II)
|
|
END DO
|
|
IF(IBC.GE.3) THEN
|
|
HEITM(ID)=HEITM(ID)-D0*DSFT1D
|
|
HEINM(ID)=HEINM(ID)-D0*DSFN1D
|
|
HEIMM(ID)=HEIMM(ID)-D0*DSFM1D
|
|
DO II=1,NLVEXP
|
|
HEIPM(II,ID)=HEIPM(II,ID)-D0*DSFP1D(II)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
C
|
|
C Differential equation part of radiative equilibrium
|
|
C
|
|
DDT=UN/(ABSOT(ID)+ABSOT(ID-1))
|
|
DT=DDT/DELDMZ(ID-1)
|
|
FL=(RAD1(ID)*FAK1(ID)-RAD1(ID-1)*FAK1(ID-1))*DT
|
|
FLFIX(ID)=FLFIX(ID)+WW*FL
|
|
FLRD(ID)=FLRD(ID)+W(IJ)*FL
|
|
IF(REDIF(ID).GT.0) THEN
|
|
D0=WW*FAK1(ID)*DT
|
|
A0=WW*FAK1(ID-1)*DT
|
|
D0M=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0P=D0*ALIP1(ID)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
E0=WW*FL*DDT
|
|
REDX(ID)=REDX(ID)+E0*ABSO1(ID)
|
|
REDXM(ID)=REDXM(ID)+E0*ABSO1(ID-1)
|
|
E0M=E0*DENSI(ID-1)
|
|
E0=E0*DENSI(ID)
|
|
REDT(ID)=REDT(ID)+D0*DSFT1-E0*DABT1(ID)
|
|
REDTM(ID)=REDTM(ID)+D0M*DSFT1M-E0M*DABT1(ID-1)
|
|
REDN(ID)=REDN(ID)+D0*DSFN1-E0*DABN1(ID)
|
|
REDNM(ID)=REDNM(ID)+D0M*DSFN1M-E0M*DABN1(ID-1)
|
|
REDM(ID)=REDM(ID)+D0*DSFM1-E0*DABM1(ID)
|
|
REDMM(ID)=REDMM(ID)+D0M*DSFM1M-E0M*DABM1(ID-1)
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+D0*DSFP1(II)-E0*DABP1(II,ID)
|
|
REDPM(II,ID)=REDPM(II,ID)+D0M*DSFP1M(II)-
|
|
* E0M*DABP1(II,ID-1)
|
|
END DO
|
|
IF(IBC.GE.3) THEN
|
|
REDTM(ID)=REDTM(ID)+D0*DSFT1D
|
|
REDNM(ID)=REDNM(ID)+D0*DSFN1D
|
|
REDMM(ID)=REDMM(ID)+D0*DSFM1D
|
|
DO II=1,NLVEXP
|
|
REDPM(II,ID)=REDPM(II,ID)+D0*DSFP1D(II)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
ABST=ABSO1(ID)-ELSCAT(ID)
|
|
D0=ABST*ALI1(ID)
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABST*RAD1(ID))
|
|
REIN(ID)=REIN(ID)+WW*(D0*DSFN1+
|
|
* RAD1(ID)*(DABN1(ID)-SIGEC(IJ))-DEMN1(ID))
|
|
REIM(ID)=REIM(ID)+WW*(D0*DSFM1+RAD1(ID)*DABM1(ID)-DEMM1(ID))
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+WW*(D0*DSFP1(II)+
|
|
* RAD1(ID)*DABP1(II,ID)-DEMP1(II,ID))
|
|
END DO
|
|
IF(IBC.EQ.0) THEN
|
|
REIT(ID)=REIT(ID)+WW*(D0*DSFT1+
|
|
* RAD1(ID)*DABT1(ID)-DEMT1(ID))
|
|
ELSE
|
|
REIT(ID)=REIT(ID)+WW*(D0*(DSFT1-DBDT)+E0*DABT1(ID)+
|
|
* RAD1(ID)*DABT1(ID)-DEMT1(ID)+
|
|
* ALI1(ID)/ABST*DBDT)
|
|
END IF
|
|
END IF
|
|
|
|
RETURN
|
|
|
|
c Non-standard value of ILASCT & ILMCOR
|
|
|
|
199 IF(ILASCT.NE.0) GO TO 299
|
|
c
|
|
c ****1. Special expressions for the first depth - id=1
|
|
c
|
|
ID=1
|
|
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
c
|
|
c Basic auxliliary quantities - derivatives of the source function
|
|
c
|
|
EMISIV=UN/EMIS1(ID)
|
|
ABST=UN/(ABSO1(ID)-ELSCAT(ID))
|
|
S0=EMIS1(ID)*ABST
|
|
DSFN1=S0*(DEMN1(ID)*EMISIV-(DABN1(ID)-SIGEC(IJ))*ABST)
|
|
DSFT1=S0*(DEMT1(ID)*EMISIV-DABT1(ID)*ABST)
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=S0*(DEMP1(II,ID)*EMISIV-DABP1(II,ID)*ABST)
|
|
END DO
|
|
EMISIP=UN/EMIS1(ID+1)
|
|
ABSTP=UN/(ABSO1(ID+1)-ELSCAT(ID+1))
|
|
S0P=EMIS1(ID+1)*ABSTP
|
|
DSFN1P=S0P*(DEMN1(ID+1)*EMISIP-(DABN1(ID+1)-SIGEC(IJ))*ABSTP)
|
|
DSFT1P=S0P*(DEMT1(ID+1)*EMISIP-DABT1(ID+1)*ABSTP)
|
|
DO II=1,NLVEXP
|
|
DSFP1P(II)=S0P*(DEMP1(II,ID+1)*EMISIP-DABP1(II,ID+1)*ABSTP)
|
|
END DO
|
|
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Hydrostatic equilibrium quantities
|
|
c
|
|
WF=WW*FH(IJ)
|
|
IF(LNSKIP) THEN
|
|
FPRD(ID)=FPRD(ID)+WF*ABSO1(ID)*RAD1(ID)-
|
|
* WW*HEXTRD(IJ)*ABSO1(ID)
|
|
E0=WF*RAD1(ID)
|
|
D0=WF*ABSO1(ID)*ALI1(ID)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1+E0*DABN1(ID)
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Differential equation part of radiative equilibrium
|
|
c
|
|
FLFIX(ID)=FLFIX(ID)+WF*RAD1(ID)-WW*HEXTRD(IJ)
|
|
FLRD(ID)=FLRD(ID)+W(IJ)*FH(IJ)*RAD1(ID)-W(IJ)*HALF*EXTRAD(IJ)
|
|
IF(REDIF(ID).GT.0.) THEN
|
|
WF=WF*ALI1(ID)
|
|
REDT(ID)=REDT(ID)+WF*DSFT1
|
|
REDN(ID)=REDN(ID)+WF*DSFN1
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+WF*DSFP1(II)
|
|
END DO
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
ABST=ABSO1(ID)-ELSCAT(ID)
|
|
WWK=WW*ABST
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABST*RAD1(ID))
|
|
D0=WW*(ALI1(ID)-UN)*ABST
|
|
E0=WW*(RAD1(ID)-S0)
|
|
REIN(ID)=REIN(ID)+D0*DSFN1+E0*(DABN1(ID)-SIGEC(IJ))
|
|
REIT(ID)=REIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
END IF
|
|
|
|
C
|
|
c ****2. loop over depths
|
|
c
|
|
DO ID=2,ND-1
|
|
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
|
|
DSFTMM=DSFT1M
|
|
DSFNMM=DSFN1M
|
|
DO II=1,NLVEXP
|
|
DSFPMM(II)=DSFP1M(II)
|
|
END DO
|
|
DSFT1M=DSFT1
|
|
DSFN1M=DSFN1
|
|
DO II=1,NLVEXP
|
|
DSFP1M(II)=DSFP1(II)
|
|
END DO
|
|
S0=S0P
|
|
DSFT1=DSFT1P
|
|
DSFN1=DSFN1P
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1P(II)
|
|
END DO
|
|
|
|
EMISIP=UN/EMIS1(ID+1)
|
|
ABSTP=UN/(ABSO1(ID+1)-ELSCAT(ID+1))
|
|
S0P=EMIS1(ID+1)*ABSTP
|
|
DSFN1P=S0P*(DEMN1(ID+1)*EMISIP-(DABN1(ID+1)-SIGEC(IJ))*ABSTP)
|
|
DSFT1P=S0P*(DEMT1(ID+1)*EMISIP-DABT1(ID+1)*ABSTP)
|
|
DO II=1,NLVEXP
|
|
DSFP1P(II)=S0P*(DEMP1(II,ID+1)*EMISIP-DABP1(II,ID+1)*ABSTP)
|
|
END DO
|
|
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Hydrostatic equilibrium equation
|
|
c
|
|
IF(LNSKIP) THEN
|
|
D0=WW*FAK1(ID)
|
|
A0=WW*FAK1(ID-1)
|
|
FPRD(ID)=FPRD(ID)+D0*RAD1(ID)-A0*RAD1(ID-1)
|
|
E0=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1
|
|
HEITM(ID)=HEITM(ID)+E0*DSFT1M
|
|
HEINM(ID)=HEINM(ID)+E0*DSFN1M
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)
|
|
HEIPM(II,ID)=HEIPM(II,ID)+E0*DSFP1M(II)
|
|
END DO
|
|
END IF
|
|
C
|
|
C Differential equation part of radiative equilibrium
|
|
C
|
|
DDT=UN/(ABSOT(ID)+ABSOT(ID-1))
|
|
DT=DDT/DELDMZ(ID-1)
|
|
FL=(RAD1(ID)*FAK1(ID)-RAD1(ID-1)*FAK1(ID-1))*DT
|
|
FLFIX(ID)=FLFIX(ID)+WW*FL
|
|
IF(REDIF(ID).GT.0) THEN
|
|
D0=WW*FAK1(ID)*DT
|
|
A0=WW*FAK1(ID-1)*DT
|
|
D0M=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0P=D0*ALIP1(ID)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
E0=WW*FL*DDT
|
|
REDX(ID)=REDX(ID)+E0*ABSO1(ID)
|
|
REDXM(ID)=REDXM(ID)+E0*ABSO1(ID-1)
|
|
E0M=E0*DENSI(ID-1)
|
|
E0=E0*DENSI(ID)
|
|
REDT(ID)=REDT(ID)+D0*DSFT1-E0*DABT1(ID)
|
|
REDTM(ID)=REDTM(ID)+D0M*DSFT1M-E0M*DABT1(ID-1)
|
|
REDN(ID)=REDN(ID)+D0*DSFN1-E0*DABN1(ID)
|
|
REDNM(ID)=REDNM(ID)+D0M*DSFN1M-E0M*DABN1(ID-1)
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+D0*DSFP1(II)-E0*DABP1(II,ID)
|
|
REDPM(II,ID)=REDPM(II,ID)+D0M*DSFP1M(II)-
|
|
* E0M*DABP1(II,ID-1)
|
|
END DO
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
ABST=ABSO1(ID)-ELSCAT(ID)
|
|
WWK=WW*ABST
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABST*RAD1(ID))
|
|
D0=WW*(ALI1(ID)-UN)*ABST
|
|
E0=WW*(RAD1(ID)-S0)
|
|
REIN(ID)=REIN(ID)+D0*DSFN1+E0*(DABN1(ID)-SIGEC(IJ))
|
|
REIT(ID)=REIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
END IF
|
|
|
|
END DO
|
|
|
|
C
|
|
c ****3. deepest point - ID=ND
|
|
c
|
|
ID=ND
|
|
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
|
|
DSFTMM=DSFT1M
|
|
DSFNMM=DSFN1M
|
|
DO II=1,NLVEXP
|
|
DSFPMM(II)=DSFP1M(II)
|
|
END DO
|
|
DSFT1M=DSFT1
|
|
DSFN1M=DSFN1
|
|
DO II=1,NLVEXP
|
|
DSFP1M(II)=DSFP1(II)
|
|
END DO
|
|
S0=S0P
|
|
DSFT1=DSFT1P
|
|
DSFN1=DSFN1P
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1P(II)
|
|
END DO
|
|
C
|
|
C Improved lower boundary condition
|
|
C
|
|
IF(IBC.GT.0.AND.IDISK.EQ.0) THEN
|
|
DT=UN/(DELDMZ(ID-1)*(ABSOT(ID)+ABSOT(ID-1)))
|
|
PLAD=XKFB(ID)/XKF1(ID)
|
|
DBDT=PLAD/XKF1(ID)*HKT21(ID)*FREQ(IJ)*DT
|
|
IF(IBC.EQ.1) THEN
|
|
DSFT1=DSFT1+DBDT
|
|
ELSE IF(IBC.GE.2) THEN
|
|
PLAM=XKFB(ID-1)/XKF1(ID-1)
|
|
TAU23=T23*DT
|
|
TAU43=T43*DT
|
|
D0=(PLAD*(UN+TAU43)-T43*PLAM*DT)*DT*DT
|
|
RHD=DELDMZ(ID-1)*DENSI(ID)
|
|
E0=D0*RHD
|
|
DSFT1=DSFT1+DBDT*(UN+TAU23)-E0*DABT1(ID)
|
|
DSFN1=DSFN1-E0*(DABN1(ID)+ABSO1(ID)*DENSIM(ID))
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1(II)-E0*DABP1(II,ID)
|
|
END DO
|
|
IF(IBC.GE.3) THEN
|
|
DBDTM=PLAM/XKF1(ID-1)*HKT21(ID-1)*FREQ(IJ)*DT
|
|
RHD=DELDMZ(ID-1)*DENSI(ID-1)
|
|
E0=D0*RHD
|
|
DSFT1D=-DBDTM*DT*T23-E0*DABT1(ID-1)
|
|
DSFN1D=-E0*(DABN1(ID-1)+ABSO1(ID-1)*DENSIM(ID-1))
|
|
DO II=1,NLVEXP
|
|
DSFP1D(II)=-E0*DABP1(II,ID-1)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
END IF
|
|
C
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Hydrostatic equilibrium equation
|
|
c
|
|
IF(LNSKIP) THEN
|
|
D0=WW*FAK1(ID)
|
|
A0=WW*FAK1(ID-1)
|
|
FPRD(ID)=FPRD(ID)+D0*RAD1(ID)-A0*RAD1(ID-1)
|
|
E0=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1
|
|
HEITM(ID)=HEITM(ID)+E0*DSFT1M
|
|
HEINM(ID)=HEINM(ID)+E0*DSFN1M
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)
|
|
HEIPM(II,ID)=HEIPM(II,ID)+E0*DSFP1M(II)
|
|
END DO
|
|
IF(IBC.GE.3) THEN
|
|
HEITM(ID)=HEITM(ID)-D0*DSFT1D
|
|
HEINM(ID)=HEINM(ID)-D0*DSFN1D
|
|
DO II=1,NLVEXP
|
|
HEIPM(II,ID)=HEIPM(II,ID)-D0*DSFP1D(II)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
C
|
|
C Differential equation part of radiative equilibrium
|
|
C
|
|
DDT=UN/(ABSOT(ID)+ABSOT(ID-1))
|
|
DT=DDT/DELDMZ(ID-1)
|
|
FL=(RAD1(ID)*FAK1(ID)-RAD1(ID-1)*FAK1(ID-1))*DT
|
|
FLFIX(ID)=FLFIX(ID)+WW*FL
|
|
IF(REDIF(ID).GT.0) THEN
|
|
D0=WW*FAK1(ID)*DT
|
|
A0=WW*FAK1(ID-1)*DT
|
|
D0M=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0P=D0*ALIP1(ID)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
E0=WW*FL*DDT
|
|
REDX(ID)=REDX(ID)+E0*ABSO1(ID)
|
|
REDXM(ID)=REDXM(ID)+E0*ABSO1(ID-1)
|
|
E0M=E0*DENSI(ID-1)
|
|
E0=E0*DENSI(ID)
|
|
REDT(ID)=REDT(ID)+D0*DSFT1-E0*DABT1(ID)
|
|
REDTM(ID)=REDTM(ID)+D0M*DSFT1M-E0M*DABT1(ID-1)
|
|
REDN(ID)=REDN(ID)+D0*DSFN1-E0*DABN1(ID)
|
|
REDNM(ID)=REDNM(ID)+D0M*DSFN1M-E0M*DABN1(ID-1)
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+D0*DSFP1(II)-E0*DABP1(II,ID)
|
|
REDPM(II,ID)=REDPM(II,ID)+D0M*DSFP1M(II)-
|
|
* E0M*DABP1(II,ID-1)
|
|
END DO
|
|
IF(IBC.GE.3) THEN
|
|
REDTM(ID)=REDTM(ID)+D0*DSFT1D
|
|
REDNM(ID)=REDNM(ID)+D0*DSFN1D
|
|
DO II=1,NLVEXP
|
|
REDPM(II,ID)=REDPM(II,ID)+D0*DSFP1D(II)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
ABST=ABSO1(ID)-ELSCAT(ID)
|
|
WWK=WW*ABST
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABST*RAD1(ID))
|
|
D0=WW*(ALI1(ID)-UN)*ABST
|
|
E0=WW*(RAD1(ID)-S0)
|
|
REIN(ID)=REIN(ID)+D0*DSFN1+E0*(DABN1(ID)-SIGEC(IJ))
|
|
IF(IBC.EQ.0) THEN
|
|
REIT(ID)=REIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
ELSE
|
|
REIT(ID)=REIT(ID)+D0*(DSFT1-DBDT)+E0*DABT1(ID)+
|
|
* ALI1(ID)/ABST*DBDT
|
|
END IF
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
END IF
|
|
|
|
RETURN
|
|
|
|
C Non-standard value of ILASCT (ILASCT != 0)
|
|
c
|
|
c ****1. Special expressions for the first depth - id=1
|
|
c
|
|
299 ID=1
|
|
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
c
|
|
c Basic auxliliary quantities - derivatives of the source function
|
|
c
|
|
EMISIV=UN/EMIS1(ID)
|
|
ABST=UN/ABSO1(ID)
|
|
S0=EMIS1(ID)*ABST
|
|
DSFN1=S0*(DEMN1(ID)*EMISIV-DABN1(ID)*ABST)
|
|
DSFT1=S0*(DEMT1(ID)*EMISIV-DABT1(ID)*ABST)
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=S0*(DEMP1(II,ID)*EMISIV-DABP1(II,ID)*ABST)
|
|
END DO
|
|
EMISIP=UN/EMIS1(ID+1)
|
|
ABSTP=UN/ABSO1(ID+1)
|
|
S0P=EMIS1(ID+1)*ABSTP
|
|
DSFN1P=S0P*(DEMN1(ID+1)*EMISIP-DABN1(ID+1)*ABSTP)
|
|
DSFT1P=S0P*(DEMT1(ID+1)*EMISIP-DABT1(ID+1)*ABSTP)
|
|
DO II=1,NLVEXP
|
|
DSFP1P(II)=S0P*(DEMP1(II,ID+1)*EMISIP-DABP1(II,ID+1)*ABSTP)
|
|
END DO
|
|
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
END DO
|
|
END IF
|
|
|
|
c
|
|
c Hydrostatic equilibrium quantities
|
|
c
|
|
WF=WW*FH(IJ)
|
|
IF(LNSKIP) THEN
|
|
FPRD(ID)=FPRD(ID)+WF*ABSO1(ID)*RAD1(ID)-
|
|
* WW*HEXTRD(IJ)*ABSO1(ID)
|
|
E0=WF*RAD1(ID)
|
|
D0=WF*ABSO1(ID)*ALI1(ID)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1+E0*DABN1(ID)
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Differential equation part of radiative equilibrium
|
|
c
|
|
FLFIX(ID)=FLFIX(ID)+WF*RAD1(ID)-WW*HEXTRD(IJ)
|
|
FLRD(ID)=FLRD(ID)+W(IJ)*FH(IJ)*RAD1(ID)-W(IJ)*HALF*EXTRAD(IJ)
|
|
IF(REDIF(ID).GT.0.) THEN
|
|
WF=WF*ALI1(ID)
|
|
REDT(ID)=REDT(ID)+WF*DSFT1
|
|
REDN(ID)=REDN(ID)+WF*DSFN1
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+WF*DSFP1(II)
|
|
END DO
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
SRH=SIGE*DENS1(ID)
|
|
ABST=ABSO1(ID)
|
|
ABSTE=ABST-ELSCAT(ID)
|
|
WWK=WW*ABST
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABSTE*RAD1(ID))
|
|
D0=WW*(ABSTE*ALI1(ID)-ABST)
|
|
E0=WW*(RAD1(ID)-S0)
|
|
REIN(ID)=REIN(ID)+D0*DSFN1+E0*DABN1(ID)-WW*SIGEC(IJ)*RAD1(ID)
|
|
REIT(ID)=REIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
END IF
|
|
|
|
C
|
|
c ****2. loop over depths
|
|
c
|
|
DO ID=2,ND-1
|
|
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
|
|
DSFTMM=DSFT1M
|
|
DSFNMM=DSFN1M
|
|
DO II=1,NLVEXP
|
|
DSFPMM(II)=DSFP1M(II)
|
|
END DO
|
|
DSFT1M=DSFT1
|
|
DSFN1M=DSFN1
|
|
DO II=1,NLVEXP
|
|
DSFP1M(II)=DSFP1(II)
|
|
END DO
|
|
S0=S0P
|
|
DSFT1=DSFT1P
|
|
DSFN1=DSFN1P
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1P(II)
|
|
END DO
|
|
|
|
EMISIP=UN/EMIS1(ID+1)
|
|
ABSTP=UN/ABSO1(ID+1)
|
|
S0P=EMIS1(ID+1)*ABSTP
|
|
DSFN1P=S0P*(DEMN1(ID+1)*EMISIP-DABN1(ID+1)*ABSTP)
|
|
DSFT1P=S0P*(DEMT1(ID+1)*EMISIP-DABT1(ID+1)*ABSTP)
|
|
DO II=1,NLVEXP
|
|
DSFP1P(II)=S0P*(DEMP1(II,ID+1)*EMISIP-DABP1(II,ID+1)*ABSTP)
|
|
END DO
|
|
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Hydrostatic equilibrium equation
|
|
c
|
|
IF(LNSKIP) THEN
|
|
D0=WW*FAK1(ID)
|
|
A0=WW*FAK1(ID-1)
|
|
FPRD(ID)=FPRD(ID)+D0*RAD1(ID)-A0*RAD1(ID-1)
|
|
E0=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1
|
|
HEITM(ID)=HEITM(ID)+E0*DSFT1M
|
|
HEINM(ID)=HEINM(ID)+E0*DSFN1M
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)
|
|
HEIPM(II,ID)=HEIPM(II,ID)+E0*DSFP1M(II)
|
|
END DO
|
|
END IF
|
|
C
|
|
C Differential equation part of radiative equilibrium
|
|
C
|
|
DDT=UN/(ABSOT(ID)+ABSOT(ID-1))
|
|
DT=DDT/DELDMZ(ID-1)
|
|
FL=(RAD1(ID)*FAK1(ID)-RAD1(ID-1)*FAK1(ID-1))*DT
|
|
FLFIX(ID)=FLFIX(ID)+WW*FL
|
|
IF(REDIF(ID).GT.0) THEN
|
|
D0=WW*FAK1(ID)*DT
|
|
A0=WW*FAK1(ID-1)*DT
|
|
D0M=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0P=D0*ALIP1(ID)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
E0=WW*FL*DDT
|
|
REDX(ID)=REDX(ID)+E0*ABSO1(ID)
|
|
REDXM(ID)=REDXM(ID)+E0*ABSO1(ID-1)
|
|
E0M=E0*DENSI(ID-1)
|
|
E0=E0*DENSI(ID)
|
|
REDT(ID)=REDT(ID)+D0*DSFT1-E0*DABT1(ID)
|
|
REDTM(ID)=REDTM(ID)+D0M*DSFT1M-E0M*DABT1(ID-1)
|
|
REDN(ID)=REDN(ID)+D0*DSFN1-E0*DABN1(ID)
|
|
REDNM(ID)=REDNM(ID)+D0M*DSFN1M-E0M*DABN1(ID-1)
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+D0*DSFP1(II)-E0*DABP1(II,ID)
|
|
REDPM(II,ID)=REDPM(II,ID)+D0M*DSFP1M(II)-
|
|
* E0M*DABP1(II,ID-1)
|
|
END DO
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
SRH=SIGE*DENS1(ID)
|
|
ABST=ABSO1(ID)
|
|
ABSTE=ABST-ELSCAT(ID)
|
|
WWK=WW*ABST
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABSTE*RAD1(ID))
|
|
D0=WW*(ABSTE*ALI1(ID)-ABST)
|
|
E0=WW*(RAD1(ID)-S0)
|
|
REIN(ID)=REIN(ID)+D0*DSFN1+E0*DABN1(ID)-WW*SIGEC(IJ)*RAD1(ID)
|
|
REIT(ID)=REIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
END IF
|
|
|
|
END DO
|
|
|
|
C
|
|
c ****3. deepest point - ID=ND
|
|
c
|
|
ID=ND
|
|
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
|
|
DSFTMM=DSFT1M
|
|
DSFNMM=DSFN1M
|
|
DO II=1,NLVEXP
|
|
DSFPMM(II)=DSFP1M(II)
|
|
END DO
|
|
DSFT1M=DSFT1
|
|
DSFN1M=DSFN1
|
|
DO II=1,NLVEXP
|
|
DSFP1M(II)=DSFP1(II)
|
|
END DO
|
|
S0=S0P
|
|
DSFT1=DSFT1P
|
|
DSFN1=DSFN1P
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1P(II)
|
|
END DO
|
|
C
|
|
C Improved lower boundary condition
|
|
C
|
|
IF(IBC.GT.0.AND.IDISK.EQ.0) THEN
|
|
DT=UN/(DELDMZ(ID-1)*(ABSOT(ID)+ABSOT(ID-1)))
|
|
PLAD=XKFB(ID)/XKF1(ID)
|
|
DBDT=PLAD/XKF1(ID)*HKT21(ID)*FREQ(IJ)*DT
|
|
IF(IBC.EQ.1) THEN
|
|
DSFT1=DSFT1+DBDT
|
|
ELSE IF(IBC.GE.2) THEN
|
|
PLAM=XKFB(ID-1)/XKF1(ID-1)
|
|
TAU23=T23*DT
|
|
TAU43=T43*DT
|
|
D0=(PLAD*(UN+TAU43)-T43*PLAM*DT)*DT*DT
|
|
RHD=DELDMZ(ID-1)*DENSI(ID)
|
|
E0=D0*RHD
|
|
DSFT1=DSFT1+DBDT*(UN+TAU23)-E0*DABT1(ID)
|
|
DSFN1=DSFN1-E0*(DABN1(ID)+ABSO1(ID)*DENSIM(ID))
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1(II)-E0*DABP1(II,ID)
|
|
END DO
|
|
IF(IBC.GE.3) THEN
|
|
DBDTM=PLAM/XKF1(ID-1)*HKT21(ID-1)*FREQ(IJ)*DT
|
|
RHD=DELDMZ(ID-1)*DENSI(ID-1)
|
|
E0=D0*RHD
|
|
DSFT1D=-DBDTM*DT*T23-E0*DABT1(ID-1)
|
|
DSFN1D=-E0*(DABN1(ID-1)+ABSO1(ID-1)*DENSIM(ID-1))
|
|
DO II=1,NLVEXP
|
|
DSFP1D(II)=-E0*DABP1(II,ID-1)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
END IF
|
|
C
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Hydrostatic equilibrium equation
|
|
c
|
|
IF(LNSKIP) THEN
|
|
D0=WW*FAK1(ID)
|
|
A0=WW*FAK1(ID-1)
|
|
FPRD(ID)=FPRD(ID)+D0*RAD1(ID)-A0*RAD1(ID-1)
|
|
c F0=D0*ALIP1(ID)
|
|
E0=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1
|
|
HEITM(ID)=HEITM(ID)+E0*DSFT1M
|
|
HEINM(ID)=HEINM(ID)+E0*DSFN1M
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)
|
|
HEIPM(II,ID)=HEIPM(II,ID)+E0*DSFP1M(II)
|
|
END DO
|
|
IF(IBC.GE.3) THEN
|
|
HEITM(ID)=HEITM(ID)-D0*DSFT1D
|
|
HEINM(ID)=HEINM(ID)-D0*DSFN1D
|
|
DO II=1,NLVEXP
|
|
HEIPM(II,ID)=HEIPM(II,ID)-D0*DSFP1D(II)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
C
|
|
C Differential equation part of radiative equilibrium
|
|
C
|
|
DDT=UN/(ABSOT(ID)+ABSOT(ID-1))
|
|
DT=DDT/DELDMZ(ID-1)
|
|
FL=(RAD1(ID)*FAK1(ID)-RAD1(ID-1)*FAK1(ID-1))*DT
|
|
FLFIX(ID)=FLFIX(ID)+WW*FL
|
|
IF(REDIF(ID).GT.0) THEN
|
|
D0=WW*FAK1(ID)*DT
|
|
A0=WW*FAK1(ID-1)*DT
|
|
D0M=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0P=D0*ALIP1(ID)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
E0=WW*FL*DDT
|
|
REDX(ID)=REDX(ID)+E0*ABSO1(ID)
|
|
REDXM(ID)=REDXM(ID)+E0*ABSO1(ID-1)
|
|
E0M=E0*DENSI(ID-1)
|
|
E0=E0*DENSI(ID)
|
|
REDT(ID)=REDT(ID)+D0*DSFT1-E0*DABT1(ID)
|
|
REDTM(ID)=REDTM(ID)+D0M*DSFT1M-E0M*DABT1(ID-1)
|
|
REDN(ID)=REDN(ID)+D0*DSFN1-E0*DABN1(ID)
|
|
REDNM(ID)=REDNM(ID)+D0M*DSFN1M-E0M*DABN1(ID-1)
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+D0*DSFP1(II)-E0*DABP1(II,ID)
|
|
REDPM(II,ID)=REDPM(II,ID)+D0M*DSFP1M(II)-
|
|
* E0M*DABP1(II,ID-1)
|
|
END DO
|
|
IF(IBC.GE.3) THEN
|
|
REDTM(ID)=REDTM(ID)+D0*DSFT1D
|
|
REDNM(ID)=REDNM(ID)+D0*DSFN1D
|
|
DO II=1,NLVEXP
|
|
REDPM(II,ID)=REDPM(II,ID)+D0*DSFP1D(II)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
SRH=SIGE*DENS1(ID)
|
|
ABST=ABSO1(ID)
|
|
ABSTE=ABST-ELSCAT(ID)
|
|
WWK=WW*ABST
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABSTE*RAD1(ID))
|
|
D0=WW*(ABSTE*ALI1(ID)-ABST)
|
|
E0=WW*(RAD1(ID)-S0)
|
|
REIN(ID)=REIN(ID)+D0*DSFN1+E0*DABN1(ID)-WW*SIGEC(IJ)*RAD1(ID)
|
|
IF(IBC.EQ.0) THEN
|
|
REIT(ID)=REIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
ELSE
|
|
REIT(ID)=REIT(ID)+D0*(DSFT1-DBDT)+E0*DABT1(ID)+
|
|
* ALI1(ID)/ABST*DBDT
|
|
END IF
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
END IF
|
|
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE ALIFR3(IJ)
|
|
C =====================
|
|
C
|
|
C hydrostatic and radiative equilibrium quantities -
|
|
C derivatives of the total heating and cooling rates in the
|
|
C ALI points with respect to the
|
|
C temperature, electron density, and populations
|
|
C a variant for consistent tridiagonal operator
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
PARAMETER (T23=TWO/3.D0, T43=4.D0/3.D0)
|
|
DIMENSION DSFP1(MLVEXP),DSFP1M(MLVEXP),DSFP1D(MLVEXP),
|
|
* DSFP1P(MLVEXP),DSFPMM(MLVEXP)
|
|
C
|
|
IF(IFALI.LE.1) RETURN
|
|
WW=WC(IJ)
|
|
C
|
|
DSFT1M=0.
|
|
DSFN1M=0.
|
|
DSFT1D=0.
|
|
DSFN1D=0.
|
|
DO II=1,NLVEXP
|
|
DSFP1M(II)=0.
|
|
DSFP1D(II)=0.
|
|
END DO
|
|
|
|
c Non-standard value of ILASCT & ILMCOR
|
|
|
|
IF(ILMCOR.NE.3) GO TO 199
|
|
c
|
|
c ****1. Special expressions for the first depth - id=1
|
|
c
|
|
ID=1
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
c
|
|
c Basic auxliliary quantities - derivatives of the source function
|
|
c
|
|
EMISIV=UN/EMIS1(ID)
|
|
ABST=UN/ABSO1(ID)
|
|
S0=EMIS1(ID)*ABST
|
|
SC=ELEC(ID)*SIGEC(IJ)
|
|
SCT=SC*ABST
|
|
ST=S0+SCT*RAD1(ID)
|
|
CORR=UN/(UN-ALI1(ID)*SCT)
|
|
DSFT1=CORR*(S0*DEMT1(ID)*EMISIV-ST*DABT1(ID)*ABST)
|
|
DSFN1=CORR*(S0*DEMN1(ID)*EMISIV+SIGEC(IJ)*RAD1(ID)*ABST-
|
|
* ST*DABN1(ID)*ABST)
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=CORR*(S0*DEMP1(II,ID)*EMISIV-ST*DABP1(II,ID)*ABST)
|
|
END DO
|
|
EMISIP=UN/EMIS1(ID+1)
|
|
ABSTP=UN/ABSO1(ID+1)
|
|
S0P=EMIS1(ID+1)*ABSTP
|
|
SCP=ELEC(ID+1)*SIGE
|
|
SCTP=SCP*ABSTP
|
|
STP=S0P+SCTP*RAD1(ID+1)
|
|
CORRP=UN/(UN-ALI1(ID+1)*SCTP)
|
|
DSFT1P=CORRP*(S0P*DEMT1(ID+1)*EMISIP-STP*DABT1(ID+1)*ABSTP)
|
|
DSFN1P=CORRP*(S0P*DEMN1(ID+1)*EMISIP+SIGEC(IJ)*RAD1(ID+1)*ABSTP-
|
|
* STP*DABN1(ID+1)*ABSTP)
|
|
DO II=1,NLVEXP
|
|
DSFP1P(II)=CORRP*(S0P*DEMP1(II,ID+1)*EMISIP-
|
|
* STP*DABP1(II,ID+1)*ABSTP)
|
|
END DO
|
|
C
|
|
C
|
|
C additional quantites in case of external irradiation
|
|
C
|
|
extd=extrad(ij)
|
|
if(extd.gt.0) then
|
|
DT=UN/(DELDMZ(ID)*(ABSOT(ID)+ABSOT(ID+1)))
|
|
D0=TWO*HEXTRD(IJ)*DT*DT
|
|
E0=D0*DELDMZ(ID)*DENSI(ID)
|
|
E1=D0*DELDMZ(ID+1)*DENSI(ID+1)
|
|
DSFT1=DSFT1-E0*DABT1(ID)
|
|
DSFN1=DSFN1-E0*(DABN1(ID)+ABSO1(ID)*DENSIM(ID))
|
|
DSFX1=E0*ABSO1(ID)*DENSIM(ID)
|
|
DSFT1D=DSFT1D-E1*DABT1(ID+1)
|
|
DSFN1D=DSFN1D-E1*(DABN1(ID+1)+ABSO1(ID+1)*DENSIM(ID+1))
|
|
DSFX1D=E1*ABSO1(ID+1)*DENSIM(ID+1)
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1(II)-E0*DABP1(II,ID)
|
|
DSFP1D(II)=DSFP1D(II)-E0*DABP1(II,ID+1)
|
|
END DO
|
|
end if
|
|
c
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
DSFDTM(ID)=DSFT1M*ALIM1(ID)
|
|
DSFDNM(ID)=DSFN1M*ALIM1(ID)
|
|
DSFDTP(ID)=DSFT1P*ALIP1(ID)
|
|
DSFDNP(ID)=DSFN1P*ALIP1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
DSFDPM(II,ID)=DSFP1M(II)*ALIM1(ID)
|
|
DSFDPP(II,ID)=DSFP1P(II)*ALIP1(ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Hydrostatic equilibrium quantities
|
|
c
|
|
WF=WW*FH(IJ)
|
|
IF(LNSKIP) THEN
|
|
FPRD(ID)=FPRD(ID)+WF*ABSO1(ID)*RAD1(ID)-
|
|
* WW*HEXTRD(IJ)*ABSO1(ID)
|
|
E0=WF*RAD1(ID)
|
|
D0=WF*ABSO1(ID)*ALI1(ID)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1+E0*DABN1(ID)
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Differential equation part of radiative equilibrium
|
|
c
|
|
FLFIX(ID)=FLFIX(ID)+WF*RAD1(ID)-WW*HEXTRD(IJ)
|
|
IF(REDIF(ID).GT.0.) THEN
|
|
WF=WF*ALI1(ID)
|
|
REDT(ID)=REDT(ID)+WF*DSFT1
|
|
REDN(ID)=REDN(ID)+WF*DSFN1
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+WF*DSFP1(II)
|
|
END DO
|
|
redtp(id)=redtp(id)+wf*dsft1d
|
|
rednp(id)=rednp(id)+wf*dsfn1d
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
ABST=ABSO1(ID)-ELSCAT(ID)
|
|
D0=ABST*ALI1(ID)
|
|
WWKC=WW*ABST*ALIP1(ID)
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABST*RAD1(ID))
|
|
REIN(ID)=REIN(ID)+WW*(D0*DSFN1+
|
|
* RAD1(ID)*(DABN1(ID)-SIGEC(IJ))-DEMN1(ID))
|
|
CREIT(ID)=CREIT(ID)+WWKC*DSFT1P
|
|
CREIN(ID)=CREIN(ID)+WWKC*DSFN1P
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+WW*(D0*DSFP1(II)+
|
|
* RAD1(ID)*DABP1(II,ID)-DEMP1(II,ID))
|
|
CREIP(II,ID)=CREIP(II,ID)+WWKC*DSFP1P(II)
|
|
END DO
|
|
REIT(ID)=REIT(ID)+WW*(D0*DSFT1+RAD1(ID)*DABT1(ID)-DEMT1(ID))
|
|
if(extd.gt.0.) then
|
|
creit(id)=creit(id)+ww*d0*dsft1d
|
|
crein(id)=crein(id)+ww*d0*dsfn1d
|
|
end if
|
|
END IF
|
|
|
|
C
|
|
c ****2. loop over depths
|
|
c
|
|
DO ID=2,ND-1
|
|
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
|
|
DSFTMM=DSFT1M
|
|
DSFNMM=DSFN1M
|
|
DO II=1,NLVEXP
|
|
DSFPMM(II)=DSFP1M(II)
|
|
END DO
|
|
DSFT1M=DSFT1
|
|
DSFN1M=DSFN1
|
|
DO II=1,NLVEXP
|
|
DSFP1M(II)=DSFP1(II)
|
|
END DO
|
|
S0=S0P
|
|
DSFT1=DSFT1P
|
|
DSFN1=DSFN1P
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1P(II)
|
|
END DO
|
|
|
|
EMISIP=UN/EMIS1(ID+1)
|
|
ABSTP=UN/ABSO1(ID+1)
|
|
S0P=EMIS1(ID+1)*ABSTP
|
|
SCP=ELEC(ID+1)*SIGEC(IJ)
|
|
SCTP=SCP*ABSTP
|
|
STP=S0P+SCTP*RAD1(ID+1)
|
|
CORRP=UN/(UN-ALI1(ID+1)*SCTP)
|
|
DSFT1P=CORRP*(S0P*DEMT1(ID+1)*EMISIP-STP*DABT1(ID+1)*ABSTP)
|
|
DSFN1P=CORRP*(S0P*DEMN1(ID+1)*EMISIP+SIGEC(IJ)*RAD1(ID+1)*ABSTP-
|
|
& STP*DABN1(ID+1)*ABSTP)
|
|
DO II=1,NLVEXP
|
|
DSFP1P(II)=CORRP*(S0P*DEMP1(II,ID+1)*EMISIP-
|
|
& STP*DABP1(II,ID+1)*ABSTP)
|
|
END DO
|
|
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Hydrostatic equilibrium equation
|
|
c
|
|
IF(LNSKIP) THEN
|
|
D0=WW*FAK1(ID)
|
|
A0=WW*FAK1(ID-1)
|
|
FPRD(ID)=FPRD(ID)+D0*RAD1(ID)-A0*RAD1(ID-1)
|
|
E0=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1
|
|
HEITM(ID)=HEITM(ID)+E0*DSFT1M
|
|
HEINM(ID)=HEINM(ID)+E0*DSFN1M
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)
|
|
HEIPM(II,ID)=HEIPM(II,ID)+E0*DSFP1M(II)
|
|
END DO
|
|
END IF
|
|
C
|
|
C Differential equation part of radiative equilibrium
|
|
C
|
|
DDT=UN/(ABSOT(ID)+ABSOT(ID-1))
|
|
DT=DDT/DELDMZ(ID-1)
|
|
FL=(RAD1(ID)*FAK1(ID)-RAD1(ID-1)*FAK1(ID-1))*DT
|
|
FLFIX(ID)=FLFIX(ID)+WW*FL
|
|
IF(REDIF(ID).GT.0) THEN
|
|
if(ifalih.eq.0) then
|
|
D0=WW*FAK1(ID)*DT
|
|
A0=WW*FAK1(ID-1)*DT
|
|
D0M=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0P=D0*ALIP1(ID)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
E0=WW*FL*DDT
|
|
REDX(ID)=REDX(ID)+E0*ABSO1(ID)
|
|
REDXM(ID)=REDXM(ID)+E0*ABSO1(ID-1)
|
|
E0M=E0*DENSI(ID-1)
|
|
E0=E0*DENSI(ID)
|
|
REDT(ID)=REDT(ID)+D0*DSFT1-E0*DABT1(ID)
|
|
REDTM(ID)=REDTM(ID)+D0M*DSFT1M-E0M*DABT1(ID-1)
|
|
REDN(ID)=REDN(ID)+D0*DSFN1-E0*DABN1(ID)
|
|
REDNM(ID)=REDNM(ID)+D0M*DSFN1M-E0M*DABN1(ID-1)
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+D0*DSFP1(II)-E0*DABP1(II,ID)
|
|
REDPM(II,ID)=REDPM(II,ID)+D0M*DSFP1M(II)-
|
|
* E0M*DABP1(II,ID-1)
|
|
END DO
|
|
else
|
|
d0=ww*alih1(id)
|
|
REDT(ID)=REDT(ID)+D0*DSFT1
|
|
REDN(ID)=REDN(ID)+D0*DSFN1
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+D0*DSFP1(II)
|
|
END DO
|
|
end if
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
WWK=WW*ABST
|
|
WWKA=WWK*ALIM1(ID)
|
|
WWKC=WWK*ALIP1(ID)
|
|
ABST=ABSO1(ID)-ELSCAT(ID)
|
|
D0=ABST*ALI1(ID)
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABST*RAD1(ID))
|
|
REIN(ID)=REIN(ID)+WW*(D0*DSFN1+
|
|
* RAD1(ID)*(DABN1(ID)-SIGEC(IJ))-DEMN1(ID))
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+WW*(D0*DSFP1(II)+
|
|
* RAD1(ID)*DABP1(II,ID)-DEMP1(II,ID))
|
|
AREIP(II,ID)=AREIP(II,ID)+WWKA*DSFP1M(II)
|
|
CREIP(II,ID)=CREIP(II,ID)+WWKC*DSFP1P(II)
|
|
END DO
|
|
REIT(ID)=REIT(ID)+WW*(D0*DSFT1+
|
|
* RAD1(ID)*DABT1(ID)-DEMT1(ID))
|
|
AREIT(ID)=AREIT(ID)+WWKA*DSFT1M
|
|
AREIN(ID)=AREIN(ID)+WWKA*DSFN1M
|
|
CREIT(ID)=CREIT(ID)+WWKC*DSFT1P
|
|
CREIN(ID)=CREIN(ID)+WWKC*DSFN1P
|
|
END IF
|
|
|
|
END DO
|
|
|
|
C
|
|
c ****3. deepest point - ID=ND
|
|
c
|
|
ID=ND
|
|
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
|
|
DSFTMM=DSFT1M
|
|
DSFNMM=DSFN1M
|
|
DO II=1,NLVEXP
|
|
DSFPMM(II)=DSFP1M(II)
|
|
END DO
|
|
DSFT1M=DSFT1
|
|
DSFN1M=DSFN1
|
|
DO II=1,NLVEXP
|
|
DSFP1M(II)=DSFP1(II)
|
|
END DO
|
|
S0=S0P
|
|
DSFT1=DSFT1P
|
|
DSFN1=DSFN1P
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1P(II)
|
|
END DO
|
|
C
|
|
C Improved lower boundary condition
|
|
C
|
|
IF(IBC.GT.0.AND.IDISK.EQ.0) THEN
|
|
DT=UN/(DELDMZ(ID-1)*(ABSOT(ID)+ABSOT(ID-1)))
|
|
PLAD=XKFB(ID)/XKF1(ID)
|
|
DBDT=PLAD/XKF1(ID)*HKT21(ID)*FREQ(IJ)*DT
|
|
IF(IBC.EQ.1) THEN
|
|
DSFT1=DSFT1+DBDT
|
|
ELSE IF(IBC.GE.2) THEN
|
|
PLAM=XKFB(ID-1)/XKF1(ID-1)
|
|
TAU23=T23*DT
|
|
TAU43=T43*DT
|
|
D0=(PLAD*(UN+TAU43)-T43*PLAM*DT)*DT*DT
|
|
RHD=DELDMZ(ID-1)*DENSI(ID)
|
|
E0=D0*RHD
|
|
DSFT1=DSFT1+DBDT*(UN+TAU23)-E0*DABT1(ID)
|
|
DSFN1=DSFN1-E0*(DABN1(ID)+ABSO1(ID)*DENSIM(ID))
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1(II)-E0*DABP1(II,ID)
|
|
END DO
|
|
IF(IBC.GE.3) THEN
|
|
DBDTM=PLAM/XKF1(ID-1)*HKT21(ID-1)*FREQ(IJ)*DT
|
|
RHD=DELDMZ(ID-1)*DENSI(ID-1)
|
|
E0=D0*RHD
|
|
DSFT1D=-DBDTM*DT*T23-E0*DABT1(ID-1)
|
|
DSFN1D=-E0*(DABN1(ID-1)+ABSO1(ID-1)*DENSIM(ID-1))
|
|
DO II=1,NLVEXP
|
|
DSFP1D(II)=-E0*DABP1(II,ID-1)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
END IF
|
|
C
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
DSFDTM(ID)=DSFT1M*ALIM1(ID)
|
|
DSFDNM(ID)=DSFN1M*ALIM1(ID)
|
|
DSFDTP(ID)=DSFT1P*ALIP1(ID)
|
|
DSFDNP(ID)=DSFN1P*ALIP1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
DSFDPM(II,ID)=DSFP1M(II)*ALIM1(ID)
|
|
DSFDPP(II,ID)=DSFP1P(II)*ALIP1(ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Hydrostatic equilibrium equation
|
|
c
|
|
IF(LNSKIP) THEN
|
|
D0=WW*FAK1(ID)
|
|
A0=WW*FAK1(ID-1)
|
|
FPRD(ID)=FPRD(ID)+D0*RAD1(ID)-A0*RAD1(ID-1)
|
|
E0=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1
|
|
HEITM(ID)=HEITM(ID)+E0*DSFT1M
|
|
HEINM(ID)=HEINM(ID)+E0*DSFN1M
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)
|
|
HEIPM(II,ID)=HEIPM(II,ID)+E0*DSFP1M(II)
|
|
END DO
|
|
IF(IBC.GE.3) THEN
|
|
HEITM(ID)=HEITM(ID)-D0*DSFT1D
|
|
HEINM(ID)=HEINM(ID)-D0*DSFN1D
|
|
DO II=1,NLVEXP
|
|
HEIPM(II,ID)=HEIPM(II,ID)-D0*DSFP1D(II)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
C
|
|
C Differential equation part of radiative equilibrium
|
|
C
|
|
DDT=UN/(ABSOT(ID)+ABSOT(ID-1))
|
|
DT=DDT/DELDMZ(ID-1)
|
|
FL=(RAD1(ID)*FAK1(ID)-RAD1(ID-1)*FAK1(ID-1))*DT
|
|
FLFIX(ID)=FLFIX(ID)+WW*FL
|
|
IF(REDIF(ID).GT.0) THEN
|
|
D0=WW*FAK1(ID)*DT
|
|
A0=WW*FAK1(ID-1)*DT
|
|
D0M=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0P=D0*ALIP1(ID)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
E0=WW*FL*DDT
|
|
REDX(ID)=REDX(ID)+E0*ABSO1(ID)
|
|
REDXM(ID)=REDXM(ID)+E0*ABSO1(ID-1)
|
|
E0M=E0*DENSI(ID-1)
|
|
E0=E0*DENSI(ID)
|
|
REDT(ID)=REDT(ID)+D0*DSFT1-E0*DABT1(ID)
|
|
REDTM(ID)=REDTM(ID)+D0M*DSFT1M-E0M*DABT1(ID-1)
|
|
REDN(ID)=REDN(ID)+D0*DSFN1-E0*DABN1(ID)
|
|
REDNM(ID)=REDNM(ID)+D0M*DSFN1M-E0M*DABN1(ID-1)
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+D0*DSFP1(II)-E0*DABP1(II,ID)
|
|
REDPM(II,ID)=REDPM(II,ID)+D0M*DSFP1M(II)-
|
|
* E0M*DABP1(II,ID-1)
|
|
END DO
|
|
IF(IBC.GE.3) THEN
|
|
REDTM(ID)=REDTM(ID)+D0*DSFT1D
|
|
REDNM(ID)=REDNM(ID)+D0*DSFN1D
|
|
DO II=1,NLVEXP
|
|
REDPM(II,ID)=REDPM(II,ID)+D0*DSFP1D(II)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
ABST=ABSO1(ID)-ELSCAT(ID)
|
|
WWKA=WW*ABST*ALIM1(ID)
|
|
D0=ABST*ALI1(ID)
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABST*RAD1(ID))
|
|
REIN(ID)=REIN(ID)+WW*(D0*DSFN1+
|
|
* RAD1(ID)*(DABN1(ID)-SIGEC(IJ))-DEMN1(ID))
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+WW*(D0*DSFP1(II)+
|
|
* RAD1(ID)*DABP1(II,ID)-DEMP1(II,ID))
|
|
AREIP(II,ID)=AREIP(II,ID)+WWKA*DSFP1M(II)
|
|
END DO
|
|
IF(IBC.EQ.0) THEN
|
|
REIT(ID)=REIT(ID)+WW*(D0*DSFT1+
|
|
* RAD1(ID)*DABT1(ID)-DEMT1(ID))
|
|
ELSE
|
|
REIT(ID)=REIT(ID)+WW*(D0*(DSFT1-DBDT)+E0*DABT1(ID)+
|
|
* RAD1(ID)*DABT1(ID)-DEMT1(ID)+
|
|
* ALI1(ID)/ABST*DBDT)
|
|
END IF
|
|
AREIT(ID)=AREIT(ID)+WWKA*DSFT1M
|
|
AREIN(ID)=AREIN(ID)+WWKA*DSFN1M
|
|
END IF
|
|
|
|
RETURN
|
|
|
|
c Non-standard value of ILASCT & ILMCOR
|
|
|
|
199 IF(ILASCT.NE.0) GO TO 299
|
|
c
|
|
c ****1. Special expressions for the first depth - id=1
|
|
c
|
|
ID=1
|
|
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
c
|
|
c Basic auxliliary quantities - derivatives of the source function
|
|
c
|
|
EMISIV=UN/EMIS1(ID)
|
|
ABST=UN/(ABSO1(ID)-ELSCAT(ID))
|
|
S0=EMIS1(ID)*ABST
|
|
DSFN1=S0*(DEMN1(ID)*EMISIV-(DABN1(ID)-SIGEC(IJ))*ABST)
|
|
DSFT1=S0*(DEMT1(ID)*EMISIV-DABT1(ID)*ABST)
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=S0*(DEMP1(II,ID)*EMISIV-DABP1(II,ID)*ABST)
|
|
END DO
|
|
EMISIP=UN/EMIS1(ID+1)
|
|
ABSTP=UN/(ABSO1(ID+1)-ELSCAT(ID+1))
|
|
S0P=EMIS1(ID+1)*ABSTP
|
|
DSFN1P=S0P*(DEMN1(ID+1)*EMISIP-(DABN1(ID+1)-SIGEC(IJ))*ABSTP)
|
|
DSFT1P=S0P*(DEMT1(ID+1)*EMISIP-DABT1(ID+1)*ABSTP)
|
|
DO II=1,NLVEXP
|
|
DSFP1P(II)=S0P*(DEMP1(II,ID+1)*EMISIP-DABP1(II,ID+1)*ABSTP)
|
|
END DO
|
|
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Hydrostatic equilibrium quantities
|
|
c
|
|
WF=WW*FH(IJ)
|
|
IF(LNSKIP) THEN
|
|
FPRD(ID)=FPRD(ID)+WF*ABSO1(ID)*RAD1(ID)-
|
|
* WW*HEXTRD(IJ)*ABSO1(ID)
|
|
E0=WF*RAD1(ID)
|
|
D0=WF*ABSO1(ID)*ALI1(ID)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1+E0*DABN1(ID)
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Differential equation part of radiative equilibrium
|
|
c
|
|
FLFIX(ID)=FLFIX(ID)+WF*RAD1(ID)-WW*HEXTRD(IJ)
|
|
IF(REDIF(ID).GT.0.) THEN
|
|
WF=WF*ALI1(ID)
|
|
REDT(ID)=REDT(ID)+WF*DSFT1
|
|
REDN(ID)=REDN(ID)+WF*DSFN1
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+WF*DSFP1(II)
|
|
END DO
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
ABST=ABSO1(ID)-ELSCAT(ID)
|
|
WWK=WW*ABST
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABST*RAD1(ID))
|
|
D0=WW*(ALI1(ID)-UN)*ABST
|
|
E0=WW*(RAD1(ID)-S0)
|
|
REIN(ID)=REIN(ID)+D0*DSFN1+E0*(DABN1(ID)-SIGEC(IJ))
|
|
REIT(ID)=REIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
END IF
|
|
|
|
C
|
|
c ****2. loop over depths
|
|
c
|
|
DO ID=2,ND-1
|
|
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
|
|
DSFTMM=DSFT1M
|
|
DSFNMM=DSFN1M
|
|
DO II=1,NLVEXP
|
|
DSFPMM(II)=DSFP1M(II)
|
|
END DO
|
|
DSFT1M=DSFT1
|
|
DSFN1M=DSFN1
|
|
DO II=1,NLVEXP
|
|
DSFP1M(II)=DSFP1(II)
|
|
END DO
|
|
S0=S0P
|
|
DSFT1=DSFT1P
|
|
DSFN1=DSFN1P
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1P(II)
|
|
END DO
|
|
|
|
EMISIP=UN/EMIS1(ID+1)
|
|
ABSTP=UN/(ABSO1(ID+1)-ELSCAT(ID+1))
|
|
S0P=EMIS1(ID+1)*ABSTP
|
|
DSFN1P=S0P*(DEMN1(ID+1)*EMISIP-(DABN1(ID+1)-SIGEC(IJ))*ABSTP)
|
|
DSFT1P=S0P*(DEMT1(ID+1)*EMISIP-DABT1(ID+1)*ABSTP)
|
|
DO II=1,NLVEXP
|
|
DSFP1P(II)=S0P*(DEMP1(II,ID+1)*EMISIP-DABP1(II,ID+1)*ABSTP)
|
|
END DO
|
|
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Hydrostatic equilibrium equation
|
|
c
|
|
IF(LNSKIP) THEN
|
|
D0=WW*FAK1(ID)
|
|
A0=WW*FAK1(ID-1)
|
|
FPRD(ID)=FPRD(ID)+D0*RAD1(ID)-A0*RAD1(ID-1)
|
|
E0=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1
|
|
HEITM(ID)=HEITM(ID)+E0*DSFT1M
|
|
HEINM(ID)=HEINM(ID)+E0*DSFN1M
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)
|
|
HEIPM(II,ID)=HEIPM(II,ID)+E0*DSFP1M(II)
|
|
END DO
|
|
END IF
|
|
C
|
|
C Differential equation part of radiative equilibrium
|
|
C
|
|
DDT=UN/(ABSOT(ID)+ABSOT(ID-1))
|
|
DT=DDT/DELDMZ(ID-1)
|
|
FL=(RAD1(ID)*FAK1(ID)-RAD1(ID-1)*FAK1(ID-1))*DT
|
|
FLFIX(ID)=FLFIX(ID)+WW*FL
|
|
IF(REDIF(ID).GT.0) THEN
|
|
D0=WW*FAK1(ID)*DT
|
|
A0=WW*FAK1(ID-1)*DT
|
|
D0M=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0P=D0*ALIP1(ID)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
E0=WW*FL*DDT
|
|
REDX(ID)=REDX(ID)+E0*ABSO1(ID)
|
|
REDXM(ID)=REDXM(ID)+E0*ABSO1(ID-1)
|
|
E0M=E0*DENSI(ID-1)
|
|
E0=E0*DENSI(ID)
|
|
REDT(ID)=REDT(ID)+D0*DSFT1-E0*DABT1(ID)
|
|
REDTM(ID)=REDTM(ID)+D0M*DSFT1M-E0M*DABT1(ID-1)
|
|
REDN(ID)=REDN(ID)+D0*DSFN1-E0*DABN1(ID)
|
|
REDNM(ID)=REDNM(ID)+D0M*DSFN1M-E0M*DABN1(ID-1)
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+D0*DSFP1(II)-E0*DABP1(II,ID)
|
|
REDPM(II,ID)=REDPM(II,ID)+D0M*DSFP1M(II)-
|
|
* E0M*DABP1(II,ID-1)
|
|
END DO
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
ABST=ABSO1(ID)-ELSCAT(ID)
|
|
WWK=WW*ABST
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABST*RAD1(ID))
|
|
D0=WW*(ALI1(ID)-UN)*ABST
|
|
E0=WW*(RAD1(ID)-S0)
|
|
REIN(ID)=REIN(ID)+D0*DSFN1+E0*(DABN1(ID)-SIGEC(IJ))
|
|
REIT(ID)=REIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
END IF
|
|
|
|
END DO
|
|
|
|
C
|
|
c ****3. deepest point - ID=ND
|
|
c
|
|
ID=ND
|
|
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
|
|
DSFTMM=DSFT1M
|
|
DSFNMM=DSFN1M
|
|
DO II=1,NLVEXP
|
|
DSFPMM(II)=DSFP1M(II)
|
|
END DO
|
|
DSFT1M=DSFT1
|
|
DSFN1M=DSFN1
|
|
DO II=1,NLVEXP
|
|
DSFP1M(II)=DSFP1(II)
|
|
END DO
|
|
S0=S0P
|
|
DSFT1=DSFT1P
|
|
DSFN1=DSFN1P
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1P(II)
|
|
END DO
|
|
C
|
|
C Improved lower boundary condition
|
|
C
|
|
IF(IBC.GT.0.AND.IDISK.EQ.0) THEN
|
|
DT=UN/(DELDMZ(ID-1)*(ABSOT(ID)+ABSOT(ID-1)))
|
|
PLAD=XKFB(ID)/XKF1(ID)
|
|
DBDT=PLAD/XKF1(ID)*HKT21(ID)*FREQ(IJ)*DT
|
|
IF(IBC.EQ.1) THEN
|
|
DSFT1=DSFT1+DBDT
|
|
ELSE IF(IBC.GE.2) THEN
|
|
PLAM=XKFB(ID-1)/XKF1(ID-1)
|
|
TAU23=T23*DT
|
|
TAU43=T43*DT
|
|
D0=(PLAD*(UN+TAU43)-T43*PLAM*DT)*DT*DT
|
|
RHD=DELDMZ(ID-1)*DENSI(ID)
|
|
E0=D0*RHD
|
|
DSFT1=DSFT1+DBDT*(UN+TAU23)-E0*DABT1(ID)
|
|
DSFN1=DSFN1-E0*(DABN1(ID)+ABSO1(ID)*DENSIM(ID))
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1(II)-E0*DABP1(II,ID)
|
|
END DO
|
|
IF(IBC.GE.3) THEN
|
|
DBDTM=PLAM/XKF1(ID-1)*HKT21(ID-1)*FREQ(IJ)*DT
|
|
RHD=DELDMZ(ID-1)*DENSI(ID-1)
|
|
E0=D0*RHD
|
|
DSFT1D=-DBDTM*DT*T23-E0*DABT1(ID-1)
|
|
DSFN1D=-E0*(DABN1(ID-1)+ABSO1(ID-1)*DENSIM(ID-1))
|
|
DO II=1,NLVEXP
|
|
DSFP1D(II)=-E0*DABP1(II,ID-1)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
END IF
|
|
C
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Hydrostatic equilibrium equation
|
|
c
|
|
IF(LNSKIP) THEN
|
|
D0=WW*FAK1(ID)
|
|
A0=WW*FAK1(ID-1)
|
|
FPRD(ID)=FPRD(ID)+D0*RAD1(ID)-A0*RAD1(ID-1)
|
|
E0=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1
|
|
HEITM(ID)=HEITM(ID)+E0*DSFT1M
|
|
HEINM(ID)=HEINM(ID)+E0*DSFN1M
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)
|
|
HEIPM(II,ID)=HEIPM(II,ID)+E0*DSFP1M(II)
|
|
END DO
|
|
IF(IBC.GE.3) THEN
|
|
HEITM(ID)=HEITM(ID)-D0*DSFT1D
|
|
HEINM(ID)=HEINM(ID)-D0*DSFN1D
|
|
DO II=1,NLVEXP
|
|
HEIPM(II,ID)=HEIPM(II,ID)-D0*DSFP1D(II)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
C
|
|
C Differential equation part of radiative equilibrium
|
|
C
|
|
DDT=UN/(ABSOT(ID)+ABSOT(ID-1))
|
|
DT=DDT/DELDMZ(ID-1)
|
|
FL=(RAD1(ID)*FAK1(ID)-RAD1(ID-1)*FAK1(ID-1))*DT
|
|
FLFIX(ID)=FLFIX(ID)+WW*FL
|
|
IF(REDIF(ID).GT.0) THEN
|
|
D0=WW*FAK1(ID)*DT
|
|
A0=WW*FAK1(ID-1)*DT
|
|
D0M=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0P=D0*ALIP1(ID)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
E0=WW*FL*DDT
|
|
REDX(ID)=REDX(ID)+E0*ABSO1(ID)
|
|
REDXM(ID)=REDXM(ID)+E0*ABSO1(ID-1)
|
|
E0M=E0*DENSI(ID-1)
|
|
E0=E0*DENSI(ID)
|
|
REDT(ID)=REDT(ID)+D0*DSFT1-E0*DABT1(ID)
|
|
REDTM(ID)=REDTM(ID)+D0M*DSFT1M-E0M*DABT1(ID-1)
|
|
REDN(ID)=REDN(ID)+D0*DSFN1-E0*DABN1(ID)
|
|
REDNM(ID)=REDNM(ID)+D0M*DSFN1M-E0M*DABN1(ID-1)
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+D0*DSFP1(II)-E0*DABP1(II,ID)
|
|
REDPM(II,ID)=REDPM(II,ID)+D0M*DSFP1M(II)-
|
|
* E0M*DABP1(II,ID-1)
|
|
END DO
|
|
IF(IBC.GE.3) THEN
|
|
REDTM(ID)=REDTM(ID)+D0*DSFT1D
|
|
REDNM(ID)=REDNM(ID)+D0*DSFN1D
|
|
DO II=1,NLVEXP
|
|
REDPM(II,ID)=REDPM(II,ID)+D0*DSFP1D(II)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
ABST=ABSO1(ID)-ELSCAT(ID)
|
|
WWK=WW*ABST
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABST*RAD1(ID))
|
|
D0=WW*(ALI1(ID)-UN)*ABST
|
|
E0=WW*(RAD1(ID)-S0)
|
|
REIN(ID)=REIN(ID)+D0*DSFN1+E0*(DABN1(ID)-SIGEC(IJ))
|
|
IF(IBC.EQ.0) THEN
|
|
REIT(ID)=REIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
ELSE
|
|
REIT(ID)=REIT(ID)+D0*(DSFT1-DBDT)+E0*DABT1(ID)+
|
|
* ALI1(ID)/ABST*DBDT
|
|
END IF
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
END IF
|
|
|
|
RETURN
|
|
|
|
C Non-standard value of ILASCT (ILASCT != 0)
|
|
c
|
|
c ****1. Special expressions for the first depth - id=1
|
|
c
|
|
299 ID=1
|
|
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
c
|
|
c Basic auxliliary quantities - derivatives of the source function
|
|
c
|
|
EMISIV=UN/EMIS1(ID)
|
|
ABST=UN/ABSO1(ID)
|
|
S0=EMIS1(ID)*ABST
|
|
DSFN1=S0*(DEMN1(ID)*EMISIV-DABN1(ID)*ABST)
|
|
DSFT1=S0*(DEMT1(ID)*EMISIV-DABT1(ID)*ABST)
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=S0*(DEMP1(II,ID)*EMISIV-DABP1(II,ID)*ABST)
|
|
END DO
|
|
EMISIP=UN/EMIS1(ID+1)
|
|
ABSTP=UN/ABSO1(ID+1)
|
|
S0P=EMIS1(ID+1)*ABSTP
|
|
DSFN1P=S0P*(DEMN1(ID+1)*EMISIP-DABN1(ID+1)*ABSTP)
|
|
DSFT1P=S0P*(DEMT1(ID+1)*EMISIP-DABT1(ID+1)*ABSTP)
|
|
DO II=1,NLVEXP
|
|
DSFP1P(II)=S0P*(DEMP1(II,ID+1)*EMISIP-DABP1(II,ID+1)*ABSTP)
|
|
END DO
|
|
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
END DO
|
|
END IF
|
|
|
|
c
|
|
c Hydrostatic equilibrium quantities
|
|
c
|
|
WF=WW*FH(IJ)
|
|
IF(LNSKIP) THEN
|
|
FPRD(ID)=FPRD(ID)+WF*ABSO1(ID)*RAD1(ID)-
|
|
* WW*HEXTRD(IJ)*ABSO1(ID)
|
|
E0=WF*RAD1(ID)
|
|
D0=WF*ABSO1(ID)*ALI1(ID)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1+E0*DABN1(ID)
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Differential equation part of radiative equilibrium
|
|
c
|
|
FLFIX(ID)=FLFIX(ID)+WF*RAD1(ID)-WW*HEXTRD(IJ)
|
|
IF(REDIF(ID).GT.0.) THEN
|
|
WF=WF*ALI1(ID)
|
|
REDT(ID)=REDT(ID)+WF*DSFT1
|
|
REDN(ID)=REDN(ID)+WF*DSFN1
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+WF*DSFP1(II)
|
|
END DO
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
SRH=SIGE*DENS1(ID)
|
|
ABST=ABSO1(ID)
|
|
ABSTE=ABST-ELSCAT(ID)
|
|
WWK=WW*ABST
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABSTE*RAD1(ID))
|
|
D0=WW*(ABSTE*ALI1(ID)-ABST)
|
|
E0=WW*(RAD1(ID)-S0)
|
|
REIN(ID)=REIN(ID)+D0*DSFN1+E0*DABN1(ID)-WW*SIGEC(IJ)*RAD1(ID)
|
|
REIT(ID)=REIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
END IF
|
|
|
|
C
|
|
c ****2. loop over depths
|
|
c
|
|
DO ID=2,ND-1
|
|
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
|
|
DSFTMM=DSFT1M
|
|
DSFNMM=DSFN1M
|
|
DO II=1,NLVEXP
|
|
DSFPMM(II)=DSFP1M(II)
|
|
END DO
|
|
DSFT1M=DSFT1
|
|
DSFN1M=DSFN1
|
|
DO II=1,NLVEXP
|
|
DSFP1M(II)=DSFP1(II)
|
|
END DO
|
|
S0=S0P
|
|
DSFT1=DSFT1P
|
|
DSFN1=DSFN1P
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1P(II)
|
|
END DO
|
|
|
|
EMISIP=UN/EMIS1(ID+1)
|
|
ABSTP=UN/ABSO1(ID+1)
|
|
S0P=EMIS1(ID+1)*ABSTP
|
|
DSFN1P=S0P*(DEMN1(ID+1)*EMISIP-DABN1(ID+1)*ABSTP)
|
|
DSFT1P=S0P*(DEMT1(ID+1)*EMISIP-DABT1(ID+1)*ABSTP)
|
|
DO II=1,NLVEXP
|
|
DSFP1P(II)=S0P*(DEMP1(II,ID+1)*EMISIP-DABP1(II,ID+1)*ABSTP)
|
|
END DO
|
|
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Hydrostatic equilibrium equation
|
|
c
|
|
IF(LNSKIP) THEN
|
|
D0=WW*FAK1(ID)
|
|
A0=WW*FAK1(ID-1)
|
|
FPRD(ID)=FPRD(ID)+D0*RAD1(ID)-A0*RAD1(ID-1)
|
|
E0=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1
|
|
HEITM(ID)=HEITM(ID)+E0*DSFT1M
|
|
HEINM(ID)=HEINM(ID)+E0*DSFN1M
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)
|
|
HEIPM(II,ID)=HEIPM(II,ID)+E0*DSFP1M(II)
|
|
END DO
|
|
END IF
|
|
C
|
|
C Differential equation part of radiative equilibrium
|
|
C
|
|
DDT=UN/(ABSOT(ID)+ABSOT(ID-1))
|
|
DT=DDT/DELDMZ(ID-1)
|
|
FL=(RAD1(ID)*FAK1(ID)-RAD1(ID-1)*FAK1(ID-1))*DT
|
|
FLFIX(ID)=FLFIX(ID)+WW*FL
|
|
IF(REDIF(ID).GT.0) THEN
|
|
D0=WW*FAK1(ID)*DT
|
|
A0=WW*FAK1(ID-1)*DT
|
|
D0M=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0P=D0*ALIP1(ID)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
E0=WW*FL*DDT
|
|
REDX(ID)=REDX(ID)+E0*ABSO1(ID)
|
|
REDXM(ID)=REDXM(ID)+E0*ABSO1(ID-1)
|
|
E0M=E0*DENSI(ID-1)
|
|
E0=E0*DENSI(ID)
|
|
REDT(ID)=REDT(ID)+D0*DSFT1-E0*DABT1(ID)
|
|
REDTM(ID)=REDTM(ID)+D0M*DSFT1M-E0M*DABT1(ID-1)
|
|
REDN(ID)=REDN(ID)+D0*DSFN1-E0*DABN1(ID)
|
|
REDNM(ID)=REDNM(ID)+D0M*DSFN1M-E0M*DABN1(ID-1)
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+D0*DSFP1(II)-E0*DABP1(II,ID)
|
|
REDPM(II,ID)=REDPM(II,ID)+D0M*DSFP1M(II)-
|
|
* E0M*DABP1(II,ID-1)
|
|
END DO
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
SRH=SIGE*DENS1(ID)
|
|
ABST=ABSO1(ID)
|
|
ABSTE=ABST-ELSCAT(ID)
|
|
WWK=WW*ABST
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABSTE*RAD1(ID))
|
|
D0=WW*(ABSTE*ALI1(ID)-ABST)
|
|
E0=WW*(RAD1(ID)-S0)
|
|
REIN(ID)=REIN(ID)+D0*DSFN1+E0*DABN1(ID)-WW*SIGEC(IJ)*RAD1(ID)
|
|
REIT(ID)=REIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
END IF
|
|
|
|
END DO
|
|
|
|
C
|
|
c ****3. deepest point - ID=ND
|
|
c
|
|
ID=ND
|
|
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
|
|
DSFTMM=DSFT1M
|
|
DSFNMM=DSFN1M
|
|
DO II=1,NLVEXP
|
|
DSFPMM(II)=DSFP1M(II)
|
|
END DO
|
|
DSFT1M=DSFT1
|
|
DSFN1M=DSFN1
|
|
DO II=1,NLVEXP
|
|
DSFP1M(II)=DSFP1(II)
|
|
END DO
|
|
S0=S0P
|
|
DSFT1=DSFT1P
|
|
DSFN1=DSFN1P
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1P(II)
|
|
END DO
|
|
C
|
|
C Improved lower boundary condition
|
|
C
|
|
IF(IBC.GT.0.AND.IDISK.EQ.0) THEN
|
|
DT=UN/(DELDMZ(ID-1)*(ABSOT(ID)+ABSOT(ID-1)))
|
|
PLAD=XKFB(ID)/XKF1(ID)
|
|
DBDT=PLAD/XKF1(ID)*HKT21(ID)*FREQ(IJ)*DT
|
|
IF(IBC.EQ.1) THEN
|
|
DSFT1=DSFT1+DBDT
|
|
ELSE IF(IBC.GE.2) THEN
|
|
PLAM=XKFB(ID-1)/XKF1(ID-1)
|
|
TAU23=T23*DT
|
|
TAU43=T43*DT
|
|
D0=(PLAD*(UN+TAU43)-T43*PLAM*DT)*DT*DT
|
|
RHD=DELDMZ(ID-1)*DENSI(ID)
|
|
E0=D0*RHD
|
|
DSFT1=DSFT1+DBDT*(UN+TAU23)-E0*DABT1(ID)
|
|
DSFN1=DSFN1-E0*(DABN1(ID)+ABSO1(ID)*DENSIM(ID))
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1(II)-E0*DABP1(II,ID)
|
|
END DO
|
|
IF(IBC.GE.3) THEN
|
|
DBDTM=PLAM/XKF1(ID-1)*HKT21(ID-1)*FREQ(IJ)*DT
|
|
RHD=DELDMZ(ID-1)*DENSI(ID-1)
|
|
E0=D0*RHD
|
|
DSFT1D=-DBDTM*DT*T23-E0*DABT1(ID-1)
|
|
DSFN1D=-E0*(DABN1(ID-1)+ABSO1(ID-1)*DENSIM(ID-1))
|
|
DO II=1,NLVEXP
|
|
DSFP1D(II)=-E0*DABP1(II,ID-1)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
END IF
|
|
C
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Hydrostatic equilibrium equation
|
|
c
|
|
IF(LNSKIP) THEN
|
|
D0=WW*FAK1(ID)
|
|
A0=WW*FAK1(ID-1)
|
|
FPRD(ID)=FPRD(ID)+D0*RAD1(ID)-A0*RAD1(ID-1)
|
|
E0=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1
|
|
HEITM(ID)=HEITM(ID)+E0*DSFT1M
|
|
HEINM(ID)=HEINM(ID)+E0*DSFN1M
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)
|
|
HEIPM(II,ID)=HEIPM(II,ID)+E0*DSFP1M(II)
|
|
END DO
|
|
IF(IBC.GE.3) THEN
|
|
HEITM(ID)=HEITM(ID)-D0*DSFT1D
|
|
HEINM(ID)=HEINM(ID)-D0*DSFN1D
|
|
DO II=1,NLVEXP
|
|
HEIPM(II,ID)=HEIPM(II,ID)-D0*DSFP1D(II)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
C
|
|
C Differential equation part of radiative equilibrium
|
|
C
|
|
DDT=UN/(ABSOT(ID)+ABSOT(ID-1))
|
|
DT=DDT/DELDMZ(ID-1)
|
|
FL=(RAD1(ID)*FAK1(ID)-RAD1(ID-1)*FAK1(ID-1))*DT
|
|
FLFIX(ID)=FLFIX(ID)+WW*FL
|
|
IF(REDIF(ID).GT.0) THEN
|
|
D0=WW*FAK1(ID)*DT
|
|
A0=WW*FAK1(ID-1)*DT
|
|
D0M=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0P=D0*ALIP1(ID)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
E0=WW*FL*DDT
|
|
REDX(ID)=REDX(ID)+E0*ABSO1(ID)
|
|
REDXM(ID)=REDXM(ID)+E0*ABSO1(ID-1)
|
|
E0M=E0*DENSI(ID-1)
|
|
E0=E0*DENSI(ID)
|
|
REDT(ID)=REDT(ID)+D0*DSFT1-E0*DABT1(ID)
|
|
REDTM(ID)=REDTM(ID)+D0M*DSFT1M-E0M*DABT1(ID-1)
|
|
REDN(ID)=REDN(ID)+D0*DSFN1-E0*DABN1(ID)
|
|
REDNM(ID)=REDNM(ID)+D0M*DSFN1M-E0M*DABN1(ID-1)
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+D0*DSFP1(II)-E0*DABP1(II,ID)
|
|
REDPM(II,ID)=REDPM(II,ID)+D0M*DSFP1M(II)-
|
|
* E0M*DABP1(II,ID-1)
|
|
END DO
|
|
IF(IBC.GE.3) THEN
|
|
REDTM(ID)=REDTM(ID)+D0*DSFT1D
|
|
REDNM(ID)=REDNM(ID)+D0*DSFN1D
|
|
DO II=1,NLVEXP
|
|
REDPM(II,ID)=REDPM(II,ID)+D0*DSFP1D(II)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
SRH=SIGE*DENS1(ID)
|
|
ABST=ABSO1(ID)
|
|
ABSTE=ABST-ELSCAT(ID)
|
|
WWK=WW*ABST
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABSTE*RAD1(ID))
|
|
D0=WW*(ABSTE*ALI1(ID)-ABST)
|
|
E0=WW*(RAD1(ID)-S0)
|
|
REIN(ID)=REIN(ID)+D0*DSFN1+E0*DABN1(ID)-WW*SIGEC(IJ)*RAD1(ID)
|
|
IF(IBC.EQ.0) THEN
|
|
REIT(ID)=REIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
ELSE
|
|
REIT(ID)=REIT(ID)+D0*(DSFT1-DBDT)+E0*DABT1(ID)+
|
|
* ALI1(ID)/ABST*DBDT
|
|
END IF
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
END IF
|
|
|
|
RETURN
|
|
END
|
|
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE ALIFR6(IJ)
|
|
C =====================
|
|
C
|
|
C hydrostatic and radiative equilibrium quantities -
|
|
C derivatives of the total heating and cooling rates in the
|
|
C ALI points with respect to the
|
|
C temperature, electron density, and populations
|
|
C a variant for consistent tridiagonal operator
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
PARAMETER (T23=TWO/3.D0, T43=4.D0/3.D0)
|
|
DIMENSION DSFP1(MLVEXP),DSFP1M(MLVEXP),DSFP1D(MLVEXP),
|
|
* DSFP1P(MLVEXP),DSFPMM(MLVEXP)
|
|
C
|
|
WW=WC(IJ)
|
|
C
|
|
DSFT1M=0.
|
|
DSFN1M=0.
|
|
DO II=1,NLVEXP
|
|
DSFP1M(II)=0.
|
|
END DO
|
|
c
|
|
c ****1. Special expressions for the first depth - id=1
|
|
c
|
|
ID=1
|
|
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
c
|
|
c Basic auxliliary quantities - derivatives of the source function
|
|
c
|
|
EMISIV=UN/EMIS1(ID)
|
|
if(ilmcor.ne.3) then
|
|
if(ilasct.eq.0) then
|
|
ABST=UN/(ABSO1(ID)-ELSCAT(ID))
|
|
S0=EMIS1(ID)*ABST
|
|
DSFN1=S0*(DEMN1(ID)*EMISIV-(DABN1(ID)-SIGEC(IJ))*ABST)
|
|
else
|
|
ABST=UN/ABSO1(ID)
|
|
S0=EMIS1(ID)*ABST
|
|
DSFN1=S0*(DEMN1(ID)*EMISIV-DABN1(ID)*ABST)
|
|
end if
|
|
DSFT1=S0*(DEMT1(ID)*EMISIV-DABT1(ID)*ABST)
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=S0*(DEMP1(II,ID)*EMISIV-DABP1(II,ID)*ABST)
|
|
END DO
|
|
C
|
|
c correction for electron scattering source function contribution
|
|
c
|
|
else
|
|
abst=un/abso1(id)
|
|
s0=emis1(id)*abst
|
|
sc=elec(id)*sigeC(IJ)
|
|
sct=sc*abst
|
|
st=s0+sct*rad1(id)
|
|
corr=un/(un-ali1(id)*sct)
|
|
dsft1=corr*(s0*demt1(id)*emisiv-st*dabt1(id)*abst)
|
|
dsfn1=corr*(s0*demn1(id)*emisiv+sigeC(IJ)*rad1(id)*abst-
|
|
* st*dabn1(id)*abst)
|
|
do ii=1,nlvexp
|
|
dsfp1(ii)=corr*(s0*demp1(ii,id)*emisiv-
|
|
* st*dabp1(ii,id)*abst)
|
|
end do
|
|
end if
|
|
|
|
EMISIP=UN/EMIS1(ID+1)
|
|
if(ilmcor.ne.3) then
|
|
if(ilasct.eq.0) then
|
|
ABSTP=UN/(ABSO1(ID+1)-ELSCAT(ID+1))
|
|
S0P=EMIS1(ID+1)*ABSTP
|
|
DSFN1P=S0P*(DEMN1(ID+1)*EMISIP-(DABN1(ID+1)-SIGEC(IJ))*ABSTP)
|
|
else
|
|
ABSTP=UN/ABSO1(ID+1)
|
|
S0P=EMIS1(ID+1)*ABSTP
|
|
DSFN1P=S0P*(DEMN1(ID+1)*EMISIP-DABN1(ID+1)*ABSTP)
|
|
end if
|
|
DSFT1P=S0P*(DEMT1(ID+1)*EMISIP-DABT1(ID+1)*ABSTP)
|
|
DO II=1,NLVEXP
|
|
DSFP1P(II)=S0P*(DEMP1(II,ID+1)*EMISIP-DABP1(II,ID+1)*ABSTP)
|
|
END DO
|
|
else
|
|
abstp=un/abso1(id+1)
|
|
s0p=emis1(id+1)*abstp
|
|
scp=elec(id+1)*sigeC(IJ)
|
|
sctp=scp*abstp
|
|
stp=s0p+sctp*rad1(id+1)
|
|
corrp=un/(un-ali1(id+1)*sctp)
|
|
dsft1p=corrp*(s0p*demt1(id+1)*emisip-stp*dabt1(id+1)*abstp)
|
|
dsfn1p=corrp*(s0p*demn1(id+1)*emisip+sigeC(IJ)*rad1(id+1)*abstp-
|
|
* stp*dabn1(id+1)*abstp)
|
|
do ii=1,nlvexp
|
|
dsfp1p(ii)=corrp*(s0p*demp1(ii,id+1)*emisip-
|
|
* stp*dabp1(ii,id+1)*abstp)
|
|
end do
|
|
end if
|
|
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
END DO
|
|
END IF
|
|
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDTM(ID)=DSFT1M*ALIM1(ID)
|
|
DSFDNM(ID)=DSFN1M*ALIM1(ID)
|
|
DSFDTP(ID)=DSFT1P*ALIP1(ID)
|
|
DSFDNP(ID)=DSFN1P*ALIP1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDPM(II,ID)=DSFP1M(II)*ALIM1(ID)
|
|
DSFDPP(II,ID)=DSFP1P(II)*ALIP1(ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Hydrostatic equilibrium quantities
|
|
c
|
|
WF=WW*FH(IJ)
|
|
IF(LNSKIP) THEN
|
|
FPRD(ID)=FPRD(ID)+WF*ABSO1(ID)*RAD1(ID)-
|
|
* WW*HEXTRD(IJ)*ABSO1(ID)
|
|
E0=WF*RAD1(ID)
|
|
D0=WF*ABSO1(ID)*ALI1(ID)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1+E0*DABN1(ID)
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
IF(IFALI.GE.7) THEN
|
|
D0P=WF*ABSO1(ID)*ALIP1(ID)
|
|
HEITP(ID)=HEITP(ID)+D0P*DSFT1P
|
|
HEINP(ID)=HEINP(ID)+D0P*DSFN1P
|
|
DO II=1,NLVEXP
|
|
HEIPP(II,ID)=HEIPP(II,ID)+D0P*DSFP1P(II)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
c
|
|
c Differential equation part of radiative equilibrium
|
|
c
|
|
FLFIX(ID)=FLFIX(ID)+WF*RAD1(ID)-WW*HEXTRD(IJ)
|
|
IF(REDIF(ID).GT.0.) THEN
|
|
WF=WF*ALI1(ID)
|
|
REDT(ID)=REDT(ID)+WF*DSFT1
|
|
REDN(ID)=REDN(ID)+WF*DSFN1
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+WF*DSFP1(II)
|
|
END DO
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
if(ilmcor.ne.3) then
|
|
if(ilasct.eq.0) then
|
|
ABST=ABSO1(ID)-ELSCAT(ID)
|
|
WWK=WW*ABST
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABST*RAD1(ID))
|
|
D0=WW*(ALI1(ID)-UN)*ABST
|
|
E0=WW*(RAD1(ID)-S0)
|
|
REIN(ID)=REIN(ID)+D0*DSFN1+E0*(DABN1(ID)-SIGEC(IJ))
|
|
else
|
|
SRH=SIGE*DENS1(ID)
|
|
ABST=ABSO1(ID)
|
|
ABSTE=ABST-ELSCAT(ID)
|
|
WWK=WW*ABST
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABSTE*RAD1(ID))
|
|
D0=WW*(ABSTE*ALI1(ID)-ABST)
|
|
E0=WW*(RAD1(ID)-S0)
|
|
REIN(ID)=REIN(ID)+D0*DSFN1+E0*DABN1(ID)-WW*SIGEC(IJ)*RAD1(ID)
|
|
end if
|
|
REIT(ID)=REIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
else
|
|
abst=abso1(id)-elscat(id)
|
|
d0=abst*ali1(id)
|
|
fcooli(id)=fcooli(id)+ww*(emis1(id)-abst*rad1(id))
|
|
rein(id)=rein(id)+ww*(d0*dsfn1+
|
|
* rad1(id)*(dabn1(id)-sigeC(IJ))-demn1(id))
|
|
do ii=1,nlvexp
|
|
reip(ii,id)=reip(ii,id)+ww*(d0*dsfp1(ii)+
|
|
* rad1(id)*dabp1(ii,id)-demp1(ii,id))
|
|
end do
|
|
reit(id)=reit(id)+ww*(d0*dsft1+
|
|
* rad1(id)*dabt1(id)-demt1(id))
|
|
end if
|
|
c
|
|
c the following are needed only for tridiagonal Lambda^star
|
|
C
|
|
C Upper sub-diagonal band
|
|
C
|
|
WWKC=WWK*ALIP1(ID)
|
|
CREIT(ID)=CREIT(ID)+WWKC*DSFT1P
|
|
CREIN(ID)=CREIN(ID)+WWKC*DSFN1P
|
|
DO II=1,NLVEXP
|
|
CREIP(II,ID)=CREIP(II,ID)+WWKC*DSFP1P(II)
|
|
END DO
|
|
END IF
|
|
|
|
C
|
|
c ****2. loop over depths
|
|
c
|
|
DO ID=2,ND-1
|
|
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
|
|
DSFTMM=DSFT1M
|
|
DSFNMM=DSFN1M
|
|
DO II=1,NLVEXP
|
|
DSFPMM(II)=DSFP1M(II)
|
|
END DO
|
|
DSFT1M=DSFT1
|
|
DSFN1M=DSFN1
|
|
DO II=1,NLVEXP
|
|
DSFP1M(II)=DSFP1(II)
|
|
END DO
|
|
S0=S0P
|
|
DSFT1=DSFT1P
|
|
DSFN1=DSFN1P
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1P(II)
|
|
END DO
|
|
|
|
EMISIP=UN/EMIS1(ID+1)
|
|
if(ilmcor.ne.3) then
|
|
if(ilasct.eq.0) then
|
|
ABSTP=UN/(ABSO1(ID+1)-ELSCAT(ID+1))
|
|
S0P=EMIS1(ID+1)*ABSTP
|
|
DSFN1P=S0P*(DEMN1(ID+1)*EMISIP-(DABN1(ID+1)-SIGEC(IJ))*ABSTP)
|
|
else
|
|
ABSTP=UN/ABSO1(ID+1)
|
|
S0P=EMIS1(ID+1)*ABSTP
|
|
DSFN1P=S0P*(DEMN1(ID+1)*EMISIP-DABN1(ID+1)*ABSTP)
|
|
end if
|
|
DSFT1P=S0P*(DEMT1(ID+1)*EMISIP-DABT1(ID+1)*ABSTP)
|
|
DO II=1,NLVEXP
|
|
DSFP1P(II)=S0P*(DEMP1(II,ID+1)*EMISIP-DABP1(II,ID+1)*ABSTP)
|
|
END DO
|
|
else
|
|
abstp=un/abso1(id+1)
|
|
s0p=emis1(id+1)*abstp
|
|
scp=elec(id+1)*sigeC(IJ)
|
|
sctp=scp*abstp
|
|
stp=s0p+sctp*rad1(id+1)
|
|
corrp=un/(un-ali1(id+1)*sctp)
|
|
dsft1p=corrp*(s0p*demt1(id+1)*emisip-stp*dabt1(id+1)*abstp)
|
|
dsfn1p=corrp*(s0p*demn1(id+1)*emisip+sigeC(IJ)*rad1(id+1)*abstp-
|
|
* stp*dabn1(id+1)*abstp)
|
|
do ii=1,nlvexp
|
|
dsfp1p(ii)=corrp*(s0p*demp1(ii,id+1)*emisip-
|
|
* stp*dabp1(ii,id+1)*abstp)
|
|
end do
|
|
end if
|
|
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
END DO
|
|
END IF
|
|
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDTM(ID)=DSFT1M*ALIM1(ID)
|
|
DSFDNM(ID)=DSFN1M*ALIM1(ID)
|
|
DSFDTP(ID)=DSFT1P*ALIP1(ID)
|
|
DSFDNP(ID)=DSFN1P*ALIP1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDPM(II,ID)=DSFP1M(II)*ALIM1(ID)
|
|
DSFDPP(II,ID)=DSFP1P(II)*ALIP1(ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Hydrostatic equilibrium equation
|
|
c
|
|
IF(LNSKIP) THEN
|
|
D0=WW*FAK1(ID)
|
|
A0=WW*FAK1(ID-1)
|
|
FPRD(ID)=FPRD(ID)+D0*RAD1(ID)-A0*RAD1(ID-1)
|
|
F0=D0*ALIP1(ID)
|
|
E0=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1
|
|
HEITM(ID)=HEITM(ID)+E0*DSFT1M
|
|
HEINM(ID)=HEINM(ID)+E0*DSFN1M
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)
|
|
HEIPM(II,ID)=HEIPM(II,ID)+E0*DSFP1M(II)
|
|
END DO
|
|
IF(IFALI.GE.7) THEN
|
|
HEITP(ID)=HEITP(ID)+F0*DSFT1P
|
|
HEINP(ID)=HEINP(ID)+F0*DSFN1P
|
|
DO II=1,NLVEXP
|
|
HEIPP(II,ID)=HEIPP(II,ID)+F0*DSFP1P(II)
|
|
END DO
|
|
A0M=A0*ALIM1(ID-1)
|
|
EHET(ID)=EHET(ID)-A0M*DSFTMM
|
|
EHEN(ID)=EHEN(ID)-A0M*DSFNMM
|
|
DO II=1,NLVEXP
|
|
EHEP(II,ID)=EHEP(II,ID)-A0M*DSFPMM(II)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
C
|
|
C Differential equation part of radiative equilibrium
|
|
C
|
|
DDT=UN/(ABSOT(ID)+ABSOT(ID-1))
|
|
DT=DDT/DELDMZ(ID-1)
|
|
FL=(RAD1(ID)*FAK1(ID)-RAD1(ID-1)*FAK1(ID-1))*DT
|
|
FLFIX(ID)=FLFIX(ID)+WW*FL
|
|
IF(REDIF(ID).GT.0) THEN
|
|
D0=WW*FAK1(ID)*DT
|
|
A0=WW*FAK1(ID-1)*DT
|
|
D0M=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0P=D0*ALIP1(ID)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
E0=WW*FL*DDT
|
|
REDX(ID)=REDX(ID)+E0*ABSO1(ID)
|
|
REDXM(ID)=REDXM(ID)+E0*ABSO1(ID-1)
|
|
E0M=E0*DENSI(ID-1)
|
|
E0=E0*DENSI(ID)
|
|
REDT(ID)=REDT(ID)+D0*DSFT1-E0*DABT1(ID)
|
|
REDTM(ID)=REDTM(ID)+D0M*DSFT1M-E0M*DABT1(ID-1)
|
|
REDN(ID)=REDN(ID)+D0*DSFN1-E0*DABN1(ID)
|
|
REDNM(ID)=REDNM(ID)+D0M*DSFN1M-E0M*DABN1(ID-1)
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+D0*DSFP1(II)-E0*DABP1(II,ID)
|
|
REDPM(II,ID)=REDPM(II,ID)+D0M*DSFP1M(II)-
|
|
* E0M*DABP1(II,ID-1)
|
|
END DO
|
|
IF(IFALI.GE.7) THEN
|
|
REDTP(ID)=REDTP(ID)+D0P*DSFT1M
|
|
REDNP(ID)=REDNP(ID)+D0P*DSFN1M
|
|
DO II=1,NLVEXP
|
|
REDPP(II,ID)=REDPP(II,ID)+D0P*DSFP1P(II)
|
|
END DO
|
|
A0M=A0*ALIM1(ID-1)
|
|
ERET(ID)=ERET(ID)-A0M*DSFTMM
|
|
EREN(ID)=EREN(ID)-A0M*DSFNMM
|
|
DO II=1,NLVEXP
|
|
EREP(II,ID)=EREP(II,ID)-A0M*DSFPMM(II)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
if(ilmcor.ne.3) then
|
|
if(ilasct.eq.0) then
|
|
ABST=ABSO1(ID)-ELSCAT(ID)
|
|
WWK=WW*ABST
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABST*RAD1(ID))
|
|
D0=WW*(ALI1(ID)-UN)*ABST
|
|
E0=WW*(RAD1(ID)-S0)
|
|
REIN(ID)=REIN(ID)+D0*DSFN1+E0*(DABN1(ID)-SIGEC(IJ))
|
|
else
|
|
SRH=SIGE*DENS1(ID)
|
|
ABST=ABSO1(ID)
|
|
ABSTE=ABST-ELSCAT(ID)
|
|
WWK=WW*ABST
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABSTE*RAD1(ID))
|
|
D0=WW*(ABSTE*ALI1(ID)-ABST)
|
|
E0=WW*(RAD1(ID)-S0)
|
|
REIN(ID)=REIN(ID)+D0*DSFN1+E0*DABN1(ID)-
|
|
* WW*SIGE*RAD1(ID)
|
|
end if
|
|
REIT(ID)=REIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
else
|
|
abst=abso1(id)-elscat(id)
|
|
d0=abst*ali1(id)
|
|
fcooli(id)=fcooli(id)+ww*(emis1(id)-abst*rad1(id))
|
|
rein(id)=rein(id)+ww*(d0*dsfn1+
|
|
* rad1(id)*(dabn1(id)-sige)-demn1(id))
|
|
do ii=1,nlvexp
|
|
reip(ii,id)=reip(ii,id)+ww*(d0*dsfp1(ii)+
|
|
* rad1(id)*dabp1(ii,id)-demp1(ii,id))
|
|
end do
|
|
reit(id)=reit(id)+ww*(d0*dsft1+
|
|
* rad1(id)*dabt1(id)-demt1(id))
|
|
end if
|
|
c
|
|
c the following are needed only for tridiagonal Lambda^star
|
|
C
|
|
C Lower sub-diagonal band
|
|
C
|
|
WWKA=WWK*ALIM1(ID)
|
|
AREIT(ID)=AREIT(ID)+WWKA*DSFT1M
|
|
AREIN(ID)=AREIN(ID)+WWKA*DSFN1M
|
|
DO II=1,NLVEXP
|
|
AREIP(II,ID)=AREIP(II,ID)+WWKA*DSFP1M(II)
|
|
END DO
|
|
C
|
|
C Upper sub-diagonal band
|
|
C
|
|
WWKC=WWK*ALIP1(ID)
|
|
CREIT(ID)=CREIT(ID)+WWKC*DSFT1P
|
|
CREIN(ID)=CREIN(ID)+WWKC*DSFN1P
|
|
DO II=1,NLVEXP
|
|
CREIP(II,ID)=CREIP(II,ID)+WWKC*DSFP1P(II)
|
|
END DO
|
|
END IF
|
|
|
|
END DO
|
|
|
|
C
|
|
c ****3. deepest point - ID=ND
|
|
c
|
|
ID=ND
|
|
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
|
|
DSFTMM=DSFT1M
|
|
DSFNMM=DSFN1M
|
|
DO II=1,NLVEXP
|
|
DSFPMM(II)=DSFP1M(II)
|
|
END DO
|
|
DSFT1M=DSFT1
|
|
DSFN1M=DSFN1
|
|
DO II=1,NLVEXP
|
|
DSFP1M(II)=DSFP1(II)
|
|
END DO
|
|
S0=S0P
|
|
DSFT1=DSFT1P
|
|
DSFN1=DSFN1P
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1P(II)
|
|
END DO
|
|
C
|
|
C Improved lower boundary condition
|
|
C
|
|
IF(IBC.GT.0.AND.IDISK.EQ.0) THEN
|
|
DT=UN/(DELDMZ(ID-1)*(ABSOT(ID)+ABSOT(ID-1)))
|
|
PLAD=XKFB(ID)/XKF1(ID)
|
|
DBDT=PLAD/XKF1(ID)*HKT21(ID)*FREQ(IJ)*DT
|
|
IF(IBC.EQ.1) THEN
|
|
DSFT1=DSFT1+DBDT
|
|
ELSE IF(IBC.GE.2) THEN
|
|
PLAM=XKFB(ID-1)/XKF1(ID-1)
|
|
TAU23=T23*DT
|
|
TAU43=T43*DT
|
|
D0=(PLAD*(UN+TAU43)-T43*PLAM*DT)*DT*DT
|
|
RHD=DELDMZ(ID-1)*DENSI(ID)
|
|
E0=D0*RHD
|
|
DSFT1=DSFT1+DBDT*(UN+TAU23)-E0*DABT1(ID)
|
|
DSFN1=DSFN1-E0*(DABN1(ID)+ABSO1(ID)*DENSIM(ID))
|
|
DO II=1,NLVEXP
|
|
DSFP1(II)=DSFP1(II)-E0*DABP1(II,ID)
|
|
END DO
|
|
IF(IBC.GE.3) THEN
|
|
DBDTM=PLAM/XKF1(ID-1)*HKT21(ID-1)*FREQ(IJ)*DT
|
|
RHD=DELDMZ(ID-1)*DENSI(ID-1)
|
|
E0=D0*RHD
|
|
DSFT1D=-DBDTM*DT*T23-E0*DABT1(ID-1)
|
|
DSFN1D=-E0*(DABN1(ID-1)+ABSO1(ID-1)*DENSIM(ID-1))
|
|
DO II=1,NLVEXP
|
|
DSFP1D(II)=-E0*DABP1(II,ID-1)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
END IF
|
|
C
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDT(ID)=DSFT1*ALI1(ID)
|
|
DSFDN(ID)=DSFN1*ALI1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDP(II,ID)=DSFP1(II)*ALI1(ID)
|
|
END DO
|
|
END IF
|
|
|
|
IF(IRDER.EQ.1.OR.IRDER.EQ.3) THEN
|
|
DSFDTM(ID)=DSFT1M*ALIM1(ID)
|
|
DSFDNM(ID)=DSFN1M*ALIM1(ID)
|
|
DSFDTP(ID)=DSFT1P*ALIP1(ID)
|
|
DSFDNP(ID)=DSFN1P*ALIP1(ID)
|
|
END IF
|
|
IF(IRDER.GT.1) THEN
|
|
DO II=1,NLVEXP
|
|
DSFDPM(II,ID)=DSFP1M(II)*ALIM1(ID)
|
|
DSFDPP(II,ID)=DSFP1P(II)*ALIP1(ID)
|
|
END DO
|
|
END IF
|
|
c
|
|
c Hydrostatic equilibrium equation
|
|
c
|
|
IF(LNSKIP) THEN
|
|
D0=WW*FAK1(ID)
|
|
A0=WW*FAK1(ID-1)
|
|
FPRD(ID)=FPRD(ID)+D0*RAD1(ID)-A0*RAD1(ID-1)
|
|
F0=D0*ALIP1(ID)
|
|
E0=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
HEIT(ID)=HEIT(ID)+D0*DSFT1
|
|
HEIN(ID)=HEIN(ID)+D0*DSFN1
|
|
HEITM(ID)=HEITM(ID)+E0*DSFT1M
|
|
HEINM(ID)=HEINM(ID)+E0*DSFN1M
|
|
DO II=1,NLVEXP
|
|
HEIP(II,ID)=HEIP(II,ID)+D0*DSFP1(II)
|
|
HEIPM(II,ID)=HEIPM(II,ID)+E0*DSFP1M(II)
|
|
END DO
|
|
IF(IFALI.GE.7) THEN
|
|
HEITP(ID)=HEITP(ID)+F0*DSFT1P
|
|
HEINP(ID)=HEINP(ID)+F0*DSFN1P
|
|
DO II=1,NLVEXP
|
|
HEIPP(II,ID)=HEIPP(II,ID)+F0*DSFP1P(II)
|
|
END DO
|
|
A0M=A0*ALIM1(ID-1)
|
|
EHET(ID)=EHET(ID)-A0M*DSFTMM
|
|
EHEN(ID)=EHEN(ID)-A0M*DSFNMM
|
|
DO II=1,NLVEXP
|
|
EHEP(II,ID)=EHEP(II,ID)-A0M*DSFPMM(II)
|
|
END DO
|
|
END IF
|
|
IF(IBC.GE.3) THEN
|
|
HEITM(ID)=HEITM(ID)-D0*DSFT1D
|
|
HEINM(ID)=HEINM(ID)-D0*DSFN1D
|
|
DO II=1,NLVEXP
|
|
HEIPM(II,ID)=HEIPM(II,ID)-D0*DSFP1D(II)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
C
|
|
C Differential equation part of radiative equilibrium
|
|
C
|
|
DDT=UN/(ABSOT(ID)+ABSOT(ID-1))
|
|
DT=DDT/DELDMZ(ID-1)
|
|
FL=(RAD1(ID)*FAK1(ID)-RAD1(ID-1)*FAK1(ID-1))*DT
|
|
FLFIX(ID)=FLFIX(ID)+WW*FL
|
|
IF(REDIF(ID).GT.0) THEN
|
|
D0=WW*FAK1(ID)*DT
|
|
A0=WW*FAK1(ID-1)*DT
|
|
D0M=D0*ALIM1(ID)-A0*ALI1(ID-1)
|
|
D0P=D0*ALIP1(ID)
|
|
D0=D0*ALI1(ID)-A0*ALIP1(ID-1)
|
|
E0=WW*FL*DDT
|
|
REDX(ID)=REDX(ID)+E0*ABSO1(ID)
|
|
REDXM(ID)=REDXM(ID)+E0*ABSO1(ID-1)
|
|
E0M=E0*DENSI(ID-1)
|
|
E0=E0*DENSI(ID)
|
|
REDT(ID)=REDT(ID)+D0*DSFT1-E0*DABT1(ID)
|
|
REDTM(ID)=REDTM(ID)+D0M*DSFT1M-E0M*DABT1(ID-1)
|
|
REDN(ID)=REDN(ID)+D0*DSFN1-E0*DABN1(ID)
|
|
REDNM(ID)=REDNM(ID)+D0M*DSFN1M-E0M*DABN1(ID-1)
|
|
DO II=1,NLVEXP
|
|
REDP(II,ID)=REDP(II,ID)+D0*DSFP1(II)-E0*DABP1(II,ID)
|
|
REDPM(II,ID)=REDPM(II,ID)+D0M*DSFP1M(II)-
|
|
* E0M*DABP1(II,ID-1)
|
|
END DO
|
|
IF(IFALI.GE.7) THEN
|
|
REDTP(ID)=REDTP(ID)+D0P*DSFT1M
|
|
REDNP(ID)=REDNP(ID)+D0P*DSFN1M
|
|
DO II=1,NLVEXP
|
|
REDPP(II,ID)=REDPP(II,ID)+D0P*DSFP1P(II)
|
|
END DO
|
|
A0M=A0*ALIM1(ID-1)
|
|
ERET(ID)=ERET(ID)-A0M*DSFTMM
|
|
EREN(ID)=EREN(ID)-A0M*DSFNMM
|
|
DO II=1,NLVEXP
|
|
EREP(II,ID)=EREP(II,ID)-A0M*DSFPMM(II)
|
|
END DO
|
|
END IF
|
|
IF(IBC.GE.3) THEN
|
|
REDTM(ID)=REDTM(ID)+D0*DSFT1D
|
|
REDNM(ID)=REDNM(ID)+D0*DSFN1D
|
|
DO II=1,NLVEXP
|
|
REDPM(II,ID)=REDPM(II,ID)+D0*DSFP1D(II)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
c
|
|
C Integral equation part of the radiative equilibrium
|
|
C
|
|
IF(REINT(ID).GT.0) THEN
|
|
if(ilmcor.ne.3) then
|
|
if(ilasct.eq.0) then
|
|
ABST=ABSO1(ID)-ELSCAT(ID)
|
|
WWK=WW*ABST
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABST*RAD1(ID))
|
|
D0=WW*(ALI1(ID)-UN)*ABST
|
|
E0=WW*(RAD1(ID)-S0)
|
|
REIN(ID)=REIN(ID)+D0*DSFN1+E0*(DABN1(ID)-SIGEC(IJ))
|
|
else
|
|
SRH=SIGE*DENS1(ID)
|
|
ABST=ABSO1(ID)
|
|
ABSTE=ABST-ELSCAT(ID)
|
|
WWK=WW*ABST
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABSTE*RAD1(ID))
|
|
D0=WW*(ABSTE*ALI1(ID)-ABST)
|
|
E0=WW*(RAD1(ID)-S0)
|
|
REIN(ID)=REIN(ID)+D0*DSFN1+E0*DABN1(ID)-WW*SIGEC(IJ)*RAD1(ID)
|
|
end if
|
|
IF(IBC.EQ.0) THEN
|
|
REIT(ID)=REIT(ID)+D0*DSFT1+E0*DABT1(ID)
|
|
ELSE
|
|
REIT(ID)=REIT(ID)+D0*(DSFT1-DBDT)+E0*DABT1(ID)+
|
|
* ALI1(ID)/ABST*DBDT
|
|
END IF
|
|
DO II=1,NLVEXP
|
|
REIP(II,ID)=REIP(II,ID)+D0*DSFP1(II)+E0*DABP1(II,ID)
|
|
END DO
|
|
else
|
|
abst=abso1(id)-elscat(id)
|
|
d0=abst*ali1(id)
|
|
fcooli(id)=fcooli(id)+ww*(emis1(id)-abst*rad1(id))
|
|
rein(id)=rein(id)+ww*(d0*dsfn1+
|
|
* rad1(id)*(dabn1(id)-sigeC(IJ))-demn1(id))
|
|
do ii=1,nlvexp
|
|
reip(ii,id)=reip(ii,id)+ww*(d0*dsfp1(ii)+
|
|
* rad1(id)*dabp1(ii,id)-demp1(ii,id))
|
|
end do
|
|
if(ibc.eq.0) then
|
|
reit(id)=reit(id)+ww*(d0*dsft1+
|
|
* rad1(id)*dabt1(id)-demt1(id))
|
|
else
|
|
reit(id)=reit(id)+ww*(d0*(dsft1-dbdt)+e0*dabt1(id)+
|
|
* rad1(id)*dabt1(id)-demt1(id)+
|
|
* ali1(id)/abst*dbdt)
|
|
end if
|
|
end if
|
|
c
|
|
c the following are needed only for tridiagonal Lambda^star
|
|
C
|
|
C Lower sub-diagonal band
|
|
C
|
|
WWKA=WWK*ALIM1(ID)
|
|
AREIT(ID)=AREIT(ID)+WWKA*DSFT1M
|
|
AREIN(ID)=AREIN(ID)+WWKA*DSFN1M
|
|
DO II=1,NLVEXP
|
|
AREIP(II,ID)=AREIP(II,ID)+WWKA*DSFP1M(II)
|
|
END DO
|
|
END IF
|
|
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE ALIFRK(IJ)
|
|
C =====================
|
|
C
|
|
C Simplified routine ALIFR1 for a Kantorovich iteration
|
|
C
|
|
C hydrostatic and radiative equilibrium quantities -
|
|
C derivatives of the total heating and cooling rates in the
|
|
C ALI points with respect to the
|
|
C temperature, electron density, and populations
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
DIMENSION WFL(MDEPTH)
|
|
C
|
|
if(ifali.le.1) return
|
|
WW=WC(IJ)
|
|
|
|
c **** Special expressions for the first depth - id=1
|
|
|
|
ID=1
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
WF=WW*(FH(IJ)*RAD1(ID)-HEXTRD(IJ))
|
|
IF(LNSKIP) FPRD(ID)=FPRD(ID)+WF*ABSO1(ID)
|
|
FLFIX(ID)=FLFIX(ID)+WF
|
|
FLRD(ID)=FLRD(ID)+W(IJ)*(FH(IJ)*RAD1(ID)-HALF*EXTRAD(IJ))
|
|
IF(REINT(ID).GT.0) THEN
|
|
ABST=ABSO1(ID)-SCAT1(ID)
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABST*RAD1(ID))
|
|
END IF
|
|
|
|
c Loop over depths
|
|
|
|
DO ID=2,ND
|
|
LNSKIP=.NOT.LSKIP(ID,IJ)
|
|
DT=UN/((ABSOT(ID)+ABSOT(ID-1))*DELDMZ(ID-1))
|
|
FL=RAD1(ID)*FAK1(ID)-RAD1(ID-1)*FAK1(ID-1)
|
|
WFL(ID)=WW*FL
|
|
IF(LNSKIP) FPRD(ID)=FPRD(ID)+WFL(ID)
|
|
FLFIX(ID)=FLFIX(ID)+WFL(ID)*DT
|
|
FLRD(ID)=FLRD(ID)+FL*W(IJ)*DT
|
|
IF(REINT(ID).GT.0) THEN
|
|
ABST=ABSO1(ID)-SCAT1(ID)
|
|
FCOOLI(ID)=FCOOLI(ID)+WW*(EMIS1(ID)-ABST*RAD1(ID))
|
|
END IF
|
|
END DO
|
|
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE EMAT(ID)
|
|
C ===================
|
|
C
|
|
C Auxiliary procedure for SOLVE
|
|
C
|
|
C sub-sub-diagonal band matrix E
|
|
C
|
|
C Input: ID - depth index
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
C
|
|
IF(IFALI.LE.7) RETURN
|
|
|
|
IF(ID.LE.2) RETURN
|
|
NSE=NFREQE+INSE-1
|
|
IF(INHE.GT.0) THEN
|
|
NHE=NFREQE+INHE
|
|
IF(INRE.GT.0) E(NHE,NFREQE+INRE)=EHET(ID)*PCK
|
|
IF(INPC.GT.0) E(NHE,NFREQE+INPC)=EHEN(ID)*PCK
|
|
DO II=1,NLVEXP
|
|
E(NHE,NSE+II)=EHEP(II,ID)*PCK
|
|
END DO
|
|
END IF
|
|
C
|
|
IF(INRE.GT.0.AND.REDIF(ID).GT.0.) THEN
|
|
NRE=NFREQE+INRE
|
|
IF(INRE.GT.0) E(NRE,NRE)=ERET(ID)*REDIF(ID)
|
|
IF(INPC.GT.0) E(NRE,NFREQE+INPC)=EREN(ID)*REDIF(ID)
|
|
DO II=1,NLVEXP
|
|
E(NRE,NSE+II)=EREP(II,ID)*REDIF(ID)
|
|
END DO
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE RHSGEN(ID)
|
|
C =====================
|
|
C
|
|
C Auxiliary procedure for SOLVE
|
|
C controls evaluation of rhs vector when
|
|
C matrices A,B, and C are kept fixed.
|
|
C
|
|
C Input: ID - depth index
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
PARAMETER (XCON=8.0935D-21,YCON=1.68638E-10)
|
|
PARAMETER (SIXTH=UN/6.D0,
|
|
* THIRD=UN/3.D0)
|
|
C DIMENSION AJ(MLEVEL)
|
|
DIMENSION POPP(MLEVEL)
|
|
COMMON/CUBCON/ACNV,BCNV,DEL,GRDADB,DELMDE,RHO,FLXTOT,GRAVD
|
|
C
|
|
ispl=isplin
|
|
if(isplin.ge.5) isplin=isplin-5
|
|
IJ1=1
|
|
C
|
|
C in the case of Compton scattering - boundary condition
|
|
C for the highest frequency
|
|
C
|
|
if(icompt.gt.0.and.icombc.gt.0.and.ijex(1).gt.0) then
|
|
IJ1=2
|
|
ij=1
|
|
iji=nfreq
|
|
zj1=exp(-hk*freq(ij)/temp(id))
|
|
zj2=exp(-hk*freq(ij+1)/temp(id))
|
|
dlt=delj(iji-1,id)
|
|
if(ichcoo.eq.0) then
|
|
zj0=un/(hk*sqrt(freq(ij)*freq(ij+1))/temp(id))
|
|
zxx=un-3.*zj0+(un-dlt)*zj1+dlt*zj2
|
|
combid=zj0/dlnfr(iji-1)+(un-dlt)*zxx
|
|
comaid=-zj0/dlnfr(iji-1)+dlt*zxx
|
|
else
|
|
e2=ycon*temp(id)
|
|
zxx0=xcon*freq(ij)*(un+zj1)-3.*e2
|
|
zxxm=xcon*freq(ij+1)*(un+zj2)-3.*e2
|
|
zxx=(un-dlt)*zxx0+dlt*zxxm
|
|
combid=e2/dlnfr(iji-1)+(un-dlt)*zxx
|
|
comaid=-e2/dlnfr(iji-1)+dlt*zxx
|
|
end if
|
|
vecl(ij)=-combid*rad(iji,id)-comaid*rad(iji-1,id)
|
|
end if
|
|
C
|
|
C evaluation of the opacity, emissivity, scattering, and
|
|
C their derivatives, at the current depth point ID;
|
|
C
|
|
DO I=1,NN
|
|
PSI0(I)=PSY0(I,ID)
|
|
END DO
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
WDEP0(IJ)=W(IJT)
|
|
RAD0(IJ)=RADEX(IJ,ID)
|
|
FK0(IJ)=FAKEX(IJ,ID)
|
|
ABSO0(IJ)=ABSOEX(IJ,ID)
|
|
EMIS0(IJ)=EMISEX(IJ,ID)
|
|
SCAT0(IJ)=SCATEX(IJ,ID)
|
|
END DO
|
|
END IF
|
|
C
|
|
IF(ID.GT.1) THEN
|
|
DO I=1,NN
|
|
PSIM(I)=PSY0(I,ID-1)
|
|
END DO
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
RADM(IJ)=RADEX(IJ,ID-1)
|
|
FKM(IJ)=FAKEX(IJ,ID-1)
|
|
ABSOM(IJ)=ABSOEX(IJ,ID-1)
|
|
EMISM(IJ)=EMISEX(IJ,ID-1)
|
|
SCATM(IJ)=SCATEX(IJ,ID-1)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
C
|
|
IF(ID.LT.ND) THEN
|
|
DO I=1,NN
|
|
PSIP(I)=PSY0(I,ID+1)
|
|
END DO
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
RADP(IJ)=RADEX(IJ,ID+1)
|
|
FKP(IJ)=FAKEX(IJ,ID+1)
|
|
ABSOP(IJ)=ABSOEX(IJ,ID+1)
|
|
EMISP(IJ)=EMISEX(IJ,ID+1)
|
|
SCATP(IJ)=SCATEX(IJ,ID+1)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
c
|
|
C
|
|
C ------------------------------------------------------------
|
|
C Actual evaluation of the rhs vector VECL
|
|
C ------------------------------------------------------------
|
|
C
|
|
DO I=1,NN
|
|
VECL(I)=0.
|
|
END DO
|
|
C
|
|
IF(NFREQE.LE.0) GO TO 100
|
|
C
|
|
C -----------------------------------------------------------
|
|
C 1. Radiative transfer components
|
|
C -----------------------------------------------------------
|
|
C
|
|
C For ID = 1 - upper boundary condition
|
|
C
|
|
IF(ID.GT.1) GO TO 50
|
|
DDP=DELDMZ(1)
|
|
DO IJ=1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
IF(IZSCAL.EQ.0) THEN
|
|
OMEG0=ABSO0(IJ)/DENS(ID)
|
|
OMEGP=ABSOP(IJ)/DENS(ID+1)
|
|
ELSE
|
|
OMEG0=ABSO0(IJ)
|
|
OMEGP=ABSOP(IJ)
|
|
END IF
|
|
DZP=OMEG0+OMEGP
|
|
DTAUP=DZP*DDP
|
|
ALF1=(FK0(IJ)*RAD0(IJ)-FKP(IJ)*RADP(IJ))/DTAUP
|
|
CHIEL0=SCAT0(IJ)
|
|
CHIELP=SCATP(IJ)
|
|
S0=(EMIS0(IJ)+CHIEL0*RAD0(IJ))/ABSO0(IJ)
|
|
BS=HALF*DTAUP
|
|
CS=0.
|
|
C2=0.
|
|
SP=0.
|
|
BET2=0.
|
|
GAM2=0.
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.0) then
|
|
call compt0(ijt,id,abso0(ij),cma,cmb,cmc,cme,cms,cmd)
|
|
s0=s0+cms
|
|
end if
|
|
C
|
|
IF(ISPLIN.GT.0) THEN
|
|
C
|
|
C Spline collocation and/or Hermitian method (ISPLIN=1 or 2) -
|
|
C both give the same expression for the boundary conditions
|
|
C
|
|
BS=DTAUP*THIRD
|
|
CS=HALF*BS
|
|
SP=(EMISP(IJ)+CHIELP*RADP(IJ))/ABSOP(IJ)
|
|
C2=CS/ABSOP(IJ)
|
|
GAM2=CS*(RADP(IJ)-SP)
|
|
END IF
|
|
C
|
|
C auxiliary quantities
|
|
C
|
|
ALF2=BS*(RAD0(IJ)-S0)
|
|
BET2=ALF2+GAM2
|
|
C
|
|
C *** the IJ-th element of the rhs vector
|
|
C
|
|
VECL(IJ)=ALF1+BET2+FH(IJT)*RAD0(IJ)-S0*Q0(IJT)
|
|
IF(IWINBL.LT.0) VECL(IJ)=VECL(IJ)-HEXTRD(IJT)
|
|
C
|
|
END DO
|
|
GO TO 100
|
|
C
|
|
C For 1 < ID < ND - normal depth point
|
|
C
|
|
50 DDM=DELDMZ(ID-1)
|
|
IF(ID.EQ.ND) GO TO 80
|
|
DDP=DELDMZ(ID)
|
|
DO IJ=1,NFREQE
|
|
IF(IZSCAL.EQ.0) THEN
|
|
OMEG0=ABSO0(IJ)/DENS(ID)
|
|
OMEGP=ABSOP(IJ)/DENS(ID+1)
|
|
OMEGM=ABSOM(IJ)/DENS(ID-1)
|
|
ELSE
|
|
OMEG0=ABSO0(IJ)
|
|
OMEGP=ABSOP(IJ)
|
|
OMEGM=ABSOM(IJ)
|
|
END IF
|
|
DZP=OMEG0+OMEGP
|
|
DZM=OMEG0+OMEGM
|
|
DTAUP=DZP*DDP
|
|
DTAUM=DZM*DDM
|
|
DTAU0=HALF*(DTAUP+DTAUM)
|
|
FRD=FK0(IJ)*RAD0(IJ)
|
|
ALF1=(FRD-FKP(IJ)*RADP(IJ))/DTAUP/DTAU0
|
|
GAM1=(FRD-FKM(IJ)*RADM(IJ))/DTAUM/DTAU0
|
|
BET1=ALF1+GAM1
|
|
BS=UN
|
|
CHIELM=SCATM(IJ)
|
|
CHIEL0=SCAT0(IJ)
|
|
CHIELP=SCATP(IJ)
|
|
S0=(EMIS0(IJ)+CHIEL0*RAD0(IJ))/ABSO0(IJ)
|
|
BET2=0.
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.0) then
|
|
call compt0(ijt,id,abso0(ij),cma,cmb,cmc,cme,cms,cmd)
|
|
s0=s0+cms
|
|
end if
|
|
C
|
|
IF(ISPLIN.EQ.1) THEN
|
|
C
|
|
C spline collocation (ISPLIN=1)
|
|
C
|
|
AS=DTAUM/DTAU0*SIXTH
|
|
CS=DTAUP/DTAU0*SIXTH
|
|
BS=0.666666666666667D0
|
|
SM=(EMISM(IJ)+RADM(IJ)*CHIELM)/ABSOM(IJ)
|
|
SP=(EMISP(IJ)+RADP(IJ)*CHIELP)/ABSOP(IJ)
|
|
ALF2=AS*(RADM(IJ)-SM)
|
|
GAM2=CS*(RADP(IJ)-SP)
|
|
BET2=ALF2+GAM2
|
|
ELSE IF(ISPLIN.EQ.2) THEN
|
|
C
|
|
C Hermitian method (ISPLIN=2)
|
|
C
|
|
AS=DTAUP*DTAUP/DTAUM/DTAU0
|
|
CS=DTAUM*DTAUM/DTAUP/DTAU0
|
|
SM=(EMISM(IJ)+RADM(IJ)*CHIELM)/ABSOM(IJ)
|
|
SP=(EMISP(IJ)+RADP(IJ)*CHIELP)/ABSOP(IJ)
|
|
AS=(UN-HALF*AS)*SIXTH
|
|
CS=(UN-HALF*CS)*SIXTH
|
|
BS=UN-AS-CS
|
|
BET2=AS*(RADM(IJ)-SM)+CS*(RADP(IJ)-SP)
|
|
END IF
|
|
C
|
|
C *** the IJ-th element of the rhs vector
|
|
C
|
|
VECL(IJ)=BET1+BET2+BS*(RAD0(IJ)-S0)
|
|
C
|
|
END DO
|
|
GO TO 100
|
|
C
|
|
C For ID=ND - lower boundary condition
|
|
C
|
|
80 T=TEMP(ID)
|
|
IF(TEMPBD.GT.0.) T=TEMPBD
|
|
HKT=HK/T
|
|
C
|
|
c the case of stellar atmospheres
|
|
C
|
|
IF(IDISK.EQ.0.OR.IFZ0.LT.0) THEN
|
|
C
|
|
C 1. the case NDRE.le.ND, ie. radiative equilibrium equation at this
|
|
C depth is treated as differential equation.
|
|
C
|
|
C 2. the case NDRE > ND, ie. radiative equilibrium equation at this
|
|
C depth is treated as integral equation.
|
|
C Boundary condition of the transfer equation is then complex,
|
|
C because it has to incorporate the constraint of the total flux
|
|
C equal to SIG4P*Teff**4 (integral form of the radiative
|
|
C equation does not fix the total flux)
|
|
C
|
|
C Details of this approach are presented in Mihalas, Heasley, Auer
|
|
C NCAR-TN/STR-104 (1975).
|
|
C
|
|
C This option is presented here for the sake of continuity with
|
|
C previous work; otherwise the first option (NDRE.le.ND) is
|
|
C recommended due to its better numerical properties
|
|
C
|
|
C auxiliary quantities for the second option
|
|
C
|
|
IF(ID.LT.NDRE.AND.INRE.NE.0) THEN
|
|
SUMB=0.
|
|
SUMF=0.
|
|
DO IJ=1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
FR=FREQ(IJT)
|
|
FR15=FR*1.D-15
|
|
WD=WDEP0(IJ)
|
|
X=HKT*FR
|
|
EX=EXP(X)
|
|
PLAN=BN*FR15*FR15*FR15/(EX-UN)*RRDIL
|
|
DPLAN=PLAN*X/T/(UN-UN/EX)*WD
|
|
SUMB=SUMB+(PLAN-RAD0(IJ))*WD
|
|
FI=DPLAN/ABSO0(IJ)
|
|
SUMF=SUMF+FI
|
|
END DO
|
|
FL=SIG4P*TEFF*TEFF*TEFF*TEFF
|
|
ZZ=(FL-HALF*SUMB)/SUMF
|
|
END IF
|
|
C
|
|
C auxiliary quantities for both options
|
|
C
|
|
DO IJ=1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
CHIELM=SCATM(IJ)
|
|
CHIEL0=SCAT0(IJ)
|
|
IF(IZSCAL.EQ.0) THEN
|
|
OMEG0=ABSO0(IJ)/DENS(ID)
|
|
OMEGM=ABSOM(IJ)/DENS(ID-1)
|
|
ELSE
|
|
OMEG0=ABSO0(IJ)
|
|
OMEGM=ABSOM(IJ)
|
|
END IF
|
|
DZM=OMEG0+OMEGM
|
|
DTAUM=DZM*DDM
|
|
GAM1=(FK0(IJ)*RAD0(IJ)-FKM(IJ)*RADM(IJ))/DTAUM
|
|
BET2=0.
|
|
C
|
|
C second-order boundary condition
|
|
C
|
|
IF(IBC.GT.0.AND.IBC.LT.4) THEN
|
|
BS=DTAUM*HALF
|
|
S0=(EMIS0(IJ)+CHIEL0*RAD0(IJ))/ABSO0(IJ)
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.0) then
|
|
call compt0(ijt,id,abso0(ij),cma,cmb,cmc,cme,cms,cmd)
|
|
s0=s0+cms
|
|
end if
|
|
C
|
|
BET2=BS*(RAD0(IJ)-S0)
|
|
END IF
|
|
C
|
|
FR=FREQ(IJT)
|
|
X=HKT*FR
|
|
EX=EXP(X)
|
|
PLAN=BN*(FR*1.D-15)**3/(EX-UN)*RRDIL
|
|
IF(INRE.EQ.0.OR.ID.GE.NDRE) THEN
|
|
DPLAN=BN*(FR*1.D-15)**3/(EXP(HK*FR/TEMP(ID-1))-UN)
|
|
GAM1=GAM1-(PLAN-DPLAN)/DTAUM*THIRD
|
|
ELSE
|
|
DPLAN=PLAN*X/T/(UN-UN/EX)
|
|
FI=DPLAN/ABSO0(IJ)
|
|
X1=FI*ZZ
|
|
GAM1=GAM1-X1
|
|
END IF
|
|
C
|
|
C *** the IJ-th element of the rhs vector
|
|
C
|
|
IF(IBC.EQ.0.OR.IBC.EQ.4) THEN
|
|
VECL(IJ)=GAM1+BET2-HALF*(PLAN-RAD0(IJ))
|
|
ELSE
|
|
VECL(IJ)=GAM1+BET2-HALF*PLAN+FHD(IJT)*RAD0(IJ)
|
|
END IF
|
|
END DO
|
|
C
|
|
C the case of accretion disks
|
|
C
|
|
ELSE
|
|
C
|
|
DO IJ=IJ1,NFREQE
|
|
CHIELM=SCATM(IJ)
|
|
CHIEL0=SCAT0(IJ)
|
|
IF(IZSCAL.EQ.0) THEN
|
|
OMEG0=ABSO0(IJ)/DENS(ID)
|
|
OMEGM=ABSOM(IJ)/DENS(ID-1)
|
|
ELSE
|
|
OMEG0=ABSO0(IJ)
|
|
OMEGM=ABSOM(IJ)
|
|
END IF
|
|
DZM=OMEG0+OMEGM
|
|
DTAUM=DZM*DDM
|
|
FRD=FK0(IJ)*RAD0(IJ)-FKM(IJ)*RADM(IJ)
|
|
GAM1=FRD/DTAUM
|
|
BS=DTAUM*HALF
|
|
S0=(EMIS0(IJ)+CHIEL0*RAD0(IJ))/ABSO0(IJ)
|
|
GAM2=BS*(RAD0(IJ)-S0)
|
|
C
|
|
C *** the IJ-th element of the rhs vector
|
|
C
|
|
VECL(IJ)=GAM1+GAM2
|
|
END DO
|
|
END IF
|
|
C
|
|
C -----------------------------------------------------------
|
|
C 2. Hydrostatic equilibrium
|
|
C -----------------------------------------------------------
|
|
C
|
|
100 isplin=ispl
|
|
IF(INHE.EQ.0) GO TO 170
|
|
NHE=NFREQE+INHE
|
|
GRD=0.
|
|
C
|
|
IF(ID.EQ.1) THEN
|
|
C
|
|
C Upper boundary condition (ID=1)
|
|
C Basically, linearized eq. (7-10) of Mihalas (1978)
|
|
C
|
|
IF(IDISK.EQ.0.OR.IBCHE.EQ.0) THEN
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
IF(.NOT.LSKIP(ID,IJT)) THEN
|
|
FLUXW=W(IJT)*FH(IJT)*RAD0(IJ)
|
|
GRD=GRD+FLUXW*ABSO0(IJ)
|
|
END IF
|
|
END DO
|
|
END IF
|
|
C
|
|
X1=PCK/DENS(ID)
|
|
VT0=HALF*VTURB(ID)*VTURB(ID)/DM(ID)*WMM(ID)
|
|
C
|
|
C The rhs vector also accounts for the total radiation pressure in
|
|
C the fixed-option transitions (array FPRD, generated by FIXLIN)
|
|
C
|
|
VECL(NHE)=GRAV-BOLK*TEMP(ID)*PSI0(NHE)/DM(ID)-
|
|
* X1*(GRD+FPRD(ID))-VT0/WMM(ID)*DENS(ID)
|
|
C
|
|
ELSE
|
|
IF(IBCHE.EQ.1) THEN
|
|
C
|
|
C specifically disk - newer variant
|
|
C
|
|
CCC=PCK/QGRAV
|
|
HR1=CCC*SIG4P*TEFF**4*ABROSD(1)
|
|
PG1=BOLK*PSI0(NHE)*TEMP(1)
|
|
HG1=SQRT(TWO*PG1/DENS(1)/QGRAV)
|
|
X=(ZD(1)-PR1)/HG1
|
|
IF(X.LT.3.) THEN
|
|
IF(X.LT.0.) X=0.
|
|
F1=8.86226925D-1*EXP(X*X)*ERFCX(X)
|
|
ELSE
|
|
F1=HALF*(UN-HALF/X/X)/X
|
|
END IF
|
|
GGG=DENS(1)*HG1*F1
|
|
VECL(NHE)=DM(1)-GGG
|
|
C
|
|
C specifically disk - older variant
|
|
C
|
|
ELSE IF(IBCHE.EQ.2) THEN
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=IJ1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
IF(.NOT.LSKIP(ID,IJT)) THEN
|
|
FLUXW=W(IJT)*FH(IJT)*RAD0(IJ)
|
|
GRD=GRD+FLUXW*ABSO0(IJ)
|
|
END IF
|
|
END DO
|
|
END IF
|
|
C
|
|
CCC=PCK/QGRAV
|
|
PR1=CCC*(GRD+FPRD(1))/DENS(1)
|
|
PG1=BOLK*PSI0(NHE)*TEMP(1)
|
|
HG1=SQRT(TWO*PG1/DENS(1)/QGRAV)
|
|
X=(ZD(1)-PR1)/HG1
|
|
IF(X.LT.3.) THEN
|
|
IF(X.LT.0.) X=0.
|
|
F1=8.86226925D-1*EXP(X*X)*ERFCX(X)
|
|
ELSE
|
|
F1=HALF*(UN-HALF/X/X)/X
|
|
END IF
|
|
GGG=HG1*QGRAV*HALF/F1
|
|
C
|
|
C The rhs vector
|
|
C
|
|
VECL(NHE)=DM(1)*GGG-PG1
|
|
ELSE
|
|
VECL(NHE)=PGAS0-BOLK*TEMP(1)*PSI0(NHE)
|
|
END IF
|
|
END IF
|
|
C
|
|
ELSE
|
|
C
|
|
C Normal depth point (ID > 1)
|
|
C
|
|
C
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=1,NFREQE
|
|
IF(.NOT.LSKIP(ID,IJFR(IJ)))
|
|
* GRD=GRD+(FK0(IJ)*RAD0(IJ)-FKM(IJ)*RADM(IJ))*W(IJFR(IJ))
|
|
END DO
|
|
END IF
|
|
C
|
|
VT0=HALF*VTURB(ID)*VTURB(ID)*WMM(ID)
|
|
VTM=HALF*VTURB(ID-1)*VTURB(ID-1)*WMM(ID-1)
|
|
C
|
|
C the rhs vector
|
|
C again, which accounts for the total radiation pressure in the
|
|
C fixed-option transitions (array FPRD, generated by FIXLIN)
|
|
C
|
|
IF(IDISK.EQ.1) GRAV=QGRAV*(ZD(ID)+ZD(ID-1))*HALF
|
|
IF(IZSCAL.EQ.0) THEN
|
|
VECL(NHE)=GRAV*(DM(ID)-DM(ID-1))-
|
|
* BOLK*(TEMP(ID)*PSI0(NHE)-TEMP(ID-1)*PSIM(NHE))-
|
|
* PCK*(GRD+FPRD(ID))-
|
|
* VT0/WMM(ID)*DENS(ID)+VTM/WMM(ID-1)*DENS(ID-1)
|
|
ELSE
|
|
GRAVZ=GRAV*(ZD(ID)-ZD(ID-1))
|
|
VECL(NHE)=-GRAVZ*(DENS(ID)+DENS(ID-1))*HALF-
|
|
* BOLK*(TEMP(ID)*PSI0(NHE)-TEMP(ID-1)*PSIM(NHE))-
|
|
* PCK*(GRD+FPRD(ID))-
|
|
* VT0/WMM(ID)*DENS(ID)+VTM/WMM(ID-1)*DENS(ID-1)
|
|
END IF
|
|
END IF
|
|
C
|
|
C -----------------------------------------------------------
|
|
C 2a. z-m relation
|
|
C -----------------------------------------------------------
|
|
C
|
|
170 IF(INZD.LE.0.OR.ID.EQ.ND.OR.IDISK.EQ.0) GO TO 200
|
|
NZD=NFREQE+INZD
|
|
DDP=(DM(ID+1)-DM(ID))*HALF
|
|
VECL(NZD)=ZD(ID+1)-ZD(ID)+DDP/DENS(ID)+DDP/DENS(ID+1)
|
|
C
|
|
C -----------------------------------------------------------
|
|
C 3. Radiative equilibrium
|
|
C -----------------------------------------------------------
|
|
C
|
|
200 IF(INRE.EQ.0) GO TO 250
|
|
NRE=NFREQE+INRE
|
|
c
|
|
ittc=abs(nretc)/100
|
|
if(iter.gt.ittc) then
|
|
if(id.le.mod(abs(nretc),100)) then
|
|
if(nretc.lt.0) vecl(nre)=temp(id+1)-temp(id)
|
|
go to 250
|
|
end if
|
|
end if
|
|
C
|
|
C integral equation part of the radiative
|
|
C equilibrium equation
|
|
C
|
|
C the rhs vector accounts for total net cooling in ALI transitions
|
|
C
|
|
VECL(NRE)=FCOOL(ID)
|
|
IF(IDISK.EQ.1) VECL(NRE)=FCOOL(ID)-TVISC(ID)*reint(id)
|
|
C
|
|
IF(REINT(ID).GT.0.AND.NFREQE.GT.0) THEN
|
|
DO IJ=1,NFREQE
|
|
HEAT=ABSO0(IJ)-SCAT0(IJ)
|
|
VECL(NRE)=VECL(NRE)-
|
|
* (HEAT*RAD0(IJ)-EMIS0(IJ))*WDEP0(IJ)*reint(id)
|
|
c
|
|
c additional terms for Compton scattering
|
|
c
|
|
if(icompt.gt.5) then
|
|
ijt=ijfr(ij)
|
|
call compt0(ijt,id,abso0(ij),cma,cmb,cmc,cme,cms,cmd)
|
|
vecl(nre)=vecl(nre)+abso0(ij)*cms*wdep0(ij)*reint(id)
|
|
end if
|
|
c
|
|
END DO
|
|
END IF
|
|
C
|
|
C
|
|
C differential equation part of the
|
|
C radiative equilibrium equation
|
|
C
|
|
if(redif(id).gt.0) then
|
|
TEFFD=TEFF**4
|
|
IF(IDISK.EQ.1) TEFFD=TEFFD*(UN-THETAV(ID))
|
|
VECL(NRE)=vecl(nre)+SIG4P*TEFFD*redif(id)
|
|
IF(ID.GT.1) THEN
|
|
DDM=(DM(ID)-DM(ID-1))*HALF
|
|
DDM=DELDMZ(ID-1)
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=1,NFREQE
|
|
OMEG0=ABSO0(IJ)*DENSI(ID)
|
|
OMEGM=ABSOM(IJ)*DENSI(ID-1)
|
|
DTAUM=(OMEG0+OMEGM)*DDM
|
|
FRD=FK0(IJ)*RAD0(IJ)-FKM(IJ)*RADM(IJ)
|
|
GAMR=FRD/DTAUM
|
|
VECL(NRE)=VECL(NRE)-WDEP0(IJ)*GAMR*redif(id)
|
|
END DO
|
|
END IF
|
|
ELSE
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
VECL(NRE)=VECL(NRE)-
|
|
* WDEP0(IJ)*FH(IJT)*RAD0(IJ)*REDIF(ID)
|
|
END DO
|
|
END IF
|
|
END IF
|
|
end if
|
|
C
|
|
C -----------------------------------------------------------
|
|
C 4. Statistical equilibrium
|
|
C -----------------------------------------------------------
|
|
C
|
|
250 IF(IABS(IFPOPR).GE.3.and.ifpopr.le.5) THEN
|
|
if(inse.gt.0) then
|
|
NSE=NFREQE+INSE-1
|
|
CALL SABOLF(ID)
|
|
CALL LEVGRP(ID,IIEXP,0,POPP)
|
|
CALL RATMAT(ID,IIEXP,0,ESEMAT,BESE)
|
|
IF(IFPOPR.LE.3) THEN
|
|
CALL MATINV(ESEMAT,NLVEXP,MLEVEL)
|
|
DO I=1,NLVEXP
|
|
SUM=0.
|
|
DO J=1,NLVEXP
|
|
SUM=SUM+ESEMAT(I,J)*BESE(J)
|
|
END DO
|
|
VECL(NSE+I)=POPGRP(I)-SUM
|
|
IF(IGZERO(I,ID).GT.0) VECL(NFREQE+INSE-1+I)=0.
|
|
END DO
|
|
ELSE
|
|
DO I=1,NLVEXP
|
|
SUM=0.
|
|
DO J=1,NLVEXP
|
|
SUM=SUM+ESEMAT(I,J)*POPGRP(J)
|
|
END DO
|
|
VECL(NSE+I)=BESE(I)-SUM
|
|
IF(IGZERO(I,ID).GT.0) VECL(NFREQE+INSE-1+I)=0.
|
|
END DO
|
|
END IF
|
|
end if
|
|
END IF
|
|
C
|
|
C -----------------------------------------------------------
|
|
C 5. charge conservation
|
|
C -----------------------------------------------------------
|
|
C
|
|
IF(INPC.EQ.0) GO TO 400
|
|
NPC=NFREQE+INPC
|
|
C
|
|
C This part is very similar to procedure ELCOR (obviously);
|
|
C array AJ has the meaning of coefficients of the charge conserv.
|
|
C ie. charge conservation is written
|
|
C AJ * (vector of populations) = electron density
|
|
C
|
|
T=TEMP(ID)
|
|
ANE=ELEC(ID)
|
|
CALL STATE(2,ID,T,ANE)
|
|
C
|
|
VPC=QFIX(ID)+Q*DENS(ID)/WMM(ID)/YTOT(ID)
|
|
IF(IOPTAB.EQ.0) VPC=VPC*ABUND(IATREF,ID)
|
|
DO IAT=1,NATOM
|
|
IF(IIFIX(IAT).NE.1) THEN
|
|
DO I=N0A(IAT),NKA(IAT)
|
|
IL=ILK(I)
|
|
CH=IZ(IEL(I))-1
|
|
IF(IL.GT.0) CH=IZ(IL)+(IZ(IL)-1)*ANE*USUMS(IL,ID)
|
|
IF(IMODL(I).GE.0) VPC=VPC+CH*POPUL(I,ID)
|
|
END DO
|
|
END IF
|
|
END DO
|
|
C
|
|
VECL(NPC)=ANE-VPC
|
|
C
|
|
C -----------------------------------------------------------
|
|
C 6. Convection
|
|
C -----------------------------------------------------------
|
|
C
|
|
400 IF(HMIX0.gt.0.) then
|
|
NRE=NFREQE+INRE
|
|
NDEL=NFREQE+INDL
|
|
C
|
|
C Upper boundary condition (ID=1)
|
|
C
|
|
ANEREL=ELEC(1)/(DENS(1)/WMM(1)+ELEC(1))
|
|
IF(ID.EQ.1) THEN
|
|
DELTA(ID)=0.
|
|
FLXC(ID)=0.
|
|
ELSE
|
|
C
|
|
C Normal depth point 1 < ID < ND
|
|
C
|
|
T=TEMP(ID)
|
|
P=PTOTAL(ID)
|
|
PG=PGS(ID)
|
|
PRAD=P-PG-HALF*DENS(ID)*VTURB(ID)**2
|
|
TM=TEMP(ID-1)
|
|
PM=PTOTAL(ID-1)
|
|
PGM=PGS(ID-1)
|
|
PRADM=PM-PGM-HALF*DENS(ID-1)*VTURB(ID-1)**2
|
|
T0=HALF*(T+TM)
|
|
P0=HALF*(P+PM)
|
|
PG0=HALF*(PG+PGM)
|
|
PR0=HALF*(PRAD+PRADM)
|
|
AB0=HALF*(ABROSD(ID)+ABROSD(ID-1))
|
|
DLT=(T-TM)/(P-PM)*P0/T0
|
|
DELTA(ID)=DLT
|
|
IF(INDL.GT.0) VECL(NDEL)=DELTA(ID)-DLT
|
|
IF(IDISK.EQ.1) GRAVD=ZD(ID)*QGRAV
|
|
C
|
|
C convective flux
|
|
C
|
|
CALL CONVEC(ID,T0,P0,PG0,PR0,AB0,DLT,FLXCNV,VCON)
|
|
FLXC(ID)=FLXCNV
|
|
if(redif(id).gt.0) then
|
|
VECL(NRE)=VECL(NRE)-FLXC(ID)*redif(id)
|
|
end if
|
|
C
|
|
if(reint(id).gt.0.AND.ICONV.LE.2) then
|
|
TP=TEMP(ID+1)
|
|
PM=PTOTAL(ID+1)
|
|
PGP=PGS(ID+1)
|
|
PRADP=PM-PGP-HALF*DENS(ID+1)*VTURB(ID+1)**2
|
|
T0=HALF*(T+TP)
|
|
P0=HALF*(P+PM)
|
|
PG0=HALF*(PG+PGP)
|
|
PR0=HALF*(PRAD+PRADP)
|
|
AB0=HALF*(ABROSD(ID)+ABROSD(ID+1))
|
|
DLT=(TP-T)/(PM-P)*(PM+P)/(TP+T)
|
|
CALL CONVEC(ID+1,T0,P0,PG0,PR0,AB0,DLT,FLXCP,VCON)
|
|
DELM=(DM(ID+1)-DM(ID))*HALF
|
|
RDELM=DENS(ID)/DELM
|
|
VECL(NRE)=VECL(NRE)-RDELM*(FLXCP-FLXCNV)*reint(id)
|
|
end if
|
|
END IF
|
|
END IF
|
|
C
|
|
C skip rows corresponding to fully-zeroed populations
|
|
C
|
|
NSE=NFREQE+INSE
|
|
INONZ=NSE
|
|
DO II=NSE,NN0
|
|
IF(IGZERT(II-NSE+1).EQ.0) THEN
|
|
IF(INONZ.NE.II) VECL(INONZ)=VECL(II)
|
|
INONZ=INONZ+1
|
|
END IF
|
|
END DO
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE PRCHAN(CHANG,CHM,CHMT)
|
|
C =================================
|
|
C
|
|
C Diagnostic output of relative changes of vector PSI
|
|
C
|
|
C Input:
|
|
C CHANG - array of relative changes of vector PSI at depth ID
|
|
C ID - depth index
|
|
C Output:
|
|
C CHM - maximum relative change of all unknowns at all depths
|
|
C CHMT - maximum relative change in temperature at all depths
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
DIMENSION CHANG(MTOT,MDEPTH),CHANM(MDEPTH)
|
|
C
|
|
C maximum relative change of all unknowns in depth ID
|
|
C
|
|
CHMT=0.
|
|
I1=1
|
|
if(icompt.gt.0.and.icombc.gt.0.and.ijex(1).gt.0) i1=2
|
|
DO ID=ND,1,-1
|
|
CH=0.
|
|
chrad=0.
|
|
chpop=0.
|
|
cht=0.
|
|
che=0.
|
|
DO 10 I=i1,NN
|
|
IF(ITER.EQ.1.AND.I.EQ.NFREQE+INDL) GO TO 10
|
|
IF(I.GE.NFREQE+INSE) THEN
|
|
II=INDLGZ(I-NFREQE-INSE+1)
|
|
IF(RPOP0(II,ID).LT.POPZCH) GO TO 10
|
|
END IF
|
|
IF(ABS(CHANG(I,ID)).LT.ABS(CH)) GO TO 10
|
|
CH=CHANG(I,ID)
|
|
10 CONTINUE
|
|
CHANM(ID)=CH
|
|
IF(NFREQE.GT.0) THEN
|
|
DO 11 I=i1,NFREQE
|
|
IF(ABS(CHANG(I,ID)).LT.ABS(CHRAD)) GO TO 11
|
|
CHRAD=CHANG(I,ID)
|
|
jjr=i
|
|
11 CONTINUE
|
|
END IF
|
|
DO 12 I=NFREQE+INSE,NFREQE+INSE+NLVEXZ-1
|
|
II=INDLGZ(I-NFREQE-INSE+1)
|
|
IF(RPOP0(II,ID).LT.POPZCH) GO TO 12
|
|
IF(ABS(CHANG(I,ID)).LT.ABS(CHPOP)) GO TO 12
|
|
CHpop=CHANG(I,ID)
|
|
jjp=ii
|
|
12 CONTINUE
|
|
if(inre.gt.0) then
|
|
cht=chang(nfreqe+inre,id)
|
|
if(abs(cht).ge.abs(chmt)) chmt=abs(cht)
|
|
end if
|
|
if(inpc.gt.0) che=chang(nfreqe+inpc,id)
|
|
C
|
|
C output onto file 9
|
|
C
|
|
IF(ID.EQ.ND.AND.ITER.EQ.1) WRITE(9,800)
|
|
WRITE(9,801) ITER,ID,cht,che,CHpop,CHrad,ch,jjp,jjr
|
|
800 FORMAT(' RELATIVE CHANGES OF VECTOR PSI'/
|
|
* ' ITER ID TEMP NE POP RAD MAXIMUM',
|
|
* ' ilev ifr',/)
|
|
801 FORMAT(2I5,1P5e10.2,2i5)
|
|
END DO
|
|
C
|
|
C determination of the maximum relative change of all unknowns
|
|
C at all depths
|
|
C
|
|
CHM=0.
|
|
DO I=1,ND
|
|
IF(ABS(CHANM(I)).GE.ABS(CHM)) CHM=CHANM(I)
|
|
END DO
|
|
C
|
|
if(chmt.lt.chmaxt) then
|
|
do itl=iter,niter+1
|
|
nitlam(itl)=nlamt
|
|
end do
|
|
end if
|
|
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE OPADD(MODE,ICALL,IJ,ID)
|
|
C ==================================
|
|
C
|
|
C Additional opacities
|
|
C This is basically user-supplied procedure; here are some more
|
|
C important non-standard opacity sources, namely
|
|
C Rayleigh scattering, H- opacity, H2+ opacity, and additional
|
|
C opacity of He I and He II.
|
|
C Inclusion of these opacities is contolled by switches transmitted
|
|
C by COMMON/OPCKEY - see description in START.
|
|
C
|
|
C Input parameters:
|
|
C MODE - controls the nature and the amount of calculations
|
|
C = -1 - (OPADD called from START) evaluation of relevant
|
|
C depth-dependent quantities (usually photoionization
|
|
C cross-sections, but also possibly other), which are
|
|
C stored in array CROS
|
|
C = 0 - evaluation of an additional opacity, emissivity, and
|
|
C scattering - for procedure OPACF1
|
|
C = 1 - the same, but also derivatives wrt temperature,
|
|
C electron density, and level populations
|
|
C IJ - frequency index
|
|
C ID - depth index
|
|
C
|
|
C Output: transmitted by COMMON/OPACAD:
|
|
C
|
|
C ABAD - absorption coefficient (at frequency point IJ and depth ID)
|
|
C EMAD - emission coefficient (at frequency point IJ and depth ID)
|
|
C SCAD - scattering coefficient (at frequency point IJ and depth ID)
|
|
C Dxy - derivatives of x (=A for Absorption, =E for Emission,
|
|
C =S for scattering) coefficient wrt y (=T for temperature,
|
|
C =N for electron density)
|
|
C DDN(I) - quantity proportional to a derivative of absorption (and
|
|
C emission) coefficient wrt population of I-th level; ie.
|
|
C d(abs)/d(pop) = DDN * [1-exp(-h*nu/kT)]
|
|
C d(em)/d(pop) = DDN * (2h*nu**3/c**2)*exp(-h*nu/kT)
|
|
C
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
common/eospar/anmol(600,mdepth),
|
|
* anato(100,mdepth),
|
|
* anion(100,mdepth)
|
|
c
|
|
PARAMETER (FRRAY = 2.463D15,
|
|
* FRAYHe= 5.150E15,
|
|
* FRAYH2= 2.922E15,
|
|
* CLS = 2.997925e18,
|
|
* C18 = 2.997925D18,
|
|
* CR0 = 5.799D-13,
|
|
* CR1 = 1.422D-6,
|
|
* CR2 = 2.784D0,
|
|
* TENM4 = 1.0D-4,
|
|
* THM0 = 8.7629D3,
|
|
* SBHM = 1.0353D-16,
|
|
* TRHA = 1.5D0,
|
|
* SFF0 = 1.3727D-25,
|
|
* SFF1 = 4.3748D-10,
|
|
* SFFM2 = -2.5993D-7,
|
|
* F0HE1 = 3.29D15,
|
|
* F0HE2 = 1.316D16,
|
|
* SBH0 = 4.1412D-16,
|
|
* SG01 = 2.815D-16,
|
|
* SG02 = 4.504D-15)
|
|
SAVE T,DELTAT,ANE,HKT,T32,XHM,POPI,SB00
|
|
C
|
|
AB0=0.
|
|
AB1=0.
|
|
DAB0=0.
|
|
DAB1=0.
|
|
ABAD=0.
|
|
EMAD=0.
|
|
SCAD=0.
|
|
DBF=0.
|
|
DFF=0.
|
|
DAT=0.
|
|
DET=0.
|
|
DAN=0.
|
|
DEN=0.
|
|
DST=0.
|
|
DSN=0.
|
|
DO I=1,NLEVEL
|
|
DDN(I)=0.
|
|
END DO
|
|
C
|
|
FR=FREQ(IJ)
|
|
al=2.997925e18/fr
|
|
lpri=al.gt.1579.0.and.al.lt.1579.5
|
|
if(ielh.gt.0) then
|
|
N0HN=NFIRST(IELH)
|
|
NKH=NKA(IATH)
|
|
end if
|
|
c
|
|
IF(ICALL.GT.0) THEN
|
|
T=TEMP(ID)
|
|
DELTAT=TENM4*T
|
|
ANE=ELEC(ID)
|
|
HKT=HK/T
|
|
T32=UN/T/SQRT(T)
|
|
XHM=THM0/T
|
|
if(ielh.gt.0) then
|
|
ah=popul(n0hn,id)
|
|
ahp=popul(nkh,id)
|
|
else
|
|
ah=anato(1,id)
|
|
ahp=anion(1,id)
|
|
end if
|
|
popi=ah
|
|
SB00=SBHM*T32*EXP(XHM)*POPI*ANE
|
|
c
|
|
if(iathe.gt.0) then
|
|
ahe=popul(n0a(iathe),id)
|
|
else
|
|
ahe=anato(2,id)
|
|
end if
|
|
END IF
|
|
C
|
|
IT=NCON
|
|
C
|
|
C -----------------------
|
|
C HI Rayleigh scattering
|
|
C -----------------------
|
|
C
|
|
IF(IRSCT.NE.0) THEN
|
|
IT=IT+1
|
|
SCAD=AH*CROSS(IT,IJ)
|
|
END IF
|
|
C
|
|
C -----------------------
|
|
C He I Rayleigh scattering
|
|
C -----------------------
|
|
C
|
|
IF(IRSCHE.NE.0.AND.MODE.GE.0) THEN
|
|
IT=IT+1
|
|
scad=scad+ahe*cross(it,ij)
|
|
END IF
|
|
C
|
|
C -----------------------
|
|
C H2 Rayleigh scattering
|
|
C -----------------------
|
|
C
|
|
IF(IRSCH2.NE.0.AND.MODE.GE.0.AND.IFMOL.GT.0) THEN
|
|
IT=IT+1
|
|
sg=cross(it,ij)*anmol(2,id)
|
|
if(t.lt.tmolim) scad=scad+sg
|
|
END IF
|
|
C
|
|
IF(IOPHMI.GT.0) THEN
|
|
C
|
|
C ----------------------------
|
|
C H- bound-free and free-free
|
|
C ----------------------------
|
|
C
|
|
IT=IT+1
|
|
if(t.lt.20000.) then
|
|
SB=SB00*CROSS(IT,IJ)
|
|
SF=SFFHMI(AH,FR,T)*ANE
|
|
AB0=SB+SF
|
|
end if
|
|
END IF
|
|
|
|
c END IF
|
|
C
|
|
IF(IOPH2P.GT.0) THEN
|
|
C
|
|
C -----------------------------
|
|
C H2+ bound-free and free-free
|
|
C -----------------------------
|
|
C
|
|
IT=IT+1
|
|
X2=-CROSS(IT,IJ)/T+CROSS(IT+1,IJ)
|
|
IT=IT+1
|
|
SB=0.
|
|
IF(X2.GT.-150..and.fr.lt.3.28e15.and.t.le.9000.)
|
|
* SB=AH*EXP(X2)*AHP
|
|
AB0=AB0+SB
|
|
DAB1=SB*CROSS(IT-1,IJ)/T/T
|
|
IF(N0HN.GT.0) DDN(N0HN)=DDN(N0HN)+SB/POPI
|
|
IF(NKH.GT.0) DDN(NKH)=DDN(NKH)+SB/POPUL(NKH,ID)
|
|
END IF
|
|
C
|
|
C -----------------------------
|
|
C He- free-free
|
|
C -----------------------------
|
|
C
|
|
IF(IOPHEM.GT.0) THEN
|
|
IT=IT+1
|
|
sg=cross(it,ij)*t+cross(it+1,ij)+cross(it+2,ij)/t
|
|
ab0=ab0+sg*ane*ahe
|
|
END IF
|
|
C
|
|
C -----------------------------
|
|
C H2- free-free
|
|
C -----------------------------
|
|
C
|
|
IF(IOPH2M.NE.0.AND.MODE.GE.0.AND.IFMOL.GT.0.AND.T.LT.TMOLIM) THEN
|
|
call h2minus(t,anmol(2,id),ane,fr,oph2)
|
|
ab1=ab1+oph2
|
|
END IF
|
|
|
|
C
|
|
C -----------------------------
|
|
C CH and OH continuuum opacity
|
|
C -----------------------------
|
|
C
|
|
if(mode.ge.0.and.ifmol.gt.0.and.t.lt.tmolim) then
|
|
if(iopch.gt.0) ab0=ab0+sbfch(fr,t)*anmol(5,id)
|
|
if(iopoh.gt.0) ab0=ab0+sbfoh(fr,t)*anmol(4,id)
|
|
C
|
|
C ---------------------------
|
|
C CIA H2-H2 opacity
|
|
C ---------------------------
|
|
C
|
|
if(ioh2h2.gt.0) then
|
|
call cia_h2h2(t,anmol(2,id),fr,oph2)
|
|
ab1=ab1+oph2
|
|
end if
|
|
C
|
|
C ---------------------------
|
|
C CIA H2-He opacity
|
|
C ---------------------------
|
|
C
|
|
if(ioh2he.gt.0) then
|
|
call cia_h2he(t,anmol(2,id),ahe,fr,oph2)
|
|
ab1=ab1+oph2
|
|
end if
|
|
C
|
|
C ---------------------------
|
|
C CIA H2-H opacity
|
|
C ---------------------------
|
|
C
|
|
if(ioh2h.gt.0) then
|
|
call cia_h2h(t,anmol(2,id),ah,fr,oph2)
|
|
ab1=ab1+oph2
|
|
end if
|
|
C
|
|
C ---------------------------
|
|
C CIA H-He opacity
|
|
C ---------------------------
|
|
C
|
|
if(iohhe.gt.0) then
|
|
call cia_hhe(t,ah,ahe,fr,oph2)
|
|
ab1=ab1+oph2
|
|
end if
|
|
end if
|
|
C
|
|
C
|
|
C ----------------------------------------------
|
|
C The user may supply more opacity sources here:
|
|
C ----------------------------------------------
|
|
C
|
|
C Finally, actual absorption and emission coefficients and
|
|
C their derivatives
|
|
|
|
IF(MODE.LT.0) RETURN
|
|
X=EXP(-HKT*FR)
|
|
X1=UN-X
|
|
FR15=FR*1.D-15
|
|
BNX=BN*FR15*FR15*FR15*X
|
|
AB1=AB1/X1
|
|
ABAD=ABAD+AB0+AB1
|
|
EMAD=EMAD+AB0+AB1
|
|
IF(MODE.EQ.1) THEN
|
|
HKFT=HKT*FR/T
|
|
DB=HKFT*AB0
|
|
DAT=DAB1
|
|
DET=DAB1
|
|
DAN=AB0/ANE
|
|
DEN=AB0/ANE
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
C
|
|
SUBROUTINE OPADD0(IJ)
|
|
C ======================
|
|
C
|
|
C setting cross secxtion for ondividual addiaopnal opacity sources
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
C
|
|
PARAMETER (FRRAY = 2.463D15,
|
|
* FRAYHe= 5.150E15,
|
|
* FRAYH2= 2.922E15,
|
|
* CLS = 2.997925e18,
|
|
* CR0 = 5.799D-13,
|
|
* CR1 = 1.422D-6,
|
|
* CR2 = 2.784D0)
|
|
C
|
|
FR=FREQ(IJ)
|
|
IF(ISPODF.GE.1) FR=FREQ(IFREQB(IJ))
|
|
c
|
|
IT=NCON
|
|
C
|
|
C -----------------------
|
|
C HI Rayleigh scattering
|
|
C -----------------------
|
|
C
|
|
IF(IRSCT.NE.0) THEN
|
|
IT=IT+1
|
|
if(it.gt.mcross)
|
|
* CALL QUIT('it.gt.mcross in opadd',it,mcross)
|
|
FRM=MIN(FR,FRRAY)
|
|
X=(CLS/FRM)**2
|
|
BFCS(IT,IJ)=real((CR0+(CR1+CR2/X)/X)/X/X)
|
|
END IF
|
|
C
|
|
C -----------------------
|
|
C He I Rayleigh scattering
|
|
C -----------------------
|
|
C
|
|
IF(IRSCHE.NE.0) THEN
|
|
IT=IT+1
|
|
if(it.gt.mcross)
|
|
* CALL QUIT('it.gt.mcross in opadd',it,mcross)
|
|
X=(CLS/MIN(FR,FRAYHe))**2
|
|
CS=5.484E-14/X/X*(1.+(2.44E5+5.94E10/(X-2.90E5))/X)**2
|
|
BFCS(IT,IJ)=real(CS)
|
|
END IF
|
|
C
|
|
C -----------------------
|
|
C H2 Rayleigh scattering
|
|
C -----------------------
|
|
C
|
|
IF(IRSCH2.NE.0.AND.IFMOL.GT.0) THEN
|
|
IT=IT+1
|
|
if(it.gt.mcross)
|
|
* CALL QUIT('it.gt.mcross in opadd',it,mcross)
|
|
X=(CLS/MIN(FR,FRAYH2))**2
|
|
X2=1./X/X
|
|
CS=(8.14E-13+1.28E-6/X+1.61*X2)*X2
|
|
BFCS(IT,IJ)=real(CS)
|
|
END IF
|
|
C
|
|
C ----------------------------
|
|
C H- bound-free and free-free
|
|
C ----------------------------
|
|
C
|
|
IF(IOPHMI.GT.0) THEN
|
|
IT=IT+1
|
|
if(it.gt.mcross)
|
|
* CALL QUIT('it.gt.mcross in opadd',it,mcross)
|
|
BFCS(IT,IJ)=real(SBFHMI(FR))
|
|
END IF
|
|
C
|
|
C -----------------------------
|
|
C H2+ bound-free and free-free
|
|
C -----------------------------
|
|
C
|
|
IF(IOPH2P.GT.0) THEN
|
|
IT=IT+1
|
|
if(it+1.gt.mcross)
|
|
* CALL QUIT('it.gt.mcross in opadd',it,mcross)
|
|
X=FR*1.D-15
|
|
BFCS(IT,IJ)=real((-7.342D-3+(-2.409+(1.028+(-4.23D-1+
|
|
* (1.224D-1-1.351D-2*X)*X)*X)*X)*X)*1.602D-12/BOLK)
|
|
IT=IT+1
|
|
X=LOG(FR)
|
|
CS0=-3.0233D3+(3.7797D2+(-1.82496D1+(3.9207D-1-
|
|
* 3.1672D-3*X)*X)*X)*X
|
|
BFCS(IT,IJ)=real(cs0)
|
|
END IF
|
|
C
|
|
C -----------------------------
|
|
C He- free-free
|
|
C -----------------------------
|
|
C
|
|
IF(IOPHEM.GT.0) THEN
|
|
IT=IT+1
|
|
if(it+2.gt.mcross)
|
|
* CALL QUIT('it.gt.mcross in opadd',it,mcross)
|
|
A=3.397D-46+(-5.216D-31+7.039D-15/FR)/FR
|
|
B=-4.116D-42+(1.067D-26+8.135D-11/FR)/FR
|
|
C=5.081D-37+(-8.724D-23-5.659D-8/FR)/FR
|
|
BFCS(IT,IJ)=real(A)
|
|
BFCS(IT+1,IJ)=real(B)
|
|
BFCS(IT+2,IJ)=real(C)
|
|
END IF
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE PARTF(IAT,IZI,T,ANE,XMAX,U,DUT,DUN)
|
|
C ==============================================
|
|
C
|
|
C Partition functions
|
|
C The standard evaluation is for hydrogen through zinc, for
|
|
C neutrals and first four ionization degrees.
|
|
C Basically after Traving, Baschek, and Holweger, Abhand. Hamburg.
|
|
C Sternwarte. Band VIII, Nr. 1 (1966)
|
|
C
|
|
C For higher atomic numbers modified Kurucz routine PFSAHA,
|
|
C called PFHEAV here is used. The routine was provided by
|
|
C Charles Proffitt.
|
|
C
|
|
C The routine calls special procedures for Fe and Ni; or
|
|
C the values based on the tabulated Opacity Project ionization
|
|
C fractions
|
|
C
|
|
C Input:
|
|
C IAT - atomic number
|
|
C IZI - ionic charge (=1 for neutrals, =2 for once ionized, etc)
|
|
C T - temperature
|
|
C ANE - electron density
|
|
C XMAX - principal quantum number of the last bound level
|
|
C
|
|
C Output:
|
|
C U - partition function
|
|
C DUT - derivative dU/dT
|
|
C DUN - derivative dU/d(ANE)
|
|
C
|
|
C Quantities in COMMON/PFSTDS:
|
|
C for MODPF(IAT) < 0 - non-standard, user supplied procedure
|
|
C for evaluating partition functions PFSPEC
|
|
C = 0 - standard expressions
|
|
C After Traving, Baschek, and Holweger, Abhand.
|
|
C Hamburg. Sternwarte, Band VIII, Nr. 1 (1966)
|
|
C > 0 - partition functions evaluated from the
|
|
C Opacity Project ionization fractions
|
|
C (by routine OPFRAC)
|
|
C PFSTD(IAT,IZI) - see above
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
COMMON/PFSTDS/PFSTD(matom,30),MODPF(matom)
|
|
common/irwint/iirwin
|
|
PARAMETER (NIONS=123, NSS=222)
|
|
c PARAMETER (UN=1.D0, HALF=0.5D0, TWO=2.D0, TRHA=1.5D0,
|
|
PARAMETER (TRHA=1.5D0,
|
|
* THIRD=UN/3.D0, SIXTH=UN/6.D0)
|
|
REAL*4 AHH( 6), ALB(12), AB (11), AC (19), AN (30), AO (49),
|
|
* AF (34), ANN(23), ANA(19), AMG(15), AAL(17), ASI(23),
|
|
* AP (19), AS (29), ACL(28), AAR(25), AK (30), ACA(17),
|
|
* ASC(24), ATI(33), AV (33), ACR(29), AMN(28), AFE(35),
|
|
* ACO(29), ANI(23), ACU(20), AZN(18)
|
|
REAL*4 GHH( 6), GLB(12), GB (11), GC (19), GN (30), GO (49),
|
|
* GF (34), GNN(23), GNA(19), GMG(15), GAL(17), GSI(23),
|
|
* GP (19), GS (29), GCL(28), GAR(25), GK (30), GCA(17),
|
|
* GSC(24), GTI(33), GV (33), GCR(29), GMN(28), GFE(35),
|
|
* GCO(29), GNI(23), GCU(20), GZN(18)
|
|
REAL*4 XL1(99), XL2(123), XL(222),
|
|
* CH1(66), CH2(72), CH3(55), CH4(29), CHION(222)
|
|
REAL*4 ALF(678), GAM(678)
|
|
C INTEGER*2 II1(5,15),II2(5,15),INDEX0(5,30),
|
|
INTEGER II1(5,15),II2(5,15),INDEX0(5,30),
|
|
* IS1(53),IS2(70),IS(123),INDEXS(123),
|
|
* IM1(99),IM2(123),IM(222),INDEXM(222),
|
|
* IGP1(99),IGP2(123),IGPR(222),
|
|
* IG01(53),IG02(70),IG0(123)
|
|
DIMENSION IGLE(28)
|
|
C
|
|
EQUIVALENCE ( AHH(1), ALF( 1)),( ALB(1), ALF( 7)),
|
|
* ( AB (1), ALF( 19)),
|
|
* ( AC (1), ALF( 30)),( AN (1), ALF( 49)),
|
|
* ( AO (1), ALF( 79)),( AF (1), ALF(128)),
|
|
* ( ANN(1), ALF(162)),( ANA(1), ALF(185)),
|
|
* ( AMG(1), ALF(204)),( AAL(1), ALF(219)),
|
|
* ( ASI(1), ALF(236)),( AP (1), ALF(259)),
|
|
* ( AS (1), ALF(278)),( ACL(1), ALF(307)),
|
|
* ( AAR(1), ALF(335)),( AK (1), ALF(360)),
|
|
* ( ACA(1), ALF(390)),( ASC(1), ALF(407)),
|
|
* ( ATI(1), ALF(431)),( AV (1), ALF(464)),
|
|
* ( ACR(1), ALF(497)),( AMN(1), ALF(526)),
|
|
* ( AFE(1), ALF(554)),( ACO(1), ALF(589)),
|
|
* ( ANI(1), ALF(618)),( ACU(1), ALF(641)),
|
|
* ( AZN(1), ALF(661))
|
|
EQUIVALENCE ( GHH(1), GAM( 1)),( GLB(1), GAM( 7)),
|
|
* ( GB (1), GAM( 19)),
|
|
* ( GC (1), GAM( 30)),( GN (1), GAM( 49)),
|
|
* ( GO (1), GAM( 79)),( GF (1), GAM(128)),
|
|
* ( GNN(1), GAM(162)),( GNA(1), GAM(185)),
|
|
* ( GMG(1), GAM(204)),( GAL(1), GAM(219)),
|
|
* ( GSI(1), GAM(236)),( GP (1), GAM(259)),
|
|
* ( GS (1), GAM(278)),( GCL(1), GAM(307)),
|
|
* ( GAR(1), GAM(335)),( GK (1), GAM(360)),
|
|
* ( GCA(1), GAM(390)),( GSC(1), GAM(407)),
|
|
* ( GTI(1), GAM(431)),( GV (1), GAM(464)),
|
|
* ( GCR(1), GAM(497)),( GMN(1), GAM(526)),
|
|
* ( GFE(1), GAM(554)),( GCO(1), GAM(589)),
|
|
* ( GNI(1), GAM(618)),( GCU(1), GAM(641)),
|
|
* ( GZN(1), GAM(661))
|
|
EQUIVALENCE ( CH1(1), CHION( 1)),
|
|
* ( CH2(1), CHION( 67)),
|
|
* ( CH3(1), CHION(139)),
|
|
* ( CH4(1), CHION(194)),
|
|
* ( XL1(1), XL( 1)),
|
|
* ( XL2(1), XL(100))
|
|
EQUIVALENCE ( IS1(1), IS(1)), ( IS2(1), IS( 54)),
|
|
* ( IM1(1), IM(1)), ( IM2(1), IM(100)),
|
|
* (IGP1(1),IGPR(1)), (IGP2(1),IGPR(100)),
|
|
* (IG01(1), IG0(1)), (IG02(1), IG0( 54)),
|
|
* (II1(1,1),INDEX0(1,1)),(II2(1,1),INDEX0(1,16))
|
|
C
|
|
DATA IGLE/2,1,2,1,6,9,4,9,6,1,2,1,6,9,4,9,6,1,
|
|
* 10,21,28,25,6,25,28,21,10,21/
|
|
C
|
|
C Internal numbering of ions; each line corresponds to one species,
|
|
C starting from hydrogen.
|
|
C 0 means that the ion does not exist
|
|
C negative number means that partition function is assumed constant
|
|
C (ie even for MODPF=0) and equal to ABS(that value)
|
|
C
|
|
DATA II1 / 1, -1, 0, 0, 0,
|
|
* 2, 3, -1, 0, 0,
|
|
* 4, 5, -2, -1, 0,
|
|
* 6, 7, -1, -2, -1,
|
|
* 8, 9, 10, -1, -2,
|
|
* 11, 12, 13, 14, -1,
|
|
* 15, 16, 17, 18, 19,
|
|
* 20, 21, 22, 23, 24,
|
|
* 25, 26, 27, 28, -6,
|
|
* 29, 30, 31, 32, -9,
|
|
* 33, 34, 35, 36, -4,
|
|
* 37, 38, 39, 40, -9,
|
|
* 41, 42, 43, 44, -6,
|
|
* 45, 46, 47, 48, -1,
|
|
* 49, 50, 51, 52, 53 /
|
|
DATA II2 / 54, 55, 56, 57, 58,
|
|
* 59, 60, 61, 62, 63,
|
|
* 64, 65, 66, 67, 68,
|
|
* 69, 70, 71, 72, 73,
|
|
* 74, 75, 76, 77, -9,
|
|
* 78, 76, 80, 81, 82,
|
|
* 83, 84, 85, 86, 87,
|
|
* 88, 89, 90, 91, 92,
|
|
* 93, 94, 95, 96, 97,
|
|
* 98, 99, 100, 101, 102,
|
|
* 103, 104, 105, 106, 107,
|
|
* 108, 109, 110, 111, -25,
|
|
* 112, 113, 114, 115, -1,
|
|
* 116, 117, 118, 119, -1,
|
|
* 120, 121, 122, 123, -1 /
|
|
C
|
|
C Statistical weights of the ground states
|
|
C
|
|
DATA IG01 / 2,
|
|
* 1, 2,
|
|
* 2, 1,
|
|
* 1, 2,
|
|
* 2, 1, 2,
|
|
* 1, 2, 1, 2,
|
|
* 4, 1, 2, 1, 2,
|
|
* 5, 4, 1, 2, 1,
|
|
* 4, 5, 4, 1,
|
|
* 1, 4, 5, 4,
|
|
* 2, 1, 4, 5,
|
|
* 1, 2, 1, 4,
|
|
* 2, 1, 2, 1,
|
|
* 1, 2, 1, 2,
|
|
* 4, 1, 2, 1, 2 /
|
|
DATA IG02 / 5, 4, 1, 2, 1,
|
|
* 4, 5, 4, 1, 2,
|
|
* 1, 4, 5, 4, 1,
|
|
* 2, 1, 4, 5, 4,
|
|
* 1, 2, 1, 4,
|
|
* 4, 3, 4, 1, 4,
|
|
* 5, 4, 5, 4, 1,
|
|
* 4, 1, 4, 5, 4,
|
|
* 7, 6, 1, 4, 5,
|
|
* 6, 7, 6, 1, 4,
|
|
* 9, 10, 9, 6, 1,
|
|
* 10, 9, 10, 20,
|
|
* 9, 6, 9, 28,
|
|
* 2, 1, 6, 21,
|
|
* 1, 2, 1, 10 /
|
|
C
|
|
DATA IS1 / 1,
|
|
* 1, 1,
|
|
* 1, 1,
|
|
* 2, 1,
|
|
* 1, 2, 1,
|
|
* 1, 2, 2, 1,
|
|
* 2, 2, 3, 2, 1,
|
|
* 3, 4, 3, 5, 2,
|
|
* 2, 3, 4, 3,
|
|
* 2, 2, 3, 2,
|
|
* 1, 2, 2, 3,
|
|
* 1, 1, 2, 2,
|
|
* 2, 2, 1, 2,
|
|
* 1, 2, 2, 1,
|
|
* 2, 1, 1, 1, 1 /
|
|
DATA IS2 / 3, 2, 1, 2, 2,
|
|
* 2, 3, 2, 1, 1,
|
|
* 2, 2, 3, 1, 1,
|
|
* 1, 2, 3, 3, 2,
|
|
* 2, 1, 2, 2,
|
|
* 3, 1, 1, 1, 1,
|
|
* 3, 2, 1, 1, 1,
|
|
* 2, 3, 1, 1, 1,
|
|
* 3, 2, 1, 1, 1,
|
|
* 3, 2, 1, 1, 1,
|
|
* 3, 2, 2, 1, 1,
|
|
* 4, 2, 1, 1,
|
|
* 2, 2, 1, 1,
|
|
* 3, 2, 1, 1,
|
|
* 3, 3, 1, 1 /
|
|
C
|
|
DATA IM1 / 2,
|
|
* 2, 2,
|
|
* 2, 2,
|
|
* 3, 2, 3,
|
|
* 3, 3, 2, 3,
|
|
* 4, 3, 3, 3, 3, 3,
|
|
* 3, 3, 4, 3, 3, 4, 2, 3, 2, 3,
|
|
* 4, 2, 2, 4, 2, 3, 3, 4, 4, 2,
|
|
* 3, 4, 2, 2, 2, 3, 3,
|
|
* 3, 3, 4, 2, 2,
|
|
* 4, 2, 3, 2, 5, 2, 2,
|
|
* 2, 2, 3, 2, 4, 2, 2, 4, 2,
|
|
* 2, 2, 2, 3, 2, 4, 2, 2,
|
|
* 3, 3, 2, 2, 3, 2,
|
|
* 3, 2, 3, 2, 3, 2, 2,
|
|
* 5, 4, 4, 4, 3, 3,
|
|
* 3, 2, 4, 4, 3, 3 /
|
|
DATA IM2 / 4, 2, 2, 4, 2, 5, 4, 2, 3, 1,
|
|
* 3, 2, 5, 2, 2, 4, 2, 4, 4,
|
|
* 2, 2, 3, 2, 4, 2, 2, 4, 4,
|
|
* 3, 2, 3, 3, 2, 3,
|
|
* 4, 2, 2, 4, 2,
|
|
* 3, 2, 3, 2, 2, 3, 2,
|
|
* 4, 3, 3, 5, 4, 2, 3,
|
|
* 6, 4, 3, 6, 3, 5, 4, 2,
|
|
* 5, 3, 5, 4, 4, 4, 4, 4,
|
|
* 3, 3, 3, 4, 4, 4, 4, 4,
|
|
* 3, 2, 3, 4, 4, 4, 4, 4,
|
|
* 4, 4, 3, 5, 3, 4, 4, 4, 4,
|
|
* 5, 3, 3, 3, 5, 4, 5, 1,
|
|
* 6, 3, 5, 3, 5, 1,
|
|
* 2, 3, 3, 4, 3, 4, 1,
|
|
* 2, 2, 2, 3, 3, 2, 3, 1 /
|
|
C
|
|
DATA IGP1 / 2,
|
|
* 4, 2,
|
|
* 2, 4,
|
|
* 4, 12, 2,
|
|
* 2, 4, 12, 2,
|
|
* 12, 2, 18, 4, 12, 2,
|
|
* 18, 10, 12, 24, 2, 18, 6, 4, 12, 2,
|
|
* 8, 20, 12, 18, 10, 2, 10, 12, 24, 20,
|
|
* 2, 18, 6, 18, 10, 4, 12,
|
|
* 18, 10, 8, 20, 12,
|
|
* 18, 10, 2, 10, 12, 24, 20,
|
|
* 8, 4, 18, 10, 8, 20, 12, 18, 10,
|
|
* 2, 8, 4, 18, 10, 8, 20, 12,
|
|
* 4, 2, 8, 4, 18, 10,
|
|
* 2, 18, 4, 12, 2, 8, 4,
|
|
* 12, 2, 18, 4, 12, 2,
|
|
* 18, 10, 12, 2, 4, 2 /
|
|
DATA IGP2 / 8, 20, 12, 18, 10, 12, 2, 18, 4, 12,
|
|
* 18, 10, 8, 20, 12, 18, 10, 12, 2,
|
|
* 8, 4, 18, 10, 8, 20, 12, 18, 12,
|
|
* 2, 8, 4, 18, 10, 2,
|
|
* 8, 20, 12, 18, 10,
|
|
* 4, 20, 2, 8, 4, 18, 10,
|
|
* 30, 42, 18, 20, 2, 12, 18,
|
|
* 56, 56, 28, 42, 10, 20, 2, 12,
|
|
* 50, 70, 56, 72, 64, 42, 20, 2,
|
|
* 12, 60, 40, 50, 18, 56, 42, 20,
|
|
* 14, 10, 50, 12, 72, 50, 56, 42,
|
|
* 60, 56, 40, 50, 18, 12, 72, 50, 56,
|
|
* 42, 70, 42, 18, 56, 24, 50, 12,
|
|
* 20, 56, 42, 18, 56, 50,
|
|
* 2, 30, 10, 20, 56, 42, 56,
|
|
* 4, 8, 12, 2, 30, 10, 20, 42 /
|
|
C
|
|
DATA XL1 /11.0,
|
|
* 8.0,12.0,
|
|
* 6.0, 6.0,
|
|
* 6.0, 4.0, 8.0,
|
|
* 9.0, 6.0, 4.0, 6.0,
|
|
* 6.0, 6.0, 5.0, 6.1, 5.0, 6.0,
|
|
* 6.1, 4.0, 5.0, 3.9, 6.0, 5.0, 4.0, 6.0, 6.3, 6.0,
|
|
* 8.0, 6.0, 3.4, 6.0, 5.0, 3.9, 3.9, 6.0, 4.9, 4.0,
|
|
* 5.9, 5.0, 4.9, 4.0, 4.0, 6.0, 6.0,
|
|
* 4.0, 4.0, 5.0, 4.0, 4.0,
|
|
* 5.0, 4.0, 3.9, 4.0, 5.0, 5.0, 4.0,
|
|
* 6.0, 6.0, 5.0, 4.0, 3.9, 4.0, 4.0, 5.0, 5.0,
|
|
* 7.0, 4.0, 4.0, 4.0, 4.0, 5.0, 5.0, 5.0,
|
|
* 7.0, 7.0, 5.0, 5.0, 5.0, 5.0,
|
|
* 7.0, 4.0, 7.0, 4.0, 7.0, 5.0, 5.0,
|
|
* 6.1, 5.9, 5.0, 5.0, 5.0, 7.0,
|
|
* 5.0, 5.0, 5.0, 7.0, 8.6, 8.0 /
|
|
DATA XL2 / 6.0, 5.0, 5.0, 5.0, 5.0, 3.5, 5.0,14.4, 5.0, 4.0,
|
|
* 6.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.2,
|
|
* 6.0, 6.0, 5.1, 5.0, 5.0, 5.0, 5.0, 5.0, 4.0,
|
|
* 7.0, 5.0, 5.0, 6.0, 6.0, 5.0,
|
|
* 6.0, 5.0, 5.0, 3.6, 4.0,
|
|
* 5.9, 6.0, 7.0, 5.0, 4.9, 5.0, 4.3,
|
|
* 4.9, 4.9, 5.0, 5.0, 6.0, 4.6, 3.8,
|
|
* 5.0, 4.7, 5.0, 5.0, 5.0, 5.0, 6.0, 4.8,
|
|
* 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0,11.2,
|
|
* 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.2,
|
|
* 6.0, 5.0, 6.0, 7.0, 5.0, 5.0, 5.0, 5.0,
|
|
* 5.0, 5.0, 5.0, 5.0, 5.0, 6.0, 5.0, 3.6, 3.8,
|
|
* 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 3.0,
|
|
* 5.4, 5.0, 9.0, 5.0, 5.0, 3.0,
|
|
* 8.0, 6.0, 5.0, 7.0, 5.0, 5.0, 2.9,
|
|
* 8.0, 5.0, 5.0, 8.0, 5.0, 5.0, 5.0, 2.8 /
|
|
C
|
|
C
|
|
DATA CH1 / 13.595 ,
|
|
* 24.580 , 54.403 ,
|
|
* 5.390 , 75.619 ,
|
|
* 9.320 , 13.278 , 18.206 ,
|
|
* 8.296 , 25.149 , 31.146 , 37.920 ,
|
|
* 11.256 , 24.376 , 30.868 , 47.871 , 55.873 ,
|
|
* 64.476 ,
|
|
* 14.529 , 16.428 , 29.593 , 36.693 ,
|
|
* 47.426 , 55.765 , 63.626 , 77.450 , 87.445 ,
|
|
* 97.863 ,
|
|
* 13.614 , 16.938 , 18.630 ,
|
|
* 35.108 , 37.621 , 40.461 , 42.584 ,
|
|
* 54.886 , 63.733 , 70.556 ,
|
|
* 77.394 , 87.609 , 97.077 , 103.911 , 106.116 ,
|
|
* 113.873 , 125.863 ,
|
|
* 17.418 , 20.009 , 34.977 , 39.204 , 41.368 ,
|
|
* 62.646 , 65.774 , 69.282 , 71.882 ,
|
|
* 87.139 , 97.852 , 106.089 ,
|
|
* 21.559 , 21.656 , 41.071 , 44.274 ,
|
|
* 63.729 , 68.806 , 71.434 , 97.162 , 100.917 /
|
|
DATA CH2 / 5.138 , 47.290 , 47.459 , 71.647 , 75.504 ,
|
|
* 98.880 , 104.778 , 107.864 ,
|
|
* 7.644 , 15.031 , 80.117 , 80.393 ,
|
|
* 109.294 , 113.799 ,
|
|
* 5.984 , 10.634 , 18.823 , 25.496 ,
|
|
* 28.441 , 119.957 , 120.383 ,
|
|
* 8.149 , 16.339 , 22.894 ,
|
|
* 33.459 , 42.333 , 45.130 ,
|
|
* 10.474 , 11.585 , 19.720 ,
|
|
* 30.156 , 51.354 , 65.007 ,
|
|
* 10.357 , 12.200 , 13.401 , 23.405 , 24.807 ,
|
|
* 35.047 , 47.292 , 57.681 , 72.474 , 85.701 ,
|
|
* 13.014 , 14.458 , 23.798 , 26.041 , 27.501 ,
|
|
* 39.904 , 41.610 , 53.450 , 67.801 ,
|
|
* 15.755 , 15.933 , 27.619 , 29.355 ,
|
|
* 40.899 , 42.407 , 45.234 , 59.793 , 75.002 ,
|
|
* 4.339 , 31.810 , 32.079 ,
|
|
* 45.738 , 47.768 , 50.515 ,
|
|
* 60.897 , 63.890 , 65.849 , 82.799 , 85.150 /
|
|
DATA CH3 / 6.111 , 7.808 , 11.868 ,
|
|
* 51.207 , 51.596 , 67.181 , 69.536 ,
|
|
* 6.538 , 7.147 , 8.042 ,
|
|
* 12.891 , 24.752 , 74.090 , 91.847 ,
|
|
* 6.818 , 6.953 , 7.411 ,
|
|
* 13.635 , 14.685 , 28.137 , 43.236 , 100.083 ,
|
|
* 6.738 , 7.101 , 14.205 , 15.670 , 16.277 ,
|
|
* 29.748 , 48.464 , 65.198 ,
|
|
* 6.763 , 8.285 , 9.221 ,
|
|
* 16.493 , 18.662 , 30.950 , 49.580 , 73.093 ,
|
|
* 7.432 , 8.606 , 9.240 , 15.636 , 18.963 ,
|
|
* 33.690 , 53.001 , 76.006 ,
|
|
* 7.896 , 8.195 , 8.927 , 16.178 , 18.662 ,
|
|
* 30.640 , 34.607 , 56.001 , 79.001 /
|
|
DATA CH4 / 7.863 , 8.378 , 9.160 , 9.519 ,
|
|
* 17.052 , 18.958 , 33.491 , 53.001 ,
|
|
* 7.633 , 8.793 , 18.147 , 20.233 , 35.161 ,
|
|
* 56.025 ,
|
|
* 7.724 , 10.532 , 10.980 ,
|
|
* 20.286 , 27.985 , 36.826 , 61.975 ,
|
|
* 9.391 , 17.503 , 17.166 ,
|
|
* 17.959 , 27.757 , 28.310 , 39.701 , 65.074 /
|
|
C
|
|
C data for hydrogen and helium
|
|
C
|
|
DATA AHH / 20.4976, 747.5023,
|
|
* 28.1703, 527.8296, 22.2809, 987.7189 /
|
|
DATA GHH / 10.853 , 13.342 ,
|
|
* 21.170 , 24.125 , 43.708 , 53.542 /
|
|
C
|
|
C data for lithium and beryllium
|
|
C
|
|
DATA ALB / 8.4915, 97.5015, 23.3299, 192.6701,
|
|
* 9.1849, 32.9263, 183.8887, 19.9563, 88.0437,
|
|
* 6.0478, 35.9723, 233.9798 /
|
|
DATA GLB / 2.022 , 4.604 , 62.032 , 72.624 ,
|
|
* 2.735 , 6.774 , 8.569 , 10.750 , 11.672 ,
|
|
* 3.967 , 12.758 , 16.692 /
|
|
C
|
|
C data for boron
|
|
C
|
|
DATA AB / 4.0086, 19.6741, 402.3110,
|
|
* 9.7257, 30.9262, 186.3466, 44.1629, 60.8371,
|
|
* 6.0084, 23.5767, 76.4149 /
|
|
DATA GB / 0.002 , 3.971 , 7.882 ,
|
|
* 4.720 , 13.477 , 22.103 , 23.056 , 24.734 ,
|
|
* 6.000 , 24.540 , 32.300 /
|
|
C
|
|
C data for carbon
|
|
C
|
|
DATA AC / 8.0158, 5.8833, 33.7521, 595.3432,
|
|
* 4.0003, 17.0841, 82.9154,
|
|
* 15.9808, 48.2044, 435.8093,
|
|
* 10.0281, 15.7574, 186.2109,
|
|
* 15.4127, 55.9559, 243.6311,
|
|
* 6.0057, 23.5757, 76.4185 /
|
|
DATA GC / 0.004 , 1.359 , 6.454 , 10.376 ,
|
|
* 0.008 , 16.546 , 21.614 ,
|
|
* 5.688 , 15.801 , 26.269 ,
|
|
* 6.691 , 25.034 , 40.975 ,
|
|
* 17.604 , 36.180 , 47.133 ,
|
|
* 8.005 , 40.804 , 54.492 /
|
|
C
|
|
C data for nitrogen
|
|
C
|
|
DATA AN / 14.0499, 30.8008, 883.1443,
|
|
* 10.0000, 16.0000, 64.0000,
|
|
* 8.0462, 6.2669, 17.8696, 282.8084,
|
|
* 7.3751, 33.1390, 215.4829,
|
|
* 4.0003, 19.3533, 80.6462,
|
|
* 13.0998, 19.6425, 94.3035, 370.9539,
|
|
* 16.0000, 38.0000,
|
|
* 10.3289, 14.5021, 187.1624, 108.1615, 191.8383,
|
|
* 6.0044, 23.5612, 76.4344 /
|
|
DATA GN / 2.554 , 9.169 , 13.651 ,
|
|
* 12.353 , 13.784 , 14.874 ,
|
|
* 0.014 , 2.131 , 15.745 , 24.949 ,
|
|
* 6.376 , 14.246 , 29.465 ,
|
|
* 0.022 , 31.259 , 41.428 ,
|
|
* 7.212 , 15.228 , 34.387 , 46.708 ,
|
|
* 46.475 , 49.468 ,
|
|
* 8.693 , 37.650 , 65.479 , 61.155 , 79.196 ,
|
|
* 9.999 , 60.991 , 82.262 /
|
|
C
|
|
C data for oxygen
|
|
C
|
|
DATA AO / 4.0029, 5.3656, 36.2853,1044.3447,
|
|
* 131.0217, 868.9779, 14.8533, 93.1466,
|
|
* 12.7843, 5.6828, 98.0919, 829.4396,
|
|
* 50.9878, 199.0120, 2.0000, 6.0000, 10.0000,
|
|
* 10.0000, 30.0000, 50.0000,
|
|
* 8.0703, 5.7144, 84.1156, 529.0927,
|
|
* 5.6609, 28.9355, 111.3620, 494.0413,
|
|
* 45.5249, 134.4751,
|
|
* 4.0003, 21.2937, 78.7058,
|
|
* 12.8293, 16.2730, 123.6578, 327.2396,
|
|
* 48.7883, 102.2117, 20.0060, 161.9903,
|
|
* 28.4184, 61.5816,
|
|
* 10.5563, 13.2950, 188.1390,
|
|
* 14.6560, 129.4922, 470.8512 /
|
|
DATA GO / 0.022 , 2.019 , 9.812 , 13.087 ,
|
|
* 13.804 , 16.061 , 14.293 , 16.114 ,
|
|
* 3.472 , 7.437 , 22.579 , 32.035 ,
|
|
* 27.774 , 33.678 , 28.118 , 31.019 , 34.204 ,
|
|
* 30.892 , 33.189 , 36.181 ,
|
|
* 0.032 , 2.760 , 35.328 , 48.277 ,
|
|
* 7.662 , 16.786 , 42.657 , 54.522 ,
|
|
* 50.204 , 56.044 ,
|
|
* 0.048 , 50.089 , 66.604 ,
|
|
* 8.954 , 18.031 , 57.755 , 72.594 ,
|
|
* 68.388 , 82.397 , 31.960 , 76.876 ,
|
|
* 75.686 , 80.388 ,
|
|
* 10.747 , 52.323 , 94.976 ,
|
|
* 27.405 , 86.350 , 109.917 /
|
|
C
|
|
C data for fluor
|
|
C
|
|
DATA AF / 2.0001, 39.9012, 122.0986,
|
|
* 10.0000, 30.0000, 50.0000,
|
|
* 4.0199, 5.5741, 22.1839, 190.2179,
|
|
* 53.0383, 126.9616, 31.6894, 75.3105,
|
|
* 13.5014, 7.9936, 55.7981, 298.7039,
|
|
* 26.2496, 63.7503, 2.0000, 6.0000, 10.0000,
|
|
* 28.7150, 71.2850,
|
|
* 8.0153, 6.1931, 21.7287, 48.7780, 278.2782,
|
|
* 178.5560, 421.4435, 51.7632, 95.2368 /
|
|
DATA GF / 0.050 , 13.317 , 15.692 ,
|
|
* 15.361 , 17.128 , 18.498 ,
|
|
* 0.048 , 2.735 , 20.079 , 30.277 ,
|
|
* 27.548 , 32.532 , 30.391 , 34.707 ,
|
|
* 4.479 , 12.072 , 31.662 , 51.432 ,
|
|
* 44.283 , 50.964 , 46.193 , 50.436 , 54.880 ,
|
|
* 50.816 , 57.479 ,
|
|
* 0.058 , 3.434 , 14.892 , 37.472 , 69.883 ,
|
|
* 67.810 , 83.105 , 72.435 , 79.747 /
|
|
C
|
|
C data for neon
|
|
C
|
|
DATA ANN / 34.5080, 365.4919, 16.5768, 183.4231,
|
|
* 2.0007, 89.5607, 380.4381, 26.4473, 63.5527,
|
|
* 4.0342, 5.6162, 11.5176, 72.8273,
|
|
* 48.5684, 131.4315, 31.1710, 76.8290,
|
|
* 14.0482, 13.3077, 52.7897, 467.8487,
|
|
* 54.2196, 195.7800 /
|
|
DATA GNN / 17.796 , 20.730 , 17.879 , 20.855 ,
|
|
* 0.097 , 29.878 , 37.221 , 31.913 , 37.551 ,
|
|
* 0.092 , 3.424 , 24.806 , 46.616 ,
|
|
* 45.643 , 54.147 , 48.359 , 57.420 ,
|
|
* 5.453 , 18.560 , 46.583 , 80.101 ,
|
|
* 70.337 , 85.789 /
|
|
C
|
|
C data for sodium
|
|
C
|
|
DATA ANA / 11.6348, 158.3593,
|
|
* 21.0453, 50.9546, 10.1389, 25.8611,
|
|
* 2.0019, 38.0569, 137.9398, 28.3106, 61.6893,
|
|
* 4.0334, 5.8560, 18.1786, 208.9142,
|
|
* 93.6895, 406.3095, 60.4276, 239.5719 /
|
|
DATA GNA / 2.400 , 4.552 ,
|
|
* 34.367 , 40.566 , 34.676 , 40.764 ,
|
|
* 0.170 , 44.554 , 57.142 , 51.689 , 60.576 ,
|
|
* 0.152 , 4.260 , 36.635 , 83.254 ,
|
|
* 72.561 , 89.475 , 75.839 , 92.582 /
|
|
C
|
|
C data for magnesium
|
|
C
|
|
DATA AMG / 10.7445, 291.5057, 53.7488,
|
|
* 6.2270, 31.1291, 132.6438,
|
|
* 40.4379, 159.5618, 20.3845, 79.6154,
|
|
* 2.0007, 106.8977, 343.1010, 10.1326, 237.8581/
|
|
DATA GMG / 2.805 , 6.777 , 9.254 ,
|
|
* 4.459 , 9.789 , 13.137 ,
|
|
* 57.413 , 71.252 , 58.010 , 71.660 ,
|
|
* 0.276 , 74.440 , 94.447 , 54.472 , 95.858 /
|
|
C
|
|
C data for aluminium
|
|
C
|
|
DATA AAL / 4.0009, 11.7804, 142.2179, 13.6585, 96.3371,
|
|
* 10.0807, 49.5843, 285.3343, 14.6872, 59.3122,
|
|
* 6.3277, 29.5086, 134.1634,
|
|
* 46.3164, 153.6833, 22.9896, 77.0103 /
|
|
DATA GAL / 0.014 , 3.841 , 5.420 , 3.727 , 8.833 ,
|
|
* 4.749 , 11.902 , 16.719 , 11.310 , 18.268 ,
|
|
* 6.751 , 16.681 , 24.151 ,
|
|
* 83.551 , 104.787 , 84.293 , 105.171 /
|
|
C
|
|
C data for silicon
|
|
C
|
|
DATA ASI / 7.9658, 4.6762, 1.3512, 123.2267, 443.7797,
|
|
* 4.0000, 7.4186, 24.1754, 60.4060,
|
|
* 14.4695, 11.9721, 26.5062, 269.0521,
|
|
* 9.1793, 4.8766, 29.1442, 52.7998,
|
|
* 13.2674, 36.0417, 180.6910,
|
|
* 6.4839, 27.6851, 135.8301 /
|
|
DATA GSI / 0.020 , 0.752 , 1.614 , 5.831 , 7.431 ,
|
|
* 0.036 , 8.795 , 11.208 , 13.835 ,
|
|
* 5.418 , 7.825 , 14.440 , 19.412 ,
|
|
* 6.572 , 11.449 , 18.424 , 25.457 ,
|
|
* 15.682 , 27.010 , 34.599 ,
|
|
* 9.042 , 24.101 , 37.445 /
|
|
C
|
|
C data for phosphorus
|
|
C
|
|
DATA AP / 13.5211, 22.2130, 353.2583, 10.0000, 150.0000,
|
|
* 8.0241, 5.8085, 51.7542, 252.4002,
|
|
* 4.0021, 20.7985, 62.4194, 200.7786,
|
|
* 11.7414, 63.5124, 179.7420,
|
|
* 6.8835, 32.7777, 228.3366 /
|
|
DATA GP / 1.514 , 5.575 , 9.247 , 8.076 , 10.735 ,
|
|
* 0.043 , 1.212 , 8.545 , 15.525 ,
|
|
* 0.074 , 7.674 , 16.639 , 25.118 ,
|
|
* 8.992 , 24.473 , 40.704 ,
|
|
* 11.464 , 33.732 , 55.455 /
|
|
C
|
|
C data for sulphur
|
|
C
|
|
DATA AS / 3.9615, 5.0780, 15.0944, 362.8588,
|
|
* 51.5995, 268.4002, 12.0000, 276.0000,
|
|
* 11.4377, 5.5126, 141.0009, 254.0478,
|
|
* 33.0518, 126.9479,
|
|
* 4.0707, 4.0637, 5.7245, 144.6376, 106.4909,
|
|
* 4.0011, 19.2813, 27.5990, 35.1179,
|
|
* 94.7454, 283.2486,
|
|
* 10.5474, 28.7137, 65.7378, 24.0000 /
|
|
DATA GS / 0.053 , 1.121 , 5.812 , 9.425 ,
|
|
* 8.936 , 11.277 , 9.600 , 12.551 ,
|
|
* 1.892 , 3.646 , 13.550 , 19.376 ,
|
|
* 16.253 , 21.062 ,
|
|
* 0.043 , 0.123 , 1.590 , 13.712 , 22.050 ,
|
|
* 0.118 , 9.545 , 18.179 , 31.441 ,
|
|
* 30.664 , 56.150 ,
|
|
* 10.704 , 27.075 , 50.599 , 43.034 /
|
|
C
|
|
C data for chlorine
|
|
C
|
|
DATA ACL / 2.0007, 62.5048, 669.4942, 29.0259, 130.9740,
|
|
* 3.9064, 0.3993, 5.3570, 60.3424, 119.9913,
|
|
* 138.1567, 278.8418, 102.3681, 158.6314,
|
|
* 12.6089, 5.9527, 110.5635, 262.8715,
|
|
* 69.2035, 100.7960,
|
|
* 7.3458, 5.6638, 44.1256, 202.7846,
|
|
* 4.0037, 21.8663, 40.5363, 57.5919 /
|
|
DATA GCL / 0.110 , 9.919 , 12.280 , 11.017 , 13.532 ,
|
|
* 0.092 , 0.581 , 1.620 , 13.121 , 19.787 ,
|
|
* 16.365 , 21.988 , 18.065 , 23.594 ,
|
|
* 2.358 , 5.708 , 19.084 , 30.683 ,
|
|
* 24.880 , 33.229 ,
|
|
* 0.102 , 1.391 , 14.709 , 36.968 ,
|
|
* 0.185 , 11.783 , 25.653 , 44.698 /
|
|
C
|
|
C data for argon
|
|
C
|
|
DATA AAR / 43.6623, 324.3375, 20.8298, 163.1701,
|
|
* 2.0026, 137.4515, 258.5445, 62.8129, 149.1867,
|
|
* 4.0495, 14.4466, 46.8234, 124.6651,
|
|
* 151.9828, 268.0157, 101.1302, 150.8691,
|
|
* 13.3718, 8.6528, 60.4614, 285.5072,
|
|
* 6.7655, 4.7684, 12.8631, 54.5260 /
|
|
DATA GAR / 12.638 , 14.958 , 12.833 , 15.139 ,
|
|
* 0.178 , 17.522 , 23.584 , 20.464 , 25.150 ,
|
|
* 0.151 , 1.561 , 17.399 , 30.871 ,
|
|
* 24.684 , 33.978 , 27.091 , 36.481 ,
|
|
* 2.810 , 8.877 , 24.351 , 44.489 ,
|
|
* 0.144 , 1.160 , 10.210 , 27.178 /
|
|
C
|
|
C data for potassium
|
|
C
|
|
DATA AK / 12.9782, 148.6673, 6.3493,
|
|
* 66.3444, 101.6553, 4.0001, 13.4465, 46.5534,
|
|
* 2.0171, 116.4767, 713.4965, 63.5907, 396.4079,
|
|
* 2.0000, 10.0000, 30.0000,
|
|
* 4.0702, 5.7791, 52.6795, 327.4539,
|
|
* 62.8604, 357.1331, 55.9337, 196.0646,
|
|
* 10.9275, 5.5398, 43.2761, 76.2560,
|
|
* 42.0000, 18.0000 /
|
|
DATA GK / 1.871 , 3.713 , 18.172 ,
|
|
* 21.185 , 27.705 , 2.059 , 23.709 , 28.542 ,
|
|
* 0.273 , 26.709 , 39.640 , 31.220 , 41.865 ,
|
|
* 29.955 , 37.557 , 42.862 ,
|
|
* 0.228 , 2.274 , 21.703 , 50.191 ,
|
|
* 32.145 , 49.262 , 34.155 , 51.718 ,
|
|
* 3.043 , 5.479 , 20.547 , 30.680 ,
|
|
* 36.275 , 47.345 /
|
|
C
|
|
C data for calcium
|
|
C
|
|
DATA ACA / 18.2366, 27.5012, 149.2617, 94.5242, 705.4711,
|
|
* 11.8706, 14.0710, 106.0547,
|
|
* 57.2414, 110.7567, 29.8121, 54.1874,
|
|
* 2.0184, 97.5784, 282.3939, 209.1871, 252.8129/
|
|
DATA GCA / 2.050 , 3.349 , 5.321 , 4.873 , 7.017 ,
|
|
* 1.769 , 5.109 , 9.524 ,
|
|
* 27.271 , 41.561 , 29.172 , 42.140 ,
|
|
* 0.394 , 28.930 , 52.618 , 38.593 , 49.646 /
|
|
C
|
|
C data for scandium
|
|
C
|
|
DATA ASC / 6.0014, 83.1958, 67.3666, 329.4354,
|
|
* 44.0793, 169.9969, 533.9195,
|
|
* 34.1642, 124.8475, 228.9879,
|
|
* 11.9979, 16.9280, 28.4778, 82.0418, 234.5360,
|
|
* 6.0042, 2.7101, 13.9801, 65.3039,
|
|
* 12.0000, 12.0000,
|
|
* 2.0051, 2.9621, 29.0306 /
|
|
DATA GSC / 0.021 , 2.056 , 3.551 , 5.465 ,
|
|
* 1.535 , 3.797 , 6.203 ,
|
|
* 2.389 , 4.858 , 7.141 ,
|
|
* 0.011 , 0.430 , 1.156 , 3.711 , 8.863 ,
|
|
* 0.025 , 3.499 , 10.463 , 18.606 ,
|
|
* 41.779 , 57.217 ,
|
|
* 0.539 , 24.442 , 51.079 /
|
|
C
|
|
C data for titanium
|
|
C
|
|
DATA ATI / 7.0887, 8.9186, 17.5633, 206.6832, 438.5735,
|
|
* 654.1721,
|
|
* 38.0462, 69.6271, 364.2845, 832.0408,
|
|
* 98.8562, 57.9934, 442.1498,
|
|
* 19.7843, 32.0637, 37.0895, 110.6682, 288.4946,
|
|
* 521.8837,
|
|
* 10.0000, 34.0000, 120.0000,
|
|
* 16.1691, 22.3550, 24.1646, 83.5128, 222.7963,
|
|
* 6.0020, 4.6177, 25.2636, 52.1162,
|
|
* 12.0000, 8.0000 /
|
|
DATA GTI / 0.021 , 0.048 , 1.029 , 2.183 , 4.109 ,
|
|
* 5.785 ,
|
|
* 0.846 , 1.792 , 3.836 , 5.787 ,
|
|
* 2.561 , 4.869 , 6.340 ,
|
|
* 0.023 , 0.124 , 0.774 , 1.810 , 4.980 ,
|
|
* 9.585 ,
|
|
* 1.082 , 4.928 , 11.279 ,
|
|
* 0.041 , 1.375 , 4.768 , 10.985 , 19.769 ,
|
|
* 0.048 , 11.577 , 24.531 , 36.489 ,
|
|
* 54.436 , 75.373 /
|
|
C
|
|
C data for vanadium
|
|
C
|
|
DATA AV / 15.2627, 23.9869, 51.3053, 570.3384,1650.9417,
|
|
* 162.2829, 298.8303, 908.8852,
|
|
* 23.6736, 37.1624, 86.8011, 300.7440, 864.5880,
|
|
* 57.8961, 79.4605, 214.9007, 864.7425,
|
|
* 61.8508, 64.0845, 192.8298, 718.2349,
|
|
* 23.8116, 68.2495, 135.0613, 536.7632,
|
|
* 15.9543, 22.5542, 71.4921, 248.9544,
|
|
* 6.0006, 5.8785, 50.5077, 97.6129 /
|
|
DATA GV / 0.026 , 0.145 , 0.718 , 2.586 , 5.458 ,
|
|
* 2.171 , 4.153 , 6.097 ,
|
|
* 0.009 , 0.366 , 1.504 , 5.294 , 10.126 ,
|
|
* 1.796 , 2.353 , 6.068 , 12.269 ,
|
|
* 2.560 , 3.674 , 6.593 , 12.880 ,
|
|
* 0.045 , 1.684 , 8.162 , 21.262 ,
|
|
* 0.065 , 1.746 , 15.158 , 33.141 ,
|
|
* 0.077 , 21.229 , 44.134 , 60.203 /
|
|
C
|
|
C data for chromium
|
|
C
|
|
DATA ACR / 30.1842, 79.2847, 149.5293,
|
|
* 215.3696, 119.1974, 741.4321,
|
|
* 184.9946,1352.5038, 784.4937,
|
|
* 46.6191, 160.1361, 488.0449, 657.1928,
|
|
* 47.1742, 267.0275, 441.1324, 150.6650,
|
|
* 24.3768, 122.8359, 285.5092, 794.1654,
|
|
* 24.2296, 75.0258, 172.9452, 543.6511,
|
|
* 15.9819, 17.6800, 95.2003, 225.0947 /
|
|
DATA GCR / 0.993 , 3.070 , 5.673 ,
|
|
* 3.339 , 4.801 , 7.198 ,
|
|
* 2.829 , 4.990 , 7.643 ,
|
|
* 1.645 , 3.727 , 7.181 , 12.299 ,
|
|
* 2.902 , 4.273 , 8.569 , 14.912 ,
|
|
* 0.047 , 2.566 , 9.441 , 21.198 ,
|
|
* 0.078 , 2.242 , 15.638 , 32.725 ,
|
|
* 0.103 , 2.146 , 26.153 , 49.381 /
|
|
C
|
|
C data for manganese
|
|
C
|
|
DATA AMN / 53.9107, 81.3931, 546.6945 ,
|
|
* 144.1893, 407.8029, 45.6177, 298.4423,2410.9335,
|
|
* 22.6382, 93.8419, 183.9367, 907.5765,
|
|
* 137.0409, 168.6783, 329.0287, 773.2513,
|
|
* 70.1925, 72.3372, 213.9512, 539.5165,
|
|
* 24.2373, 93.5415, 456.6167, 506.5484,
|
|
* 24.7687, 66.9896, 264.1853, 484.0161 /
|
|
DATA GMN / 2.527 , 4.204 , 6.602 ,
|
|
* 4.155 , 7.321 , 2.285 , 5.631 , 8.448 ,
|
|
* 1.496 , 3.839 , 7.751 , 13.484 ,
|
|
* 3.681 , 6.054 , 9.934 , 14.936 ,
|
|
* 3.531 , 6.967 , 15.222 , 25.069 ,
|
|
* 0.071 , 2.896 , 20.725 , 37.383 ,
|
|
* 0.126 , 2.660 , 28.528 , 53.413 /
|
|
C
|
|
C data for iron
|
|
C
|
|
DATA AFE / 14.4102, 2.7050, 421.6612, 940.1484,
|
|
* 36.2187, 22.8883, 239.5997, 825.2919,
|
|
* 110.0242, 992.3040, 640.6715,
|
|
* 17.0494, 32.3783, 34.3184, 420.9626,1067.2064,
|
|
* 154.0059, 462.1117, 329.8618,
|
|
* 15.7906, 47.1186, 279.9292, 692.1005,
|
|
* 91.0206, 206.3082, 706.9927, 836.6689,
|
|
* 40.0790, 27.6965, 28.2243, 18.0001,
|
|
* 24.0899, 89.6340, 51.5756, 241.6980 /
|
|
DATA GFE / 0.066 , 0.339 , 2.897 , 6.585 ,
|
|
* 0.923 , 1.679 , 4.620 , 7.053 ,
|
|
* 4.249 , 5.875 , 7.781 ,
|
|
* 0.062 , 0.283 , 1.504 , 5.430 , 11.210 ,
|
|
* 2.792 , 7.627 , 13.623 ,
|
|
* 0.077 , 3.723 , 12.137 , 23.700 ,
|
|
* 2.688 , 7.595 , 15.444 , 25.587 ,
|
|
* 3.982 , 4.677 , 6.453 , 23.561 ,
|
|
* 0.102 , 3.354 , 22.954 , 33.796 /
|
|
C
|
|
C data for cobalt
|
|
C
|
|
DATA ACO / 11.9120, 20.4424, 28.3863, 132.5038, 600.7461,
|
|
* 33.3092, 237.4331, 977.2502,
|
|
* 55.5396, 318.8169, 619.6366,
|
|
* 32.6900, 83.8694, 107.4378,
|
|
* 11.2593, 38.2239, 22.9964, 261.3486, 637.1485,
|
|
* 23.0233, 41.6599, 264.6460, 181.6699,
|
|
* 16.0356, 7.8633, 70.3158, 423.3512, 742.3553,
|
|
* 0. /
|
|
DATA GCO / 0.112 , 0.341 , 0.809 , 3.808 , 6.723 ,
|
|
* 2.057 , 3.484 , 7.210 ,
|
|
* 2.405 , 5.133 , 8.097 ,
|
|
* 2.084 , 5.291 , 8.426 ,
|
|
* 0.135 , 0.517 , 1.606 , 6.772 , 12.622 ,
|
|
* 2.512 , 4.348 , 8.253 , 15.377 ,
|
|
* 0.132 , 0.863 , 3.086 , 11.789 , 23.263 ,
|
|
* 0. /
|
|
C
|
|
C data for nickel
|
|
C
|
|
DATA ANI / 7.1268, 12.4486, 11.9953, 10.0546, 114.1658,
|
|
* 391.2064,
|
|
* 26.3908, 213.8081, 938.7927,
|
|
* 4.1421, 37.3781, 25.9712, 333.3397, 311.1633,
|
|
* 33.1031, 184.1854, 136.7072,
|
|
* 11.1915, 5.4174, 53.6793, 460.6781, 380.0056,
|
|
* 0. /
|
|
DATA GNI / 0.026 , 0.137 , 0.315 , 1.778 , 4.029 ,
|
|
* 6.621 ,
|
|
* 2.249 , 4.042 , 7.621 ,
|
|
* 0.191 , 1.235 , 3.358 , 8.429 , 17.096 ,
|
|
* 3.472 , 9.065 , 16.556 ,
|
|
* 0.194 , 1.305 , 5.813 , 14.172 , 26.169 ,
|
|
* 0. /
|
|
C
|
|
C data for copper
|
|
C
|
|
DATA ACU / 11.0549, 238.9423, 10.3077, 126.2990,1073.3876,
|
|
* 30.0000, 50.0000, 60.0000,
|
|
* 19.2984, 50.5974, 240.2021,1216.9016,
|
|
* 48.3048, 583.2011, 320.4931,
|
|
* 4.0155, 70.3264, 313.1213, 536.5331,
|
|
* 0. /
|
|
DATA GCU / 4.212 , 7.227 , 1.493 , 5.859 , 9.709 ,
|
|
* 7.081 , 9.362 , 10.130 ,
|
|
* 2.865 , 8.260 , 14.431 , 18.292 ,
|
|
* 9.650 , 14.640 , 24.320 ,
|
|
* 0.337 , 8.520 , 16.925 , 28.342 ,
|
|
* 0. /
|
|
C
|
|
C data for zinc
|
|
C
|
|
DATA AZN / 15.9880, 484.0042, 18.5863, 123.4134,
|
|
* 3.0000, 189.0000,
|
|
* 6.1902, 38.9317, 204.8780,
|
|
* 10.2588, 89.3771, 370.3640, 30.0000, 128.0000,
|
|
* 24.6904, 106.7491, 439.5586,
|
|
* 0. /
|
|
DATA GZN / 4.546 , 8.840 , 10.247 , 16.620 ,
|
|
* 11.175 , 16.321 ,
|
|
* 6.113 , 12.964 , 16.444 ,
|
|
* 7.926 , 13.633 , 24.353 , 16.286 , 24.910 ,
|
|
* 10.291 , 20.689 , 32.077 ,
|
|
* 0. /
|
|
C
|
|
DATA ICOMP /0/
|
|
C
|
|
c SAVE ALF,GAM,XL,CHION,INDEX0,INDEXS,INDEXM,IGPR,IG0,ICOMP
|
|
C
|
|
C Initialization of auxiliary arrays (executed only once)
|
|
C
|
|
IF(ICOMP.EQ.0) THEN
|
|
IND=1
|
|
DO K=1,NIONS
|
|
INDEXS(K)=IND
|
|
IND=IND+IS(K)
|
|
END DO
|
|
IND=1
|
|
DO K=1,NSS
|
|
INDEXM(K)=IND
|
|
IND=IND+IM(K)
|
|
END DO
|
|
ICOMP=1
|
|
END IF
|
|
C
|
|
MODE=MODPF(IAT)
|
|
IF(MODE.GT.0) GO TO 80
|
|
|
|
IF(IAT.EQ.26 .AND. IZI.GE.4 .AND. IZI.LE.9) GO TO 170
|
|
IF(IAT.EQ.28 .AND. IZI.GE.4 .AND. IZI.LE.9) GO TO 171
|
|
IF(IZI.LE.0.OR.IAT.LE.0) GO TO 70
|
|
|
|
IF(IZI.GT.5) THEN
|
|
IF(IAT.LT.IZI) THEN
|
|
U=1.
|
|
DUT=0.
|
|
DUN=0.
|
|
RETURN
|
|
END IF
|
|
IF(IAT.GT.8) THEN
|
|
U=IGLE(IAT-IZI+1)
|
|
DUT=0.
|
|
DUN=0.
|
|
RETURN
|
|
END IF
|
|
CALL PFCNO(IAT,IZI,T,ANE,U)
|
|
RETURN
|
|
END IF
|
|
c
|
|
c Irwin partition functions by default
|
|
c
|
|
if(iirwin.gt.0.and.t.lt.16000.) then
|
|
if(izi.le.2) then
|
|
call mpartf(iat,izi,0,t,u0,du0)
|
|
u=u0
|
|
dut=0.
|
|
if(u0.gt.0..and.dut.gt.0.) dut=u0/t*du0
|
|
return
|
|
end if
|
|
else if(iat.gt.30.and.izi.le.3) then
|
|
go to 90
|
|
end if
|
|
c
|
|
IF(MODE.LT.0) GO TO 70
|
|
I0=INDEX0(IZI,IAT)
|
|
IF(I0.LE.0) GO TO 60
|
|
C
|
|
C Traving, Baschek, Holweger formula
|
|
C
|
|
QZ=IZI
|
|
THET=5.0404D3/T
|
|
A=31.321*QZ*QZ*THET
|
|
XMAX2=XMAX*XMAX
|
|
QQ=XMAX/4.*(XMAX2+XMAX+SIXTH+A+A*A*HALF/XMAX2)
|
|
QAS1=XMAX*THIRD*(XMAX2+TRHA*XMAX+HALF)
|
|
IS0=INDEXS(I0)
|
|
ISS=IS0+IS(I0)-1
|
|
SU1=0.
|
|
SU2=0.
|
|
SQA=0.
|
|
SQQ=0.
|
|
SQT=0.
|
|
SQ2=0.
|
|
DO K=IS0,ISS
|
|
XXL=XL(K)
|
|
GPR=IGPR(K)
|
|
X=CHION(K)*THET
|
|
EX=0.
|
|
IF(X.LT.30) EX=EXP(-X*2.30258029299405)
|
|
SQQ=SQQ+GPR*EX
|
|
QAS=(QAS1-XXL*THIRD*(XXL*XXL+TRHA*XXL+HALF)+(XMAX-XXL)*
|
|
* (UN+A*HALF/XXL/XMAX)*A)*GPR*EX
|
|
SQA=SQA+QAS
|
|
SQ2=SQ2+QAS*CHION(K)
|
|
SQT=SQT+GPR*(XMAX-XXL)*(UN+A/XMAX/XXL)*EX
|
|
M0=INDEXM(K)
|
|
M1=M0+IM(K)-1
|
|
AL1=0.
|
|
AL2=0.
|
|
DO M=M0,M1
|
|
XG=GAM(M)*THET
|
|
IF(XG.LE.20.) THEN
|
|
XM=EXP(-XG*2.30258029299405)*ALF(M)
|
|
AL1=AL1+XM
|
|
AL2=AL2+GAM(M)*XM
|
|
END IF
|
|
END DO
|
|
SU1=SU1+AL1
|
|
SU2=SU2+AL2
|
|
END DO
|
|
U=IG0(I0)
|
|
U=U+SU1+SQA
|
|
IF(U.LT.0.) U=IG0(I0)
|
|
DUT=(2.302580293*THET*(SU2+SQ2)+QQ*SQQ-A*SQT)/T
|
|
DUN=-QQ*SQQ/ANE
|
|
RETURN
|
|
C
|
|
C constant value of partition function for some ions (even if
|
|
C MODPF = 0)
|
|
C
|
|
60 U=-I0
|
|
DUT=0.
|
|
DUN=0.
|
|
RETURN
|
|
C
|
|
C non-standard, user supplied formula
|
|
C
|
|
70 CALL PFSPEC(IAT,IZI,T,ANE,U,DUT,DUN)
|
|
RETURN
|
|
C
|
|
C Partition functions for Iron (From Sparks and Fischel)
|
|
C
|
|
170 CALL PFFE(IZI,T,ANE,U,DUT,DUN)
|
|
RETURN
|
|
C
|
|
C Partition functions for Nickel (from Kurucz predicted levels)
|
|
C
|
|
171 CALL PFNI(IZI,T,U,DUT,DUN)
|
|
RETURN
|
|
C
|
|
C Opacity Project value
|
|
C
|
|
80 call opfrac(iat,izi,t,ane,u,opfra)
|
|
DUT=0.
|
|
DUN=0.
|
|
RETURN
|
|
C
|
|
C Modified Kurucz partition functions for IAT > 30
|
|
C
|
|
90 CALL PFHEAV(IAT,IZI,3,T,ANE,U)
|
|
DUT=0.
|
|
DUN=0.
|
|
RETURN
|
|
END
|
|
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
|
|
SUBROUTINE PFCNO(IAT,IZI,T,ANE,PF)
|
|
c ===================================
|
|
|
|
c Partition functions for the high ions of CNO:
|
|
|
|
c (a) H-like ions: C VI, N VII, O VIII
|
|
c (b) He-like ions: N VI, O VII
|
|
c (c) O VI from Sparks & Fischel, 1971, NASA SP-3066
|
|
|
|
c Output: PF partition function
|
|
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
|
|
PARAMETER (P1=0.1402,P2=0.1285,P3=1.,P4=3.15,P5=4.)
|
|
DIMENSION TT(35),PN(10)
|
|
DIMENSION P6A(24),P6B(10,11)
|
|
|
|
DATA TT /
|
|
* 18.,19.,20.,21.,22.,23.,24.,25.,26.,27.,28.,29.,30.,
|
|
* 32.,34.,36.,38.,40.,42.,44.,46.,48.,
|
|
* 50.,55.,60.,65.,70.,75.,80.,85.,90.,95.,100.,125.,150./
|
|
|
|
DATA PN /-2.,-1.,0.,1.,2.,3.,4.,5.,6.,7./
|
|
c
|
|
DATA P6A /
|
|
* 0.302, 0.302, 0.302, 0.303, 0.303, 0.304, 0.305, 0.306,
|
|
* 0.307, 0.308, 0.310, 0.312, 0.313, 0.318, 0.322, 0.327,
|
|
* 0.333, 0.339, 0.346, 0.353, 0.360, 0.367, 0.375, 0.394/
|
|
c
|
|
DATA P6B /
|
|
* 0.414,9*0.413,
|
|
* 0.436,0.433,0.433,7*0.432,
|
|
* 0.472,0.458,0.453,7*0.451,
|
|
* 0.560,0.499,0.478,0.471,0.469,5*0.468,
|
|
* 0.762,0.593,0.522,0.497,0.489,0.486,4*0.485,
|
|
* 1.090,0.782,0.611,0.539,0.513,0.505,0.502,3*0.501,
|
|
* 1.478,1.070,0.775,0.615,0.550,0.527,0.519,0.517,0.516,0.516,
|
|
* 1.867,1.408,1.018,0.749,0.612,0.557,0.539,0.533,0.531,0.530,
|
|
* 2.233,1.752,1.306,0.944,0.713,0.604,0.564,0.550,0.545,0.544,
|
|
* 3.665,3.166,2.668,2.176,1.700,1.269,0.934,0.735,0.648,0.616,
|
|
* 4.633,4.133,3.633,3.134,2.636,2.146,1.674,1.254,0.942,0.763/
|
|
|
|
|
|
IF (IAT.LT.6 .OR. IAT.GT.8 .OR. IZI.LE.5) THEN
|
|
PF=0.
|
|
PRINT *,' Routine PFCNO does not provide U for this ion '
|
|
* ,IAT,IZI
|
|
STOP
|
|
END IF
|
|
IF (IZI.GT.IAT) THEN
|
|
PF=1.
|
|
RETURN
|
|
END IF
|
|
|
|
TK = BOLK*T
|
|
IZIT = IAT-IZI
|
|
|
|
C 1. H-like case
|
|
|
|
IF(IZIT.EQ.0) THEN
|
|
ANEL = LOG(ANE)
|
|
AA = 0.09*EXP(ANEL/6.)/SQRT(T)
|
|
ANEL23 = EXP(-2./3.*ANEL)
|
|
Z = FLOAT(IZI)
|
|
Z2 = Z*Z
|
|
CBZ = 2.*8.59D14*Z*Z*Z
|
|
E0KT = EH*Z2/TK
|
|
|
|
PF=0.
|
|
DO II=1,NLMX
|
|
XN = FLOAT(II)
|
|
XN2 = XN*XN
|
|
|
|
IF(XN.LE.3.01) THEN
|
|
XKN = 1.
|
|
ELSE
|
|
XN1 = 1./(XN+1.)
|
|
XKN = 16./3.*XN*XN1*XN1
|
|
END IF
|
|
BETA = CBZ*XKN/XN2/XN2*ANEL23
|
|
X=EXP(P4*LOG(1.+P3*AA))
|
|
C1=P1*(X+P5*(Z-1.)*AA*AA*AA)
|
|
C2=P2*X
|
|
F=(C1*BETA*BETA*BETA)/(1.+C2*BETA*SQRT(BETA))
|
|
WI=F/(1.+F)
|
|
|
|
EE = EXP(-E0KT/XN2)
|
|
PF = PF+XN2*WI*EE
|
|
END DO
|
|
PF = 2.*PF
|
|
END IF
|
|
|
|
C 2. He-like case
|
|
|
|
IF(IZIT.EQ.1) THEN
|
|
PF=1.
|
|
END IF
|
|
|
|
C 3. O VI
|
|
|
|
IF(IZIT.EQ.2) THEN
|
|
|
|
IF(T.LT.18000.) THEN
|
|
PF=2.
|
|
ELSE
|
|
NA = 24
|
|
NB = 11
|
|
PNE = LOG10(ANE*TK)
|
|
T0 = 0.001*T
|
|
J = 1
|
|
IF(PNE.LT.PN(1)) GO TO 15
|
|
IF(PNE.GT.PN(10)) THEN
|
|
J1 = 10
|
|
J2 = 10
|
|
GO TO 16
|
|
END IF
|
|
DO J=1,9
|
|
IF(PNE.GE.PN(J) .AND. PNE.LT.PN(J+1)) GO TO 15
|
|
END DO
|
|
15 J1 = J
|
|
J2 = J+1
|
|
IF(PNE.LT.PN(1)) J2 = 1
|
|
16 DO I=1,34
|
|
IF(T0.GE.TT(I) .AND. T0.LT.TT(I+1)) GO TO 25
|
|
END DO
|
|
25 I1 = I
|
|
I2 = I+1
|
|
IF(T0.GT.TT(35)) THEN
|
|
I1 = 35
|
|
I2 = 35
|
|
END IF
|
|
IF(I2.LE.24) THEN
|
|
PX1=P6A(I1)
|
|
PX2=P6A(I1)
|
|
PY1=P6A(I2)
|
|
PY2=P6A(I2)
|
|
ELSE IF (I1.EQ.24) THEN
|
|
PX1=P6A(I1)
|
|
PX2=P6A(I1)
|
|
PY1=P6B(J1,I2-24)
|
|
PY2=P6B(J2,I2-24)
|
|
ELSE
|
|
PX1=P6B(J1,I1-24)
|
|
PX2=P6B(J2,I1-24)
|
|
PY1=P6B(J1,I2-24)
|
|
PY2=P6B(J2,I2-24)
|
|
END IF
|
|
DLGUNX=PX2-PX1
|
|
PX=PX1+(PNE-PN(J1))*DLGUNX
|
|
DLGUNY=PY2-PY1
|
|
PY=PY1+(PNE-PN(J1))*DLGUNY
|
|
DELT=TT(I2)-TT(I1)
|
|
IF(DELT.NE.0.) THEN
|
|
DLGUT=(PY-PX)/DELT
|
|
PF=PX+(T0-TT(I1))*DLGUT
|
|
ELSE
|
|
PF=PX
|
|
ENDIF
|
|
PF=EXP(2.302585093*PF)
|
|
END IF
|
|
END IF
|
|
|
|
RETURN
|
|
END
|
|
|
|
C
|
|
C
|
|
C *******************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE PFSPEC(IAT,IZI,T,ANE,U,DUT,DUN)
|
|
C ==========================================
|
|
|
|
C Non-standard evaluation of the partition function
|
|
C user supplied procedure
|
|
C
|
|
C Input:
|
|
C IAT - atomic number
|
|
C IZI - ionic charge (=1 for neutrals, =1 for once ionized, etc)
|
|
C T - temperature
|
|
C ANE - electron density
|
|
C XMAX - principal quantum number of the last bound level
|
|
C
|
|
C Output:
|
|
C U - partition function
|
|
C DUT - derivative dU/dT
|
|
C DUN - derivative dU/d(ANE)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
C
|
|
U=0.
|
|
DUT=0.
|
|
DUN=0.
|
|
T1=T
|
|
A1=ANE
|
|
IF(IAT.EQ.10) THEN
|
|
IF(IZI.EQ.5) U=9.
|
|
IF(IZI.EQ.6) U=6.
|
|
IF(IZI.EQ.7) U=12.
|
|
IF(IZI.EQ.8) U=8.
|
|
IF(IZI.EQ.9) U=1.
|
|
RETURN
|
|
END IF
|
|
IF(IAT.EQ.16) THEN
|
|
IF(IZI.EQ.5) U=1.
|
|
IF(IZI.EQ.6) U=2.
|
|
IF(IZI.EQ.7) U=1.
|
|
IF(IZI.EQ.8) U=6.
|
|
IF(IZI.EQ.9) U=9.
|
|
RETURN
|
|
END IF
|
|
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
C
|
|
subroutine pffe(ion,t,ane,pf,dut,dun)
|
|
c =====================================
|
|
c
|
|
c partition functions for Fe IV to Fe IX
|
|
c after Fischel and Sparks, 1971, NASA SP-3066
|
|
c
|
|
c Output: PF partition function
|
|
c DUT d(PF)/dT
|
|
c DUN d(PF)/d(ANE)
|
|
c
|
|
include 'IMPLIC.FOR'
|
|
c
|
|
dimension tt(50),pn(10),nca(9)
|
|
dimension p4a(22),p4b(10,28),
|
|
* p5a(30),p5b(10,20),
|
|
* p6a(37),p6b(10,13),
|
|
* p7a(40),p7b(10,10),
|
|
* p8a(41),p8b(10,9),
|
|
* p9a(45),p9b(10,5)
|
|
c
|
|
parameter (xen=2.302585093,xmil=0.001,xmilen=xmil*xen)
|
|
parameter (xbtz=1.38054d-16)
|
|
c
|
|
data nca /3*0,22,30,37,40,41,45/
|
|
* nne /10/
|
|
c
|
|
data tt /
|
|
* 3.,4.,5.,6.,7.,8.,9.,10.,11.,12.,13.,14.,15.,16.,17.,18.,19.,
|
|
* 20.,21.,22.,23.,24.,25.,26.,27.,28.,29.,30.,
|
|
* 32.,34.,36.,38.,40.,42.,44.,46.,48.,
|
|
* 50.,55.,60.,65.,70.,75.,80.,85.,90.,95.,100.,125.,150./
|
|
c
|
|
data pn /-2.,-1.,0.,1.,2.,3.,4.,5.,6.,7./
|
|
c
|
|
data p4a /
|
|
* 0.778, 0.778, 0.778, 0.779, 0.783, 0.789, 0.801, 0.818,
|
|
* 0.842, 0.871, 0.906, 0.945, 0.987, 1.030, 1.074, 1.117,
|
|
* 1.160, 1.201, 1.242, 1.280, 1.317, 1.353/
|
|
c
|
|
data p4b /
|
|
* 1.406,1.393,1.389,7*1.387,
|
|
* 1.464,1.434,1.424,1.421,1.420,5*1.419,
|
|
* 1.546,1.483,1.461,1.454,1.451,1.451,4*1.450,
|
|
* 1.665,1.547,1.503,1.488,1.482,1.481,4*1.480,
|
|
* 1.826,1.636,1.553,1.524,1.514,1.510,4*1.509,
|
|
* 2.024,1.755,1.618,1.564,1.546,1.540,1.538,3*1.537,
|
|
* 2.480,2.087,1.814,1.674,1.619,1.599,1.593,1.591,1.590,1.590,
|
|
* 2.945,2.489,2.105,1.846,1.717,1.667,1.649,1.643,1.641,1.640,
|
|
* 3.379,2.897,2.452,2.089,1.859,1.751,1.710,1.696,1.691,1.689,
|
|
* 3.774,3.283,2.808,2.381,2.054,1.864,1.782,1.751,1.741,1.738,
|
|
* 4.133,3.637,3.150,2.688,2.292,2.015,1.871,1.814,1.793,1.786,
|
|
* 4.460,3.962,3.468,2.989,2.549,2.199,1.984,1.886,1.848,1.835,
|
|
* 4.757,4.258,3.762,3.274,2.809,2.406,2.121,1.972,1.908,1.886,
|
|
* 5.029,4.530,4.032,3.539,3.061,2.624,2.279,2.073,1.976,1.939,
|
|
* 5.279,4.780,4.281,3.785,3.299,2.840,2.450,2.189,2.051,1.996,
|
|
* 5.510,5.010,4.511,4.013,3.522,3.050,2.628,2.318,2.136,2.057,
|
|
* 6.014,5.514,5.014,4.515,4.018,3.530,3.065,2.666,2.381,2.228,
|
|
* 6.435,5.935,5.435,4.936,4.437,3.943,3.460,3.022,2.658,2.422,
|
|
* 6.794,6.294,5.794,5.294,4.794,4.297,3.807,3.343,2.939,2.631,
|
|
* 7.102,6.602,6.102,5.602,5.102,4.604,4.110,3.638,3.194,2.845,
|
|
* 7.370,6.870,6.370,5.870,5.370,4.871,4.375,3.892,3.439,3.052,
|
|
* 7.606,7.106,6.606,6.106,5.605,5.106,4.608,4.125,3.661,3.249,
|
|
* 7.815,7.315,6.814,6.314,5.814,5.314,4.816,4.333,3.851,3.418,
|
|
* 8.001,7.501,7.001,6.500,6.000,5.500,5.001,4.511,4.032,3.586,
|
|
* 8.168,7.668,7.168,6.668,6.168,5.667,5.168,4.680,4.197,3.741,
|
|
* 8.319,7.819,7.319,6.819,6.319,5.818,5.319,4.832,4.347,3.884,
|
|
* 8.900,8.399,7.899,7.399,6.899,6.398,5.898,5.405,4.917,4.431,
|
|
* 9.294,8.794,8.294,7.793,7.293,6.793,6.292,5.799,5.306,4.824/
|
|
c
|
|
data p5a /
|
|
* 1.235, 1.276, 1.301, 1.321, 1.339, 1.359, 1.381, 1.405,
|
|
* 1.432, 1.460, 1.489, 1.518, 1.546, 1.574, 1.601, 1.627,
|
|
* 1.652, 1.675, 1.697, 1.718, 1.738, 1.757, 1.775, 1.792,
|
|
* 1.808, 1.823, 1.838, 1.851, 1.877, 1.900/
|
|
c
|
|
data p5b /
|
|
* 1.943,1.928,1.923,7*1.921,
|
|
* 2.011,1.964,1.947,1.942,1.941,5*1.940,
|
|
* 2.144,2.025,1.980,1.965,1.960,1.958,4*1.957,
|
|
* 2.361,2.137,2.032,1.993,1.980,1.976,1.975,3*1.974,
|
|
* 2.646,2.315,2.121,2.035,2.004,1.994,1.991,1.990,1.989,1.989,
|
|
* 2.960,2.553,2.260,2.102,2.037,2.015,2.007,2.005,2.004,2.004,
|
|
* 3.274,2.823,2.450,2.205,2.086,2.040,2.025,2.020,2.018,2.018,
|
|
* 3.575,3.101,2.674,2.348,2.158,2.075,2.045,2.036,2.032,2.031,
|
|
* 4.251,3.757,3.275,2.829,2.466,2.234,2.124,2.083,2.069,2.064,
|
|
* 4.822,4.324,3.829,3.346,2.895,2.522,2.278,2.161,2.116,2.100,
|
|
* 5.308,4.808,4.310,3.816,3.334,2.888,2.525,2.297,2.187,2.145,
|
|
* 5.725,5.225,4.726,4.228,3.736,3.260,2.828,2.496,2.294,2.206,
|
|
* 6.088,5.589,5.089,4.590,4.093,3.604,3.139,2.733,2.447,2.291,
|
|
* 6.407,5.907,5.407,4.908,4.409,3.915,3.433,2.988,2.629,2.399,
|
|
* 6.689,6.189,5.689,5.189,4.690,4.193,3.704,3.236,2.832,2.535,
|
|
* 6.940,6.440,5.940,5.440,4.941,4.443,3.949,3.469,3.038,2.687,
|
|
* 7.166,6.666,6.166,5.666,5.166,4.667,4.171,3.684,3.237,2.847,
|
|
* 7.370,6.870,6.369,5.869,5.369,4.870,4.373,3.882,3.417,3.008,
|
|
* 8.150,7.649,7.149,6.649,6.149,5.649,5.149,4.651,4.167,3.700,
|
|
* 8.677,8.177,7.676,7.176,6.676,6.176,5.676,5.176,4.687,4.203/
|
|
c
|
|
data p6a /
|
|
* 1.218, 1.273, 1.309, 1.335, 1.358, 1.379, 1.400, 1.421,
|
|
* 1.442, 1.463, 1.484, 1.504, 1.523, 1.542, 1.560, 1.577,
|
|
* 1.594, 1.609, 1.624, 1.638, 1.652, 1.664, 1.677, 1.688,
|
|
* 1.699, 1.709, 1.719, 1.729, 1.746, 1.762, 1.777, 1.790,
|
|
* 1.803, 1.814, 1.825, 1.834, 1.843/
|
|
c
|
|
data p6b /
|
|
* 1.862,1.855,1.853,7*1.852,
|
|
* 1.958,1.900,1.880,1.874,1.872,5*1.871,
|
|
* 2.264,2.045,1.944,1.906,1.894,1.890,4*1.888,
|
|
* 2.776,2.386,2.119,1.984,1.930,1.912,1.906,1.904,2*1.903,
|
|
* 3.321,2.856,2.453,2.165,2.012,1.949,1.927,1.920,1.918,1.917,
|
|
* 3.821,3.333,2.868,2.465,2.178,2.025,1.963,1.941,1.934,1.932,
|
|
* 4.266,3.771,3.285,2.825,2.434,2.164,2.027,1.972,1.953,1.947,
|
|
* 4.662,4.164,3.670,3.187,2.739,2.372,2.135,2.022,1.980,1.965,
|
|
* 5.015,4.516,4.019,3.527,3.052,2.624,2.295,2.102,2.019,1.988,
|
|
* 5.332,4.832,4.344,3.838,3.351,2.889,2.493,2.217,2.075,2.017,
|
|
* 5.618,5.118,4.619,4.121,3.628,3.149,2.711,2.364,2.155,2.058,
|
|
* 6.710,6.210,5.710,5.210,4.711,4.213,3.719,3.241,2.807,2.462,
|
|
* 7.446,6.946,6.446,5.946,5.446,4.946,4.447,3.952,3.474,3.022/
|
|
c
|
|
data p7a /
|
|
* 1.074,1.130,1.167,1.194,1.215,1.234,1.250,1.266,1.280,1.293,
|
|
* 1.306,1.318,1.329,1.340,1.350,1.360,1.369,1.378,1.386,1.394,
|
|
* 1.401,1.408,1.415,1.421,1.427,1.433,1.439,1.444,1.454,1.463,
|
|
* 1.471,1.479,1.486,1.492,1.498,1.504,1.509,1.514,1.525,1.534/
|
|
c
|
|
data p7b /
|
|
* 1.555,1.546,1.544,1.543,6*1.542,
|
|
* 1.617,1.572,1.557,1.552,1.550,1.550,4*1.549,
|
|
* 1.798,1.648,1.587,1.566,1.559,1.557,4*1.556,
|
|
* 2.134,1.832,1.666,1.597,1.573,1.565,1.563,1.562,2*1.561,
|
|
* 2.550,2.138,1.836,1.671,1.602,1.578,1.570,1.568,2*1.567,
|
|
* 2.968,2.504,2.102,1.816,1.665,1.603,1.582,1.575,2*1.572,
|
|
* 3.359,2.875,2.419,2.037,1.779,1.651,1.601,1.584,1.579,1.577,
|
|
* 3.718,3.224,2.745,2.305,1.953,1.736,1.636,1.599,1.586,1.582,
|
|
* 5.097,4.598,4.098,3.601,3.110,2.638,2.217,1.899,1.719,1.643,
|
|
* 6.026,5.526,5.026,4.527,4.028,3.531,3.042,2.576,2.170,1.885/
|
|
c
|
|
data p8a /
|
|
* 0.809,0.849,0.875,0.894,0.908,0.918,0.927,0.934,0.939,0.944,
|
|
* 0.948,0.952,0.955,0.958,0.960,0.962,0.964,0.966,0.967,0.969,
|
|
* 0.970,0.971,0.973,0.974,0.975,0.975,0.976,0.977,0.978,0.980,
|
|
* 0.981,0.982,0.983,0.984,0.984,0.985,0.986,0.986,0.987,0.988,
|
|
* 0.989/
|
|
c
|
|
data p8b /
|
|
* 0.992,0.991,8*0.990,
|
|
* 1.000,0.994,0.992,7*0.991,
|
|
* 1.032,1.005,0.996,0.993,0.992,5*0.991,
|
|
* 1.129,1.040,1.008,0.997,0.993,5*0.992,
|
|
* 1.335,1.132,1.042,1.009,0.998,0.994,0.993,0.993,2*0.992,
|
|
* 1.640,1.312,1.121,1.038,1.007,0.998,0.994,3*0.993,
|
|
* 1.987,1.573,1.269,1.101,1.030,1.005,0.997,2*0.994,0.993,
|
|
* 3.514,3.017,2.526,2.053,1.628,1.305,1.119,1.039,1.010,1.000,
|
|
* 4.569,4.069,3.569,3.072,2.580,2.103,1.671,1.336,1.136,1.048/
|
|
c
|
|
data p9a /39*0.000,0.001,0.002,0.005,0.008,0.014,0.021/
|
|
c
|
|
data p9b /
|
|
* 2*0.032,8*0.031,
|
|
* 0.048,0.045,8*0.044,
|
|
* 0.076,0.065,0.061,0.060,6*0.059,
|
|
* 1.128,0.722,0.429,0.271,0.207,0.184,0.177,0.174,2*0.173,
|
|
* 2.696,2.200,1.712,1.249,0.848,0.564,0.415,0.354,0.333,0.327/
|
|
c
|
|
na=nca(ion)
|
|
nb=50-na
|
|
pne=log10(ane*xbtz*t)
|
|
t0=xmil*t
|
|
j=1
|
|
if(pne.lt.pn(1)) go to 15
|
|
if(pne.gt.pn(nne)) then
|
|
j1=nne
|
|
j2=nne
|
|
goto 16
|
|
endif
|
|
do j=1,nne-1
|
|
if(pne.ge.pn(j).and.pne.lt.pn(j+1)) go to 15
|
|
end do
|
|
15 j1=j
|
|
j2=j1+1
|
|
if(pne.lt.pn(1)) j2=1
|
|
16 do i=1,49
|
|
if(t0.ge.tt(i).and.t0.lt.tt(i+1)) go to 25
|
|
end do
|
|
25 i1=i
|
|
i2=i+1
|
|
if(t0.gt.tt(50)) then
|
|
i1=50
|
|
i2=50
|
|
endif
|
|
if(i2.le.na) then
|
|
if(ion.eq.4) then
|
|
px1=p4a(i1)
|
|
px2=p4a(i1)
|
|
py1=p4a(i2)
|
|
py2=p4a(i2)
|
|
else if(ion.eq.5) then
|
|
px1=p5a(i1)
|
|
px2=p5a(i1)
|
|
py1=p5a(i2)
|
|
py2=p5a(i2)
|
|
else if(ion.eq.6) then
|
|
px1=p6a(i1)
|
|
px2=p6a(i1)
|
|
py1=p6a(i2)
|
|
py2=p6a(i2)
|
|
else if(ion.eq.7) then
|
|
px1=p7a(i1)
|
|
px2=p7a(i1)
|
|
py1=p7a(i2)
|
|
py2=p7a(i2)
|
|
else if(ion.eq.8) then
|
|
px1=p8a(i1)
|
|
px2=p8a(i1)
|
|
py1=p8a(i2)
|
|
py2=p8a(i2)
|
|
else if(ion.eq.9) then
|
|
px1=p9a(i1)
|
|
px2=p9a(i1)
|
|
py1=p9a(i2)
|
|
py2=p9a(i2)
|
|
endif
|
|
else if(i1.eq.na) then
|
|
if(ion.eq.4) then
|
|
px1=p4a(i1)
|
|
px2=p4a(i1)
|
|
py1=p4b(j1,i2-na)
|
|
py2=p4b(j2,i2-na)
|
|
else if(ion.eq.5) then
|
|
px1=p5a(i1)
|
|
px2=p5a(i1)
|
|
py1=p5b(j1,i2-na)
|
|
py2=p5b(j2,i2-na)
|
|
else if(ion.eq.6) then
|
|
px1=p6a(i1)
|
|
px2=p6a(i1)
|
|
py1=p6b(j1,i2-na)
|
|
py2=p6b(j2,i2-na)
|
|
else if(ion.eq.7) then
|
|
px1=p7a(i1)
|
|
px2=p7a(i1)
|
|
py1=p7b(j1,i2-na)
|
|
py2=p7b(j2,i2-na)
|
|
else if(ion.eq.8) then
|
|
px1=p8a(i1)
|
|
px2=p8a(i1)
|
|
py1=p8b(j1,i2-na)
|
|
py2=p8b(j2,i2-na)
|
|
else if(ion.eq.9) then
|
|
px1=p9a(i1)
|
|
px2=p9a(i1)
|
|
py1=p9b(j1,i2-na)
|
|
py2=p9b(j2,i2-na)
|
|
endif
|
|
else
|
|
if(ion.eq.4) then
|
|
px1=p4b(j1,i1-na)
|
|
px2=p4b(j2,i1-na)
|
|
py1=p4b(j1,i2-na)
|
|
py2=p4b(j2,i2-na)
|
|
else if(ion.eq.5) then
|
|
px1=p5b(j1,i1-na)
|
|
px2=p5b(j2,i1-na)
|
|
py1=p5b(j1,i2-na)
|
|
py2=p5b(j2,i2-na)
|
|
else if(ion.eq.6) then
|
|
px1=p6b(j1,i1-na)
|
|
px2=p6b(j2,i1-na)
|
|
py1=p6b(j1,i2-na)
|
|
py2=p6b(j2,i2-na)
|
|
else if(ion.eq.7) then
|
|
px1=p7b(j1,i1-na)
|
|
px2=p7b(j2,i1-na)
|
|
py1=p7b(j1,i2-na)
|
|
py2=p7b(j2,i2-na)
|
|
else if(ion.eq.8) then
|
|
px1=p8b(j1,i1-na)
|
|
px2=p8b(j2,i1-na)
|
|
py1=p8b(j1,i2-na)
|
|
py2=p8b(j2,i2-na)
|
|
else if(ion.eq.9) then
|
|
px1=p9b(j1,i1-na)
|
|
px2=p9b(j2,i1-na)
|
|
py1=p9b(j1,i2-na)
|
|
py2=p9b(j2,i2-na)
|
|
endif
|
|
end if
|
|
dlgunx=px2-px1
|
|
px=px1+(pne-pn(j1))*dlgunx
|
|
dlguny=py2-py1
|
|
py=py1+(pne-pn(j1))*dlguny
|
|
delt=tt(i2)-tt(i1)
|
|
if(delt.ne.0.) then
|
|
dlgut=(py-px)/delt
|
|
pf=px+(t0-tt(i1))*dlgut
|
|
dlgun=dlgunx+(t0-tt(i1))/delt*(dlguny-dlgunx)
|
|
else
|
|
dlgut=0.
|
|
pf=px
|
|
dlgun=dlgunx
|
|
endif
|
|
pf=exp(xen*pf)
|
|
dut=xmilen*pf*dlgut
|
|
dun=(dlgun*pf-t*dut)/ane
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
subroutine pfni(ion,t,pf,dut,dun)
|
|
c =================================
|
|
c
|
|
c partition functions for Ni IV to Ni IX
|
|
c
|
|
c this routine interpolates within a grid
|
|
c calculated from all levels predicted by
|
|
c Kurucz (1992), i.e. over 12,000 levels per ion.
|
|
c the partition functions depend only on T !
|
|
c (i.e. no level dissolution with increasing density)
|
|
c TL 27-DEC-1994, 23-JAN-1995
|
|
c
|
|
c Output: PF partition function
|
|
c DUT d(PF)/dT
|
|
c DUN d(PF)/d(ANE)
|
|
c
|
|
include 'IMPLIC.FOR'
|
|
c
|
|
dimension g0(6)
|
|
dimension p4a(190),p4b(170)
|
|
dimension p5a(190),p5b(170)
|
|
dimension p6a(190),p6b(170)
|
|
dimension p7a(190),p7b(170)
|
|
dimension p8a(190),p8b(170)
|
|
dimension p9a(190),p9b(170)
|
|
parameter (xen=2.302585093,xmil=0.001)
|
|
c
|
|
data g0/28.,25.,6.,25.,28.,21./
|
|
c
|
|
data p4a/
|
|
. 1.447,1.464,1.482,1.501,1.518,1.535,1.551,1.567,1.582,1.596,
|
|
. 1.610,1.623,1.636,1.648,1.659,1.671,1.681,1.692,1.702,1.711,
|
|
. 1.721,1.730,1.739,1.748,1.757,1.765,1.774,1.782,1.791,1.799,
|
|
. 1.808,1.816,1.824,1.833,1.841,1.850,1.859,1.868,1.877,1.886,
|
|
. 1.895,1.905,1.914,1.924,1.934,1.945,1.955,1.966,1.977,1.989,
|
|
. 2.000,2.012,2.025,2.037,2.050,2.063,2.077,2.091,2.105,2.119,
|
|
. 2.134,2.149,2.164,2.179,2.195,2.211,2.227,2.243,2.260,2.276,
|
|
. 2.293,2.310,2.327,2.344,2.362,2.379,2.397,2.414,2.432,2.449,
|
|
. 2.467,2.484,2.502,2.519,2.537,2.554,2.571,2.588,2.606,2.623,
|
|
. 2.640,2.657,2.674,2.690,2.707,2.723,2.740,2.756,2.772,2.788,
|
|
. 2.804,2.819,2.835,2.850,2.866,2.881,2.896,2.911,2.925,2.940,
|
|
. 2.954,2.969,2.983,2.997,3.010,3.024,3.038,3.051,3.064,3.077,
|
|
. 3.090,3.103,3.116,3.128,3.141,3.153,3.165,3.177,3.189,3.201,
|
|
. 3.213,3.224,3.235,3.247,3.258,3.269,3.280,3.291,3.301,3.312,
|
|
. 3.322,3.332,3.343,3.353,3.363,3.373,3.382,3.392,3.402,3.411,
|
|
. 3.421,3.430,3.439,3.448,3.457,3.466,3.475,3.484,3.492,3.501,
|
|
. 3.509,3.518,3.526,3.534,3.542,3.550,3.558,3.566,3.574,3.582,
|
|
. 3.589,3.597,3.604,3.612,3.619,3.626,3.634,3.641,3.648,3.655,
|
|
. 3.662,3.669,3.676,3.682,3.689,3.696,3.702,3.709,3.715,3.722/
|
|
data p4b/
|
|
. 3.589,3.597,3.604,3.612,3.619,3.626,3.634,3.641,3.648,3.655,
|
|
. 3.662,3.669,3.676,3.682,3.689,3.696,3.702,3.709,3.715,3.722,
|
|
. 3.728,3.734,3.740,3.747,3.753,3.759,3.765,3.771,3.777,3.782,
|
|
. 3.788,3.794,3.800,3.805,3.811,3.816,3.822,3.827,3.833,3.838,
|
|
. 3.843,3.849,3.854,3.859,3.864,3.869,3.874,3.879,3.884,3.889,
|
|
. 3.894,3.899,3.904,3.909,3.913,3.918,3.923,3.927,3.932,3.936,
|
|
. 3.941,3.945,3.950,3.954,3.959,3.963,3.967,3.972,3.976,3.980,
|
|
. 3.984,3.988,3.993,3.997,4.001,4.005,4.009,4.013,4.017,4.021,
|
|
. 4.024,4.028,4.032,4.036,4.040,4.043,4.047,4.051,4.055,4.058,
|
|
. 4.062,4.065,4.069,4.072,4.076,4.079,4.083,4.086,4.090,4.093,
|
|
. 4.097,4.100,4.103,4.107,4.110,4.113,4.116,4.120,4.123,4.126,
|
|
. 4.129,4.132,4.135,4.138,4.141,4.144,4.148,4.151,4.154,4.157,
|
|
. 4.159,4.162,4.165,4.168,4.171,4.174,4.177,4.180,4.182,4.185,
|
|
. 4.188,4.191,4.193,4.196,4.199,4.202,4.204,4.207,4.210,4.212,
|
|
. 4.215,4.217,4.220,4.223,4.225,4.228,4.230,4.233,4.235,4.238,
|
|
. 4.240,4.243,4.245,4.247,4.250,4.252,4.255,4.257,4.259,4.262,
|
|
. 4.264,4.266,4.268,4.271,4.273,4.275,4.278,4.280,4.282,4.284/
|
|
data p5a/
|
|
. 1.398,1.408,1.427,1.446,1.466,1.486,1.506,1.526,1.545,1.564,
|
|
. 1.583,1.601,1.619,1.636,1.652,1.668,1.683,1.698,1.712,1.725,
|
|
. 1.738,1.751,1.763,1.775,1.786,1.797,1.808,1.818,1.828,1.837,
|
|
. 1.846,1.855,1.864,1.873,1.881,1.889,1.897,1.904,1.912,1.919,
|
|
. 1.926,1.933,1.940,1.946,1.953,1.960,1.966,1.972,1.979,1.985,
|
|
. 1.991,1.997,2.003,2.009,2.016,2.022,2.028,2.034,2.040,2.046,
|
|
. 2.052,2.058,2.065,2.071,2.077,2.084,2.090,2.097,2.103,2.110,
|
|
. 2.117,2.124,2.131,2.138,2.145,2.152,2.160,2.167,2.175,2.183,
|
|
. 2.191,2.199,2.207,2.216,2.224,2.233,2.241,2.250,2.259,2.268,
|
|
. 2.278,2.287,2.297,2.306,2.316,2.326,2.336,2.346,2.356,2.367,
|
|
. 2.377,2.387,2.398,2.409,2.419,2.430,2.441,2.452,2.463,2.474,
|
|
. 2.485,2.497,2.508,2.519,2.530,2.542,2.553,2.564,2.576,2.587,
|
|
. 2.599,2.610,2.621,2.633,2.644,2.655,2.667,2.678,2.689,2.701,
|
|
. 2.712,2.723,2.734,2.745,2.757,2.768,2.779,2.790,2.801,2.812,
|
|
. 2.822,2.833,2.844,2.855,2.865,2.876,2.886,2.897,2.907,2.918,
|
|
. 2.928,2.938,2.948,2.958,2.968,2.978,2.988,2.998,3.008,3.018,
|
|
. 3.027,3.037,3.046,3.056,3.065,3.075,3.084,3.093,3.102,3.111,
|
|
. 3.120,3.129,3.138,3.147,3.156,3.164,3.173,3.182,3.190,3.198,
|
|
. 3.207,3.215,3.223,3.232,3.240,3.248,3.256,3.264,3.272,3.279/
|
|
data p5b/
|
|
. 3.120,3.129,3.138,3.147,3.156,3.164,3.173,3.182,3.190,3.198,
|
|
. 3.207,3.215,3.223,3.232,3.240,3.248,3.256,3.264,3.272,3.279,
|
|
. 3.287,3.295,3.303,3.310,3.318,3.325,3.333,3.340,3.347,3.355,
|
|
. 3.362,3.369,3.376,3.383,3.390,3.397,3.404,3.411,3.417,3.424,
|
|
. 3.431,3.438,3.444,3.451,3.457,3.464,3.470,3.476,3.483,3.489,
|
|
. 3.495,3.501,3.507,3.514,3.520,3.526,3.531,3.537,3.543,3.549,
|
|
. 3.555,3.561,3.566,3.572,3.578,3.583,3.589,3.594,3.600,3.605,
|
|
. 3.610,3.616,3.621,3.626,3.632,3.637,3.642,3.647,3.652,3.657,
|
|
. 3.662,3.667,3.672,3.677,3.682,3.687,3.692,3.697,3.701,3.706,
|
|
. 3.711,3.716,3.720,3.725,3.729,3.734,3.738,3.743,3.747,3.752,
|
|
. 3.756,3.761,3.765,3.769,3.774,3.778,3.782,3.786,3.790,3.795,
|
|
. 3.799,3.803,3.807,3.811,3.815,3.819,3.823,3.827,3.831,3.835,
|
|
. 3.839,3.843,3.846,3.850,3.854,3.858,3.862,3.865,3.869,3.873,
|
|
. 3.876,3.880,3.884,3.887,3.891,3.894,3.898,3.901,3.905,3.908,
|
|
. 3.912,3.915,3.918,3.922,3.925,3.929,3.932,3.935,3.939,3.942,
|
|
. 3.945,3.948,3.951,3.955,3.958,3.961,3.964,3.967,3.970,3.974,
|
|
. 3.977,3.980,3.983,3.986,3.989,3.992,3.995,3.998,4.001,4.004/
|
|
data p6a/
|
|
. 0.778,0.804,0.817,0.834,0.854,0.876,0.901,0.928,0.957,0.987,
|
|
. 1.017,1.048,1.079,1.109,1.139,1.169,1.197,1.225,1.253,1.279,
|
|
. 1.304,1.329,1.353,1.376,1.398,1.419,1.440,1.459,1.478,1.497,
|
|
. 1.515,1.532,1.548,1.564,1.580,1.594,1.609,1.623,1.636,1.649,
|
|
. 1.662,1.674,1.686,1.698,1.709,1.720,1.730,1.740,1.750,1.760,
|
|
. 1.769,1.779,1.788,1.796,1.805,1.813,1.821,1.829,1.837,1.845,
|
|
. 1.852,1.860,1.867,1.874,1.881,1.888,1.894,1.901,1.907,1.914,
|
|
. 1.920,1.926,1.932,1.938,1.944,1.950,1.956,1.962,1.968,1.974,
|
|
. 1.979,1.985,1.991,1.996,2.002,2.007,2.013,2.018,2.024,2.029,
|
|
. 2.035,2.041,2.046,2.052,2.057,2.063,2.068,2.074,2.080,2.086,
|
|
. 2.091,2.097,2.103,2.109,2.115,2.121,2.127,2.133,2.139,2.145,
|
|
. 2.152,2.158,2.164,2.171,2.177,2.184,2.190,2.197,2.204,2.211,
|
|
. 2.218,2.225,2.232,2.239,2.246,2.253,2.261,2.268,2.276,2.283,
|
|
. 2.291,2.298,2.306,2.314,2.322,2.330,2.338,2.346,2.354,2.362,
|
|
. 2.370,2.379,2.387,2.395,2.404,2.412,2.420,2.429,2.438,2.446,
|
|
. 2.455,2.463,2.472,2.481,2.489,2.498,2.507,2.516,2.524,2.533,
|
|
. 2.542,2.551,2.560,2.569,2.577,2.586,2.595,2.604,2.613,2.622,
|
|
. 2.631,2.639,2.648,2.657,2.666,2.675,2.683,2.692,2.701,2.710,
|
|
. 2.718,2.727,2.736,2.744,2.753,2.761,2.770,2.779,2.787,2.796/
|
|
data p6b/
|
|
. 2.631,2.639,2.648,2.657,2.666,2.675,2.683,2.692,2.701,2.710,
|
|
. 2.718,2.727,2.736,2.744,2.753,2.761,2.770,2.779,2.787,2.796,
|
|
. 2.804,2.812,2.821,2.829,2.838,2.846,2.854,2.862,2.871,2.879,
|
|
. 2.887,2.895,2.903,2.911,2.919,2.927,2.935,2.943,2.951,2.958,
|
|
. 2.966,2.974,2.982,2.989,2.997,3.005,3.012,3.020,3.027,3.035,
|
|
. 3.042,3.049,3.057,3.064,3.071,3.078,3.086,3.093,3.100,3.107,
|
|
. 3.114,3.121,3.128,3.135,3.141,3.148,3.155,3.162,3.169,3.175,
|
|
. 3.182,3.188,3.195,3.202,3.208,3.214,3.221,3.227,3.234,3.240,
|
|
. 3.246,3.252,3.259,3.265,3.271,3.277,3.283,3.289,3.295,3.301,
|
|
. 3.307,3.313,3.319,3.325,3.330,3.336,3.342,3.348,3.353,3.359,
|
|
. 3.364,3.370,3.376,3.381,3.386,3.392,3.397,3.403,3.408,3.413,
|
|
. 3.419,3.424,3.429,3.434,3.440,3.445,3.450,3.455,3.460,3.465,
|
|
. 3.470,3.475,3.480,3.485,3.490,3.495,3.499,3.504,3.509,3.514,
|
|
. 3.518,3.523,3.528,3.533,3.537,3.542,3.546,3.551,3.555,3.560,
|
|
. 3.564,3.569,3.573,3.578,3.582,3.586,3.591,3.595,3.599,3.604,
|
|
. 3.608,3.612,3.616,3.621,3.625,3.629,3.633,3.637,3.641,3.645,
|
|
. 3.649,3.653,3.657,3.661,3.665,3.669,3.673,3.677,3.681,3.685/
|
|
data p7a/
|
|
. 1.398,1.398,1.398,1.398,1.406,1.425,1.443,1.461,1.480,1.498,
|
|
. 1.516,1.534,1.551,1.568,1.585,1.601,1.616,1.631,1.646,1.660,
|
|
. 1.674,1.687,1.700,1.712,1.724,1.736,1.747,1.758,1.768,1.778,
|
|
. 1.788,1.797,1.806,1.815,1.824,1.832,1.840,1.848,1.855,1.863,
|
|
. 1.870,1.877,1.883,1.890,1.896,1.902,1.908,1.914,1.920,1.925,
|
|
. 1.931,1.936,1.941,1.946,1.951,1.956,1.960,1.965,1.969,1.974,
|
|
. 1.978,1.982,1.986,1.990,1.994,1.998,2.001,2.005,2.009,2.012,
|
|
. 2.016,2.019,2.022,2.026,2.029,2.032,2.035,2.038,2.041,2.044,
|
|
. 2.047,2.050,2.053,2.056,2.059,2.061,2.064,2.067,2.069,2.072,
|
|
. 2.075,2.077,2.080,2.082,2.085,2.088,2.090,2.093,2.095,2.098,
|
|
. 2.100,2.103,2.105,2.107,2.110,2.112,2.115,2.117,2.120,2.122,
|
|
. 2.125,2.127,2.130,2.132,2.135,2.137,2.140,2.142,2.145,2.148,
|
|
. 2.150,2.153,2.155,2.158,2.161,2.163,2.166,2.169,2.172,2.175,
|
|
. 2.178,2.180,2.183,2.186,2.189,2.192,2.195,2.198,2.202,2.205,
|
|
. 2.208,2.211,2.215,2.218,2.221,2.225,2.228,2.232,2.235,2.239,
|
|
. 2.243,2.246,2.250,2.254,2.258,2.261,2.265,2.269,2.273,2.277,
|
|
. 2.282,2.286,2.290,2.294,2.299,2.303,2.307,2.312,2.316,2.321,
|
|
. 2.325,2.330,2.335,2.339,2.344,2.349,2.354,2.359,2.364,2.369,
|
|
. 2.374,2.379,2.384,2.389,2.394,2.399,2.405,2.410,2.415,2.420/
|
|
data p7b/
|
|
. 2.325,2.330,2.335,2.339,2.344,2.349,2.354,2.359,2.364,2.369,
|
|
. 2.374,2.379,2.384,2.389,2.394,2.399,2.405,2.410,2.415,2.420,
|
|
. 2.426,2.431,2.437,2.442,2.448,2.453,2.459,2.464,2.470,2.476,
|
|
. 2.481,2.487,2.493,2.498,2.504,2.510,2.516,2.521,2.527,2.533,
|
|
. 2.539,2.545,2.551,2.556,2.562,2.568,2.574,2.580,2.586,2.592,
|
|
. 2.598,2.604,2.610,2.616,2.622,2.628,2.634,2.640,2.646,2.652,
|
|
. 2.658,2.664,2.670,2.676,2.682,2.687,2.693,2.699,2.705,2.711,
|
|
. 2.717,2.723,2.729,2.735,2.741,2.747,2.753,2.759,2.764,2.770,
|
|
. 2.776,2.782,2.788,2.794,2.799,2.805,2.811,2.817,2.823,2.828,
|
|
. 2.834,2.840,2.846,2.851,2.857,2.863,2.868,2.874,2.879,2.885,
|
|
. 2.891,2.896,2.902,2.907,2.913,2.918,2.924,2.929,2.935,2.940,
|
|
. 2.945,2.951,2.956,2.962,2.967,2.972,2.978,2.983,2.988,2.993,
|
|
. 2.999,3.004,3.009,3.014,3.019,3.025,3.030,3.035,3.040,3.045,
|
|
. 3.050,3.055,3.060,3.065,3.070,3.075,3.080,3.085,3.090,3.095,
|
|
. 3.099,3.104,3.109,3.114,3.119,3.123,3.128,3.133,3.138,3.142,
|
|
. 3.147,3.152,3.156,3.161,3.165,3.170,3.175,3.179,3.184,3.188,
|
|
. 3.193,3.197,3.202,3.206,3.210,3.215,3.219,3.224,3.228,3.232/
|
|
data p8a/
|
|
. 1.447,1.447,1.447,1.447,1.447,1.447,1.459,1.475,1.489,1.504,
|
|
. 1.518,1.531,1.544,1.556,1.568,1.580,1.591,1.602,1.612,1.622,
|
|
. 1.631,1.640,1.649,1.658,1.666,1.674,1.682,1.689,1.696,1.703,
|
|
. 1.710,1.716,1.722,1.728,1.734,1.740,1.745,1.751,1.756,1.761,
|
|
. 1.766,1.770,1.775,1.779,1.784,1.788,1.792,1.796,1.800,1.804,
|
|
. 1.807,1.811,1.814,1.818,1.821,1.824,1.827,1.831,1.834,1.836,
|
|
. 1.839,1.842,1.845,1.848,1.850,1.853,1.855,1.858,1.860,1.863,
|
|
. 1.865,1.867,1.870,1.872,1.874,1.876,1.878,1.880,1.882,1.884,
|
|
. 1.886,1.888,1.890,1.892,1.894,1.896,1.898,1.900,1.902,1.903,
|
|
. 1.905,1.907,1.909,1.911,1.912,1.914,1.916,1.917,1.919,1.921,
|
|
. 1.923,1.924,1.926,1.928,1.929,1.931,1.933,1.934,1.936,1.938,
|
|
. 1.939,1.941,1.943,1.945,1.946,1.948,1.950,1.951,1.953,1.955,
|
|
. 1.957,1.959,1.960,1.962,1.964,1.966,1.968,1.970,1.971,1.973,
|
|
. 1.975,1.977,1.979,1.981,1.983,1.985,1.987,1.989,1.991,1.993,
|
|
. 1.995,1.998,2.000,2.002,2.004,2.006,2.009,2.011,2.013,2.015,
|
|
. 2.018,2.020,2.023,2.025,2.027,2.030,2.032,2.035,2.037,2.040,
|
|
. 2.043,2.045,2.048,2.051,2.053,2.056,2.059,2.062,2.064,2.067,
|
|
. 2.070,2.073,2.076,2.079,2.082,2.085,2.088,2.091,2.094,2.097,
|
|
. 2.100,2.103,2.107,2.110,2.113,2.116,2.120,2.123,2.126,2.130/
|
|
data p8b/
|
|
. 2.070,2.073,2.076,2.079,2.082,2.085,2.088,2.091,2.094,2.097,
|
|
. 2.100,2.103,2.107,2.110,2.113,2.116,2.120,2.123,2.126,2.130,
|
|
. 2.133,2.137,2.140,2.143,2.147,2.151,2.154,2.158,2.161,2.165,
|
|
. 2.168,2.172,2.176,2.180,2.183,2.187,2.191,2.195,2.198,2.202,
|
|
. 2.206,2.210,2.214,2.218,2.222,2.226,2.230,2.233,2.237,2.241,
|
|
. 2.245,2.250,2.254,2.258,2.262,2.266,2.270,2.274,2.278,2.282,
|
|
. 2.286,2.291,2.295,2.299,2.303,2.307,2.312,2.316,2.320,2.324,
|
|
. 2.329,2.333,2.337,2.341,2.346,2.350,2.354,2.359,2.363,2.367,
|
|
. 2.371,2.376,2.380,2.384,2.389,2.393,2.397,2.402,2.406,2.410,
|
|
. 2.415,2.419,2.423,2.428,2.432,2.436,2.441,2.445,2.449,2.454,
|
|
. 2.458,2.462,2.467,2.471,2.475,2.480,2.484,2.488,2.493,2.497,
|
|
. 2.501,2.506,2.510,2.514,2.519,2.523,2.527,2.531,2.536,2.540,
|
|
. 2.544,2.548,2.553,2.557,2.561,2.565,2.570,2.574,2.578,2.582,
|
|
. 2.586,2.591,2.595,2.599,2.603,2.607,2.611,2.616,2.620,2.624,
|
|
. 2.628,2.632,2.636,2.640,2.644,2.648,2.652,2.656,2.661,2.665,
|
|
. 2.669,2.673,2.677,2.681,2.685,2.689,2.693,2.696,2.700,2.704,
|
|
. 2.708,2.712,2.716,2.720,2.724,2.728,2.732,2.736,2.739,2.743/
|
|
data p9a/
|
|
. 1.322,1.322,1.322,1.322,1.322,1.322,1.322,1.322,1.322,1.325,
|
|
. 1.334,1.342,1.351,1.358,1.366,1.373,1.380,1.386,1.392,1.398,
|
|
. 1.404,1.409,1.415,1.420,1.425,1.429,1.434,1.438,1.442,1.446,
|
|
. 1.450,1.454,1.457,1.461,1.464,1.467,1.470,1.473,1.476,1.479,
|
|
. 1.482,1.485,1.487,1.490,1.492,1.495,1.497,1.499,1.501,1.503,
|
|
. 1.505,1.507,1.509,1.511,1.513,1.515,1.517,1.519,1.520,1.522,
|
|
. 1.524,1.525,1.527,1.528,1.530,1.531,1.533,1.534,1.535,1.537,
|
|
. 1.538,1.539,1.541,1.542,1.543,1.545,1.546,1.547,1.548,1.549,
|
|
. 1.551,1.552,1.553,1.554,1.555,1.556,1.558,1.559,1.560,1.561,
|
|
. 1.562,1.563,1.565,1.566,1.567,1.568,1.569,1.570,1.571,1.573,
|
|
. 1.574,1.575,1.576,1.577,1.579,1.580,1.581,1.582,1.584,1.585,
|
|
. 1.586,1.588,1.589,1.590,1.592,1.593,1.594,1.596,1.597,1.599,
|
|
. 1.600,1.602,1.603,1.605,1.606,1.608,1.609,1.611,1.612,1.614,
|
|
. 1.616,1.617,1.619,1.621,1.622,1.624,1.626,1.628,1.630,1.631,
|
|
. 1.633,1.635,1.637,1.639,1.641,1.643,1.645,1.647,1.649,1.651,
|
|
. 1.653,1.655,1.657,1.659,1.661,1.664,1.666,1.668,1.670,1.673,
|
|
. 1.675,1.677,1.679,1.682,1.684,1.686,1.689,1.691,1.694,1.696,
|
|
. 1.699,1.701,1.704,1.706,1.709,1.711,1.714,1.716,1.719,1.722,
|
|
. 1.724,1.727,1.729,1.732,1.735,1.738,1.740,1.743,1.746,1.749/
|
|
data p9b/
|
|
. 1.699,1.701,1.704,1.706,1.709,1.711,1.714,1.716,1.719,1.722,
|
|
. 1.724,1.727,1.729,1.732,1.735,1.738,1.740,1.743,1.746,1.749,
|
|
. 1.751,1.754,1.757,1.760,1.763,1.765,1.768,1.771,1.774,1.777,
|
|
. 1.780,1.783,1.786,1.789,1.792,1.795,1.798,1.801,1.804,1.807,
|
|
. 1.810,1.813,1.816,1.819,1.822,1.825,1.828,1.831,1.834,1.837,
|
|
. 1.840,1.843,1.847,1.850,1.853,1.856,1.859,1.862,1.865,1.869,
|
|
. 1.872,1.875,1.878,1.881,1.884,1.888,1.891,1.894,1.897,1.901,
|
|
. 1.904,1.907,1.910,1.913,1.917,1.920,1.923,1.926,1.930,1.933,
|
|
. 1.936,1.939,1.943,1.946,1.949,1.952,1.956,1.959,1.962,1.965,
|
|
. 1.969,1.972,1.975,1.978,1.982,1.985,1.988,1.992,1.995,1.998,
|
|
. 2.001,2.005,2.008,2.011,2.014,2.018,2.021,2.024,2.027,2.031,
|
|
. 2.034,2.037,2.040,2.044,2.047,2.050,2.053,2.057,2.060,2.063,
|
|
. 2.066,2.070,2.073,2.076,2.079,2.083,2.086,2.089,2.092,2.095,
|
|
. 2.099,2.102,2.105,2.108,2.111,2.115,2.118,2.121,2.124,2.127,
|
|
. 2.131,2.134,2.137,2.140,2.143,2.146,2.149,2.153,2.156,2.159,
|
|
. 2.162,2.165,2.168,2.171,2.175,2.178,2.181,2.184,2.187,2.190,
|
|
. 2.193,2.196,2.199,2.202,2.205,2.208,2.212,2.215,2.218,2.221/
|
|
c
|
|
if(t.lt.12000.) then
|
|
pf=g0(ion-3)
|
|
dut=0.
|
|
dun=0.
|
|
return
|
|
endif
|
|
c
|
|
it=int(t/1000.)
|
|
if(it.ge.350) it=349
|
|
t1=1000.*it
|
|
t2=t1+1000.
|
|
if(ion.eq.4) then
|
|
if(t.le.200000.) then
|
|
xu1=p4a(it-10)
|
|
xu2=p4a(it-9)
|
|
else
|
|
xu1=p4b(it-180)
|
|
xu2=p4b(it-179)
|
|
endif
|
|
else if(ion.eq.5) then
|
|
if(t.le.200000.) then
|
|
xu1=p5a(it-10)
|
|
xu2=p5a(it-9)
|
|
else
|
|
xu1=p5b(it-180)
|
|
xu2=p5b(it-179)
|
|
endif
|
|
else if(ion.eq.6) then
|
|
if(t.le.200000.) then
|
|
xu1=p6a(it-10)
|
|
xu2=p6a(it-9)
|
|
else
|
|
xu1=p6b(it-180)
|
|
xu2=p6b(it-179)
|
|
endif
|
|
else if(ion.eq.7) then
|
|
if(t.le.200000.) then
|
|
xu1=p7a(it-10)
|
|
xu2=p7a(it-9)
|
|
else
|
|
xu1=p7b(it-180)
|
|
xu2=p7b(it-179)
|
|
endif
|
|
else if(ion.eq.8) then
|
|
if(t.le.200000.) then
|
|
xu1=p8a(it-10)
|
|
xu2=p8a(it-9)
|
|
else
|
|
xu1=p8b(it-180)
|
|
xu2=p8b(it-179)
|
|
endif
|
|
else if(ion.eq.9) then
|
|
if(t.le.200000.) then
|
|
xu1=p9a(it-10)
|
|
xu2=p9a(it-9)
|
|
else
|
|
xu1=p9b(it-180)
|
|
xu2=p9b(it-179)
|
|
endif
|
|
endif
|
|
c
|
|
dxt=xmil*(xu2-xu1)
|
|
xu=xu1+(t-t1)*dxt
|
|
pf=exp(xen*xu)
|
|
dut=xen*pf*dxt
|
|
dun=0.
|
|
return
|
|
end
|
|
|
|
c
|
|
c
|
|
c ******************************************************************
|
|
c
|
|
c
|
|
subroutine opfrac(iat,ion,t,ane,pf,fra)
|
|
c =======================================
|
|
c
|
|
include 'IMPLIC.FOR'
|
|
parameter (mtemp =100,
|
|
* melec = 60,
|
|
* mion1 = 30,
|
|
* mion2 = 32,
|
|
* mdat = 17,
|
|
* mstag = 258)
|
|
parameter (inp=71)
|
|
dimension frac0(mion2),ioo(mion2),idat(mion1)
|
|
dimension gg(mion1,mdat),g0(mion1),z0(mion2)
|
|
dimension uu(mion1,mdat),u0(mion1)
|
|
dimension indxat(mion1,mdat),indxa(mion1)
|
|
dimension u6(6),u7(7),u8(8),u10(10),u11(11)
|
|
dimension u12(12),u13(13),u14(14),u16(16),u18(18),u20(20)
|
|
dimension u24(24),u25(25),u26(26),u28(28)
|
|
common/pfoptb/pfop(mtemp,melec,mstag),pfophm(mtemp,melec),
|
|
* frac(mtemp,melec,mstag),
|
|
* frop(mtemp,melec,mstag),itemp(mtemp)
|
|
equivalence (u6(1),uu(1,3)),(u7(1),uu(1,4)),(u8(1),uu(1,5))
|
|
equivalence (u10(1),uu(1,6)),(u11(1),uu(1,7)),(u12(1),uu(1,8))
|
|
equivalence (u13(1),uu(1,9)),(u14(1),uu(1,10)),(u16(1),uu(1,11))
|
|
equivalence (u18(1),uu(1,12)),(u20(1),uu(1,13)),(u24(1),uu(1,14))
|
|
equivalence (u25(1),uu(1,15)),(u26(1),uu(1,16)),(u28(1),uu(1,17))
|
|
data idat / 1, 2, 0, 0, 0, 3, 4, 5, 0, 6,
|
|
* 7, 8, 9,10, 0,11, 0,12, 0,13,
|
|
* 0, 0, 0,14,15,16, 0,17, 0, 0/
|
|
data indxat /1,2,28*0,
|
|
* 3,4,5,27*0,
|
|
* 6,7,8,9,10,11,12,23*0,
|
|
* 13,14,15,16,17,18,19,20,22*0,
|
|
* 21,22,23,24,25,26,27,28,29,21*0,
|
|
* 30,31,32,33,34,35,36,37,38,39,40,19*0,
|
|
* 41,42,43,44,45,46,47,48,49,50,51,52,18*0,
|
|
* 53,54,55,56,57,58,59,60,61,62,63,64,65,17*0,
|
|
* 66,67,68,69,70,71,72,73,74,75,76,77,78,79,16*0,
|
|
* 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,15*0,
|
|
* 95,96,97,98,99,100,101,102,103,104,105,106,107,
|
|
* 108,109,110,111,13*0,
|
|
* 112,113,114,115,116,117,118,119,120,121,122,123,
|
|
* 124,125,126,127,128,129,130,11*0,
|
|
* 131,132,133,134,135,136,137,138,139,140,141,142,
|
|
* 143,144,145,146,147,148,149,150,151,9*0,
|
|
* 152,153,154,155,156,157,158,159,160,161,162,163,
|
|
* 164,165,166,167,168,169,170,171,172,173,174,175,
|
|
* 176,5*0,
|
|
* 177,178,179,180,181,182,183,184,185,186,187,188,
|
|
* 189,190,191,192,193,194,195,196,197,198,199,200,
|
|
* 201,202,4*0,
|
|
* 203,204,205,206,207,208,209,210,211,212,213,214,
|
|
* 215,216,217,218,219,220,221,222,223,224,225,226,
|
|
* 227,228,229,3*0,
|
|
* 230,231,232,233,234,235,236,237,238,239,240,241,
|
|
* 242,243,244,245,246,247,248,249,250,251,252,253,
|
|
* 254,255,256,257,258,0/
|
|
data gg/2.,29*0.,
|
|
* 2.,1.,28*0.,
|
|
* 2.,1.,2.,1.,6.,9.,24*0.,
|
|
* 2.,1.,2.,1.,6.,9.,4.,23*0.,
|
|
* 2.,1.,2.,1.,6.,9.,4.,9.,22*0.,
|
|
* 2.,1.,2.,1.,6.,9.,4.,9.,6.,1.,20*0.,
|
|
* 2.,1.,2.,1.,6.,9.,4.,9.,6.,1.,2.,19*0.,
|
|
* 2.,1.,2.,1.,6.,9.,4.,9.,6.,1.,2.,1.,18*0.,
|
|
* 2.,1.,2.,1.,6.,9.,4.,9.,6.,1.,2.,1.,6.,17*0.,
|
|
* 2.,1.,2.,1.,6.,9.,4.,9.,6.,1.,2.,1.,6.,9.,16*0.,
|
|
* 2.,1.,2.,1.,6.,9.,4.,9.,6.,1.,2.,1.,6.,9.,4.,9.,14*0.,
|
|
* 2.,1.,2.,1.,6.,9.,4.,9.,6.,1.,2.,1.,6.,9.,4.,9.,6.,1.,
|
|
* 12*0.,2.,1.,2.,1.,6.,9.,4.,9.,6.,1.,2.,1.,6.,9.,4.,9.,
|
|
* 6.,1.,2.,1.,10*0.,2.,1.,2.,1.,6.,9.,4.,9.,6.,1.,2.,1.,
|
|
* 6.,9.,4.,9.,6.,1.,10.,21.,28.,25.,6.,7.,6*0.,
|
|
* 2.,1.,2.,1.,6.,9.,4.,9.,6.,1.,2.,1.,6.,9.,4.,9.,
|
|
* 6.,1.,10.,21.,28.,25.,6.,7.,6.,5*0.,
|
|
* 2.,1.,2.,1.,6.,9.,4.,9.,6.,1.,2.,1.,6.,9.,4.,9.,
|
|
* 6.,1.,10.,21.,28.,25.,6.,25.,30.,25.,4*0.,
|
|
* 2.,1.,2.,1.,6.,9.,4.,9.,6.,1.,2.,1.,6.,9.,4.,9.,
|
|
* 6.,1.,10.,21.,28.,25.,6.,25.,28.,21.,10.,21.,0.,0./
|
|
data uu(1,1)/109.6787/
|
|
data uu(1,2)/198.3108/
|
|
data uu(2,2)/438.9089/
|
|
data u6/90.82,196.665,386.241,520.178,3162.395,3952.061/
|
|
data u7/117.225,238.751,382.704,624.866,789.537,4452.758,5380.089/
|
|
data u8/109.837,283.24,443.086,624.384,918.657,1114.008,5963.135,
|
|
* 7028.393/
|
|
data u10/173.93,330.391,511.8,783.3,1018.,1273.8,1671.792,
|
|
* 1928.462,9645.005,10986.876/
|
|
data u11/41.449,381.395,577.8,797.8,1116.2,1388.5,1681.5,2130.8,
|
|
* 2418.7,11817.061,13297.676/
|
|
data u12/61.671,121.268,646.41,881.1,1139.4,1504.3,1814.3,2144.7,
|
|
* 2645.2,2964.4,14210.261,15829.951/
|
|
data u13/48.278,151.86,229.446,967.8,1239.8,1536.3,1947.3,2295.4,
|
|
* 2663.4,3214.8,3565.6,16825.022,18584.138/
|
|
data u14/65.748,131.838,270.139,364.093,1345.1,1653.9,1988.4,
|
|
* 2445.3,2831.9,3237.8,3839.8,4222.4,19661.693,21560.63/
|
|
data u16/83.558,188.2,280.9,381.541,586.2,710.184,2265.9,2647.4,
|
|
* 3057.7,3606.1,4071.4,4554.3,5255.9,5703.6,26002.663,
|
|
* 28182.535/
|
|
data u18/127.11,222.848,328.6,482.4,605.1,734.04,1002.73,1157.08,
|
|
* 3407.3,3860.9,4347.,4986.6,5533.8,6095.5,6894.2,7404.4,
|
|
* 33237.173,35699.936/
|
|
data u20/49.306,95.752,410.642,542.6,681.6,877.4,1026.,1187.6,
|
|
* 1520.64,1704.047,4774.,5301.,5861.,6595.,7215.,7860.,
|
|
* 8770.,9338.,41366.,44177.41/
|
|
data u24/54.576,132.966,249.7,396.5,560.2,731.02,1291.9,1490.,
|
|
* 1688.,1971.,2184.,2404.,2862.,3098.52,8151.,8850.,
|
|
* 9560.,10480.,11260.,12070.,13180.,13882.,60344.,63675.9/
|
|
data u25/59.959,126.145,271.55,413.,584.,771.1,961.44,1569.,
|
|
* 1789.,2003.,2307.,2536.,2771.,3250.,3509.82,9152.,
|
|
* 9872.,10620.,11590.,12410.,13260.,14420.,15162.,
|
|
* 65660.,69137.4/
|
|
data u26/63.737,130.563,247.22,442.,605.,799.,1008.,1218.38,
|
|
* 1884.,2114.,2341.,2668.,2912.,3163.,3686.,3946.82,
|
|
* 10180.,10985.,11850.,12708.,13620.,14510.,15797.,
|
|
* 16500.,71203.,74829.6/
|
|
data u28/61.6,146.542,283.8,443.,613.5,870.,1070.,1310.,1560.,
|
|
* 1812.,2589.,2840.,3100.,3470.,3740.,4020.,4606.,
|
|
* 4896.2,12430.,13290.,14160.,15280.,16220.,17190.,
|
|
* 18510.,19351.,82984.,86909.4/
|
|
c
|
|
c If the routine is called with IAT=0, initialization:
|
|
c read the ionization fractions form the Opacity Project tables,
|
|
c and evaluate partition functions (assuming that the partition
|
|
c function for the highest ion is eqaul to the statistical weight of
|
|
c the ground state.
|
|
c The table of partition functions, in the OP temperatures and
|
|
c electron densities, are stored in the array PFOP
|
|
c
|
|
C Read is done in a loop over the OP species
|
|
c
|
|
fra=1.
|
|
if(iat.gt.0) go to 50
|
|
do 40 iatnum=1,28
|
|
if(idat(iatnum).eq.0) go to 40
|
|
c
|
|
g0(iatnum+1)=1.
|
|
indxa(iatnum+1)=indxat(iatnum+1,idat(iatnum))
|
|
do i=1,iatnum
|
|
ig0=iatnum-i+1
|
|
g0(ig0)=gg(i,idat(iatnum))
|
|
indxa(i)=indxat(i,idat(iatnum))
|
|
u0(i)=uu(i,idat(iatnum))*1000.
|
|
enddo
|
|
c
|
|
c initializion of partition functions by the statistical weights of
|
|
c the ground state
|
|
c
|
|
do i=1,iatnum+1
|
|
indx=indxa(i)
|
|
pf0=g0(i)
|
|
do it=1,mtemp
|
|
do ieind=1,melec
|
|
pfop(it,ieind,indx)=pf0
|
|
enddo
|
|
enddo
|
|
enddo
|
|
c
|
|
if(iatnum.eq.1) open(inp,file='./data/ioniz.dat',status='old')
|
|
read(inp,*)
|
|
read(inp,*) it0,it1,itstp
|
|
ntt=(it1-it0)/itstp+1
|
|
c
|
|
do it=1,ntt
|
|
read(inp,*) itt,ie0,ie1,iestp
|
|
itemp(it)=itt
|
|
net=(ie1-ie0)/iestp+1
|
|
t=exp(2.3025851*0.025*itt)
|
|
safac0=sqrt(t)*t/2.07d-16
|
|
tkcm=0.69496*t
|
|
do ie=1,net
|
|
read(inp,601) iee,ion0,ion1,
|
|
* (ioo(i),frac0(i),i=ion0+2,min(ion1,ion0+3)+2)
|
|
ane=exp(2.3025851*0.25*iee)
|
|
safac=safac0/ane
|
|
nio=ion1-ion0
|
|
if(nio.ge.3) then
|
|
nlin=nio/4
|
|
do ilin=1,nlin
|
|
read(inp,602) (ioo(i),frac0(i),
|
|
* i=ion0+4*ilin+2,min(ion1,ion0+4*ilin+3)+2)
|
|
end do
|
|
end if
|
|
ieind=iee/2
|
|
ion0=ion0+2
|
|
ion1=ion1+2
|
|
do ionn=ion0,ion1
|
|
iation=iatnum+2-ionn
|
|
if(ionn.lt.iatnum+2) then
|
|
if(ionn.eq.ion0) then
|
|
z0(ionn)=g0(iation)
|
|
else
|
|
z0(ionn)=frac0(ionn)/frac0(ionn-1)*safac*z0(ionn-1)
|
|
z0(ionn)=z0(ionn)*exp(-u0(iation)/tkcm)
|
|
endif
|
|
pfop(it,ieind,indxa(iation))=z0(ionn)
|
|
frac(it,ieind,indxa(iation))=frac0(ionn)
|
|
else
|
|
u0hm=6090.5
|
|
z0hm=frac0(ionn)/frac0(ionn-1)*safac
|
|
z0hm=z0hm*exp(-u0hm/tkcm)
|
|
pfophm(it,ieind)=z0hm
|
|
end if
|
|
end do
|
|
end do
|
|
end do
|
|
40 continue
|
|
601 format(3i4,2x,4(i4,1x,e9.3))
|
|
602 format(14x,4(i4,1x,e9.3))
|
|
return
|
|
C
|
|
C ----------------------------------------------------------
|
|
C
|
|
C If the routine is called with IAT>0, evaluate the partition
|
|
C function of atom IAT, ion ION,
|
|
C for temperature T and electron density ANE
|
|
C Evaluation is done by interpolation from previously computed
|
|
C Opacity Project values
|
|
C
|
|
50 continue
|
|
c
|
|
xt=log10(t)
|
|
kt0=2*int(20.*xt)
|
|
xne=log10(ane)
|
|
kn0=int(2.*xne)
|
|
c
|
|
iatnum=iat
|
|
if(idat(iatnum).eq.0) then
|
|
write(6,600) iatnum
|
|
iatnum=-1
|
|
600 format(' data for element no. ',i3,' do not exist')
|
|
return
|
|
end if
|
|
indx=indxat(ion,idat(iatnum))
|
|
if(kt0.lt.itemp(1)) then
|
|
kt1=1
|
|
write(6,611) t
|
|
611 format(' (FRACOP) Extrapol. in T (low)',f7.0)
|
|
go to 120
|
|
endif
|
|
if(kt0.ge.itemp(ntt)) then
|
|
kt1=ntt-1
|
|
write(6,612) t
|
|
612 format(' (FRACOP) Extrapol. in T (high)',f12.0)
|
|
go to 120
|
|
endif
|
|
do it=1,ntt
|
|
if(kt0.eq.itemp(it)) then
|
|
kt1=it
|
|
go to 120
|
|
endif
|
|
end do
|
|
120 continue
|
|
if(kn0.lt.1) then
|
|
kn1=1
|
|
go to 130
|
|
endif
|
|
if(kn0.ge.60) then
|
|
kn1=59
|
|
write(6,614) xne
|
|
614 format(' (FRACOP) Extrapol. in Ne (high)',f9.4)
|
|
go to 130
|
|
endif
|
|
kn1=kn0
|
|
130 continue
|
|
xt1=0.025*itemp(kt1)
|
|
dxt=0.05
|
|
at1=(xt-xt1)/dxt
|
|
xn1=0.5*kn1
|
|
dxn=0.5
|
|
an1=(xne-xn1)/dxn
|
|
x11=pfop(kt1,kn1,indx)
|
|
x21=pfop(kt1+1,kn1,indx)
|
|
x12=pfop(kt1,kn1+1,indx)
|
|
x22=pfop(kt1+1,kn1+1,indx)
|
|
x1221=x11*x21*x12*x22
|
|
if(x1221.eq.0.) then
|
|
xx1=x11+at1*(x21-x11)
|
|
xx2=x12+at1*(x22-x12)
|
|
rrx=xx1+an1*(xx2-xx1)
|
|
else
|
|
x11=log10(x11)
|
|
x21=log10(x21)
|
|
x12=log10(x12)
|
|
x22=log10(x22)
|
|
xx1=x11+at1*(x21-x11)
|
|
xx2=x12+at1*(x22-x12)
|
|
rrx=xx1+an1*(xx2-xx1)
|
|
rrx=exp(2.3025851*rrx)
|
|
endif
|
|
pf=rrx
|
|
c
|
|
return
|
|
end
|
|
c
|
|
c ******************************************************************
|
|
c
|
|
C
|
|
SUBROUTINE PFHEAV(IIZ,JNION,MODE,t,ane,u)
|
|
C =========================================
|
|
C
|
|
c subset of kurucz's pfsaha for Z>28.
|
|
c removed code for Z<28; crp- 28 aug, 1995
|
|
C EDITED 27 JULY 1994 BY GMW - REPLACED PT III PF COEFF. AND IP
|
|
C MODE 3 RETURNS PARTITION FUNCTION
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
REAL*8 IP
|
|
PARAMETER (DEBCON=1./2.8965E-18,
|
|
* TVCON=8.6171E-5,
|
|
* HIONEV=13.595,
|
|
* ONE=1.,
|
|
* HALF=0.5,
|
|
* THIRD=1./3.,
|
|
* X18=1./18.,
|
|
* X120=1./120.,
|
|
* T211=2000./11.)
|
|
c
|
|
DIMENSION IP(6),PART(6),POTLO(6)
|
|
DIMENSION SCALE(4)
|
|
DIMENSION NNN(6*218)
|
|
DIMENSION NNN16(54),NNN17(54),NNN18(54),NNN19(54),NNN20(54)
|
|
DIMENSION NNN21(54),NNN22(54),NNN23(54),NNN24(54),NNN25(54)
|
|
DIMENSION NNN26(54),NNN27(54),NNN28(54),NNN29(54),NNN30(54)
|
|
DIMENSION NNN31(54),NNN32(54),NNN33(54),NNN34(54),NNN35(54)
|
|
DIMENSION NNN36(54),NNN37(54),NNN38(54),NNN39(54),NNN40(12)
|
|
EQUIVALENCE (NNN( 811-810),NNN16(1))
|
|
EQUIVALENCE (NNN( 865-810),NNN17(1)),(NNN( 919-810),NNN18(1))
|
|
EQUIVALENCE (NNN( 973-810),NNN19(1)),(NNN(1027-810),NNN20(1))
|
|
EQUIVALENCE (NNN(1081-810),NNN21(1)),(NNN(1135-810),NNN22(1))
|
|
EQUIVALENCE (NNN(1189-810),NNN23(1)),(NNN(1243-810),NNN24(1))
|
|
EQUIVALENCE (NNN(1297-810),NNN25(1)),(NNN(1351-810),NNN26(1))
|
|
EQUIVALENCE (NNN(1405-810),NNN27(1)),(NNN(1459-810),NNN28(1))
|
|
EQUIVALENCE (NNN(1513-810),NNN29(1)),(NNN(1567-810),NNN30(1))
|
|
EQUIVALENCE (NNN(1621-810),NNN31(1)),(NNN(1675-810),NNN32(1))
|
|
EQUIVALENCE (NNN(1729-810),NNN33(1)),(NNN(1783-810),NNN34(1))
|
|
EQUIVALENCE (NNN(1837-810),NNN35(1)),(NNN(1891-810),NNN36(1))
|
|
EQUIVALENCE (NNN(1945-810),NNN37(1)),(NNN(1999-810),NNN38(1))
|
|
EQUIVALENCE (NNN(2053-810),NNN39(1)),(NNN(2107-810),NNN40(1))
|
|
C ( 1)( 2) ( 3)( 4) ( 5)( 6) ( 7)( 8) ( 9)(10) ( IP ) G REF
|
|
DATA NNN16/
|
|
1 227027622, 306233052, 356839222, 446052912, 652382292, 763314,
|
|
2 108416342, 222428472, 353944332, 577378932, 110314303, 1814900,
|
|
3 198724282, 293236452, 468362702, 86511123, 136016073, 3516000,
|
|
4 279836622, 461857562, 720693022, 124915873, 192522633, 5600000,
|
|
5 262136422, 501167232, 87911303, 138916483, 190721673, 7900000,
|
|
6 201620781, 231026761, 314737361, 450555381, 692386911, 772301,
|
|
7 109415761, 247938311, 58910042, 190937022, 68311693, 2028903,
|
|
8 897195961, 107212972, 165021182, 260230862, 356940532, 3682900,
|
|
9 100010001, 100410231, 108712611, 167124841, 388460411, 939102/
|
|
DATA NNN17/
|
|
1 200020021, 201620761, 223726341, 351352061, 80812472, 1796001,
|
|
2 100610471, 122617301, 300566361, 149924112, 332342352, 3970000,
|
|
3 403245601, 493151431, 529654331, 559358091, 611065171, 600000,
|
|
4 99710051, 104511541, 135016501, 208226431, 321837921, 2050900,
|
|
5 199820071, 204521391, 229124761, 266028451, 302932131, 3070000,
|
|
6 502665261, 755183501, 901496201, 102410942, 117912812, 787900,
|
|
7 422848161, 512153401, 557458941, 636270361, 794489061, 1593000,
|
|
8 100010261, 114613921, 175221251, 249828711, 324436181, 3421000,
|
|
9 403143241, 491856701, 649173781, 840396751, 113013392, 981000/
|
|
DATA NNN18/
|
|
1 593676641, 884697521, 105911572, 129515012, 180322212, 1858700,
|
|
2 484470541, 91510972, 125614082, 157017612, 199722912, 2829900,
|
|
3 630172361, 799686381, 919797221, 102810942, 117712832, 975000,
|
|
4 438055511, 691582151, 94510732, 121413672, 152016732, 2150000,
|
|
5 651982921, 94610382, 113212492, 139515462, 169718482, 3200000,
|
|
6 437347431, 498951671, 538559501, 74710812, 169126672, 1183910,
|
|
7 705183611, 93510092, 111614162, 222932532, 427652992, 2160000,
|
|
8 510869921, 87410312, 123116552, 236530712, 377744832, 3590000,
|
|
9 100010001, 100010051, 105012781, 198535971, 65911422, 1399507/
|
|
DATA NNN19/
|
|
1 461049811, 522254261, 609088131, 168935052, 68612253, 2455908,
|
|
2 759990901, 101911142, 129017782, 302856642, 99414333, 3690000,
|
|
3 200020011, 200720361, 211523021, 269434141, 459163351, 417502,
|
|
4 100010001, 100110321, 129524961, 61014202, 291753192, 2750004,
|
|
5 473650891, 533156051, 66810932, 232950852, 99915303, 4000000,
|
|
6 100110041, 104111741, 146019721, 281941411, 607785251, 569202,
|
|
7 202621931, 255331271, 384347931, 624085761, 122417632, 1102600,
|
|
8 100010001, 100110321, 129524961, 61014202, 291753192, 4300000,
|
|
9 791587851, 100012192, 155119942, 254031782, 389946932, 637900/
|
|
DATA NNN20/
|
|
1 118217102, 220827002, 319036792, 416646512, 513256072, 1223000,
|
|
2 92510012, 104710862, 112311612, 120212472, 132814282, 2050000,
|
|
3 141320802, 291439702, 531170262, 92712273, 162521053, 684000,
|
|
4 354454352, 724689652, 107212643, 148517093, 193321573, 1312900,
|
|
5 209727032, 324537052, 415446282, 510255752, 604965222, 2298000,
|
|
6 256636022, 465759302, 749693962, 116514243, 171520333, 687900,
|
|
7 335157222, 84511463, 147718363, 221826083, 299933893, 1431900,
|
|
8 223725352, 280830972, 340937362, 406844002, 473150632, 2503900,
|
|
9 703972941, 82610822, 154822682, 327244912, 571469372, 709900/
|
|
DATA NNN21/
|
|
1 75714552, 274347322, 718897632, 123414913, 174920063, 1614900,
|
|
2 267645462, 669890262, 115514323, 173620673, 242528083, 2714900,
|
|
3 90613732, 184823562, 291735332, 419949102, 565764332, 728000,
|
|
4 131318312, 227126932, 311735452, 397644072, 483852692, 1525900,
|
|
5 204721673, 234725733, 284031463, 348738613, 426546943, 3000000,
|
|
6 176824122, 318941082, 515263202, 761790472, 106112303, 736400,
|
|
7 221934642, 501968372, 88911173, 136316243, 189221613, 1675900,
|
|
8 210622722, 241025422, 267928262, 297731272, 327834282, 2846000,
|
|
9 148520202, 255230902, 364942462, 489656082, 638872352, 746000/
|
|
DATA NNN22/
|
|
1 153421292, 288137912, 484660322, 720187062, 101011483, 1807000,
|
|
2 254537212, 492362292, 770592182, 107312243, 137615273, 3104900,
|
|
3 115919651, 320746011, 607576761, 95011642, 141817172, 832900,
|
|
4 755087211, 105913442, 173122222, 282034722, 412247732, 1941900,
|
|
5 180223462, 289735212, 414247632, 538460052, 662672472, 3292000,
|
|
6 200020001, 200220141, 206422141, 257633021, 455164681, 757403,
|
|
7 100810581, 125817401, 260641031, 66210072, 135316982, 2148000,
|
|
8 795887491, 97711762, 156620252, 248329422, 340038582, 3481900,
|
|
9 100010001, 100410241, 109212891, 176827421, 444268771, 899003/
|
|
DATA NNN23/
|
|
1 200020021, 201720921, 233329881, 451475371, 127520782, 1690301,
|
|
2 100310281, 114815371, 246138311, 519265531, 791492761, 3747000,
|
|
3 252431921, 368440461, 433746521, 512259221, 723389021, 578400,
|
|
4 100110071, 104611651, 146118581, 225426511, 304734431, 1886000,
|
|
5 200120111, 205021611, 243628031, 317035371, 390442701, 2802900,
|
|
6 232637101, 488058571, 669074381, 816189091, 97210632, 734200,
|
|
7 286335941, 408144471, 479351961, 571862901, 686274341, 1462700,
|
|
8 100010251, 114013811, 175321601, 256829751, 338337901, 3049000,
|
|
9 404043481, 494656811, 646772781, 813490751, 101411372, 863900/
|
|
DATA NNN24/
|
|
1 303147981, 618472951, 827392621, 103711702, 131214532, 1650000,
|
|
2 313037601, 429347901, 536260591, 689477591, 862494881, 2529900,
|
|
3 526258801, 657372351, 784284071, 897095741, 102711082, 900900,
|
|
4 440855541, 686481251, 93810792, 125414792, 176321132, 1860000,
|
|
5 349054751, 699883081, 96611302, 134216202, 197724212, 2800000,
|
|
6 405342041, 438645621, 475751071, 587974491, 102214572, 1045404,
|
|
7 568567471, 773485861, 94510362, 112712182, 130914002, 1909000,
|
|
8 514269581, 86910562, 130716652, 215327742, 351843662, 3200000,
|
|
9 100010001, 100010091, 109515351, 291060661, 119621482, 1212716/
|
|
DATA NNN25/
|
|
1 414844131, 465649111, 538464651, 87112232, 158019362, 2120000,
|
|
2 615475101, 867797531, 112213462, 157618062, 203622662, 3209900,
|
|
3 200020001, 201020501, 215623871, 283536181, 462756261, 389300,
|
|
4 100010001, 100310371, 119016501, 269146361, 77912412, 2510000,
|
|
5 424445601, 481750061, 516953311, 549356551, 581759791, 3500000,
|
|
6 101210791, 135119351, 282340571, 574580391, 111015062, 521002,
|
|
7 262638611, 504160621, 698579371, 91010692, 129115952, 1000000,
|
|
8 100010001, 100310351, 118416321, 264945521, 76512182, 3700000,
|
|
9 71111992, 172323592, 312540402, 510763182, 765791012, 558000/
|
|
DATA NNN26/
|
|
1 204529582, 383647882, 582469262, 807992692, 104911723, 1106000,
|
|
2 94712552, 148416582, 179819212, 203621522, 227424042, 1916900,
|
|
3 295959132, 103515693, 215527593, 335939413, 449650223, 565000,
|
|
4 79718153, 289639443, 495159253, 686877533, 863794813, 1085000,
|
|
5 298640242, 475053692, 596965912, 725379692, 872094692, 2008000,
|
|
6 460693672, 158523823, 327242303, 519661563, 709379783, 541900,
|
|
7 455480232, 114014653, 178521013, 240927073, 299232633, 1055000,
|
|
8 46410533, 183826893, 354443773, 518459633, 674375243, 2320000,
|
|
9 139623042, 364860002, 96114603, 209828633, 373446973, 549000/
|
|
DATA NNN27/
|
|
1 460493692, 158523823, 327142303, 519661563, 709279783, 1073000,
|
|
2 455480232, 114014653, 178521013, 240927073, 299232633, 2000000,
|
|
3 131720482, 280535692, 441254492, 676583972, 103412583, 555000,
|
|
4 139623042, 364860002, 96114603, 209828633, 373446973, 1089900,
|
|
5 460493682, 158523823, 327142303, 519661563, 709279783, 2000000,
|
|
6 92915672, 222431062, 444763802, 89612173, 159520253, 562900,
|
|
7 315059662, 97114563, 204627093, 342541693, 490556383, 1106900,
|
|
8 269037812, 520270372, 91111273, 133915483, 172719093, 2000000,
|
|
9 800080571, 851699301, 127617362, 240433032, 444958442, 568000/
|
|
DATA NNN28/
|
|
1 125416052, 211828182, 375549622, 644381732, 101112213, 1125000,
|
|
2 800080571, 851699301, 127617362, 240433032, 444958442, 2000000,
|
|
3 240432982, 427555202, 708489962, 112613853, 167319843, 615900,
|
|
4 534793262, 139219123, 247730843, 371043333, 495055893, 1210000,
|
|
5 364145232, 514756362, 604864112, 673870372, 732276072, 2000000,
|
|
6 480767202, 89011393, 144118243, 230028753, 354142883, 584900,
|
|
7 480767192, 89011393, 144118243, 230028753, 354142883, 1151900,
|
|
8 480767202, 89011393, 144118243, 230028753, 354142883, 2000000,
|
|
9 343147532, 645887152, 115314793, 183322063, 257729373, 593000/
|
|
DATA NNN29/
|
|
1 343147532, 645887142, 115314793, 183322063, 257729373, 1167000,
|
|
2 343147532, 645887142, 115314793, 183322063, 257729373, 2000000,
|
|
3 222635002, 542276772, 100312353, 145716713, 187020703, 602000,
|
|
4 222635002, 542276772, 100312353, 145716713, 187020703, 1180000,
|
|
5 222635002, 542276772, 100312353, 145716713, 187020703, 2000000,
|
|
6 133715382, 209130152, 429859382, 79410293, 129815983, 609900,
|
|
7 265934782, 497877532, 120517733, 245032063, 400448073, 1193000,
|
|
8 265934782, 497877532, 120517733, 245032063, 400448073, 2000000,
|
|
9 800381111, 87510702, 147621462, 310343462, 585475982, 618000/
|
|
DATA NNN30/
|
|
1 156718872, 279244452, 678196342, 128316243, 197823443, 1205000,
|
|
2 93517192, 364666132, 103414613, 192624193, 293334613, 2370000,
|
|
3 100010011, 101310651, 118613951, 169120661, 250629971, 625000,
|
|
4 200120901, 270345231, 81714042, 223533112, 461959862, 1217000,
|
|
5 100312561, 250851931, 91914182, 198626022, 323638692, 2000000,
|
|
6 514664441, 759086851, 99211442, 133315612, 182721252, 609900,
|
|
7 125924831, 438667801, 98714112, 199727872, 380850742, 1389900,
|
|
8 323948621, 661297271, 158626482, 426865032, 93712843, 1900000,
|
|
9 659294081, 128016962, 222528952, 372047062, 585171462, 700000/
|
|
DATA NNN31/
|
|
1 99117882, 274638812, 520867322, 84410313, 123314453, 1489900,
|
|
2 187427702, 343739872, 448049452, 539358282, 625266642, 2329900,
|
|
3 65210892, 171325762, 373552252, 705192012, 116414343, 787900,
|
|
4 192837842, 600784802, 111113823, 165419233, 218524383, 1620000,
|
|
5 99117872, 274638812, 520867312, 84410313, 123314453, 2400000,
|
|
6 398981651, 130019172, 273438022, 516168382, 88411163, 797900,
|
|
7 131429482, 523279952, 111414623, 183422233, 262130233, 1770000,
|
|
8 192837842, 600784792, 111113823, 165419233, 218524383, 2500000,
|
|
9 600963001, 75910412, 150121572, 301940972, 539168952, 787000/
|
|
DATA NNN32/
|
|
1 73710852, 190731262, 464964142, 83810503, 127315053, 1660000,
|
|
2 131429482, 523279952, 111414623, 183422233, 262130233, 2600000,
|
|
3 110815502, 216829732, 398752322, 672484682, 104612673, 850000,
|
|
4 168225972, 362046562, 566766422, 757484612, 93010103, 1700000,
|
|
5 73710852, 190731262, 464964142, 83810503, 127315053, 2700000,
|
|
6 129117892, 239430882, 388748292, 596173252, 89510843, 910000,
|
|
7 110815502, 216829732, 398752322, 672484682, 104612673, 2000000,
|
|
8 168225972, 362046562, 566766422, 757484612, 93010103, 2800000,
|
|
9 158918512, 207523002, 254328242, 316335762, 407246582, 900000/
|
|
|
|
DATA NNN33/
|
|
1 98115462, 224930742, 401150612, 623475412, 89910583, 1855900,
|
|
C 2 110815502, 216829732, 398752322, 672484682, 104612673, 2900000,
|
|
2 146323292, 354651802, 74810923, 161723953, 348749363, 3322700,
|
|
3 203222611, 265731251, 364042301, 494958601, 702084731, 922000,
|
|
4 120521331, 357753801, 75310062, 130516572, 206925452, 2050000,
|
|
5 651780821, 108814772, 195925252, 316338622, 460853882, 3000000,
|
|
6 100010001, 100110111, 105211851, 152122101, 341552811, 1043002,
|
|
7 200320211, 210023021, 268834231, 480472341, 111416912, 1875000,
|
|
8 104012871, 186129471, 458664151, 82410072, 119013732, 3420000,
|
|
9 200420711, 222424271, 265429161, 325637371, 442853911, 610500/
|
|
DATA NNN34/
|
|
1 100010021, 101910801, 121414641, 189525811, 358949721, 2041900,
|
|
2 200020311, 216624611, 296337451, 489064791, 85711212, 2979900,
|
|
3 103411711, 147819101, 244331781, 434862751, 93113762, 741404,
|
|
4 204122231, 248227841, 311535621, 429153941, 651976431, 1502800,
|
|
5 100210131, 106812201, 154522671, 381665951, 95512512, 3192900,
|
|
6 400140351, 416944121, 474851591, 564362181, 690477231, 728700,
|
|
7 106814451, 204427341, 350744811, 586879131, 108314772, 1667900,
|
|
8 205523051, 264830231, 345439921, 469156001, 675281671, 2555900,
|
|
9 500950661, 518153561, 559058941, 628968071, 748483501, 843000/
|
|
DATA NNN35/
|
|
1 443756241, 696282451, 95411012, 128615262, 182922012, 1900000,
|
|
2 336953201, 682481011, 93810882, 127915272, 184622442, 2700000,
|
|
3 402841621, 431544771, 463148311, 520059491, 734896851, 930000,
|
|
4 576168741, 788387631, 96910642, 116012552, 135014462, 2000000,
|
|
5 490265341, 812797201, 116614322, 179622692, 285035302, 2900000,
|
|
6 100010001, 100010031, 102311051, 133018071, 264539391, 1074500,
|
|
7 402841621, 431544771, 463148311, 520059491, 734996851, 2000000,
|
|
8 576168741, 788387631, 96910642, 116012552, 135014462, 3000000,
|
|
9 200020011, 201220591, 218124481, 296538611, 488859141, 400000/
|
|
DATA NNN36/
|
|
1 100010001, 100010031, 102311051, 133018071, 264539401, 2200000,
|
|
2 421645151, 477449611, 511852711, 542455761, 572958821, 3300000,
|
|
3 100010041, 105212131, 153220271, 270435641, 460258111, 527600,
|
|
4 201221791, 258131471, 381645781, 546365131, 777592781, 1014400,
|
|
5 100010001, 100010031, 102311051, 133018071, 264539391, 3400000,
|
|
6 510064491, 82710872, 142718412, 232328712, 348341572, 690000,
|
|
7 228951571, 88513232, 183324132, 305537492, 448152402, 1210000,
|
|
8 723989131, 103511752, 130814352, 155416652, 177018682, 2000000,
|
|
9 620099241, 162725772, 391457072, 80110833, 141818023, 600000/
|
|
DATA NNN37/
|
|
1 620099241, 162725772, 391457072, 80110833, 141818023, 1200000,
|
|
2 620099251, 162725772, 391457072, 80110833, 141818023, 2000000,
|
|
3 347877992, 129318323, 240730533, 380546863, 570368573, 600000,
|
|
4 347877992, 129318323, 240730533, 380546863, 570368573, 1200000,
|
|
5 347777992, 129318323, 240730533, 380546863, 570368573, 2000000,
|
|
6 209530092, 450866762, 96613623, 186524763, 318839893, 600000,
|
|
7 209530092, 450866762, 96613623, 186524763, 318839893, 1200000,
|
|
8 209530092, 450866762, 96613623, 186524763, 318839893, 2000000,
|
|
9 209530092, 450866762, 96613623, 186524763, 318839893, 600000/
|
|
DATA NNN38/
|
|
1 209530092, 450866762, 96613623, 186524763, 318839893, 1200000,
|
|
2 209530092, 450866762, 96613623, 186524763, 318839893, 2000000,
|
|
3 209530092, 450866762, 96613623, 186524763, 318839893, 600000,
|
|
4 209530092, 450866762, 96613623, 186524763, 318839893, 1200000,
|
|
5 209530092, 450866762, 96613623, 186524763, 318839893, 2000000,
|
|
6 209530092, 450866762, 96613623, 186524763, 318839893, 600000,
|
|
7 209530092, 450866762, 96613623, 186524763, 318839893, 1200000,
|
|
8 209530092, 450866762, 96613623, 186524763, 318839893, 2000000,
|
|
9 209530092, 450866762, 96613623, 186524763, 318839893, 600000/
|
|
DATA NNN39/
|
|
1 209530092, 450866762, 96613623, 186524763, 318839893, 1200000,
|
|
2 209530092, 450866762, 96613623, 186524763, 318839893, 2000000,
|
|
3 209530092, 450866762, 96613623, 186524763, 318839893, 600000,
|
|
4 209530092, 450866762, 96613623, 186524763, 318839893, 1200000,
|
|
5 209530092, 450866762, 96613623, 186524763, 318839893, 2000000,
|
|
6 209530092, 450866762, 96613623, 186524763, 318839893, 600000,
|
|
7 209530092, 450866762, 96613623, 186524763, 318839893, 1200000,
|
|
8 209530092, 450866762, 96613623, 186524763, 318839893, 2000000,
|
|
9 209530092, 450866762, 96613623, 186524763, 318839893, 600000/
|
|
DATA NNN40/
|
|
1 209530092, 450866762, 96613623, 186524763, 318839893, 1200000,
|
|
2 209530092, 450866762, 96613623, 186524763, 318839893, 2000000/
|
|
DATA SCALE/.001,.01,.1,1./
|
|
C
|
|
if(mode.lt.0) return
|
|
tk=1.38054d-16*t
|
|
tv=8.6171d-5*t
|
|
C LOWERING OF THE IONIZATION POTENTIAL IN VOLTS FOR UNIT ZEFF
|
|
CHARGE=ANE*2.
|
|
DEBYE=SQRT(TK*DEBCON/CHARGE)
|
|
C DEBYE=SQRT(TK/12.5664/4.801E-10**2/CHARGE)
|
|
POTLOW=MIN(1.D0,1.44E-7/DEBYE)
|
|
IF(IIZ.LE.28)then
|
|
write(6,*) 'Error, routine PFHEAV for Z.GE.28 only'
|
|
stop23
|
|
endif
|
|
c removed elements with z<28
|
|
if(iiz.eq.28) n=1
|
|
IF(IIZ.GT.28) N=3*IIZ+54-135
|
|
IF(IIZ.eq.28) NIONS=4
|
|
IF(IIZ.GT.28) NIONS=3
|
|
NION2=MIN0(JNION+2,NIONS)
|
|
N=N-1
|
|
C
|
|
DO 18 ION=1,NION2
|
|
Z=ION
|
|
POTLO(ION)=POTLOW*Z
|
|
N=N+1
|
|
nnn6n=nnn(6+6*(N-1))
|
|
c nnn6n=nnn(6,n)
|
|
NNN100=NNN6N/100
|
|
XN1= NNN100
|
|
IP(ION)=XN1*1.e-3
|
|
IG=NNN6N-NNN100*100
|
|
GGG=IG
|
|
T2000=IP(ION)*T211
|
|
IT=MAX0(1,MIN0(9, INT(T/T2000-HALF)))
|
|
XIT=IT
|
|
DT=T/T2000-XIT-HALF
|
|
PMIN=ONE
|
|
I=(IT+1)/2
|
|
nnnin=nnn(i+6*(N-1))
|
|
c nnnin=nnn(i,n)
|
|
K1=NNNIN/100000
|
|
K2=NNNIN-K1*100000
|
|
K3=K2/10
|
|
xk1=k1
|
|
xk3=k3
|
|
KSCALE=K2-K3*10
|
|
IF(MOD(IT,2).EQ.0) GO TO 12
|
|
P1=XK1*SCALE(KSCALE)
|
|
P2=XK3*SCALE(KSCALE)
|
|
IF(DT.GE.0.)GO TO 13
|
|
IF(KSCALE.GT.1)GO TO 13
|
|
KP1=int(P1)
|
|
IF(KP1.NE. INT(P2+.5)) GO TO 13
|
|
PMIN=KP1
|
|
GO TO 13
|
|
12 continue
|
|
xk3=k3
|
|
P1=XK3*SCALE(KSCALE)
|
|
nnni1n=nnn(i+1+6*(N-1))
|
|
c nnni1n=nnn(i+1,n)
|
|
K1=NNNI1N/100000
|
|
KSCALE=MOD(NNNI1N,10)
|
|
xk1=k1
|
|
P2=XK1*SCALE(KSCALE)
|
|
13 PART(ION)= MAX (PMIN,P1+(P2-P1)*DT)
|
|
IF(GGG.EQ.0..OR.POTLO(ION).LT..1.OR.T.LT.T2000*4.) GO TO 18
|
|
IF(T.GT.(T2000*11.)) TV=(T2000*11.)*TVCON
|
|
D1=.1/TV
|
|
D2=POTLO(ION)/TV
|
|
DX=SQRT(HIONEV*Z*Z/TV/D2)**3
|
|
PART(ION)=PART(ION)+GGG*EXP(-IP(ION)/TV)*
|
|
* (DX*(THIRD+(ONE-(HALF+(X18+D2*X120)*D2)*D2)*D2)-
|
|
* DX*(THIRD+(ONE-(HALF+(X18+D1*X120)*D1)*D1)*D1))
|
|
18 CONTINUE
|
|
u=part(jnion)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
FUNCTION XK2DOP(TAU)
|
|
C ====================
|
|
C
|
|
C KERNEL FUNCTION K2
|
|
C AFTER HUMMER, 1981, J.Q.S.R.T. 26, 187
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
PARAMETER (PI2SQ=2.506628275D0, PISQ=1.772453851D0, UN=1.D0,
|
|
* A1= -1.117897000D-1, A2= -1.249099917D-1,
|
|
* A3= -9.136358767D-3, A4= -3.370280896D-4,
|
|
* B1= 1.566124168D-1, B2= 9.013261660D-3,
|
|
* B3= 1.908481163D-4, B4= -1.547417750D-7,
|
|
* B5= -6.657439727D-9,
|
|
* C1= 1.915049608D01, C2= 1.007986843D02,
|
|
* C3= 1.295307533D02, C4= -3.143372468D01,
|
|
* D1= 1.968910391D01, D2= 1.102576321D02,
|
|
* D3= 1.694911399D02, D4= -1.669969409D01,
|
|
* D5= -3.666448000D01)
|
|
XK2DOP=UN
|
|
IF(TAU.LE.0.) RETURN
|
|
IF(TAU.LE.11.) THEN
|
|
P=UN+TAU*(A1+TAU*(A2+TAU*(A3+TAU*A4)))
|
|
Q=UN+TAU*(B1+TAU*(B2+TAU*(B3+TAU*(B4+TAU*B5))))
|
|
XK2DOP=TAU/PI2SQ*LOG(TAU/PISQ)+P/Q
|
|
ELSE
|
|
X=UN/LOG(TAU/PISQ)
|
|
P=UN+X*(C1+X*(C2+X*(C3+X*C4)))
|
|
Q=UN+X*(D1+X*(D2+X*(D3+X*(D4+X*D5))))
|
|
XK2DOP=P/Q/2.D0/TAU/SQRT(LOG(TAU/PISQ))
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE LTEGR
|
|
C ================
|
|
C
|
|
C Driving procedure for computing the initial LTE-grey model
|
|
C atmosphere
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
C
|
|
COMMON ESEMAT(MLEVEL,MLEVEL),BESE(MLEVEL),
|
|
* DEPTH(MDEPTH),DEPTH0(MDEPTH),TAU(MDEPTH),TAU0(MDEPTH),
|
|
* TEMP0(MDEPTH),ELEC0(MDEPTH),DENS0(MDEPTH),DM0(MDEPTH)
|
|
C
|
|
C ----------------
|
|
C Input parameters
|
|
C ----------------
|
|
C
|
|
C NDEPTH - number of depth points for evaluating LTE-grey model
|
|
C = 0 - NDEPTH is taken to be ND-1
|
|
C TAUFIR - Rosseland optical depth in the first depth point
|
|
C TAULAS - Rosseland optical depth in the last depth point
|
|
C ABROS0 - an estimate of the Rosseland opacity (per gram) at the
|
|
C first depth point
|
|
C TSURF = 0 - surface temperature and the Hopf function are
|
|
C evaluated exactly
|
|
C > 0 - value of surface temperature is set to TSURF, and
|
|
C the Hopf function is assumed to be constant,
|
|
C corresponding to TSURF
|
|
C ALBAVE = 0 - wind blanketing is not considered
|
|
C > 0 - wind blanketing is considered; the averaged value
|
|
C of albedo [precisely the quantity (1+rho)/(1-rho)
|
|
C in the notation of Hummer (Ap.J. 257, 724, 1982)
|
|
C see his Eq. (3.1)] is ALBAVE
|
|
C DION0 - initial estimate of the degree of ionization at
|
|
C the first depth point (=1 for completely ionized;
|
|
C =1/2 for completely neutral)
|
|
C
|
|
C --------------------------------------------------------------------
|
|
C IDEPTH - mode of determining the mass-depth scale to be used
|
|
C in linearization
|
|
C = 0 - depth scale DM (in g*cm**-2) is evaluated as mass
|
|
C corresponding to Rosseland optical depths which
|
|
C are equidistantly spaced in logarithms between
|
|
C the first point TAUFIR and the last point TAULAS
|
|
C the last-but-one point is, however, set to
|
|
C TAULAS-1.
|
|
C = 2 - depth scale DM is evaluated as that corresponding
|
|
C to input values of Rosseland optical depth -
|
|
C array TAU0(ID), ID=1,ND
|
|
C = 1 - similar, but now DM is evaluated as mass
|
|
C corresponding to Rosseland optical depths which
|
|
C are equidistantly spaced in logarithms between
|
|
C the first point TAU1 and the last-but-one point
|
|
C TAU2; the last point is TAUL
|
|
C (i.e. similar to option 0, now TAU1 and TAUL may
|
|
C be different from TAUFIR nad TAULAS)
|
|
C = 3 - depth scale DM has already been read in START
|
|
C NCONIT - number of internal iterations for calculating the
|
|
C gray model with convection
|
|
C = 0 - and HMIX0>0, then NCONIT is set to 10
|
|
C IPRING - controls diagnostic output of the LTE-gray model
|
|
C calculations
|
|
C = 0 - no output
|
|
C = 1 - only final LTE-gray model
|
|
C = 2 - results of all internal iterations
|
|
C IHM > 0 - negative hydrogen ion considered in particle and
|
|
C charge conservation in ELDENS
|
|
C IH2 > 0 - hydrogen molecule considered in particle
|
|
C conservation in ELDENS
|
|
C IH2P > 0 - ionized hydrogen molecule considered in particle
|
|
C and charge conservation in ELDENS
|
|
C
|
|
IF(NDGREY.EQ.0) THEN
|
|
NDEPTH=ND
|
|
ELSE
|
|
NDEPTH=NDGREY
|
|
END IF
|
|
IF(NDEPTH.GT.MDEPTH)
|
|
* CALL QUIT('ndepth.gt.mdepth in LTEGR',ndepth,mdepth)
|
|
IDEPTH=IDGREY
|
|
IF(ALBAVE.GT.0.AND.TSURF.EQ.0.) TSURF=(0.433*ALBAVE)**0.25
|
|
HOPF0=0.
|
|
IF(TSURF.NE.0.) HOPF0=4.D0*TSURF**4/3.D0
|
|
T4=TEFF**4
|
|
ANEREL=(DION0-HALF )/DION0
|
|
IF(NCONIT.EQ.0.AND.HMIX0.GT.0.) NCONIT=10
|
|
IF(ANEREL.LT.1.D-3) ANEREL=1.D-3
|
|
LTE0=LTE
|
|
LTE=.TRUE.
|
|
IF(NDEPTH.EQ.0) NDEPTH=ND-1
|
|
ND0=ND
|
|
ND=NDEPTH
|
|
DO I=1,ND0
|
|
DM0(I)=DM(I)
|
|
END DO
|
|
C
|
|
C tau(ross) scale - logarithmically equidistant points between
|
|
C input TAUFIR and TAULAS
|
|
C
|
|
DML0=LOG(TAUFIR)
|
|
DLGM=(LOG(TAULAS)-DML0)/(NDEPTH-1)
|
|
DO I=1,NDEPTH
|
|
TAU0(I)=DML0+(I-1)*DLGM
|
|
TAU(I)=EXP(TAU0(I))
|
|
TAUROS(I)=TAU(I)
|
|
END DO
|
|
C
|
|
DPRAD=1.891204931D-15*T4
|
|
if(ifprad.eq.0) dprad=0.
|
|
C
|
|
PRAD0=DPRAD/1.732D0
|
|
ABROS=ABROS0
|
|
PLOG1=0.
|
|
PLOG2=0.
|
|
PLOG3=0.
|
|
DPLOG1=0.
|
|
DPLOG2=0.
|
|
IF(IPRING.GT.0) WRITE(6,601)
|
|
C
|
|
C -------------------------------------------------------------------
|
|
C
|
|
C 1.part
|
|
C Integration of the hydrostatic equilibrium equation on the
|
|
C tau(ross) scale;
|
|
C basically by a predictor-corrector method
|
|
C (similar to Kurucz's ATLAS code)
|
|
C
|
|
DO I=1,NDEPTH
|
|
J=0
|
|
TAUR=TAU(I)
|
|
C
|
|
C predictor step
|
|
C
|
|
IF(I.EQ.1) PLOG=LOG(GRAV/ABROS*TAUR+prad0)
|
|
IF(I.GT.1.AND.I.LE.4) PLOG=PLOG1+DPLOG1
|
|
IF(I.GT.4) PLOG=(3.*PLOG4+8.*DPLOG1-4.*DPLOG2+8.*DPLOG3)/3.
|
|
ERROR=1.
|
|
GO TO 40
|
|
C
|
|
C corrector step
|
|
C ------ iterate between hydrostatic equilibrium (which determines an
|
|
C increment of the total pressure) and state equations (which
|
|
C determine relevant number densities and then the Rosseland
|
|
C opacity)
|
|
C
|
|
30 IF(I.EQ.1) PNEW=LOG(GRAV/ABROS*TAUR+prad0)
|
|
IF(I.GT.1.AND.I.LE.4) PNEW=(PLOG+2.*PLOG1+DPLOG+DPLOG1)/3.
|
|
IF(I.GT.4) PNEW=(126.*PLOG1-14.*PLOG3+9.*PLOG4+42.*DPLOG+
|
|
* 108.*DPLOG1-54.*DPLOG2+24.*DPLOG3)/121.
|
|
ERROR=ABS(PNEW-PLOG)
|
|
PLOG=PNEW
|
|
40 PTOT=EXP(PLOG)
|
|
P=PTOT-TAUR*DPRAD-prad0
|
|
J=J+1
|
|
CALL ROSSOP(I,P,TAUR,HOPF0,T4,T,ANE,ABROS)
|
|
DPLOG=GRAV/ABROS*TAUR/PTOT*DLGM
|
|
IF(ERROR.GT.1.D-4.AND.J.LT.10) GO TO 30
|
|
C
|
|
C ------ end of the iteration loop;
|
|
C set up necessary quantities for the next depth step of the
|
|
C hydrostatic equilibrium
|
|
C
|
|
PLOG4=PLOG3
|
|
PLOG3=PLOG2
|
|
PLOG2=PLOG1
|
|
PLOG1=PLOG
|
|
DPLOG3=DPLOG2
|
|
DPLOG2=DPLOG1
|
|
DPLOG1=DPLOG
|
|
TEMP0(I)=T
|
|
ELEC0(I)=ANE
|
|
AN=P/T/BOLK
|
|
DEPTH(I)=(PTOT-prad0)/GRAV
|
|
DM(I)=DEPTH(I)
|
|
DENS0(I)=WMM(I)*(AN-ANE)
|
|
IF(IPRING.GT.0) WRITE(6,602) I,TAU(I),DEPTH(I),T,
|
|
* AN,ANE,P,ABROS
|
|
PTOTAL(I)=PTOT
|
|
PGS(I)=P
|
|
END DO
|
|
C
|
|
C -------------------------------------------------------------------
|
|
C
|
|
C 2. Second part - taking into account convection
|
|
C
|
|
IF(HMIX0.GT.0.) THEN
|
|
CALL CONTMP
|
|
GO TO 110
|
|
END IF
|
|
C
|
|
C -------------------------------------------------------------------
|
|
C
|
|
C 3. Third part
|
|
C Interpolation of the computed model to the depth scale which is
|
|
C going to be used in the subsequent - complete-linearization -
|
|
C part of the model atmosphere construction
|
|
C
|
|
ND=ND0
|
|
C
|
|
C First option - logarithmically equidistant Rosseland opt.depths
|
|
C the same first and last depth as in the first part
|
|
C
|
|
IF(IDEPTH.EQ.0) THEN
|
|
TAU1=TAUFIR
|
|
TAUL=TAULAS
|
|
TAU2=TAULAS-1.
|
|
C
|
|
C Second option - logarithmically equidistant Rosseland opt.depths
|
|
C the first, last-but-one, and last depths are read
|
|
C
|
|
ELSE IF(IDEPTH.EQ.1) THEN
|
|
READ(IBUFF,*) TAU1,TAU2,TAUL
|
|
END IF
|
|
C
|
|
IF(IDEPTH.LE.1) THEN
|
|
DML0=LOG(TAU1)
|
|
IF(TAUL.GT.0.) THEN
|
|
DLGM=(LOG(TAU2)-DML0)/(ND-2)
|
|
DO I=1,ND-1
|
|
TAU0(I)=DML0+(I-1)*DLGM
|
|
END DO
|
|
TAU0(ND)=LOG(TAUL)
|
|
ELSE
|
|
DLGM=(LOG(TAU2)-DML0)/(ND-1)
|
|
DO I=1,ND
|
|
TAU0(I)=DML0+(I-1)*DLGM
|
|
END DO
|
|
END IF
|
|
ELSE IF(IDEPTH.EQ.2) THEN
|
|
C
|
|
C Third option - prescribed set of Rosseland optical depths
|
|
C
|
|
READ(IBUFF,*) (TAU0(I),I=1,ND)
|
|
DO I=1,ND
|
|
TAU0(I)=LOG(TAU0(I))
|
|
END DO
|
|
ELSE if(idepth.eq.3) then
|
|
C
|
|
C Fourth option - interpolation to the prescribed mass scale DM
|
|
C
|
|
DO I=1,ND
|
|
DM(I)=DM0(I)
|
|
DM0(I)=LOG(DM(I))
|
|
END DO
|
|
CALL INTERP(DEPTH0,TEMP0,DM0,TEMP,NDEPTH,ND,2,0,0)
|
|
CALL INTERP(DEPTH0,ELEC0,DM0,ELEC,NDEPTH,ND,2,0,1)
|
|
CALL INTERP(DEPTH0,DENS0,DM0,DENS,NDEPTH,ND,2,0,1)
|
|
END IF
|
|
C
|
|
C in the first three options - interpolation from the previous
|
|
C Rosseland opacity scale to the new scale and from the previous
|
|
C mass depth scale to the new one
|
|
C
|
|
IF(IDEPTH.LE.2) THEN
|
|
DO I=1,NDEPTH
|
|
TEMP0(I)=TEMP(I)
|
|
ELEC0(I)=ELEC(I)
|
|
DENS0(I)=DENS(I)
|
|
TAU(I)=LOG(TAUROS(I))
|
|
DEPTH0(I)=LOG(DM(I))
|
|
END DO
|
|
CALL INTERP(TAU,DEPTH0,TAU0,DM0,NDEPTH,ND,3,0,0)
|
|
CALL INTERP(TAU,TEMP0,TAU0,TEMP,NDEPTH,ND,3,0,0)
|
|
CALL INTERP(TAU,ELEC0,TAU0,ELEC,NDEPTH,ND,3,0,1)
|
|
CALL INTERP(TAU,DENS0,TAU0,DENS,NDEPTH,ND,3,0,1)
|
|
DO ID=1,ND
|
|
DM(ID) = EXP(DM0(ID))
|
|
TOTN(ID) = DENS(ID)/WMM(ID)+ELEC(ID)
|
|
PTOTAL(ID) = DM(ID)*GRAV+PRAD0
|
|
PGS(ID) = TOTN(ID)*BOLK*TEMP(ID)
|
|
END DO
|
|
END IF
|
|
C
|
|
C Recalculation of the populations
|
|
C
|
|
DO ID=1,ND
|
|
CALL WNSTOR(ID)
|
|
CALL STEQEQ(ID,POP,1)
|
|
END DO
|
|
C
|
|
110 CONTINUE
|
|
IF(HMIX0.GE.0.) THEN
|
|
CALL CONOUT(2,IPRING)
|
|
END IF
|
|
LCHC=LCHC0
|
|
LTE=LTE0
|
|
IRSPLT=IRSPL0
|
|
601 FORMAT(1H1, 'COMPUTED LTE-GREY MODEL'//' ID TAU',7X,
|
|
* 'MASS',5X,'TEMP',7X,'N',10X,'NE',9X,'P',9X,'ROSS.OP'/)
|
|
602 FORMAT(1H ,I4,1P2D11.3,0PF8.0,1P4D11.3)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE ROSSOP(ID,P,TAUR,HOPF,T4,T,ANE,ABROSS)
|
|
C =================================================
|
|
C
|
|
C Auxiliary procedure for LTEGR
|
|
C Evaluation of temperature, electron density, and Rosseland
|
|
C opacity for a given TAUR (Rosseland optical depth) and P (total
|
|
C pressure)
|
|
C
|
|
C Input parameters:
|
|
C ID - depth index
|
|
C P - total pressure
|
|
C TAUR - Rosseland optical depth
|
|
C HOPF - mode of evaluating Hopf function;
|
|
C = 0 - exact Hopf function
|
|
C > 0 - constant Hopf function to HOPF
|
|
C T4 = effective temperature ** 4
|
|
C
|
|
C Output:
|
|
C T - temperature
|
|
C ANE - electron density
|
|
C ABROSS - Rosseland opacity (per gram)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
DIMENSION A(5)
|
|
C
|
|
DATA A/0.71044609D0,-0.2830385D0,0.57975839D0,-0.75751038D0,
|
|
* 0.45026781D0/
|
|
SAVE A
|
|
C
|
|
C Hopf function
|
|
C
|
|
X=HOPF
|
|
IF(X.GT.0.) GO TO 10
|
|
X=A(1)
|
|
IF(TAUR.GT.160.) GO TO 10
|
|
EX=EXP(-TAUR)
|
|
E1=EXPINT(TAUR)
|
|
E=E1
|
|
DO I=1,4
|
|
E=(EX-TAUR*E)/I
|
|
X=X+E*A(I+1)
|
|
END DO
|
|
C
|
|
C Temperature
|
|
C
|
|
10 T=(0.75*T4*(TAUR+X)+EXTOT)**0.25
|
|
C
|
|
C Determination of electron density from the total pressure
|
|
C
|
|
if(ioptab.ge.-1) then
|
|
AN=P/T/BOLK
|
|
CALL ELDENS(ID,T,AN,ANE,ENRG,ENTT,WM,1)
|
|
RHO=WMM(ID)*(AN-ANE)
|
|
DENS(ID)=RHO
|
|
C
|
|
C temperature and electron density are transmitted to SABOLF
|
|
C and RATMAT through arrays TEMP and ELEC
|
|
C
|
|
TEMP(ID)=T
|
|
ELEC(ID)=ANE
|
|
C
|
|
C Corresponding LTE populations
|
|
C
|
|
if(ioptab.ge.0) then
|
|
CALL WNSTOR(ID)
|
|
CALL STEQEQ(ID,POP,1)
|
|
C
|
|
C Finally, evaluation of the Rosseland opacity for the new values
|
|
C of temperature, electron density, and populations
|
|
C (ROSS - Rosseland opacity per 1 cm**3)
|
|
C
|
|
CALL OPACF0(ID,NFREQ)
|
|
CALL MEANOP(T,ABSO,SCAT,OPROS,OPPLA)
|
|
ABROSS=OPROS/RHO
|
|
ABROSD(ID)=ABROSS
|
|
ABPLAD(ID)=OPPLA/RHO
|
|
else
|
|
call meanopt(t,id,rho,opros,oppla)
|
|
abrosd(id)=opros
|
|
abplad(id)=oppla
|
|
abross=opros
|
|
end if
|
|
else
|
|
temp(id)=t
|
|
rho=rhoeos(t,p)
|
|
dens(id)=rho
|
|
call meanopt(t,id,rho,opros,oppla)
|
|
abrosd(id)=opros
|
|
abplad(id)=oppla
|
|
abross=opros
|
|
end if
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE CONTMP
|
|
C =================
|
|
C
|
|
C Auxiliary procedure for LTEGR
|
|
C Determination of temperature in convectively unstable layers
|
|
C This is done by solving the energy balance equation
|
|
C F(rad)+F(conv)=F(mech), which yields a cubic equation for
|
|
C the logarithmic temperature gradient
|
|
C
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
COMMON ESEMAT(MLEVEL,MLEVEL),BESE(MLEVEL),
|
|
* DEPTH(MDEPTH),DEPTH0(MDEPTH),TAU(MDEPTH),TAU0(MDEPTH),
|
|
* TEMP0(MDEPTH),ELEC0(MDEPTH),DENS0(MDEPTH),DM0(MDEPTH)
|
|
DIMENSION DELTR(MDEPTH),TEMPR(MDEPTH),ICON0(MDEPTH)
|
|
COMMON/CUBCON/A,B,DEL,GRDADB,DELMDE,RHO,FLXTOT,GRAVD
|
|
common/ichndm/ichanm
|
|
PARAMETER (ERRT=1.D-3)
|
|
C
|
|
C First, store the temperature(rad) and gradient Delta(rad) -
|
|
C quantities for the purely raditive equilibrium model
|
|
C
|
|
T4=TEFF**4
|
|
FLXTO0=SIG4P*T4
|
|
DPRAD=1.891204931D-15*T4
|
|
if(ifprad.eq.0) dprad=0.
|
|
C
|
|
PRAD0=DPRAD/1.732D0
|
|
DO ID=1,ND
|
|
TEMPR(ID)=TEMP(ID)
|
|
IF(ID.EQ.1) THEN
|
|
DELTR(ID)=0.
|
|
ELSE
|
|
if(ilgder.eq.0) then
|
|
DELTR(ID)=
|
|
* (TEMP(ID)-TEMP(ID-1))/(PTOTAL(ID)-PTOTAL(ID-1))*
|
|
* (PTOTAL(ID)+PTOTAL(ID-1))/(TEMP(ID)+TEMP(ID-1))
|
|
else
|
|
DELTR(ID)=
|
|
* LOG(TEMP(ID)/TEMP(ID-1))/LOG(PTOTAL(ID)/PTOTAL(ID-1))
|
|
end if
|
|
END IF
|
|
END DO
|
|
ICONIT=0
|
|
C
|
|
C ------------------------------------------------------
|
|
C Global iteration loop for calculating convective model
|
|
C ------------------------------------------------------
|
|
C
|
|
20 ICONIT=ICONIT+1
|
|
ICONBE=0
|
|
CHANTM=0.
|
|
DO ID=1,ND
|
|
T=TEMP(ID)
|
|
PTOT=PTOTAL(ID)
|
|
PGAS=PGS(ID)
|
|
PTURB=HALF*DENS(ID)*VTURB(ID)*VTURB(ID)
|
|
PRAD=PTOT-PGAS-PTURB
|
|
PRADT(ID)=PRAD
|
|
FLXTOT=FLXTO0
|
|
IF(IDISK.EQ.1) THEN
|
|
FLXTOT=FLXTO0*(UN-THETA(ID))
|
|
GRAVD=ZD(ID)*QGRAV
|
|
END IF
|
|
ICON0(ID)=0
|
|
C
|
|
IF(ID.EQ.1) GO TO 45
|
|
J=0
|
|
IF(ICONIT.EQ.1) T=T-TEMPR(ID-1)+TEMP(ID-1)
|
|
TM=TEMP(ID-1)
|
|
IF(T.LT.0.) T=TM
|
|
PTOTM=PTOTAL(ID-1)
|
|
if(ilgder.eq.0) then
|
|
PT0=HALF*(PTOT+PTOTM)
|
|
else
|
|
pt0=sqrt(ptot*ptotm)
|
|
end if
|
|
DELR=DELTR(ID)
|
|
C
|
|
C Inner iteration loop for determining temperature in the
|
|
C conectively unstable layers
|
|
C
|
|
30 J=J+1
|
|
TOLD=T
|
|
if(ilgder.eq.0) then
|
|
T0=HALF*(T+TM)
|
|
PG0=HALF*(PGAS+PGM)
|
|
PR0=HALF*(PRAD+PRADM)
|
|
AB0=HALF*(ABROSD(ID)+ABROSD(ID-1))
|
|
else
|
|
t0=sqrt(t*tm)
|
|
pg0=sqrt(pgas*pgm)
|
|
pr0=sqrt(prad*pradm)
|
|
ab0=sqrt(abrosd(id)*abrosd(id-1))
|
|
end if
|
|
IF(ID.GE.ND-2.AND.ICONBE.EQ.0) GO TO 40
|
|
CALL CONVEC(ID,T0,PT0,PG0,PR0,AB0,DELR,FLXCNV,VCON)
|
|
IF(FLXCNV.EQ.0..or.id.lt.idconz) GO TO 40
|
|
ICON0(ID)=1
|
|
ICONBE=1
|
|
CALL CUBIC(DELTA0)
|
|
REFF=DELTA0/DELR
|
|
PRAD=PRADM+(TAUROS(ID)-TAUROS(ID-1))*DPRAD*REFF
|
|
PRADT(ID)=PRAD
|
|
PGAS=PTOT-PRAD-PTURB
|
|
if(ilgder.eq.0) then
|
|
IF(REFF.GT.UN) REFF=UN
|
|
IF(REFF.LT.0.) REFF=0.
|
|
FAC=DELTA0*(PTOT-PTOTM)/(PTOT+PTOTM)
|
|
T=TM*(UN+FAC)/(UN-FAC)
|
|
IF(T.LT.TM) T=TM
|
|
else
|
|
T=TM*(PTOT/PTOTM)**DELTA0
|
|
IF(T.LT.TM) T=TM*1.0001
|
|
end if
|
|
IF(ABS(UN-T/TOLD).GT.ERRT.AND.J.LT.10) GO TO 30
|
|
C
|
|
C Store the final quantitites
|
|
C
|
|
40 IF(ID.GT.1.AND.ICON0(ID).EQ.0.AND.ICON0(ID-1).EQ.1)
|
|
* DELTC=DELT0
|
|
45 DELT0=TEMP(ID)-T
|
|
IF(TEMP(ID).NE.0.) CHANT0=ABS((T-TEMP(ID))/TEMP(ID))
|
|
IF(CHANT0.GT.CHANTM) CHANTM=CHANT0
|
|
TEMP(ID)=T
|
|
IF(ICONIT.GT.1.AND.ICON0(ID).EQ.0.AND.ICONBE.EQ.1)
|
|
* TEMP(ID)=T-DELTC
|
|
PGM=PGAS
|
|
PRADM=PRAD
|
|
PGS(ID)=PGAS
|
|
END DO
|
|
C
|
|
C Diagnostic outprint
|
|
C
|
|
IF(IPRING.EQ.2) THEN
|
|
WRITE(6,600) ICONIT
|
|
CALL CONOUT(1,IPRING)
|
|
END IF
|
|
600 FORMAT(1H1,' CONVECTIVE FLUX: AT CONTMP, ITER=',I2/)
|
|
C
|
|
C 2. New values of electron density, density, sound spped,
|
|
C and mean opacities and optical depths
|
|
C
|
|
c
|
|
ANEREL=ELEC(1)/(DENS(1)/WMM(1)+ELEC(1))
|
|
DO 70 ID=1,ND
|
|
T=TEMP(ID)
|
|
P=PTOTAL(ID)
|
|
ITINT=0
|
|
60 ITINT=ITINT+1
|
|
if(ioptab.ge.-1) then
|
|
AN=PGS(ID)/T/BOLK
|
|
CALL ELDENS(ID,T,AN,ANE,ENRG,ENTT,WM,1)
|
|
ELEC(ID)=ANE
|
|
DENS(ID)=WMM(ID)*(AN-ANE)
|
|
PHMOL(ID)=AHMOL
|
|
C
|
|
C Corresponding LTE populations
|
|
C
|
|
if(ioptab.ge.0) then
|
|
CALL WNSTOR(ID)
|
|
CALL STEQEQ(ID,POP,1)
|
|
C
|
|
C Evaluation of the Rosseland and Planck mean opacities
|
|
C
|
|
CALL OPACF0(ID,NFREQ)
|
|
CALL MEANOP(T,ABSO,SCAT,OPROS,OPPLA)
|
|
ABROS=OPROS/DENS(ID)
|
|
ABPLA=OPPLA/DENS(ID)
|
|
else
|
|
rho=dens(id)
|
|
call meanopt(t,id,rho,abros,abpla)
|
|
abrosd(id)=abros
|
|
abplad(id)=abpla
|
|
end if
|
|
else
|
|
rho=rhoeos(t,p)
|
|
dens(id)=rho
|
|
call meanopt(t,id,rho,abros,abpla)
|
|
abrosd(id)=abros
|
|
abplad(id)=abpla
|
|
end if
|
|
C
|
|
C New values of the the column mass
|
|
C
|
|
PTOLD=PTOTAL(ID)
|
|
if(idisk.eq.0.and.ichanm.gt.0) then
|
|
IF(ID.EQ.1) THEN
|
|
DM(ID)=TAUROS(ID)/ABROS
|
|
PTOTAL(ID)=DM(ID)*GRAV+PRAD0
|
|
ELSE
|
|
DM(ID)=DM(ID-1)+(TAUROS(ID)-TAUROS(ID-1))/
|
|
* HALF/(ABROSD(ID-1)+ABROS)
|
|
PTOTAL(ID)=DM(ID)*GRAV+PRAD0
|
|
END IF
|
|
C
|
|
C Store the final quantitites
|
|
C
|
|
PTURB=HALF*DENS(ID)*VTURB(ID)*VTURB(ID)
|
|
PGS(ID)=PTOTAL(ID)-PRADT(ID)-PTURB
|
|
end if
|
|
ABROSD(ID)=ABROS
|
|
ABPLAD(ID)=ABPLA
|
|
IF((PTOTAL(ID)-PTOLD)/PTOLD.LT.1.D-3) GO TO 70
|
|
IF(ITINT.GT.5) THEN
|
|
WRITE(6,601) ID,PTOLD,PTOTAL(ID)
|
|
GO TO 70
|
|
ELSE
|
|
GO TO 60
|
|
END IF
|
|
70 CONTINUE
|
|
C *** TEMPORARY
|
|
C
|
|
IF(ICONIT.LT.NCONIT) GO TO 20
|
|
601 FORMAT(1H0,'SLOW CONVERGENCE OF INTERNAL ITERATIONS IN',
|
|
* ' CONTMP: ID, PTOT(OLD), PTOT(NEW) ='/I3,1P2D10.2/)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE CONTMD
|
|
C =================
|
|
C
|
|
C Auxiliary procedure for LTEGRD
|
|
C Determination of temperature in convectively unstable layers
|
|
C for disks.
|
|
C This is done by solving the energy balance equation
|
|
C F(rad)+F(conv)=F(mech), which yields a cubic equation for
|
|
C the logarithmic temperature gradient
|
|
C
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
COMMON ESEMAT(MLEVEL,MLEVEL),BESE(MLEVEL),
|
|
* DEPTH(MDEPTH),DEPTH0(MDEPTH),TAU(MDEPTH),TAU0(MDEPTH),
|
|
* TEMP0(MDEPTH),ELEC0(MDEPTH),DENS0(MDEPTH),DM0(MDEPTH)
|
|
DIMENSION DELTR(MDEPTH),TEMPR(MDEPTH),ICON0(MDEPTH)
|
|
COMMON/CUBCON/A,B,DEL,GRDADB,DELMDE,RHO,FLXTOT,GRAVD
|
|
COMMON/PRSAUX/VSND2(MDEPTH),HG1,HR1,RR1
|
|
PARAMETER (ERRT=1.D-3)
|
|
C
|
|
C First, store the temperature(rad) and gradient Delta(rad) -
|
|
C quantities for the purely raditive equilibrium model
|
|
C
|
|
T4=TEFF**4
|
|
FLXTO0=SIG4P*T4
|
|
DPRAD=1.891204931D-15*T4
|
|
if(ifprad.eq.0) dprad=0.
|
|
PRAD0=DPRAD/1.732D0
|
|
DO ID=1,ND
|
|
TEMPR(ID)=TEMP(ID)
|
|
IF(ID.EQ.1) THEN
|
|
DELTR(ID)=0.
|
|
ELSE
|
|
DELTR(ID)=
|
|
* (TEMP(ID)-TEMP(ID-1))/(PTOTAL(ID)-PTOTAL(ID-1))*
|
|
* (PTOTAL(ID)+PTOTAL(ID-1))/(TEMP(ID)+TEMP(ID-1))
|
|
END IF
|
|
END DO
|
|
ICONIT=0
|
|
C
|
|
C ------------------------------------------------------
|
|
C Global iteration loop for calculating convective model
|
|
C ------------------------------------------------------
|
|
C
|
|
20 ICONIT=ICONIT+1
|
|
ICONBE=0
|
|
HR1=FLXTO0*PCK*ABROSD(1)/QGRAV
|
|
CHANTM=0.
|
|
DOID=1,ND
|
|
T=TEMP(ID)
|
|
PTOT=PTOTAL(ID)
|
|
PGAS=PGS(ID)
|
|
PTURB=HALF*DENS(ID)*VTURB(ID)*VTURB(ID)
|
|
PRAD=PRADT(ID)
|
|
FLXTOT=FLXTO0*(UN-THETA(ID))
|
|
GRAVD=ZD(ID)*QGRAV
|
|
ICON0(ID)=0
|
|
C
|
|
IF(ID.EQ.1) GO TO 40
|
|
J=0
|
|
IF(ICONIT.EQ.1) T=T-TEMPR(ID-1)+TEMP(ID-1)
|
|
TM=TEMP(ID-1)
|
|
IF(T.LT.0.) T=TM
|
|
PGM=PGS(ID-1)
|
|
PTOTM=PTOTAL(ID-1)
|
|
PT0=HALF*(PTOT+PTOTM)
|
|
DELR=DELTR(ID)
|
|
C
|
|
C Inner iteration loop for determining temperature in the
|
|
C conectively unstable layers
|
|
C
|
|
30 J=J+1
|
|
TOLD=T
|
|
T0=HALF*(T+TM)
|
|
PG0=HALF*(PGAS+PGM)
|
|
PR0=HALF*(PRAD+PRADM)
|
|
AB0=HALF*(ABROSD(ID)+ABROSD(ID-1))
|
|
IF(ID.GE.ND-2.AND.ICONBE.EQ.0) GO TO 40
|
|
CALL CONVEC(ID,T0,PT0,PG0,PR0,AB0,DELR,FLXCNV,VCON)
|
|
IF(FLXCNV.EQ.0.) GO TO 40
|
|
ICON0(ID)=1
|
|
ICONBE=1
|
|
if(id.eq.nd) then
|
|
pip=(ptot+ptotm)/(ptot-ptotm)
|
|
t=tm*(pip+delr)/(pip-delr)
|
|
go to 40
|
|
end if
|
|
CALL CUBIC(DELTA0)
|
|
FAC=DELTA0*(PTOT-PTOTM)/(PTOT+PTOTM)
|
|
T=TM*(UN+FAC)/(UN-FAC)
|
|
IF(T.LT.TM) T=TM
|
|
IF(ABS(UN-T/TOLD).GT.ERRT.AND.J.LT.10) GO TO 30
|
|
C
|
|
C Store the final quantitites
|
|
C
|
|
40 IF(ID.GT.1.AND.ICON0(ID).EQ.0.AND.ICON0(ID-1).EQ.1)
|
|
* DELTC=DELT0
|
|
if(id.eq.nd) then
|
|
pip=(ptot+ptotm)/(ptot-ptotm)
|
|
t=tm*(pip+delr)/(pip-delr)
|
|
end if
|
|
DELT0=TEMP(ID)-T
|
|
PRADT(ID)=PRADT(ID)*(T/TEMP(ID))**4
|
|
DENS(ID)=DENS(ID)*(TEMP(ID)/T)
|
|
IF(TEMP(ID).NE.0.) CHANT0=ABS((T-TEMP(ID))/TEMP(ID))
|
|
IF(CHANT0.GT.CHANTM) CHANTM=CHANT0
|
|
TEMP(ID)=T
|
|
IF(ICONIT.GT.1.AND.ICON0(ID).EQ.0.AND.ICONBE.EQ.1)
|
|
* TEMP(ID)=T-DELTC
|
|
PRADM=PRADT(ID)
|
|
END DO
|
|
C
|
|
C Diagnostic outprint
|
|
C
|
|
IF(IPRING.EQ.2) THEN
|
|
WRITE(6,600) ICONIT
|
|
CALL CONOUT(1,IPRING)
|
|
END IF
|
|
600 FORMAT(1H1,' CONVECTIVE FLUX: AT CONTMD, ITER=',I2/)
|
|
C
|
|
C 2. New values of electron density and density
|
|
C
|
|
CALL HESOL6
|
|
C
|
|
C Evaluation of the Rosseland and Planck mean opacities
|
|
C
|
|
DO ID=1,ND
|
|
T=TEMP(ID)
|
|
CALL WNSTOR(ID)
|
|
CALL STEQEQ(ID,POP,1)
|
|
CALL OPACF0(ID,NFREQ)
|
|
CALL MEANOP(T,ABSO,SCAT,OPROS,OPPLA)
|
|
ABROS=OPROS/DENS(ID)
|
|
ABPLA=OPPLA/DENS(ID)
|
|
ABROSD(ID)=ABROS
|
|
ABPLAD(ID)=ABPLA
|
|
END DO
|
|
IF(CHANTM.GT.ERRT.AND.ICONIT.LT.NCONIT) GO TO 20
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE ELDENS(ID,T,AN,ANE,ENRG,ENTT,WM,IPRI)
|
|
C ===============================================
|
|
C
|
|
C Evaluation of the electron density and the total hydrogen
|
|
C number density for a given total particle number density
|
|
C and temperature;
|
|
C by solving the set of Saha equations, charge conservation and
|
|
C particle conservation equations (by a Newton-Raphson method)
|
|
C
|
|
C Input parameters:
|
|
C T - temperature
|
|
C AN - total particle number density
|
|
C
|
|
C Output:
|
|
C ANE - electron density
|
|
C ANP - proton number density
|
|
C AHTOT - total hydrogen number density
|
|
C AHMOL - relativer number of hydrogen molecules with respect to the
|
|
C total number of hydrogens
|
|
C ENERG - part of the internal energy: excitation and ionization
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
DIMENSION R(3,3),S(3),P(3)
|
|
common/terden/rhoter,anta,entrp
|
|
common/eospar/anmol(600,mdepth),
|
|
* anato(100,mdepth),
|
|
* anion(100,mdepth)
|
|
c
|
|
if(ioptab.lt.-1) return
|
|
C
|
|
if(anerel.le.0.) then
|
|
anerel=0.5
|
|
if(t.lt.9000.) anerel=0.4
|
|
if(t.lt.8000.) anerel=0.1
|
|
if(t.lt.7000.) anerel=0.01
|
|
if(t.lt.6000.) anerel=0.001
|
|
if(t.lt.5500.) anerel=0.0001
|
|
if(t.lt.5000.) anerel=1.e-5
|
|
if(t.lt.4000.) anerel=1.e-6
|
|
end if
|
|
c
|
|
if(ifmol.gt.0.and.t.lt.tmolim) then
|
|
aein=an*anerel
|
|
call moleq(id,t,an,aein,ane,enrg,entt,wm,ipri)
|
|
anerel=ane/an
|
|
return
|
|
end if
|
|
c
|
|
QMI=0.
|
|
Q2=0.
|
|
QP=0.
|
|
Q=0.
|
|
DQN=0.
|
|
TK=BOLK*T
|
|
THET=5.0404D3/T
|
|
anta=an
|
|
C
|
|
C Coefficients entering ionization (dissociation) balance of:
|
|
C atomic hydrogen - QH;
|
|
C negative hydrogen ion - QM (considered only if IHM>0);
|
|
C hydrogen molecule - QP (considered only if IH2>0);
|
|
C ion of hydrogen molecule - Q2 (considered only if IH2P>0).
|
|
C
|
|
IF(T.LE.9000.) THEN
|
|
QMI=1.0353D-16/T/SQRT(T)*EXP(8762.9/T)
|
|
QP=TK*EXP((-11.206998+THET*(2.7942767+THET*
|
|
* (0.079196803-0.024790744*THET)))*2.30258509299405)
|
|
call mpartf(1,1,0,t,uh,duh)
|
|
uh=max(uh,two)
|
|
call mpartf(0,0,2,t,uh2,duh2)
|
|
q2=1.47e-20/(t*sqrt(t))*uh2/uh/uh*exp(51951.8/t)
|
|
END IF
|
|
tkln15=log(bolk*t)*1.5
|
|
QH0=EXP((15.38287+1.5*LOG10(T)-13.595*THET)*2.30258509299405)*two
|
|
C
|
|
ANE=AN*ANEREL
|
|
IT=0
|
|
C
|
|
C Basic Newton-Raphson loop - solution of the non-linear set
|
|
C for the unknown vector P, consistiong of AH, ANH (neutral
|
|
C hydrogen number density) and ANE.
|
|
C
|
|
10 IT=IT+1
|
|
C
|
|
C procedure STATE determines Q (and DQN) - the total charge (and its
|
|
C derivative wrt temperature) due to ionization of all atoms which
|
|
C are considered (both explicit and non-explicit), by solving the set
|
|
C of Saha equations for the current values of T and ANE
|
|
C
|
|
CALL STATE(1,ID,T,ANE)
|
|
C
|
|
C Auxiliary parameters for evaluating the elements of matrix of
|
|
C linearized equations.
|
|
C Note that complexity of the matrix depends on whether the hydrogen
|
|
C molecule is taken into account
|
|
C Treatment of hydrogen ionization-dissociation is based on
|
|
C Mihalas, in Methods in Comput. Phys. 7, p.10 (1967)
|
|
C
|
|
IF(IATREF.EQ.IATH.or.ioptab.ge.-1) THEN
|
|
qh=qh0/pfhyd
|
|
G2=QH/ANE
|
|
G3=0.
|
|
G4=0.
|
|
G5=0.
|
|
D=0.
|
|
E=0.
|
|
G3=QMI*ANE
|
|
A=UN+G2+G3
|
|
D=G2-G3
|
|
IF(IT.GT.1) GO TO 60
|
|
IF(T.GT.9000.) THEN
|
|
F1=UN/A
|
|
FE=D/A+Q
|
|
AH=ANE/FE
|
|
ANH=AH*F1
|
|
else if(t.gt.4000.) then
|
|
E=G2*QP/Q2
|
|
B=TWO*(UN+E)
|
|
GG=ANE*Q2
|
|
C1=B*(GG*B+A*D)-E*A*A
|
|
C2=A*(TWO*E+B*Q)-D*B
|
|
C3=-E-B*Q
|
|
F1=(SQRT(C2*C2-4.*C1*C3)-C2)*HALF/C1
|
|
FE=F1*D+E*(UN-A*F1)/B+Q
|
|
AH=ANE/FE
|
|
ANH=AH*F1
|
|
else
|
|
c1=q2*(two*ytot(id)-un)
|
|
c2=ytot(id)
|
|
c3=-an
|
|
anh=(sqrt(c2*c2-4.*c1*c3)-c2)*half/c1
|
|
ah=anh*(un+two*anh*q2)
|
|
c1=un+qmi*anh
|
|
c2=-q*ah
|
|
c3=-qh*anh
|
|
ane=(sqrt(c2*c2-4.*c1*c3)-c2)*half/c1
|
|
end if
|
|
60 AE=ANH/ANE
|
|
GG=AE*QP
|
|
E=ANH*Q2
|
|
B=ANH*QMI
|
|
C
|
|
C Matrix of the linearized system R, and the rhs vector S
|
|
C
|
|
if(ifmol.eq.0.or.t.ge.tmolim) then
|
|
R(1,1)=YTOT(ID)
|
|
R(1,2)=0.
|
|
R(1,3)=UN
|
|
S(1)=AN-ANE-YTOT(ID)*AH
|
|
else
|
|
R(1,1)=YTOT(ID)-UN
|
|
R(1,2)=A+E+GG
|
|
R(1,3)=UN
|
|
S(1)=AN-ANE-ANH*(A+E+GG)-(YTOT(ID)-UN)*AH
|
|
end if
|
|
c
|
|
R(2,1)=-Q
|
|
R(2,2)=-D-TWO*GG
|
|
R(2,3)=UN+B+AE*(G2+GG)-DQN*AH
|
|
R(3,1)=-UN
|
|
R(3,2)=A+4.*(E+GG)
|
|
R(3,3)=B-AE*(G2+TWO*GG)
|
|
S(2)=ANH*(D+GG)+Q*AH-ANE
|
|
S(3)=AH-ANH*(A+TWO*(E+GG))
|
|
C
|
|
C Solution of the linearized equations for the correction vector P
|
|
C
|
|
CALL LINEQS(R,S,P,3,3)
|
|
C
|
|
C New values of AH, ANH, and ANE
|
|
C
|
|
AH=AH+P(1)
|
|
ANH=ANH+P(2)
|
|
DELNE=P(3)
|
|
ANE=ANE+DELNE
|
|
C
|
|
C hydrogen is not the reference atom
|
|
C
|
|
ELSE
|
|
C
|
|
C Matrix of the linearized system R, and the rhs vector S
|
|
C
|
|
IF(IT.EQ.1) THEN
|
|
ANE=AN*HALF
|
|
AH=ANE/YTOT(ID)
|
|
END IF
|
|
R(1,1)=YTOT(ID)
|
|
R(1,2)=UN
|
|
R(2,1)=-Q-QREF
|
|
R(2,2)=UN-(DQN+DQNR)*AH
|
|
S(1)=AN-ANE-YTOT(ID)*AH
|
|
S(2)=(Q+QREF)*AH-ANE
|
|
C
|
|
C Solution of the linearized equations for the correction vector P
|
|
C
|
|
CALL LINEQS(R,S,P,2,3)
|
|
AH=AH+P(1)
|
|
DELNE=P(2)
|
|
ANE=ANE+DELNE
|
|
END IF
|
|
C
|
|
C Convergence criterion
|
|
C
|
|
IF(ANE.LE.0.) ANE=1.D-6*AN
|
|
IF(ABS(DELNE/ANE).GT.1.D-3.AND.IT.LE.10) GO TO 10
|
|
C
|
|
C ANEREL is the exact ratio betwen electron density and total
|
|
C particle density, which is going to be used in the subseguent
|
|
C call of ELDENS
|
|
C
|
|
ANEREL=ANE/AN
|
|
AHTOT=AH
|
|
AHMOL=ANH*ANH*Q2
|
|
ANP=ANH/ANE*QH
|
|
ANHM=ANH*ANE*QMI
|
|
RHOTER=WMY(ID)*AH*HMASS
|
|
if(ipri.gt.0) then
|
|
dens(id)=rhoter
|
|
elec(id)=ane
|
|
wmm(id)=dens(id)/(an-ane)
|
|
end if
|
|
C
|
|
c internal energy and entropy
|
|
c
|
|
call entene(t,ah,anh,anp,ane,energ,entrop)
|
|
ener=energ
|
|
entr=entrop
|
|
c if(id.eq.1) write(6,602) id,t,an,ener,entr
|
|
c
|
|
c energy and entropy of H_2
|
|
c
|
|
if(t.lt.9000..and.ahmol.gt.0..and.uh2.gt.0.) then
|
|
ener=ener+(duh2-51951.8/t)*tk*ahmol
|
|
entr=entr+ahmol*(tkln15-log(ahmol)+log(uh2)+1.0487+
|
|
* 103.973)*bolk
|
|
end if
|
|
C
|
|
enrg=ener
|
|
entt=entr
|
|
wm=rhoter/an/hmass
|
|
c
|
|
if(ifmol.le.0.or.t.ge.tmolim) then
|
|
if(n0hn.gt.0) then
|
|
anato(1,id)=popul(n0hn,id)
|
|
else
|
|
anato(1,id)=dens(id)/wmm(id)/ytot(id)
|
|
end if
|
|
if(iathe.gt.0) then
|
|
anato(2,id)=popul(n0a(iathe),id)
|
|
else
|
|
anato(2,id)=dens(id)/wmm(id)/ytot(id)*abndd(2,id)
|
|
end if
|
|
end if
|
|
c
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
subroutine entene(t,ah,anh,anpr,ane,energ,entrop)
|
|
c =================================================
|
|
c
|
|
c internal energy and entropy of atoms and ions
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
parameter (ev2erg=1.6018d-12,
|
|
* entcon=103.973)
|
|
c
|
|
tk=bolk*t
|
|
tkk=tk*t
|
|
tkln15=1.5*log(tk)
|
|
natoms=30
|
|
energ=0.
|
|
entrop=0.
|
|
c
|
|
c hydrogen
|
|
c
|
|
call mpartf(1,1,0,t,u,dulog)
|
|
if(u.lt.2.) u=2.
|
|
if(dulog.lt.0.) dulog=0.
|
|
alm=1.5*log(amas(1))
|
|
energ=tk*dulog*anh
|
|
entrop=(tkln15-log(anh)+log(u)+alm+tkk*dulog+entcon)*anh
|
|
energ=energ+enev(1,1)*ev2erg*anpr
|
|
entrop=entrop+(tkln15-log(anpr)+alm+entcon)*anpr
|
|
c
|
|
c other species
|
|
c
|
|
xmax=2.154e4*sqrt(sqrt(t/ane))
|
|
do i=2,natoms
|
|
chip=0
|
|
do j=1,2
|
|
if(rr(i,j).gt.1.e-15) then
|
|
aden=rr(i,j)*ah
|
|
if(aden.lt.1.e-20) aden=1.e-20
|
|
call mpartf(i,j,0,t,u,dulog)
|
|
if(u.lt.un) u=un
|
|
if(dulog.lt.0.) dulog=0.
|
|
energ=energ+(chip*ev2erg+tk*dulog)*aden
|
|
entrop=entrop+(tkln15-log(aden)+log(u)+
|
|
* 1.5*log(amas(i))+tkk*dulog+entcon)*aden
|
|
end if
|
|
chip=chip+enev(i,j)
|
|
end do
|
|
end do
|
|
c
|
|
c entropy of electrons
|
|
c
|
|
c entel=tkln15-log(ane)+1.5*log(emass(99))+entcon
|
|
entel=tkln15-log(ane)-11.2622+entcon
|
|
entrop=entrop+entel*ane
|
|
entrop=entrop*bolk
|
|
C
|
|
return
|
|
end
|
|
|
|
C
|
|
C
|
|
C ***********************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE MEANOP(T,ABSO,SCAT,OPROS,OPPLA)
|
|
C ==========================================
|
|
C
|
|
C Rosseland and Planck mean opacities
|
|
C
|
|
C Input parameters:
|
|
C T - temperature
|
|
C ABSO - array of absorption coefficients in all explicit
|
|
C frequency points
|
|
C SCAT - array of scttering coefficients
|
|
C Output:
|
|
C OPROS - Rosseland opacity (per 1 cm**3)
|
|
C OPPLA - Planck mean opacity (per 1 cm**3)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
DIMENSION ABSO(MFREQ),SCAT(MFREQ)
|
|
C
|
|
ABR=0.
|
|
SUMDB=0.
|
|
ABP=0.
|
|
SUMB=0.
|
|
HKT=HK/T
|
|
C
|
|
DO IJ=1,NFREQC
|
|
FR=FREQ(IJ)
|
|
X=HKT*FR
|
|
IF(X.GT.150.) X=150.
|
|
EX=EXP(X)
|
|
E1=UN/(EX-UN)
|
|
PLAN=BNUE(IJ)*E1*W(IJ)
|
|
DPLAN=PLAN*HKT*FR*EX*E1
|
|
ABR=ABR+DPLAN/ABSO(IJ)
|
|
ABP=ABP+PLAN*(ABSO(IJ)-SCAT(IJ))
|
|
SUMDB=SUMDB+DPLAN
|
|
SUMB=SUMB+PLAN
|
|
END DO
|
|
OPROS=SUMDB/ABR
|
|
OPPLA=ABP/SUMB
|
|
RETURN
|
|
END
|
|
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE MEANOPT(T,ID,RHO,OPROS,OPPLA)
|
|
C ========================================
|
|
C
|
|
C Rosseland and Planck mean opacities
|
|
C
|
|
C Input parameters:
|
|
C T - temperature
|
|
C RHO - density
|
|
C Output:
|
|
C OPROS - Rosseland opacity (per gram)
|
|
C OPPLA - Planck mean opacity (per gram)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
C
|
|
ABR=0.
|
|
SUMDB=0.
|
|
ABP=0.
|
|
SUMB=0.
|
|
HKT=HK/T
|
|
C
|
|
DO IJ=1,NFREQ
|
|
FR=FREQ(IJ)
|
|
EX=EXP(HKT*FR)
|
|
E1=UN/(EX-UN)
|
|
PLAN=BNUE(IJ)*E1*W(IJ)
|
|
DPLAN=PLAN*HKT*FR*EX*E1
|
|
CALL OPCTAB(FR,IJ,ID,T,RHO,AB,SC,SCT,1)
|
|
ABR=ABR+DPLAN/(AB+SCT)
|
|
ABP=ABP+PLAN*AB
|
|
SUMDB=SUMDB+DPLAN
|
|
SUMB=SUMB+PLAN
|
|
END DO
|
|
OPROS=SUMDB/ABR
|
|
OPPLA=ABP/SUMB
|
|
RETURN
|
|
END
|
|
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE CONVEC(ID,T,PTOT,PG,PRAD,ABROS,DELTA,FLXCNV,VCONV)
|
|
C =============================================================
|
|
C
|
|
C Determination of the mixing-lengths convective flux
|
|
C
|
|
C Input: T - temperature
|
|
C PTOT - total pressure
|
|
C PG - gas pressure
|
|
C PRAD - radiation pressure
|
|
C ABROS - Rosseland opacity (per gram)
|
|
C DELTA - corresponding temperature gradient
|
|
C Output: FLXCNV - convective flux (expressed as H, ie F/4/pi)
|
|
C VCONV - convective velocity
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
COMMON/CUBCON/A,B,DDEL,GRDADB,DLT,RHO,FLXTOT,GRAVD
|
|
C
|
|
VCONV=0.
|
|
FLXCNV=0.
|
|
DLT=0.
|
|
GRDADB=0.
|
|
IF(HMIX0.LT.0.) RETURN
|
|
C
|
|
C Thermodynamic derivatives
|
|
C
|
|
if(ioptab.ge.-1) then
|
|
CALL TRMDER(ID,T,PG,PRAD,TAURS(ID),HEATCP,DLRDLT,GRDADB,RHO)
|
|
else
|
|
call trmdrt(id,t,ptot,heatcp,dlrdlt,grdadb,rho)
|
|
end if
|
|
DDEL=DELTA-GRDADB
|
|
C
|
|
C Convective instability criterion
|
|
C
|
|
IF(DDEL.LT.0.) RETURN
|
|
if(idisk.eq.0) then
|
|
HSCALE=PTOT/RHO/GRAV
|
|
else
|
|
if(gravd.eq.0.) return
|
|
hscale=ptot/rho/gravd
|
|
end if
|
|
HMIX=HMIX0
|
|
if(hmix0.eq.0.) hmix=1.
|
|
VCO=HMIX*SQRT(ABS(aconml*PTOT/RHO*DLRDLT))
|
|
FLCO=bconml*RHO*HEATCP*T*HMIX/12.5664
|
|
TAUE=HMIX*ABROS*RHO*HSCALE
|
|
FAC=TAUE/(UN+HALF *TAUE*TAUE)
|
|
C
|
|
C Set up parameters A and B (see Mihalas, Eq. 7-76, 7-79, etc)
|
|
C
|
|
B=5.67d-5*T**3/(rho*heatcp*VCO)*FAC*cconml*half
|
|
IF(FLXTOT.GT.0.) A=FLCO*VCO/FLXTOT*DELTA
|
|
C
|
|
C Determination of Delta - Delta(E)
|
|
C
|
|
D=B*B/2.D0
|
|
DLT=D+DDEL-B*SQRT(D/2.D0+DDEL)
|
|
IF(DLT.LT.0.) DLT=0.
|
|
C
|
|
C Resulting convective velocity VCONV and flux FLXCNV
|
|
C
|
|
VCONV=VCO*SQRT(DLT)
|
|
FLXCNV=FLCO*VCONV*DLT
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE CONVC1(ID,T,PTOT,PG,PRAD,ABROS,DELTA,FLXCNV,FC0)
|
|
C ===========================================================
|
|
C
|
|
C Determination of the mixing-lengths convective flux
|
|
C
|
|
C Input: T - temperature
|
|
C PTOT - total pressure
|
|
C PG - gas pressure
|
|
C PRAD - radiation pressure
|
|
C ABROS - Rosseland opacity (per gram)
|
|
C DELTA - corresponding temperature gradient
|
|
C Output: FLXCNV - convective flux (expressed as H, ie F/4/pi)
|
|
C VCONV - convective velocity
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
COMMON/CUBCON/A,B,DDEL,GRDADB,DLT,RHO,FLXTOT,GRAVD
|
|
C
|
|
VCONV=0.
|
|
FLXCNV=0.
|
|
DLT=0.
|
|
IF(HMIX0.LT.0.) RETURN
|
|
C
|
|
C Thermodynamic derivatives
|
|
C
|
|
if(ioptab.ge.-1) then
|
|
CALL TRMDER(ID,T,PG,PRAD,TAURS(ID),HEATCP,DLRDLT,GRDADB,RHO)
|
|
else
|
|
call trmdrt(id,t,ptot,heatcp,dlrdlt,grdadb,rho)
|
|
end if
|
|
DDEL=DELTA-GRDADB
|
|
C
|
|
C Convective instability criterion
|
|
C
|
|
if(idisk.eq.0) then
|
|
HSCALE=PTOT/RHO/GRAV
|
|
else
|
|
if(gravd.eq.0.) return
|
|
hscale=ptot/rho/gravd
|
|
end if
|
|
HMIX=HMIX0
|
|
if(hmix0.eq.0.) hmix=1.
|
|
VCO=HMIX*SQRT(ABS(aconml*PTOT/RHO*DLRDLT))
|
|
FLCO=bconml*RHO*HEATCP*T*HMIX/12.5664
|
|
FC0=FLCO*VCO
|
|
IF(DDEL.LT.0.) RETURN
|
|
c
|
|
TAUE=HMIX*ABROS*RHO*HSCALE
|
|
FAC=TAUE/(UN+HALF *TAUE*TAUE)
|
|
C
|
|
C Set up parameters A and B (see Mihalas, Eq. 7-76, 7-79, etc)
|
|
C
|
|
B=5.67d-5*T**3/(rho*heatcp*VCO)*FAC*cconml*half
|
|
IF(FLXTOT.GT.0.) A=FLCO*VCO/FLXTOT*DELTA
|
|
C
|
|
C Determination of Delta - Delta(E)
|
|
C
|
|
D=B*B/2.D0
|
|
DLT=D+DDEL-B*SQRT(D/2.D0+DDEL)
|
|
IF(DLT.LT.0.) DLT=0.
|
|
C
|
|
C Resulting convective velocity VCONV and flux FLXCNV
|
|
C
|
|
VCONV=VCO*SQRT(DLT)
|
|
FLXCNV=FLCO*VCONV*DLT
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE TRMDER(ID,T,PG,PRAD,TAU,HEATCP,DLRDLT,GRDADB,RHO)
|
|
C ============================================================
|
|
C
|
|
C Thermodynamic derivatives
|
|
C Evaluation similar as in Kurucz's ATLAS
|
|
C
|
|
C Input: T - temperature
|
|
C PG - gas pressure
|
|
C PRAD - radiation pressure
|
|
C Output: DEDT - d(energy)/d(T)
|
|
C DRDT - d(rho)/d(T)
|
|
C DEDPG - d(energy)/d(PG)
|
|
C DRDPG - d(rho)/d(PG)
|
|
C RHO - density
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
common/derdif/dift,difp
|
|
common/terden/rhoter,anta,entrp
|
|
common/adiaba/grdad0,itgrad
|
|
DIMENSION TT(5),PP(5),RHON(5),ENER(5),entr(5)
|
|
C
|
|
C NUMERICAL EVALUATION OF THERMODYNAMIC DERIVATIVES
|
|
C
|
|
c prad=0.
|
|
P=PG
|
|
TT(1)=T*(UN+DIFT)
|
|
TT(2)=T*(UN-DIFT)
|
|
TT(3)=T
|
|
TT(4)=T
|
|
TT(5)=T
|
|
PP(1)=P
|
|
PP(2)=P
|
|
PP(3)=P*(UN+DIFP)
|
|
PP(4)=P*(UN-DIFT)
|
|
PP(5)=P
|
|
tmoli0=tmolim
|
|
if(t.lt.tmolim) tmolim=t*(un+dift+0.001)
|
|
if(t.ge.tmolim) tmolim=t*(in-dift-0.001)
|
|
DO I=1,5
|
|
TE=TT(I)
|
|
TKN=TE*1.38054D-16
|
|
ANT=PP(I)/TKN
|
|
CALL ELDENS(ID,TE,ANT,ANE,ENRG,ENT,WM,0)
|
|
RHON(I)=rhoter
|
|
ENER(I)=(1.5D0*PP(I)+ENRG+3.D0*PRAD*(TE/T)**4)/RHON(I)
|
|
entr(i)=ent/RHON(I)
|
|
END DO
|
|
tmolim=tmoli0
|
|
entrp=entr(5)
|
|
c
|
|
DRDT=(RHON(1)-RHON(2))/(2.*T*DIFT)
|
|
DRDPG=(RHON(3)-RHON(4))/(2.*P*DIFP)
|
|
RHO=RHON(5)
|
|
DPDPG=1.
|
|
dpdt=0.
|
|
if(tau.lt.50.) DPDT=4.*PRAD/T*(un-exp(-tau))
|
|
DLRDLT=T/RHO*(DRDT-DRDPG*DPDT/DPDPG)
|
|
ptot=pg+prad
|
|
c
|
|
if(ifentr.le.0) then
|
|
DEDT= (ENER(1)-ENER(2))/(2.*T*DIFT)
|
|
DEDPG=(ENER(3)-ENER(4))/(2.*P*DIFP)
|
|
HEATCV=DEDT-DEDPG*DRDT/DRDPG
|
|
HEATCP=DEDT-DEDPG*DPDT/DPDPG-
|
|
* PTOT/RHO/RHO*(DRDT-DRDPG*DPDT/DPDPG)
|
|
GRDADB=-PTOT/RHO/T*DLRDLT/HEATCP
|
|
else
|
|
DSDT= (ENTR(1)-ENTR(2))/(2.*T*DIFT)
|
|
DSDP= (ENTR(3)-ENTR(4))/(2.*P*DIFP)
|
|
grdadb=-dsdp/dsdt*pg/t
|
|
c heatcp=-PTOT/RHO/T*DLRDLT/grdadb
|
|
heatcp=t*dsdt
|
|
end if
|
|
c
|
|
if(iter.le.itgrad.and.grdad0.gt.0)
|
|
* grdadb=grdad0*0.4+(un-grdad0)*grdadb
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ***************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE CUBIC(DELTA)
|
|
C =======================
|
|
C
|
|
C Solution of the cubic equation for determination of
|
|
C the true gradient DELTA
|
|
C
|
|
C Input: A,B - coefficients; transmitted by COMMON/CUBCON
|
|
C DEL - DELTA(RAD) - DELTA(ADIAB); also transm. by CUBCON
|
|
C Output: DELTA - true gradient
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
COMMON/CUBCON/A,B,DEL,GRDADB,DELMDE,RHO,FLXTOT,GRAVD
|
|
PARAMETER (THIRD = 0.333333333333333D0)
|
|
data ipri /0/
|
|
C
|
|
C first solve the cubic equation
|
|
C A*X**3 + X**2 + B*X = DEL
|
|
C where X = (DELTA - DELTA(ELEM))**(1/2)
|
|
C
|
|
AA=THIRD/A
|
|
BB=B/A
|
|
CC=-DEL/A
|
|
P=BB*THIRD-AA*AA
|
|
Q=AA**3-(BB*AA-CC)/2.D0
|
|
D=Q*Q+P*P*P
|
|
IF(D.GT.0.) THEN
|
|
D=SQRT(D)
|
|
if(d-abs(q).lt.1.e-14*d) then
|
|
SOL=(2.D0*D)**THIRD-AA
|
|
ELSE
|
|
D1=ABS(D-Q)
|
|
D2=ABS(D+Q)
|
|
SOL=D1/(D-Q)*D1**THIRD-D2/(D+Q)*D2**THIRD-AA
|
|
END IF
|
|
ELSE
|
|
COSF=-Q/SQRT(ABS(P*P*P))
|
|
TANF=SQRT(UN-COSF*COSF)/COSF
|
|
FI=ATAN(TANF)*THIRD
|
|
SOL=2.D0*SQRT(ABS(P))*COS(FI)-AA
|
|
END IF
|
|
C
|
|
C if the previous formalism gives an unphysical solution
|
|
C x > DEL, then find the physical solution in the range (0, DEL)
|
|
C by a Newton-Raphson solution of the cubic equation
|
|
C
|
|
DELDA=SOL*(B+SOL)
|
|
IF(DELDA.GT.DEL.OR.DELDA.LT.0.) THEN
|
|
X0=sol
|
|
J=0
|
|
10 DELX=(DEL-X0*(B+X0+A*X0*X0))/(3.D0*A*X0*X0+2.D0*X0+B)
|
|
X0=X0+DELX
|
|
J=J+1
|
|
IF(ABS(DELX/X0).GT.1D-6.AND.J.LT.50) GO TO 10
|
|
SOL=X0
|
|
END IF
|
|
C
|
|
C finally, the actual gradient delta
|
|
C
|
|
DELTA=GRDADB+B*SOL+SOL*SOL
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ***************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE CONOUT(IMOD,IPRIN)
|
|
C =============================
|
|
C
|
|
C Diagnostic outprint of temperature gradients, convective flux,
|
|
C and their derivatives
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
COMMON/CUBCON/A,B,DEL,GRDADB,DELMDE,RHO,FLXTOT,GRAVD
|
|
C
|
|
IF(IPRIN.GT.0) WRITE(6,600)
|
|
ANEREL=ELEC(1)/(DENS(1)/WMM(1)+ELEC(1))
|
|
ICBEG=0
|
|
FLXTO0=SIG4P*TEFF**4
|
|
DO ID=1,ND
|
|
T=TEMP(ID)
|
|
PTOT=PTOTAL(ID)
|
|
PG=PGS(ID)
|
|
PRAD=PTOT-PG-HALF*DENS(ID)*VTURB(ID)**2
|
|
if(prad.lt.0.) prad=0.
|
|
IF(IMOD.EQ.2) THEN
|
|
if(ioptab.ge.0) then
|
|
CALL OPACF0(ID,NFREQ)
|
|
CALL MEANOP(T,ABSO,SCAT,OPROS,OPPLA)
|
|
ABROSD(ID)=OPROS/DENS(ID)
|
|
else
|
|
call meanopt(t,id,dens(id),opros,oppla)
|
|
if(hmix0.gt.0.) abrosd(id)=opros
|
|
end if
|
|
END IF
|
|
FLXTOT=flxto0
|
|
if(idisk.eq.1) then
|
|
flxtot=flxto0*(un-thetav(id))
|
|
gravd=zd(id)*qgrav
|
|
prad=pradt(id)
|
|
end if
|
|
IF(ID.EQ.1) THEN
|
|
TAU=DM(ID)*ABROSD(ID)
|
|
FLXCR=0.
|
|
GRDADB=0.
|
|
DELTA(ID)=0.
|
|
FLXC(ID)=0.
|
|
FLXCNV=0.
|
|
ELSE
|
|
TM=TEMP(ID-1)
|
|
TAU=TAUM+HALF*(DM(ID)-DM(ID-1))*(ABROSD(ID)+ABROSD(ID-1))
|
|
PTOTM=PTOTAL(ID-1)
|
|
PGM=PGS(ID-1)
|
|
PRADM=PTOTM-PGM-HALF*DENS(ID-1)*VTURB(ID-1)**2
|
|
if(idisk.eq.1) pradm=pradt(id-1)
|
|
if(pradm.lt.0.) pradm=0.
|
|
if(ilgder.eq.0) then
|
|
T0=HALF*(T+TM)
|
|
PT0=HALF*(PTOT+PTOTM)
|
|
PG0=HALF*(PG+PGM)
|
|
PR0=HALF*(PRAD+PRADM)
|
|
AB0=HALF*(ABROSD(ID)+ABROSD(ID-1))
|
|
DLT=(T-TM)/(PTOT-PTOTM)*PT0/T0
|
|
else
|
|
T0=SQRT(T*TM)
|
|
PT0=SQRT(PTOT*PTOTM)
|
|
PG0=SQRT(PG*PGM)
|
|
PR0=SQRT(PRAD*PRADM)
|
|
AB0=SQRT(ABROSD(ID)*ABROSD(ID-1))
|
|
DLT=LOG(T/TM)/LOG(PTOT/PTOTM)
|
|
end if
|
|
DELTA(ID)=DLT
|
|
flxcnv=0.
|
|
if(idisk.ne.1.or.id.lt.nd)
|
|
* CALL CONVEC(ID,T0,PT0,PG0,PR0,AB0,DLT,FLXCNV,VCON)
|
|
if(hmix0.gt.0.) FLXC(ID)=FLXCNV
|
|
IF(ICBEG.EQ.0.AND.FLXC(ID).GT.0..AND.FLXC(ID-1).EQ.0..
|
|
* AND.ID.GT.25) ICBEG=ID
|
|
if(icbeg.gt.0.and.flxc(id).gt.0.) icend=id
|
|
END IF
|
|
PRADR=PRAD/PTOT
|
|
conrel=0.
|
|
radrel=1.
|
|
if(flxtot.gt.0.) then
|
|
conrel=FLXCNV/FLXTOT
|
|
radrel=flrd(id)/flxtot
|
|
end if
|
|
IF(IPRIN.GT.0) WRITE(6,601) ID,TAU,T,DELTA(ID),
|
|
* GRDADB,conrel,radrel,conrel+radrel
|
|
|
|
TAUM=TAU
|
|
END DO
|
|
if(iprin.gt.0) write(6,603) icbeg,icend
|
|
603 format(/' convective zone between depths (inclusive) ',2i4/)
|
|
C
|
|
c if ICONV=3, then:
|
|
c in the convective zone the radiative (+ convective) equilibrium
|
|
c is taken obligatorily in the differential form, i.e.
|
|
c NDRE is modified to have the value just below the beginning of
|
|
c convection zone, and
|
|
c rediff(id) has to be set to unity, and reint(id) to 0 for id => ndre
|
|
c
|
|
IF(ICBEG.GT.3.AND.ICONV.EQ.3) THEN
|
|
NDRE=ICBEG-1
|
|
DO ID=1,ND
|
|
IF(ID.GE.NDRE) THEN
|
|
REINT(ID)=0.
|
|
REDIF(ID)=1.
|
|
else
|
|
reint(id)=1.
|
|
redif(id)=0.
|
|
END IF
|
|
END DO
|
|
WRITE(6,602) NDRE
|
|
END IF
|
|
c
|
|
IF(ICBEG.GT.3.AND.ICONV.EQ.2) THEN
|
|
NDRE=ICBEG-1
|
|
DO ID=1,ND
|
|
IF(ID.GE.NDRE) THEN
|
|
REDIF(ID)=1.
|
|
END IF
|
|
END DO
|
|
WRITE(6,602) NDRE
|
|
END IF
|
|
c
|
|
600 FORMAT(//' ID',3X,'TAUR',7X,'TEMP',6X,
|
|
* 'DELTA',2X,'DELTA(AD)',2X,'CON/TOT RAD/TOT (C+R)/TOT'//)
|
|
601 FORMAT(1H ,I4,1PD9.2,0PF9.1,1P5D10.2)
|
|
602 FORMAT(//' NDRE IS RESET IN CONOUT DUE TO THE EXISTENCE OF'
|
|
* ,' CONVECTIVE ZONE'/' NDRE= ',I3/)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ***************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION ERFCX(X)
|
|
C =================
|
|
C
|
|
C complementary error function
|
|
C expression from Abramowitz and Stegun, p.299, Eq. 7.1.26
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
PARAMETER (P = 0.3275911D0,
|
|
* A1 = 0.254829592D0,
|
|
* A2 =-0.284496736D0,
|
|
* A3 = 1.421413741D0,
|
|
* A4 =-1.453152027D0,
|
|
* A5 = 1.061405429D0,
|
|
* UN = 1.D0)
|
|
T=UN/(UN+P*X)
|
|
ERFCX=0.
|
|
IF(X.GT.13.) RETURN
|
|
ERFCX=T*(A1+T*(A2+T*(A3+T*(A4+T*A5))))*EXP(-X*X)
|
|
RETURN
|
|
END
|
|
|
|
C
|
|
C
|
|
C ******************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE MATCON(ID)
|
|
C =====================
|
|
C
|
|
C Evaluation of the terms in matrices A and B of complete
|
|
C linearization due to convection.
|
|
C Two rows are modified:
|
|
C NRE - energy balance (i.e. temperature)
|
|
C NDEL - new row corresponding to a new model parameter DELTA
|
|
C
|
|
C Model parameter DELTA is defined as dln(T)/dln(P);
|
|
C FCONV is the convective flux
|
|
C
|
|
C The equations and corresponding matrix elements are similar
|
|
C to those considered by Grenfell, Astr.Ap. 20, 293 (1972).
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
COMMON/CUBCON/ACNV,BCNV,DEL,GRDADB,DELMDE,RHO,FLXTOT,GRAVD
|
|
C
|
|
IF(HMIX0.LE.0.) RETURN
|
|
NHE=NFREQE+INHE
|
|
NRE=NFREQE+INRE
|
|
NPC=NFREQE+INPC
|
|
NDEL=NFREQE+INDL
|
|
C
|
|
C Upper boundary condition (ID=1)
|
|
C
|
|
ANEREL=ELEC(1)/(DENS(1)/WMM(1)+ELEC(1))
|
|
IF(ID.EQ.1) THEN
|
|
DELTA(ID)=0.
|
|
FLXC(ID)=0.
|
|
IF(INDL.GT.0) B(NDEL,NDEL)=UN
|
|
ELSE
|
|
C
|
|
C Normal depth point 1 < ID < ND
|
|
C
|
|
T=TEMP(ID)
|
|
P=PTOTAL(ID)
|
|
PG=PGS(ID)
|
|
PRAD=P-PG-HALF*DENS(ID)*VTURB(ID)**2
|
|
TM=TEMP(ID-1)
|
|
PM=PTOTAL(ID-1)
|
|
PGM=PGS(ID-1)
|
|
PRADM=PM-PGM-HALF*DENS(ID-1)*VTURB(ID-1)**2
|
|
if(ilgder.eq.0) then
|
|
T0=HALF*(T+TM)
|
|
P0=HALF*(P+PM)
|
|
PG0=HALF*(PG+PGM)
|
|
PR0=HALF*(PRAD+PRADM)
|
|
AB0=HALF*(ABROSD(ID)+ABROSD(ID-1))
|
|
DLT=(T-TM)/(P-PM)*P0/T0
|
|
TT=T*T-TM*TM
|
|
DDT0= DLT/HALF*TM/TT
|
|
DDTM=-DDT0*T/TM
|
|
else
|
|
T0=SQRT(T*TM)
|
|
P0=SQRT(P*PM)
|
|
PG0=SQRT(PG*PGM)
|
|
PR0=SQRT(PRAD*PRADM)
|
|
AB0=SQRT(ABROSD(ID)*ABROSD(ID-1))
|
|
DLP=UN/LOG(P/PM)
|
|
DLT=LOG(T/TM)*DLP
|
|
DDT0= DLP/T
|
|
DDTM=-DLP/TM
|
|
end if
|
|
DELTA(ID)=DLT
|
|
IF(INDL.GT.0) THEN
|
|
B(NDEL,NDEL)=-UN
|
|
VECL(NDEL)=DELTA(ID)-DLT
|
|
DDP0=0.
|
|
DDPM=0.
|
|
IF(IPRESS.GT.0) THEN
|
|
if(ilgder.eq.0) then
|
|
PP0=P*P-PM*PM
|
|
DDP0=-DLT/HALF*PM/PP0
|
|
DDPM=-DDP0*P/PM
|
|
else
|
|
PP0=LOG(T/TM)*DLP*DLP
|
|
DDP0=-PP0/P
|
|
DDPM=PP0/PM
|
|
end if
|
|
END IF
|
|
C
|
|
C the row of matrix A corresponding to DELTA
|
|
C
|
|
if(inhe.gt.0) A(NDEL,NHE)=BOLK*TM*DDPM
|
|
A(NDEL,NRE)=PGM/TM*DDPM+DDTM
|
|
C
|
|
C the row of matrix B corresponding to DELTA
|
|
C
|
|
if(inhe.gt.0) B(NDEL,NHE)=BOLK*T*DDP0
|
|
B(NDEL,NRE)=PG/T*DDP0+DDT0
|
|
END IF
|
|
C
|
|
C convective flux and its derivatives
|
|
C (derivativs wrt. T and P(gas) - calculated numerically;
|
|
C derivative wrt. DELTA calculated analytically)
|
|
C
|
|
if(idisk.eq.1) gravd=zd(id)*qgrav
|
|
CALL CONVEC(ID,T0,P0,PG0,PR0,AB0,DLT,FLXCNV,VCON)
|
|
FLXC(ID)=FLXCNV
|
|
DHCDD=0.
|
|
IF(DELMDE.GT.0.) DHCDD=1.5D0/DELMDE*FLXCNV
|
|
T1=1.001D0*T0
|
|
CALL CONVEC(ID,T1,P0,PG0,PR0,AB0,DLT,FLXC1,VCON)
|
|
DHCDT0=(FLXC1-FLXCNV)*1.D3*HALF
|
|
DHCDT =DHCDT0/T
|
|
DHCDTM=DHCDT0/TM
|
|
DHCDP=0.
|
|
IF(IPRESS.GT.0) THEN
|
|
PG1=1.001*PG0
|
|
CALL CONVEC(ID,T0,P0,PG1,PR0,AB0,DLT,FLXC2,VCON)
|
|
DHCDP=(FLXC2-FLXCNV)*1.D3/PG0*HALF
|
|
IF(IPRESS.GT.1) THEN
|
|
P1=1.001*P0
|
|
CALL CONVEC(ID,T0,P1,PG0,PR0,AB0,DLT,FLXC3,VCON)
|
|
DHCDPT=(FLXC3-FLXCNV)*1.D3/P0*HALF
|
|
DHCDP=DHCDP+DHCDPT
|
|
DHCDT=DHCDT+DHCDPT*4.*PR0/T0
|
|
END IF
|
|
END IF
|
|
IF(INDL.EQ.0) THEN
|
|
DHCDT=DHCDT+DHCDD*DDT0
|
|
DHCDTM=DHCDTM+DHCDD*DDTM
|
|
END IF
|
|
C
|
|
C additional terms in matrices A and B (the row corresponding to
|
|
C energy balance, i.e. T) due to convection
|
|
C
|
|
C
|
|
C ** 1. differential equation form
|
|
C
|
|
if(redif(id).gt.0) then
|
|
IF(ICONV.GT.0) THEN
|
|
IF(INHE.GT.0) A(NRE,NHE)=A(NRE,NHE)-DHCDP*BOLK*TM*redif(id)
|
|
A(NRE,NRE)=A(NRE,NRE)-(DHCDP*PGM/TM+DHCDTM)*redif(id)
|
|
IF(INHE.GT.0) B(NRE,NHE)=B(NRE,NHE)+DHCDP*BOLK*T*redif(id)
|
|
B(NRE,NRE)=B(NRE,NRE)+(DHCDP*PG/T+DHCDT)*redif(id)
|
|
IF(INDL.GT.0) B(NRE,NDEL)=B(NRE,NDEL)+DHCDD*redif(id)
|
|
END IF
|
|
VECL(NRE)=VECL(NRE)-FLXC(ID)*redif(id)
|
|
end if
|
|
C
|
|
C ** 2. integral equation form
|
|
C
|
|
if(reint(id).gt.0.AND.ICONV.LE.2) then
|
|
TP=TEMP(ID+1)
|
|
PTP=PTOTAL(ID+1)
|
|
PGP=PGS(ID+1)
|
|
PRADP=PTP-PGP-HALF*DENS(ID+1)*VTURB(ID+1)**2
|
|
if(ilgder.eq.0) then
|
|
T0=HALF*(T+TP)
|
|
P0=HALF*(P+PTP)
|
|
PG0=HALF*(PG+PGP)
|
|
PR0=HALF*(PRAD+PRADP)
|
|
AB0=HALF*(ABROSD(ID)+ABROSD(ID+1))
|
|
DLT=(TP-T)/(PTP-P)*P0/T0
|
|
else
|
|
T0=SQRT(T*TP)
|
|
P0=SQRT(P*PTP)
|
|
PG0=SQRT(PG*PGP)
|
|
PR0=SQRT(PRAD*PRADP)
|
|
AB0=SQRT(ABROSD(ID)*ABROSD(ID+1))
|
|
DLP=UN/LOG(PTP/P)
|
|
DLT=LOG(TP/T)*DLP
|
|
DDTP0= DLP/TP
|
|
DDTPM=-DLP/T
|
|
end if
|
|
CALL CONVEC(ID,T0,P0,PG0,PR0,AB0,DLT,FLXCNV,VCON)
|
|
DHCDDP=0.
|
|
IF(DELMDE.GT.0.) DHCDDP=1.5D0/DELMDE*FLXCNV
|
|
T1=1.001D0*T0
|
|
CALL CONVEC(ID,T1,P0,PG0,PR0,AB0,DLT,FLXC1,VCON)
|
|
DHCDT0=(FLXC1-FLXCNV)*1.D3*HALF
|
|
DHCDTP=DHCDT0/TP
|
|
DHCDTU=DHCDT0/T
|
|
DHCDPP=0.
|
|
IF(IPRESS.GT.0) THEN
|
|
PG1=1.001*PG0
|
|
CALL CONVEC(ID,T0,P0,PG1,PR0,AB0,DLT,FLXC2,VCON)
|
|
DHCDPP=(FLXC2-FLXCNV)*1.D3/PG0*HALF
|
|
IF(IPRESS.GT.1) THEN
|
|
P1=1.001*P0
|
|
CALL CONVEC(ID,T0,P1,PG0,PR0,AB0,DLT,FLXC3,VCON)
|
|
DHCDPT=(FLXC3-FLXCNV)*1.D3/P0*HALF
|
|
DHCDPP=DHCDPP+DHCDPT
|
|
DHCDTP=DHCDTP+DHCDPT*4.*PR0/T0
|
|
END IF
|
|
END IF
|
|
IF(INDL.EQ.0) THEN
|
|
DHCDTP=DHCDTP+DHCDDP*DDTP0
|
|
DHCDTU=DHCDTU+DHCDDP*DDTPM
|
|
END IF
|
|
C
|
|
C additional terms in matrices A and B (the row corresponding to
|
|
C energy balance, i.e. T) due to convection
|
|
C
|
|
DELM=(DM(ID+1)-DM(ID-1))*HALF
|
|
RDELM=DENS(ID)/DELM
|
|
DELHC=WMM(ID)/DELM*(FLXCNV-FLXC(ID))
|
|
IF(ICONV.GT.0) THEN
|
|
IF(INHE.GT.0) THEN
|
|
A(NRE,NHE)=A(NRE,NHE)-RDELM*DHCDP*BOLK*TM*reint(id)
|
|
B(NRE,NHE)=B(NRE,NHE)+
|
|
* (DELHC+RDELM*(DHCDP-DHCDPP)*BOLK*T)*reint(id)
|
|
C(NRE,NHE)=C(NRE,NHE)+RDELM*DHCDPP*BOLK*TP*reint(id)
|
|
END IF
|
|
A(NRE,NRE)=A(NRE,NRE)-RDELM*(DHCDP*PGM/TM+DHCDTM)*reint(id)
|
|
B(NRE,NRE)=B(NRE,NRE)+
|
|
* RDELM*((DHCDPP-DHCDP)*PG/T+DHCDTP-DHCDTU)*reint(id)
|
|
C(NRE,NRE)=C(NRE,NRE)+RDELM*(DHCDPP*PGP/TP+DHCDTP)*reint(id)
|
|
IF(INPC.GT.0) B(NRE,NPC)=B(NRE,NPC)-DELHC*reint(id)
|
|
IF(INDL.GT.0) THEN
|
|
B(NRE,NDEL)=B(NRE,NDEL)-RDELM*DHCDD*reint(id)
|
|
C(NRE,NDEL)=C(NRE,NDEL)+RDELM*DHCDDP*reint(id)
|
|
END IF
|
|
END IF
|
|
VECL(NRE)=VECL(NRE)-RDELM*(FLXCNV-FLXC(ID))*reint(id)
|
|
end if
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ******************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE TEMCOR
|
|
C =================
|
|
C
|
|
C Auxiliary procedure for INILAM.
|
|
C Tests wheather the convective flux corresponding to newly
|
|
C determined temperature and logarithmic gradient DELTA
|
|
C is larger than the total flux. If so, the temperature is modified
|
|
C by an iterative procedure for determining new temperature
|
|
C that yields convective flux less than SIG4P*TEFF**4
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
COMMON/CUBCON/ACNV,BCNV,DEL,GRDADB,DELMDE,RHO,FLXTOT,GRAVD
|
|
C
|
|
IF(ICONV.LE.0.AND.INDL.EQ.0) RETURN
|
|
FLXTO0=SIG4P*TEFF**4
|
|
ANEREL=ELEC(1)/(DENS(1)/WMM(1)+ELEC(1))
|
|
DLTND=DELTA(ND)
|
|
IFNDM1=0
|
|
C
|
|
DO 100 ID=2,ND
|
|
flxtot=flxto0
|
|
if(idisk.eq.1) then
|
|
flxtot=flxto0*(un-thetav(id))
|
|
gradv=zd(id)*qgrav
|
|
end if
|
|
T=TEMP(ID)
|
|
P=PTOTAL(ID)
|
|
PG=PGS(ID)
|
|
PRAD=P-PG-HALF*DENS(ID)*VTURB(ID)**2
|
|
TM=TEMP(ID-1)
|
|
PM=PTOTAL(ID-1)
|
|
PGM=PGS(ID-1)
|
|
PRADM=PM-PGM-HALF*DENS(ID-1)*VTURB(ID-1)**2
|
|
IF(ID.EQ.ND.AND.IFNDM1.EQ.1) THEN
|
|
FAC=DLTND*(P-PM)/(P+PM)
|
|
T=TM*(UN+FAC)/(UN-FAC)
|
|
END IF
|
|
KKK=0
|
|
10 KKK=KKK+1
|
|
T0=HALF*(T+TM)
|
|
P0=HALF*(P+PM)
|
|
PG0=HALF*(PG+PGM)
|
|
PR0=HALF*(PRAD+PRADM)
|
|
AB0=HALF*(ABROSD(ID)+ABROSD(ID-1))
|
|
DLT=(T-TM)/(P-PM)*P0/T0
|
|
DELTA(ID)=DLT
|
|
C
|
|
C convective flux and its derivatives
|
|
C
|
|
CALL CONVEC(ID,T0,P0,PG0,PR0,AB0,DLT,FLXCNV,VCON)
|
|
FLXC(ID)=FLXCNV
|
|
IF(FLXCNV.LT.0.999999*FLXTOT) GO TO 100
|
|
C
|
|
C in case that convective flux it too large:
|
|
C iterative procedure for determining new temperature such
|
|
C that yields convective flux less than SIG4P*TEFF**4
|
|
C
|
|
C Basically by the Newton-Raphson method;
|
|
C derivative of the convective flux wrt. T calculated
|
|
C numerically; derivative wrt. DELTA calculated analytically
|
|
C
|
|
DHCDD=0.
|
|
IF(DELMDE.GT.0.) DHCDD=1.5D0/DELMDE*FLXCNV
|
|
T1=1.001D0*T0
|
|
CALL CONVEC(ID,T1,P0,PG0,PR0,AB0,DLT,FLXC1,VCON)
|
|
DHCDT=(FLXC1-FLXCNV)*1.D3/T0*HALF
|
|
TT=T*T-TM*TM
|
|
DDT0= DLT/HALF*TM/TT
|
|
DFLCDT=DHCDT+DHCDD*DDT0
|
|
DELTEM=(FLXTOT-FLXCNV)/DFLCDT
|
|
T1=T+DELTEM
|
|
IF(T1.LT.TM+HALF*(T-TM)) T1=TM+HALF*(T-TM)
|
|
T=T1
|
|
write(94,601) iter,id,kkk,delta(id),temp(id),t,deltem,flxcnv
|
|
601 format(3i4,f10.4,2f12.3,f12.5,1pe15.6)
|
|
TEMP(ID)=T
|
|
IF(ID.EQ.ND-1) IFNDM1=1
|
|
IF(KKK.LE.10.and.abs(deltem/t).gt.1.e-5) GO TO 10
|
|
C
|
|
C Determination of electron density from the total pressure
|
|
C
|
|
AN=PG/T/BOLK
|
|
CALL ELDENS(ID,T,AN,ANE,ENRG,ENTT,WM,1)
|
|
RHO=WMM(ID)*(AN-ANE)
|
|
DENS(ID)=RHO
|
|
ELEC(ID)=ANE
|
|
CALL WNSTOR(ID)
|
|
CALL STEQEQ(ID,POP,1)
|
|
CALL OPACF0(ID,NFREQ)
|
|
CALL MEANOP(T,ABSO,SCAT,OPROS,OPPLA)
|
|
ABROS=OPROS/DENS(ID)
|
|
ABROSD(ID)=ABROS
|
|
100 CONTINUE
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ******************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE CONCOR
|
|
C =================
|
|
C
|
|
C Auxiliary procedure called from INILAM
|
|
C Initialization of the model parameter DELTA immediately
|
|
C after a completed iteration of complete linearization
|
|
C
|
|
C DELTA is defined as d(lnT)/dln(P)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
C
|
|
IF(INDL.EQ.0) RETURN
|
|
NDEL=NFREQE+INDL
|
|
C
|
|
if(idisk.eq.0) then
|
|
PRAD0=PRADT(1)-PRD0
|
|
DO ID=1,ND
|
|
PTOTAL(ID)=DM(ID)*GRAV+PRAD0
|
|
END DO
|
|
end if
|
|
C
|
|
DO ID=2,ND
|
|
P=PTOTAL(ID)
|
|
PM=PTOTAL(ID-1)
|
|
DEL1=DELTA(ID)
|
|
TM=TEMP(ID-1)
|
|
T1=TEMP(ID)
|
|
FAC=DEL1*(P-PM)/(P+PM)
|
|
T2=TM*(UN+FAC)/(UN-FAC)
|
|
DEL2=(T1-TM)/(P-PM)/(T1+TM)*(P+PM)
|
|
IF(ITEMP.EQ.1.AND.ID.GE.ICBEG-1) TEMP(ID)=T2
|
|
IF(ITEMP.EQ.2) TEMP(ID)=T2
|
|
END DO
|
|
C
|
|
C check whether the corresponding convective flux is less
|
|
C than total flux; if not, recalculate tempertaure
|
|
C
|
|
if(itmcor.ne.0) then
|
|
CALL TEMCOR
|
|
write(6,603)
|
|
call conout(1,ipconf)
|
|
end if
|
|
c
|
|
603 format(' recalculation of convective flux in CONCOR'/)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ******************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE CONREF
|
|
C =================
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
COMMON/CUBCON/ACNV,BCNV,DEL,GRDADB,DELMDE,RHO,FLXTOT,GRAVD
|
|
common/imucnn/imucon
|
|
dimension idcon(mdepth),
|
|
* flxtt(mdepth),delta0(mdepth)
|
|
C
|
|
IF(ICONV.LE.0.AND.INDL.EQ.0) RETURN
|
|
FLXTO0=SIG4P*TEFF**4
|
|
DLTND=DELTA(ND)
|
|
IFNDM1=0
|
|
C
|
|
ICBEG=0
|
|
ICEND=0
|
|
DO ID=2,ND
|
|
T=TEMP(ID)
|
|
P=PTOTAL(ID)
|
|
PG=PGS(ID)
|
|
PRAD=P-PG-HALF*DENS(ID)*VTURB(ID)**2
|
|
TM=TEMP(ID-1)
|
|
PM=PTOTAL(ID-1)
|
|
PGM=PGS(ID-1)
|
|
PRADM=PM-PGM-HALF*DENS(ID-1)*VTURB(ID-1)**2
|
|
IF(ID.EQ.ND.AND.IFNDM1.EQ.1) THEN
|
|
FAC=DLTND*(P-PM)/(P+PM)
|
|
T=TM*(UN+FAC)/(UN-FAC)
|
|
END IF
|
|
if(ilgder.eq.0) then
|
|
T0=HALF*(T+TM)
|
|
P0=HALF*(P+PM)
|
|
PG0=HALF*(PG+PGM)
|
|
PR0=HALF*(PRAD+PRADM)
|
|
AB0=HALF*(ABROSD(ID)+ABROSD(ID-1))
|
|
DLT=(T-TM)/(P-PM)*P0/T0
|
|
else
|
|
T0=SQRT(T*TM)
|
|
P0=SQRT(P*PM)
|
|
PG0=SQRT(PG*PGM)
|
|
PR0=SQRT(PRAD*PRADM)
|
|
AB0=SQRT(ABROSD(ID)*ABROSD(ID-1))
|
|
DLT=LOG(T/TM)/LOG(P/PM)
|
|
end if
|
|
DELTA(ID)=DLT
|
|
if(idisk.eq.0) then
|
|
flxtot=flxto0
|
|
gravd=grav
|
|
else
|
|
flxtot=flxto0*(1.d0-thetav(id))
|
|
gravd=qgrav*zd(id)
|
|
end if
|
|
flxtt(id)=flxtot
|
|
C
|
|
C convective flux
|
|
C
|
|
CALL CONVEC(ID,T0,P0,PG0,PR0,AB0,DLT,FLXCNV,VCON)
|
|
FLXC(ID)=FLXCNV
|
|
idcon(id)=0
|
|
if(flxc(id).gt.0.) idcon(id)=1
|
|
IF(ICBEG.EQ.0.AND.FLXC(ID).GT.0..AND.FLXC(ID-1).EQ.0..
|
|
* AND.ID.GT.IDCONZ) ICBEG=ID
|
|
if(icbeg.gt.0.and.flxc(id).gt.0.) icend=id
|
|
END DO
|
|
C
|
|
c correction algorithm - if in the convetion zone one has
|
|
c some depth point have gradient slightly smaller that the
|
|
c adaibatic gradient, recompute gradients to have convection there.
|
|
C in this case, the radiation flux is held fixed
|
|
c
|
|
c
|
|
icbeg0=icbeg
|
|
if(ideepc.gt.0) then
|
|
if(icend.eq.nd-1.and.ideepc.eq.2) icend=nd
|
|
icbegd=icend
|
|
do id=icend,icbeg,-1
|
|
if(idcon(id).gt.0) then
|
|
icbegd=id
|
|
else
|
|
igap=0
|
|
do idd=id-1,id-ndcgap,-1
|
|
if(idcon(idd).gt.0) igap=1
|
|
end do
|
|
if(igap.gt.0) then
|
|
icbegd=id
|
|
else
|
|
go to 10
|
|
end if
|
|
end if
|
|
end do
|
|
10 continue
|
|
icbeg0=icbegd
|
|
end if
|
|
c
|
|
if(ideepc.eq.3) icend=nd
|
|
if(ideepc.ge.4) then
|
|
if(icend.le.icbegp) then
|
|
icbeg0=icbegp
|
|
icend=icendp
|
|
end if
|
|
end if
|
|
icbegp=icbeg0
|
|
icendp=icend
|
|
c
|
|
if(icbeg0.gt.0.and.icend.gt.0) then
|
|
write(6,601) icbeg0,icend
|
|
601 format(/' convective refinement between depths ',2i4/)
|
|
c
|
|
c check the temperature at the depth just above the base of
|
|
c convection zone; if there is an oscillation there, re-adjust
|
|
c the temperature
|
|
c
|
|
if(temp(icbeg0-1).lt.temp(icbeg0-2).and.
|
|
* temp(icbeg0-1).lt.temp(icbeg0)) then
|
|
temp(icbeg0-1)=half*(temp(icbeg0)+temp(icbeg0-2))
|
|
end if
|
|
c
|
|
do id=icbeg0,icend
|
|
T=TEMP(ID)
|
|
P=PTOTAL(ID)
|
|
PG=PGS(ID)
|
|
PRAD=P-PG-HALF*DENS(ID)*VTURB(ID)**2
|
|
TM=TEMP(ID-1)
|
|
PM=PTOTAL(ID-1)
|
|
PGM=PGS(ID-1)
|
|
PRADM=PM-PGM-HALF*DENS(ID-1)*VTURB(ID-1)**2
|
|
if(ilgder.eq.0) then
|
|
P0=HALF*(P+PM)
|
|
T0=HALF*(T+TM)
|
|
PG0=HALF*(PG+PGM)
|
|
PR0=HALF*(PRAD+PRADM)
|
|
AB0=HALF*(ABROSD(ID)+ABROSD(ID-1))
|
|
DLT=(T-TM)/(P-PM)*P0/T0
|
|
ppd=(p+pm)/(p-pm)
|
|
else
|
|
T0=SQRT(T*TM)
|
|
P0=SQRT(P*PM)
|
|
PG0=SQRT(PG*PGM)
|
|
PR0=SQRT(PRAD*PRADM)
|
|
AB0=SQRT(ABROSD(ID)*ABROSD(ID-1))
|
|
DLT=LOG(T/TM)/LOG(P/PM)
|
|
end if
|
|
if(idisk.eq.0) then
|
|
flxtot=flxto0
|
|
gravd=grav
|
|
else
|
|
flxtot=flxto0*(1.d0-thetav(id))
|
|
gravd=qgrav*zd(id)
|
|
end if
|
|
fcnv=flxtot-flrd(id)
|
|
tor=t
|
|
if(fcnv.le.0.) fcnv=flxtot*(un-flrd(id)/flrd(2))
|
|
if(fcnv.lt.0.) fcnv=0.001*flxtot
|
|
c
|
|
c iteration loop to correct temperature
|
|
c
|
|
iic=0
|
|
20 iic=iic+1
|
|
if(ilgder.eq.0) then
|
|
T0=HALF*(T+TM)
|
|
AB0=HALF*(ABROSD(ID)+ABROSD(ID-1))
|
|
DLT=(T-TM)/(P-PM)*P0/T0
|
|
else
|
|
T0=SQRT(T*TM)
|
|
AB0=SQRT(ABROSD(ID)*ABROSD(ID-1))
|
|
DLT=LOG(T/TM)/LOG(P/PM)
|
|
end if
|
|
DELTA(ID)=DLT
|
|
if(flxc(id)/flxtot.gt.crflim) then
|
|
CALL CONVC1(ID,T0,P0,PG0,PR0,AB0,DLT,FLXCNV,FC0)
|
|
deltae=(fcnv/fc0)**0.666666666666667
|
|
deltaa=deltae+bcnv*sqrt(deltae)
|
|
dlt=deltaa+grdadb
|
|
end if
|
|
told=t
|
|
if(ilgder.eq.0) then
|
|
dlp=dlt/ppd
|
|
t=tm*(un+dlp)/(un-dlp)
|
|
else
|
|
t=tm*(P/PM)**DLT
|
|
end if
|
|
flxcnv=fc0*deltae**1.5
|
|
ff=flxcnv/flxtot
|
|
dtt=(t-told)/told
|
|
erfl=(flrd(id)+flxcnv)/flxtot
|
|
if(ilgder.eq.0) then
|
|
T0=HALF*(T+TM)
|
|
DLT=(T-TM)/(P-PM)*P0/T0
|
|
else
|
|
T0=SQRT(T*TM)
|
|
DLT=LOG(T/TM)/LOG(P/PM)
|
|
end if
|
|
CALL CONVEC(ID,T0,P0,PG0,PR0,AB0,DLT,FLXCN0,VCON)
|
|
erfl=(flrd(id)+flxcn0)/flxtot
|
|
if(abs(dtt).gt.1.e-9.and.iic.lt.10) go to 20
|
|
delta(id)=dlt
|
|
temp(id)=t
|
|
c write(6,667) id,iic,tor,t,flxcn0/flxtot,dlt,grdadb
|
|
end do
|
|
c
|
|
c new refinement procedure
|
|
c
|
|
if(iter.ge.imucon) then
|
|
icbeg0=icbeg
|
|
icend=nd
|
|
icendp=nd
|
|
write(6,674) imucon,icbeg0,icend
|
|
674 format(/' modification with imucon: icbeg0,icend',3i4)
|
|
write(6,677) icbeg0,icend
|
|
677 format(/' new refinement procedure: icbeg0, icend ',2i4/
|
|
*' entries are: id,itrc,t,dlt,grdadb,flrd/ft,flr/ft,fcn0/ft,
|
|
*(fcn0+flr)/ft'/)
|
|
do id=icbeg0,icend
|
|
t=temp(id)
|
|
p=ptotal(id)
|
|
tm=temp(id-1)
|
|
pm=ptotal(id-1)
|
|
pg=pgs(id)
|
|
PG=PGS(ID)
|
|
PRAD=P-PG-HALF*DENS(ID)*VTURB(ID)**2
|
|
PGM=PGS(ID)
|
|
PRADM=PM-PGM-HALF*DENS(ID-1)*VTURB(ID-1)**2
|
|
pg0=sqrt(pg*pgm)
|
|
pr0=sqrt(prad*pradm)
|
|
told=t
|
|
fcnv=flxtt(id)-flrd(id)
|
|
t0=sqrt(t*tm)
|
|
p0=sqrt(p*pm)
|
|
ab0=sqrt(abrosd(id)*abrosd(id-1))
|
|
dlt=log(t/tm)/log(p/pm)
|
|
call convc1(id,t0,p0,pg0,prad0,ab0,dlt,flxcn0,fc0)
|
|
alp=min(flrd(id),flxtt(id))/t0**4/dlt
|
|
c
|
|
if(fcnv.le.0.) go to 200
|
|
if(flxcn0.le.0.) go to 200
|
|
c
|
|
bet=bcnv/t0**3
|
|
deltae=(fcnv/fc0)**twothr
|
|
deltaa=deltae+bcnv*sqrt(deltae)
|
|
dlt=deltaa+grdadb
|
|
t=tm*(P/PM)**DLT
|
|
t0=sqrt(t*tm)
|
|
c
|
|
itrnrc=0
|
|
100 continue
|
|
itrnrc=itrnrc+1
|
|
t1=un/t
|
|
dltp=t1/log(p/pm)
|
|
t0p=half*t0*t1
|
|
dele=(flxtt(id)-alp*t0**4*dlt)/fc0
|
|
dele3= dele**third
|
|
delep=-alp*t0**4*dlt/fc0*(two*t1+d1tp/dlt)
|
|
vl=dlt-grdadb-dele3*(dele3+bet*t0**3)
|
|
bb=dltp-twothr*delep/dele3-
|
|
* bet*t0**3*dele3*(1.5d0*t1+third*delep/dele)
|
|
dt=-vl/bb*t1
|
|
t=t*(un+dt)
|
|
t0=sqrt(t*tm)
|
|
dlt=log(t/tm)/log(p/pm)
|
|
call convc1(id,t0,p0,pg0,prad0,ab0,dlt,flxcn0,fc0)
|
|
645 format(2i4,1pe11.3,0pf8.2,1p3e13.5)
|
|
if(abs(dt).lt.1.e-9.or.itrnrc.gt.20) go to 110
|
|
go to 100
|
|
110 continue
|
|
go to 230
|
|
c
|
|
200 continue
|
|
if(flxtt(id).lt.flrd(id)) then
|
|
alp=flxtt(id)/flrd(id)*t0**4*delta0(id)
|
|
itrnrc=0
|
|
210 continue
|
|
itrnrc=itrnrc+1
|
|
t1=un/t
|
|
dltp=t1/log(p/pm)
|
|
t0p=half*t0*t1
|
|
dele=alp-t0**4*dlt
|
|
delep=-t0**4*dlt*(two*t1+dltp/dlt)
|
|
dt=-dele/delep*t1
|
|
t=t*(un+dt)
|
|
write(6,645) id,itrnrc,dt,t
|
|
if(abs(dt).lt.1.e-6.or.itrnrc.gt.20) go to 220
|
|
t0=sqrt(t*tm)
|
|
dlt=log(t/tm)/log(p/pm)
|
|
go to 210
|
|
220 continue
|
|
alp=flrd(id)/t0**4/dlt
|
|
end if
|
|
c
|
|
230 continue
|
|
delta(id)=dlt
|
|
temp(id)=t
|
|
flr=alp*t0**4*dlt
|
|
if(dlt.ge.grdadb) then
|
|
flc=fc0*dele
|
|
write(6,646) id,itrnrc,t,dlt,grdadb,flrd(id)/flxtt(id),
|
|
* flr/flxtt(id),flc/flxtt(id),flxcn0/flxtt(id),
|
|
* (flr+flxcn0)/flxtt(id)
|
|
else
|
|
itrnrc=0
|
|
write(6,646) id,itrnrc,t,dlt,grdadb,flrd(id)/flxtt(id),
|
|
* flr/flxtt(id)
|
|
end if
|
|
646 format(2i4,f8.1,1p7e12.4)
|
|
end do
|
|
end if
|
|
c
|
|
if(ioptab.ge.-1.and.ifryb.gt.0) then
|
|
do id=1,nd
|
|
t=temp(id)
|
|
an=pgs(id)/bolk/t
|
|
CALL ELDENS(ID,T,AN,ANE,ENRG,ENTT,WM,1)
|
|
RHO=WMM(ID)*(AN-ANE)
|
|
DENS(ID)=RHO
|
|
ELEC(ID)=ANE
|
|
CALL WNSTOR(ID)
|
|
CALL STEQEQ(ID,POP,1)
|
|
END DO
|
|
END IF
|
|
c
|
|
call tdpini
|
|
call conout(1,ipconf)
|
|
end if
|
|
c
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C
|
|
C ******************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE PZEVAL
|
|
C =================
|
|
C
|
|
C Auxiliary procedure called from RESOLV
|
|
C determination of the total and gas pressures, and logarithmic
|
|
C gradient of pressure
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
common/icnrsp/iconrs
|
|
C
|
|
C total pressure, gas pressure, and logarithmic gradient DELTA
|
|
C
|
|
IF(IPPZEV.GT.0) WRITE(6,601)
|
|
DO ID=1,ND
|
|
PTURB=HALF*DENS(ID)*VTURB(ID)*VTURB(ID)
|
|
PGS0=(DENS(ID)/WMM(ID)+ELEC(ID))*BOLK*TEMP(ID)
|
|
PTOTL0=PGS0+PRADT(ID)+PTURB
|
|
PTOTL1=GRAV*DM(ID)+PRADT(1)-PRD0
|
|
PGS1=PTOTL1-PTURB-PRADT(ID)
|
|
AAA=3.D0*PRADT(ID)/TEMP(ID)**4/7.5639D-15
|
|
if(idisk.eq.0) then
|
|
PTOTAL(ID)=PTOTL1
|
|
PGS(ID)=PGS1
|
|
else
|
|
PTOTAL(ID)=PTOTL0
|
|
PGS(ID)=PGS0
|
|
end if
|
|
IF(IPPZEV.GT.0) WRITE(6,602) ID,PTOTL0,PTOTL1,PGS0,PGS1,
|
|
* PRADT(ID),AAA
|
|
END DO
|
|
IF(HMIX0.LT.0.) RETURN
|
|
IF(IPPZEV.GT.0) THEN
|
|
WRITE(6,600) ITER-1
|
|
CALL CONOUT(1,IPCONF)
|
|
END IF
|
|
if(iconre.gt.0.and.iter.le.iconre.and.iter.ge.iconrs) call conref
|
|
IF(IPPZEV.EQ.0.AND.LFIN) THEN
|
|
WRITE(6,600) ITER-1
|
|
CALL CONOUT(1,1)
|
|
END IF
|
|
600 FORMAT(/' CONVECTIVE FLUX: RESOLV; GLOBAL ITERATION =',I2/)
|
|
601 FORMAT(/' ID PTOT-SUM PTOT-MG PGAS-RHO PGAS-P PRAD',
|
|
* ' A'/)
|
|
602 FORMAT(I4,1P6D10.3)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ******************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE PZEVLD
|
|
C =================
|
|
C
|
|
C Auxiliary procedure called from RESOLV
|
|
C determination of the total and gas pressures, and logarithmic
|
|
C gradient of pressure
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
COMMON/PRSAUX/VSND2(MDEPTH),HG1,HR1,RR1
|
|
COMMON/DEPTDR/DDM(MDEPTH),DDP(MDEPTH),DD0(MDEPTH),
|
|
* DDMIN(MDEPTH),DDPLU(MDEPTH),DDA(MDEPTH),
|
|
* DDC(MDEPTH),DDB(MDEPTH)
|
|
common/grdpra/GRD(MDEPTH),pra(mdepth),pgs0(mdepth),ANTP(MDEPTH)
|
|
common/ifpzpa/ifpzev
|
|
dimension dpp(mdepth),zd1(mdepth),zd2(mdepth),zd3(mdepth),
|
|
* ZOLD(MDEPTH)
|
|
C
|
|
if(ifryb.gt.0.and.ifpzev.eq.0) return
|
|
iheitr=0
|
|
5 continue
|
|
iheitr=iheitr+1
|
|
C
|
|
C geometrical distance from the central plane - z
|
|
C
|
|
if(ihecor.ge.0) then
|
|
ZD(ND)=ZND
|
|
DO IID=1,ND-1
|
|
ID=ND-IID
|
|
if(iheitr.eq.1) then
|
|
ZD(ID)=ZD(ID+1)+HALF*(DM(ID+1)-DM(ID))*(UN/DENS(ID+1)+
|
|
* UN/DENS(ID))
|
|
ZOLD(ID)=ZD(ID)
|
|
end if
|
|
END DO
|
|
else
|
|
zd1(1)=-ddc(1)/ddb(1)
|
|
zd2(1)=-dens1(1)/ddb(1)
|
|
do id=2,nd-1
|
|
x=un/(ddb(id)-dda(id)*zd1(id-1))
|
|
zd1(id)=-x*ddc(id)
|
|
zd2(id)=-x*(dens1(id)-dda(id)*zd2(id-1))
|
|
end do
|
|
zd(nd)=znd
|
|
do id=nd-1,1,-1
|
|
zd(id)=zd1(id)*zd(id+1)+zd2(id)
|
|
end do
|
|
end if
|
|
C
|
|
C total pressure, gas pressure, and sound speed
|
|
C
|
|
DO ID=1,ND
|
|
PTURB=HALF*DENS(ID)*VTURB(ID)*VTURB(ID)
|
|
PGSC=(DENS(ID)/WMM(ID)+ELEC(ID))*BOLK*TEMP(ID)
|
|
PGS(ID)=PGSC
|
|
PTOTL0=PGS(ID)+PRADT(ID)+PTURB
|
|
PTOTAL(ID)=PTOTL0
|
|
VSND2(ID)=PTOTAL(ID)/DENS(ID)
|
|
END DO
|
|
ID=1
|
|
HG1=SQRT(2.*PGS(1)/DENS(1)/QGRAV)
|
|
HR1=PRD0/QGRAV
|
|
RR1=HR1/HG1
|
|
C
|
|
C recalculate the z-distance
|
|
C
|
|
IJ1=1
|
|
if(icompt.gt.0.and.icombc.gt.0.and.ijex(1).gt.0) IJ1=2
|
|
DO ID=1,ND
|
|
GRP=0.
|
|
FLEX=0.
|
|
IF(NFREQE.GT.0.or.ifryb.eq.0) THEN
|
|
DO IJ=IJ1,NFREQE
|
|
RAD0(IJ)=RADEX(IJ,ID)
|
|
FK0(IJ)=FAKEX(IJ,ID)
|
|
ABSO0(IJ)=ABSOEX(IJ,ID)
|
|
IJT=IJFR(IJ)
|
|
WD0=W(IJT)
|
|
FLUXW=FH(IJT)*RAD0(IJ)-HEXTRD(IJT)
|
|
IF(.NOT.LSKIP(ID,IJT)) THEN
|
|
IF(ID.EQ.1) THEN
|
|
GRP=GRP+WD0*FLUXW*ABSO0(IJ)
|
|
ELSE
|
|
RADM(IJ)=RADEX(IJ,ID-1)
|
|
FKM(IJ)=FAKEX(IJ,ID-1)
|
|
ABSOM(IJ)=ABSOEX(IJ,ID-1)
|
|
FRD=FK0(IJ)*RAD0(IJ)-FKM(IJ)*RADM(IJ)
|
|
GRP=GRP+WD0*FRD
|
|
END IF
|
|
END IF
|
|
END DO
|
|
GRD(ID)=GRP+FPRD(ID)
|
|
END IF
|
|
IF(ID.EQ.1) THEN
|
|
GRV=QGRAV*ZD(ID)
|
|
ELSE
|
|
GRV=QGRAV*(ZD(ID)+ZD(ID-1))*HALF
|
|
dpt=(ptotal(id)-ptotal(id-1))/ddm(id)
|
|
dpr=(pradt(id)-pradt(id-1))/ddm(id)
|
|
dpg=(pgs(id)-pgs(id-1))/ddm(id)
|
|
dpr1=grd(id)/(dm(id)-dm(id-1))*4.19168946e-10
|
|
err=10.
|
|
if(grv.ne.0.) err=(dpg+dpr-grv)/grv
|
|
dpp(id)=(dpg+dpr1)/qgrav
|
|
end if
|
|
end do
|
|
c
|
|
if(iter.le.iabs(ifz0)) then
|
|
zd1(1)=dpp(2)
|
|
zd1(nd)=znd
|
|
do id=2,nd-1
|
|
zd1(id)=(dpp(id)+dpp(id+1))*half
|
|
end do
|
|
c
|
|
zd2(nd)=znd
|
|
zd3(nd)=znd
|
|
izdiv=0
|
|
nzdiv=0
|
|
do id=nd-1,1,-1
|
|
zd2(id)=2.*dpp(id+1)-zd2(id+1)
|
|
zd3(id)=dpp(id)*ddmin(id)+dpp(id+1)*ddplu(id)
|
|
if(zd2(id).le.zd2(id+1)) nzdiv=nzdiv+1
|
|
if(nzdiv.eq.1) izdiv=id
|
|
end do
|
|
c
|
|
if(ihecor.ge.0) then
|
|
do id=1,nd
|
|
zd(id)=zd2(id)
|
|
if(id.le.izdiv) zd(id)=zd1(id)
|
|
end do
|
|
else
|
|
do id=1,nd
|
|
zd(id)=zd3(id)
|
|
end do
|
|
end if
|
|
c
|
|
c recalculate densities (if required)
|
|
c
|
|
if(ihecor.gt.0) then
|
|
do id=nd-1,1,-1
|
|
x=HALF*(DM(ID+1)-DM(ID))
|
|
xne=elec(id)/dens(id)
|
|
dens(id)=x*dens(id+1)/((zd(id)-zd(id+1))*dens(id+1)-x)
|
|
dens1(id)=un/dens(id)
|
|
elec(id)=xne*dens(id)
|
|
end do
|
|
else if(ihecor.lt.-1) then
|
|
do id=nd-1,1,-1
|
|
xne=elec(id)/dens(id)
|
|
if(id.gt.1) then
|
|
dens1(id)=zd(id-1)*dda(id)-zd(id)*ddb(id)-
|
|
* zd(id+1)*ddc(id)
|
|
else
|
|
dens1(id)=-zd(id)*ddb(id)-zd(id+1)*ddc(id)
|
|
end if
|
|
dens(id)=un/dens1(id)
|
|
elec(id)=xne*dens(id)
|
|
end do
|
|
end if
|
|
c
|
|
dzmx=0.
|
|
do id=1,nd-1
|
|
dzmx=max(dzmx,abs((zd(id)-zold(id))/zd(id)))
|
|
zold(id)=zd(id)
|
|
end do
|
|
if(iheitr.ge.5.or.dzmx.lt.1.d-3) go to 25
|
|
go to 5
|
|
25 continue
|
|
c
|
|
end if
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE LEMINI
|
|
C =================
|
|
C
|
|
C Initializes necessary arrays for evaluating hydrogen line profiles
|
|
C from the Lemke tables
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
C
|
|
DO I=1,4
|
|
DO J=1,22
|
|
ILINH(I,J)=0
|
|
END DO
|
|
END DO
|
|
if(ihydpr.eq.21) then
|
|
open(unit=ihydpr,file='./data/lemke.dat',status='old')
|
|
write(6,641) ihydpr
|
|
else if(ihydpr.eq.22) then
|
|
open(unit=ihydpr,file='./data/tremblay.dat',status='old')
|
|
write(6,642) ihydpr
|
|
end if
|
|
641 format(' -----------'/
|
|
* ' reading Lemke tables; ihydpr =',i3,/
|
|
* ' -----------')
|
|
642 format(' -----------'/
|
|
* ' reading Tremblay tables; ihydpr =',i3,/
|
|
* ' -----------')
|
|
C
|
|
C ---------------------------------
|
|
C read Lemke or Tremblay tables
|
|
C ---------------------------------
|
|
C
|
|
ILINE=0
|
|
READ(IHYDPR,*) NTAB
|
|
DO ITAB=1,NTAB
|
|
ILINEB=ILINE
|
|
READ(IHYDPR,*) NLLY
|
|
DO ILI=1,NLLY
|
|
ILINE=ILINE+1
|
|
READ(IHYDPR,*) I,J,ALMIN,ANEMIN,TMIN,DLA,DLE,DLT,
|
|
* NWL,NE,NT
|
|
write(6,643) ntab,nlly,iline,i,j
|
|
643 format(' ntab,nlly,iline,i,j ',5i4)
|
|
ILINH(I,J)=ILINE
|
|
NWLH(ILINE)=NWL
|
|
NWLHYD(ILINE)=NWL
|
|
NTH(ILINE)=NT
|
|
NEH(ILINE)=NE
|
|
DO IWL=1,NWL
|
|
WLH(IWL,ILINE)=ALMIN+(IWL-1)*DLA
|
|
WLHYD(ILINE,IWL)=WLH(IWL,ILINE)
|
|
WLH(IWL,ILINE)=EXP(2.3025851*WLH(IWL,ILINE))
|
|
END DO
|
|
DO INE=1,NE
|
|
XNELEM(INE,ILINE)=ANEMIN+(INE-1)*DLE
|
|
END DO
|
|
DO IT=1,NT
|
|
XTLEM(IT,ILINE)=TMIN+(IT-1)*DLT
|
|
END DO
|
|
END DO
|
|
c
|
|
DO ILI=1,NLLY
|
|
ILNE=ILINEB+ILI
|
|
NWL=NWLH(ILNE)
|
|
READ(IHYDPR,500)
|
|
DO INE=1,NEH(ILNE)
|
|
DO IT=1,NTH(ILNE)
|
|
READ(IHYDPR,*) QLT,(PRFHYD(ILNE,IWL,IT,INE),IWL=1,NWL)
|
|
END DO
|
|
END DO
|
|
C
|
|
C coefficient for the asymptotic profile is determined from
|
|
C the input data
|
|
C
|
|
XCLOG=PRFHYD(ILNE,NWL,1,1)+2.5*WLHYD(ILNE,NWL)-0.477121
|
|
XKLOG=0.6666667*XCLOG
|
|
XK0(ILNE)=EXP(XKLOG*2.3025851)
|
|
END DO
|
|
END DO
|
|
CLOSE(IHYDPR)
|
|
500 FORMAT(1X)
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE INTLEM(PRFH,WL0,ILINE,ID)
|
|
C ====================================
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (FOC1=1.25e-9,TTW=2./3.,VTBC=6.06e-9)
|
|
DIMENSION PRFH(MHWL)
|
|
C
|
|
C temperature is modified in order to account for the
|
|
C effect of turbulent velocity on the Doppler width
|
|
C
|
|
T=TEMP(ID)+VTBC*VTURBS(ID)*VTURBS(ID)
|
|
ANE=ELEC(ID)
|
|
TL=LOG10(T)
|
|
ANEL=LOG10(ANE)
|
|
F00=FOC1*EXP(TTW*LOG(ANE))
|
|
XK=XK0(ILINE)
|
|
FXK=F00*XK
|
|
DOP=1.E8/WL0*SQRT(1.65E8*T)
|
|
DBETA=WL0*WL0/2.997925E18/FXK
|
|
BETAD=DBETA*DOP
|
|
C
|
|
C interpolation to the actual values of temperature and electron
|
|
C density
|
|
C
|
|
NWL=NWLHYD(ILINE)
|
|
DO IWL=1,NWL
|
|
CALL INTHYD(PRFH0,TL,ANEL,IWL,ILINE)
|
|
PRFH(IWL)=PRFH0
|
|
END DO
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE INTHYD(W0,X0,Z0,IWL,ILINE)
|
|
C =====================================
|
|
C
|
|
C Interpolation in temperature and electron density from the
|
|
C Lemke tables for hydrogen lines to the actual valus of
|
|
C temperature and electron density
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
DIMENSION ZZ(3),XX(3),WX(3),WZ(3)
|
|
C
|
|
NX=2
|
|
NZ=2
|
|
NT=NTH(ILINE)
|
|
NE=NEH(ILINE)
|
|
BETA=WLH(IWL,ILINE)/XK
|
|
IZH=1
|
|
C
|
|
C for values lower than the lowest grid value of electron density
|
|
C the profiles are determined by the approximate expression
|
|
C (see STARKA); not by an extrapolation in the HYD tables which may
|
|
C be very inaccurate
|
|
C
|
|
IF(Z0.LT.XNELEM(1,ILINE)*0.99) THEN
|
|
CALL DIVSTR(IZH)
|
|
W0=STARKA(BETA,TWO)*DBETA
|
|
W0=LOG10(W0)
|
|
RETURN
|
|
END IF
|
|
C
|
|
C Otherwise, one interpolates (or extrapolates for higher than the
|
|
C highes grid value of electron density) in the HYD tables
|
|
C
|
|
DO IZZ=1,NE-1
|
|
IPZ=IZZ
|
|
IF(Z0.LE.XNELEM(IZZ+1,ILINE)) GO TO 20
|
|
END DO
|
|
20 N0Z=IPZ-NZ/2+1
|
|
IF(N0Z.LT.1) N0Z=1
|
|
IF(N0Z.GT.NE-NZ+1) N0Z=NE-NZ+1
|
|
N1Z=N0Z+NZ-1
|
|
C
|
|
DO IZZ=N0Z,N1Z
|
|
I0Z=IZZ-N0Z+1
|
|
ZZ(I0Z)=XNELEM(IZZ,ILINE)
|
|
C
|
|
C Likewise, the approximate expression instead of extrapolation
|
|
C is used for higher that the highest grid value of temperature,
|
|
C if the Doppler width expressed in beta units (BETAD) is
|
|
C sufficiently large (> 10)
|
|
C
|
|
C IF(X0.GT.1.01*XTLEM(NT,ILINE).AND.BETAD.GT.10.) THEN
|
|
IF(X0.GT.1.01*XTLEM(NT,ILINE)) THEN
|
|
CALL DIVSTR(IZH)
|
|
W0=STARKA(BETA,TWO)*DBETA
|
|
W0=LOG10(W0)
|
|
RETURN
|
|
END IF
|
|
C
|
|
C Otherwise, normal inter- or extrapolation
|
|
C
|
|
C Both interpolations (in T as well as in electron density) are
|
|
C by default the quadratic interpolations in logarithms
|
|
C
|
|
DO IX=1,NT-1
|
|
IPX=IX
|
|
IF(X0.LE.XTLEM(IX+1,ILINE)) GO TO 40
|
|
END DO
|
|
40 N0X=IPX-NX/2+1
|
|
IF(N0X.LT.1) N0X=1
|
|
IF(N0X.GT.NT-NX+1) N0X=NT-NX+1
|
|
N1X=N0X+NX-1
|
|
DO IX=N0X,N1X
|
|
I0=IX-N0X+1
|
|
XX(I0)=XTLEM(IX,ILINE)
|
|
WX(I0)=PRFHYD(ILINE,IWL,IX,IZZ)
|
|
END DO
|
|
IF(WX(1).LT.-99..OR.WX(2).LT.-99..OR.WX(3).LT.-99.) THEN
|
|
CALL DIVSTR(IZH)
|
|
W0=STARKA(BETA,TWO)*DBETA
|
|
W0=LOG10(W0)
|
|
RETURN
|
|
ELSE
|
|
WZ(I0Z)=YINT(XX,WX,X0)
|
|
END IF
|
|
END DO
|
|
W0=YINT(ZZ,WZ,Z0)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
FUNCTION YINT(XL,YL,XL0)
|
|
C ========================
|
|
C
|
|
C Quadratic interpolation routine
|
|
C
|
|
C Input: XL - array of x
|
|
C YL - array of f(x)
|
|
C XL0 - the point x(0) to which one interpolates
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
DIMENSION XL(3),YL(3)
|
|
A0=(XL(2)-XL(1))*(XL(3)-XL(2))*(XL(3)-XL(1))
|
|
A1=(XL0-XL(2))*(XL0-XL(3))*(XL(3)-XL(2))
|
|
A2=(XL0-XL(1))*(XL(3)-XL0)*(XL(3)-XL(1))
|
|
A3=(XL0-XL(1))*(XL0-XL(2))*(XL(2)-XL(1))
|
|
YINT=(YL(1)*A1+YL(2)*A2+YL(3)*A3)/A0
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ******************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE STARK0(I,J,IZZ,XKIJ,WL0,FIJ)
|
|
C =======================================
|
|
C
|
|
C Auxiliary procedure for evaluating the approximate Stark profile
|
|
C of hydrogen lines - sets up necessary frequency independent
|
|
C parameters
|
|
C
|
|
C Input: I - principal quantum number of the lower level
|
|
C J - principal quantum number of the upper level
|
|
C IZZ - ionic charge (IZZ=1 for hydrogen, etc.)
|
|
C Output: XKIJ - coefficients K(i,j) for the Hotzmark profile;
|
|
C exact up to j=6, asymptotic for higher j
|
|
C WL0 - wavelength of the line i-j
|
|
C FIJ - Stark f-value for the line i-j
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
PARAMETER (RYD1=911.763811,RYD2=911.495745/4.,CXKIJ=5.5E-5)
|
|
PARAMETER (WI1=911.753578, WI2=227.837832)
|
|
PARAMETER (UN=1.,TEN=10.,TWEN=20.,HUND=100.)
|
|
DIMENSION FSTARK(10,4),XKIJT(5,4)
|
|
DATA XKIJT/3.56D-4,5.23D-4,1.09D-3,1.49D-3,2.25D-3,.0125,.0177,
|
|
* .028,.0348,.0493,.124,.171,.223,.261,.342,.683,.866,1.02,1.19,
|
|
* 1.46/
|
|
DATA FSTARK/.1387,.0791,.02126,.01394,.00642,4.814D-3,2.779D-3,
|
|
* 2.216D-3,1.443D-3,1.201D-3,.3921,.1193,.03766,.02209,.01139,
|
|
* 8.036D-3,5.007D-3,3.85D-3,2.658D-3,2.151D-3,.6103,.1506,.04931,
|
|
* .02768,.01485,.01023,6.588D-3,4.996D-3,3.524D-3,2.838D-3,.8163,
|
|
* .1788,.05985,.03189,.01762,.01196,7.825D-3,5.882D-3,4.233D-3,
|
|
* 3.375D-3/
|
|
SAVE XKIJT,FSTARK
|
|
C
|
|
II=I*I
|
|
JJ=J*J
|
|
JMIN=J-I
|
|
IF(JMIN.LE.5) THEN
|
|
XKIJ=XKIJT(JMIN,I)
|
|
ELSE
|
|
XKIJ=CXKIJ*(II*JJ)*(II*JJ)/(JJ-II)
|
|
END IF
|
|
IF(JMIN.LE.10) THEN
|
|
FIJ=FSTARK(JMIN,I)
|
|
ELSE
|
|
CFIJ=((TWEN*I+HUND)*J/(I+TEN)/(JJ-II))
|
|
FIJ=FSTARK(10,I)*CFIJ*CFIJ*CFIJ
|
|
END IF
|
|
|
|
WL0=WI1
|
|
IF(IZZ.EQ.2) WL0=WI2
|
|
WL0=WL0/(UN/II-UN/JJ)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION STARKA(BETA,FAC)
|
|
C =========================
|
|
C
|
|
C Approximate expressions for the hydrogen Stark profile
|
|
C
|
|
C Input: BETA - delta lambda in beta units,
|
|
C BETAD - Doppler width in beta units
|
|
C A - auxiliary parameter
|
|
C A=1.5*LOG(BETAD)-1.761
|
|
C DIV - only for A > 1; division point between Doppler
|
|
C and asymptotic Stark wing, expressed in units
|
|
C of betad.
|
|
C DIV = solution of equation
|
|
C exp(-(beta/betad)**2)/betad/sqrt(pi)=
|
|
C = 1.5*FAC*beta**-5/2
|
|
C (ie. the point where Doppler profile is equal to
|
|
C the asymptotic Holtsmark)
|
|
C In order to save computer time, the division point
|
|
C DIV is calculated in advance by routine DIVSTR.
|
|
C FAC - Multiplicative factor (2. for H I; 1. for He II)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (F0=-0.5758228,F1=0.4796232,F2=0.07209481,AL=1.26)
|
|
PARAMETER (SD=0.5641895,SLO=-2.5,THRA=1.5,BL1=1.14,BL2=11.4)
|
|
PARAMETER (SAC=0.08, PISQ1=UN/1.77245385090551D0)
|
|
C
|
|
C for a > 1 Doppler core + asymptotic Holtzmark wing with division
|
|
C point DIV
|
|
C
|
|
BETAD1=UN/BETAD
|
|
IF(ADH.GT.AL) THEN
|
|
XD=BETA*BETAD1
|
|
IF(XD.LE.DIVH) THEN
|
|
STARKA=EXP(-XD*XD)*BETAD1*PISQ1
|
|
ELSE
|
|
STARKA=THRA*FAC*EXP(SLO*LOG(BETA))
|
|
END IF
|
|
ELSE
|
|
C
|
|
C empirical formula for a < 1
|
|
C
|
|
IF(BETA.LE.BL1) THEN
|
|
STARKA=SAC
|
|
ELSE IF(BETA.LT.BL2) THEN
|
|
XL=LOG(BETA)
|
|
FL=(F0*XL+F1)*XL
|
|
STARKA=F2*EXP(FL)
|
|
ELSE
|
|
STARKA=THRA*FAC*EXP(SLO*LOG(BETA))
|
|
END IF
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C *******************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE DIVSTR(IAH)
|
|
C ======================
|
|
C
|
|
C Auxiliary procedure for STARKA - determination of the division
|
|
C point between Doppler and asymptotic Stark profiles
|
|
C
|
|
C Input: BETAD - Doppler width in beta units
|
|
C Output: A - auxiliary parameter
|
|
C A=1.5*LOG(BETAD)-1.671
|
|
C DIV - only for A > 1; division point between Doppler
|
|
C and asymptotic Stark wing, expressed in units
|
|
C of betad.
|
|
C DIV = solution of equation
|
|
C exp(-(beta/betad)**2)/betad/sqrt(pi)=3*beta**-5/2
|
|
C
|
|
C He II: different definition of parameter ADH !
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (UNQ=1.25,UNH=1.5,TWH=2.5,FO=4.,FI=5.)
|
|
PARAMETER (CA=1.671,BL=5.821,AL=1.26,CX=0.28,DX=0.0001)
|
|
PARAMETER (CA2=0.978,XA2=0.69314718)
|
|
C
|
|
ADH=UNH*LOG(BETAD)-CA
|
|
IF(IAH.EQ.2) ADH=ADH+XA2
|
|
IF(BETAD.LT.BL) RETURN
|
|
IF(ADH.GE.AL) THEN
|
|
X=SQRT(ADH)*(UN+UNQ*LOG(ADH)/(FO*ADH-FI))
|
|
ELSE
|
|
X=SQRT(CX+ADH)
|
|
ENDIF
|
|
DO I=1,5
|
|
X2=X*X
|
|
XN=X*(UN-(X2-TWH*LOG(X)-ADH)/(TWO*X2-TWH))
|
|
IF(ABS(XN-X).LE.DX) GO TO 10
|
|
X=XN
|
|
END DO
|
|
10 DIVH=X
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE OPAHST
|
|
C =================
|
|
C
|
|
C Auxiliary routine for START
|
|
C sets up necessary parameters for routines OPAHYL and OPHYL1, i.e.
|
|
C for opacity and emissivity in higher hydrogen lines
|
|
C Also sets up Stark parameters for OPAHYL
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
C
|
|
ALLIM1=1450.
|
|
ABLIM1=6650.
|
|
ABLIM2=5000.
|
|
ABLIM3=6500.
|
|
C
|
|
C Lyman lines
|
|
C
|
|
ILOW=1
|
|
IF(IABS(IOPHL1).EQ.1) IOPHL2=IOPHL2*2
|
|
DO I=1,4
|
|
M1FILE(I,ILOW)=MAX(I,IABS(IOPHL1))
|
|
M2FILE(I,ILOW)=I+1
|
|
END DO
|
|
DO I=5,NLMX
|
|
M1FILE(I,ILOW)=MAX(I-1,IABS(IOPHL1))
|
|
M2FILE(I,ILOW)=MIN(I+3,NLMX)
|
|
END DO
|
|
M1FILE(NLMX,ILOW)=NLMX+1
|
|
M2FILE(NLMX,ILOW)=NLMX
|
|
C
|
|
IF(IABS(IOPHL1).GT.100) THEN
|
|
IOPHL1=MOD(IOPHL1,100)
|
|
ISET=0
|
|
40 CONTINUE
|
|
READ(IBUFF,*,ERR=90) IL1,IU1,IM1,IP1
|
|
ISET=ISET+1
|
|
IF(IL1.LE.0.AND.ISET.EQ.1) THEN
|
|
IL1=1
|
|
IU1=4
|
|
IM1=0
|
|
IP1=1
|
|
END IF
|
|
IF(IL1.LE.0.AND.ISET.EQ.2) THEN
|
|
IL1=5
|
|
IU1=NLMX
|
|
IM1=1
|
|
IP1=3
|
|
END IF
|
|
IUP1=MIN(IU1,NLMX)
|
|
DO I=IL1,IUP1
|
|
M1FILE(I,ILOW)=MAX(I-IM1,IABS(IOPHL1))
|
|
M2FILE(I,ILOW)=MIN(I+IP1,NLMX)
|
|
END DO
|
|
IF(IU1.LT.NLMX) GO TO 40
|
|
90 CONTINUE
|
|
READ(IBUFF,*,ERR=100) ALLIM1
|
|
IF(ALLIM1.LE.0) ALLIM1=1450.
|
|
END IF
|
|
M1FILE(NLMX,ILOW)=NLMX+1
|
|
M2FILE(NLMX,ILOW)=NLMX
|
|
C
|
|
C Balmer lines
|
|
C
|
|
100 ILOW=2
|
|
IF(IABS(IOPHL2).EQ.1) IOPHL2=IOPHL2*3
|
|
IF(IABS(IOPHL2).EQ.2) IOPHL2=IOPHL2*3/2
|
|
DO I=1,6
|
|
M1FILE(I,ILOW)=MAX(I,IABS(IOPHL2))
|
|
M2FILE(I,ILOW)=I+1
|
|
END DO
|
|
DO I=7,NLMX
|
|
M1FILE(I,ILOW)=MAX(I-1,IABS(IOPHL2))
|
|
M2FILE(I,ILOW)=MIN(I+3,NLMX)
|
|
END DO
|
|
IF(IABS(IOPHL2).GT.100) THEN
|
|
IOPHL2=MOD(IOPHL2,100)
|
|
ISET=0
|
|
140 CONTINUE
|
|
READ(IBUFF,*,ERR=190) IL1,IU1,IM1,IP1
|
|
ISET=ISET+1
|
|
IF(IL1.LE.0.AND.ISET.EQ.1) THEN
|
|
IL1=1
|
|
IU1=6
|
|
IM1=0
|
|
IP1=1
|
|
END IF
|
|
IF(IL1.LE.0.AND.ISET.EQ.2) THEN
|
|
IL1=7
|
|
IU1=NLMX
|
|
IM1=1
|
|
IP1=3
|
|
END IF
|
|
IUP1=MIN(IU1,NLMX)
|
|
DO I=IL1,IUP1
|
|
M1FILE(I,ILOW)=MAX(I-IM1,IABS(IOPHL2))
|
|
M2FILE(I,ILOW)=MIN(I+IP1,NLMX)
|
|
END DO
|
|
IF(IU1.LT.NLMX) GO TO 140
|
|
190 CONTINUE
|
|
READ(IBUFF,*,ERR=200,END=200) ABLIM1,ABLIM2,ABLIM3
|
|
IF(ABLIM1.LE.0) ABLIM1=6650.
|
|
IF(ABLIM2.LE.0) ABLIM2=5000.
|
|
IF(ABLIM3.LE.0) ABLIM3=6500.
|
|
END IF
|
|
200 CONTINUE
|
|
M1FILE(NLMX,ILOW)=NLMX+1
|
|
M2FILE(NLMX,ILOW)=NLMX
|
|
c
|
|
C -------------------
|
|
C Stark paramereters
|
|
C -------------------
|
|
C
|
|
izzh=1
|
|
IF(IOPHL1.NE.0) THEN
|
|
I=1
|
|
I1=MAX(2,IABS(IOPHL1))
|
|
DO J=I1,NLMX
|
|
CALL STARK0(I,J,izzh,XKIJ(I,J),WL0(I,J),FIJ(I,J))
|
|
END DO
|
|
END IF
|
|
IF(IOPHL2.NE.0) THEN
|
|
I=2
|
|
I2=MAX(3,IABS(IOPHL2))
|
|
DO J=I2,NLMX
|
|
CALL STARK0(I,J,izzh,XKIJ(I,J),WL0(I,J),FIJ(I,J))
|
|
END DO
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE WNSTOR(ID)
|
|
C =====================
|
|
C
|
|
C Stores occupation probabilities for hydrogen levels
|
|
C in common WNCOM for further use
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (SIXTH=UN/6.,CCOR=0.09)
|
|
parameter (p1=0.1402,p2=0.1285,p3=un,p4=3.15,p5=4.)
|
|
parameter (tkn=3.01,ckn=5.33333333,cb0=8.59d14,f23=-2./3.)
|
|
if(ioptab.lt.0) return
|
|
C
|
|
cb=cb0*bergfc
|
|
ANE=ELEC(ID)
|
|
A=CCOR*EXP(SIXTH*LOG(ANE))/SQRT(TEMP(ID))
|
|
z=un
|
|
x=exp(p4*log(un+p3*a))
|
|
c1=p1*(x+p5*(z-un)*a*a*a)
|
|
c2=p2*x
|
|
beta0=cb*z*z*z*exp(f23*log(ane))
|
|
DO I=1,NLMX
|
|
XN=I
|
|
if(xn.le.tkn) then
|
|
xkn=un
|
|
else
|
|
xn1=un/(xn+un)
|
|
xkn=ckn*xn*xn1*xn1
|
|
end if
|
|
beta=beta0*xkn*xi2(i)*xi2(i)
|
|
f=(c1*beta*beta*beta)/(un+c2*beta*sqrt(beta))
|
|
WNHINT(I,ID)=f/(un+f)
|
|
END DO
|
|
C
|
|
C array WOP - occupation probabilities for explicit levels
|
|
C (if ifwop>1, occ. probabilities have been initialized
|
|
C for iron-peak elements and are not updated)
|
|
C
|
|
do ii=1,nlevel
|
|
|
|
if(ifwop(ii).le.0) then
|
|
wop(ii,id)=un
|
|
|
|
else if(ifwop(ii).eq.1) then
|
|
ie=iel(ii)
|
|
nq=nquant(ii)
|
|
if(iz(ie).eq.1) then
|
|
wop(ii,id)=wnhint(nq,id)
|
|
else
|
|
z=iz(ie)
|
|
xn=nq
|
|
wop(ii,id)=wn(xn,a,ane,z)
|
|
end if
|
|
|
|
end if
|
|
|
|
if(ifwop(ii).gt.1.and.lte) wop(ii,id)=un
|
|
|
|
end do
|
|
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
|
|
function wn(xn,a,ane,z)
|
|
c
|
|
c evaluation of the occupation probablities for a hydrogenic ion
|
|
c using eqs (4.26), and (4.39) of Hummer,Mihalas Ap.J. 331, 794, 1988.
|
|
c approximate evaluation of Q(beta) - Hummer
|
|
c
|
|
c Input: xn - real number corresponding to quantum number n
|
|
c a - correlation parameter
|
|
c ane - electron density
|
|
c z - ionic charge
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
parameter (p1=0.1402,p2=0.1285,p3=un,p4=3.15,p5=4.)
|
|
parameter (tkn=3.01,ckn=5.33333333,cb0=8.59d14)
|
|
parameter (f23=-2./3.)
|
|
c
|
|
cb=cb0*bergfc
|
|
c
|
|
c evaluation of k(n)
|
|
c
|
|
if(xn.le.tkn) then
|
|
xkn=un
|
|
else
|
|
xn1=un/(xn+un)
|
|
xkn=ckn*xn*xn1*xn1
|
|
end if
|
|
c
|
|
c evaluation of beta
|
|
c
|
|
beta=cb*z*z*z*xkn/(xn*xn*xn*xn)*exp(f23*log(ane))
|
|
c
|
|
c approximate expression for Q(beta)
|
|
c
|
|
x=exp(p4*log(un+p3*a))
|
|
c1=p1*(x+p5*(z-un)*a*a*a)
|
|
c2=p2*x
|
|
f=(c1*beta*beta*beta)/(un+c2*beta*sqrt(beta))
|
|
wn=f/(un+f)
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE DWNFR(MODE,N,FRE,A,ANE,Z,FR,DW)
|
|
C ==========================================
|
|
C
|
|
C Auxiliary routine to compute set of dissolved fractions
|
|
C for all frequencies
|
|
C MODE=0 -> DW=1
|
|
C MODE>0 -> DW=1-w
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
parameter (p1=0.1402,p2=0.1285,p3=un,p4=3.15,p5=4.)
|
|
parameter (tkn=3.01,ckn=5.33333333,cb0=8.59d14,f23=-2./3.)
|
|
PARAMETER (FRH=3.28805D15,SQFRH=5.734152D7)
|
|
DIMENSION FR(N),DW(N)
|
|
C
|
|
cb=cb0*berfc
|
|
IF(MODE.EQ.0) THEN
|
|
DO IJ=1,N
|
|
DW(IJ)=UN
|
|
END DO
|
|
ELSE
|
|
DO IJ=1,N
|
|
IF(FR(IJ).LT.FRE) THEN
|
|
XN=SQFRH*Z/SQRT(FRE-FR(IJ))
|
|
if(xn.le.tkn) then
|
|
xkn=un
|
|
else
|
|
xn1=un/(xn+un)
|
|
xkn=ckn*xn*xn1*xn1
|
|
end if
|
|
beta=cb*z*z*z*xkn/(xn*xn*xn*xn)*exp(f23*log(ane))
|
|
x=exp(p4*log(un+p3*a))
|
|
c1=p1*(x+p5*(z-un)*a*a*a)
|
|
c2=p2*x
|
|
f=(c1*beta*beta*beta)/(un+c2*beta*sqrt(beta))
|
|
DW(IJ)=UN-f/(un+f)
|
|
ELSE
|
|
DW(IJ)=UN
|
|
END IF
|
|
END DO
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE ODF1(IMODE,IL,IU,ID,ODF)
|
|
C ===================================
|
|
C
|
|
C opacity distribution function for overlapping lines near the series limit
|
|
C
|
|
C The lines converge to the edge of the (continuum) transition IL - IU,
|
|
C IL - index of the lower level
|
|
C IU - index of the upper level (usually the ground state of teh next ion)
|
|
C ID - depth index
|
|
C
|
|
C Output: ODF - opacity distribution function interpolated to the set of
|
|
C explicit frequencies
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
PARAMETER (FRH=3.28805D15,CQT=1.284523D12)
|
|
PARAMETER (CCOR=0.09,C00=1.25D-9,CID=0.02654,SIXTH=UN/6.)
|
|
DIMENSION FRO(MFRO),ODF0(MFRO),ABSO0(MFRO),ODF(MFREQ),SGT(MFRO),
|
|
* ALAM(MFRO),
|
|
* FROD(MFRO),SGFR(MFRO),IODF(MFRO),IODR(MFRO),DWF(MFRO)
|
|
SAVE FRO,SGFR,ODF0,IODF
|
|
C
|
|
I=NQUANT(IL)
|
|
KL=INDODF(IL)
|
|
IELO=IEL(IL)
|
|
N1H=NLAST(IELO)
|
|
NQ1=NQLODF(IL)
|
|
FRE=ENION(IL)/H
|
|
T=TEMP(ID)
|
|
SQT=SQRT(T)
|
|
ANE=ELEC(ID)
|
|
ANES=EXP(SIXTH*LOG(ANE))
|
|
F00=C00*ANES*ANES*ANES*ANES
|
|
DOP0=CQT*SQT
|
|
QZ=IZ(IELO)
|
|
C
|
|
C pseudocontinuum opacity (non-zero in all frequencies);
|
|
C formulated through the dissolved fraction
|
|
C
|
|
ITR=ITRA(IL,IU)
|
|
NFR0=NFRODF(KL)
|
|
IF(IMODE.EQ.0) THEN
|
|
DO IJ=1,NFR0
|
|
FRO(IJ)=FROS(IJ,KL)
|
|
SGFR(IJ)=SIGK(FRO(IJ),ITR,1)
|
|
ALAM(IJ)=CAS/FRO(IJ)
|
|
END DO
|
|
END IF
|
|
C
|
|
C function D(nu) - dissolved fraction
|
|
C
|
|
c CALL DWNFR(1,NFR0,FRE,ACOR,ANE,QZ,FRO,DWF)
|
|
DO IJ=1,NFR0
|
|
ABSO0(IJ)=SGFR(IJ)*DWF(IJ)
|
|
END DO
|
|
C
|
|
C summation over individual lines
|
|
C
|
|
DO J=NQ1,NLMX
|
|
XJ=J
|
|
FXK=F00*XKIJ(KL,J)
|
|
DOP=DOP0/WL0(KL,J)
|
|
DBETA=WL0(KL,J)*WL0(KL,J)/CAS/FXK
|
|
BETAD=DOP*DBETA
|
|
FID=CID*FIJ(KL,J)*DBETA
|
|
CALL DIVSTR(1)
|
|
WPROB=WNHINT(J,ID)
|
|
CALL ODFHST(NFR0,FXK,FID,WPROB,WL0(KL,J),ALAM,SGT)
|
|
DO IJ=1,NFR0
|
|
ABSO0(IJ)=ABSO0(IJ)+SGT(IJ)
|
|
END DO
|
|
END DO
|
|
C
|
|
C opacity distribution function in the internal set of frequencies
|
|
C
|
|
IF(IMODE.EQ.0) THEN
|
|
ODF0(1)=ABSO0(1)
|
|
IODF(1)=1
|
|
DO IJ=2,NFR0
|
|
ODF0(IJ)=ABSO0(IJ)
|
|
IODF(IJ)=IJ
|
|
IF(ODF0(IJ).LT.ODF0(IJ-1)) THEN
|
|
AB=ODF0(IJ)
|
|
IJODF=IODF(IJ)
|
|
DO IJ0=1,IJ-1
|
|
IJ1=IJ-IJ0+1
|
|
IF(ODF0(IJ1).GE.ODF0(IJ1-1)) GO TO 71
|
|
ODF0(IJ1)=ODF0(IJ1-1)
|
|
ODF0(IJ1-1)=AB
|
|
IODF(IJ1)=IODF(IJ1-1)
|
|
IODF(IJ1-1)=IJODF
|
|
END DO
|
|
71 CONTINUE
|
|
END IF
|
|
if(odf0(ij).gt.0.001) write(6,603) ij,id,odf0(ij)
|
|
603 format(' ij,id,odf0',2i5,1pd10.3)
|
|
END DO
|
|
ELSE
|
|
ODF0(1)=ABSO0(IODF(1))
|
|
IODR(1)=IODF(1)
|
|
DO IJ=2,NFR0
|
|
ODF0(IJ)=ABSO0(IODF(IJ))
|
|
IODR(IJ)=IODF(IJ)
|
|
IF(ODF0(IJ).LT.ODF0(IJ-1)) THEN
|
|
AB=ODF0(IJ)
|
|
IJODF=IODR(IJ)
|
|
DO IJ0=1,IJ-1
|
|
IJ1=IJ-IJ0+1
|
|
IF(ODF0(IJ1).GE.ODF0(IJ1-1)) GO TO 86
|
|
ODF0(IJ1)=ODF0(IJ1-1)
|
|
ODF0(IJ1-1)=AB
|
|
IODR(IJ1)=IODR(IJ1-1)
|
|
IODR(IJ1-1)=IJODF
|
|
END DO
|
|
86 CONTINUE
|
|
END IF
|
|
if(odf0(ij).gt.0.001) write(6,603) ij,id,odf0(ij)
|
|
END DO
|
|
DO IJ=1,NFR0
|
|
IODF(IJ)=IODR(IJ)
|
|
END DO
|
|
END IF
|
|
C
|
|
C Reinitialization of the internal frequencies set
|
|
C
|
|
FROD(1)=FRO(1)
|
|
IW=IODF(1)
|
|
IF(IW.GT.1 .AND. IW.LT.NFR0) THEN
|
|
W1=FRO(IW-1)-FRO(IW+1)
|
|
ELSE IF (IW.EQ.1) THEN
|
|
W1=FRO(1)-FRO(2)
|
|
ELSE
|
|
W1=FRO(NFR0-1)-FRO(NFR0)
|
|
END IF
|
|
DO IJ=2,NFR0-1
|
|
IW=IODF(IJ)
|
|
IF(IW.GT.1 .AND. IW.LT.NFR0) THEN
|
|
W2=HALF*(FRO(IW-1)-FRO(IW+1))
|
|
ELSE IF (IW.EQ.1) THEN
|
|
W2=HALF*(FRO(1)-FRO(2))
|
|
ELSE
|
|
W2=HALF*(FRO(NFR0-1)-FRO(NFR0))
|
|
END IF
|
|
FROD(IJ)=FROD(IJ-1)-HALF*(W1+W2)
|
|
W1=W2
|
|
END DO
|
|
IJ=NFR0
|
|
IW=IODF(IJ)
|
|
IF(IW.GT.1 .AND. IW.LT.NFR0) THEN
|
|
W2=FRO(IW-1)-FRO(IW+1)
|
|
ELSE IF (IW.EQ.1) THEN
|
|
W2=FRO(1)-FRO(2)
|
|
ELSE
|
|
W2=FRO(NFR0-1)-FRO(NFR0)
|
|
END IF
|
|
FROD(IJ)=FROD(IJ-1)-HALF*(W1+W2)
|
|
C
|
|
C Interpolated opacity distribution function to explicit frequencies
|
|
C
|
|
DO 150 IJ=2,NFREQ
|
|
IF(FREQ(IJ).GT.FREQ(IJ-1)) RETURN
|
|
ODF(IJ)=0.
|
|
IF(FREQ(IJ).GT.FROD(1).OR.FREQ(IJ).LT.FROD(NFR0)) GO TO 150
|
|
IF(ID.EQ.1) THEN
|
|
IF(FREQ(IJ-1).GT.FROD(1)) I1ODF(IL)=IJ
|
|
I2ODF(IL)=IJ
|
|
END IF
|
|
DO IJ1=2,NFR0
|
|
IJ0=IJ1
|
|
IF(FREQ(IJ).GE.FROD(IJ1)) GO TO 120
|
|
END DO
|
|
120 ODF(IJ)=ODF0(IJ0-1)+(ODF0(IJ0)-ODF0(IJ0-1))/
|
|
* (FROD(IJ0)-FROD(IJ0-1))*(FREQ(IJ)-FROD(IJ0-1))
|
|
150 CONTINUE
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE ODFHST(N,FXK,FID,WP,WL,ALAM,SG)
|
|
C ==========================================
|
|
C
|
|
C Auxiliary routine for ODF1 (replaces multiple calls to STARKA)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
PARAMETER (F0=-0.5758228,F1=0.4796232,F2=0.07209481,AL=1.26)
|
|
PARAMETER (SD=0.5641895,SLO=-2.5,THRA=1.5,BL1=1.14,BL2=11.4)
|
|
PARAMETER (SAC=0.08, THR=THRA*TWO)
|
|
DIMENSION ALAM(MFRO),SG(MFRO)
|
|
C
|
|
BETAD1=UN/BETAD
|
|
FXK1=UN/FXK
|
|
FIDWP=FID*WP
|
|
C
|
|
C for a > 1 Doppler core + asymptotic Holtzmark wing with division
|
|
C point DIV
|
|
C
|
|
IF(ADH.GT.AL) THEN
|
|
DO IJ=1,N
|
|
BETA=ABS(ALAM(IJ)-WL)*FXK1
|
|
XD=BETA*BETAD1
|
|
IF(XD.LE.DIVH) THEN
|
|
ST=SD*EXP(-XD*XD)*BETAD1
|
|
ELSE
|
|
ST=THR*EXP(SLO*LOG(BETA))
|
|
END IF
|
|
SG(IJ)=ST*FIDWP
|
|
END DO
|
|
ELSE
|
|
C
|
|
C empirical formula for a < 1
|
|
C
|
|
DO IJ=1,N
|
|
BETA=ABS(ALAM(IJ)-WL)*FXK1
|
|
XD=BETA*BETAD1
|
|
IF(BETA.LE.BL1) THEN
|
|
ST=SAC
|
|
ELSE IF(BETA.LT.BL2) THEN
|
|
XL=LOG(BETA)
|
|
FL=(F0*XL+F1)*XL
|
|
ST=F2*EXP(FL)
|
|
ELSE
|
|
ST=THR*EXP(SLO*LOG(BETA))
|
|
END IF
|
|
SG(IJ)=ST*FIDWP
|
|
END DO
|
|
END IF
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE ODFFR(IL,IU)
|
|
C =======================
|
|
C
|
|
C Internal frequencies set for opacity distribution function
|
|
C for overlapping lines near the series limit
|
|
C
|
|
C The lines converge to the edge of the (continuum) transition IL - IU,
|
|
C IL - index of the lower level
|
|
C IU - index of the upper level (usually the ground state of the next ion)
|
|
C or a mean level in the line ODF formalism
|
|
C
|
|
C Output: FROS - set of internal frequencies
|
|
C in common ODFFRQ
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
PARAMETER (FRH=3.28805D15,CDOP=2.84511D-7,CDOM=14.)
|
|
PARAMETER (SIX=6.,SEPT=7.)
|
|
DIMENSION FFRO(MFRO)
|
|
C
|
|
CH=IZ(IEL(IL))*IZ(IEL(IL))
|
|
FRION=CH*FRH
|
|
FRE=ENION(IL)/H
|
|
NF=1
|
|
NQ1=NQUANT(IU)
|
|
XL2=UN/(NQUANT(IL)*NQUANT(IL))
|
|
XU1=UN/((NQUANT(IU)-1)*(NQUANT(IU)-1))
|
|
XU2=UN/(NQUANT(IU)*NQUANT(IU))
|
|
FRC=FRION*(XL2-XU2)
|
|
FFRO(NF)=HALF*(FRC+FRION*(XL2-XU1))
|
|
KT=ITRA(IL,IU)
|
|
KL=JNDODF(KT)
|
|
DOPO=CDOP*SQRT(TEFF)*FRC
|
|
DOPM=CDOM*DOPO
|
|
FR1=FFRO(1)
|
|
C
|
|
DO I=NQ1,NLMX
|
|
II=I*I
|
|
FR2=FRE-FRION/II
|
|
DF=FR2-FR1
|
|
IF(DF.GT.DOPM) THEN
|
|
DO J=1,7
|
|
NF=NF+1
|
|
FFRO(NF)=FR1+J*DOPO
|
|
END DO
|
|
DF=FR2-SEPT*DOPO-FFRO(NF)
|
|
NI=int(DF/SIX/DOPO)
|
|
DDF=DF/(NI+1)
|
|
DO J=1,NI
|
|
NF=NF+1
|
|
FFRO(NF)=FR1+SEPT*DOPO+J*DDF
|
|
END DO
|
|
DO J=7,0,-1
|
|
NF=NF+1
|
|
FFRO(NF)=FR2-J*DOPO
|
|
END DO
|
|
FR1=FR2
|
|
ELSE
|
|
NI=int(DF/DOPO)
|
|
DDF=DF/(NI+1)
|
|
DO J=1,NI
|
|
NF=NF+1
|
|
if(nf.gt.mfro-3) then
|
|
nf=nf-1
|
|
go to 10
|
|
end if
|
|
FFRO(NF)=FR1+J*DDF
|
|
END DO
|
|
NF=NF+1
|
|
FFRO(NF)=FR2
|
|
FR1=FR2
|
|
END IF
|
|
END DO
|
|
10 CONTINUE
|
|
NF=NF+1
|
|
FFRO(NF)=FRE*0.999999999
|
|
NFRODF(KL)=NF
|
|
if(nf.gt.mfro)
|
|
* CALL QUIT('too many points for hydrogen ODF - nf.gt.mfro',
|
|
* nf,mfro)
|
|
DO I=1,NF
|
|
FROS(I,KL)=FFRO(NF-I+1)
|
|
END DO
|
|
C
|
|
C Associated weights
|
|
C
|
|
WNUS(1,KL)=HALF*(FROS(1,KL)-FROS(2,KL))
|
|
WNUS(NF,KL)=HALF*(FROS(NF-1,KL)-FROS(NF,KL))
|
|
DO I=2,NF-1
|
|
WNUS(I,KL)=HALF*(FROS(I-1,KL)-FROS(I+1,KL))
|
|
END DO
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE CHCKSE
|
|
C ==================
|
|
C
|
|
C Auxiliary output routine, which enables printing
|
|
C total rates to check statistical equilibrium at each depth.
|
|
C
|
|
C Output: unit 16: <OUT> and <IN> rates, and relative difference,
|
|
C for each level.
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (MLEVES=mlevel)
|
|
DIMENSION ROUT(MLEVES,MDEPTH),RIN(MLEVES,MDEPTH)
|
|
if(ioptab.lt.0) return
|
|
C
|
|
DO ID=1,ND
|
|
T=TEMP(ID)
|
|
HKT=HK/T
|
|
TK=HKT/H
|
|
ANE=ELEC(ID)
|
|
CALL SABOLF(ID)
|
|
DO IAT=1,NATOM
|
|
N0I=N0A(IAT)
|
|
NKI=NKA(IAT)
|
|
N1I=NKI-1
|
|
DO I=N0I,NKI
|
|
OUT=0.
|
|
XIN=0.
|
|
NKE=NNEXT(IEL(I))
|
|
DO IT=1,NTRANS
|
|
II=ILOW(IT)
|
|
JJ=IUP(IT)
|
|
IF(II.EQ.I) THEN
|
|
J=JJ
|
|
IF(LINE(IT)) THEN
|
|
AIJ=COLTAR(IT,ID)*WOP(I,ID)+RRD(IT,ID)*
|
|
* G(I)/G(J)*WOP(I,ID)*EXP(HKT*FR0(IT))
|
|
ELSE
|
|
CORR=UN
|
|
NKE=NNEXT(IEL(I))
|
|
IF(NKE.NE.J) CORR=G(NKE)/G(J)*
|
|
* EXP((ENION(NKE)-ENION(J))*TK)
|
|
AIJ=COLTAR(IT,ID)+WOP(I,ID)+RRD(IT,ID)*
|
|
* ANE*SBF(I)*CORR*WOP(I,ID)
|
|
END IF
|
|
AJI=(COLRAT(IT,ID)+RRU(IT,ID))*WOP(J,ID)
|
|
XIN=XIN+AIJ*POPUL(J,ID)
|
|
OUT=OUT+AJI
|
|
ELSE IF(JJ.EQ.I) THEN
|
|
J=II
|
|
IF(LINE(IT)) THEN
|
|
AJI=COLTAR(IT,ID)+WOP(J,ID)+RRD(IT,ID)*
|
|
* G(J)/G(I)*WOP(J,ID)*EXP(HKT*FR0(IT))
|
|
ELSE
|
|
CORR=UN
|
|
NKE=NNEXT(IEL(J))
|
|
IF(NKE.NE.I) CORR=G(NKE)/G(I)*
|
|
* EXP((ENION(NKE)-ENION(I))*TK)
|
|
AJI=COLTAR(IT,ID)*WOP(J,ID)+RRD(IT,ID)*
|
|
* ANE*SBF(J)*CORR*WOP(J,ID)
|
|
END IF
|
|
AIJ=(COLRAT(IT,ID)+RRU(IT,ID))*WOP(I,ID)
|
|
XIN=XIN+AIJ*POPUL(J,ID)
|
|
OUT=OUT+AJI
|
|
END IF
|
|
END DO
|
|
RIN(I,ID)=XIN
|
|
ROUT(I,ID)=OUT*POPUL(I,ID)
|
|
END DO
|
|
END DO
|
|
END DO
|
|
DO I=1,NLEVEL
|
|
IF(RIN(I,ND).GT.0.) THEN
|
|
WRITE(16,300) I
|
|
DO ID=1,ND
|
|
DEL=(RIN(I,ID)-ROUT(I,ID))/RIN(I,ID)
|
|
WRITE(16,310) I,ID,RIN(I,ID),ROUT(I,ID),DEL,popul(i,id)
|
|
END DO
|
|
END IF
|
|
END DO
|
|
300 FORMAT('1 Level:',I5///)
|
|
310 FORMAT(2I5,1P3E16.7,2x,e16.7)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C **************************n******************************************
|
|
C
|
|
C
|
|
SUBROUTINE ACCEL2
|
|
C =================
|
|
C
|
|
C Acceleration of convergence (from Auer 1987, in Numerical
|
|
C Radiative Transfer p. 101)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
C
|
|
IF(NITER.LT.IACC .OR. ITER.LT.IACC0) RETURN
|
|
ipng=1
|
|
if(iacd.gt.0) ipng=mod((iter-iacc),iacd)
|
|
if(.not.lac2) then
|
|
IPT=MOD(ITER,3)
|
|
IPT0=MOD(IACC,3)
|
|
IPT1=MOD((IACC+1),3)
|
|
IPT2=MOD((IACC+2),3)
|
|
IF(ITER.EQ.IACC0) THEN
|
|
DO ID=1,ND
|
|
DO IX=1,NN
|
|
PSY3(IX,ID)=PSY0(IX,ID)
|
|
END DO
|
|
END DO
|
|
ELSE IF(IPT.EQ.IPT1) THEN
|
|
DO ID=1,ND
|
|
DO IX=1,NN
|
|
PSY2(IX,ID)=PSY0(IX,ID)
|
|
END DO
|
|
END DO
|
|
ELSE IF(IPT.EQ.IPT2) THEN
|
|
DO ID=1,ND
|
|
DO IX=1,NN
|
|
PSY1(IX,ID)=PSY0(IX,ID)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
else if (ipng.ne.0) then
|
|
DO ID=1,ND
|
|
DO IX=1,NN
|
|
PSY3(IX,ID)=PSY2(IX,ID)
|
|
END DO
|
|
END DO
|
|
DO ID=1,ND
|
|
DO IX=1,NN
|
|
PSY2(IX,ID)=PSY1(IX,ID)
|
|
END DO
|
|
END DO
|
|
DO ID=1,ND
|
|
DO IX=1,NN
|
|
PSY1(IX,ID)=PSY0(IX,ID)
|
|
END DO
|
|
END DO
|
|
RETURN
|
|
end if
|
|
|
|
IF(ITER.LT.IACC) RETURN
|
|
C
|
|
A1=0.
|
|
B1=0.
|
|
B2=0.
|
|
C1=0.
|
|
C2=0.
|
|
DO IX=1,NN
|
|
IF(LSNG(IX)) THEN
|
|
DO ID=1,ND
|
|
WT=0.
|
|
IF(PSY0(IX,ID).NE.0.) WT=1./ABS(PSY0(IX,ID))
|
|
D0=PSY0(IX,ID)-PSY1(IX,ID)
|
|
D1=D0-PSY1(IX,ID)+PSY2(IX,ID)
|
|
D2=D0-PSY2(IX,ID)+PSY3(IX,ID)
|
|
A1=A1+WT*D1*D1
|
|
B1=B1+WT*D1*D2
|
|
B2=B2+WT*D2*D2
|
|
C1=C1+WT*D0*D1
|
|
C2=C2+WT*D0*D2
|
|
END DO
|
|
END IF
|
|
END DO
|
|
AB=B2*A1-B1*B1
|
|
IF(AB.EQ.0.) THEN
|
|
WRITE(6,601) ITER,AB
|
|
WRITE(10,601) ITER,AB
|
|
IACC=IACC+IACD
|
|
IACC0=IACC-3
|
|
RETURN
|
|
ENDIF
|
|
A=(B2*C1-B1*C2)/AB
|
|
B=(A1*C2-B1*C1)/AB
|
|
C
|
|
DO ID=1,ND
|
|
DO IX=1,NN
|
|
PSY0(IX,ID)=(1.-A-B)*PSY0(IX,ID)+A*PSY1(IX,ID)+
|
|
* B*PSY2(IX,ID)
|
|
END DO
|
|
END DO
|
|
WRITE(6,600) ITER
|
|
WRITE(10,600) ITER
|
|
LAC2=.TRUE.
|
|
LRES2=.FALSE.
|
|
c
|
|
c call RESOLV after evaluating the accelerated estimate
|
|
c
|
|
CALL RESOLV
|
|
LRES2=.TRUE.
|
|
RETURN
|
|
600 FORMAT(' **** ACCEL2, ITER=',I4)
|
|
601 FORMAT(' **** ACCEL2, ITER=',I4,' AB = ',F7.3)
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE ACCELP
|
|
C =================
|
|
C
|
|
C Acceleration of convergence for populations
|
|
C (from Auer 1987, in Numerical Radiative Transfer p. 101)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
COMMON/POPULS/POPUL1(MLEVEL,MDEPTH),
|
|
* POPUL2(MLEVEL,MDEPTH),POPUL3(MLEVEL,MDEPTH)
|
|
C
|
|
IF(NLAMBD.LT.IACPP.OR. ILAM.LT.IACC0P) RETURN
|
|
ipng=1
|
|
if(iacdp.gt.0) ipng=mod((ILAM-IACPP),IACDP)
|
|
if(.not.lac2p) then
|
|
IPT=MOD(ILAM,3)
|
|
IPT0=MOD(IACPP,3)
|
|
IPT1=MOD((IACPP+1),3)
|
|
IPT2=MOD((IACPP+2),3)
|
|
IF(ILAM.EQ.IACC0P) THEN
|
|
DO ID=1,ND
|
|
DO IX=1,NLEVEL
|
|
POPUL3(IX,ID)=POPUL(IX,ID)
|
|
END DO
|
|
END DO
|
|
ELSE IF(IPT.EQ.IPT1) THEN
|
|
DO ID=1,ND
|
|
DO IX=1,NLEVEL
|
|
POPUL2(IX,ID)=POPUL(IX,ID)
|
|
END DO
|
|
END DO
|
|
ELSE IF(IPT.EQ.IPT2) THEN
|
|
DO ID=1,ND
|
|
DO IX=1,NLEVEL
|
|
POPUL1(IX,ID)=POPUL(IX,ID)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
else if (ipng.ne.0) then
|
|
DO ID=1,ND
|
|
DO IX=1,NLEVEL
|
|
POPUL3(IX,ID)=POPUL2(IX,ID)
|
|
END DO
|
|
END DO
|
|
DO ID=1,ND
|
|
DO IX=1,NLEVEL
|
|
POPUL2(IX,ID)=POPUL1(IX,ID)
|
|
END DO
|
|
END DO
|
|
DO ID=1,ND
|
|
DO IX=1,NLEVEL
|
|
POPUL1(IX,ID)=POPUL(IX,ID)
|
|
END DO
|
|
END DO
|
|
RETURN
|
|
end if
|
|
|
|
IF(ILAM.LT.IACPP) RETURN
|
|
C
|
|
A1=0.
|
|
B1=0.
|
|
B2=0.
|
|
C1=0.
|
|
C2=0.
|
|
DO ID=1,ND
|
|
DO IX=1,NLEVEL
|
|
IF(POPUL(IX,ID).NE.0.) WT=1./ABS(POPUL(IX,ID))
|
|
D0=POPUL(IX,ID)-POPUL1(IX,ID)
|
|
D1=D0-POPUL1(IX,ID)+POPUL2(IX,ID)
|
|
D2=D0-POPUL2(IX,ID)+POPUL3(IX,ID)
|
|
A1=A1+WT*D1*D1
|
|
B1=B1+WT*D1*D2
|
|
B2=B2+WT*D2*D2
|
|
C1=C1+WT*D0*D1
|
|
C2=C2+WT*D0*D2
|
|
END DO
|
|
END DO
|
|
AB=B2*A1-B1*B1
|
|
IF(AB.EQ.0.) THEN
|
|
WRITE(6,601) ILAM,AB
|
|
WRITE(10,601) ILAM,AB
|
|
IACPP=IACPP+IACDP
|
|
IACC0P=IACPP-3
|
|
RETURN
|
|
ENDIF
|
|
A=(B2*C1-B1*C2)/AB
|
|
B=(A1*C2-B1*C1)/AB
|
|
C
|
|
DO ID=1,ND
|
|
DO IX=1,NLEVEL
|
|
POPUL(IX,ID)=(1.-A-B)*POPUL(IX,ID)+A*POPUL1(IX,ID)+
|
|
* B*POPUL2(IX,ID)
|
|
END DO
|
|
END DO
|
|
WRITE(6,600) ILAM
|
|
WRITE(10,600) ILAM
|
|
LAC2P=.TRUE.
|
|
600 FORMAT(' **** ACCELP, ITER=',I4)
|
|
601 FORMAT(' **** ACCELP, ITER=',I4,' AB = ',F7.3)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE TIMING(MOD,ITER)
|
|
C ===========================
|
|
C
|
|
C Timing procedure (call machine dependent routine!!)
|
|
C
|
|
CHARACTER ROUT*20
|
|
dimension dummy(2)
|
|
DATA T0/0./
|
|
SAVE T0
|
|
C
|
|
TIME=etime(dummy)
|
|
DT=TIME-T0
|
|
T0=TIME
|
|
IF(MOD.EQ.1) THEN
|
|
IP=ITER-1
|
|
ROUT=' FORMAL SOLUTION'
|
|
ELSE IF(MOD.EQ.2) THEN
|
|
IP=ITER
|
|
ROUT=' LINEARIZATION'
|
|
ENDIF
|
|
WRITE(69,600) IP,MOD,TIME,DT,ROUT
|
|
600 FORMAT(2I4,2F11.2,2X,A20)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
subroutine quit(text,i1,i2)
|
|
c
|
|
c stops the program and writes a text
|
|
c
|
|
character*(*) text
|
|
write(6,10) text,i1,i2
|
|
write(10,10) text,i1,i2
|
|
10 format(1x,a,2x,2i10)
|
|
stop
|
|
end
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE ODFSET
|
|
C =================
|
|
C
|
|
C Initialization of line ODF's
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
COMMON/STFCR/OFR(MFODF),OW(MFODF),OWSUB(MFODF),
|
|
* ODFL0(MDODF,MFODF),ODF2(MDEPTH),IFTRA(MTRANS),
|
|
* IDODF(MDODF),NDODF
|
|
DIMENSION DML(MDEPTH)
|
|
C
|
|
IDSTD=ND*2/3
|
|
NLASTE=NFREQ
|
|
ITR0=0
|
|
DO ID=1,ND
|
|
IF(DM(ID).GT.0) THEN
|
|
DML(ID)=LOG(DM(ID))
|
|
ELSE
|
|
DML(ID)=ID
|
|
END IF
|
|
END DO
|
|
C
|
|
DO 500 ION=1,NION
|
|
IND=INODF1(ION)
|
|
IF(IND.LE.0) GO TO 500
|
|
IND2=INODF2(ION)
|
|
IF(FIODF1(ION).NE.' ') OPEN(IND,FILE=FIODF1(ION),STATUS='OLD')
|
|
IF(FIODF2(ION).NE.' ') OPEN(IND2,FILE=FIODF2(ION),STATUS='OLD')
|
|
READ(IND,*,END=500) NDODF
|
|
IF(NDODF.GT.MDODF)
|
|
* CALL QUIT('too many depths for an ODF - ndodf.gt.mdodf',
|
|
* ndodf,mdodf)
|
|
READ(IND,*) (IDODF(ID),ID=1,NDODF)
|
|
IREC=0
|
|
10 CONTINUE
|
|
READ(IND,*,END=500) II,JJ,FR,NFRO,FAV
|
|
IF(NFRO.GT.MFODF)
|
|
* CALL QUIT('too many frequencies for an ODF - nfro.gt.mfodf',
|
|
* nfro,mfodf)
|
|
DO IJ=1,NFRO
|
|
READ(IND,*) OFR(IJ),OW(IJ),OWSUB(IJ)
|
|
END DO
|
|
IND2=INODF2(ION)
|
|
READ(IND2,*) ((ODFL0(ID,IF),ID=1,NDODF),IF=1,NFRO)
|
|
IREC=IREC+1
|
|
C
|
|
N0=NFIRST(ION)-1
|
|
I=II+N0
|
|
J=JJ+N0
|
|
IF(J.GT.NLAST(ION)) GO TO 10
|
|
IF(I.GE.NLAST(ION)) GO TO 500
|
|
ITR=ITRA(I,J)
|
|
IF(ITR.EQ.ITR0) THEN
|
|
ITR1=0
|
|
IF(IF1.EQ.1) THEN
|
|
IFIJ=0
|
|
DO 30 IT=1,NTRANS
|
|
IF(ILOW(IT).NE.I.OR.IUP(IT).NE.J) GO TO 30
|
|
IF(IT.EQ.ITR) GO TO 30
|
|
IFIJ=IFIJ+1
|
|
IFTRA(IT)=IFIJ
|
|
30 CONTINUE
|
|
IF1=0
|
|
END IF
|
|
DO IT=1,NTRANS
|
|
IF(IFTRA(IT).GT.0) THEN
|
|
ITR1=IT
|
|
GO TO 50
|
|
END IF
|
|
END DO
|
|
50 CONTINUE
|
|
IF(ITR1.EQ.0) THEN
|
|
WRITE(6,601) ITR,N0,II,JJ
|
|
STOP
|
|
601 FORMAT(' CONFLICT IN ODF INPUT; ITR=',4I5)
|
|
END IF
|
|
ITR=ITR1
|
|
IFTRA(ITR)=0
|
|
OSC0(ITR)=FAV
|
|
ELSE
|
|
ITR0=ITR
|
|
IF1=1
|
|
OSC0(ITR)=FAV
|
|
END IF
|
|
C
|
|
MODE=IABS(INDEXP(ITR))
|
|
IF(MODE.EQ.3.OR.MODE.EQ.4) THEN
|
|
LCOMP(ITR)=.FALSE.
|
|
INTMOD(ITR)=5
|
|
END IF
|
|
IFRQ0=IFR0(ITR)
|
|
IFRQ1=IFR1(ITR)
|
|
IF(OFR(1).GE.OFR(NFRO)) THEN
|
|
IF(MODE.EQ.3) THEN
|
|
IFR0(ITR)=NLASTE+1
|
|
IFR1(ITR)=NLASTE+NFRO
|
|
DO IJ=1,NFRO
|
|
FREQ(IJ+NLASTE)=OFR(IJ)
|
|
W(IJ+NLASTE)=OW(IJ)
|
|
END DO
|
|
IF(NDODF.EQ.1) THEN
|
|
DO ID=1,ND
|
|
DO IJ=1,NFRO
|
|
PRFLIN(ID,IJ+NLASTE)=real(ODFL0(1,IJ))
|
|
END DO
|
|
END DO
|
|
ELSE
|
|
DO ID=1,ND
|
|
ID1=1
|
|
DO IDO=1,NDODF-1
|
|
IF(ID.GE.IDODF(IDO).AND.ID.LE.IDODF(IDO+1)) THEN
|
|
ID1=IDO
|
|
ID2=IDO+1
|
|
GO TO 140
|
|
END IF
|
|
END DO
|
|
140 CONTINUE
|
|
IF(ID2.GT.NDODF) ID2=NDODF
|
|
IF(ID1.EQ.ID2) THEN
|
|
A1=1.
|
|
A2=0.
|
|
ELSE
|
|
X=DML(IDODF(ID2))-DML(IDODF(ID1))
|
|
A1=(DML(IDODF(ID2))-DML(ID))/X
|
|
A2=UN-A1
|
|
END IF
|
|
DO IJ=1,NFRO
|
|
IF(ODFL0(ID1,IJ).LE.0.OR.
|
|
* ODFL0(ID2,IJ).LE.0) THEN
|
|
PRFLIN(ID,IJ+NLASTE)=0.
|
|
ELSE
|
|
X=EXP(A1*LOG(ODFL0(ID1,IJ))+
|
|
* A2*LOG(ODFL0(ID2,IJ)))
|
|
PRFLIN(ID,IJ+NLASTE)=real(X)
|
|
END IF
|
|
END DO
|
|
END DO
|
|
END IF
|
|
C
|
|
IF(IPROF(ITR).EQ.0) THEN
|
|
DO ID=1,ND
|
|
PRFLIN(ID,IFR1(ITR))=0.
|
|
END DO
|
|
END IF
|
|
DO IJ=1,NFRO
|
|
PROF(IJ+NLASTE)=PRFLIN(IDSTD,IJ+NLASTE)
|
|
END DO
|
|
NLASTE=IFR1(ITR)
|
|
END IF
|
|
ELSE
|
|
IF(MODE.EQ.3) THEN
|
|
IFR0(ITR)=NLASTE+1
|
|
IFR1(ITR)=NLASTE+NFRO
|
|
DO IJ=1,NFRO
|
|
FREQ(IJ+NLASTE)=OFR(NFRO-IJ+1)
|
|
W(IJ+NLASTE)=OW(NFRO-IJ+1)
|
|
END DO
|
|
IF(NDODF.EQ.1) THEN
|
|
DO ID=1,ND
|
|
DO IJ=1,NFRO
|
|
PRFLIN(ID,IJ+NLASTE)=real(ODFL0(1,NFRO-IJ+1))
|
|
END DO
|
|
END DO
|
|
ELSE
|
|
DO ID=1,ND
|
|
ID1=1
|
|
DO IDO=1,NDODF-1
|
|
IF(ID.GE.IDODF(IDO).AND.ID.LE.IDODF(IDO+1)) THEN
|
|
ID1=IDO
|
|
ID2=IDO+1
|
|
GO TO 240
|
|
END IF
|
|
END DO
|
|
240 CONTINUE
|
|
IF(ID2.GT.NDODF) ID2=NDODF
|
|
IF(ID1.EQ.ID2) THEN
|
|
A1=1.
|
|
A2=0.
|
|
ELSE
|
|
X=DML(IDODF(ID2))-DML(IDODF(ID1))
|
|
A1=(DML(IDODF(ID2))-DML(ID))/X
|
|
A2=UN-A1
|
|
END IF
|
|
DO IJ=1,NFRO
|
|
IJ0=NFRO-IJ+1
|
|
IF(ODFL0(ID1,IJ0).LE.0.OR.ODFL0(ID2,IJ0).LE.0)
|
|
* THEN
|
|
PRFLIN(ID,IJ+NLASTE)=0.
|
|
ELSE
|
|
X=EXP(A1*LOG(ODFL0(ID1,IJ0))+
|
|
* A2*LOG(ODFL0(ID2,IJ0)))
|
|
PRFLIN(ID,IJ+NLASTE)=REAL(X)
|
|
END IF
|
|
END DO
|
|
END DO
|
|
END IF
|
|
C
|
|
IF(IPROF(ITR).EQ.0) THEN
|
|
DO ID=1,ND
|
|
PRFLIN(ID,IFR0(ITR))=0.
|
|
END DO
|
|
END IF
|
|
DO IJ=1,NFRO
|
|
PROF(IJ+NLASTE)=PRFLIN(IDSTD,IJ+NLASTE)
|
|
END DO
|
|
NLASTE=IFR1(ITR)
|
|
END IF
|
|
END IF
|
|
IF(NLASTE.GT.MFREQ)
|
|
* CALL QUIT(' too many frequencies in ODFSET - nlaste.gt.mfreq',
|
|
* nlaste,mfreq)
|
|
IF(INDEXP(ITR).NE.0) THEN
|
|
CALL IJALIS(ITR,IFRQ0,IFRQ1)
|
|
END IF
|
|
GO TO 10
|
|
500 CONTINUE
|
|
C
|
|
NFREQ=NLASTE
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE ODFHYS(DOPO)
|
|
C =======================
|
|
C
|
|
C Initialization of line ODF's for hydrogen
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
PARAMETER (CCM=UN/2.997925D10,THIRD=UN/3.,FRH=3.28805D15)
|
|
DIMENSION FFRO(MFRO)
|
|
C
|
|
izzh=1
|
|
IF(ISPODF.GE.1) THEN
|
|
DO 200 ITR=1,NTRANS
|
|
JND=JNDODF(ITR)
|
|
MODE=IABS(INDEXP(ITR))
|
|
IF(JND.LE.0 .OR. MODE.NE.2) GO TO 200
|
|
LINEXP(ITR)=.FALSE.
|
|
LCOMP(ITR)=.FALSE.
|
|
INTMOD(ITR)=6
|
|
I=ILOW(ITR)
|
|
J=IUP(ITR)
|
|
NQLODF(I)=IABS(IPROF(ITR))
|
|
IF(NQLODF(I).EQ.0) NQLODF(I)=NQUANT(J)
|
|
OSC0(ITR)=0.
|
|
IS=NQUANT(I)
|
|
DO K=NQUANT(J),NLMX
|
|
CALL STARK0(IS,K,izzh,XKIJ(JND,K),WL0(JND,K),
|
|
* FIJ(JND,K))
|
|
OSC0(ITR)=OSC0(ITR)+FIJ(JND,K)
|
|
END DO
|
|
200 CONTINUE
|
|
RETURN
|
|
END IF
|
|
C
|
|
NLASTE=NFREQ
|
|
DO 100 ITR=1,NTRANS
|
|
JND=JNDODF(ITR)
|
|
MODE=IABS(INDEXP(ITR))
|
|
IF(JND.LE.0 .OR. MODE.NE.2) GO TO 100
|
|
LCOMP(ITR)=.FALSE.
|
|
INTMOD(ITR)=6
|
|
I=ILOW(ITR)
|
|
J=IUP(ITR)
|
|
NQLODF(I)=IABS(IPROF(ITR))
|
|
IF(NQLODF(I).EQ.0) NQLODF(I)=NQUANT(J)
|
|
XJ2A=HALF*(XI2(NQUANT(J))+XI2(NQUANT(J)-1))
|
|
C
|
|
C set up explicit frequencies & weights
|
|
C
|
|
NFRO=0
|
|
DO IFQ=1,4
|
|
NFRO=NFRO+KDO(IFQ,JND)
|
|
END DO
|
|
NFRO=NFRO-2
|
|
FRION=FRH*IZ(IEL(I))*IZ(IEL(I))
|
|
FRA=FRION*(XI2(NQUANT(I))-XJ2A)
|
|
DOPI=DOPO*FRA*CCM
|
|
FRB=0.99999999*FRION*XI2(NQUANT(I))
|
|
IFRQ0=IFR0(ITR)
|
|
IFRQ1=IFR1(ITR)
|
|
IFR0(ITR)=NLASTE+1
|
|
IFR1(ITR)=NLASTE+NFRO
|
|
I1ODF(I)=IFR0(ITR)
|
|
I2ODF(I)=IFR1(ITR)-1
|
|
FFRO(1)=0.99999999*FRA
|
|
FFRO(2)=FRA
|
|
IJ00=1
|
|
DO IK=1,3
|
|
DO IJ=2,KDO(IK,JND)
|
|
IJQ=IJ00+IJ
|
|
FFRO(IJQ)=FFRO(IJQ-1)+XDO(IK,JND)*DOPI
|
|
END DO
|
|
IJ00=IJ00+KDO(IK,JND)-1
|
|
END DO
|
|
do ij=1,ij00
|
|
if(ffro(ij).lt.frb) nfrb=ij
|
|
end do
|
|
if(nfrb.eq.ij00) then
|
|
IJ00=IJ00+1
|
|
FFRO(NFRO)=0.99999999*FRION*XI2(NQUANT(I))
|
|
do while (ffro(ij00).ge.ffro(nfro))
|
|
xdo(3,jnd)=0.75*xdo(3,jnd)
|
|
ij00=ij00-kdo(3,jnd)
|
|
do ij=2,kdo(3,jnd)
|
|
ijq=ij00+ij
|
|
ffro(ijq)=ffro(ijq-1)+xdo(3,jnd)*dopi
|
|
end do
|
|
ij00=ij00+kdo(3,jnd)
|
|
enddo
|
|
TIDO=(FFRO(NFRO)-FFRO(IJ00))/FLOAT(KDO(4,JND)-1)
|
|
DO IJ=1,KDO(4,JND)-2
|
|
IJQ=NFRO-IJ
|
|
FFRO(IJQ)=FFRO(NFRO)-FLOAT(IJ)*TIDO
|
|
END DO
|
|
else
|
|
TIDO=(FRB-FFRO(nfrb))*third
|
|
ffro(nfrb+1)=FFRO(nfrb)+tido
|
|
ffro(nfrb+2)=frb-tido
|
|
ffro(nfrb+3)=frb
|
|
nfro=nfrb+3
|
|
IFR1(ITR)=NLASTE+NFRO
|
|
I2ODF(I)=IFR1(ITR)-1
|
|
endif
|
|
DO IJ=1,NFRO
|
|
FREQ(NLASTE+IJ)=FFRO(NFRO-IJ+1)
|
|
END DO
|
|
W(NLASTE+NFRO)=HALF*(FREQ(NLASTE+NFRO-1)-FREQ(NLASTE+NFRO))
|
|
W(NLASTE+NFRO-1)=W(NLASTE+NFRO)
|
|
DO IJ=2,NFRO-2,2
|
|
TIDO=(FREQ(NLASTE+IJ)-FREQ(NLASTE+IJ+1))*THIRD
|
|
W(NLASTE+IJ-1)=W(NLASTE+IJ-1)+TIDO
|
|
W(NLASTE+IJ)=W(NLASTE+IJ)+4.*TIDO
|
|
W(NLASTE+IJ+1)=W(NLASTE+IJ+1)+TIDO
|
|
END DO
|
|
NLASTE=IFR1(ITR)
|
|
C
|
|
C set up internal frequencies & Stark parameters
|
|
C
|
|
CALL ODFFR(I,J)
|
|
OSC0(ITR)=0.
|
|
IS=NQUANT(I)
|
|
DO K=NQUANT(J),NLMX
|
|
CALL STARK0(IS,K,izzh,XKIJ(JND,K),WL0(JND,K),FIJ(JND,K))
|
|
OSC0(ITR)=OSC0(ITR)+FIJ(JND,K)
|
|
END DO
|
|
IF(INDEXP(ITR).NE.0) THEN
|
|
CALL IJALIS(ITR,IFRQ0,IFRQ1)
|
|
END IF
|
|
100 CONTINUE
|
|
C
|
|
NFREQ=NLASTE
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE ODFMER
|
|
C =================
|
|
C
|
|
C Opacity distribution function for superlines to merged states
|
|
C (calculated only if DT/T>=CHTL, kept constant after).
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
PARAMETER (CHTL=1.D-3)
|
|
C
|
|
DO 10 ITR=1,NTRANS
|
|
IF(.NOT.LINE(ITR).OR.IABS(INDEXP(ITR)).NE.2) GO TO 10
|
|
DO ID=1,ND
|
|
IF(INIT.EQ.1 .OR. ABS(CHANT(ID)).GE.CHTL)
|
|
* CALL ODFHYD(ID,ITR)
|
|
END DO
|
|
10 CONTINUE
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE ODFHYD(ID,ITR)
|
|
C =========================
|
|
C
|
|
C Line ODF's for hydrogen line series
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
PARAMETER (CDOP=TWO*BOLK/HMASS)
|
|
PARAMETER (CA=2.997925D18,CCM=CA/1.D8,FRH=3.28805D15)
|
|
PARAMETER (RYDEL=911.764,TTW=2./3.)
|
|
PARAMETER (C00=1.25D-9,CID=0.02654)
|
|
DIMENSION SIG(MFRO),SGT(MFRO),ODF(MFRO),IODF(MFRO)
|
|
DIMENSION YNUS(MFRO),ALAM(MFRO)
|
|
C
|
|
JO=JNDODF(ITR)
|
|
IF(ISPODF.EQ.0) THEN
|
|
NF=NFRODF(JO)
|
|
DO IJ=1,NF
|
|
IODF(IJ)=0
|
|
SIG(IJ)=0.
|
|
ODF(IJ)=0.
|
|
YNUS(IJ)=FROS(IJ,JO)
|
|
ALAM(IJ)=CAS/YNUS(IJ)
|
|
END DO
|
|
ELSE
|
|
NF=IFR1(ITR)-IFR0(ITR)+1
|
|
DO IJ=1,NF
|
|
SIG(IJ)=0.
|
|
YNUS(IJ)=FREQ(IFR0(ITR)+IJ-1)
|
|
ALAM(IJ)=CAS/YNUS(IJ)
|
|
END DO
|
|
END IF
|
|
C
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
ANES=EXP(TTW*LOG(ELEC(ID)))
|
|
F00=C00*ANES
|
|
FRA=FRH*(XI2(NQUANT(II))-XI2(NQUANT(JJ)))
|
|
DOPO=FRA/CCM*SQRT(CDOP*TEMP(ID)+VTB*VTB)
|
|
DO J=NQLODF(II),NLMX
|
|
WL=RYDEL/(XI2(NQUANT(II))-XI2(J))
|
|
FXK=F00*XKIJ(JO,J)
|
|
DBETA=WL*WL/CA/FXK
|
|
BETAD=DBETA*DOPO
|
|
FID=CID*FIJ(JO,J)*DBETA
|
|
CALL DIVSTR(1)
|
|
WPROB=WNHINT(J,ID)
|
|
CALL ODFHST(NF,FXK,FID,WPROB,WL,ALAM,SGT)
|
|
DO IJ=1,NF
|
|
SIG(IJ)=SIG(IJ)+SGT(IJ)
|
|
END DO
|
|
END DO
|
|
C
|
|
IF(ISPODF.EQ.0) THEN
|
|
CALL INDEXX(NF,SIG,IODF)
|
|
DO IJ=1,NF
|
|
ODF(IJ)=SIG(IODF(IJ))
|
|
END DO
|
|
I0=IFR0(ITR)
|
|
I1=IFR1(ITR)
|
|
IF(IABS(INDEXP(ITR)).EQ.2) YNUS(1)=FREQ(I0)
|
|
IW1=IODF(1)
|
|
DO IJ=2,NF
|
|
IW2=IODF(IJ)
|
|
IF(IJ.GT.2 .AND. IJ.LT.NF) THEN
|
|
YNUS(IJ)=YNUS(IJ-1)-HALF*(WNUS(IW1,JO)+WNUS(IW2,JO))
|
|
ELSE IF (IJ.EQ.2) THEN
|
|
YNUS(IJ)=YNUS(IJ-1)-HALF*(TWO*WNUS(IW1,JO)+WNUS(IW2,JO))
|
|
ELSE IF (IJ.EQ.NF) THEN
|
|
YNUS(IJ)=YNUS(IJ-1)-HALF*(WNUS(IW1,JO)+TWO*WNUS(IW2,JO))
|
|
END IF
|
|
IW1=IW2
|
|
END DO
|
|
END IF
|
|
C
|
|
IF(ISPODF.EQ.0) THEN
|
|
PRFLIN(ID,I1)=1.E-35
|
|
DO IJQ=I0,I1-1
|
|
DO IJ=2,NF
|
|
JI=IJ
|
|
IF(YNUS(IJ).LE.FREQ(IJQ)) GO TO 70
|
|
END DO
|
|
70 PRFLN=ODF(JI-1)+(ODF(JI)-ODF(JI-1))*
|
|
* (FREQ(IJQ)-YNUS(JI-1))/(YNUS(JI)-YNUS(JI-1))
|
|
PRFLIN(ID,IJ0)=real(PRFLN)
|
|
END DO
|
|
ELSE
|
|
DO IJ=1,NF
|
|
PRFLIN(ID,KFR0(ITR)+IJ-1)=real(SIG(IJ))
|
|
END DO
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE INDEXX(N,ARRIN,INDX)
|
|
C ===============================
|
|
C
|
|
C Sorting routine
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
DIMENSION ARRIN(N),INDX(N)
|
|
DO J=1,N
|
|
INDX(J)=J
|
|
END DO
|
|
M=N/2+1
|
|
IR=N
|
|
10 CONTINUE
|
|
IF(M.GT.1)THEN
|
|
M=M-1
|
|
INDXT=INDX(M)
|
|
Q=ARRIN(INDXT)
|
|
ELSE
|
|
INDXT=INDX(IR)
|
|
Q=ARRIN(INDXT)
|
|
INDX(IR)=INDX(1)
|
|
IR=IR-1
|
|
IF(IR.EQ.1)THEN
|
|
INDX(1)=INDXT
|
|
RETURN
|
|
END IF
|
|
END IF
|
|
I=M
|
|
J=M+M
|
|
20 IF(J.LE.IR)THEN
|
|
IF(J.LT.IR)THEN
|
|
IF(ARRIN(INDX(J)).LT.ARRIN(INDX(J+1)))J=J+1
|
|
END IF
|
|
IF(Q.LT.ARRIN(INDX(J))) THEN
|
|
INDX(I)=INDX(J)
|
|
I=J
|
|
J=J+J
|
|
ELSE
|
|
J=IR+1
|
|
ENDIF
|
|
GO TO 20
|
|
END IF
|
|
INDX(I)=INDXT
|
|
GO TO 10
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE SIGAVE
|
|
C =================
|
|
C
|
|
C Read bound-free cross-sections for averaged levels
|
|
C from the unit INSA (given by IFANCY), with increasing frequencies
|
|
C It assumes that all continuum transitions for a given ion are
|
|
C given in a successive order in the data
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
PARAMETER (HCCM=H*2.997925D10)
|
|
PARAMETER (TX=2.30258509299405,BAM=1.e-18)
|
|
DIMENSION XIFE(8)
|
|
DIMENSION FRINSG(MFREQ),CRIN(MFREQ),JKF(MFREQ)
|
|
C
|
|
DATA XIFE/63480.,130563.,247220.,442000.,605000.,799000.,
|
|
* 1008000.,1218380./
|
|
C
|
|
NFREQB=NFREQ
|
|
IF(IBFINT.GT.0) NFREQB=NFREQC
|
|
ITR=0
|
|
10 ITR=ITR+1
|
|
IF(ITR.GT.NTRANS) RETURN
|
|
IC=ITRA(IUP(ITR),ILOW(ITR))
|
|
INSA=IBF(IC)
|
|
IF(INSA.LT.50 .OR. INSA.GT.100) GO TO 10
|
|
IE=IEL(ILOW(ITR))
|
|
ITR=ITR-1
|
|
NL1=NFIRST(IE)
|
|
NL2=NLAST(IE)
|
|
IF(FIBFCS(IE).NE.' ') THEN
|
|
INSA=INBFCS(IE)
|
|
OPEN(INSA,FILE=FIBFCS(IE),STATUS='OLD')
|
|
END IF
|
|
READ(INSA,*,END=500,ERR=500) IERR,IZRR,NLRR
|
|
DO 100 I=NL1,NL2
|
|
ITR=ITR+1
|
|
IF(INDEXP(ITR).EQ.0) GO TO 100
|
|
IC=ITRA(IUP(ITR),ILOW(ITR))
|
|
READ(INSA,*) INL,ECMR,GDUM,NFIS
|
|
IF(IERR.NE.26) GO TO 20
|
|
ECMR=XIFE(IZRR)-ECMR
|
|
DE=ABS((ENION(ILOW(ITR))-HCCM*ECMR)/ENION(ILOW(ITR)))
|
|
IF(DE.GT.2.D-2) THEN
|
|
PRINT *,INSA,IE,ITR,I
|
|
END IF
|
|
20 DO IJ=1,NFIS
|
|
JI=NFIS-IJ+1
|
|
READ(INSA,*,END=500,ERR=500) FRINSG(JI),CRIN(JI)
|
|
END DO
|
|
DO IJ=1,NFREQB
|
|
JK=0
|
|
FR=FREQ(IJ)
|
|
IF(ISPODF.GE.1) FR=FREQ(IFREQB(IJ))
|
|
DO IK=1,NFIS
|
|
IF(FR.GT.FRINSG(IK)) THEN
|
|
JK=IK
|
|
GO TO 40
|
|
END IF
|
|
END DO
|
|
JK=NFIS
|
|
40 IF(JK.EQ.1) JK=2
|
|
JKF(IJ)=JK
|
|
END DO
|
|
DO IJ=1,NFREQB
|
|
JK=JKF(IJ)
|
|
FR=FREQ(IJ)
|
|
IF(ISPODF.GE.1) FR=FREQ(IFREQB(IJ))
|
|
IF(CRIN(JK-1).EQ.0. .OR. CRIN(JK).EQ.0.) THEN
|
|
BFCS (IC,IJ)=real(CRIN(JK)+(FR-FRINSG(JK))/
|
|
* (FRINSG(JK-1)-FRINSG(JK))*(CRIN(JK-1)-CRIN(JK)))
|
|
ELSE
|
|
XF1=LOG10(FRINSG(JK-1))
|
|
XF2=LOG10(FRINSG(JK))
|
|
YS1=LOG10(CRIN(JK-1))
|
|
YS2=LOG10(CRIN(JK))
|
|
XXF=LOG10(FR)
|
|
YYF=(XXF-XF2)/(XF1-XF2)*(YS1-YS2)+YS2
|
|
EXTX=EXP(TX*YYF)
|
|
BFCS(IC,IJ)=real(EXTX)
|
|
END IF
|
|
BFCS(IC,IJ)=real(BAM*BFCS(IC,IJ))
|
|
END DO
|
|
100 CONTINUE
|
|
GO TO 10
|
|
500 CALL QUIT
|
|
*('error in data for bf-cs of averaged levels - itr,ie:',
|
|
* itr,ie)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C *********************************************************************
|
|
C
|
|
c
|
|
subroutine readbf(ius)
|
|
c ======================
|
|
c
|
|
c auxiliary subroutine for enabling reading of input data with
|
|
c comments
|
|
c
|
|
c lines beginning with ! or * are understood as comments
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
character*80 buff
|
|
c
|
|
iur=ius
|
|
if(iur.eq.0) iur=5
|
|
iuw=ibuff
|
|
if(iur.ne.5) iuw=95
|
|
c
|
|
10 continue
|
|
read(iur,501,end=20) buff
|
|
c PRINT *, 'READ LINE:', TRIM(BUFF)
|
|
if(buff(1:1).eq.'!'.or.buff(1:1).eq.'*') go to 10
|
|
write(iuw,501) buff
|
|
go to 10
|
|
c
|
|
20 continue
|
|
rewind iuw
|
|
return
|
|
501 format(a)
|
|
end
|
|
C
|
|
C
|
|
C *******************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE CORRWM
|
|
C =================
|
|
C
|
|
C The routine for management of various flags for treating
|
|
C frequency points; in particular those connected to the so-called
|
|
C "subtraction weights" (in the non-overlapping mode only)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (T15=1.D-15)
|
|
C
|
|
NFREQE=0
|
|
DO 10 IJ=1,NFREQ
|
|
IJEX(IJ)=0
|
|
DO ID=1,ND
|
|
LSKIP(ID,IJ)=.FALSE.
|
|
END DO
|
|
if(ifprad.eq.0) then
|
|
do id=1,nd
|
|
lskip(id,ij)=.true.
|
|
end do
|
|
end if
|
|
IF(IJALI(IJ).NE.0) GO TO 10
|
|
NFREQE=NFREQE+1
|
|
IJEX(IJ)=NFREQE
|
|
IJFR(NFREQE)=IJ
|
|
10 CONTINUE
|
|
c
|
|
if(ifryb.ne.0) then
|
|
nfreqe=0
|
|
do ij=1,nfreq
|
|
ijex(ij)=0
|
|
end do
|
|
end if
|
|
C
|
|
IF(IBFINT.LE.0) THEN
|
|
DO IJ=1,NFREQ
|
|
IJBF(IJ)=IJ
|
|
AIJBF(IJ)=UN
|
|
END DO
|
|
ELSE
|
|
IF(ISPODF.EQ.0) THEN
|
|
DO IJ=1,NFREQC
|
|
IJBF(IJ)=IJ
|
|
AIJBF(IJ)=UN
|
|
END DO
|
|
IF(NFREQ.GT.NFREQC) THEN
|
|
DO IJ=NFREQC+1,NFREQ
|
|
FR=FREQ(IJ)
|
|
IJ0=1
|
|
DO IJT=1,NFREQC
|
|
IF(FREQ(IJT).LE.FR) THEN
|
|
IJ0=IJT
|
|
GO TO 12
|
|
END IF
|
|
END DO
|
|
12 IJ1=IJ0-1
|
|
A1=(FR-FREQ(IJ0))/(FREQ(IJ1)-FREQ(IJ0))
|
|
IJBF(IJ)=IJ1
|
|
AIJBF(IJ)=A1
|
|
END DO
|
|
END IF
|
|
ELSE
|
|
DO IJ=1,NFREQC-1
|
|
IJ0=IFREQB(IJ)
|
|
IJ1=IFREQB(IJ+1)
|
|
DO KJ=IJ0,IJ1-1
|
|
IJBF(KJ)=IJ
|
|
AIJBF(KJ)=(FREQ(KJ)-FREQ(IJ1))/(FREQ(IJ0)-FREQ(IJ1))
|
|
END DO
|
|
END DO
|
|
IJ0=IFREQB(NFREQC)
|
|
IJBF(IJ0)=NFREQC
|
|
AIJBF(IJ0)=UN
|
|
END IF
|
|
END IF
|
|
C
|
|
if(nfreqe.gt.mfrex) CALL QUIT('nfreqe.gt.mfrex',nfreqe,mfrex)
|
|
C
|
|
DO 100 ITR=1,NTRANS
|
|
IF(.NOT.LINE(ITR)) GO TO 100
|
|
C
|
|
C first set up array LSKIP(ID,IJ), which has values
|
|
C TRUE - if the radiation at frequency point IJ does not contribute
|
|
C radiation pressure (ie. this point belongs to a transition
|
|
C for which the user required the radiation pressure to be
|
|
C skipped - IABS(INDEXP) chosen as 9 or 19)
|
|
C FALSE - normal calculatitn of radiation pressure
|
|
C
|
|
INX=IABS(INDEXP(ITR))
|
|
IF(INX.EQ.9.OR.INX.GE.19) THEN
|
|
DO IJ=IFR0(ITR),IFR1(ITR)
|
|
DO ID=1,ND
|
|
LSKIP(ID,IJ)=.TRUE.
|
|
END DO
|
|
END DO
|
|
END IF
|
|
100 CONTINUE
|
|
C
|
|
IF(NFREQE.GT.0) WRITE(6,609)
|
|
DO 110 IJ=1,NFREQ
|
|
FR15=FREQ(IJ)*T15
|
|
W0E(IJ)=W(IJ)*PI4H/FREQ(IJ)
|
|
BNUE(IJ)=BN*FR15*FR15*FR15
|
|
IF(IJALI(IJ).NE.0.or.ifryb.gt.0) GO TO 110
|
|
if(ispodf.eq.0) then
|
|
WRITE(6,610) IJ,FREQ(IJ),W(IJ),PROF(IJ)
|
|
else
|
|
WRITE(6,610) IJ,FREQ(IJ),W(IJ)
|
|
end if
|
|
110 CONTINUE
|
|
C
|
|
DO IJ=1,NFREQ
|
|
WC(IJ)=W(IJ)
|
|
IF(IJALI(IJ).LE.0) WC(IJ)=0.
|
|
END DO
|
|
C
|
|
609 FORMAT(1H0//' FREQUENCY POINTS AND WEIGHTS - EXPLICIT'/
|
|
* ' ---------------------------------------'//
|
|
* ' IJ',7X,'FREQ',13X,'WEIGHT',11X,'PROF'/)
|
|
610 FORMAT(1H ,I8,1P2D17.8,D15.5,D17.8)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C *******************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE IJALIS(ITR,IFRQ0,IFRQ1)
|
|
C ==================================
|
|
C
|
|
C auxiliary routine - sets up the necessary flags for ALI treatment
|
|
C of individual transitions (in the fully hybrid CL/ALI scheme)
|
|
C
|
|
C Output:
|
|
C
|
|
C IJALI(IJ) = 0 - frequency point IJ is an explicit point
|
|
C = 1 - frequency point IJ is an ALI point
|
|
C
|
|
C LEXP(ITR) = T - at least one point within transition ITR is explicit
|
|
C LEXP(ITR) = F - no point within transition ITR is explicit
|
|
C LALI(ITR) = T - at least one point within transition ITR is ALI
|
|
C LALI(ITR) = F - no point within transition ITR is ALI
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
C
|
|
c NFRECL=NFREQ
|
|
c if(nfrecl.ge.nfreq) return
|
|
INDXP=INDEXP(ITR)
|
|
I0=IFR0(ITR)
|
|
I1=IFR1(ITR)
|
|
NF=I1-I0+1
|
|
DO IJ=I0,I1
|
|
IF(INDXP.GT.0) THEN
|
|
IJALI(IJ)=0
|
|
ELSE IF(INDXP.LT.0) THEN
|
|
IJALI(IJ)=1
|
|
END IF
|
|
END DO
|
|
C
|
|
C primarily explicit transitions
|
|
C
|
|
IF(INDXP.GT.0) THEN
|
|
LEXP(ITR)=.TRUE.
|
|
LALI(ITR)=.FALSE.
|
|
IF(IFRQ0.GT.0.and.iadop(iatm(ilow(itr))).eq.0) THEN
|
|
LALI(ITR)=.TRUE.
|
|
IF(IFRQ1.EQ.0.OR.IFRQ1.GT.NF) IFRQ1=NF
|
|
DO I=IFRQ0,IFRQ1
|
|
IJALI(I0+I-1)=1
|
|
END DO
|
|
ELSE IF(IFRQ0.LT.0) THEN
|
|
LALI(ITR)=.TRUE.
|
|
READ(57,*) (IJALI(IJ),IJ=I0,I1)
|
|
END IF
|
|
IF(IFRQ0.EQ.1.AND.IFRQ1.EQ.NF) LEXP(ITR)=.FALSE.
|
|
ELSE IF(INDXP.LT.0) THEN
|
|
C
|
|
C primarily ALI transitions
|
|
C
|
|
LALI(ITR)=.TRUE.
|
|
LEXP(ITR)=.FALSE.
|
|
IF(IFRQ0.GT.0.and.iadop(iatm(ilow(itr))).eq.0) THEN
|
|
LEXP(ITR)=.TRUE.
|
|
IF(IFRQ1.EQ.0.OR.IFRQ1.GT.NF) IFRQ1=NF
|
|
DO I=IFRQ0,IFRQ1
|
|
IJALI(I0+I-1)=0
|
|
END DO
|
|
ELSE IF(IFRQ0.LT.0) THEN
|
|
LEXP(ITR)=.TRUE.
|
|
READ(57,*) (IJALI(IJ),IJ=I0,I1)
|
|
END IF
|
|
IF(IFRQ0.EQ.1.AND.IFRQ1.EQ.NF) LALI(ITR)=.FALSE.
|
|
END IF
|
|
IF(NFFIX.GT.0) THEN
|
|
DO IJ=I0,I1
|
|
IJALI(IJ)=1
|
|
END DO
|
|
LALI(ITR)=.TRUE.
|
|
LEXP(ITR)=.FALSE.
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C *******************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE IJALI2
|
|
C =================
|
|
C
|
|
C auxiliary routine - sets up the necessary flags for ALI treatment
|
|
C of individual transitions (in the fully hybrid CL/ALI scheme)
|
|
C
|
|
C Version for opacity sampling mode
|
|
C
|
|
C Output:
|
|
C
|
|
C IJALI(IJ) = 0 - frequency point IJ is an explicit point
|
|
C = 1 - frequency point IJ is an ALI point
|
|
C
|
|
C LEXP(ITR) = T - at least one point within transition ITR is explicit
|
|
C LEXP(ITR) = F - no point within transition ITR is explicit
|
|
C LALI(ITR) = T - at least one point within transition ITR is ALI
|
|
C LALI(ITR) = F - no point within transition ITR is ALI
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
C
|
|
DO IJ=1,NFREQ
|
|
IJALI(IJ)=1
|
|
IJX(IJ)=1
|
|
NLINES(IJ)=0
|
|
END DO
|
|
NLITOT=0
|
|
NLIMAX=0
|
|
C
|
|
C Overlapping lines at frequency IJ
|
|
C
|
|
DO 10 IT=1,NTRANS
|
|
IF(LINEXP(IT)) GO TO 10
|
|
DO IJ=IFR0(IT),IFR1(IT)
|
|
NLINES(IJ)=NLINES(IJ)+1
|
|
ITRLIN(NLINES(IJ),IJ)=int2(IT)
|
|
END DO
|
|
10 CONTINUE
|
|
DO IJ=1,NFREQ
|
|
NLITOT=NLITOT+NLINES(IJ)
|
|
IF(NLINES(IJ).GT.MITJ)
|
|
* CALL QUIT('Too many overlappins-nlines(ij).gt.mitj',
|
|
* nlines(ij),mitj)
|
|
IF(NLINES(IJ).GT.NLIMAX) NLIMAX=NLINES(IJ)
|
|
END DO
|
|
WRITE(10,*) ' Max. number of line overlaps: ',NLIMAX
|
|
WRITE(10,*) ' Total number of line overlaps: ',NLITOT
|
|
C
|
|
C Switches for ALI and explicit transitions
|
|
C
|
|
IF(NFFIX.EQ.2) THEN
|
|
DO ITR=1,NTRANS
|
|
LEXP(ITR)=.FALSE.
|
|
LALI(ITR)=.TRUE.
|
|
END DO
|
|
RETURN
|
|
END IF
|
|
C
|
|
XFRMA=DLOG10(FRS1)
|
|
DO 100 ITR=1,NTRANS
|
|
INDXP=INDEXP(ITR)
|
|
I0=IFR0(ITR)
|
|
I1=IFR1(ITR)
|
|
NF=I1-I0+1
|
|
IF(FR0(ITR).GT.FRS1) GO TO 100
|
|
IJL=IJTC(ITR)
|
|
C
|
|
C primarily explicit line transitions
|
|
C
|
|
IF(LINE(ITR)) THEN
|
|
IF(INDXP.GT.0) THEN
|
|
LEXP(ITR)=.TRUE.
|
|
LALI(ITR)=.FALSE.
|
|
IF(IFC0(ITR).EQ.0) THEN
|
|
DO IJ=I0,I1
|
|
IJALI(IJ)=0
|
|
END DO
|
|
ELSE
|
|
LALI(ITR)=.TRUE.
|
|
NFC=IABS(IFC1(ITR)-IFC0(ITR)+1)
|
|
IF(NFC.EQ.NF) THEN
|
|
LEXP(ITR)=.FALSE.
|
|
ELSE
|
|
NFC=NFC/2
|
|
DO IJ=I0,IJL-NFC
|
|
IJALI(IJ)=0
|
|
END DO
|
|
DO IJ=IJL+NFC,I1
|
|
IJALI(IJ)=0
|
|
END DO
|
|
END IF
|
|
END IF
|
|
ELSE IF(INDXP.LT.0) THEN
|
|
C
|
|
C primarily ALI line transitions
|
|
C
|
|
LEXP(ITR)=.FALSE.
|
|
LALI(ITR)=.TRUE.
|
|
IF(IFC0(ITR).NE.0) THEN
|
|
LEXP(ITR)=.TRUE.
|
|
NFC=IABS(IFC1(ITR)-IFC0(ITR)+1)
|
|
IF(NFC.EQ.NF) THEN
|
|
LALI(ITR)=.FALSE.
|
|
DO IJ=I0,I1
|
|
IJALI(IJ)=0
|
|
END DO
|
|
ELSE
|
|
NFC=NFC/2
|
|
DO IJ=IJL-NFC,IJL+NFC
|
|
IJALI(IJ)=0
|
|
END DO
|
|
END IF
|
|
END IF
|
|
END IF
|
|
C
|
|
C continuum transitions
|
|
C
|
|
ELSE
|
|
IF(IFC0(ITR).GT.0) THEN
|
|
DO IJ=1,IFC1(ITR)-IFC0(ITR)+1
|
|
IJALI(IJL-IJ+1)=0
|
|
END DO
|
|
END IF
|
|
END IF
|
|
100 CONTINUE
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C *******************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE LEVSET
|
|
C =================
|
|
C
|
|
C sets up level parameters IIEXP and IIFOR which control the
|
|
C treatment of levels
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
if(ioptab.lt.0) return
|
|
C
|
|
C 1. case - treatment of levels determined by IMODL
|
|
C
|
|
IF(IFLEV.EQ.0) THEN
|
|
DO I=1,NLEVEL
|
|
IIEXP(I)=0
|
|
IIFOR(I)=0
|
|
END DO
|
|
IIE=0
|
|
IIF=0
|
|
DO 20 IAT=1,NATOM
|
|
IGRP=0
|
|
IF(IIFIX(IAT).EQ.1) GO TO 20
|
|
DO I=N0A(IAT),NKA(IAT)
|
|
INEW=1
|
|
IF(IMODL(I).EQ.0) THEN
|
|
IIE=IIE+1
|
|
IIF=IIF+1
|
|
IIEXP(I)=IIE
|
|
IIFOR(I)=IIF
|
|
INDLEV(IIEXP(I))=I
|
|
ELSE IF(IMODL(I).GT.0) THEN
|
|
IIF=IIF+1
|
|
IIFOR(I)=IIF
|
|
IF(ILTLEV(I).GE.1) THEN
|
|
IIE=IIE+1
|
|
IIEXP(I)=IIE
|
|
END IF
|
|
IF(I.EQ.NFIRST(IEL(I)).OR.I.EQ.NNEXT(IEL(I))) THEN
|
|
IIE=IIE+1
|
|
IIEXP(I)=IIE
|
|
END IF
|
|
ELSE IF(IMODL(I).LT.-100) THEN
|
|
IF(I.GT.1) THEN
|
|
IF(IMODL(I).EQ.IMODL(I-1)) INEW=0
|
|
END IF
|
|
IIEXP(I)=-IIE
|
|
IF(INEW.EQ.1) THEN
|
|
IIE=IIE+1
|
|
IIEXP(I)=-IIE
|
|
IM=NFIRST(IEL(I))
|
|
LML=.TRUE.
|
|
DO WHILE (IM.LT.I-1 .AND. LML)
|
|
IF(IMODL(I).EQ.IMODL(IM)) THEN
|
|
IIEXP(I)=IIEXP(IM)
|
|
IIE=IIE-1
|
|
LML=.FALSE.
|
|
END IF
|
|
IM=IM+1
|
|
END DO
|
|
END IF
|
|
IGRP=1
|
|
IIF=IIF+1
|
|
IIFOR(I)=IIF
|
|
ELSE IF(IMODL(I).LT.-200) THEN
|
|
IF(I.GT.1) THEN
|
|
IF(IMODL(I).EQ.IMODL(I-1)) INEW=0
|
|
END IF
|
|
IF(INEW.EQ.1) IIE=IIE+1
|
|
IF(INEW.EQ.1) IIF=IIF+1
|
|
IIEXP(I)=-IIE
|
|
IIFOR(I)=-IIF
|
|
IGRP=1
|
|
END IF
|
|
END DO
|
|
IF(IGRP.EQ.1) THEN
|
|
DO I=N0A(IAT),NKA(IAT)
|
|
IF(IIEXP(I).GT.0) IIEXP(I)=-IIEXP(I)
|
|
IF(IMODL(I).EQ.0) IMODL(I)=7
|
|
END DO
|
|
END IF
|
|
20 CONTINUE
|
|
NLVEXP=IABS(IIE)
|
|
if(nlvexp.gt.mlvexp)
|
|
* CALL QUIT('nlvexp.gt.mlvexp',nlvexp,mlvexp)
|
|
NLVFOR=IABS(IIF)
|
|
DO 30 I=1,NLEVEL
|
|
IF(IMODL(I).EQ.1.OR.IMODL(I).EQ.3) THEN
|
|
IIEXP(I)=0
|
|
ELSE IF(IMODL(I).EQ.4.OR.IMODL(I).EQ.5) THEN
|
|
IIEXP(I)=0
|
|
ELSE IF(IMODL(I).EQ.-1.OR.IMODL(I).EQ.-3) THEN
|
|
IIEXP(I)=0
|
|
IIFOR(I)=0
|
|
ELSE IF(IMODL(I).EQ.6) THEN
|
|
IIEXP(I)=0
|
|
ELSE IF(IMODL(I).EQ.-5.OR.IMODL(I).EQ.-6) THEN
|
|
IIEXP(I)=0
|
|
IIFOR(I)=0
|
|
ELSE IF(IMODL(I).LT.-100) THEN
|
|
IMODL(I)=7
|
|
ELSE IF(IMODL(I).LT.-200) THEN
|
|
IMODL(I)=-7
|
|
END IF
|
|
DO ID=1,ND
|
|
ILTREF(I,ID)=NNEXT(IEL(I))
|
|
END DO
|
|
30 CONTINUE
|
|
IF(IGRP.EQ.1) THEN
|
|
DO I=N0A(IAT),NKA(IAT)
|
|
IMODL(I)=7
|
|
END DO
|
|
END IF
|
|
C
|
|
C 2. case - treatment of levels automatic - all levels with ILK=0
|
|
C in updated LTE mode
|
|
C
|
|
ELSE
|
|
IIF=0
|
|
DO 110 I=1,NLEVEL
|
|
IF(IIFIX(IATM(I)).EQ.1) GO TO 110
|
|
IMODL(I)=5
|
|
IF(I.EQ.NFIRST(IEL(I)).OR.I.EQ.NNEXT(IEL(I))) THEN
|
|
IIF=IIF+1
|
|
IIFOR(I)=IIF
|
|
END IF
|
|
110 CONTINUE
|
|
NLVEXP=IIF
|
|
if(nlvexp.gt.mlvexp)
|
|
* CALL QUIT('nlvexp.gt.mlvexp',nlvexp,mlvexp)
|
|
NLVFOR=IIF
|
|
DO I=1,NLEVEL
|
|
IF(I.NE.NFIRST(IEL(I)).AND.I.NE.NNEXT(IEL(I)))
|
|
* IIFOR(I)=0
|
|
END DO
|
|
DO I=1,NLEVEL
|
|
IIEXP(I)=IIFOR(I)
|
|
IF(IIEXP(I).GT.0) INDLEV(IIEXP(I))=I
|
|
DO ID=1,ND
|
|
ILTREF(I,ID)=NNEXT(IEL(I))
|
|
END DO
|
|
END DO
|
|
if(.not.lte) then
|
|
do i=1,nlevel
|
|
iifor(i)=i
|
|
end do
|
|
nlvfor=nlevel
|
|
end if
|
|
c
|
|
END IF
|
|
C
|
|
C initialize b-factors
|
|
C
|
|
DO I=1,NLEVEL
|
|
DO ID=1,ND
|
|
BFAC(I,ID)=UN
|
|
END DO
|
|
END DO
|
|
C
|
|
do ii=1,nlvexp
|
|
indlev(ii)=0
|
|
do id=1,nd
|
|
igzero(ii,id)=0
|
|
end do
|
|
end do
|
|
do i=1,nlevel
|
|
do id=1,nd
|
|
ipzero(i,id)=0
|
|
end do
|
|
if(iabs(imodl(i)).le.6) then
|
|
IF(IIEXP(I).GT.0) INDLEV(IIEXP(I))=I
|
|
end if
|
|
end do
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C *******************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE DWNFR0(ID)
|
|
C =====================
|
|
C
|
|
C Auxiliary quantities for dissolved fractions
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (SIXTH=UN/6.,CCOR=0.09)
|
|
parameter (p1=0.1402,p2=0.1285,p3=un,p4=3.15,p5=4.)
|
|
parameter (f23=-2./3.)
|
|
C
|
|
ANE=ELEC(ID)
|
|
ELEC23(ID)=EXP(F23*LOG(ANE))
|
|
ANES=EXP(SIXTH*LOG(ANE))
|
|
ACOR(ID)=CCOR*ANES/SQT1(ID)
|
|
X=EXP(P4*LOG(UN+P3*ACOR(ID)))
|
|
DWC2(ID)=P2*X
|
|
A3=ACOR(ID)*ACOR(ID)*ACOR(ID)
|
|
DO IZZ=1,MZZ
|
|
Z3(IZZ)=IZZ*IZZ*IZZ
|
|
DWC1(IZZ,ID)=P1*(X+P5*(IZZ-UN)*A3)
|
|
END DO
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE DWNFR1(FR,FR0,ID,IZZ,DW1)
|
|
C ====================================
|
|
C
|
|
C dissolved fraction for frequency FR
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (TKN=3.01,CKN=5.33333333,CB0=8.59d14)
|
|
PARAMETER (SQFRH=5.734152D7)
|
|
C
|
|
cb=cb0*bergfc
|
|
c
|
|
IF(FR.LT.FR0) THEN
|
|
XN=SQFRH*IZZ/SQRT(FR0-FR)
|
|
if(xn.le.tkn) then
|
|
xkn=un
|
|
else
|
|
xn1=un/(xn+un)
|
|
xkn=ckn*xn*xn1*xn1
|
|
end if
|
|
BETA=CB*Z3(IZZ)*XKN/(XN*XN*XN*XN)*ELEC23(ID)
|
|
BETA3=BETA*BETA*BETA
|
|
BETA32=SQRT(BETA3)
|
|
F=(DWC1(IZZ,ID)*BETA3)/(UN+DWC2(ID)*BETA32)
|
|
DW1=UN-F/(UN+F)
|
|
ELSE
|
|
DW1=UN
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE SGMER0
|
|
C =================
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (FRH=3.28805E15, PH2=2.815D29*2., EHB=157802.77355)
|
|
DIMENSION FREDG(NLMX),S(NLMX),SUM(NLMX),SUD(NLMX)
|
|
C
|
|
IMER=0
|
|
DO 100 II=1,NLEVEL
|
|
IF(IFWOP(II).GE.0) GO TO 100
|
|
IMER=IMER+1
|
|
IMRG(II)=IMER
|
|
IIMER(IMER)=II
|
|
IE=IEL(II)
|
|
CH=IZ(IE)*IZ(IE)
|
|
FRCH(IMER)=FRH*CH
|
|
SGM0(IMER)=PH2*CH*CH
|
|
II0=NQUANT(II-1)+1
|
|
DO ID=1,ND
|
|
EX=EHB*CH*TEMP1(ID)
|
|
DO I=II0,NLMX
|
|
FREDG(I)=FRCH(IMER)*XI2(I)
|
|
EXI=EXP(EX*XI2(I))
|
|
S(I)=EXI*WNHINT(I,ID)*XI3(I)
|
|
SUM(I)=0.
|
|
END DO
|
|
SUM(NLMX)=S(NLMX)
|
|
SUD(NLMX)=S(NLMX)*XI2(NLMX)
|
|
DO I=NLMX-1,II0,-1
|
|
SUM(I)=SUM(I+1)+S(I)
|
|
END DO
|
|
DO I=1,II0-1
|
|
SUM(I)=SUM(II0)
|
|
END DO
|
|
SGEM=SGM0(IMER)/GMER(IMER,ID)
|
|
DO I=1,NLMX
|
|
SGMSUM(I,IMER,ID)=SUM(I)*SGEM
|
|
END DO
|
|
END DO
|
|
100 CONTINUE
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE SGMER1(FRINV,FR3INV,IMER,ID,SGME1)
|
|
C =============================================
|
|
C
|
|
C photoionization cross-section for a merged level
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
C
|
|
ISU=INT(SQRT(FRCH(IMER)*FRINV))+1
|
|
SGME1=SGMSUM(ISU,IMER,ID)*FR3INV
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE SGMERD(FRINV,FR3INV,IMER,ID,SGME1,DSGME1)
|
|
C ====================================================
|
|
C
|
|
C photoionization cross-section for a merged level
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
C
|
|
ISU=INT(SQRT(FRCH(IMER)*FRINV))+1
|
|
SGME1=SGMSUM(ISU,IMER,ID)*FR3INV
|
|
DSGME1=-SGMSUD(ISU,IMER,ID)*FR3INV
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE TDPINI
|
|
C =================
|
|
C
|
|
C initialization of only temperature dependent quantities
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
PARAMETER (CFF1=1.3727D-25,CFF2=4.3748D-10,CFF3=2.5993D-7)
|
|
PARAMETER (SGFF0 = 3.694D8)
|
|
C
|
|
C temperature-dependent quantities
|
|
C
|
|
DO ID=1,ND
|
|
T=TEMP(ID)
|
|
T1=UN/T
|
|
HKT1(ID)=HK*T1
|
|
HKT21(ID)=HKT1(ID)*T1
|
|
TK1(ID)=HKT1(ID)/H
|
|
SQT1(ID)=SQRT(T)
|
|
TEMP1(ID)=T1
|
|
CALL GFREE0(ID)
|
|
EMEL1(ID)=UN
|
|
END DO
|
|
C
|
|
C delta m (for evaluation of optical depths)
|
|
C
|
|
DO ID=1,ND-1
|
|
DELDM(ID)=HALF*(DM(ID+1)-DM(ID))
|
|
deldmz(id)=deldm(id)
|
|
if(izscal.eq.1) deldmz(id)=half*(zd(id)-zd(id+1))
|
|
END DO
|
|
DEDM1=DM(1)/DENS(1)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
C
|
|
SUBROUTINE OPAINI(IMOD)
|
|
C =======================
|
|
C
|
|
C initialization of only depth-dependent quantities
|
|
C for evaluation of opacities
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
DIMENSION PRF(MFREQL),POPP(MLEVEL)
|
|
PARAMETER (CFF1=1.3727D-25,CFF2=4.3748D-10,CFF3=2.5993D-7)
|
|
PARAMETER (SIXTH=UN/6.,CCOR=0.09,T32=1.5D0)
|
|
PARAMETER (SGFF0 = 3.694D8)
|
|
DATA ICOMP /0/
|
|
C
|
|
DO ID=1,ND
|
|
WMT=WMM(ID)*YTOT(ID)
|
|
T=TEMP(ID)
|
|
ANE=ELEC(ID)
|
|
ELEC1(ID)=UN/ANE
|
|
DENS1(ID)=UN/DENS(ID)
|
|
DENSI(ID)=DENS1(ID)
|
|
DENSIM(ID)=DENSI(ID)*WMM(ID)
|
|
ELSCAT(ID)=ANE*SIGE
|
|
CALL DWNFR0(ID)
|
|
CALL WNSTOR(ID)
|
|
CALL SABOLF(ID)
|
|
CALL REFLEV(ID,IMOD)
|
|
CALL LEVGRP(ID,IIEXP,0,POPP)
|
|
DO II=1,NLEVEL
|
|
POPINV(II,ID)=0.
|
|
IF(POPUL(II,ID).NE.0.) POPINV(II,ID)=UN/POPUL(II,ID)
|
|
END DO
|
|
DO II=1,NLEVEL
|
|
IIE=IIEXP(II)
|
|
IF(IIE.EQ.0) THEN
|
|
IE=ILTREF(II,ID)
|
|
PP(II,ID)=POPUL(II,ID)*POPINV(IE,ID)
|
|
IF(IABS(IMODL(II)).LE.5) THEN
|
|
PT(II,ID)=POPUL(II,ID)*DSBPST(II,ID)
|
|
PN(II,ID)=POPUL(II,ID)*DSBPSN(II,ID)
|
|
END IF
|
|
ELSE IF(IIE.LT.0) THEN
|
|
PP(II,ID)=SBPSI(II,ID)
|
|
END IF
|
|
END DO
|
|
DO ION=1,NION
|
|
USUMS(ION,ID)=USUM(ION)
|
|
DUSMT(ION,ID)=DUSUMT(ION)
|
|
DUSMN(ION,ID)=DUSUMN(ION)
|
|
ENDDO
|
|
c
|
|
c quantities for the bound-free opacity
|
|
c
|
|
DO IBFT=1,NTRANC
|
|
ITR=ITRBF(IBFT)
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
IT=ITRA(JJ,II)
|
|
IE=IEL(II)
|
|
NKE=NNEXT(IE)
|
|
CORR=UN
|
|
IF(NKE.NE.JJ) CORR=G(NKE)/G(JJ)*
|
|
* EXP((ENION(NKE)-ENION(JJ))*TK1(ID))
|
|
ABTRA(ITR,ID)=POPUL(II,ID)
|
|
EMTRA(ITR,ID)=POPUL(JJ,ID)*ANE*SBF(II)*WOP(II,ID)*CORR
|
|
DEMLT(ITR,ID)=-(T32+FR0(ITR)*HKT1(ID))/TEMP(ID)
|
|
END DO
|
|
c
|
|
c quantities for the free-free opacity
|
|
c
|
|
IF(IELHM.GT.0) THEN
|
|
CFFN(ID)=POPUL(NFIRST(IELH),ID)*ANE
|
|
CFFT(ID)=CFF2-CFF3/T
|
|
END IF
|
|
SGFF=SGFF0/SQT1(ID)*ANE
|
|
DO ION=1,NION
|
|
SFF2(ION,ID)=EXP(FF(ION)*HKT1(ID))
|
|
SFF3(ION,ID)=POPUL(NNEXT(ION),ID)*CHARG2(ION)*SGFF
|
|
DSFF(ION,ID)=(FF(ION)*HKT1(ID)+HALF)*TEMP1(ID)
|
|
END DO
|
|
END DO
|
|
if(izscal.eq.1) then
|
|
do id=1,nd
|
|
densi(id)=un
|
|
densim(id)=0.
|
|
end do
|
|
end if
|
|
CALL SGMER0
|
|
C
|
|
C initialization of the line opacity
|
|
C
|
|
LASER=ITER.GT.ITLAS
|
|
DO 200 ITR=1,NTRANS
|
|
INDXA=IABS(INDEXP(ITR))
|
|
IF(.NOT.LINE(ITR)) GO TO 200
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
IF(INDXA.NE.0.AND.INTMOD(ITR).NE.0 .AND. ICOMP.EQ.0) THEN
|
|
IJL0=IFR0(ITR)
|
|
IJL1=IFR1(ITR)
|
|
IF(ISPODF.GE.1) THEN
|
|
IJL0=KFR0(ITR)
|
|
IJL1=KFR1(ITR)
|
|
END IF
|
|
IF(INDXA.LT.2.OR.INDXA.GT.4) THEN
|
|
DO ID=1,ND
|
|
CALL LINPRO(ITR,ID,PRF)
|
|
DO IJ=IJL0,IJL1
|
|
PRFLIN(ID,IJ)=real(PRF(IJ-IJL0+1))
|
|
END DO
|
|
END DO
|
|
END IF
|
|
END IF
|
|
GG=G(II)/G(JJ)
|
|
DO ID=1,ND
|
|
IF(IFWOP(JJ).GE.0) THEN
|
|
PI=POPUL(II,ID)*WOP(JJ,ID)
|
|
PJ=GG*POPUL(JJ,ID)*WOP(II,ID)
|
|
ELSE
|
|
PI=POPUL(II,ID)
|
|
PJ=G(II)/GMER(IMRG(JJ),ID)*POPUL(JJ,ID)*WOP(II,ID)
|
|
END IF
|
|
ABTRA(ITR,ID)=PI
|
|
EMTRA(ITR,ID)=PJ*EXP(FR0(ITR)*HKT1(ID))
|
|
DEMLT(ITR,ID)=-FR0(ITR)*HKT21(ID)
|
|
IF(LASER) THEN
|
|
qtt=0.
|
|
if(pi.ne.pj) QTT=PJ/(PI-PJ)*(EXP(FR0(ITR)*HKT1(ID))-UN)
|
|
lfr=fr0(itr).lt.frtabm.and.iadop(iatm(ii)).gt.0
|
|
IF(QTT.LT.0. .OR. QTT.GT.QTLAS .or. lfr) THEN
|
|
ABTRA(ITR,ID)=0.
|
|
EMTRA(ITR,ID)=0.
|
|
DEMLT(ITR,ID)=0.
|
|
END IF
|
|
END IF
|
|
c
|
|
c set up ABTRA and EMTRA to 0 in the range where
|
|
c the hydrogen opacity is calculated from Gomez tables
|
|
c
|
|
if(ihgom.gt.0.and.elec(id).gt.hglim) then
|
|
if(ii.ge.n0hn.and.ii.le.n0hn-1+ihgom) then
|
|
abtra(itr,id)=0.
|
|
emtra(itr,id)=0.
|
|
demlt(itr,id)=0.
|
|
end if
|
|
end if
|
|
END DO
|
|
200 CONTINUE
|
|
ICOMP=1
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE TRAINI
|
|
C =================
|
|
C
|
|
C initialization of depth-independent quantities
|
|
C for evaluation of opacities
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
c
|
|
do itr=1,ntrans
|
|
idiel(itr)=0
|
|
end do
|
|
C
|
|
C bound-free transitions
|
|
C
|
|
NCDW=0
|
|
DO 10 IBFT=1,NTRANC
|
|
ITR=ITRBF(IBFT)
|
|
ii=ilow(itr)
|
|
if(ilk(iup(itr)).ne.0.and.nfirst(iel(ii)).eq.ii.
|
|
* and.IFDIEL.NE.0) idiel(itr)=1
|
|
MODW=IABS(INDEXP(ITR))
|
|
IF(MODW.NE.5.AND.MODW.NE.15) GO TO 10
|
|
NCDW=NCDW+1
|
|
MCDW(ITR)=NCDW
|
|
ITRCDW(NCDW)=ITR
|
|
10 CONTINUE
|
|
IF(ISPODF.GE.1) RETURN
|
|
C
|
|
C bound-bound transitions
|
|
C
|
|
DO IJ=1,NFREQ
|
|
NLINES(IJ)=0
|
|
END DO
|
|
C
|
|
DO 100 ITR=1,NTRANS
|
|
IF(LINEXP(ITR)) GO TO 100
|
|
DO IJ=IFR0(ITR),IFR1(ITR)
|
|
IJLIN(IJ)=ITR
|
|
END DO
|
|
100 CONTINUE
|
|
RETURN
|
|
END
|
|
|
|
C
|
|
C
|
|
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE RTEDF1(IJ)
|
|
C =====================
|
|
C
|
|
C Solution of the radiative transfer equation - for one frequency
|
|
C for the known source function.
|
|
C Determination of the radiation field and variable Eddington
|
|
C factors.
|
|
C
|
|
C The numerical method used:
|
|
c Discontinuous Finite Element method
|
|
c Castor, Dykema, Klein, 1992, ApJ 387, 561.
|
|
C
|
|
C different formulation of the boundary conditions
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
COMMON/OPTDPT/DT(MDEPTH)
|
|
PARAMETER (SIXTH=UN/6.D0,
|
|
* THIRD=UN/3.D0,
|
|
* TWOTHR=TWO/3.D0)
|
|
DIMENSION RDK(MDEPTH),FKK(MDEPTH),
|
|
* ST0(MDEPTH),SA0(MDEPTH),SS0(MDEPTH),
|
|
* dtau(mdepth),rip(mdepth),rim(mdepth),
|
|
* riin(mdepth),riup(mdepth),u(mdepth),
|
|
* aip(mdepth),aim(mdepth),al0(mdepth),
|
|
* aiin(mdepth),aiup(mdepth),
|
|
* ali0(mdepth),ss0c(mdepth),
|
|
* AAA(MDEPTH),BBB(MDEPTH),CCC(MDEPTH),EEE(MDEPTH),
|
|
* ZZZ(MDEPTH),ALRH(MDEPTH),ALRM(MDEPTH),ALRP(MDEPTH),
|
|
* DDD(MDEPTH),AANU(MDEPTH)
|
|
C
|
|
FR=FREQ(IJ)
|
|
C
|
|
C optical depth scale
|
|
C
|
|
DO ID=1,ND-1
|
|
DT(ID)=DELDMZ(ID)*(ABSOT(ID+1)+ABSOT(ID))
|
|
SA0(ID)=EMIS1(ID)/ABSO1(ID)
|
|
SS0(ID)=-SCAT1(ID)/ABSO1(ID)
|
|
END DO
|
|
SA0(ND)=EMIS1(ND)/ABSO1(ND)
|
|
SS0(ND)=-SCAT1(ND)/ABSO1(ND)
|
|
C
|
|
TAUMIN=ABSO1(1)*DEDM1
|
|
C
|
|
C Allowance for wind blanketing
|
|
C
|
|
ALB1=0.
|
|
IF(IWINBL.GT.0) ALB1=TWO*ALBE(IJ)/(UN+ALBE(IJ))
|
|
C
|
|
C quantities for the lower boundary condition
|
|
C
|
|
FR15=FR*1.D-15
|
|
BNU=BN*FR15*FR15*FR15
|
|
PLAND=BNU/(EXP(HK*FR/TEMP(ND))-UN)*RRDIL
|
|
DPLAN=BNU/(EXP(HK*FR/TEMP(ND-1))-UN)*RRDIL
|
|
IF(TEMPBD.GT.0.) THEN
|
|
PLAND=BNU/(EXP(HK*FR/TEMPBD)-UN)*RRDIL
|
|
DPLAN=BNU/(EXP(HK*FR/TEMPBD)-UN)*RRDIL
|
|
ENDIF
|
|
DPLAN=(PLAND-DPLAN)/DT(ND-1)
|
|
C
|
|
C global ALI loop for treating electron scattering
|
|
C
|
|
itrali=0
|
|
10 itrali=itrali+1
|
|
C
|
|
C total source function
|
|
C
|
|
DO ID=1,ND
|
|
ST0(ID)=SA0(ID)-SS0(ID)*RAD(IJ,ID)
|
|
RAD1(ID)=0.
|
|
RDK(ID)=0.
|
|
ALI1(ID)=0.
|
|
END DO
|
|
AH=0.
|
|
ahout=0.
|
|
ahd=0.
|
|
U0=0.
|
|
QQ0=0.
|
|
US0=0.
|
|
c
|
|
c loop over angle poits
|
|
c
|
|
DO I=1,NMU
|
|
AMU2=AMU(I)*AMU(I)*WTMU(I)
|
|
do id=1,nd-1
|
|
dtau(id)=dt(id)/amu(i)
|
|
enddo
|
|
c
|
|
c incoming intensity
|
|
c
|
|
ID=1
|
|
P0=0.
|
|
EX=UN
|
|
C
|
|
C allowance for non-zero optical depth at the first depth point
|
|
C
|
|
c rim(id)=EXTRAD(IJ)
|
|
rim(id)=EXTINT(IJ,I)
|
|
c IF(IWINBL.EQ.0) THEN
|
|
c TAMM=TAUMIN/AMU(I)
|
|
c EX=EXP(-TAMM)
|
|
c P0=UN-EX
|
|
c QQ0=QQ0+P0*AMU(I)*WTMU(I)
|
|
c U0=U0+EX*WTMU(I)
|
|
c US0=US0+P0/TAMM*WTMU(I)
|
|
c rim(id)=st0(id)*p0
|
|
c END IF
|
|
c
|
|
c incoming intensity
|
|
c
|
|
aim(id)=0.
|
|
do id=1,nd-1
|
|
dt0=dtau(id)
|
|
dtaup1=dt0+un
|
|
dtau2=dt0*dt0
|
|
bb=two*dtaup1
|
|
cc=dt0*dtaup1
|
|
aa=un/(dtau2+bb)
|
|
rim(id+1)=(two*rim(id)+dt0*st0(id)+cc*st0(id+1))*aa
|
|
rip(id)=(bb*rim(id)+cc*st0(id)-dt0*st0(id+1))*aa
|
|
aim(id+1)=cc*aa
|
|
aip(id)=(cc+bb*aim(id))*aa
|
|
end do
|
|
do id=2,nd-1
|
|
dtt=un/(dtau(id-1)+dtau(id))
|
|
riin(id)=(rim(id)*dtau(id)+rip(id)*dtau(id-1))*dtt
|
|
aiin(id)=(aim(id)*dtau(id)+aip(id)*dtau(id-1))*dtt
|
|
end do
|
|
riin(1)=rim(1)
|
|
riin(nd)=rim(nd)
|
|
aiin(1)=aim(1)
|
|
aiin(nd)=aim(nd)
|
|
C
|
|
c outgoing intensity
|
|
c
|
|
if(idisk.eq.0) rim(nd)=PLAND+AMU(I)*DPLAN
|
|
do id=nd-1,1,-1
|
|
dt0=dtau(id)
|
|
dtaup1=dt0+un
|
|
dtau2=dt0*dt0
|
|
bb=two*dtaup1
|
|
cc=dt0*dtaup1
|
|
aa=un/(dtau2+bb)
|
|
rim(id)=(two*rim(id+1)+dt0*st0(id+1)+cc*st0(id))*aa
|
|
rip(id+1)=(bb*rim(id+1)+cc*st0(id+1)-dt0*st0(id))*aa
|
|
aim(id)=cc*aa
|
|
aip(id+1)=(cc+bb*aim(id+1))*aa
|
|
end do
|
|
do id=2,nd-1
|
|
dtt=un/(dtau(id-1)+dtau(id))
|
|
riup(id)=(rim(id)*dtau(id-1)+rip(id)*dtau(id))*dtt
|
|
aiup(id)=(aim(id)*dtau(id-1)+aip(id)*dtau(id))*dtt
|
|
end do
|
|
riup(1)=rim(1)
|
|
riup(nd)=rim(nd)
|
|
aiup(1)=aim(1)
|
|
aiup(nd)=aim(nd)
|
|
c
|
|
c final symmetrized (Feautrier) intensity -- (riin+riup)/2
|
|
c
|
|
do id=1,nd
|
|
u(id)=(riin(id)+riup(id))*half
|
|
al0(id)=(aiin(id)+aiup(id))*half
|
|
end do
|
|
c
|
|
DO ID=1,ND
|
|
RAD1(ID)=RAD1(ID)+WTMU(I)*U(ID)
|
|
RDK(ID)=RDK(ID)+AMU2*U(ID)
|
|
ALI1(ID)=ALI1(ID)+WTMU(I)*AL0(ID)
|
|
END DO
|
|
AH=AH+AMU(I)*WTMU(I)*U(1)
|
|
ahd=ahd+amu(i)*wtmu(i)*u(nd)
|
|
ahout=ahout+amu(i)*wtmu(i)*riup(1)
|
|
c
|
|
c end of the loop over angle points
|
|
c
|
|
END DO
|
|
C
|
|
C solution of the transfer equation
|
|
C Variables:
|
|
C RAD1 - mean intensity
|
|
C FAK1 - Eddington factor f(K) = K/J
|
|
C FH - the "surface" Eddington factor
|
|
C ALI1 - diagonal element of the lambda operator
|
|
C
|
|
IF(IBC.EQ.0) THEN
|
|
ALI1(ND)=RAD1(ND)/ST0(ND)
|
|
ALI1(ND-1)=RAD1(ND-1)/ST0(ND-1)
|
|
END IF
|
|
C
|
|
DJTOT=0.
|
|
DO ID=1,ND
|
|
DELTAJ=(RAD1(ID)-RAD(IJ,ID))/(UN+SS0(ID)*ALI1(ID))
|
|
RAD(IJ,ID)=RAD(IJ,ID)+DELTAJ
|
|
DJTOT=MAX(DJTOT,ABS(DELTAJ/RAD(IJ,ID)))
|
|
END DO
|
|
IF(DJTOT.GT.DJMAX.AND.ITRALI.LE.NTRALI) GO TO 10
|
|
C
|
|
C end of ALI loop for electron scattering
|
|
C
|
|
DO ID=1,ND
|
|
RAD1(ID)=RAD(IJ,ID)
|
|
FAK1(ID)=RDK(ID)/RAD(IJ,ID)
|
|
FKK(ID)=FAK1(ID)
|
|
END DO
|
|
FLUX(IJ)=AHout*half
|
|
FH(IJ)=AH/RAD1(1)-HALF*ALB1
|
|
FH0=FH(IJ)
|
|
fhd(ij)=ahd/rad1(nd)
|
|
C
|
|
C ********************
|
|
C
|
|
C Again solution of the transfer equation, now with Eddington
|
|
C FKK and FH determined above, to insure strict consistency of the
|
|
C radiation field and Eddington factors
|
|
C
|
|
C Upper boundary condition
|
|
C
|
|
if(ilmcor.eq.3) then
|
|
do id=1,nd
|
|
sa0(id)=st0(id)
|
|
ss0c(id)=ss0(id)
|
|
ss0(id)=0.
|
|
end do
|
|
end if
|
|
ID=1
|
|
DTP1=DT(ID)
|
|
IF(MOD(ISPLIN,3).EQ.0) THEN
|
|
B=DTP1*HALF
|
|
C=0.
|
|
ELSE
|
|
B=DTP1*THIRD
|
|
C=B*HALF
|
|
END IF
|
|
BQ=UN/(B+QQ0)
|
|
CQ=C*BQ
|
|
BBB(ID)=(FKK(ID)/DTP1+FH0+B)*BQ+SS0(ID)
|
|
CCC(ID)=(FKK(ID+1)/DTP1)*BQ-CQ*(UN+SS0(ID+1))
|
|
ZZZ(ID)=UN/BBB(ID)
|
|
VLL=SA0(ID)+CQ*SA0(ID+1)
|
|
IF(IWINBL.LT.0) VLL=VLL+HEXTRD(IJ)*BQ
|
|
AANU(ID)=VLL*ZZZ(ID)
|
|
DDD(ID)=CCC(ID)*ZZZ(ID)
|
|
IF(ISPLIN.GT.2) FFF=BBB(ID)/CCC(ID)-UN
|
|
C
|
|
C Normal depth point
|
|
C
|
|
DO ID=2,ND-1
|
|
DTM1=DTP1
|
|
DTP1=DT(ID)
|
|
DT0=TWO/(DTP1+DTM1)
|
|
AL=UN/DTM1*DT0
|
|
GA=UN/DTP1*DT0
|
|
IF(MOD(ISPLIN,3).EQ.0) THEN
|
|
A=0.
|
|
C=0.
|
|
ELSE IF(ISPLIN.EQ.1) THEN
|
|
A=DTM1*DT0*SIXTH
|
|
C=DTP1*DT0*SIXTH
|
|
ELSE
|
|
A=(UN-HALF*DTP1*DTP1*AL)*SIXTH
|
|
C=(UN-HALF*DTM1*DTM1*GA)*SIXTH
|
|
END IF
|
|
AAA(ID)=AL*FKK(ID-1)-A*(UN+SS0(ID-1))
|
|
CCC(ID)=GA*FKK(ID+1)-C*(UN+SS0(ID+1))
|
|
BBB(ID)=(AL+GA)*FKK(ID)+(UN-A-C)*(UN+SS0(ID))
|
|
VLL=A*SA0(ID-1)+C*SA0(ID+1)+(UN-A-C)*SA0(ID)
|
|
AANU(ID)=VLL+AAA(ID)*AANU(ID-1)
|
|
IF(ISPLIN.LE.2) THEN
|
|
ZZZ(ID)=UN/(BBB(ID)-AAA(ID)*DDD(ID-1))
|
|
DDD(ID)=CCC(ID)*ZZZ(ID)
|
|
AANU(ID)=AANU(ID)*ZZZ(ID)
|
|
ELSE
|
|
SUM=-AAA(ID)+BBB(ID)-CCC(ID)
|
|
FFF=(SUM+AAA(ID)*FFF*DDD(ID-1))/CCC(ID)
|
|
DDD(ID)=UN/(UN+FFF)
|
|
AANU(ID)=AANU(ID)*DDD(ID)/CCC(ID)
|
|
ENDIF
|
|
END DO
|
|
C
|
|
C Lower boundary condition
|
|
C
|
|
ID=ND
|
|
IF(IBC.EQ.0) THEN
|
|
BBB(ID)=FKK(ID)/DTP1+HALF
|
|
AAA(ID)=FKK(ID-1)/DTP1
|
|
VLL=HALF*PLAND+THIRD*DPLAN
|
|
ELSE IF(IBC.LT.4) THEN
|
|
B=UN/DTP1
|
|
A=TWO*B*B
|
|
BBB(ID)=UN+SS0(ID)+B+A*FKK(ID)
|
|
AAA(ID)=A*FKK(ID-1)
|
|
VLL=SA0(ID)+B*(PLAND+TWOTHR*DPLAN)
|
|
ELSE
|
|
B=UN/DTP1
|
|
A=TWO*B*B
|
|
BBB(ID)=B+A*FKK(ID)
|
|
AAA(ID)=A*FKK(ID-1)
|
|
VLL=B*(PLAND+TWOTHR*DPLAN)
|
|
END IF
|
|
EEE(ND)=AAA(ID)/BBB(ID)
|
|
ZZZ(ID)=UN/(BBB(ID)-AAA(ID)*DDD(ID-1))
|
|
RAD1(ID)=(VLL+AAA(ID)*AANU(ID-1))*ZZZ(ID)
|
|
FAK1(ID)=FKK(ND)
|
|
ALRH(ID)=ZZZ(ID)
|
|
C
|
|
C Backsolution
|
|
C
|
|
DO ID=ND-1,1,-1
|
|
EEE(ID)=AAA(ID)/(BBB(ID)-CCC(ID)*EEE(ID+1))
|
|
RAD1(ID)=AANU(ID)+DDD(ID)*RAD1(ID+1)
|
|
FAK1(ID)=FKK(ID)
|
|
ALRH(ID)=ZZZ(ID)/(UN-DDD(ID)*EEE(ID+1))
|
|
ALRM(ID)=0
|
|
ALRP(ID)=0
|
|
END DO
|
|
c
|
|
C evaluate approximate Lambda operator
|
|
C
|
|
C a) Rybicki-Hummer Lambda^star operator (diagonal)
|
|
C (for JALI = 1)
|
|
C
|
|
DO ID=1,ND
|
|
ALIM1(ID)=0.
|
|
ALIP1(ID)=0.
|
|
END DO
|
|
IF(JALI.EQ.1) THEN
|
|
DO ID=1,ND
|
|
ALI1(ID)=ALRH(ID)
|
|
END DO
|
|
c
|
|
IF(IBC.EQ.0) THEN
|
|
ali1(nd-1)=rad1(nd-1)/sa0(nd-1)
|
|
ali1(nd)=rad1(nd)/sa0(nd)
|
|
END IF
|
|
C
|
|
C for IFALI>5:
|
|
C tridiagonal Rybicki-Hummer operator (off-diagonal terms)
|
|
C
|
|
IF(IFALI.GE.6) THEN
|
|
ALIP1(1)=ALRH(2)*DDD(1)
|
|
DO ID=2,ND-1
|
|
ALIM1(ID)=ALRH(ID-1)*EEE(ID)
|
|
ALIP1(ID)=ALRH(ID+1)*DDD(ID)
|
|
END DO
|
|
ALIM1(ND)=ALRH(ND-1)*EEE(ND)
|
|
IF(IBC.EQ.0) THEN
|
|
ALIM1(nd)=0.
|
|
ALIM1(nd-1)=0.
|
|
ALIP1(nd)=0.
|
|
ALIP1(nd-1)=0.
|
|
END IF
|
|
END IF
|
|
c
|
|
C b) diagonal Olson-Kunasz Lambda^star operator,
|
|
C (for JALI = 2)
|
|
C
|
|
ELSE IF(JALI.EQ.2) THEN
|
|
DO ID=1,ND-1
|
|
ALI0(ID)=0.
|
|
DO I=1,NMU
|
|
DIV=DT(ID)/AMU(I)
|
|
ALI0(ID)=ALI0(ID)+(UN-EXP(-DIV))/DIV*WTMU(I)
|
|
END DO
|
|
END DO
|
|
DO ID=2,ND-1
|
|
ALI1(ID)=UN-HALF*(ALI0(ID)+ALI0(ID-1))
|
|
END DO
|
|
ALI1(1)=UN-HALF*(ALI0(1)+US0)
|
|
ALI1(ND)=UN-ALI0(ND-1)
|
|
ali1(nd-1)=rad1(nd-1)/sa0(nd-1)
|
|
ali1(nd)=rad1(nd)/sa0(nd)
|
|
END IF
|
|
C
|
|
C correction of Lambda^star for scattering
|
|
C
|
|
IF(ILMCOR.EQ.1) THEN
|
|
DO ID=1,ND
|
|
ALI1(ID)=ALI1(ID)*(UN+SS0(ID))
|
|
ALIM1(ID)=ALIM1(ID)*(UN+SS0(ID))
|
|
ALIP1(ID)=ALIP1(ID)*(UN+SS0(ID))
|
|
END DO
|
|
IF(IBC.EQ.4) THEN
|
|
ALI1(ND)= ALI1(ND)/(UN+SS0(ND))
|
|
ALIM1(ND)= ALIM1(ND)/(UN+SS0(ND))
|
|
ALIP1(ND)= ALIP1(ND)/(UN+SS0(ND))
|
|
END IF
|
|
END IF
|
|
C
|
|
C store quantities for explicit (linearized) frequencies
|
|
C
|
|
IF(IJEX(IJ).LE.0) RETURN
|
|
IJE=IJEX(IJ)
|
|
DO ID=1,ND
|
|
RADEX(IJE,ID)=RAD1(ID)
|
|
FAKEX(IJE,ID)=FAK1(ID)
|
|
END DO
|
|
Q0(IJE)=QQ0
|
|
UU0(IJE)=U0
|
|
RETURN
|
|
END
|
|
|
|
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE RTEDF2(IJ)
|
|
C =====================
|
|
C
|
|
C Solution of the radiative transfer equation - for one frequency
|
|
C for the known source function.
|
|
C Determination of the radiation field and variable Eddington
|
|
C factors.
|
|
C Analogous to RTEDF1, but using opacity and emissivity
|
|
c instead of the source function
|
|
C
|
|
C The numerical method used:
|
|
c Discontinuous Finite Element method
|
|
c Castor, Dykema, Klein, 1992, ApJ 387, 561.
|
|
C
|
|
C different formulation of the boundary conditions
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
PARAMETER (SIXTH=UN/6.D0,
|
|
* THIRD=UN/3.D0,
|
|
* TWOTHR=TWO/3.D0,
|
|
* three=3.d0,
|
|
* quart=0.25d0)
|
|
DIMENSION DT(MDEPTH),RDK(MDEPTH),FKK(MDEPTH),
|
|
* ST0(MDEPTH),SA0(MDEPTH),SS0(MDEPTH),
|
|
* dtau(mdepth),rip(mdepth),rim(mdepth),
|
|
* riin(mdepth),riup(mdepth),u(mdepth),
|
|
* aip(mdepth),aim(mdepth),al0(mdepth),
|
|
* aiin(mdepth),aiup(mdepth),
|
|
* chip0(mdepth),chim0(mdepth),ddm0(mdepth),
|
|
* chip(mdepth),chim(mdepth),
|
|
* etap(mdepth),etam(mdepth)
|
|
C
|
|
FR=FREQ(IJ)
|
|
C
|
|
C optical depth scale
|
|
C
|
|
DO ID=1,ND-1
|
|
DT(ID)=DELDMZ(ID)*(ABSOT(ID+1)+ABSOT(ID))
|
|
SA0(ID)=EMIS1(ID)/ABSO1(ID)
|
|
SS0(ID)=-SCAT1(ID)/ABSO1(ID)
|
|
ddm0(id)=(dm(id+1)-dm(id))
|
|
chip0(id)=(abso1(id)*dens1(id)+three*
|
|
* abso1(id+1)*dens1(id+1))*quart*ddm0(id)
|
|
chim0(id)=(abso1(id)*dens1(id)*three+
|
|
* abso1(id+1)*dens1(id+1))*quart*ddm0(id)
|
|
END DO
|
|
SA0(ND)=EMIS1(ND)/ABSO1(ND)
|
|
SS0(ND)=-SCAT1(ND)/ABSO1(ND)
|
|
C
|
|
TAUMIN=ABSO1(1)*DEDM1
|
|
C
|
|
C Allowance for wind blanketing
|
|
C
|
|
ALB1=0.
|
|
IF(IWINBL.GT.0) ALB1=TWO*ALBE(IJ)/(UN+ALBE(IJ))
|
|
C
|
|
C quantities for the lower boundary condition
|
|
C
|
|
FR15=FR*1.D-15
|
|
BNU=BN*FR15*FR15*FR15
|
|
PLAND=BNU/(EXP(HK*FR/TEMP(ND))-UN)*RRDIL
|
|
DPLAN=BNU/(EXP(HK*FR/TEMP(ND-1))-UN)*RRDIL
|
|
IF(TEMPBD.GT.0.) THEN
|
|
PLAND=BNU/(EXP(HK*FR/TEMPBD)-UN)*RRDIL
|
|
DPLAN=BNU/(EXP(HK*FR/TEMPBD)-UN)*RRDIL
|
|
ENDIF
|
|
DPLAN=(PLAND-DPLAN)/DT(ND-1)
|
|
C
|
|
C global ALI loop for treating electron scattering
|
|
C
|
|
itrali=0
|
|
10 itrali=itrali+1
|
|
C
|
|
C total source function
|
|
C
|
|
DO ID=1,ND
|
|
ST0(ID)=SA0(ID)-SS0(ID)*RAD(IJ,ID)
|
|
RAD1(ID)=0.
|
|
RDK(ID)=0.
|
|
ALI1(ID)=0.
|
|
END DO
|
|
AH=0.
|
|
U0=0.
|
|
QQ0=0.
|
|
US0=0.
|
|
c
|
|
c loop over angle poits
|
|
c
|
|
DO I=1,NMU
|
|
AMU2=AMU(I)*AMU(I)*WTMU(I)
|
|
do id=1,nd-1
|
|
dtau(id)=dt(id)/amu(i)
|
|
chip(id)=un+chip0(id)/amu(i)
|
|
chim(id)=un+chim0(id)/amu(i)
|
|
etap(id)=emis1(id+1)*dens1(id+1)/amu(i)*ddm0(id)
|
|
etam(id)=emis1(id)*dens1(id)/amu(i)*ddm0(id)
|
|
enddo
|
|
c
|
|
c incoming intensity
|
|
c
|
|
ID=1
|
|
P0=0.
|
|
EX=UN
|
|
C
|
|
C allowance for non-zero optical depth at the first depth point
|
|
C
|
|
c rim(id)=EXTRAD(IJ)
|
|
rim(id)=EXTINT(IJ,I)
|
|
IF(IWINBL.EQ.0) THEN
|
|
TAMM=TAUMIN/AMU(I)
|
|
EX=EXP(-TAMM)
|
|
P0=UN-EX
|
|
QQ0=QQ0+P0*AMU(I)*WTMU(I)
|
|
U0=U0+EX*WTMU(I)
|
|
US0=US0+P0/TAMM*WTMU(I)
|
|
rim(id)=st0(id)*p0
|
|
END IF
|
|
c
|
|
c incoming intensity
|
|
c
|
|
aim(id)=0.
|
|
do id=1,nd-1
|
|
dt0=dtau(id)
|
|
dtaup1=dt0+un
|
|
dtau2=dt0*dt0
|
|
bb=two*dtaup1
|
|
cc=dt0*dtaup1
|
|
aa=un/(dtau2+bb)
|
|
aam=un/(un+chim(id)*chip(id))
|
|
rim(id+1)=(two*rim(id)+etap(id)*chim(id)+etam(id))*aam
|
|
rip(id)=(two*rim(id)*chim(id)+etam(id)*chip(id)-
|
|
* etap(id))*aam
|
|
aim(id+1)=bb*aa
|
|
aip(id)=(cc+bb*aim(id))*aa
|
|
end do
|
|
do id=2,nd-1
|
|
dtt=un/(dtau(id-1)+dtau(id))
|
|
dtm=un/(ddm0(id-1)+ddm0(id))
|
|
riin(id)=(rim(id)*ddm0(id)+rip(id)*ddm0(id-1))*dtm
|
|
aiin(id)=(aim(id)*dtau(id)+aip(id)*dtau(id-1))*dtt
|
|
end do
|
|
riin(1)=rim(1)
|
|
riin(nd)=rim(nd)
|
|
aiin(1)=aim(1)
|
|
aiin(nd)=aim(nd)
|
|
C
|
|
c outgoing intensity
|
|
c
|
|
rim(nd)=PLAND+AMU(I)*DPLAN
|
|
do id=nd-1,1,-1
|
|
dt0=dtau(id)
|
|
dtaup1=dt0+un
|
|
dtau2=dt0*dt0
|
|
bb=two*dtaup1
|
|
cc=dt0*dtaup1
|
|
aa=un/(dtau2+bb)
|
|
aam=un/(un+chim(id)*chip(id))
|
|
rim(id)=(two*rim(id+1)+etam(id)*chip(id)+etap(id))*aam
|
|
rip(id+1)=(two*rim(id+1)*chip(id)+etap(id)*chim(id)-
|
|
* etam(id))*aam
|
|
aim(id)=cc*aa
|
|
aip(id+1)=(cc+bb*aim(id+1))*aa
|
|
end do
|
|
do id=2,nd-1
|
|
dtt=un/(dtau(id-1)+dtau(id))
|
|
dtm=un/(ddm0(id-1)+ddm0(id))
|
|
riup(id)=(rim(id)*ddm0(id-1)+rip(id)*ddm0(id))*dtm
|
|
aiup(id)=(aim(id)*dtau(id-1)+aip(id)*dtau(id))*dtt
|
|
end do
|
|
riup(1)=rim(1)
|
|
riup(nd)=rim(nd)
|
|
aiup(1)=aim(1)
|
|
aiup(nd)=aim(nd)
|
|
c
|
|
c final symmetrized (Feautrier) intensity -- (riin+riup)/2
|
|
c
|
|
do id=1,nd
|
|
u(id)=(riin(id)+riup(id))*half
|
|
al0(id)=(aiin(id)+aiup(id))*half
|
|
end do
|
|
c
|
|
DO ID=1,ND
|
|
RAD1(ID)=RAD1(ID)+WTMU(I)*U(ID)
|
|
RDK(ID)=RDK(ID)+AMU2*U(ID)
|
|
ALI1(ID)=ALI1(ID)+WTMU(I)*AL0(ID)
|
|
END DO
|
|
AH=AH+AMU(I)*WTMU(I)*U(1)
|
|
c
|
|
c end of the loop over angle points
|
|
c
|
|
END DO
|
|
C
|
|
C solution of the transfer equation
|
|
C Variables:
|
|
C RAD1 - mean intensity
|
|
C FAK1 - Eddington factor f(K) = K/J
|
|
C FH - the "surface" Eddington factor
|
|
C ALI1 - diagonal element of the lambda operator
|
|
C
|
|
IF(IBC.EQ.0) THEN
|
|
ALI1(ND)=RAD1(ND)/ST0(ND)
|
|
ALI1(ND-1)=RAD1(ND-1)/ST0(ND-1)
|
|
END IF
|
|
C
|
|
DJTOT=0.
|
|
DO ID=1,ND
|
|
DELTAJ=(RAD1(ID)-RAD(IJ,ID))/(UN+SS0(ID)*ALI1(ID))
|
|
RAD(IJ,ID)=RAD(IJ,ID)+DELTAJ
|
|
DJTOT=MAX(DJTOT,ABS(DELTAJ/RAD(IJ,ID)))
|
|
END DO
|
|
IF(DJTOT.GT.DJMAX.AND.ITRALI.LE.NTRALI) GO TO 10
|
|
C
|
|
C end of ALI loop for electron scattering
|
|
C
|
|
DO ID=1,ND
|
|
RAD1(ID)=RAD(IJ,ID)
|
|
FAK1(ID)=RDK(ID)/RAD(IJ,ID)
|
|
FKK(ID)=FAK1(ID)
|
|
END DO
|
|
FLUX(IJ)=AH
|
|
FH(IJ)=AH/RAD1(1)-HALF*ALB1
|
|
FH0=FH(IJ)
|
|
C
|
|
C correction of Lambda^star for scattering
|
|
C
|
|
IF(ILMCOR.EQ.1) THEN
|
|
DO ID=1,ND
|
|
ALI1(ID)=ALI1(ID)*(UN+SS0(ID))
|
|
END DO
|
|
IF(IBC.EQ.4) THEN
|
|
ALI1(ND)= ALI1(ND)/(UN+SS0(ND))
|
|
END IF
|
|
ELSE IF(ILMCOR.EQ.3) THEN
|
|
DO ID=1,ND
|
|
ALI1(ID)=ALI1(ID)/(UN+SS0(ID)*ALI1(ID))
|
|
END DO
|
|
IF(IBC.EQ.4) THEN
|
|
ALI1(ND)= ALI1(ND)*(UN+SS0(ND)*ALI1(ID))
|
|
END IF
|
|
END IF
|
|
C
|
|
C store quantities for explicit (linearized) frequencies
|
|
C
|
|
IF(IJEX(IJ).LE.0) RETURN
|
|
IJE=IJEX(IJ)
|
|
DO ID=1,ND
|
|
RADEX(IJE,ID)=RAD1(ID)
|
|
FAKEX(IJE,ID)=FAK1(ID)
|
|
END DO
|
|
Q0(IJE)=QQ0
|
|
UU0(IJE)=U0
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE RTEFR1(IJ)
|
|
C =====================
|
|
C
|
|
C Solution of the radiative transfer equation - for one frequency
|
|
C - for the known source function.
|
|
C Determination of the radiation field and variable Eddington
|
|
C factors.
|
|
C
|
|
C The numerical method used:
|
|
C for ISPLIN = 0 - the ordinary Feautrier scheme
|
|
C = 1 - the spline collocation method
|
|
C = 2 - Hermitian fourth-order method
|
|
C = 3 - improved Feautrier scheme
|
|
C (Rybicki & Hummer 1991, A&A 245, 171.)
|
|
C
|
|
C In all cases, the overall matrix system is solved by the standard
|
|
C Gaussian elimination, analogous to that described in SOLVE
|
|
C (auxiliary matrix D is called ALF in SOLVE; auxiliary vector ANU
|
|
C is called BET in SOLVE)
|
|
C
|
|
C U0 - derivative of Q0 wrt taumin;
|
|
C for "fixed" frequencies, U0 has the meaning of
|
|
C absorption coefficient * second moment H
|
|
C ( a quantity needed for lower boundary condition of the
|
|
C hydrostatic equilibrium equation, specifically for
|
|
C accounting for an effect of fixed-option transitions)
|
|
C
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
PARAMETER (SIXTH=UN/6.D0,
|
|
* THIRD=UN/3.D0,
|
|
* TWOTHR=TWO/3.D0)
|
|
DIMENSION AANU(MDEPTH),DDD(MDEPTH),FKK(MDEPTH),
|
|
* RDD(MDEPTH),ST0(MDEPTH),SS0(MDEPTH),AB0(MDEPTH),
|
|
* AA(MMU,MMU),BB(MMU,MMU),CC(MMU,MMU),VL(MMU),
|
|
* FFD(MMU,MMU),FF0D(MMU,MMU),
|
|
* FFPD(MMU,MMU),ali0(mdepth),ss0c(mdepth),
|
|
* AAA(MDEPTH),BBB(MDEPTH),CCC(MDEPTH),EEE(MDEPTH),
|
|
* ZZZ(MDEPTH),ALRH(MDEPTH),ALRM(MDEPTH),ALRP(MDEPTH),
|
|
* D(MMU,MMU,MDEPTH),ANU(MMU,MDEPTH),scor(mdepth)
|
|
DIMENSION rmmu(2*MMU),wmmu(2*MMU),rwmu(2*MMU),
|
|
* dtau(mdepth),ri(mdepth),ali(mdepth),alij1(mdepth)
|
|
dimension tau(mdepth)
|
|
COMMON/OPTDPT/DT(MDEPTH)
|
|
C
|
|
WW=W(IJ)
|
|
ISPL=ISPLIN
|
|
IF(ISPLIN.GE.5) THEN
|
|
ISPLIN=ISPL-5
|
|
IF(IJALI(IJ).GT.0) THEN
|
|
IF(IRTE.EQ.0) THEN
|
|
CALL RTEDF1(IJ)
|
|
ELSE
|
|
CALL RTEDF2(IJ)
|
|
END IF
|
|
ISPLIN=ISPL
|
|
if(ifprad.eq.0) return
|
|
DO ID=1,ND
|
|
if(.not.lskip(ID,IJ))
|
|
* PRADT(ID)=PRADT(ID)+RAD1(ID)*FAK1(ID)*W(ij)
|
|
END DO
|
|
if(.not.lskip(1,IJ))
|
|
* PRD0=PRD0+ABSO1(1)*W(IJ)*(RAD1(1)*FH(IJ)-HEXTRD(IJ))
|
|
DO ID=1,ND
|
|
PRADA(ID)=PRADA(ID)+RAD1(ID)*FAK1(ID)*WW
|
|
END DO
|
|
RETURN
|
|
END IF
|
|
END IF
|
|
C
|
|
if(icompt.gt.0.and.(iter.gt.1.or.ilam.gt.0)) then
|
|
call rtecf1(ij)
|
|
return
|
|
end if
|
|
c
|
|
C
|
|
FR=FREQ(IJ)
|
|
C
|
|
C total source function
|
|
C
|
|
AH=0.
|
|
DO ID=1,ND
|
|
AB0(ID)=ABSO1(ID)
|
|
ST0(ID)=EMIS1(ID)/AB0(ID)
|
|
RAD1(ID)=0.
|
|
ALI1(ID)=0.
|
|
END DO
|
|
C
|
|
C non-coherent electron scattering by lambda iteration
|
|
C
|
|
IF(NELSC.LE.0) THEN
|
|
DO ID=1,ND
|
|
SS0(ID)=-SCAT1(ID)/AB0(ID)
|
|
END DO
|
|
ELSE
|
|
DO ID=1,ND
|
|
ST0(ID)=ST0(ID)+SCAT1(ID)*EMEL1(ID)*RAD1(ID)/AB0(ID)
|
|
SS0(ID)=0.
|
|
END DO
|
|
END IF
|
|
C
|
|
C optical depth scale
|
|
C
|
|
tau(1)=absot(1)*dm(1)
|
|
DO ID=1,ND-1
|
|
DT(ID)=DELDMZ(ID)*(ABSOT(ID+1)+ABSOT(ID))
|
|
tau(id+1)=tau(id)+dt(id)
|
|
END DO
|
|
c
|
|
U0=0.
|
|
QQ0=0.
|
|
US0=0.
|
|
c TAUMIN=ABSO1(1)*DEDM1
|
|
taumin=absot(1)*dm(1)/2.
|
|
ALB1=0.
|
|
C
|
|
C Allowance for wind blanketing
|
|
C
|
|
IF(IWINBL.GT.0) ALB1=TWO*ALBE(IJ)/(UN+ALBE(IJ))
|
|
C
|
|
C ************** Forward elimination
|
|
C
|
|
C Upper boundary condition
|
|
C
|
|
ID=1
|
|
DTP1=DT(1)
|
|
P0=0.
|
|
EX=UN
|
|
IF(MOD(ISPLIN,3).EQ.0) THEN
|
|
B=DTP1*HALF
|
|
C=0.
|
|
ELSE
|
|
B=DTP1*THIRD
|
|
C=B*HALF
|
|
END IF
|
|
QQ0=0.
|
|
US0=0.
|
|
DO I=1,NMU
|
|
IF(IDISK.EQ.0) THEN
|
|
C
|
|
C allowance for non-zero optical depth at the first depth point
|
|
C
|
|
TAMM=TAUMIN/AMU(I)
|
|
EX=EXP(-TAMM)
|
|
P0=UN-EX
|
|
QQ0=QQ0+P0*AMU(I)*WTMU(I)
|
|
U0=U0+EX*WTMU(I)
|
|
US0=US0+P0/TAMM*WTMU(I)
|
|
END IF
|
|
C
|
|
BI=B/AMU(I)
|
|
CI=C/AMU(I)
|
|
VL(I)=(BI+P0)*ST0(ID)+CI*ST0(ID+1)
|
|
IF(IWINBL.LT.0) VL(I)=VL(I)+EXTINT(IJ,I)
|
|
DO J=1,NMU
|
|
BB(I,J)=SS0(ID)*WTMU(J)*(BI+P0)-ALB1*WTMU(J)
|
|
CC(I,J)=-CI*SS0(ID+1)*WTMU(J)
|
|
END DO
|
|
BB(I,I)=BB(I,I)+AMU(I)/DTP1+UN+BI
|
|
CC(I,I)=CC(I,I)+AMU(I)/DTP1-CI
|
|
ANU(I,ID)=0.
|
|
END DO
|
|
C
|
|
IF(ISPLIN.LE.2) THEN
|
|
CALL MATINV(BB,NMU,MMU)
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
D(I,J,ID)=0.
|
|
DO K=1,NMU
|
|
D(I,J,ID)=D(I,J,ID)+BB(I,K)*CC(K,J)
|
|
END DO
|
|
ANU(I,1)=ANU(I,1)+BB(I,J)*VL(J)
|
|
END DO
|
|
END DO
|
|
ELSE
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
FF0D(I,J)=BB(I,J)/CC(I,I)
|
|
END DO
|
|
FF0D(I,I)=FF0D(I,I)-UN
|
|
END DO
|
|
C
|
|
c CALL MINV3(BB)
|
|
CALL MATINV(BB,NMU,MMU)
|
|
DO I=1,NMU
|
|
ANU(I,ID)=0.
|
|
DO J=1,NMU
|
|
D(I,J,ID)=BB(I,J)*CC(J,J)
|
|
ANU(I,ID)=ANU(I,ID)+BB(I,J)*VL(J)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
C
|
|
C Normal depth points 1 < ID < ND
|
|
C
|
|
DO ID=2,ND-1
|
|
DTM1=DTP1
|
|
DTP1=DT(ID)
|
|
DT0=TWO/(DTM1+DTP1)
|
|
AL=UN/DTM1*DT0
|
|
GA=UN/DTP1*DT0
|
|
BE=AL+GA
|
|
IF(MOD(ISPLIN,3).EQ.0) THEN
|
|
A=0.
|
|
C=0.
|
|
ELSE IF(ISPLIN.EQ.1) THEN
|
|
A=DTM1*DT0*SIXTH
|
|
C=DTP1*DT0*SIXTH
|
|
ELSE
|
|
A=(UN-HALF*AL*DTP1*DTP1)*SIXTH
|
|
C=(UN-HALF*GA*DTM1*DTM1)*SIXTH
|
|
END IF
|
|
B=UN-A-C
|
|
VL0=A*ST0(ID-1)+B*ST0(ID)+C*ST0(ID+1)
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
AA(I,J)=-A*SS0(ID-1)*WTMU(J)
|
|
CC(I,J)=-C*SS0(ID+1)*WTMU(J)
|
|
BB(I,J)=B*SS0(ID)*WTMU(J)
|
|
END DO
|
|
END DO
|
|
DO I=1,NMU
|
|
VL(I)=VL0
|
|
DIV=AMU(I)*AMU(I)
|
|
AA(I,I)=AA(I,I)+DIV*AL-A
|
|
CC(I,I)=CC(I,I)+DIV*GA-C
|
|
BB(I,I)=BB(I,I)+DIV*BE+B
|
|
END DO
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
VL(I)=VL(I)+AA(I,J)*ANU(J,ID-1)
|
|
END DO
|
|
END DO
|
|
IF(ISPLIN.LE.2) THEN
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
S=0.
|
|
DO K=1,NMU
|
|
S=S+AA(I,K)*D(K,J,ID-1)
|
|
END DO
|
|
BB(I,J)=BB(I,J)-S
|
|
END DO
|
|
END DO
|
|
C
|
|
CALL MATINV(BB,NMU,MMU)
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
D(I,J,ID)=0.
|
|
DO K=1,NMU
|
|
D(I,J,ID)=D(I,J,ID)+BB(I,K)*CC(K,J)
|
|
END DO
|
|
END DO
|
|
END DO
|
|
ELSE
|
|
DO I=1,NMU
|
|
BB(I,I)=-AA(I,I)+BB(I,I)-CC(I,I)
|
|
DO J=1,NMU
|
|
FFPD(I,J)=AA(I,I)*FF0D(I,J)
|
|
END DO
|
|
END DO
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
S=0.
|
|
DO K=1,NMU
|
|
S=S+FFPD(I,K)*D(K,J,ID-1)
|
|
END DO
|
|
FFD(I,J)=(BB(I,J)+S)/CC(I,I)
|
|
END DO
|
|
END DO
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
FF0D(I,J)=FFD(I,J)
|
|
END DO
|
|
FFD(I,I)=FFD(I,I)+UN
|
|
END DO
|
|
C
|
|
CALL MATINV(FFD,NMU,MMU)
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
D(I,J,ID)=FFD(I,J)
|
|
BB(I,J)=FFD(I,J)/CC(J,J)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
DO I=1,NMU
|
|
ANU(I,ID)=0.
|
|
DO J=1,NMU
|
|
ANU(I,ID)=ANU(I,ID)+BB(I,J)*VL(J)
|
|
END DO
|
|
END DO
|
|
END DO
|
|
C
|
|
C Lower boundary condition
|
|
C
|
|
ID=ND
|
|
C
|
|
C First option:
|
|
C b.c. is different from stellar atmospheres; expresses symmetry
|
|
C at the central plane I(taumax,-mu,nu)=I(taumax,+mu,nu)
|
|
C
|
|
IF(IFZ0.GE.0.AND.IDISK.EQ.1) THEN
|
|
B=DTP1*HALF
|
|
A=0.
|
|
DO I=1,NMU
|
|
BI=B/AMU(I)
|
|
AI=A/AMU(I)
|
|
VL(I)=ST0(ID)*BI+ST0(ID-1)*AI
|
|
DO J=1,NMU
|
|
AA(I,J)=-AI*SS0(ID-1)*WTMU(J)
|
|
BB(I,J)=BI*SS0(ID)*WTMU(J)
|
|
END DO
|
|
AA(I,I)=AA(I,I)+AMU(I)/DTP1-AI
|
|
BB(I,I)=BB(I,I)+AMU(I)/DTP1+BI
|
|
END DO
|
|
DO I=1,NMU
|
|
S1=0.
|
|
DO J=1,NMU
|
|
S=0.
|
|
S1=S1+AA(I,J)*ANU(J,ID-1)
|
|
DO K=1,NMU
|
|
S=S+AA(I,K)*D(K,J,ID-1)
|
|
END DO
|
|
BB(I,J)=BB(I,J)-S
|
|
END DO
|
|
VL(I)=VL(I)+S1
|
|
END DO
|
|
C
|
|
C Second option:
|
|
C b.c. is the same as in stellar atmospheres - the last depth point
|
|
C is not at the central plane
|
|
C
|
|
ELSE
|
|
FR15=FR*1.D-15
|
|
BNU=BN*FR15*FR15*FR15
|
|
PLAND=BNU/(EXP(HK*FR/TEMP(ND ))-UN)*RRDIL
|
|
DPLAN=BNU/(EXP(HK*FR/TEMP(ND-1))-UN)*RRDIL
|
|
IF(TEMPBD.GT.0.) THEN
|
|
PLAND=BNU/(EXP(HK*FR/TEMPBD)-UN)*RRDIL
|
|
DPLAN=BNU/(EXP(HK*FR/TEMPBD)-UN)*RRDIL
|
|
END IF
|
|
DPLAN=(PLAND-DPLAN)/DT(ND-1)
|
|
IF(IBC.EQ.0.OR.IBC.EQ.4) THEN
|
|
DO I=1,NMU
|
|
AA(I,I)=AMU(I)/DTP1
|
|
VL(I)=PLAND+AMU(I)*DPLAN+AA(I,I)*ANU(I,ID-1)
|
|
DO J=1,NMU
|
|
BB(I,J)=-AA(I,I)*D(I,J,ID-1)
|
|
END DO
|
|
BB(I,I)=BB(I,I)+AA(I,I)+UN
|
|
END DO
|
|
ELSE
|
|
DO I=1,NMU
|
|
A=AMU(I)/DTP1
|
|
B=HALF/A
|
|
AA(I,I)=A
|
|
VL(I)=B*ST0(ID)+PLAND+AMU(I)*DPLAN+AA(I,I)*ANU(I,ID-1)
|
|
DO J=1,NMU
|
|
BB(I,J)=B*SS0(ID)*WTMU(J)-AA(I,I)*D(I,J,ID-1)
|
|
END DO
|
|
BB(I,I)=BB(I,I)+A+B+UN
|
|
END DO
|
|
END IF
|
|
END IF
|
|
C
|
|
CALL MATINV(BB,NMU,MMU)
|
|
C
|
|
DO I=1,NMU
|
|
ANU(I,ID)=0.
|
|
DO J=1,NMU
|
|
D(I,J,ID)=0.
|
|
ANU(I,ID)=ANU(I,ID)+BB(I,J)*VL(J)
|
|
END DO
|
|
END DO
|
|
C
|
|
C ***************** Backsolution
|
|
C
|
|
FKK(ND)=THIRD
|
|
AJ=0.
|
|
AH=0.
|
|
AK=0.
|
|
DO I=1,NMU
|
|
RMU=WTMU(I)*ANU(I,ID)
|
|
AJ=AJ+RMU
|
|
AH=AH+RMU*AMU(I)
|
|
AK=AK+RMU*AMU(I)*AMU(I)
|
|
END DO
|
|
RDD(ID)=AJ
|
|
IF(IBC.EQ.0) THEN
|
|
FKK(ND)=THIRD
|
|
ELSE
|
|
FKK(ID)=AK/AJ
|
|
FHD(IJ)=AH/AJ
|
|
END IF
|
|
C
|
|
DO ID=ND-1,1,-1
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
ANU(I,ID)=ANU(I,ID)+D(I,J,ID)*ANU(J,ID+1)
|
|
END DO
|
|
END DO
|
|
AJ=0.
|
|
AK=0.
|
|
DO I=1,NMU
|
|
RMU=WTMU(I)*ANU(I,ID)
|
|
AJ=AJ+RMU
|
|
AK=AK+RMU*AMU(I)*AMU(I)
|
|
END DO
|
|
C
|
|
C solution of the transfer equation
|
|
C Variables:
|
|
C ANU - Feautrier intensity
|
|
C RDD - mean intensity
|
|
C FKK - Eddington factor f(K) = K/J
|
|
C
|
|
FKK(ID)=AK/AJ
|
|
RDD(ID)=AJ
|
|
END DO
|
|
C
|
|
if(idisk.eq.1) then
|
|
do id=1,nd
|
|
fak(ij,id)=fkk(id)
|
|
end do
|
|
end if
|
|
C
|
|
C the "surface" Eddington factor fH
|
|
C
|
|
AH=0.
|
|
DO I=1,NMU
|
|
AH=AH+WTMU(I)*AMU(I)*ANU(I,1)
|
|
END DO
|
|
FH0=AH/AJ-HALF*ALB1
|
|
FH(IJ)=FH0
|
|
q0(ij)=qq0
|
|
uu0(ij)=u0
|
|
|
|
c q0(ij)=0.
|
|
c uu0(ij)=0.
|
|
|
|
C
|
|
C ********************
|
|
C
|
|
C Again solution of the transfer equation, now with Eddington
|
|
C FKK and FH determined above, to insure strict consistency of the
|
|
C radiation field and Eddington factors
|
|
C
|
|
if(ilmcor.eq.2) then
|
|
do id=1,nd
|
|
scor(id)=un/(un+ss0(id))
|
|
end do
|
|
else if(ilmcor.eq.3) then
|
|
do id=1,nd
|
|
ss0c(id)=ss0(id)
|
|
st0(id)=st0(id)-ss0(id)*rdd(id)
|
|
ss0(id)=0.
|
|
end do
|
|
end if
|
|
C
|
|
C Upper boundary condition
|
|
C
|
|
ID=1
|
|
DTP1=DT(ID)
|
|
IF(MOD(ISPLIN,3).EQ.0) THEN
|
|
B=DTP1*HALF
|
|
C=0.
|
|
ELSE
|
|
B=DTP1*THIRD
|
|
C=B*HALF
|
|
END IF
|
|
BQ=UN/(B+QQ0)
|
|
CQ=C*BQ
|
|
BBB(ID)=(FKK(ID)/DTP1+FH0+B)*BQ+SS0(ID)
|
|
CCC(ID)=(FKK(ID+1)/DTP1)*BQ-CQ*(UN+SS0(ID+1))
|
|
VLL=ST0(ID)+CQ*ST0(ID+1)
|
|
IF(IWINBL.LT.0) VLL=VLL+HEXTRD(IJ)*BQ
|
|
if(ilmcor.eq.2) then
|
|
bbb(id)=bbb(id)*scor(id)
|
|
ccc(id)=ccc(id)*scor(id)
|
|
vll=vll*scor(id)
|
|
end if
|
|
ZZZ(ID)=UN/BBB(ID)
|
|
AANU(ID)=VLL*ZZZ(ID)
|
|
DDD(ID)=CCC(ID)*ZZZ(ID)
|
|
IF(ISPLIN.GT.2) FFF=BBB(ID)/CCC(ID)-UN
|
|
C
|
|
C Normal depth point
|
|
C
|
|
DO ID=2,ND-1
|
|
DTM1=DTP1
|
|
DTP1=DT(ID)
|
|
DT0=TWO/(DTP1+DTM1)
|
|
AL=UN/DTM1*DT0
|
|
GA=UN/DTP1*DT0
|
|
IF(MOD(ISPLIN,3).EQ.0) THEN
|
|
A=0.
|
|
C=0.
|
|
ELSE IF(ISPLIN.EQ.1) THEN
|
|
A=DTM1*DT0*SIXTH
|
|
C=DTP1*DT0*SIXTH
|
|
ELSE
|
|
A=(UN-HALF*DTP1*DTP1*AL)*SIXTH
|
|
C=(UN-HALF*DTM1*DTM1*GA)*SIXTH
|
|
END IF
|
|
AAA(ID)=AL*FKK(ID-1)-A*(UN+SS0(ID-1))
|
|
CCC(ID)=GA*FKK(ID+1)-C*(UN+SS0(ID+1))
|
|
BBB(ID)=(AL+GA)*FKK(ID)+(UN-A-C)*(UN+SS0(ID))
|
|
VLL=A*ST0(ID-1)+C*ST0(ID+1)+(UN-A-C)*ST0(ID)
|
|
if(ilmcor.eq.2) then
|
|
aaa(id)=aaa(id)*scor(id)
|
|
bbb(id)=bbb(id)*scor(id)
|
|
ccc(id)=ccc(id)*scor(id)
|
|
vll=vll*scor(id)
|
|
end if
|
|
AANU(ID)=VLL+AAA(ID)*AANU(ID-1)
|
|
IF(ISPLIN.LE.2) THEN
|
|
ZZZ(ID)=UN/(BBB(ID)-AAA(ID)*DDD(ID-1))
|
|
DDD(ID)=CCC(ID)*ZZZ(ID)
|
|
AANU(ID)=AANU(ID)*ZZZ(ID)
|
|
ELSE
|
|
SUM=-AAA(ID)+BBB(ID)-CCC(ID)
|
|
FFF=(SUM+AAA(ID)*FFF*DDD(ID-1))/CCC(ID)
|
|
DDD(ID)=UN/(UN+FFF)
|
|
AANU(ID)=AANU(ID)*DDD(ID)/CCC(ID)
|
|
END IF
|
|
END DO
|
|
C
|
|
C Lower boundary condition
|
|
C
|
|
ID=ND
|
|
c
|
|
c stellar atmospheric
|
|
c
|
|
IF(IDISK.EQ.0.OR.IFZ0.LT.0) then
|
|
IF(IBC.EQ.0) THEN
|
|
BBB(ID)=FKK(ID)/DTP1+HALF
|
|
AAA(ID)=FKK(ID-1)/DTP1
|
|
VLL=HALF*PLAND+THIRD*DPLAN
|
|
ELSE IF(IBC.LT.4) THEN
|
|
B=UN/DTP1
|
|
A=TWO*B*B
|
|
BBB(ID)=UN+SS0(ID)+B*TWO*FHD(IJ)+A*FKK(ID)
|
|
AAA(ID)=A*FKK(ID-1)
|
|
VLL=ST0(ID)+B*(PLAND+TWOTHR*DPLAN)
|
|
ELSE
|
|
B=UN/DTP1
|
|
A=TWO*B*B
|
|
BBB(ID)=B+A*FKK(ID)
|
|
AAA(ID)=A*FKK(ID-1)
|
|
VLL=B*(PLAND+TWOTHR*DPLAN)
|
|
END IF
|
|
c
|
|
c accretion disk - symmetric boundary
|
|
c
|
|
ELSE
|
|
B=TWO/DTP1
|
|
BBB(ID)=FKK(ID)/DTP1*B+UN+SS0(ND)
|
|
AAA(ID)=FKK(ID-1)/DTP1*B
|
|
VLL=ST0(ID)
|
|
END IF
|
|
if(ilmcor.eq.2) then
|
|
aaa(id)=aaa(id)*scor(id)
|
|
bbb(id)=bbb(id)*scor(id)
|
|
vll=vll*scor(id)
|
|
end if
|
|
EEE(ND)=AAA(ID)/BBB(ID)
|
|
ZZZ(ID)=UN/(BBB(ID)-AAA(ID)*DDD(ID-1))
|
|
RAD1(ID)=(VLL+AAA(ID)*AANU(ID-1))*ZZZ(ID)
|
|
FAK1(ID)=FKK(ND)
|
|
ALRH(ID)=ZZZ(ID)
|
|
c
|
|
C Backsolution
|
|
C
|
|
DO ID=ND-1,1,-1
|
|
EEE(ID)=AAA(ID)/(BBB(ID)-CCC(ID)*EEE(ID+1))
|
|
RAD1(ID)=AANU(ID)+DDD(ID)*RAD1(ID+1)
|
|
FAK1(ID)=FKK(ID)
|
|
ALRH(ID)=ZZZ(ID)/(UN-DDD(ID)*EEE(ID+1))
|
|
ALRM(ID)=0
|
|
ALRP(ID)=0
|
|
END DO
|
|
FLUX(IJ)=FH(IJ)*RAD1(1)-half*hextrd(ij)
|
|
* -(st0(1)-ss0(1)*rad1(1))*q0(ij)
|
|
|
|
C
|
|
C evaluate approximate Lambda operator
|
|
C
|
|
C a) Rybicki-Hummer Lambda^star operator (diagonal)
|
|
C (for JALI = 1)
|
|
C
|
|
DO ID=1,ND
|
|
ALIM1(ID)=0.
|
|
ALIP1(ID)=0.
|
|
END DO
|
|
IF(JALI.EQ.1) THEN
|
|
DO ID=1,ND
|
|
ALI1(ID)=ALRH(ID)
|
|
END DO
|
|
c
|
|
IF(IBC.EQ.0) THEN
|
|
ali1(nd-1)=rad1(nd-1)/st0(nd-1)
|
|
ali1(nd)=rad1(nd)/st0(nd)
|
|
END IF
|
|
C
|
|
C for IFALI>5:
|
|
C tridiagonal Rybicki-Hummer operator (off-diagonal terms)
|
|
C
|
|
IF(IFALI.GE.6) THEN
|
|
ALIP1(1)=ALRH(2)*DDD(1)
|
|
DO ID=2,ND-1
|
|
ALIM1(ID)=ALRH(ID-1)*EEE(ID)
|
|
ALIP1(ID)=ALRH(ID+1)*DDD(ID)
|
|
END DO
|
|
ALIM1(ND)=ALRH(ND-1)*EEE(ND)
|
|
IF(IBC.EQ.0) THEN
|
|
ALIM1(nd)=0.
|
|
ALIM1(nd-1)=0.
|
|
ALIP1(nd)=0.
|
|
ALIP1(nd-1)=0.
|
|
END IF
|
|
END IF
|
|
c
|
|
C b) diagonal Olson-Kunasz Lambda^star operator,
|
|
C (for JALI = 2)
|
|
C
|
|
ELSE IF(JALI.EQ.2) THEN
|
|
DO ID=1,ND-1
|
|
ALI0(ID)=0.
|
|
DO I=1,NMU
|
|
DIV=DT(ID)/AMU(I)
|
|
ALI0(ID)=ALI0(ID)+(UN-EXP(-DIV))/DIV*WTMU(I)
|
|
END DO
|
|
END DO
|
|
DO ID=2,ND-1
|
|
ALI1(ID)=UN-HALF*(ALI0(ID)+ALI0(ID-1))
|
|
END DO
|
|
ALI1(1)=UN-HALF*(ALI0(1)+US0)
|
|
ALI1(ND)=UN-ALI0(ND-1)
|
|
ali1(nd-1)=rad1(nd-1)/st0(nd-1)
|
|
ali1(nd)=rad1(nd)/st0(nd)
|
|
END IF
|
|
C
|
|
C correction of Lambda^star for scattering
|
|
C
|
|
IF(ILMCOR.EQ.1) THEN
|
|
DO ID=1,ND
|
|
ALI1(ID)=ALI1(ID)*(UN+SS0(ID))
|
|
ALIM1(ID)=ALIM1(ID)*(UN+SS0(ID))
|
|
ALIP1(ID)=ALIP1(ID)*(UN+SS0(ID))
|
|
END DO
|
|
IF(IBC.EQ.4) THEN
|
|
ALI1(ND)= ALI1(ND)/(UN+SS0(ND))
|
|
ALIM1(ND)= ALIM1(ND)/(UN+SS0(ND))
|
|
ALIP1(ND)= ALIP1(ND)/(UN+SS0(ND))
|
|
END IF
|
|
END IF
|
|
C
|
|
if(ifalih.gt.0) then
|
|
c
|
|
c solution for the individual angles - to get Lambda^star_H
|
|
C
|
|
do id=1,nd
|
|
alih1(id)=0.
|
|
alij1(id)=0.
|
|
end do
|
|
nw=nmu
|
|
do i=1,nw
|
|
rmmu(i)=-amu(nw-i+1)
|
|
rmmu(i+nw)=amu(i)
|
|
wmmu(i)=wtmu(nw-i+1)
|
|
wmmu(i+nw)=wtmu(i)
|
|
end do
|
|
do i=1,2*nw
|
|
rwmu(i)=rmmu(i)*wmmu(i)*half
|
|
end do
|
|
C
|
|
c --------------------- loop over angles
|
|
c
|
|
do i=1,2*nw
|
|
do id=1,nd-1
|
|
dtau(id)=dt(id)/abs(rmmu(i))
|
|
end do
|
|
c
|
|
c boundary conditions
|
|
c
|
|
c rup=extrad(ij)
|
|
rup=extint(ij,i)
|
|
C
|
|
C diffusion approximation for semi-infinite atmospheres
|
|
C
|
|
rdown=pland+rmmu(i)*dplan
|
|
c
|
|
c solution of the transfer equation
|
|
c
|
|
call rtesol(dtau,st0,rup,rdown,rmmu(i),ri,ali)
|
|
c
|
|
DO ID=1,ND
|
|
alih1(id)=alih1(id)+rwmu(i)*ali(id)
|
|
alij1(id)=alij1(id)+wmmu(i)*ali(id)*half
|
|
END DO
|
|
end do
|
|
end if
|
|
C
|
|
c --------------------- end of loop over angles
|
|
c
|
|
ISPLIN=ISPL
|
|
c
|
|
if(idisk.ne.0) then
|
|
iji=nfreq-kij(ij)+1
|
|
DO ID=1,ND
|
|
rad(iji,id)=rad1(id)
|
|
END DO
|
|
end if
|
|
C
|
|
C radiation pressure
|
|
C
|
|
if(ifprad.gt.0) then
|
|
if(.not.lskip(1,IJ))
|
|
* PRD0=PRD0+ABSO1(1)*WW*(RAD1(1)*FH(IJ)-HEXTRD(IJ))
|
|
DO ID=1,ND
|
|
if(.not.lskip(ID,IJ))
|
|
* PRADT(ID)=PRADT(ID)+RAD1(ID)*FAK1(ID)*WW
|
|
PRADA(ID)=PRADA(ID)+RAD1(ID)*FAK1(ID)*WW
|
|
END DO
|
|
end if
|
|
c
|
|
if(chmax.ge.1.91e-3.and.chmax.le.2.03e-3) then
|
|
tauij=taumin
|
|
do id=1,nd
|
|
if(ilmcor.eq.3) ss0(id)=ss0c(id)
|
|
if(id.gt.1) tauij=tauij+dt(id-1)
|
|
write(97,697) ij,id,tauij,rad1(id),st0(id)/(un+ss0(id)),st0(id),
|
|
* un+ss0(id),ali1(id)
|
|
end do
|
|
697 format(2i4,1p6e12.4)
|
|
end if
|
|
|
|
C
|
|
C store quantities for explicit (linearized) frequencies
|
|
C
|
|
IF(IJEX(IJ).LE.0) RETURN
|
|
IJE=IJEX(IJ)
|
|
DO ID=1,ND
|
|
RADEX(IJE,ID)=RAD1(ID)
|
|
FAKEX(IJE,ID)=FAK1(ID)
|
|
END DO
|
|
c Q0(IJE)=QQ0
|
|
c UU0(IJE)=U0
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE RTEINT
|
|
C =================
|
|
C
|
|
C Solution of the radiative transfer equation - for one frequency
|
|
C - for the known source function.
|
|
C
|
|
C Solution for specific intensities
|
|
C
|
|
C The numerical method used:
|
|
C for ISPLIN = 0 - the ordinary Feautrier scheme
|
|
C = 1 - the spline collocation method
|
|
C = 2 - Hermitian fourth-order method
|
|
C = 3 - improved Feautrier scheme
|
|
C (Rybicki & Hummer 1991, A&A 245, 171.)
|
|
C
|
|
C In all cases, the overall matrix system is solved by the standard
|
|
C Gaussian elimination, analogous to that described in SOLVE
|
|
C (auxiliary matrix D is called ALF in SOLVE; auxiliary vector ANU
|
|
C is called BET in SOLVE)
|
|
C
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
PARAMETER (SIXTH=UN/6.D0,
|
|
* THIRD=UN/3.D0,
|
|
* TWOTHR=TWO/3.D0)
|
|
PARAMETER (MMA=20)
|
|
DIMENSION ST0(MDEPTH),SS0(MDEPTH),AB0(MDEPTH),
|
|
* AA(MMA,MMA),BB(MMA,MMA),CC(MMA,MMA),VL(MMA),
|
|
* FFD(MMA,MMA),FF0D(MMA,MMA),FFPD(MMA,MMA),
|
|
* D(MMA,MMA,MDEPTH),ANU(MMA,MDEPTH)
|
|
DIMENSION tau(mdepth),angl(mma),WANG(MMA)
|
|
COMMON/OPTDPT/DT(MDEPTH)
|
|
C
|
|
nmuf=nmu
|
|
nmu=intens
|
|
do imu=1,nmu
|
|
angl(imu)=0.1+float(imu-1)*0.9/float(nmu-1)
|
|
wang(imu)=0.9/float(nmu-1)
|
|
end do
|
|
wang(1)=wang(1)*0.5
|
|
wang(nmu)=WANG(NMU)*0.5
|
|
C
|
|
DO 500 IJO=1,NFREQ
|
|
IJ=IJO
|
|
IF(ispodf.eq.0) IJ=JIK(IJO)
|
|
IF(IJX(IJ).EQ.-1) GO TO 500
|
|
call opacf1(IJ)
|
|
c
|
|
FR=FREQ(IJ)
|
|
C
|
|
C total source function
|
|
C
|
|
AH=0.
|
|
DO ID=1,ND
|
|
AB0(ID)=ABSO1(ID)
|
|
ST0(ID)=EMIS1(ID)/AB0(ID)
|
|
SS0(ID)=-SCAT1(ID)/AB0(ID)
|
|
RAD1(ID)=0.
|
|
END DO
|
|
C
|
|
C optical depth scale
|
|
C
|
|
tau(1)=absot(1)*dm(1)
|
|
DO ID=1,ND-1
|
|
DT(ID)=DELDMZ(ID)*(ABSOT(ID+1)+ABSOT(ID))
|
|
tau(id+1)=tau(id)+dt(id)
|
|
END DO
|
|
c
|
|
U0=0.
|
|
QQ0=0.
|
|
US0=0.
|
|
taumin=absot(1)*dm(1)/2.
|
|
C
|
|
ALB1=0.
|
|
C
|
|
C ************** Forward elimination
|
|
C
|
|
C Upper boundary condition
|
|
C
|
|
ID=1
|
|
DTP1=DT(1)
|
|
P0=0.
|
|
EX=UN
|
|
IF(MOD(ISPLIN,3).EQ.0) THEN
|
|
B=DTP1*HALF
|
|
C=0.
|
|
ELSE
|
|
B=DTP1*THIRD
|
|
C=B*HALF
|
|
END IF
|
|
QQ0=0.
|
|
US0=0.
|
|
DO I=1,NMU
|
|
IF(IDISK.EQ.0) THEN
|
|
C
|
|
C allowance for non-zero optical depth at the first depth point
|
|
C
|
|
TAMM=TAUMIN/ANGL(I)
|
|
EX=EXP(-TAMM)
|
|
P0=UN-EX
|
|
QQ0=QQ0+P0*ANGL(I)*WANG(I)
|
|
U0=U0+EX*WANG(I)
|
|
US0=US0+P0/TAMM*WANG(I)
|
|
END IF
|
|
C
|
|
BI=B/ANGL(I)
|
|
CI=C/ANGL(I)
|
|
VL(I)=(BI+P0)*ST0(ID)+CI*ST0(ID+1)
|
|
IF(IWINBL.LT.0) VL(I)=VL(I)+EXTRAD(IJ)
|
|
DO J=1,NMU
|
|
BB(I,J)=SS0(ID)*WANG(J)*(BI+P0)-ALB1*WANG(J)
|
|
CC(I,J)=-CI*SS0(ID+1)*WANG(J)
|
|
END DO
|
|
BB(I,I)=BB(I,I)+ANGL(I)/DTP1+UN+BI
|
|
CC(I,I)=CC(I,I)+ANGL(I)/DTP1-CI
|
|
ANU(I,ID)=0.
|
|
END DO
|
|
C
|
|
IF(ISPLIN.LE.2) THEN
|
|
CALL MATINV(BB,NMU,MMA)
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
D(I,J,ID)=0.
|
|
DO K=1,NMU
|
|
D(I,J,ID)=D(I,J,ID)+BB(I,K)*CC(K,J)
|
|
END DO
|
|
ANU(I,1)=ANU(I,1)+BB(I,J)*VL(J)
|
|
END DO
|
|
END DO
|
|
ELSE
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
FF0D(I,J)=BB(I,J)/CC(I,I)
|
|
END DO
|
|
FF0D(I,I)=FF0D(I,I)-UN
|
|
END DO
|
|
C
|
|
CALL MATINV(BB,NMU,MMA)
|
|
DO I=1,NMU
|
|
ANU(I,ID)=0.
|
|
DO J=1,NMU
|
|
D(I,J,ID)=BB(I,J)*CC(J,J)
|
|
ANU(I,ID)=ANU(I,ID)+BB(I,J)*VL(J)
|
|
END DO
|
|
END DO
|
|
ENDIF
|
|
C
|
|
C Normal depth points 1 < ID < ND
|
|
C
|
|
DO ID=2,ND-1
|
|
DTM1=DTP1
|
|
DTP1=DT(ID)
|
|
DT0=TWO/(DTM1+DTP1)
|
|
AL=UN/DTM1*DT0
|
|
GA=UN/DTP1*DT0
|
|
BE=AL+GA
|
|
IF(MOD(ISPLIN,3).EQ.0) THEN
|
|
A=0.
|
|
C=0.
|
|
ELSE IF(ISPLIN.EQ.1) THEN
|
|
A=DTM1*DT0*SIXTH
|
|
C=DTP1*DT0*SIXTH
|
|
ELSE
|
|
A=(UN-HALF*AL*DTP1*DTP1)*SIXTH
|
|
C=(UN-HALF*GA*DTM1*DTM1)*SIXTH
|
|
END IF
|
|
B=UN-A-C
|
|
VL0=A*ST0(ID-1)+B*ST0(ID)+C*ST0(ID+1)
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
AA(I,J)=-A*SS0(ID-1)*WANG(J)
|
|
CC(I,J)=-C*SS0(ID+1)*WANG(J)
|
|
BB(I,J)=B*SS0(ID)*WANG(J)
|
|
END DO
|
|
END DO
|
|
DO I=1,NMU
|
|
VL(I)=VL0
|
|
DIV=ANGL(I)*ANGL(I)
|
|
AA(I,I)=AA(I,I)+DIV*AL-A
|
|
CC(I,I)=CC(I,I)+DIV*GA-C
|
|
BB(I,I)=BB(I,I)+DIV*BE+B
|
|
END DO
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
VL(I)=VL(I)+AA(I,J)*ANU(J,ID-1)
|
|
END DO
|
|
END DO
|
|
IF(ISPLIN.LE.2) THEN
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
S=0.
|
|
DO K=1,NMU
|
|
S=S+AA(I,K)*D(K,J,ID-1)
|
|
END DO
|
|
BB(I,J)=BB(I,J)-S
|
|
END DO
|
|
END DO
|
|
C
|
|
CALL MATINV(BB,NMU,MMA)
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
D(I,J,ID)=0.
|
|
DO K=1,NMU
|
|
D(I,J,ID)=D(I,J,ID)+BB(I,K)*CC(K,J)
|
|
END DO
|
|
END DO
|
|
END DO
|
|
ELSE
|
|
DO I=1,NMU
|
|
BB(I,I)=-AA(I,I)+BB(I,I)-CC(I,I)
|
|
DO J=1,NMU
|
|
FFPD(I,J)=AA(I,I)*FF0D(I,J)
|
|
END DO
|
|
END DO
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
S=0.
|
|
DO K=1,NMU
|
|
S=S+FFPD(I,K)*D(K,J,ID-1)
|
|
END DO
|
|
FFD(I,J)=(BB(I,J)+S)/CC(I,I)
|
|
END DO
|
|
END DO
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
FF0D(I,J)=FFD(I,J)
|
|
END DO
|
|
FFD(I,I)=FFD(I,I)+UN
|
|
END DO
|
|
C
|
|
CALL MATINV(FFD,NMU,MMA)
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
D(I,J,ID)=FFD(I,J)
|
|
BB(I,J)=FFD(I,J)/CC(J,J)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
DO I=1,NMU
|
|
ANU(I,ID)=0.
|
|
DO J=1,NMU
|
|
ANU(I,ID)=ANU(I,ID)+BB(I,J)*VL(J)
|
|
END DO
|
|
END DO
|
|
END DO
|
|
C
|
|
C Lower boundary condition
|
|
C
|
|
ID=ND
|
|
C
|
|
C First option:
|
|
C b.c. is different from stellar atmospheres; expresses symmetry
|
|
C at the central plane I(taumax,-mu,nu)=I(taumax,+mu,nu)
|
|
C
|
|
IF(IFZ0.GE.0.AND.IDISK.EQ.1) THEN
|
|
B=DTP1*HALF
|
|
A=0.
|
|
DO I=1,NMU
|
|
BI=B/ANGL(I)
|
|
AI=A/ANGL(I)
|
|
VL(I)=ST0(ID)*BI+ST0(ID-1)*AI
|
|
DO J=1,NMU
|
|
AA(I,J)=-AI*SS0(ID-1)*WANG(J)
|
|
BB(I,J)=BI*SS0(ID)*WANG(J)
|
|
END DO
|
|
AA(I,I)=AA(I,I)+ANGL(I)/DTP1-AI
|
|
BB(I,I)=BB(I,I)+ANGL(I)/DTP1+BI
|
|
END DO
|
|
DO I=1,NMU
|
|
S1=0.
|
|
DO J=1,NMU
|
|
S=0.
|
|
S1=S1+AA(I,J)*ANU(J,ID-1)
|
|
DO K=1,NMU
|
|
S=S+AA(I,K)*D(K,J,ID-1)
|
|
END DO
|
|
BB(I,J)=BB(I,J)-S
|
|
END DO
|
|
VL(I)=VL(I)+S1
|
|
END DO
|
|
C
|
|
C Second option:
|
|
C b.c. is the same as in stellar atmospheres - the last depth point
|
|
C is not at the central plane
|
|
C
|
|
ELSE
|
|
FR15=FR*1.D-15
|
|
BNU=BN*FR15*FR15*FR15
|
|
PLAND=BNU/(EXP(HK*FR/TEMP(ND ))-UN)*RRDIL
|
|
DPLAN=BNU/(EXP(HK*FR/TEMP(ND-1))-UN)*RRDIL
|
|
IF(TEMPBD.GT.0.) THEN
|
|
PLAND=BNU/(EXP(HK*FR/TEMPBD)-UN)*RRDIL
|
|
DPLAN=BNU/(EXP(HK*FR/TEMPBD)-UN)*RRDIL
|
|
END IF
|
|
DPLAN=(PLAND-DPLAN)/DT(ND-1)
|
|
IF(IBC.EQ.0.OR.IBC.EQ.4) THEN
|
|
DO I=1,NMU
|
|
AA(I,I)=ANGL(I)/DTP1
|
|
VL(I)=PLAND+ANGL(I)*DPLAN+AA(I,I)*ANU(I,ID-1)
|
|
DO J=1,NMU
|
|
BB(I,J)=-AA(I,I)*D(I,J,ID-1)
|
|
END DO
|
|
BB(I,I)=BB(I,I)+AA(I,I)+UN
|
|
END DO
|
|
ELSE
|
|
DO I=1,NMU
|
|
A=ANGL(I)/DTP1
|
|
B=HALF/A
|
|
AA(I,I)=A
|
|
VL(I)=B*ST0(ID)+PLAND+ANGL(I)*DPLAN+AA(I,I)*ANU(I,ID-1)
|
|
DO J=1,NMU
|
|
BB(I,J)=B*SS0(ID)*WANG(J)-AA(I,I)*D(I,J,ID-1)
|
|
END DO
|
|
BB(I,I)=BB(I,I)+A+B+UN
|
|
END DO
|
|
END IF
|
|
END IF
|
|
C
|
|
CALL MATINV(BB,NMU,MMA)
|
|
C
|
|
DO 230 I=1,NMU
|
|
ANU(I,ID)=0.
|
|
DO 230 J=1,NMU
|
|
D(I,J,ID)=0.
|
|
ANU(I,ID)=ANU(I,ID)+BB(I,J)*VL(J)
|
|
230 CONTINUE
|
|
C
|
|
C ***************** Backsolution
|
|
C
|
|
DO ID=ND-1,1,-1
|
|
DO I=1,NMU
|
|
DO J=1,NMU
|
|
ANU(I,ID)=ANU(I,ID)+D(I,J,ID)*ANU(J,ID+1)
|
|
END DO
|
|
END DO
|
|
END DO
|
|
c
|
|
sum=0.
|
|
sua=0.
|
|
do imu=1,nmu
|
|
sum=sum+anu(imu,1)*angl(imu)*wang(imu)
|
|
sua=sua+angl(imu)*wang(imu)
|
|
end do
|
|
C
|
|
wlam=2.997925e18/freq(ij)
|
|
WRITE(18,641) WLAM,flux(ij),sum,sua,(2.*ANU(IMU,1),IMU=1,NMU)
|
|
641 format(f11.3,(1p13e11.3))
|
|
c
|
|
500 continue
|
|
nmu=nmuf
|
|
c
|
|
return
|
|
end
|
|
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE OPACF0(ID,NFRQ)
|
|
C ==========================
|
|
C
|
|
C Absorption, emission, and scattering coefficients
|
|
C at depth ID
|
|
C
|
|
C Input: ID opacity and emissivity is calculated for the
|
|
C depth point ID
|
|
C Output: ABSO - array of absorption coefficient
|
|
C EMIS - array of emission coefficient
|
|
C SCAT - array of scattering coefficient
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
PARAMETER (FRH=3.28805E15, PH2=2.815D29*2., EHB=157802.77355)
|
|
PARAMETER (CFF1=1.3727D-25,CFF2=4.3748D-10,CFF3=2.5993D-7)
|
|
PARAMETER (C14=2.99793D14)
|
|
PARAMETER (SGFF0 = 3.694D8)
|
|
common/hmolab/anh2(mdepth),anhm(mdepth)
|
|
DIMENSION FREDG(NLMX),S(NLMX),SUM(NLMX),PRF(MFREQL)
|
|
C
|
|
C initialize
|
|
c
|
|
C this part is analogous to TDPINI - for one depth only
|
|
C
|
|
T=TEMP(ID)
|
|
T1=UN/T
|
|
HKT1(ID)=HK*T1
|
|
HKT21(ID)=HKT1(ID)*T1
|
|
TK1(ID)=HKT1(ID)/H
|
|
SQT1(ID)=SQRT(T)
|
|
TEMP1(ID)=T1
|
|
CALL GFREE0(ID)
|
|
EMEL1(ID)=UN
|
|
LASER=ITER.GT.ITLAS
|
|
c
|
|
C this part is analogous to OPAINI - for one depth only
|
|
C
|
|
ANE=ELEC(ID)
|
|
ELEC1(ID)=UN/ANE
|
|
DENS1(ID)=UN/DENS(ID)
|
|
DENSI(ID)=DENS1(ID)
|
|
DENSIM(ID)=DENSI(ID)*WMM(ID)
|
|
ELSCAT(ID)=ANE*SIGE
|
|
if(izscal.eq.1) then
|
|
densi(id)=un
|
|
densim(id)=0.
|
|
end if
|
|
CALL DWNFR0(ID)
|
|
CALL WNSTOR(ID)
|
|
CALL SABOLF(ID)
|
|
c
|
|
c quantities for the bound-free opacity
|
|
c
|
|
DO IBFT=1,NTRANC
|
|
ITR=ITRBF(IBFT)
|
|
IF(INDEXP(ITR).NE.0) THEN
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
IT=ITRA(JJ,II)
|
|
IE=IEL(II)
|
|
NKE=NNEXT(IE)
|
|
CORR=UN
|
|
IF(NKE.NE.JJ) CORR=G(NKE)/G(JJ)*
|
|
* EXP((ENION(NKE)-ENION(JJ))*TK1(ID))
|
|
ABTRA(ITR,ID)=POPUL(II,ID)
|
|
EMTRA(ITR,ID)=POPUL(JJ,ID)*ANE*SBF(II)*WOP(II,ID)*CORR
|
|
END IF
|
|
END DO
|
|
c
|
|
c quantities for the free-free opacity
|
|
c
|
|
IF(IELHM.GT.0) THEN
|
|
CFFN(ID)=POPUL(NFIRST(IELH),ID)*ANE
|
|
CFFT(ID)=CFF2-CFF3/T
|
|
END IF
|
|
SGFF=SGFF0/SQT1(ID)*ANE
|
|
DO ION=1,NION
|
|
SFF2(ION,ID)=EXP(FF(ION)*HKT1(ID))
|
|
SFF3(ION,ID)=POPUL(NNEXT(ION),ID)*CHARG2(ION)*SGFF
|
|
END DO
|
|
c
|
|
C this part is analogous to SGMER0 - for one depth only
|
|
C
|
|
IMER=0
|
|
DO II=1,NLEVEL
|
|
IF(IFWOP(II).LT.0) THEN
|
|
IMER=IMER+1
|
|
IMRG(II)=IMER
|
|
IIMER(IMER)=II
|
|
IE=IEL(II)
|
|
CH=IZ(IE)*IZ(IE)
|
|
FRCH(IMER)=FRH*CH
|
|
SGM0(IMER)=PH2*CH*CH
|
|
II0=NQUANT(II-1)+1
|
|
EX=EHB*CH*TEMP1(ID)
|
|
DO I=II0,NLMX
|
|
FREDG(I)=FRCH(IMER)*XI2(I)
|
|
EXI=EXP(EX*XI2(I))
|
|
S(I)=EXI*WNHINT(I,ID)*XI3(I)
|
|
SUM(I)=0.
|
|
END DO
|
|
SUM(NLMX)=S(NLMX)
|
|
DO I=NLMX-1,II0,-1
|
|
SUM(I)=SUM(I+1)+S(I)
|
|
END DO
|
|
DO I=1,II0-1
|
|
SUM(I)=SUM(II0)
|
|
END DO
|
|
SGEM=SGM0(IMER)/GMER(IMER,ID)
|
|
DO I=1,NLMX
|
|
SGMSUM(I,IMER,ID)=SUM(I)*SGEM
|
|
END DO
|
|
END IF
|
|
END DO
|
|
C
|
|
C initialization of the line opacity
|
|
C
|
|
IF(NFRQ.GT.NFREQC) THEN
|
|
DO 10 ITR=1,NTRANS
|
|
IF(.NOT.LINE(ITR)) GO TO 10
|
|
IF(INTMOD(ITR).EQ.0) GO TO 10
|
|
INDXA=IABS(INDEXP(ITR))
|
|
IJL0=IFR0(ITR)
|
|
IJL1=IFR1(ITR)
|
|
IF(ISPODF.GE.1) THEN
|
|
IJL0=KFR0(ITR)
|
|
IJL1=KFR1(ITR)
|
|
END IF
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
IF(INDXA.LT.2.OR.INDXA.GT.4) THEN
|
|
CALL LINPRO(ITR,ID,PRF)
|
|
DO IJ=IJL0,IJL1
|
|
PRFLIN(ID,IJ)=real(PRF(IJ-IJL0+1))
|
|
END DO
|
|
END IF
|
|
10 CONTINUE
|
|
GG=G(II)/G(JJ)
|
|
IF(IFWOP(JJ).GE.0) THEN
|
|
PI=POPUL(II,ID)*WOP(JJ,ID)
|
|
PJ=POPUL(JJ,ID)*WOP(II,ID)*GG
|
|
ELSE
|
|
PI=POPUL(II,ID)
|
|
PJ=POPUL(JJ,ID)*WOP(II,ID)*G(II)/GMER(IMRG(JJ),ID)
|
|
END IF
|
|
ABTRA(ITR,ID)=PI
|
|
EMTRA(ITR,ID)=PJ*EXP(FR0(ITR)*HKT1(ID))
|
|
IF(LASER) THEN
|
|
qtt=0.
|
|
if(pi.ne.pj) QTT=PJ/(PI-PJ)*(EXP(FR0(ITR)*HKT1(ID))-UN)
|
|
lfr=fr0(itr).lt.frtabm.and.iadop(iatm(ii)).gt.0
|
|
IF(QTT.LT.0. .OR. QTT.GT.QTLAS .or. lfr) THEN
|
|
ABTRA(ITR,ID)=0.
|
|
EMTRA(ITR,ID)=0.
|
|
END IF
|
|
END IF
|
|
END IF
|
|
C
|
|
C ---------------------------------------------------------
|
|
C
|
|
C loop over frequency points
|
|
C
|
|
ICALL=1
|
|
DO IJ=1,NFRQ
|
|
if(icompt.gt.0) ELSCAT(ID)=ELEC(ID)*SIGEC(IJ)
|
|
ABSO(IJ)=ELSCAT(ID)
|
|
EMIS(IJ)=0.
|
|
SCAT(IJ)=ELSCAT(ID)
|
|
C
|
|
C basic frequency- and depth-dependent quantities
|
|
C
|
|
FR=FREQ(IJ)
|
|
FRINV=UN/FR
|
|
FR3INV=FRINV*FRINV*FRINV
|
|
XKF(ID)=EXP(-HKT1(ID)*FR)
|
|
XKF1(ID)=UN-XKF(ID)
|
|
XKFB(ID)=XKF(ID)*BNUE(IJ)
|
|
C
|
|
C ******** 1. bound-free contribution
|
|
C
|
|
DO 30 IBFT=1,NTRANC
|
|
ITR=ITRBF(IBFT)
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
if(iadop(iatm(ii)).gt.0.and.fr.le.frtabm) go to 30
|
|
if(ifdiel.eq.0) then
|
|
SG=CROSS(IBFT,IJ)
|
|
else
|
|
SG=CROSSD(IBFT,IJ,ID)
|
|
endif
|
|
IF(IFWOP(II).LT.0) THEN
|
|
IMER=IMRG(II)
|
|
CALL SGMER1(FRINV,FR3INV,IMER,ID,SGME1)
|
|
SGMG(IMER,ID)=SGME1
|
|
SG=SGME1
|
|
END IF
|
|
IF(SG.LE.0.) GO TO 30
|
|
IF(MCDW(ITR).GT.0) THEN
|
|
IZZ=IZ(IEL(II))
|
|
CALL DWNFR1(FR,FR0(ITR),ID,IZZ,DW1)
|
|
DWF1(MCDW(ITR),ID)=DW1
|
|
SG=SG*DW1
|
|
END IF
|
|
EMISBF=SG*EMTRA(ITR,ID)
|
|
ABSO(IJ)=ABSO(IJ)+SG*ABTRA(ITR,ID)
|
|
EMIS(IJ)=EMIS(IJ)+EMISBF
|
|
30 CONTINUE
|
|
C
|
|
C ******** 2. free-free contribution
|
|
C
|
|
DO 40 ION=1,NION
|
|
IT=ITRA(NNEXT(ION),NNEXT(ION))
|
|
if(iadop(iatm(nnext(ioon))).gt.0.and.fr.le.frtabm) go to 40
|
|
C
|
|
C hydrogenic with Gaunt factor = 1
|
|
C
|
|
IF(IT.EQ.1) THEN
|
|
SF1=SFF3(ION,ID)*FR3INV
|
|
SF2=SFF2(ION,ID)
|
|
IF(FR.LT.FF(ION)) SF2=UN/XKF(ID)
|
|
ABSOFF=SF1*SF2
|
|
ABSO(IJ)=ABSO(IJ)+ABSOFF
|
|
EMIS(IJ)=EMIS(IJ)+ABSOFF
|
|
C
|
|
C hydrogenic with exact Gaunt factor
|
|
C
|
|
ELSE IF(IT.EQ.2) THEN
|
|
SF1=SFF3(ION,ID)*FR3INV
|
|
SF2=SFF2(ION,ID)
|
|
IF(FR.LT.FF(ION)) SF2=UN/XKF(ID)
|
|
X=C14*CHARG2(ION)/FR
|
|
SF2=SF2-UN+GFREE1(ID,X)
|
|
ABSOFF=SF1*SF2
|
|
ABSO(IJ)=ABSO(IJ)+ABSOFF
|
|
EMIS(IJ)=EMIS(IJ)+ABSOFF
|
|
C
|
|
C H minus free-free opacity
|
|
C
|
|
ELSE IF(IT.EQ.3) THEN
|
|
c ABSOFF=(CFF1+CFFT(ID)*FRINV)*CFFN(ID)*FRINV
|
|
ABSOFF=SFFHMI(POPUL(NFIRST(IELH),ID),FR,TEMP(ID))*
|
|
* ELEC(ID)
|
|
ABSO(IJ)=ABSO(IJ)+ABSOFF
|
|
EMIS(IJ)=EMIS(IJ)+ABSOFF
|
|
C
|
|
C special evaluation of the cross-section
|
|
C
|
|
ELSE IF(IT.LT.0) THEN
|
|
ABSOFF=FFCROS(ION,IT,TEMP(ID),FR)*
|
|
* POPUL(NNEXT(ION),ID)*ELEC(ID)
|
|
ABSO(IJ)=ABSO(IJ)+ABSOFF
|
|
EMIS(IJ)=EMIS(IJ)+ABSOFF
|
|
END IF
|
|
40 CONTINUE
|
|
C
|
|
C ******** 3. - additional continuum opacity (OPADD)
|
|
C
|
|
IF(IOPADD.NE.0) THEN
|
|
CALL OPADD(0,ICALL,IJ,ID)
|
|
ABSO(IJ)=ABSO(IJ)+ABAD
|
|
EMIS(IJ)=EMIS(IJ)+EMAD
|
|
SCAT(IJ)=SCAT(IJ)+SCAD
|
|
END IF
|
|
C
|
|
C ******** 4. - opacity and emissivity in lines
|
|
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)
|
|
iad=iadop(iatm(ilow(itr)))
|
|
if(iad.eq.0.or.(lfre.and.iad.gt.0)) then
|
|
SG=PRFLIN(ID,IJ)
|
|
ABSO(IJ)=ABSO(IJ)+SG*ABTRA(ITR,ID)
|
|
EMIS(IJ)=EMIS(IJ)+SG*EMTRA(ITR,ID)
|
|
end if
|
|
END IF
|
|
IF(NLINES(IJ).LE.0) GO TO 110
|
|
C
|
|
C the "overlapping" lines at the given frequency
|
|
C
|
|
DO 100 ILINT=1,NLINES(IJ)
|
|
ITR=ITRLIN(ILINT,IJ)
|
|
iad=iadop(iatm(ilow(itr)))
|
|
if(iad.gt.0.and..not.lfre) go to 100
|
|
if(linexp(itr)) go to 100
|
|
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
|
|
X=UN/(FREQ(IJ1)-FREQ(IJ0))
|
|
A1=(FR-FREQ(IJ0))*X
|
|
X=UN/(FREQ(IJ1)-FREQ(IJ0))
|
|
A2=(FREQ(IJ1)-FR)*X
|
|
SG=A1*PRFLIN(ID,IJ1)+A2*PRFLIN(ID,IJ0)
|
|
ABSO(IJ)=ABSO(IJ)+SG*ABTRA(ITR,ID)
|
|
EMIS(IJ)=EMIS(IJ)+SG*EMTRA(ITR,ID)
|
|
100 CONTINUE
|
|
110 CONTINUE
|
|
C
|
|
C Opacity sampling option
|
|
C
|
|
ELSE
|
|
IF(NLINES(IJ).LE.0) GO TO 400
|
|
DO 300 ILINT=1,NLINES(IJ)
|
|
ITR=ITRLIN(ILINT,IJ)
|
|
iad=iadop(iatm(ilow(itr)))
|
|
if(iad.gt.0.and..not.lfre) go to 300
|
|
KJ=IJ-IFR0(ITR)+KFR0(ITR)
|
|
INDXPA=IABS(INDEXP(ITR))
|
|
IF(INDXPA.NE.3 .AND. INDXPA.NE.4) THEN
|
|
DO ID=1,ND
|
|
SG=PRFLIN(ID,KJ)
|
|
ABSO(IJ)=ABSO(IJ)+SG*ABTRA(ITR,ID)
|
|
EMIS(IJ)=EMIS(IJ)+SG*EMTRA(ITR,ID)
|
|
END DO
|
|
ELSE
|
|
DO ID=1,ND
|
|
KJD=JIDI(ID)
|
|
SG=EXP(XJID(ID)*SIGFE(KJD,KJ)+(UN-XJID(ID))*
|
|
* SIGFE(KJD+1,KJ))
|
|
ABSO(IJ)=ABSO(IJ)+SG*ABTRA(ITR,ID)
|
|
EMIS(IJ)=EMIS(IJ)+SG*EMTRA(ITR,ID)
|
|
END DO
|
|
END IF
|
|
300 CONTINUE
|
|
400 CONTINUE
|
|
END IF
|
|
C
|
|
C ----------------------------
|
|
C total opacity and emissivity
|
|
C ----------------------------
|
|
C
|
|
ABSO(IJ)=ABSO(IJ)-EMIS(IJ)*XKF(ID)
|
|
EMIS(IJ)=EMIS(IJ)*XKFB(ID)
|
|
c
|
|
c --------------------------------------------------------
|
|
c contribution from precalculated background opacity table
|
|
c --------------------------------------------------------`
|
|
c
|
|
if(ioptab.gt.0) then
|
|
call opact1(ij)
|
|
end if
|
|
c
|
|
END DO
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE SRTFRQ
|
|
C =================
|
|
C
|
|
C Sort the frequency sets, and assign to each frequency
|
|
C a list of contributing transitions
|
|
C Select final frequency set.
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (SIXTH=UN/6.,FTH=4./3.,V0X=4.D-4,VCX=10.*V0X)
|
|
DIMENSION SX(500)
|
|
C DIMENSION SGZ(MTRANS)
|
|
C
|
|
if(ioptab.lt.0) return
|
|
if(ispodf.ge.1) return
|
|
C
|
|
C Sort frequencies and assign primary line
|
|
C
|
|
CALL INDEXX(NFREQ,FREQ,NLINES)
|
|
DO IJ=1,NFREQ
|
|
KIJ(NLINES(IJ))=NFREQ-IJ+1
|
|
END DO
|
|
DO IT=1,NTRANS
|
|
IF(.NOT.LINEXP(IT)) THEN
|
|
KFR0(IT)=KIJ(IFR0(IT))
|
|
KFR1(IT)=KIJ(IFR1(IT))
|
|
DO IJ=IFR0(IT),IFR1(IT)
|
|
IJLIN(IJ)=IT
|
|
END DO
|
|
END IF
|
|
END DO
|
|
DO IJ=1,NFREQ
|
|
JIK(KIJ(IJ))=IJ
|
|
END DO
|
|
JK1=JIK(1)
|
|
IF(IJLIN(JK1).NE.0)
|
|
* CALL QUIT(' Largest freq. is a line freq. - (SRTFRQ)',
|
|
* JK1,IJLIN(JK1))
|
|
JK1=JIK(NFREQ)
|
|
IF(IJLIN(JK1).NE.0)
|
|
* CALL QUIT(' Smallest freq. is a line freq. - (SRTFRQ)',
|
|
* JK1,IJLIN(JK1))
|
|
C
|
|
C lines or ODFs associated with each frequency
|
|
C
|
|
NLIMAX=0
|
|
DO IJ=1,NFREQ
|
|
NLINES(IJ)=0
|
|
DO 50 IT=1,NTRANS
|
|
IF(LINEXP(IT)) GO TO 50
|
|
IF(KIJ(IJ).LT.KFR0(IT)) GO TO 50
|
|
IF(KIJ(IJ).GT.KFR1(IT)) GO TO 50
|
|
IF(IJLIN(IJ).EQ.IT) GOTO 50
|
|
NLINES(IJ)=NLINES(IJ)+1
|
|
IF(NLINES(IJ).GT.MITJ)
|
|
* CALL QUIT('Too many overlappins-nlines(ij).gt.mitj',
|
|
* nlines(ij),mitj)
|
|
ITRLIN(NLINES(IJ),IJ)=int2(IT)
|
|
c write(6,653) ij,it,nlines(ij)
|
|
c 653 format('nlines',3i7)
|
|
50 CONTINUE
|
|
IF(NLINES(IJ).GT.NLIMAX) NLIMAX=NLINES(IJ)
|
|
END DO
|
|
WRITE(6,611) NLIMAX
|
|
611 FORMAT(/' MAXIMUM NUMBER OF OVERLAPPING TRANSITIONS: ',I3/)
|
|
C
|
|
C Select final set of frequencies:
|
|
C IJX = 1 : included frequency
|
|
C IJX =-1 : rejected frequency
|
|
C IJX = 0 : used for rates, but no contribution of primary
|
|
C transition to opacity
|
|
C
|
|
NPPX=NFREQ-NFREQC
|
|
DO 310 IT=1,NTRANS
|
|
IF(LINEXP(IT)) GO TO 310
|
|
IF(ABS(INDEXP(IT)).NE.3) GO TO 310
|
|
IF(PROF(IFR0(IT)+1).GT.PROF(IFR1(IT)-1)) THEN
|
|
DO IJ=IFR0(IT)+5,IFR1(IT)-1
|
|
IJX(IJ)=-1
|
|
NPPX=NPPX-1
|
|
END DO
|
|
ELSE
|
|
DO IJ=IFR0(IT)+1,IFR1(IT)-5
|
|
IJX(IJ)=-1
|
|
NPPX=NPPX-1
|
|
END DO
|
|
END IF
|
|
310 CONTINUE
|
|
ISX=0
|
|
DO 320 IJ=1,NFREQ
|
|
ISX=ISX-1
|
|
IF(ISX.GT.0) GO TO 320
|
|
IJP=JIK(IJ)
|
|
DX0=0.
|
|
IF(IJX(IJP).EQ.1) GO TO 320
|
|
IF(PROF(IJP).EQ.0.) GO TO 320
|
|
DX0=V0X*FREQ(IJP)
|
|
DNUX=ABS(FREQ(JIK(IJ-1))-FREQ(IJP))
|
|
IF(DNUX.GT.DX0) THEN
|
|
IJX(IJP)=1
|
|
NPPX=NPPX+1
|
|
ELSE
|
|
NPX=0
|
|
DO WHILE (DNUX.LT.DX0 .AND. IJX(JIK(IJ+NPX)).EQ.-1)
|
|
ITRX=IJLIN(JIK(IJ+NPX))
|
|
PSX0=PROF(IFR0(ITRX+1))
|
|
IF(PSX0.GT.0.) THEN
|
|
SX0=PROF(JIK(IJ+NPX))/PSX0
|
|
SX(NPX+1)=PROF(JIK(IJ+NPX))/PROF(IJP)*SX0
|
|
ELSE
|
|
SX(NPX+1)=0.
|
|
ENDIF
|
|
NPX=NPX+1
|
|
DNUX=ABS(FREQ(JIK(IJ-1))-FREQ(JIK(IJ+NPX)))
|
|
END DO
|
|
IF(NPX.EQ.1) THEN
|
|
IJX(IJP)=1
|
|
NPPX=NPPX+1
|
|
ELSE
|
|
SXX=-1.
|
|
DO IPX=1,NPX
|
|
IF(SX(IPX).GT.SXX) THEN
|
|
SXX=SX(IPX)
|
|
ISX=IPX
|
|
END IF
|
|
END DO
|
|
IJX(JIK(IJ+ISX))=1
|
|
NPPX=NPPX+1
|
|
END IF
|
|
END IF
|
|
320 CONTINUE
|
|
DO 330 IJ=1,NFREQ
|
|
IJP=JIK(IJ)
|
|
IF(IJP.GT.NFREQC) GOTO 330
|
|
IF(IJX(IJP).EQ.1) THEN
|
|
NPPX=NPPX+1
|
|
GOTO 330
|
|
ENDIF
|
|
DX0=VCX*FREQ(IJP)
|
|
NIXA=0
|
|
DO WHILE (IJX(JIK(IJ-NIXA)).NE.1)
|
|
NIXA=NIXA+1
|
|
ENDDO
|
|
NIXB=0
|
|
DO WHILE (IJX(JIK(IJ+NIXB)).NE.1)
|
|
NIXB=NIXB+1
|
|
ENDDO
|
|
DNUXA=ABS(FREQ(JIK(IJ-NIXA))-FREQ(IJP))
|
|
DNUXB=ABS(FREQ(JIK(IJ+NIXB))-FREQ(IJP))
|
|
IF(DNUXA.GT.DX0 .AND. DNUXB.GT.DX0) THEN
|
|
IJX(IJP)=1
|
|
NPPX=NPPX+1
|
|
ELSE
|
|
IJX(IJP)=-1
|
|
ENDIF
|
|
330 CONTINUE
|
|
c
|
|
c correction
|
|
c
|
|
if(icompt.eq.0) then
|
|
do ij=1,nfreqc
|
|
ijx(ij)=1
|
|
end do
|
|
do ije=1,nfreqe
|
|
ijx(ijfr(ije))=1
|
|
end do
|
|
end if
|
|
C
|
|
C weights
|
|
C
|
|
DO 100 IJ=1,NFREQ
|
|
W(IJ)=0.
|
|
KJ0=KIJ(IJ)
|
|
IF(IJX(JIK(KJ0)).EQ.-1) GO TO 100
|
|
IF(KJ0.GE.2 .AND. KJ0.LT.NFREQ) THEN
|
|
IK1=KJ0-1
|
|
DO WHILE (IJX(JIK(IK1)).EQ.-1)
|
|
IK1=IK1-1
|
|
END DO
|
|
IK2=KJ0+1
|
|
DO WHILE (IJX(JIK(IK2)).EQ.-1)
|
|
IK2=IK2+1
|
|
END DO
|
|
W(IJ)=HALF*ABS(FREQ(JIK(IK1))-FREQ(JIK(IK2)))
|
|
ELSE IF(KJ0.EQ.1) THEN
|
|
W(IJ)=HALF*ABS(FREQ(JIK(KJ0))-FREQ(JIK(KJ0+1)))
|
|
ELSE IF(KJ0.EQ.NFREQ) THEN
|
|
W(IJ)=HALF*ABS(FREQ(JIK(KJ0-1))-FREQ(JIK(KJ0)))
|
|
END IF
|
|
100 CONTINUE
|
|
C
|
|
C Correction for Simpson weights
|
|
C
|
|
JK1=JIK(1)
|
|
DO IJ=2,NFREQ,2
|
|
JK2=JIK(IJ)
|
|
JK3=JIK(IJ+1)
|
|
IF(IJLIN(JK2).NE.0 .OR. IJLIN(JK3).NE.0) GO TO 130
|
|
IF(WCH(JK2).NE.0.) GO TO 130
|
|
W(JK1)=W(JK1)-SIXTH*W(JK2)
|
|
W(JK3)=W(JK3)-SIXTH*W(JK2)
|
|
W(JK2)=W(JK2)*FTH
|
|
JK1=JK3
|
|
END DO
|
|
130 JK1=JIK(NFREQ)
|
|
DO IJ=NFREQ-1,3,-2
|
|
JK2=JIK(IJ)
|
|
JK3=JIK(IJ-1)
|
|
IF(IJLIN(JK2).NE.0 .OR. IJLIN(JK3).NE.0) GOTO 150
|
|
IF(WCH(JK2).NE.0.) GOTO 150
|
|
W(JK1)=W(JK1)-SIXTH*W(JK2)
|
|
W(JK3)=W(JK3)-SIXTH*W(JK2)
|
|
W(JK2)=W(JK2)*FTH
|
|
JK1=JK3
|
|
END DO
|
|
150 CONTINUE
|
|
C
|
|
C check accuracy of weights for integration
|
|
C
|
|
c 190 Z0=0.
|
|
Z0=0.
|
|
Z1=0.
|
|
Z2=0.
|
|
ZH=0.
|
|
T1=TEFF
|
|
T2=TWO*TEFF
|
|
T3=HALF*TEFF
|
|
X1=HK/T1
|
|
X2=HK/T2
|
|
X3=HK/T3
|
|
DO IJ=1,NFREQ
|
|
Z0=Z0+W(IJ)
|
|
X15=FREQ(IJ)*1.D-15
|
|
BNZ=BN*X15*X15*X15
|
|
FX1=FREQ(IJ)*X1
|
|
IF(FX1.LE.100.) THEN
|
|
Z1=Z1+W(IJ)*BNZ/(EXP(FREQ(IJ)*X1)-1)
|
|
Z2=Z2+W(IJ)*BNZ/(EXP(FREQ(IJ)*X2)-1)
|
|
ZH=ZH+W(IJ)*BNZ/(EXP(FREQ(IJ)*X3)-1)
|
|
END IF
|
|
END DO
|
|
T1S=SQRT(SQRT(0.25*Z1/SIG4P))
|
|
T1ER=T1S/T1-UN
|
|
T2S=SQRT(SQRT(0.25*Z2/SIG4P))
|
|
T2ER=T2S/T2-UN
|
|
T3S=SQRT(SQRT(0.25*ZH/SIG4P))
|
|
T3ER=T3S/T3-UN
|
|
JK1=JIK(1)
|
|
JK2=JIK(NFREQ)
|
|
Z00=FREQ(JK1)-FREQ(JK2)
|
|
WRITE(6,601) FREQ(JK1),FREQ(JK2),Z00,Z0,T3,T3ER,T1,T1ER,T2,T2ER
|
|
601 FORMAT(/' ACCURACY OF INTEGRATIONS:',/,
|
|
* ' Interval:',1p4e16.8,/,
|
|
* 15x,' Planck functions:',9x,0pf12.0,4x,1pe12.4,/,
|
|
* 42x,0pf12.0,4x,1pe12.4,/,42x,0pf12.0,4x,1pe12.4,/)
|
|
WRITE(6,602) NFREQ,NPPX
|
|
602 FORMAT(' TOTAL NUMBER OF FREQUENCIES:',I8,/,
|
|
* ' SELECTED FREQUENCIES: ',I8)
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE INIFRC(IALIEX)
|
|
C =========================
|
|
C
|
|
C Setup continuum frequencies, including frequencies around
|
|
C ionization limits
|
|
C IALIEX=0 : setup frequencies, all ALI
|
|
C IALIEX=1 : change IJALI for explicit frequencies
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
common/ijflar/ijfl(mlevel)
|
|
PARAMETER (THIRD=UN/3.,FTH=4./3.,TENLG = 2.302585093)
|
|
DIMENSION FRLEV(MLEVEL),IENS(MLEVEL),IJXCO(MFREQC),
|
|
* FREQCO(MFREQC),WCO(MFREQC),WCHCO(MFREQC)
|
|
C
|
|
if(ioptab.lt.0) return
|
|
C
|
|
dfedg=0.000001
|
|
if(icompt.gt.0) dfedg=0.01
|
|
DFEDG=0.01
|
|
IF(IALIEX.EQ.1) THEN
|
|
C
|
|
if(nffix.lt.0) then
|
|
do ij=1,nfreqc
|
|
ijali(ij)=0
|
|
end do
|
|
return
|
|
end if
|
|
c
|
|
IF(NFFIX.EQ.2) RETURN
|
|
DO 10 IT=1,NTRANS
|
|
IF(LINE(IT)) GOTO 10
|
|
IF(IFC1(IT).EQ.0) GOTO 10
|
|
if(iadop(iatm(ilow(it))).gt.0) go to 10
|
|
IJFL0=IJFL(ILOW(IT))+1
|
|
IF(IFC1(IT).LT.100) THEN
|
|
DO IJ=IFC0(IT),IFC1(IT)
|
|
IJFLS=IJFL0-IJ
|
|
IF(IJFLS.GE.1) THEN
|
|
IJALI(IJFLS)=0
|
|
IJX(IJFLS)=1
|
|
END IF
|
|
END DO
|
|
ELSE
|
|
DO IJ=IJFL0,1,-1
|
|
IJALI(IJ)=0
|
|
IJX(IJ)=1
|
|
END DO
|
|
END IF
|
|
10 CONTINUE
|
|
C
|
|
IF(ICOMPT.GT.0.AND.FRLCOM.GT.0) THEN
|
|
DO IJ=1,NFREQ
|
|
IF(FREQ(IJ).GT.FRLCOM) THEN
|
|
IJALI(IJ)=0
|
|
IJX(IJ)=1
|
|
END IF
|
|
END DO
|
|
END IF
|
|
RETURN
|
|
END IF
|
|
C
|
|
NEND=NFTAIL
|
|
DIVEND=DFTAIL
|
|
NJC=NFREQC/5
|
|
DNX=UN-UN/FLOAT(NJC)
|
|
CALL INDEXX(NLEVEL,ENION,IENS)
|
|
DO IL=1,NLEVEL
|
|
ILS=IENS(NLEVEL-IL+1)
|
|
FRLEV(IL)=ENION(ILS)/H
|
|
IJFL(IL)=0
|
|
END DO
|
|
IF(FRCMAX.LE.0.) THEN
|
|
FREQCO(1)=8.D11*TEFF
|
|
ELSE
|
|
FREQCO(1)=FRCMAX
|
|
END IF
|
|
IL0=1
|
|
IF(FREQCO(1).LT.CFRMAX*FRLEV(IL0) .AND. CFRMAX.GT.UN) THEN
|
|
FREQCO(1)=CFRMAX*FRLEV(IL0)
|
|
GO TO 20
|
|
END IF
|
|
DO WHILE (FREQCO(1).LT.FRLEV(IL0) .AND. IL0.LT.NLEVEL)
|
|
ILS=IENS(NLEVEL-IL0+1)
|
|
ILN=NNEXT(IEL(ILS))
|
|
ITR0=ITRA(ILS,ILN)
|
|
INDEXP(ITR0)=0
|
|
IFR0(ITR0)=0
|
|
IFR1(ITR0)=0
|
|
IF(FRLEV(IL0).GT.0.) WRITE(10,159) IL0,FRLEV(IL0),ILS,ILN,ITR0
|
|
159 FORMAT(' Edge at frequency larger than FRCMAX',I5,E12.4,3I7)
|
|
IL0=IL0+1
|
|
END DO
|
|
20 CONTINUE
|
|
C
|
|
if(nftail.le.0) then
|
|
if(nftail.eq.-1.or.dftail.eq.0.) then
|
|
NEND1=NFREQC
|
|
FREQCO(NEND1)=FRCMIN
|
|
IJXCO(1)=1
|
|
IJXCO(NEND1)=1
|
|
XEND=UN/FLOAT(NEND1-1)
|
|
D121=(FREQCO(1)/FREQCO(NEND1))**XEND
|
|
DO IJ=2,NEND1-1
|
|
FREQCO(IJ)=FREQCO(IJ-1)/D121
|
|
IJXCO(IJ)=2
|
|
END DO
|
|
D121=THIRD*(FREQCO(1)-FREQCO(2))
|
|
DO IJ=2,NEND1-1,2
|
|
WCO(IJ)=4.*D121
|
|
WCO(IJ-1)=WCO(IJ-1)+D121
|
|
WCO(IJ+1)=WCO(IJ+1)+D121
|
|
WCHCO(IJ)=0.
|
|
END DO
|
|
else
|
|
c
|
|
NEND1=-NFTAIL
|
|
FREQCO(NEND1)=DFTAIL*FREQCO(1)
|
|
IJXCO(1)=1
|
|
IJXCO(NEND1)=1
|
|
XEND=UN/FLOAT(NEND1-1)
|
|
D121=(FREQCO(1)/FREQCO(NEND1))**XEND
|
|
DO IJ=2,NEND1-1
|
|
FREQCO(IJ)=FREQCO(IJ-1)/D121
|
|
IJXCO(IJ)=2
|
|
END DO
|
|
D121=THIRD*(FREQCO(1)-FREQCO(2))
|
|
DO IJ=2,NEND1-1,2
|
|
WCO(IJ)=4.*D121
|
|
WCO(IJ-1)=WCO(IJ-1)+D121
|
|
WCO(IJ+1)=WCO(IJ+1)+D121
|
|
WCHCO(IJ)=0.
|
|
END DO
|
|
C
|
|
NEND2=NFREQC
|
|
IJXCO(NEND1)=1
|
|
IJXCO(NEND1+1)=1
|
|
XEND=UN/FLOAT(NEND2-NEND1)
|
|
d121=(freqco(nend1)/frcmin)**xend
|
|
DO IJ=NEND1+1,NEND2
|
|
freqco(ij)=freqco(ij-1)/d121
|
|
IJXCO(IJ)=2
|
|
END DO
|
|
D121=THIRD*(FREQCO(NEND1)-FREQCO(NEND1+1))
|
|
DO IJ=NEND1+1,NEND2-1,2
|
|
WCO(IJ)=4.*D121
|
|
WCO(IJ-1)=WCO(IJ-1)+D121
|
|
WCO(IJ+1)=WCO(IJ+1)+D121
|
|
WCHCO(IJ)=0.
|
|
END DO
|
|
end if
|
|
C
|
|
else
|
|
C
|
|
NEND=NFTAIL
|
|
DIVEND=DFTAIL
|
|
NJC=NFREQC/5
|
|
DNX=UN-UN/FLOAT(NJC)
|
|
NFREQC=NEND+1
|
|
|
|
FREQCO(NEND)=(un+dfedg)*FRLEV(il0)
|
|
FREQCO(NEND+1)=(un-dfedg)*FRLEV(il0)
|
|
NEND1=NEND/2+1
|
|
XEND=UN/FLOAT(NEND1-1)
|
|
FREQCO(NEND1)=FREQCO(1)-(UN-DIVEND)*(FREQCO(1)-FREQCO(NEND))
|
|
IJXCO(NEND+1)=1
|
|
C
|
|
C high-frequency tail of the spectrum - a two-part Simpson integration
|
|
C
|
|
C 1st part - from the highest frequency FRCMAX to a division freq.
|
|
C
|
|
IJXCO(1)=1
|
|
IJXCO(NEND1)=1
|
|
D121=XEND*(FREQCO(1)-FREQCO(NEND1))
|
|
if(icompt.gt.0) d121=(freqco(1)/freqco(nend1))**xend
|
|
DO IJ=2,NEND1-1
|
|
FREQCO(IJ)=FREQCO(IJ-1)-D121
|
|
if(icompt.gt.0) freqco(ij)=freqco(ij-1)/d121
|
|
IJXCO(IJ)=2
|
|
END DO
|
|
D121=THIRD*(FREQCO(1)-FREQCO(2))
|
|
DO IJ=2,NEND1-1,2
|
|
WCO(IJ)=4.*D121
|
|
WCO(IJ-1)=WCO(IJ-1)+D121
|
|
WCO(IJ+1)=WCO(IJ+1)+D121
|
|
WCHCO(IJ)=0.
|
|
END DO
|
|
C
|
|
C 2nd part - from the division freq to the first discontinuity
|
|
C
|
|
if(nend1.lt.nend) then
|
|
IJXCO(NEND)=1
|
|
IJXCO(NEND+1)=1
|
|
D121=XEND*(FREQCO(NEND1)-FREQCO(NEND))
|
|
if(icompt.gt.0) d121=(freqco(nend1)/freqco(nend))**xend
|
|
DO IJ=NEND1+1,NEND-1
|
|
FREQCO(IJ)=FREQCO(IJ-1)-D121
|
|
if(icompt.gt.0) freqco(ij)=freqco(ij-1)/d121
|
|
IJXCO(IJ)=2
|
|
END DO
|
|
D121=THIRD*(FREQCO(NEND1)-FREQCO(NEND1+1))
|
|
DO IJ=NEND1+1,NEND-1,2
|
|
WCO(IJ)=4.*D121
|
|
WCO(IJ-1)=WCO(IJ-1)+D121
|
|
WCO(IJ+1)=WCO(IJ+1)+D121
|
|
WCHCO(IJ)=0.
|
|
END DO
|
|
end if
|
|
C
|
|
C the 1st discontinuity - the one with the highest frequency
|
|
C
|
|
HAEND=HALF*(FREQCO(NEND)-FREQCO(NEND+1))
|
|
XEND=UN/FLOAT(NEND-1)
|
|
WCO(NEND)=WCO(NEND)+HAEND
|
|
WCO(NEND+1)=WCO(NEND+1)+HAEND
|
|
WCHCO(1)=0.
|
|
WCHCO(NEND)=HAEND
|
|
ILS=IENS(NLEVEL)
|
|
IJFL(ILS)=NEND
|
|
write(*,*) 'ils,ijfl',ils,ijfl(ils),freqco(nend)
|
|
IL0=NLEVEL
|
|
IF(FRCMIN.LE.0.) FRCMIN=1.D12
|
|
FRCLST=FRLEV(IL0)
|
|
DO WHILE(FRCLST.LT.FRCMIN)
|
|
IF(FRLEV(IL0).GT.0.) WRITE(10,160) IL0,FRLEV(IL0)
|
|
160 FORMAT(' Edge at frequency smaller than 1.d12',i5,e12.4)
|
|
IL0=IL0-1
|
|
FRCLST=FRLEV(IL0)
|
|
END DO
|
|
IL0=2
|
|
C
|
|
100 FRC0=DNX*FREQCO(NFREQC)
|
|
IF(FRC0.LT.FRCLST) THEN
|
|
NFREQC=NFREQC+2
|
|
FREQCO(NFREQC-1)=(un+dfedg)*FRCLST
|
|
FREQCO(NFREQC)=(un-dfedg)*FRCLST
|
|
IJXCO(NFREQC-1)=1
|
|
IJXCO(NFREQC)=1
|
|
WCO(NFREQC)=WCO(NFREQC)+
|
|
* HALF*(FREQCO(NFREQC-1)-FREQCO(NFREQC))
|
|
WCO(NFREQC-1)=WCO(NFREQC-1)+
|
|
* HALF*(FREQCO(NFREQC-2)-FREQCO(NFREQC))
|
|
WCO(NFREQC-2)=WCO(NFREQC-2)+
|
|
* HALF*(FREQCO(NFREQC-2)-FREQCO(NFREQC-1))
|
|
WCHCO(NFREQC-1)=HALF*(FREQCO(NFREQC-1)-FREQCO(NFREQC))
|
|
WCHCO(NFREQC-2)=HALF*(FREQCO(NFREQC-2)-FREQCO(NFREQC-1))
|
|
ILS=IENS(NLEVEL-IL0+1)
|
|
IJFL(ILS)=NFREQC-1
|
|
IF(IL0.LT.NLEVEL) THEN
|
|
DO IL=IL0+1,NLEVEL
|
|
ILS=IENS(NLEVEL-IL+1)
|
|
IJFL(ILS)=NFREQC-1
|
|
IF(FRLEV(IL).LT.FRCMIN) IJFL(ILS)=0
|
|
END DO
|
|
END IF
|
|
D121=XEND*(FREQCO(NFREQC)-FRCMIN)
|
|
DO IJ=NFREQC+1,NFREQC+NEND-1
|
|
FREQCO(IJ)=FREQCO(IJ-1)-D121
|
|
IJXCO(IJ)=2
|
|
WCHCO(IJ)=0.
|
|
END DO
|
|
IJXCO(NFREQC+NEND-1)=1
|
|
DO IJ=NFREQC+1,NFREQC+NEND-2,2
|
|
WCO(IJ)=FTH*D121
|
|
WCO(IJ-1)=WCO(IJ-1)+THIRD*D121
|
|
WCO(IJ+1)=WCO(IJ+1)+THIRD*D121
|
|
END DO
|
|
WCHCO(NFREQC)=THIRD*D121
|
|
NFREQC=NFREQC+NEND-1
|
|
GO TO 200
|
|
END IF
|
|
DF0=FRLEV(IL0)+0.1*(FREQCO(NFREQC)-FRC0)
|
|
FRTL=(un+dfedg)*FRLEV(IL0)
|
|
IF(FRC0.GT.DF0) THEN
|
|
NFREQC=NFREQC+1
|
|
FREQCO(NFREQC)=FRC0
|
|
IJXCO(NFREQC)=2
|
|
WCO(NFREQC)=WCO(NFREQC)+
|
|
* HALF*(FREQCO(NFREQC-1)-FREQCO(NFREQC))
|
|
WCO(NFREQC-1)=WCO(NFREQC-1)+
|
|
* HALF*(FREQCO(NFREQC-1)-FREQCO(NFREQC))
|
|
WCHCO(NFREQC-1)=HALF*(FREQCO(NFREQC-1)-FREQCO(NFREQC))
|
|
ELSE IF(FRTL.LT.FREQCO(NFREQC)) THEN
|
|
NFREQC=NFREQC+2
|
|
FREQCO(NFREQC-1)=FRTL
|
|
FREQCO(NFREQC)=(un-dfedg)*FRLEV(IL0)
|
|
IJXCO(NFREQC-1)=1
|
|
IJXCO(NFREQC)=1
|
|
WCO(NFREQC)=WCO(NFREQC)+
|
|
* HALF*(FREQCO(NFREQC-1)-FREQCO(NFREQC))
|
|
WCO(NFREQC-1)=WCO(NFREQC-1)+
|
|
* HALF*(FREQCO(NFREQC-2)-FREQCO(NFREQC))
|
|
WCO(NFREQC-2)=WCO(NFREQC-2)+
|
|
* HALF*(FREQCO(NFREQC-2)-FREQCO(NFREQC-1))
|
|
WCHCO(NFREQC-1)=HALF*(FREQCO(NFREQC-1)-FREQCO(NFREQC))
|
|
WCHCO(NFREQC-2)=HALF*(FREQCO(NFREQC-2)-FREQCO(NFREQC-1))
|
|
ILS=IENS(NLEVEL-IL0+1)
|
|
IJFL(ILS)=NFREQC-1
|
|
IL0=IL0+1
|
|
ELSE
|
|
ILS=IENS(NLEVEL-IL0+1)
|
|
IJFL(ILS)=NFREQC-1
|
|
IL0=IL0+1
|
|
END IF
|
|
GO TO 100
|
|
end if
|
|
C
|
|
200 SUMWC=0.
|
|
C
|
|
IF(NFREAD.GT.0) THEN
|
|
DO IJ=NFREQ,1,-1
|
|
FREQ(IJ+NFREQC)=FREQ(IJ)
|
|
W(IJ+NFREQC)=W(IJ)
|
|
PROF(IJ+NFREQC)=PROF(IJ)
|
|
IJALI(IJ+NFREQC)=IJALI(IJ)
|
|
END DO
|
|
DO IJ=1,NFREQC
|
|
FREQ(IJ)=FREQCO(IJ)
|
|
W(IJ)=WCO(IJ)
|
|
WCH(IJ)=WCHCO(IJ)
|
|
IJALI(IJ)=1
|
|
IJX(IJ)=IJXCO(IJ)
|
|
PROF(IJ)=0.
|
|
END DO
|
|
DO 320 ITR=1,NTRANS
|
|
IF(.NOT.LINE(ITR).OR.INDEXP(ITR).EQ.0) GO TO 320
|
|
IF(IFR0(ITR).GT.0) IFR0(ITR)=IFR0(ITR)+NFREQC
|
|
IF(IFR1(ITR).GT.0) IFR1(ITR)=IFR1(ITR)+NFREQC
|
|
320 CONTINUE
|
|
NFREQ=NFREQ+NFREQC
|
|
END IF
|
|
C
|
|
C determination of the first (IFR0) and the last (IFR1) frequency
|
|
C for each explicit continuum - only if they were not already read
|
|
C
|
|
DO 340 ITR=1,NTRANS
|
|
IF(LINE(ITR)) GO TO 340
|
|
IF(IFR0(ITR).LE.0) IFR0(ITR)=1
|
|
IF(IFR1(ITR).GT.0) GO TO 340
|
|
IF1=0
|
|
FR01=FR0(ITR)
|
|
MODE=INDEXP(ITR)
|
|
IF(IABS(MODE).EQ.5.OR.IABS(MODE).EQ.15) FR01=FR0PC(ITR)
|
|
DO 330 IJ=1,NFREQC
|
|
IF(FREQ(IJ).GE.FR01) IF1=IJ
|
|
330 CONTINUE
|
|
IFR1(ITR)=IF1
|
|
340 CONTINUE
|
|
|
|
if(nfrecl.gt.nfreq) nfrecl=nfreq
|
|
nfreqe=nfrecl
|
|
do ij=1,nfreqe
|
|
ijali(ij)=0
|
|
end do
|
|
c
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE INIFRS
|
|
C =================
|
|
C
|
|
C Setup frequencies in opacity sampling mode
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
PARAMETER (THIRD=UN/3.,FTH=4./3.)
|
|
DIMENSION FRLEV(MLEVEL),IENS(MLEVEL),ITRL(MLEVEL)
|
|
DIMENSION FRL0(MTRANS),FRL1(MTRANS),FRLC(5*MTRANS)
|
|
DIMENSION IKC(5*MTRANS),ITKC(5*MTRANS),ITJNU(5*MTRANS)
|
|
DIMENSION FLNU(2*MATOM+3),DLNU(2*MATOM+3),ILNU(2*MATOM+3)
|
|
DIMENSION XMASS(30)
|
|
DATA XMASS/ 1.008, 4.003, 6.941, 9.012,10.810,12.011,14.007,
|
|
& 16.000,18.918,20.179,22.990,24.305,26.982,28.086,
|
|
& 30.974,32.060,35.453,39.948,39.098,40.080,44.956,
|
|
& 47.900,50.941,51.996,54.938,55.847,58.933,58.700,
|
|
& 63.546,65.380/
|
|
|
|
C
|
|
IF(TSNU.EQ.0.) TSNU=TEFF
|
|
IF(VTNU.EQ.0.) VTNU=VTB
|
|
IF(VTNU.LT.1.D4) VTNU=VTNU*1.D5
|
|
FRS1=CNU1*1.D11*TSNU
|
|
FRS2=3.28805D15/CNU2/CNU2
|
|
C
|
|
DO IAT=1,NATOM
|
|
CDOP=TWO*BOLK/AMASS(IAT)
|
|
DLNU(IAT)=0.375/2.997925D10*SQRT(CDOP*TSNU+VTNU*VTNU)
|
|
DLNU(IAT+NATOM)=20.*DLNU(IAT)
|
|
FLNU(IAT)=DLOG(FRS1)
|
|
FLNU(IAT+NATOM)=DLOG(FRS1)
|
|
END DO
|
|
C
|
|
XPNU=24.
|
|
CDOP=TWO*BOLK/XMASS(1)/HMASS
|
|
DLNU(2*NATOM+1)=50./2.997925D10*SQRT(CDOP*TSNU+VTNU*VTNU)
|
|
DLNU(2*NATOM+2)=5.*DLNU(2*NATOM+1)
|
|
FLNU(2*NATOM+1)=DLOG(FRS2)
|
|
FLNU(2*NATOM+2)=DLOG(FRCMIN)
|
|
NNU=2*NATOM+3
|
|
IF(ISPODF.EQ.1 .AND. DDNU.GT.0.) THEN
|
|
CDOP=TWO*BOLK/AMASS(NATOM)
|
|
IF(IELNU.GT.0) CDOP=TWO*BOLK/XMASS(IELNU)/HMASS
|
|
DLNU(NNU)=DDNU/2.997925D10*SQRT(CDOP*TSNU+VTNU*VTNU)
|
|
FLNU(NNU)=DLOG(FRS2)
|
|
ELSE
|
|
DLNU(NNU)=DLNU(2*NATOM+2)
|
|
FLNU(NNU)=DLOG(FRS1)
|
|
END IF
|
|
CALL INDEXX(NNU,DLNU,ILNU)
|
|
C
|
|
C Store line and continua frequencies
|
|
C
|
|
NLIC=0
|
|
DO 10 ITR=1,NTRANS
|
|
IJTC(ITR)=0
|
|
INDXPA=IABS(INDEXP(ITR))
|
|
IF(INDXPA.EQ.0) GO TO 10
|
|
IF(INDXPA.EQ.3 .OR. INDXPA.EQ.4) GO TO 10
|
|
IF(FR0(ITR).EQ.0.) GO TO 10
|
|
IF(LINE(ITR)) THEN
|
|
ILV0=ILOW(ITR)
|
|
IAT=IATM(ILV0)
|
|
ITC=ITRA(ILV0,NNEXT(IEL(ILV0)))
|
|
IF(ITC.EQ.0) ITC=ITRA(ILV0,NNEXT(IEL(ILV0))+1)
|
|
IF(INDXPA.NE.2) THEN
|
|
FRLC(NLIC+1)=FR0(ITR)
|
|
ITKC(NLIC+1)=ITR
|
|
IJTC(ITR)=NLIC+1
|
|
ITJNU(NLIC+1)=IAT
|
|
FRLC(NLIC+2)=FREQ(IFR0(ITR))
|
|
FRL0(ITR)=FRLC(NLIC+2)
|
|
ITKC(NLIC+2)=ITR
|
|
IF(ITC.GT.0 .AND. FREQ(IFR0(ITR)).GT.FR0(ITC) .AND.
|
|
* FR0(ITC).GT.FR0(ITR)) FRLC(NLIC+2)=0.999999*FR0(ITC)
|
|
ITJNU(NLIC+2)=IAT
|
|
FRLC(NLIC+3)=FREQ(IFR1(ITR))
|
|
FRL1(ITR)=FRLC(NLIC+3)
|
|
ITKC(NLIC+3)=ITR
|
|
ITJNU(NLIC+3)=2*NATOM+1
|
|
NLIC=NLIC+3
|
|
D0=DLOG(FRL0(ITR))-DLOG(FRL1(ITR))
|
|
IF(D0.GT.XPNU*DLNU(IAT)) THEN
|
|
ITJNU(NLIC-1)=IAT+NATOM
|
|
FRLC(NLIC+1)=EXP(DLOG(FR0(ITR))+XPNU*DLNU(IAT))
|
|
ITKC(NLIC+1)=ITR
|
|
ITJNU(NLIC+1)=IAT
|
|
FRLC(NLIC+2)=EXP(DLOG(FR0(ITR))-XPNU*DLNU(IAT))
|
|
ITKC(NLIC+2)=ITR
|
|
ITJNU(NLIC+2)=IAT+NATOM
|
|
NLIC=NLIC+2
|
|
END IF
|
|
ELSE
|
|
FRLC(NLIC+1)=0.999999*FR0(ITC)
|
|
FRL0(ITR)=FRLC(NLIC+1)
|
|
ITKC(NLIC+1)=ITR
|
|
ITJNU(NLIC+1)=IAT
|
|
FRLC(NLIC+2)=FREQ(IFR1(ITR-1))
|
|
FRL1(ITR)=FRLC(NLIC+2)
|
|
ITKC(NLIC+2)=ITR
|
|
ITJNU(NLIC+2)=2*NATOM+1
|
|
NLIC=NLIC+2
|
|
END IF
|
|
ELSE
|
|
NLIC=NLIC+1
|
|
FRLC(NLIC)=FR0(ITR)
|
|
ITKC(NLIC)=ITR
|
|
IJTC(ITR)=NLIC
|
|
ITJNU(NLIC)=0
|
|
END IF
|
|
10 CONTINUE
|
|
C
|
|
IKC(1)=1
|
|
IF(NLIC.GT.1) CALL INDEXX(NLIC,FRLC,IKC)
|
|
DO IJ=1,MFREQ
|
|
FREQ(IJ)=0.
|
|
W(IJ)=0.
|
|
WCH(IJ)=0.
|
|
NLINES(IJ)=0
|
|
END DO
|
|
C
|
|
C Sort continuum limits
|
|
C
|
|
CALL INDEXX(NLEVEL,ENION,IENS)
|
|
DO IL=1,NLEVEL
|
|
ILS=IENS(NLEVEL-IL+1)
|
|
FRLEV(IL)=ENION(ILS)/H
|
|
ITRL(IL)=ITRA(ILS,NNEXT(IEL(ILS)))
|
|
END DO
|
|
IF(FRCMAX.LT.1.01*FRLEV(1) .AND. FRCMAX.GT.0.) THEN
|
|
ILS=IENS(NLEVEL)
|
|
ILN=NNEXT(IEL(ILS))
|
|
ITR0=ITRA(ILS,ILN)
|
|
WRITE(10,640) FRLEV(1),ILS,ILN,ITR0
|
|
640 FORMAT(1PE12.4,3I7)
|
|
CALL QUIT(' Edge at frequency larger than FRCMAX; ii,itr:',
|
|
* ils,itr0)
|
|
END IF
|
|
C
|
|
C Highest frequency tail
|
|
C
|
|
IF(FRCMAX.LE.0.) FRCMAX=FRLEV(1)*CFRMAX
|
|
IF(FRS1.GT.FRCMAX) THEN
|
|
FRCMAX=FRS1
|
|
NFTAIL=0
|
|
END IF
|
|
IF(NFTAIL.GT.0) THEN
|
|
NFTA1=NFTAIL/2+1
|
|
FREQ(1)=FRCMAX
|
|
NEND=0
|
|
IL=1
|
|
KJ=1
|
|
DO WHILE(FRLEV(IL).GT.FRS1)
|
|
NEND1=NEND+NFTA1
|
|
NEND=NEND+NFTAIL
|
|
ITR=ITRL(IL)
|
|
IFR0(ITR)=1
|
|
IFR1(ITR)=NEND
|
|
FREQ(NEND)=1.000001*FRLEV(IL)
|
|
FREQ(NEND+1)=0.999999*FRLEV(IL)
|
|
FREQ(NEND1)=FREQ(KJ)-(UN-DFTAIL)*(FREQ(KJ)-FREQ(NEND))
|
|
XEND=UN/FLOAT(NFTA1-1)
|
|
D121=XEND*(FREQ(KJ)-FREQ(NEND1))
|
|
DO IJ=KJ+1,NEND1-1
|
|
FREQ(IJ)=FREQ(IJ-1)-D121
|
|
END DO
|
|
D121=THIRD*(FREQ(KJ)-FREQ(KJ+1))
|
|
DO IJ=KJ+1,NEND1-1,2
|
|
W(IJ)=4.*D121
|
|
W(IJ-1)=W(IJ-1)+D121
|
|
W(IJ+1)=W(IJ+1)+D121
|
|
END DO
|
|
D121=XEND*(FREQ(NEND1)-FREQ(NEND))
|
|
DO IJ=NEND1+1,NEND-1
|
|
FREQ(IJ)=FREQ(IJ-1)-D121
|
|
END DO
|
|
D121=THIRD*(FREQ(NEND1)-FREQ(NEND1+1))
|
|
DO IJ=NEND1+1,NEND-1,2
|
|
W(IJ)=4.*D121
|
|
W(IJ-1)=W(IJ-1)+D121
|
|
W(IJ+1)=W(IJ+1)+D121
|
|
END DO
|
|
D121=HALF*(FREQ(NEND)-FREQ(NEND+1))
|
|
W(NEND)=W(NEND)+D121
|
|
W(NEND+1)=W(NEND+1)+D121
|
|
IL=IL+1
|
|
KJ=NEND+1
|
|
END DO
|
|
NEND1=NEND+NFTA1
|
|
NEND=NEND+NFTAIL
|
|
FREQ(NEND)=FRS1
|
|
FREQ(NEND1)=FREQ(KJ)-(UN-DFTAIL)*(FREQ(KJ)-FREQ(NEND))
|
|
XEND=UN/FLOAT(NFTA1-1)
|
|
D121=XEND*(FREQ(KJ)-FREQ(NEND1))
|
|
DO IJ=KJ+1,NEND1-1
|
|
FREQ(IJ)=FREQ(IJ-1)-D121
|
|
END DO
|
|
D121=THIRD*(FREQ(KJ)-FREQ(KJ+1))
|
|
DO IJ=KJ+1,NEND1-1,2
|
|
W(IJ)=4.*D121
|
|
W(IJ-1)=W(IJ-1)+D121
|
|
W(IJ+1)=W(IJ+1)+D121
|
|
END DO
|
|
D121=XEND*(FREQ(NEND1)-FREQ(NEND))
|
|
DO IJ=NEND1+1,NEND-1
|
|
FREQ(IJ)=FREQ(IJ-1)-D121
|
|
END DO
|
|
D121=THIRD*(FREQ(NEND1)-FREQ(NEND1+1))
|
|
DO IJ=NEND1+1,NEND-1,2
|
|
W(IJ)=4.*D121
|
|
W(IJ-1)=W(IJ-1)+D121
|
|
W(IJ+1)=W(IJ+1)+D121
|
|
END DO
|
|
ELSE
|
|
FREQ(1)=FRS1
|
|
NEND=1
|
|
END IF
|
|
NFREQC=NEND
|
|
DO IJ=1,NFREQC
|
|
IFREQB(IJ)=IJ
|
|
END DO
|
|
NFRS1=NFREQC
|
|
C
|
|
C Setup frequency points
|
|
C
|
|
DO IT=1,NTRANS
|
|
IFR0(IT)=0
|
|
IFR1(IT)=0
|
|
END DO
|
|
C
|
|
IL=NLIC
|
|
DO WHILE(FRLC(IKC(IL)).GT.FRS1)
|
|
IL=IL-1
|
|
END DO
|
|
NFREQ=NEND
|
|
XFRA=DLOG(FRS1)
|
|
DO WHILE(IL.GT.0)
|
|
ITR=ITKC(IKC(IL))
|
|
NFS=0
|
|
XFRB=DLOG(FRLC(IKC(IL)))
|
|
IF(XFRA.GT.XFRB) THEN
|
|
IKNU=ITJNU(IKC(IL))
|
|
IDN=1
|
|
DO WHILE(FLNU(ILNU(IDN)).GE.XFRA .AND. IDN.LT.NNU)
|
|
IDN=IDN+1
|
|
END DO
|
|
DXNU=DLNU(ILNU(IDN))
|
|
IF(IKNU.EQ.0) XFRB=DLOG(1.000001*FRLC(IKC(IL)))
|
|
NFS=INT((XFRA-XFRB)/DXNU)+1
|
|
XFS0=(XFRA-XFRB)/FLOAT(NFS)
|
|
DO IJ=NFREQ+1,NFREQ+NFS
|
|
XFR=DLOG(FREQ(IJ-1))-XFS0
|
|
FREQ(IJ)=EXP(XFR)
|
|
END DO
|
|
NFREQ=NFREQ+NFS
|
|
IF(DLOG(FR0(ITR)).EQ.XFRB) IJTC(ITR)=NFREQ
|
|
IF(IKNU.EQ.0) THEN
|
|
IFR0(ITR)=1
|
|
IFR1(ITR)=NFREQ
|
|
NFREQ=NFREQ+1
|
|
FREQ(NFREQ)=0.999999*FRLC(IKC(IL))
|
|
XFRB=DLOG(FREQ(NFREQ))
|
|
ELSE IF(IKNU.LE.2*NATOM) THEN
|
|
IF(IFR0(ITR).EQ.0) THEN
|
|
IFR0(ITR)=NFREQ
|
|
D0=DLOG(FR0(ITR))
|
|
IF(FLNU(IKNU).GT.D0) FLNU(IKNU)=D0
|
|
IF(IABS(INDEXP(ITR)).EQ.2) THEN
|
|
D0=DLOG(FR0(ITR-1))
|
|
IF(FLNU(IKNU).GT.D0) FLNU(IKNU)=D0
|
|
END IF
|
|
ELSE
|
|
IFR1(ITR)=NFREQ
|
|
IF(IKNU.LE.NATOM) THEN
|
|
IAT=IATM(ILOW(ITR))
|
|
D0=DLOG(FR0(ITR))-XPNU*DLNU(IAT)
|
|
D1=DLOG(FRL1(ITR))
|
|
IF(D1.GT.D0) D0=D1
|
|
IF(FLNU(IKNU).GT.D0) FLNU(IKNU)=D0
|
|
ELSE
|
|
D0=DLOG(FRL1(ITR))
|
|
IF(FLNU(IKNU).GT.D0) FLNU(IKNU)=D0
|
|
END IF
|
|
END IF
|
|
ELSE
|
|
IF(IFR0(ITR).EQ.0) THEN
|
|
IFR0(ITR)=NFREQ
|
|
ELSE
|
|
IFR1(ITR)=NFREQ
|
|
END IF
|
|
END IF
|
|
ELSE IF(XFRA.EQ.XFRB) THEN
|
|
IKNU=ITJNU(IKC(IL))
|
|
IF(IKNU.EQ.0) THEN
|
|
FREQ(NFREQ)=1.000001*FRLC(IKC(IL))
|
|
FREQ(NFREQ+1)=0.999999*FRLC(IKC(IL))
|
|
IFR0(ITR)=1
|
|
IFR1(ITR)=NFREQ
|
|
NFREQ=NFREQ+1
|
|
XFRB=DLOG(FREQ(NFREQ))
|
|
ELSE IF(IKNU.LE.2*NATOM) THEN
|
|
IF(IFR0(ITR).EQ.0) THEN
|
|
IFR0(ITR)=NFREQ
|
|
D0=DLOG(FR0(ITR))
|
|
IF(FLNU(IKNU).GT.D0) FLNU(IKNU)=D0
|
|
IF(IABS(INDEXP(ITR)).EQ.2) THEN
|
|
D0=DLOG(FR0(ITR-1))
|
|
IF(FLNU(IKNU).GT.D0) FLNU(IKNU)=D0
|
|
END IF
|
|
ELSE
|
|
IFR1(ITR)=NFREQ
|
|
IF(IKNU.LE.NATOM) THEN
|
|
IAT=IATM(ILOW(ITR))
|
|
D0=DLOG(FR0(ITR))-XPNU*DLNU(IAT)
|
|
D1=DLOG(FRL1(ITR))
|
|
IF(D1.GT.D0) D0=D1
|
|
IF(FLNU(IKNU).GT.D0) FLNU(IKNU)=D0
|
|
ELSE
|
|
D0=DLOG(FRL1(ITR))
|
|
IF(FLNU(IKNU).GT.D0) FLNU(IKNU)=D0
|
|
END IF
|
|
IF(DLOG(FR0(ITR)).EQ.XFRB) IJTC(ITR)=NFREQ
|
|
END IF
|
|
ELSE
|
|
IF(IFR0(ITR).EQ.0) THEN
|
|
IFR0(ITR)=NFREQ
|
|
ELSE
|
|
IFR1(ITR)=NFREQ
|
|
IF(DLOG(FR0(ITR)).EQ.XFRB) IJTC(ITR)=NFREQ
|
|
END IF
|
|
END IF
|
|
END IF
|
|
IL=IL-1
|
|
XFRA=XFRB
|
|
IF(XPNU.EQ.24. .AND. FREQ(NFREQ).LT.FRS2) THEN
|
|
XPNU=HALF*XPNU
|
|
DO IAT=1,NATOM
|
|
DLNU(IAT)=TWO*DLNU(IAT)
|
|
DLNU(IAT+NATOM)=TWO*DLNU(IAT+NATOM)
|
|
END DO
|
|
END IF
|
|
END DO
|
|
C
|
|
XFRB=DLOG(FRCMIN)
|
|
IF(XFRA.GT.XFRB) THEN
|
|
DXNU=DLNU(NNU-1)
|
|
NFS=INT((XFRA-XFRB)/DXNU)+1
|
|
XFS0=(XFRA-XFRB)/FLOAT(NFS)
|
|
DO IJ=NFREQ+1,NFREQ+NFS
|
|
XFR=DLOG(FREQ(IJ-1))-XFS0
|
|
FREQ(IJ)=EXP(XFR)
|
|
END DO
|
|
NFREQ=NFREQ+NFS
|
|
END IF
|
|
FREQ(NFREQ)=FRCMIN
|
|
DO 20 ITR=1,NTRANS
|
|
IF(LINEXP(ITR)) GO TO 20
|
|
DO IJ=IFR0(ITR),IFR1(ITR)
|
|
NLINES(IJ)=NLINES(IJ)+1
|
|
END DO
|
|
20 CONTINUE
|
|
C
|
|
C Choose continuum frequency points in the global set
|
|
C
|
|
FRLEV(NLEVEL+1)=FRCMIN
|
|
IL=1
|
|
DO WHILE(FRLEV(IL).GT.FRS1)
|
|
IL=IL+1
|
|
END DO
|
|
IB0=NFRS1
|
|
NUB=2*NATOM+1
|
|
XFRA=DLOG(FRS1)
|
|
DO WHILE(IL.LE.NLEVEL+1)
|
|
IF(FRLEV(IL).LT.FRCMIN) GO TO 490
|
|
IF(IL.GT.1 .AND. IL.LE.NLEVEL) THEN
|
|
IF(FRLEV(IL).GE.FRLEV(IL-1)) GO TO 490
|
|
END IF
|
|
IF(IL.LE.NLEVEL) ITR=ITRL(IL)
|
|
FRLV0=FRLEV(IL)
|
|
IB1=IB0
|
|
DO WHILE(FREQ(IB1).GT.FRLV0)
|
|
IB1=IB1+1
|
|
XFRB=DLOG(FREQ(IB1))
|
|
IF(IFREQB(NFREQC).LT.IB1) THEN
|
|
IF(NLINES(IB1).EQ.0 .AND. ISPODF.GT.1) THEN
|
|
NFREQC=NFREQC+1
|
|
IFREQB(NFREQC)=IB1
|
|
XFRA=XFRB
|
|
ELSE IF((XFRA-XFRB).GT.DLNU(NUB)) THEN
|
|
NFREQC=NFREQC+1
|
|
IFREQB(NFREQC)=IB1
|
|
XFRA=XFRB
|
|
END IF
|
|
END IF
|
|
END DO
|
|
IF(IL.LE.NLEVEL) THEN
|
|
IFR0(ITR)=1
|
|
IFR1(ITR)=IB1-1
|
|
IJTC(ITR)=IFR1(ITR)
|
|
END IF
|
|
IF(IFREQB(NFREQC).LT.(IB1-1)) THEN
|
|
NFREQC=NFREQC+1
|
|
IFREQB(NFREQC)=IB1-1
|
|
END IF
|
|
IF(IFREQB(NFREQC).LT.IB1) THEN
|
|
NFREQC=NFREQC+1
|
|
IFREQB(NFREQC)=IB1
|
|
END IF
|
|
XFRA=DLOG(FREQ(IB1))
|
|
IB0=IB1
|
|
490 IL=IL+1
|
|
IF(FRLEV(IL).LT.FRS2) NUB=2*NATOM+2
|
|
END DO
|
|
C
|
|
IF(IFREQB(NFREQC).LT.NFREQ) THEN
|
|
NFREQC=NFREQC+1
|
|
IFREQB(NFREQC)=NFREQ
|
|
END IF
|
|
C
|
|
NFREQL=0
|
|
XBL=DLOG(FRS1)
|
|
NFLX=0
|
|
DO 410 IT=1,NTRANS
|
|
IF(LINEXP(IT)) GO TO 410
|
|
IF(FR0(IT).LT.FRCMIN) GO TO 410
|
|
INDXPA=ABS(INDEXP(IT))
|
|
IF(INDXPA.GT.2 .AND. INDXPA.LE.4) GO TO 410
|
|
IL0=ILOW(IT)
|
|
ITC=ITRA(IL0,NNEXT(IEL(IL0)))
|
|
IF(ITC.EQ.0) ITC=ITRA(IL0,NNEXT(IEL(IL0))+1)
|
|
IF(IFR1(IT).LE.IFR1(ITC)) GO TO 411
|
|
IF(IFR0(IT).LE.IFR1(ITC) .AND. ITC.GT.0) IFR0(IT)=IFR1(ITC)+1
|
|
411 NF=IFR1(IT)-IFR0(IT)+1
|
|
KFR0(IT)=NFREQL+1
|
|
KFR1(IT)=NFREQL+NF
|
|
NFREQL=NFREQL+NF
|
|
IF(INDXPA.EQ.2) THEN
|
|
FR02H=HALF*(FREQ(IFR0(IT))+FREQ(IFR1(IT)))
|
|
IJTC(IT)=IFR1(IT)
|
|
DO WHILE(FR02H.GT.FREQ(IJTC(IT)) .AND. IJTC(IT).GT.1)
|
|
IJTC(IT)=IJTC(IT)-1
|
|
END DO
|
|
END IF
|
|
|
|
al=2.997926e18/fr0(it)
|
|
io=iel(il0)
|
|
write(42,642) it,typion(io),il0,iup(it),iatm(il0),
|
|
* il0-nfirst(io)+1,iup(it)-nfirst(io)+1,al,
|
|
* ifr0(it),ifr1(it),nf
|
|
642 format(i7,a6,2i7,3i5,f12.3,3i7)
|
|
IF(NF.GT.MFREQL) THEN
|
|
WRITE(10,*) IL0,IT,NF
|
|
CALL QUIT('Too many frequencies in a line - nf.gt.mfreql',
|
|
* nf,mfreql)
|
|
END IF
|
|
IF(NF.GT.NFLX) NFLX=NF
|
|
IF(KFR1(IT).GT.MFREQP)
|
|
* CALL QUIT('Too many cross-sections to store in PRFLIN',
|
|
* kfr1(it),mfreqp)
|
|
410 CONTINUE
|
|
C
|
|
DO IT=1,NTRANS
|
|
MODW=IABS(INDEXP(IT))
|
|
IF(MODW.EQ.5 .OR. MODW.EQ.15) THEN
|
|
IJTC(IT)=IFR1(IT)
|
|
FRLV0=FR0PC(IT)
|
|
IB1=NFRS1
|
|
DO WHILE(FREQ(IB1).GT.FRLV0)
|
|
IB1=IB1+1
|
|
END DO
|
|
IFR0(IT)=1
|
|
IFR1(IT)=IB1-1
|
|
END IF
|
|
END DO
|
|
C
|
|
C Weights
|
|
C
|
|
DO IJ=NFRS1+1,NFREQ
|
|
D121=HALF*(FREQ(IJ-1)-FREQ(IJ))
|
|
W(IJ-1)=W(IJ-1)+D121
|
|
W(IJ)=W(IJ)+D121
|
|
END DO
|
|
C
|
|
DO IJ=1,NFREQ
|
|
IJALI(IJ)=1
|
|
IJX(IJ)=1
|
|
JIK(IJ)=IJ
|
|
END DO
|
|
NPPX=NFREQ
|
|
C
|
|
write(10,*) nfreq,nfreqc,nfreql,nflx
|
|
IF(NFREQ.GT.MFREQ) THEN
|
|
WRITE(10,1000) NFREQ
|
|
1000 FORMAT(' Number of frequencies:',I10)
|
|
CALL QUIT('nfreq.gt.mfreq',nfreq,mfreq)
|
|
END IF
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE INIFRT
|
|
C =================
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
C
|
|
DIMENSION FREQCO(MFREQC),WCO(MFREQC),FRLEV(MLEVEL),IENS(MLEVEL)
|
|
dimension WCHCO(MFREQC),IJXCO(MFREQC)
|
|
common/ijflar/ijfl(mlevel)
|
|
C
|
|
DFEDG=0.01
|
|
NEND=NFTAIL
|
|
DIVEND=DFTAIL
|
|
NJC=NFREQC/5
|
|
DNX=UN-UN/FLOAT(NJC)
|
|
CALL INDEXX(NLEVEL,ENION,IENS)
|
|
DO IL=1,NLEVEL
|
|
ILS=IENS(NLEVEL-IL+1)
|
|
FRLEV(IL)=ENION(ILS)/H
|
|
IJFL(IL)=0
|
|
END DO
|
|
C
|
|
IF(FRCMAX.LE.0.) THEN
|
|
FREQCO(1)=8.E11*TEFF
|
|
ELSE
|
|
FREQCO(1)=FRCMAX
|
|
END IF
|
|
C
|
|
IL0=1
|
|
IF(FREQCO(1).LT.CFRMAX*FRLEV(IL0) .AND. CFRMAX.GT.UN) THEN
|
|
FREQCO(1)=CFRMAX*FRLEV(IL0)
|
|
GO TO 10
|
|
END IF
|
|
DO WHILE (FREQCO(1).LT.FRLEV(IL0) .AND. IL0.LT.NLEVEL)
|
|
ILS=IENS(NLEVEL-IL0+1)
|
|
ILN=NNEXT(IEL(ILS))
|
|
ITR0=ITRA(ILS,ILN)
|
|
INDEXP(ITR0)=0
|
|
IFR0(ITR0)=0
|
|
IFR1(ITR0)=0
|
|
IF(FRLEV(IL0).GT.0.) WRITE(10,159) IL0,FRLEV(IL0),ILS,ILN,ITR0
|
|
159 FORMAT(' Edge at frequency larger than FRCMAX',I5,E12.4,3I7)
|
|
IL0=IL0+1
|
|
END DO
|
|
10 CONTINUE
|
|
C
|
|
NFREQC=NEND+1
|
|
FREQCO(NEND)=(un+dfedg)*FRLEV(il0)
|
|
FREQCO(NEND+1)=(un-dfedg)*FRLEV(il0)
|
|
NEND1=NEND/2+1
|
|
XEND=UN/FLOAT(NEND1-1)
|
|
FREQCO(NEND1)=FREQCO(1)-(UN-DIVEND)*(FREQCO(1)-FREQCO(NEND))
|
|
IJXCO(NEND+1)=1
|
|
C
|
|
C high-frequency tail of the spectrum - a two-part Simpson integration
|
|
C
|
|
C 1st part - from the highest frequency FRCMAX to a division freq.
|
|
C
|
|
IJXCO(1)=1
|
|
IJXCO(NEND1)=1
|
|
D121=XEND*(FREQCO(1)-FREQCO(NEND1))
|
|
if(icompt.gt.0) d121=(freqco(1)/freqco(nend1))**xend
|
|
DO IJ=2,NEND1-1
|
|
FREQCO(IJ)=FREQCO(IJ-1)-D121
|
|
if(icompt.gt.0) freqco(ij)=freqco(ij-1)/d121
|
|
IJXCO(IJ)=2
|
|
END DO
|
|
D121=THIRD*(FREQCO(1)-FREQCO(2))
|
|
DO IJ=2,NEND1-1,2
|
|
WCO(IJ)=4.*D121
|
|
WCO(IJ-1)=WCO(IJ-1)+D121
|
|
WCO(IJ+1)=WCO(IJ+1)+D121
|
|
WCHCO(IJ)=0.
|
|
END DO
|
|
C
|
|
C 2nd part - from the division freq to the first discontinuity
|
|
C
|
|
if(nend1.lt.nend) then
|
|
IJXCO(NEND)=1
|
|
IJXCO(NEND+1)=1
|
|
D121=XEND*(FREQCO(NEND1)-FREQCO(NEND))
|
|
if(icompt.gt.0) d121=(freqco(nend1)/freqco(nend))**xend
|
|
DO IJ=NEND1+1,NEND-1
|
|
FREQCO(IJ)=FREQCO(IJ-1)-D121
|
|
if(icompt.gt.0) freqco(ij)=freqco(ij-1)/d121
|
|
IJXCO(IJ)=2
|
|
END DO
|
|
D121=THIRD*(FREQCO(NEND1)-FREQCO(NEND1+1))
|
|
DO IJ=NEND1+1,NEND-1,2
|
|
WCO(IJ)=4.*D121
|
|
WCO(IJ-1)=WCO(IJ-1)+D121
|
|
WCO(IJ+1)=WCO(IJ+1)+D121
|
|
WCHCO(IJ)=0.
|
|
END DO
|
|
end if
|
|
C
|
|
C the 1st discontinuity - the one with the highest frequency
|
|
C
|
|
HAEND=HALF*(FREQCO(NEND)-FREQCO(NEND+1))
|
|
XEND=UN/FLOAT(NEND-1)
|
|
WCO(NEND)=WCO(NEND)+HAEND
|
|
WCO(NEND+1)=WCO(NEND+1)+HAEND
|
|
WCHCO(1)=0.
|
|
WCHCO(NEND)=HAEND
|
|
ILS=IENS(NLEVEL)
|
|
IJFL(ILS)=NEND
|
|
IL0=NLEVEL
|
|
IF(FRCMIN.LE.0.) FRCMIN=1.D12
|
|
FRCLST=FRLEV(IL0)
|
|
DO WHILE(FRCLST.LT.FRCMIN)
|
|
IF(FRLEV(IL0).GT.0.) WRITE(10,160) IL0,FRLEV(IL0)
|
|
160 FORMAT(' Edge at frequency smaller than 1.d12',i5,e12.4)
|
|
IL0=IL0-1
|
|
FRCLST=FRLEV(IL0)
|
|
END DO
|
|
IL0=2
|
|
C
|
|
100 CONTINUE
|
|
FRC0=DNX*FREQCO(NFREQC)
|
|
IF(FRC0.LT.FRCLST) THEN
|
|
NFREQC=NFREQC+2
|
|
FREQCO(NFREQC-1)=(un+dfedg)*FRCLST
|
|
FREQCO(NFREQC)=(un-dfedg)*FRCLST
|
|
IJXCO(NFREQC-1)=1
|
|
IJXCO(NFREQC)=1
|
|
WCO(NFREQC)=WCO(NFREQC)+HALF*(FREQCO(NFREQC-1)-FREQCO(NFREQC))
|
|
WCO(NFREQC-1)=WCO(NFREQC-1)+
|
|
* HALF*(FREQCO(NFREQC-2)-FREQCO(NFREQC))
|
|
WCO(NFREQC-2)=WCO(NFREQC-2)+
|
|
* HALF*(FREQCO(NFREQC-2)-FREQCO(NFREQC-1))
|
|
WCHCO(NFREQC-1)=HALF*(FREQCO(NFREQC-1)-FREQCO(NFREQC))
|
|
WCHCO(NFREQC-2)=HALF*(FREQCO(NFREQC-2)-FREQCO(NFREQC-1))
|
|
ILS=IENS(NLEVEL-IL0+1)
|
|
IJFL(ILS)=NFREQC-1
|
|
IF(IL0.LT.NLEVEL) THEN
|
|
DO IL=IL0+1,NLEVEL
|
|
ILS=IENS(NLEVEL-IL+1)
|
|
IJFL(ILS)=NFREQC-1
|
|
IF(FRLEV(IL).LT.FRCMIN) IJFL(ILS)=0
|
|
END DO
|
|
END IF
|
|
D121=XEND*(FREQCO(NFREQC)-FRCMIN)
|
|
DO IJ=NFREQC+1,NFREQC+NEND-1
|
|
FREQCO(IJ)=FREQCO(IJ-1)-D121
|
|
IJXCO(IJ)=2
|
|
WCHCO(IJ)=0.
|
|
END DO
|
|
IJXCO(NFREQC+NEND-1)=1
|
|
DO IJ=NFREQC+1,NFREQC+NEND-2,2
|
|
WCO(IJ)=FTH*D121
|
|
WCO(IJ-1)=WCO(IJ-1)+THIRD*D121
|
|
WCO(IJ+1)=WCO(IJ+1)+THIRD*D121
|
|
END DO
|
|
WCHCO(NFREQC)=THIRD*D121
|
|
NFREQC=NFREQC+NEND-1
|
|
GO TO 200
|
|
END IF
|
|
DF0=FRLEV(IL0)+0.1*(FREQCO(NFREQC)-FRC0)
|
|
FRTL=(UN+DFEDG)*FRLEV(IL0)
|
|
IF(FRC0.GT.DF0) THEN
|
|
NFREQC=NFREQC+1
|
|
FREQCO(NFREQC)=FRC0
|
|
IJXCO(NFREQC)=2
|
|
WCO(NFREQC)=WCO(NFREQC)+HALF*(FREQCO(NFREQC-1)-FREQCO(NFREQC))
|
|
WCO(NFREQC-1)=WCO(NFREQC-1)+
|
|
* HALF*(FREQCO(NFREQC-1)-FREQCO(NFREQC))
|
|
WCHCO(NFREQC-1)=HALF*(FREQCO(NFREQC-1)-FREQCO(NFREQC))
|
|
ELSE IF(FRTL.LT.FREQCO(NFREQC)) THEN
|
|
NFREQC=NFREQC+2
|
|
FREQCO(NFREQC-1)=FRTL
|
|
FREQCO(NFREQC)=(un-dfedg)*FRLEV(IL0)
|
|
IJXCO(NFREQC-1)=1
|
|
IJXCO(NFREQC)=1
|
|
WCO(NFREQC)=WCO(NFREQC)+HALF*(FREQCO(NFREQC-1)-FREQCO(NFREQC))
|
|
WCO(NFREQC-1)=WCO(NFREQC-1)+
|
|
* HALF*(FREQCO(NFREQC-2)-FREQCO(NFREQC))
|
|
WCO(NFREQC-2)=WCO(NFREQC-2)+
|
|
* HALF*(FREQCO(NFREQC-2)-FREQCO(NFREQC-1))
|
|
WCHCO(NFREQC-1)=HALF*(FREQCO(NFREQC-1)-FREQCO(NFREQC))
|
|
WCHCO(NFREQC-2)=HALF*(FREQCO(NFREQC-2)-FREQCO(NFREQC-1))
|
|
ILS=IENS(NLEVEL-IL0+1)
|
|
IJFL(ILS)=NFREQC-1
|
|
IL0=IL0+1
|
|
ELSE
|
|
ILS=IENS(NLEVEL-IL0+1)
|
|
IJFL(ILS)=NFREQC-1
|
|
IL0=IL0+1
|
|
END IF
|
|
GO TO 100
|
|
200 CONTINUE
|
|
C
|
|
nend2=nfreqc
|
|
IF(IFRSET.EQ.0) THEN
|
|
DO IJ=1,NUMFREQ
|
|
FREQCO(IJ+NEND2)=FRTAB(IJ)
|
|
END DO
|
|
NFR=NUMFREQ+NEND2
|
|
ELSE IF(IFRSET.GT.0) THEN
|
|
NFRTAB=IFRSET
|
|
DO IJ=1,NFRTAB
|
|
FR=LOG(FRTAB(NUMFREQ))+
|
|
* LOG(FRTAB(1)/FRTAB(NUMFREQ))*(IJ-1)/(NFRTAB-1)
|
|
FREQCO(NEND2+NFRTAB-IJ+1)=EXP(FR)
|
|
NFR=NFRTAB+NEND2
|
|
END DO
|
|
END IF
|
|
C
|
|
IF(FRTAB(NUMFREQ).GT.FRCMIN) THEN
|
|
DO IJ=1,NEND
|
|
FR=LOG(FRCMIN)+(LOG((UN-DFEDG)*FRTAB(NUMFREQ)/FRCMIN)*
|
|
* (IJ-1)/(NEND-1))
|
|
FREQCO(NFR+NEND-IJ+1)=EXP(FR)
|
|
END DO
|
|
NFR=NFR+NEND
|
|
END IF
|
|
NFREQC=NFR
|
|
C
|
|
WCO(1)=0.5*(FREQCO(1)-FREQCO(2))
|
|
WCO(NFR)=0.5*(FREQCO(NFR-1)-FREQCO(NFR))
|
|
DO IJ=2,NFR-1
|
|
WCO(IJ)=0.5*(FREQCO(IJ-1)-FREQCO(IJ+1))
|
|
END DO
|
|
C
|
|
DO IJ=NFREQ,1,-1
|
|
FREQ(IJ+NFREQC)=FREQ(IJ)
|
|
W(IJ+NFREQC)=W(IJ)
|
|
PROF(IJ+NFREQC)=PROF(IJ)
|
|
IJALI(IJ+NFREQC)=IJALI(IJ)
|
|
END DO
|
|
DO IJ=1,NFREQC
|
|
FREQ(IJ)=FREQCO(IJ)
|
|
W(IJ)=WCO(IJ)
|
|
IJALI(IJ)=1
|
|
IJX(IJ)=1
|
|
PROF(IJ)=0.
|
|
END DO
|
|
DO 20 ITR=1,NTRANS
|
|
IF(.NOT.LINE(ITR).OR.INDEXP(ITR).EQ.0) GO TO 20
|
|
IF(IFR0(ITR).GT.0) IFR0(ITR)=IFR0(ITR)+NFREQC
|
|
IF(IFR1(ITR).GT.0) IFR1(ITR)=IFR1(ITR)+NFREQC
|
|
20 CONTINUE
|
|
NFREQ=NFREQ+NFREQC
|
|
C
|
|
C determination of the first (IFR0) and the last (IFR1) frequency
|
|
C for each explicit continuum - only if they were not already read
|
|
C
|
|
DO 30 ITR=1,NTRANS
|
|
IF(LINE(ITR)) GO TO 30
|
|
IF(IFR0(ITR).LE.0) IFR0(ITR)=1
|
|
IF(IFR1(ITR).GT.0) GO TO 30
|
|
IF1=0
|
|
FR01=FR0(ITR)
|
|
MODE=INDEXP(ITR)
|
|
IF(IABS(MODE).EQ.5.OR.IABS(MODE).EQ.15) FR01=FR0PC(ITR)
|
|
DO IJ=1,NFREQC
|
|
IF(FREQ(IJ).GE.FR01) IF1=IJ
|
|
END DO
|
|
IFR1(ITR)=IF1
|
|
30 CONTINUE
|
|
RETURN
|
|
END
|
|
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
FUNCTION CROSS(IBFT,IJ)
|
|
C =======================
|
|
C
|
|
C Evaluation of the photoionization cross-section
|
|
C IBF - index ot the b-f transition
|
|
C IJ - frequency index
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
C
|
|
IJ0=IJBF(IJ)
|
|
A1=AIJBF(IJ)
|
|
CROSS=A1*BFCS(IBFT,IJ0)+(UN-A1)*BFCS(IBFT,IJ0+1)
|
|
c
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
FUNCTION CROSSD(IBFT,IJ,ID)
|
|
C ===========================
|
|
C
|
|
C Evaluation of the photoionization cross-section
|
|
C IBF - index ot the b-f transition
|
|
C IJ - frequency index
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
C
|
|
IJ0=IJBF(IJ)
|
|
A1=AIJBF(IJ)
|
|
CROSSD=A1*BFCS(IBFT,IJ0)+(UN-A1)*BFCS(IBFT,IJ0+1)
|
|
c
|
|
c contribution from dielectronic recombination
|
|
c
|
|
if(ifdiel.eq.0) return
|
|
ITR=ITRBF(IBFT)
|
|
if(idiel(itr).gt.0.and.id.gt.0) then
|
|
i=ilow(itr)
|
|
ion=iel(i)
|
|
if(i.eq.nfirst(ion).and.iup(itr).eq.nnext(ion)) then
|
|
if(freq(ij).ge.fr0(itr).and.freq(ij).le.fr0(itr)*1.1)
|
|
* crossd=crossd+diesig(ion,id)
|
|
end if
|
|
end if
|
|
c
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE DIETOT
|
|
C =================
|
|
C
|
|
C modification of the photoionization cross-section
|
|
C for taking into account dielectronic recombination
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
C
|
|
do ion=1,nion
|
|
i=nfirst(ion)
|
|
ia=numat(iatm(i))
|
|
io=iz(ion)
|
|
do id=1,nd
|
|
t=temp(id)
|
|
xpx=dens(id)/wmm(id)/ytot(id)
|
|
call dielrc(ia,io,t,xpx,dirt,sig0)
|
|
diesig(ion,id)=sig0
|
|
if(id.eq.1.or.id.eq.35.or.id.eq.nd) then
|
|
write(99,699) ion,ia,io,id,i,nnext(ion),dirt,sig0
|
|
end if
|
|
end do
|
|
end do
|
|
699 format(6i5,1p2e12.4)
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE RADPRE
|
|
C =================
|
|
C
|
|
C radiative acceleration
|
|
C
|
|
C exclude automatically the strongest lines of total
|
|
C radiation pressure (Keyword XGRAD)
|
|
C
|
|
C depth-dependent criterion
|
|
C
|
|
C automatic explicit frequencies if XGRAD>=0
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
DIMENSION GRADA(MDEPTH),PRID(MDEPTH),GRADI(MFREQ)
|
|
DIMENSION PGT(MDEPTH),GGRT(MDEPTH),XGRD(MDEPTH),XGRD0(10)
|
|
DIMENSION XGRD1(20),XGRD2(20)
|
|
DIMENSION IIGR(MFREQ)
|
|
PARAMETER(PGRD=4.1916825D-10)
|
|
DATA XGRD0/0.1,0.3,0.5,0.7,0.9,0.92,0.94,0.96,0.98,0.99/
|
|
DATA XGRD1/0.1,0.2,0.3,0.4,0.5,0.6,0.65,0.7,0.75,0.8,
|
|
& 0.85,0.9,0.92,0.94,0.96,0.98,0.99,0.99,0.99,0.99/
|
|
DATA XGRD2/0.1,0.2,0.3,0.4,0.45,0.5,0.55,0.6,0.65,0.7,
|
|
& 0.75,0.8,0.84,0.87,0.9,0.93,0.95,0.97,0.98,0.99/
|
|
|
|
IF(XGRAD.EQ.0) THEN
|
|
DO ID=1,10
|
|
XGRD(ID)=XGRD0(ID)
|
|
END DO
|
|
DO ID=11,ND
|
|
XGRD(ID)=XGRD(ID-1)
|
|
END DO
|
|
ELSE IF(XGRAD.EQ.-1.) THEN
|
|
DO ID=1,20
|
|
XGRD(ID)=XGRD1(ID)
|
|
END DO
|
|
DO ID=21,ND
|
|
XGRD(ID)=XGRD(ID-1)
|
|
END DO
|
|
ELSE IF(XGRAD.EQ.-2.) THEN
|
|
DO ID=1,20
|
|
XGRD(ID)=XGRD2(ID)
|
|
END DO
|
|
DO ID=21,ND
|
|
XGRD(ID)=XGRD(ID-1)
|
|
END DO
|
|
ELSE
|
|
DO ID=1,ND
|
|
XGRD(ID)=XGRAD
|
|
END DO
|
|
END IF
|
|
|
|
C Acceleration due to gas and turbulent pressure
|
|
|
|
DO ID=1,ND
|
|
PGAS=(DENS(ID)/WMM(ID)+ELEC(ID))*BOLK*TEMP(ID)
|
|
PGT(ID)=PGAS+HALF*DENS(ID)*VTURB(ID)*VTURB(ID)
|
|
END DO
|
|
DO ID=2,ND
|
|
GGRT(ID)=(PGT(ID)-PGT(ID-1))/(DM(ID)-DM(ID-1))
|
|
END DO
|
|
GGRT(1)=GGRT(2)
|
|
|
|
C Compute total radiative acceleration at every depth points
|
|
|
|
DO ID=1,ND
|
|
GRAD(ID)=0.
|
|
GRADA(ID)=0.
|
|
PRADT(ID)=0.
|
|
END DO
|
|
PRD0=0.
|
|
DO ID=2,ND
|
|
PRID(ID)=PGRD/(DM(ID)-DM(ID-1))
|
|
END DO
|
|
PGRD1=PGRD/DENS(1)
|
|
DO IJ=1,NFREQ
|
|
CALL OPACF1(IJ)
|
|
CALL RTEFR1(IJ)
|
|
FLUXW=W(IJ)*(RAD1(1)*FH(IJ)-HEXTRD(IJ))
|
|
GRADF(1,IJ)=FLUXW*ABSO1(1)*PGRD1
|
|
GRADA(1)=GRADA(1)+GRADF(1,IJ)
|
|
DO ID=2,ND
|
|
FRD=FAK1(ID)*RAD1(ID)-FAK1(ID-1)*RAD1(ID-1)
|
|
GRADF(ID,IJ)=W(IJ)*FRD*PRID(ID)
|
|
GRADA(ID)=GRADA(ID)+GRADF(ID,IJ)
|
|
END DO
|
|
END DO
|
|
DO ID=1,ND
|
|
GGRT(ID)=GRADA(ID)+GGRT(ID)
|
|
END DO
|
|
C
|
|
C radiation pressure
|
|
C
|
|
DO ID=1,ND
|
|
PRADT(ID)=PRADT(ID)*PCK
|
|
END DO
|
|
PRD0=PRD0/DENS1(1)*DM(1)*PCK
|
|
C
|
|
C Depth-dependent rejection: set up LSKIP(ID,IJ)
|
|
C only if XGRAD<=0
|
|
|
|
NFE=0
|
|
DO ID=1,ND
|
|
XGR0=GRAV*ABS(XGRD(ID))
|
|
DO IJ=1,NFREQ
|
|
GRADI(IJ)=GRADF(ID,IJ)
|
|
LSKIP(ID,IJ)=.FALSE.
|
|
END DO
|
|
if(ifprad.eq.0) then
|
|
do ij=1,nfreq
|
|
lskip(id,ij)=.true.
|
|
end do
|
|
end if
|
|
CALL INDEXX(NFREQ,GRADI,IIGR)
|
|
GRAD(ID)=GRADA(ID)
|
|
GGRT0=GGRT(ID)
|
|
|
|
IF(XGRAD.GT.0. .AND. ID.GT.1) THEN
|
|
DO IJ=1,NFREQ
|
|
LSKIP(ID,IJ)=LSKIP(1,IJ)
|
|
IF(LSKIP(ID,IJ)) THEN
|
|
GGRT0=GGRT0-GRADI(IJ)
|
|
GRAD(ID)=GRAD(ID)-GRADI(IJ)
|
|
END IF
|
|
END DO
|
|
GO TO 110
|
|
END IF
|
|
|
|
IF(ID.GE.ND-1) GO TO 110
|
|
|
|
IJR=NFREQ
|
|
NSK=0
|
|
DO WHILE(GRAD(ID).GT.XGR0 .AND. IJR.GT.0)
|
|
IJ=IIGR(IJR)
|
|
IF(IJLIN(IJ).EQ.0 .AND. NLINES(IJ).EQ.0) GO TO 99
|
|
LSKIP(ID,IJ)=.TRUE.
|
|
GGRT0=GGRT0-GRADI(IJ)
|
|
GRAD(ID)=GRAD(ID)-GRADI(IJ)
|
|
NSK=NSK+1
|
|
IF(XGRD(ID).GE.0.) GO TO 99
|
|
IF(NFE.LT.10) THEN
|
|
IF(ISPODF.EQ.0) THEN
|
|
ITR=IJLIN(IJ)
|
|
IF(ITR.EQ.0) GO TO 99
|
|
INDXPA=IABS(INDEXP(ITR))
|
|
DX=(FREQ(IJ)-FREQ(IJ+1))*0.25
|
|
DZ=ABS(FREQ(IJ)-FR0(ITR))
|
|
IF(DZ.LT.DX .AND. INDXPA.EQ.1) THEN
|
|
IF(INDEXP(ITR).LT.0) THEN
|
|
INDEXP(ITR)=-9
|
|
ELSE
|
|
INDEXP(ITR)=9
|
|
END IF
|
|
IF(.NOT.LEXP(ITR)) THEN
|
|
LEXP(ITR)=.TRUE.
|
|
NFREQE=NFREQE+1
|
|
if(nfreqe.gt.mfrex)
|
|
* CALL QUIT('nfreqe.gt.mfrex',nfreqe,mfrex)
|
|
NN=NN+1
|
|
IJALI(IJ)=0
|
|
IJEX(IJ)=NFREQE
|
|
IJFR(NFREQE)=IJ
|
|
IJX(IJ)=1
|
|
WC(IJ)=0.
|
|
WRITE(10,612) FREQ(IJ),ITR,IJ,NFREQE
|
|
NFE=NFE+1
|
|
END IF
|
|
END IF
|
|
ELSE
|
|
DO 100 ILINT=1,NLINES(IJ)
|
|
ITR=ITRLIN(ILINT,IJ)
|
|
INDXPA=IABS(INDEXP(ITR))
|
|
DX=(FREQ(IJ)-FREQ(IJ+1))*0.25
|
|
DZ=ABS(FREQ(IJ)-FR0(ITR))
|
|
IF(DZ.GT.DX .OR. INDXPA.NE.1) GOTO 100
|
|
IF(INDEXP(ITR).LT.0) THEN
|
|
INDEXP(ITR)=-9
|
|
ELSE
|
|
INDEXP(ITR)=9
|
|
END IF
|
|
IF(.NOT.LEXP(ITR)) THEN
|
|
LEXP(ITR)=.TRUE.
|
|
NFREQE=NFREQE+1
|
|
if(nfreqe.gt.mfrex)
|
|
* CALL QUIT('nfreqe.gt.mfrex',nfreqe,mfrex)
|
|
NN=NN+1
|
|
IJALI(IJ)=0
|
|
IJEX(IJ)=NFREQE
|
|
IJFR(NFREQE)=IJ
|
|
IJX(IJ)=1
|
|
WC(IJ)=0.
|
|
WRITE(10,612) FREQ(IJ),ITR,IJ,NFREQE
|
|
NFE=NFE+1
|
|
END IF
|
|
100 CONTINUE
|
|
END IF
|
|
END IF
|
|
99 IJR=IJR-1
|
|
END DO
|
|
|
|
110 IF(ID.EQ.1) THEN
|
|
TAUR=HALF*DEDM1*ABROSD(ID)*DENS(ID)
|
|
ELSE
|
|
DTAUR=DELDM(ID-1)*(ABROSD(ID)+ABROSD(ID-1))
|
|
TAUR=TAUR+DTAUR
|
|
END IF
|
|
|
|
rgrt=ggrt(id)/ggrt0
|
|
if(rgrt.gt.0.) then
|
|
rgrt=dlog10(rgrt)
|
|
else
|
|
rgrt=-9.
|
|
end if
|
|
|
|
END DO
|
|
612 FORMAT(' AUTOMATIC EXPLICIT FREQ. ',1PE12.6,3I8)
|
|
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE LINSEL
|
|
C =================
|
|
C
|
|
C Exclude weakest lines
|
|
C (i.e. set them to detailed radiative balance, and
|
|
C exclude their frequencies)
|
|
C
|
|
C Selection of lines based on ratio of line core flux to
|
|
C continuum flux
|
|
C
|
|
C Non-standard parameters: STRL1 (default value 0.001)
|
|
C STRL2 ( 0.02)
|
|
C
|
|
C STRL2 allows to reduce the number of frequency points in
|
|
C "intermediate-strength" lines
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
DIMENSION PRFTMP(MDEPTH)
|
|
C
|
|
parameter (SIXTH=UN/6.,FTH=4./3.)
|
|
C
|
|
NLSW=0
|
|
NLSI=0
|
|
NLSS=0
|
|
NLSTO=0
|
|
C
|
|
IF(ISPODF.GE.1) GO TO 190
|
|
C
|
|
CALL OPAINI(1)
|
|
C
|
|
C Normal lines
|
|
C
|
|
DO 10 ITR=1,NTRANS
|
|
IF(LINEXP(ITR)) GO TO 10
|
|
IF(LEXP(ITR) .OR. IEL(ILOW(ITR)).EQ.IELH) THEN
|
|
NLSTO=NLSTO+1
|
|
NLSS=NLSS+1
|
|
GO TO 10
|
|
ENDIF
|
|
MODE=IABS(INDEXP(ITR))
|
|
IF(MODE.GE.2 .AND. MODE.LE.4) GO TO 10
|
|
IKA=IFR0(ITR)
|
|
IF(IKA.EQ.0) GO TO 10
|
|
IKB=IFR1(ITR)
|
|
CALL OPACF1(IKA)
|
|
CALL RTEFR1(IKA)
|
|
FLUXA=FH(IKA)*RAD1(1)
|
|
CALL OPACF1(IKB)
|
|
CALL RTEFR1(IKB)
|
|
FLUXB=FH(IKB)*RAD1(1)
|
|
IK0=(IKA+IKB)/2
|
|
IF(MODE.EQ.2) IK0=IFR1(ITR)-1
|
|
CALL OPACF1(IK0)
|
|
CALL RTEFR1(IK0)
|
|
FLUX0=FH(IK0)*RAD1(1)
|
|
RHAB=UN-TWO*FLUX0/(FLUXA+FLUXB)
|
|
NFK0=IKB-IKA+1
|
|
NLSTO=NLSTO+1
|
|
IF(ABS(RHAB).LT.STRL1) THEN
|
|
NLSW=NLSW+1
|
|
LINEXP(ITR)=.TRUE.
|
|
INDEXP(ITR)=0
|
|
DO IJ=IFR0(ITR),IFR1(ITR)
|
|
IJX(IJ)=-1
|
|
IJLIN(IJ)=0
|
|
END DO
|
|
IFR0(ITR)=0
|
|
IFR1(ITR)=0
|
|
KFR0(ITR)=0
|
|
KFR1(ITR)=0
|
|
LALI(ITR)=.FALSE.
|
|
ELSE IF(ABS(RHAB).LT.STRL2) THEN
|
|
NLSI=NLSI+1
|
|
IFR0(ITR)=IKA+3
|
|
IFR1(ITR)=IKB-3
|
|
KFR0(ITR)=KIJ(IFR0(ITR))
|
|
KFR1(ITR)=KIJ(IFR1(ITR))
|
|
DO IJ=IKA,IFR0(ITR)
|
|
IJX(IJ)=-1
|
|
IJLIN(IJ)=0
|
|
DO ID=1,ND
|
|
PRFLIN(ID,IJ)=0.
|
|
END DO
|
|
END DO
|
|
IJX(IFR0(ITR))=1
|
|
IJLIN(IFR0(ITR))=ITR
|
|
DO IJ=IFR1(ITR),IKB
|
|
IJX(IJ)=-1
|
|
IJLIN(IJ)=0
|
|
DO ID=1,ND
|
|
PRFLIN(ID,IJ)=0.
|
|
END DO
|
|
END DO
|
|
IJX(IFR1(ITR))=1
|
|
IJLIN(IFR1(ITR))=ITR
|
|
ELSE
|
|
NLSS=NLSS+1
|
|
ENDIF
|
|
NFK1=IFR1(ITR)-IFR0(ITR)
|
|
IF(NFK1.GT.0) NFK1=NFK1+1
|
|
WRITE(82,601) ITR,ILOW(ITR),IUP(ITR),
|
|
* NFK0,NFK1,RHAB
|
|
601 FORMAT(I6,2I5,2I7,1PE12.4)
|
|
10 CONTINUE
|
|
C
|
|
C superlines
|
|
C
|
|
DO 20 ITR=1,NTRANS
|
|
IF(LINEXP(ITR)) GO TO 20
|
|
MODE=IABS(INDEXP(ITR))
|
|
IF(MODE.NE.3 .AND. MODE.NE.4) GO TO 20
|
|
IF(LEXP(ITR)) THEN
|
|
NLSTO=NLSTO+1
|
|
NLSS=NLSS+1
|
|
GO TO 20
|
|
ENDIF
|
|
IKA=IFR0(ITR)
|
|
IF(IKA.EQ.0) GO TO 20
|
|
IKB=IFR1(ITR)
|
|
NFK0=IFR1(ITR)-IFR0(ITR)+1
|
|
NFK1=NFK0
|
|
RHAB=0.
|
|
RHABMX=0.
|
|
PRFA=PRFLIN(1,IKA+1)
|
|
PRFB=PRFLIN(1,IKB-1)
|
|
IF(PRFA.GT.PRFB) THEN
|
|
IK2=IKB-1
|
|
DO WHILE (IK2.GT.IKA .AND. RHAB.LT.STRL1)
|
|
CALL OPACF1(IK2)
|
|
CALL RTEFR1(IK2)
|
|
FLUX2=FH(IK2)*RAD1(1)
|
|
DO ID=1,ND
|
|
PRFTMP(ID)=PRFLIN(ID,IK2)
|
|
PRFLIN(ID,IK2)=0.
|
|
END DO
|
|
CALL OPACF1(IK2)
|
|
CALL RTEFR1(IK2)
|
|
FLUX1=FH(IK2)*RAD1(1)
|
|
RHAB=ABS(UN-FLUX2/FLUX1)
|
|
IF(RHAB.GT.RHABMX) RHABMX=RHAB
|
|
IK20=IK2
|
|
IF(RHAB.LT.STRL1) THEN
|
|
IJX(IK2+1)=-1
|
|
IJLIN(IK2+1)=0
|
|
IK2=IK2-1
|
|
ELSE
|
|
IK2=IK2+1
|
|
IFR1(ITR)=IK2
|
|
KFR1(ITR)=KIJ(IK2)
|
|
DO ID=1,ND
|
|
PRFLIN(ID,IK20)=real(PRFTMP(ID))
|
|
END DO
|
|
END IF
|
|
END DO
|
|
NFK1=IFR1(ITR)-IFR0(ITR)+1
|
|
IF(IK2.EQ.IKA) NFK1=0
|
|
ELSE
|
|
IK2=IKA+1
|
|
DO WHILE (IK2.LT.IKB .AND. RHAB.LT.STRL1)
|
|
CALL OPACF1(IK2)
|
|
CALL RTEFR1(IK2)
|
|
FLUX2=FH(IK2)*RAD1(1)
|
|
DO ID=1,ND
|
|
PRFTMP(ID)=PRFLIN(ID,IK2)
|
|
PRFLIN(ID,IK2)=0.
|
|
END DO
|
|
CALL OPACF1(IK2)
|
|
CALL RTEFR1(IK2)
|
|
FLUX1=FH(IK2)*RAD1(1)
|
|
RHAB=ABS(UN-FLUX2/FLUX1)
|
|
IF(RHAB.GT.RHABMX) RHABMX=RHAB
|
|
IK20=IK2
|
|
IF(RHAB.LT.STRL1) THEN
|
|
IJX(IK2-1)=-1
|
|
IJLIN(IK2-1)=0
|
|
IK2=IK2+1
|
|
ELSE
|
|
IK2=IK2-1
|
|
IFR0(ITR)=IK2
|
|
KFR0(ITR)=KIJ(IK2)
|
|
DO ID=1,ND
|
|
PRFLIN(ID,IK20)=real(PRFTMP(ID))
|
|
END DO
|
|
END IF
|
|
END DO
|
|
NFK1=IFR1(ITR)-IFR0(ITR)+1
|
|
IF(IK2.EQ.IKB) NFK1=0
|
|
END IF
|
|
IF(NFK1.EQ.0) THEN
|
|
NLSW=NLSW+1
|
|
LINEXP(ITR)=.TRUE.
|
|
INDEXP(ITR)=0
|
|
IFR0(ITR)=0
|
|
IFR1(ITR)=0
|
|
KFR0(ITR)=0
|
|
KFR1(ITR)=0
|
|
DO IJ=IKA,IKB
|
|
IJX(IJ)=-1
|
|
IJLIN(IJ)=0
|
|
END DO
|
|
LALI(ITR)=.FALSE.
|
|
ELSE IF(NFK1.EQ.NFK0) THEN
|
|
NLSS=NLSS+1
|
|
ELSE
|
|
NLSI=NLSI+1
|
|
END IF
|
|
NLSTO=NLSTO+1
|
|
WRITE(82,601) ITR,ILOW(ITR),IUP(ITR),
|
|
* NFK0,NFK1,RHABMX
|
|
20 CONTINUE
|
|
C
|
|
WRITE(6,602) NLSTO,NLSW,NLSI,NLSS
|
|
602 FORMAT(' Total number of lines :',i8,/,
|
|
* ' Number of weak lines :',i8,/,
|
|
* ' Intermediate lines :',i8,/,
|
|
* ' Number of strong lines:',i8/)
|
|
C
|
|
C lines or ODFs associated with each frequency
|
|
C
|
|
NLIMAX=0
|
|
DO IJ=1,NFREQ
|
|
NLINES(IJ)=0
|
|
DO 50 IT=1,NTRANS
|
|
IF(LINEXP(IT)) GO TO 50
|
|
IF(KIJ(IJ).LT.KFR0(IT)) GO TO 50
|
|
IF(KIJ(IJ).GT.KFR1(IT)) GO TO 50
|
|
IF(IJLIN(IJ).EQ.IT) GO TO 50
|
|
NLINES(IJ)=NLINES(IJ)+1
|
|
IF(NLINES(IJ).GT.MITJ)
|
|
* CALL QUIT('Too many overlappins-nlines(ij).gt.mitj',
|
|
* nlines(ij),mitj)
|
|
ITRLIN(NLINES(IJ),IJ)=int2(IT)
|
|
50 CONTINUE
|
|
IF(NLINES(IJ).GT.NLIMAX) NLIMAX=NLINES(IJ)
|
|
END DO
|
|
WRITE(6,603) NLIMAX
|
|
603 FORMAT(' MAXIMUM NUMBER OF OVERLAPPING TRANSITIONS: ',I3/)
|
|
C
|
|
C recalculate weights for frequency integration
|
|
C after the exclusion of some frequencies
|
|
C
|
|
NPPX=0
|
|
DO 100 IJ=1,NFREQ
|
|
IF(IJX(IJ).GT.0) NPPX=NPPX+1
|
|
W(IJ)=0.
|
|
KJ0=KIJ(IJ)
|
|
IF(IJX(JIK(KJ0)).EQ.-1) GO TO 100
|
|
IF(KJ0.GE.2 .AND. KJ0.LT.NFREQ) THEN
|
|
IK1=KJ0-1
|
|
DO WHILE (IJX(JIK(IK1)).EQ.-1)
|
|
IK1=IK1-1
|
|
END DO
|
|
IK2=KJ0+1
|
|
DO WHILE (IJX(JIK(IK2)).EQ.-1)
|
|
IK2=IK2+1
|
|
END DO
|
|
W(IJ)=HALF*ABS(FREQ(JIK(IK1))-FREQ(JIK(IK2)))
|
|
ELSE IF(KJ0.EQ.1) THEN
|
|
W(IJ)=HALF*ABS(FREQ(JIK(KJ0))-FREQ(JIK(KJ0+1)))
|
|
ELSE IF(KJ0.EQ.NFREQ) THEN
|
|
W(IJ)=HALF*ABS(FREQ(JIK(KJ0-1))-FREQ(JIK(KJ0)))
|
|
END IF
|
|
100 CONTINUE
|
|
C
|
|
C Correction for Simpson weights
|
|
C
|
|
JK1=JIK(1)
|
|
DO IJ=2,NFREQ,2
|
|
JK2=JIK(IJ)
|
|
JK3=JIK(IJ+1)
|
|
IF(IJLIN(JK2).NE.0 .OR. IJLIN(JK3).NE.0) GO TO 130
|
|
IF(WCH(JK2).NE.0.) GO TO 130
|
|
W(JK1)=W(JK1)-SIXTH*W(JK2)
|
|
W(JK3)=W(JK3)-SIXTH*W(JK2)
|
|
W(JK2)=W(JK2)*FTH
|
|
JK1=JK3
|
|
END DO
|
|
130 JK1=JIK(NFREQ)
|
|
DO IJ=NFREQ-1,3,-2
|
|
JK2=JIK(IJ)
|
|
JK3=JIK(IJ-1)
|
|
IF(IJLIN(JK2).NE.0 .OR. IJLIN(JK3).NE.0) GO TO 150
|
|
IF(WCH(JK2).NE.0.) GO TO 150
|
|
W(JK1)=W(JK1)-SIXTH*W(JK2)
|
|
W(JK3)=W(JK3)-SIXTH*W(JK2)
|
|
W(JK2)=W(JK2)*FTH
|
|
JK1=JK3
|
|
END DO
|
|
150 CONTINUE
|
|
C
|
|
DO IJ=1,NFREQ
|
|
W0E(IJ)=W(IJ)*PI4H/FREQ(IJ)
|
|
IF(IJALI(IJ).GT.0) WC(IJ)=W(IJ)
|
|
END DO
|
|
C
|
|
C check accuracy of weights for integration
|
|
C
|
|
190 Z0=0.
|
|
Z1=0.
|
|
Z2=0.
|
|
ZH=0.
|
|
T1=TEFF
|
|
T2=TWO*TEFF
|
|
T3=HALF*TEFF
|
|
X1=HK/T1
|
|
X2=HK/T2
|
|
X3=HK/T3
|
|
DO 200 IJ=1,NFREQ
|
|
Z0=Z0+W(IJ)
|
|
X15=FREQ(IJ)*1.D-15
|
|
BNZ=BN*X15*X15*X15
|
|
FX1=FREQ(IJ)*X1
|
|
IF(FX1.GT.100.) GO TO 200
|
|
Z1=Z1+W(IJ)*BNZ/(EXP(FREQ(IJ)*X1)-1)
|
|
Z2=Z2+W(IJ)*BNZ/(EXP(FREQ(IJ)*X2)-1)
|
|
ZH=ZH+W(IJ)*BNZ/(EXP(FREQ(IJ)*X3)-1)
|
|
200 CONTINUE
|
|
T1S=SQRT(SQRT(0.25*Z1/SIG4P))
|
|
T1ER=T1S/T1-UN
|
|
T2S=SQRT(SQRT(0.25*Z2/SIG4P))
|
|
T2ER=T2S/T2-UN
|
|
T3S=SQRT(SQRT(0.25*ZH/SIG4P))
|
|
T3ER=T3S/T3-UN
|
|
JK1=JIK(1)
|
|
JK2=JIK(NFREQ)
|
|
Z00=FREQ(JK1)-FREQ(JK2)
|
|
WRITE(6,701) FREQ(JK1),FREQ(JK2),Z00,Z0,T3,T3ER,T1,T1ER,T2,T2ER
|
|
701 FORMAT(/' ACCURACY OF INTEGRATIONS:',/,
|
|
* ' Interval:',1p4e16.8,/,
|
|
* 15x,' Planck functions:',9x,0pf12.0,4x,1pe12.4,/,
|
|
* 42x,0pf12.0,4x,1pe12.4,/,42x,0pf12.0,4x,1pe12.4,/)
|
|
IF(ISPODF.GT.0) NPPX=NFREQ
|
|
WRITE(6,702) NFREQ,NPPX
|
|
702 FORMAT(' TOTAL NUMBER OF FREQUENCIES:',I8,/,
|
|
* ' SELECTED FREQUENCIES: ',I8)
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE PRINC
|
|
C ================
|
|
C
|
|
C Auxiliary output routine, which enables printing
|
|
C more detailed information about chosen individual transitions
|
|
C
|
|
C Input: NCT - number of transitions for which information is
|
|
C printed
|
|
C ICTR(I) - index of the I-the considered transition
|
|
C INFR(I) - index of the characteristic frequency point for
|
|
C the I-th transition (i.e., standardly, the point just
|
|
C shortward of edge for continua; or the line center
|
|
C for lines)
|
|
C - if =0, then the program choses the characteristic
|
|
C frequency itself, in the standard manner
|
|
C
|
|
C The printed table contains for each transition the following functions
|
|
C of depth:
|
|
C
|
|
C depth index;
|
|
C optical depth at the characteristic frequency;
|
|
C partial radiation force (actually, acceleration) - g(rad) -
|
|
C produced by the transition
|
|
C b-factor of the lower level;
|
|
C b-factor of the upper level;
|
|
C upward radiative rate;
|
|
C downward radiative rate;
|
|
C mean intensity at the characteristic frequency;
|
|
C Planck function at the characteristic frequency;
|
|
C total source function at the characteristic frequency;
|
|
C net line (or continuum) source function at the characteristic frequency;
|
|
C net heating rate (i.e heating minus cooling rate);
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
PARAMETER (NPTR=30,CCOR=0.09,SIXTH=UN/6.)
|
|
DIMENSION ST(NPTR,MDEPTH),TAU(NPTR,MDEPTH),
|
|
* ABST(NPTR,MDEPTH),EMIT(NPTR,MDEPTH),SCTR(NPTR,MDEPTH),
|
|
* INFR(NPTR),ICTR(NPTR),ABM(NPTR),PRF(MFREQ),
|
|
* DWF(MFREQ)
|
|
C DIMENSION RADM(MFREQ),ABSM(MFREQ),FAK0(MFREQ),RAD0(MFREQ)
|
|
c
|
|
READ(44,*,END=200,ERR=200) NCT
|
|
READ(44,*,END=200,ERR=200) (ICTR(I),I=1,NCT)
|
|
READ(44,*,END=200,ERR=200) (INFR(I),I=1,NCT)
|
|
c
|
|
DO IC=1,NCT
|
|
ITR=ICTR(IC)
|
|
IFR=INFR(IC)
|
|
IF(LINE(ITR)) THEN
|
|
IF(IFR.EQ.0)
|
|
* INFR(IC)=(IFR0(ITR)+IFR1(ITR))/2
|
|
ELSE
|
|
IF(IFR.EQ.0) INFR(IC)=IFR1(ITR)
|
|
END IF
|
|
IFR=INFR(IC)
|
|
CALL OPACF1(IFR)
|
|
DO ID=1,ND
|
|
ABST(IC,ID)=ABSO1(ID)
|
|
EMIT(IC,ID)=EMIS1(ID)
|
|
SCTR(IC,ID)=SCAT1(ID)
|
|
END DO
|
|
END DO
|
|
C
|
|
DO ID=1,ND
|
|
T=TEMP(ID)
|
|
ANE=ELEC(ID)
|
|
SQT=SQRT(T)
|
|
ANES=EXP(SIXTH*LOG(ANE))
|
|
AACOR=CCOR*ANES/SQT
|
|
CALL SABOLF(ID)
|
|
DO I=1,NLEVEL
|
|
POP(I)=POPUL(I,ID)
|
|
END DO
|
|
DO IC=1,NCT
|
|
ITR=ICTR(IC)
|
|
IFR=INFR(IC)
|
|
I=ILOW(ITR)
|
|
J=IUP(ITR)
|
|
IF(LINE(ITR)) THEN
|
|
CALL LINPRO(ITR,ID,PRF)
|
|
GG=G(I)/G(J)
|
|
SG=PRF(IFR)
|
|
ELSE
|
|
GG=ANE*SBF(I)*EXP(-HK*FREQ(IFR)/T)
|
|
QZ=IZ(IEL(I))
|
|
MW=MCDW(ITR)
|
|
CALL DWNFR(MW,NFREQ,FR0(ITR),AACOR,ANE,QZ,FREQ,DWF)
|
|
SG=CROSS(ITRA(J,I),IFR)*DWF(IFR)
|
|
END IF
|
|
IJE=IJEX(IFR)
|
|
ESCT=SCTR(IC,ID)*RAD(IFR,ID)
|
|
ST(IC,ID)=(EMIT(IC,ID)+ESCT)/ABST(IC,ID)
|
|
IF(ID.EQ.1) THEN
|
|
TAU(IC,ID)=HALF *ABST(IC,ID)/DENS(ID)*DM(ID)
|
|
ELSE
|
|
TAU(IC,ID)=TAU(IC,ID-1)+(ABST(IC,ID)/DENS(ID)+ABM(IC))*
|
|
* (DM(ID)-DM(ID-1))*HALF
|
|
END IF
|
|
ABM(IC)=ABST(IC,ID)/DENS(ID)
|
|
END DO
|
|
END DO
|
|
C
|
|
DO IC=1,NCT
|
|
ITR=ICTR(IC)
|
|
I=ILOW(ITR)
|
|
J=IUP(ITR)
|
|
K=NNEXT(IEL(I))
|
|
IFR=INFR(IC)
|
|
IJE=IJEX(IFR)
|
|
FR=FREQ(IFR)
|
|
FR15=FR*1.D-15
|
|
BNU=BN*FR15*FR15*FR15
|
|
WRITE(16,600) ITR,IFR,FR,2.997925d18/fr
|
|
DO ID=1,ND
|
|
T=TEMP(ID)
|
|
TK=BOLK*T
|
|
SB=2.0706D-16/T/SQRT(T)*G(I)/G(K)*EXP(ENION(I)/TK)
|
|
IF(J.LT.K)
|
|
* SJ=2.0706D-16/T/SQRT(T)*G(J)/G(K)*EXP(ENION(J)/TK)
|
|
PI=POPUL(I,ID)
|
|
X=EXP(-HK*FR/T)
|
|
PLTE=SB*ELEC(ID)*POPUL(K,ID)
|
|
BI=PI/PLTE
|
|
BJ=1.
|
|
IF(J.LT.K) BJ=POPUL(J,ID)/SJ/ELEC(ID)/POPUL(K,ID)
|
|
PLANCK=BNU/(UN/X-UN)
|
|
IF(LINE(ITR)) THEN
|
|
RD=RRD(ITR,ID)*G(I)/G(J)
|
|
GG=G(I)/G(J)*POPUL(J,ID)
|
|
ELSE
|
|
GG=PLTE*X
|
|
RD=RRD(ITR,ID)
|
|
END IF
|
|
SL=BNU*GG/(PI-GG)
|
|
ggrad=0.
|
|
heat=0.
|
|
WRITE(16,601) ID,TAU(IC,ID),GGRAD,
|
|
* BI,BJ,RRU(ITR,ID),RD,
|
|
* RAD(IFR,ID),PLANCK,ST(IC,ID),SL,
|
|
* HEAT
|
|
END DO
|
|
END DO
|
|
C
|
|
600 FORMAT(/
|
|
* ' PARAMETERS FOR TRANSITION',I5,' IFR =' ,I5,
|
|
* ' FREQ =',1PD15.5,' Wavelength =',0pf11.3/
|
|
* 1H ,8X,'TAU',6X,'GR ',6X,'B-I',6X,'B-J',6X,' RU',
|
|
* 6X,' RD',6X,'RAD',5X,'PLANCK',5X,'STOT',6X,'SL',
|
|
* 5X,'HEAT'/)
|
|
601 FORMAT(1H ,I3,1P13D9.2)
|
|
200 RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE LUCY
|
|
C ===============
|
|
C
|
|
C NLTE Lucy-Unsold temperature correction scheme, following
|
|
C Werner & Dreizler
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
DIMENSION HEAT(MDEPTH),ABSZ(MDEPTH),ABSP(MDEPTH),ABSH(MDEPTH),
|
|
* TOTJ(MDEPTH),TOTH(MDEPTH),TOTB(MDEPTH),DELH(MDEPTH),
|
|
* EDDF(MDEPTH),DELTAT(MDEPTH),dt1(mdepth),dt2(mdepth),
|
|
* ANTC(MDEPTH),XE(MDEPTH),heab(mdepth),tau(mdepth),
|
|
* TEM0(MDEPTH),TEM1(MDEPTH),TEM2(MDEPTH),TEM3(MDEPTH)
|
|
DIMENSION COL(MTRANS),CLOC(MTRANS)
|
|
PARAMETER (THIRD=1./3.)
|
|
DATA ILINIT /0/
|
|
C
|
|
c
|
|
IF(ILINIT.EQ.0) THEN
|
|
ILINIT=1
|
|
do itr=1,ntrans
|
|
iluctr(itr)=0
|
|
end do
|
|
ntrl=0
|
|
read(2,*,end=5,err=5) ntrl
|
|
5 continue
|
|
if(ntrl.gt.0) then
|
|
do i=1,ntrl
|
|
read(2,*,end=6,err=6) itrl
|
|
iluctr(itrl)=1
|
|
end do
|
|
end if
|
|
6 continue
|
|
end if
|
|
c
|
|
c IF(MOD(ILAM,4).NE.3) RETURN
|
|
if(itlucy.le.0) return
|
|
LAC2T=.FALSE.
|
|
iacc0t=IACLT-3
|
|
C
|
|
ilucy=1
|
|
10 continue
|
|
CALL OPAINI(0)
|
|
C
|
|
DO ID=1,ND
|
|
HEAT(ID)=0.
|
|
heab(id)=0.
|
|
ABSZ(ID)=0.
|
|
ABSP(ID)=0.
|
|
ABSH(ID)=0.
|
|
TOTJ(ID)=0.
|
|
TOTH(ID)=0.
|
|
TOTB(ID)=0.
|
|
EDDF(ID)=0.
|
|
END DO
|
|
EDDH=0.
|
|
C
|
|
DO IJ=1,NFREQ
|
|
W0=W(IJ)
|
|
FR=FREQ(IJ)
|
|
FR15=FR*1.D-15
|
|
BNU=BN*FR15*FR15*FR15
|
|
CALL OPACFL(IJ)
|
|
CALL RTEFR1(IJ)
|
|
tau(1)=abso1(1)/dens(1)*dm(1)
|
|
DO ID=1,ND
|
|
if(id.ge.2) tau(id)=tau(id-1)+half*(abso1(id)/dens(id)+
|
|
* abso1(id-1)/dens(id-1))*(dm(id)-dm(id-1))
|
|
PLAND=BNU/(EXP(HK*FR/TEMP(ID))-UN)
|
|
ABSOT0=ABSO1L(ID)-SCAT1(ID)
|
|
HEAT(ID)=HEAT(ID)+W0*(ABSOT0*RAD1(ID)-EMIS1L(ID))
|
|
HEAB(ID)=HEAB(ID)+W0*(ABSOT0*RAD1(ID)-EMIS1L(ID))/
|
|
* (ABSOT0*PLAND)
|
|
ABSP(ID)=ABSP(ID)+W0*ABSOT0*PLAND
|
|
TOTJ(ID)=TOTJ(ID)+W0*RAD1(ID)
|
|
TOTB(ID)=TOTB(ID)+W0*PLAND
|
|
EDDF(ID)=EDDF(ID)+W0*FAK1(ID)*RAD1(ID)
|
|
END DO
|
|
C
|
|
ID=1
|
|
EDDH=EDDH+W0*RAD1(ID)*FH(IJ)
|
|
TOTH(ID)=TOTH(ID)+W0*(RAD1(ID)*FH(IJ)-HEXTRD(IJ))
|
|
ABSOT0=ABSO1(ID)
|
|
ABSH(ID)=ABSH(ID)+W0*ABSOT0*(RAD1(ID)*FH(IJ)-HEXTRD(IJ))
|
|
DO ID=2,ND
|
|
ABSOT0=HALF*(ABSO1(ID)+ABSO1(ID-1))
|
|
DTM=DELDM(ID-1)*(ABSO1(ID)*DENS1(ID)+ABSO1(ID-1)*DENS1(ID-1))
|
|
FLUZ=(RAD1(ID)*FAK1(ID)-RAD1(ID-1)*FAK1(ID-1))/DTM
|
|
TOTH(ID)=TOTH(ID)+W0*FLUZ
|
|
ABSH(ID)=ABSH(ID)+W0*ABSOT0*FLUZ
|
|
END DO
|
|
END DO
|
|
C
|
|
EDDH=EDDH/TOTJ(1)
|
|
TEF4=SIG4P*TEFF**4
|
|
TOTH(ND)=TEF4
|
|
HEAT(ND)=0.
|
|
HEAT(ND-1)=0.
|
|
DO ID=1,ND
|
|
ABSZ(ID)=(HEAT(ID)+ABSP(ID))/TOTJ(ID)
|
|
ABSP(ID)=ABSP(ID)/TOTB(ID)
|
|
ABSH(ID)=ABSH(ID)/TOTH(ID)
|
|
EDDF(ID)=EDDF(ID)/TOTJ(ID)
|
|
DELH(ID)=-TOTH(ID)+TEF4
|
|
END DO
|
|
DHHMX1=0.
|
|
DO ID=1,ND-1
|
|
DHH=ABS(DELH(ID)/TOTH(ID))
|
|
IF(DHH.GT.DHHMX1) DHHMX1=DHH
|
|
END DO
|
|
C
|
|
ID=1
|
|
TP3=TEMP1(ID)*TEMP1(ID)*TEMP1(ID)
|
|
XX=EDDF(ID)/EDDH*DELH(ID)
|
|
XX1=XX
|
|
DT1(id)=HEAT(ID)/16./SIG4P*TP3/ABSP(ID)
|
|
DT2(id)=ABSZ(ID)/EDDF(ID)*XX/16./SIG4P*TP3/ABSP(ID)
|
|
DELTAT(ID)=dt1(id)+dt2(id)
|
|
DO ID=2,ND
|
|
TP3=TEMP1(ID)*TEMP1(ID)*TEMP1(ID)
|
|
XX=XX+DELDM(ID)*(ABSH(ID)*DENS1(ID)*DELH(ID)+
|
|
* ABSH(ID+1)*DENS1(ID+1)*DELH(ID+1))
|
|
DT1(id)=HEAT(ID)/16./SIG4P*TP3/ABSP(ID)
|
|
DT2(id)=ABSZ(ID)/EDDF(ID)*XX/16./SIG4P*TP3/ABSP(ID)
|
|
DELTAT(ID)=dt1(id)+dt2(id)
|
|
END DO
|
|
C
|
|
C New temperature
|
|
C
|
|
DO ID=1,ND
|
|
TEMP(ID)=TEMP(ID)+DELTAT(ID)
|
|
tem0(id)=temp(id)
|
|
AOLD=DENS(ID)/WMM(ID)+ELEC(ID)
|
|
XE(ID)=UN-ELEC(ID)/AOLD
|
|
END DO
|
|
c
|
|
c acceleration
|
|
c
|
|
if(itlucy.lt.IACLT .or. ilucy.lt.iacc0t) go to 20
|
|
ipng=1
|
|
if(IACLDT.gt.0) ipng=mod((ilucy-IACLT),IACLDT)
|
|
if(.not.lac2t) then
|
|
IPT=MOD(ILUCY,3)
|
|
IPT0=MOD(IACLT,3)
|
|
IPT1=MOD((IACLT+1),3)
|
|
IPT2=MOD((IACLT+2),3)
|
|
IF(ILUCY.EQ.IACC0T) THEN
|
|
DO ID=1,ND
|
|
TEM3(ID)=TEM0(ID)
|
|
END DO
|
|
ELSE IF(IPT.EQ.IPT1) THEN
|
|
DO ID=1,ND
|
|
TEM2(ID)=TEM0(ID)
|
|
END DO
|
|
ELSE IF(IPT.EQ.IPT2) THEN
|
|
DO ID=1,ND
|
|
TEM1(ID)=TEM0(ID)
|
|
END DO
|
|
ENDIF
|
|
else if (ipng.ne.0) then
|
|
DO ID=1,ND
|
|
TEM3(ID)=TEM2(ID)
|
|
END DO
|
|
DO ID=1,ND
|
|
TEM2(ID)=TEM1(ID)
|
|
END DO
|
|
DO ID=1,ND
|
|
TEM1(ID)=TEM0(ID)
|
|
END DO
|
|
GO TO 20
|
|
end if
|
|
|
|
IF(ILUCY.LT.IACLT) go to 20
|
|
C
|
|
A1=0.
|
|
B1=0.
|
|
B2=0.
|
|
C1=0.
|
|
C2=0.
|
|
DO ID=1,ND
|
|
WT=0.
|
|
IF(TEM0(ID).NE.0.) WT=1./ABS(TEM0(ID))
|
|
D0=TEM0(ID)-TEM1(ID)
|
|
D1=D0-TEM1(ID)+TEM2(ID)
|
|
D2=D0-TEM2(ID)+TEM3(ID)
|
|
A1=A1+WT*D1*D1
|
|
B1=B1+WT*D1*D2
|
|
B2=B2+WT*D2*D2
|
|
C1=C1+WT*D0*D1
|
|
C2=C2+WT*D0*D2
|
|
END DO
|
|
AB=B2*A1-B1*B1
|
|
IF(AB.EQ.0.) THEN
|
|
WRITE(6,601) ILUCY,AB
|
|
IACLT=IACLT+IACLDT
|
|
IACC0T=IACLT-3
|
|
GO TO 20
|
|
ENDIF
|
|
A0=(B2*C1-B1*C2)/AB
|
|
B0=(A1*C2-B1*C1)/AB
|
|
DO ID=1,ND
|
|
TEM0(ID)=(1.-A0-B0)*TEM0(ID)+A0*TEM1(ID)+
|
|
* B0*TEM2(ID)
|
|
TEMP(ID)=TEM0(ID)
|
|
END DO
|
|
LAC2T=.TRUE.
|
|
601 FORMAT(/,' **** ACCELT, ITER=',I4,' AB = ',F7.3,/)
|
|
20 CONTINUE
|
|
|
|
CALL TDPINI
|
|
C
|
|
C Integrate hydrostatic equilibrium
|
|
C
|
|
IF(IHECOR.GE.1) THEN
|
|
ID=1
|
|
PTUR=HALF*VTURB(ID)*VTURB(ID)*DENS(ID)
|
|
ANTC(ID)=(DM(ID)*GRAV-PRD0-PTUR)/BOLK/TEMP(ID)
|
|
IF(ANTC(ID).LE.0) ANTC(ID)=DENS(ID)/WMM(ID)+ELEC(ID)
|
|
DO ID=2,ND
|
|
PTUR=HALF*VTURB(ID)*VTURB(ID)*DENS(ID)
|
|
PTURM=HALF*VTURB(ID-1)*VTURB(ID-1)*DENS(ID-1)
|
|
ANTC(ID)=(GRAV*(DM(ID)-DM(ID-1))+
|
|
* BOLK*TEMP(ID-1)*ANTC(ID-1)-
|
|
* PRADT(ID)+PRADT(ID-1)-PTUR+PTURM)/
|
|
* BOLK/TEMP(ID)
|
|
END DO
|
|
DO ID=1,ND
|
|
ELEC(ID)=(UN-XE(ID))*ANTC(ID)
|
|
DENS(ID)=WMM(ID)*(ANTC(ID)-ELEC(ID))
|
|
dens1(id)=un/dens(id)
|
|
END DO
|
|
END IF
|
|
C
|
|
C Other depth-dependent quantities
|
|
C
|
|
DO ID=1,ND
|
|
PGS(ID)=(DENS(ID)/WMM(ID)+ELEC(ID))*BOLK*TEMP(ID)
|
|
CALL WNSTOR(ID)
|
|
IF(LTE) GO TO 60
|
|
CALL SABOLF(ID)
|
|
CALL COLIS(ID,TEMP(ID),COL,CLOC)
|
|
DO I=1,NTRANS
|
|
COLRAT(I,ID)=COL(I)
|
|
COLTAR(I,ID)=CLOC(I)
|
|
END DO
|
|
60 CONTINUE
|
|
END DO
|
|
C
|
|
C new populations
|
|
C
|
|
DO ID=1,ND
|
|
CALL STEQEQ(ID,POP,1)
|
|
IF(.NOT.LCHC.and.iter.lt.ielcor) CALL ELCOR(ID)
|
|
END DO
|
|
C
|
|
CALL CONCOR
|
|
CALL ODFMER
|
|
ilucy=ilucy+1
|
|
if(ilucy.le.itlucy) go to 10
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
C
|
|
SUBROUTINE IROSET
|
|
C =================
|
|
C
|
|
C Initialization of opacity sampling for iron-peak lines
|
|
C
|
|
C IOBS = 2 : ALL lines except lines to autoionized levels
|
|
C IOBS = 1 : ALL lines
|
|
C IOBS = 0 : only lines between observed levels
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
REAL*4 VDOP,AGAM,SIG0,SIGT
|
|
PARAMETER (CSIG=0.0149736)
|
|
COMMON/LINED/WAVE(MLINE),VDOP(MLINE,MDODF),
|
|
& AGAM(MLINE,MDODF),SIG0(MLINE,MDODF),
|
|
& JTR(MLINE,2)
|
|
DIMENSION SIGT(MDODF,MFREQ),DML(MDEPTH)
|
|
C
|
|
JIDR(1)=1
|
|
IF(JIDS.EQ.0) THEN
|
|
JIDR(2)=INT(0.7*ND)
|
|
JIDR(3)=ND
|
|
JIDN=3
|
|
JIDC=2
|
|
ELSE
|
|
I=1
|
|
DO WHILE(JIDR(I).LT.ND)
|
|
I=I+1
|
|
JIDR(I)=JIDR(I-1)+JIDS
|
|
IF(JIDR(I).LE.INT(0.7*ND)) JIDC=JIDR(I)
|
|
END DO
|
|
JIDN=I
|
|
IF(JIDR(I).GT.ND) THEN
|
|
IF(JIDR(I-1).GE.ND-5) JIDN=JIDN-1
|
|
JIDR(JIDN)=ND
|
|
END IF
|
|
IF(JIDN.GT.MDODF)
|
|
& CALL QUIT(' Too many depths for Fe x-sections',JIDN,MDODF)
|
|
END IF
|
|
c
|
|
DO ID=1,ND
|
|
DML(ID)=LOG(DM(ID))
|
|
END DO
|
|
DO I=1,JIDN-1
|
|
DXI=DML(JIDR(I+1))-DML(JIDR(I))
|
|
DO ID=JIDR(I)+1,JIDR(I+1)
|
|
JIDI(ID)=I
|
|
XJID(ID)=(DML(JIDR(I+1))-DML(ID))/DXI
|
|
END DO
|
|
END DO
|
|
JIDI(1)=1
|
|
XJID(1)=1.
|
|
|
|
XFRMA=DLOG(FRS1)
|
|
IJD=INT(9./DDNU)
|
|
IF(IJD.LT.2) IJD=2
|
|
NFTT=0
|
|
NFTMX=0
|
|
C
|
|
DO 500 ION=1,NION
|
|
IND=INODF1(ION)
|
|
IF(IND.LE.0) GO TO 500
|
|
IF(NLLIM(ION).GE.NLEVS(ION)) THEN
|
|
DO ID=1,ND
|
|
DO I=NFIRST(ION),NLAST(ION)
|
|
WOP(I,ID)=UN
|
|
END DO
|
|
END DO
|
|
GO TO 500
|
|
END IF
|
|
C
|
|
C Set up superlevels and read line data
|
|
C
|
|
IOBS=IKOBS(ION)
|
|
CALL LEVCD(ION,IOBS)
|
|
CALL INKUL(ION,IOBS)
|
|
c
|
|
write(6,610) ion,typion(ion),nlinku
|
|
610 format(/' *** superlines for ',i4,': ',a4,
|
|
* ' selected internal lines:',i10)
|
|
if(nlinku.gt.mline)
|
|
* call quit('too many internal lines',nlinku,mline)
|
|
C
|
|
C Assign line to supertransition and compute cross-section
|
|
C
|
|
N1=NFIRST(ION)
|
|
NLII=NLAST(ION)-N1+1
|
|
DO IL=1,NLII-1
|
|
KEVL=0
|
|
KODL=0
|
|
IF(JEN(IL).LE.NEVKU(ION)) THEN
|
|
KEVL=JEN(IL)
|
|
ELSE
|
|
KODL=JEN(IL)-NEVKU(ION)
|
|
END IF
|
|
ILOK=N1+IL-1
|
|
DO IU=IL+1,NLII
|
|
IUPK=N1+IU-1
|
|
ITR=ITRA(ILOK,IUPK)
|
|
INDXPA=ABS(INDEXP(ITR))
|
|
W1=0.
|
|
W2=0.
|
|
IFRKU=0
|
|
NFT=0
|
|
NLT=0
|
|
KEVU=0
|
|
KODU=0
|
|
IF(JEN(IU).LE.NEVKU(ION)) THEN
|
|
KEVU=JEN(IU)
|
|
ELSE
|
|
KODU=JEN(IU)-NEVKU(ION)
|
|
END IF
|
|
IF(KEVL.NE.0) THEN
|
|
KEV=KEVL
|
|
KOD=KODU
|
|
IEO=0
|
|
GSUPER=YMKU(JEN(IL),1)
|
|
ELSE
|
|
KEV=KEVU
|
|
KOD=KODL
|
|
IEO=1
|
|
GSUPER=YMKU(JEN(IL)-NEVKU(ION),2)
|
|
END IF
|
|
DO IJ=1,MFREQ
|
|
DO I=1,MDODF
|
|
SIGT(I,IJ)=0.
|
|
END DO
|
|
END DO
|
|
FCOL=0.
|
|
DO 10 K=1,NLINKU
|
|
IF(KSEV(JTR(K,1)).NE.KEV) GO TO 10
|
|
IF(KSOD(JTR(K,2)).NE.KOD) GO TO 10
|
|
NLT=NLT+1
|
|
FRL=CAS/WAVE(K)
|
|
IJL=NINT((XFRMA-DLOG(FRL))/DXNU)+NFRS1
|
|
D0=ABS((FREQ(IJL)-FRL)/(FREQ(IJL)-FREQ(IJL+1)))
|
|
IF(D0.GT.HALF) THEN
|
|
DO WHILE(FRL.GT.FREQ(IJL))
|
|
IJL=IJL-1
|
|
END DO
|
|
DO WHILE(FRL.LT.FREQ(IJL))
|
|
IJL=IJL+1
|
|
END DO
|
|
D1=FRL-FREQ(IJL)
|
|
D2=FREQ(IJL-1)-FRL
|
|
IF(D2.LT.D1) IJL=IJL-1
|
|
END IF
|
|
IJ0=IJL-IJD
|
|
IJ1=IJL+IJD
|
|
IF(IJ0.LT.1) IJ0=1
|
|
IF(IJ1.GT.NFREQ) IJ1=NFREQ
|
|
IF(IFRKU.EQ.0) IFRKU=IJ0
|
|
NFT=IJ1-IFRKU+1
|
|
DO IJ=IJ0,IJ1
|
|
DNU=FREQ(IJ)-FRL
|
|
DO I=1,JIDN
|
|
VV=DNU*dble(VDOP(K,I))
|
|
PRFK=VOIGTE(real(VV),AGAM(K,I))/GSUPER
|
|
SIGT(I,IJ)=SIGT(I,IJ)+SIG0(K,I)*real(PRFK)
|
|
END DO
|
|
END DO
|
|
FCOL=FCOL+SIG0(K,JIDC)/VDOP(K,JIDC)
|
|
10 CONTINUE
|
|
OSC0(ITR)=0.
|
|
IF(INDXPA.EQ.3 .OR. INDXPA.EQ.4) OSC0(ITR)=STRLX
|
|
IF(FCOL.GT.0.) OSC0(ITR)=FCOL/GSUPER/CSIG
|
|
IF(NLT.GT.0) THEN
|
|
W1=CAS/FREQ(IFRKU)
|
|
W2=CAS/FREQ(IFRKU+NFT-1)
|
|
END IF
|
|
IF(NFT.GT.0) THEN
|
|
IFR0(ITR)=IFRKU
|
|
IFR1(ITR)=IFRKU+NFT-1
|
|
KFR0(ITR)=NFTT+1
|
|
KFR1(ITR)=NFTT+NFT
|
|
NFTT=NFTT+NFT
|
|
itrl=itr
|
|
DO IJ=IFR0(ITR),IFR1(ITR)
|
|
KJ=IJ-IFR0(ITR)+KFR0(ITR)
|
|
DO I=1,JIDN
|
|
sxx=log(dble(sigt(i,ij))+1.d-40)
|
|
SIGFE(I,KJ)=real(sxx)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
IF(KJ.GT.MCFE)
|
|
& CALL QUIT(' Too many Fe cross-sect. to store',
|
|
& KJ,MCFE)
|
|
WRITE(41,313) IL,IU,W1,W2,IFRKU,NFT,NLT,OSC0(ITR)
|
|
IF(NFT.GT.NFTMX) NFTMX=NFT
|
|
END DO
|
|
END DO
|
|
500 CONTINUE
|
|
WRITE(10,*) ' Max. number of freq. per transition:',NFTMX
|
|
WRITE(10,*) ' Number of iron line cross-sections: ',NFTT
|
|
313 FORMAT(2I4,2F12.3,3I10,1PE12.3)
|
|
C
|
|
CALL IJALI2
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ***************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE LEVCD(ION,IOBS)
|
|
C ==========================
|
|
C
|
|
C Mean energy and statistical weights of superlevels.
|
|
C Read atomic data from Kurucz CD-ROM file (gf*.gam)
|
|
C
|
|
C Setup collisional strengths between superlevels, using
|
|
C Eissner-Seaton formula for each possible individual
|
|
C transition. Assumes Gamma(T)=0.05, and T=Teff
|
|
C Contributions from allowed transitions will be superseded
|
|
C in routine INKUL.
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
C
|
|
PARAMETER (BOLCM=1.D8/HK/CAS,CCOR=0.09,SIXTH=UN/6.,GES=0.05)
|
|
DIMENSION GWE(MDEPTH,MLEVEL,2),GWB(MDEPTH,MLEVEL,2),AA(MDEPTH)
|
|
DIMENSION E0FE(10),E0NI(10),E0CR(10)
|
|
COMMON/COLKUR/OMES(100,100),EKU(15000),GKU(15000),GST,
|
|
& KKU(15000)
|
|
|
|
DATA E0FE/63480.,130563.,247220.,442000.,605000.,799000.,
|
|
& 1008000.,1218380.,1884000.,2114000./
|
|
DATA E0NI/61590.,146560.,283700.,443000.,613500.,871000.,
|
|
& 1070000.,1310000.,1560000.,1812000./
|
|
DATA E0CR/54576.,132966.,249700.,396500.,560200.,731020.,
|
|
& 1291900.,1490000.,1688000.,1971000./
|
|
C
|
|
C Initialization
|
|
C
|
|
IF(IOBS.NE.1 .AND. IOBS.NE.2) IOBS=0
|
|
DO I=1,NEVKU(ION)
|
|
YMKU(I,1)=0.
|
|
EMKU(I,1)=0.
|
|
DO ID=1,ND
|
|
GWE(ID,I,1)=0.
|
|
GWB(ID,I,1)=0.
|
|
END DO
|
|
END DO
|
|
DO I=1,NODKU(ION)
|
|
YMKU(I,2)=0.
|
|
EMKU(I,2)=0.
|
|
DO ID=1,ND
|
|
GWE(ID,I,2)=0.
|
|
GWB(ID,I,2)=0.
|
|
END DO
|
|
END DO
|
|
NEVOD=NEVKU(ION)+NODKU(ION)
|
|
IF(NEVOD.GT.100)
|
|
& CALL QUIT(' Too many superlevels in a single Fe ion',
|
|
& NEVKU(ION),NODKU(ION))
|
|
DO I=1,NEVOD
|
|
DO J=1,NEVOD
|
|
OMES(I,J)=0.
|
|
END DO
|
|
END DO
|
|
IWSUP=IFWOP(NFIRST(ION))
|
|
IF(IWSUP.GE.2) THEN
|
|
DO ID=1,ND
|
|
TEMP1(ID)=UN/TEMP(ID)
|
|
AA(ID)=CCOR*EXP(SIXTH*LOG(ELEC(ID)))/SQRT(TEMP(ID))
|
|
END DO
|
|
ZZ=IZ(ION)
|
|
IF(IZ(ION).GT.10)
|
|
* CALL QUIT(' Too high Fe, Ni or Cr ion: ion,iz',ion,iz(ion))
|
|
IAT=IATM(NFIRST(ION))
|
|
E0=E0FE(IZ(ION))
|
|
IF(NUMAT(IAT).EQ.28) E0=E0NI(IZ(ION))
|
|
IF(NUMAT(IAT).EQ.24) E0=E0CR(IZ(ION))
|
|
END IF
|
|
C
|
|
C CD-ROM format: Read energy levels
|
|
C
|
|
IUN1=31
|
|
OPEN(IUN1,FILE=FIODF1(ION),STATUS='OLD')
|
|
READ(IUN1,170) NLINKU,KEVE,KODD
|
|
IF(KEVE+KODD.GT.15000)
|
|
& CALL QUIT(' Too many levels in Kurucz file',keve,kodd)
|
|
C
|
|
C Even parity
|
|
C
|
|
DO K=1,KEVE
|
|
KSL=0
|
|
READ(IUN1,171) YJ,E,AR,SR,WR
|
|
GEV=(TWO*YJ+UN)
|
|
IF(E.LT.0.) THEN
|
|
E=-E
|
|
IF(IOBS.EQ.0) GO TO 10
|
|
END IF
|
|
IF(E.LE.XEV(1,ION)) KSL=1
|
|
DO I=2,NEVKU(ION)
|
|
IF(E.LE.XEV(I,ION) .AND. E.GT.XEV(I-1,ION)) KSL=I
|
|
END DO
|
|
IF(KSL.EQ.0) WRITE(10,*) ' Error with even levels',E,YJ
|
|
KKU(K)=KSL
|
|
GKU(K)=GEV
|
|
EKU(K)=E
|
|
YMKU(KSL,1)=YMKU(KSL,1)+GEV
|
|
EMKU(KSL,1)=EMKU(KSL,1)+GEV*E
|
|
IF(IWSUP.EQ.2) THEN
|
|
EBCM=E/BOLCM
|
|
DO ID=1,ND
|
|
GWX=GEV*EXP(-EBCM*TEMP1(ID))
|
|
GWB(ID,KSL,1)=GWB(ID,KSL,1)+GWX
|
|
GWE(ID,KSL,1)=GWE(ID,KSL,1)+GWX*E
|
|
END DO
|
|
ELSE IF(IWSUP.EQ.3) THEN
|
|
EBCM=E/BOLCM
|
|
IF(E.LT.E0) THEN
|
|
XN=SQRT(E0/(E0-E))
|
|
DO ID=1,ND
|
|
WID=WN(XN,AA(ID),ELEC(ID),ZZ)
|
|
GWX=GEV*WID*EXP(-EBCM*TEMP1(ID))
|
|
GWB(ID,KSL,1)=GWB(ID,KSL,1)+GWX
|
|
GWE(ID,KSL,1)=GWE(ID,KSL,1)+GWX*E
|
|
END DO
|
|
ELSE
|
|
DO ID=1,ND
|
|
WID=UN
|
|
GWX=GEV*WID*EXP(-EBCM*TEMP1(ID))
|
|
GWB(ID,KSL,1)=GWB(ID,KSL,1)+GWX
|
|
GWE(ID,KSL,1)=GWE(ID,KSL,1)+GWX*E
|
|
END DO
|
|
END IF
|
|
END IF
|
|
10 EEV(K)=E
|
|
AEV(K)=AR
|
|
SEV(K)=SR
|
|
WEV(K)=WR
|
|
KSEV(K)=KSL
|
|
END DO
|
|
DO I=1,NEVKU(ION)
|
|
IF(YMKU(I,1).EQ.0.)
|
|
* call quit(' No levels in even superlevel',i,i)
|
|
EMKU(I,1)=EMKU(I,1)/YMKU(I,1)
|
|
END DO
|
|
C
|
|
C Odd parity
|
|
C
|
|
DO K=1,KODD
|
|
KSL=0
|
|
READ(IUN1,171) YJ,E,AR,SR,WR
|
|
GOD=(TWO*YJ+UN)
|
|
IF(E.LT.0.) THEN
|
|
E=-E
|
|
IF(IOBS.EQ.0) GO TO 20
|
|
END IF
|
|
IF(E.LE.XOD(1,ION)) KSL=1
|
|
DO I=2,NODKU(ION)
|
|
IF(E.LE.XOD(I,ION) .AND. E.GT.XOD(I-1,ION)) KSL=I
|
|
END DO
|
|
IF(KSL.EQ.0) WRITE(10,*) ' Error with odd levels',E,YJ
|
|
KKU(K+KEVE)=KSL+NEVKU(ION)
|
|
GKU(K+KEVE)=GOD
|
|
EKU(K+KEVE)=E
|
|
YMKU(KSL,2)=YMKU(KSL,2)+GOD
|
|
EMKU(KSL,2)=EMKU(KSL,2)+GOD*E
|
|
IF(IWSUP.EQ.2) THEN
|
|
EBCM=E/BOLCM
|
|
DO ID=1,ND
|
|
GWX=GOD*EXP(-EBCM*TEMP1(ID))
|
|
GWB(ID,KSL,2)=GWB(ID,KSL,2)+GWX
|
|
GWE(ID,KSL,2)=GWE(ID,KSL,2)+GWX*E
|
|
END DO
|
|
ELSE IF(IWSUP.EQ.3) THEN
|
|
EBCM=E/BOLCM
|
|
IF(E.LT.E0) THEN
|
|
XN=SQRT(E0/(E0-E))
|
|
DO ID=1,ND
|
|
WID=WN(XN,AA(ID),ELEC(ID),ZZ)
|
|
GWX=GOD*WID*EXP(-EBCM*TEMP1(ID))
|
|
GWB(ID,KSL,2)=GWB(ID,KSL,2)+GWX
|
|
GWE(ID,KSL,2)=GWE(ID,KSL,2)+GWX*E
|
|
END DO
|
|
ELSE
|
|
DO ID=1,ND
|
|
WID=UN
|
|
GWX=GOD*WID*EXP(-EBCM*TEMP1(ID))
|
|
GWB(ID,KSL,2)=GWB(ID,KSL,2)+GWX
|
|
GWE(ID,KSL,2)=GWE(ID,KSL,2)+GWX*E
|
|
END DO
|
|
END IF
|
|
END IF
|
|
20 EOD(K)=E
|
|
AOD(K)=AR
|
|
SOD(K)=SR
|
|
WOD(K)=WR
|
|
KSOD(K)=KSL
|
|
END DO
|
|
DO I=1,NODKU(ION)
|
|
IF(YMKU(I,2).EQ.0.)
|
|
* call quit(' No levels in odd superlevel',I,I)
|
|
EMKU(I,2)=EMKU(I,2)/YMKU(I,2)
|
|
END DO
|
|
CLOSE(IUN1)
|
|
C
|
|
C Collisional strengths of transitions between super-levels
|
|
C Eissner-Seaton formula (Gamma=0.05)
|
|
C
|
|
GST=8.63E-6*GES/SQRT(TEFF)
|
|
TK0=UN/BOLCM/TEFF
|
|
DO I=1,KEVE+KODD-1
|
|
KI=KKU(I)
|
|
DO J=I+1,KEVE+KODD
|
|
KJ=KKU(J)
|
|
U0=ABS(EKU(I)-EKU(J))*TK0
|
|
OMES(KI,KJ)=OMES(KI,KJ)+GST*EXP(-U0)
|
|
OMES(KJ,KI)=OMES(KI,KJ)
|
|
END DO
|
|
END DO
|
|
C
|
|
C Sort superlevel energies
|
|
C
|
|
NLEVKU=NEVKU(ION)+NODKU(ION)
|
|
DO I=1,NEVKU(ION)
|
|
EU(I)=EMKU(I,1)
|
|
END DO
|
|
DO I=1,NODKU(ION)
|
|
EU(I+NEVKU(ION))=EMKU(I,2)
|
|
END DO
|
|
CALL INDEXX(NLEVKU,EU,JEN)
|
|
C
|
|
C Superlevel generalized occupation probabilities
|
|
C
|
|
IF(IWSUP.GE.2) THEN
|
|
DO I=1,NLEVKU
|
|
II=NFIRST(ION)+I-1
|
|
JJ=JEN(I)
|
|
JK=1
|
|
IF(JJ.GT.NEVKU(ION)) THEN
|
|
JJ=JEN(I)-NEVKU(ION)
|
|
JK=2
|
|
END IF
|
|
DO ID=1,ND
|
|
ESUP=GWE(ID,JJ,JK)/GWB(ID,JJ,JK)
|
|
WSUP=EXP(ESUP/BOLCM*TEMP1(ID))/YMKU(JJ,JK)
|
|
WOP(II,ID)=WSUP*GWB(ID,JJ,JK)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
C
|
|
170 FORMAT(I7,13X,I6,12X,I6)
|
|
171 FORMAT(8X,F4.1,4X,F13.3,18X,3E9.2)
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ***************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE INKUL(ION,IOBS)
|
|
C ==========================
|
|
C
|
|
C Read line list from Kurucz CD-ROM files (gf*.lin)
|
|
C
|
|
C INPUT: Unit 18
|
|
C WMIN : Min. wavelength (lines at smaller wave are NOT selected)
|
|
C WMAX : Max. wavelength (lines at larger wave are NOT selected)
|
|
C IOBS : Type of selected lines
|
|
C
|
|
C OUTPUT: fill up common/lined/
|
|
C *******
|
|
C - WAVE : wavelength in ANGSTROMS
|
|
C - SIG0 : 0.02654/sqrt(pi)*gf/VDOP (divided by g(super) later)
|
|
C - VDOP : Doppler width
|
|
C - AGAM : Damping parameter
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
REAL*4 VDOP,AGAM,SIG0
|
|
C
|
|
PARAMETER (TEN=10.,TENLG=2.302585093,GES=0.05)
|
|
PARAMETER (BOL2=2.76108D-16,BOLCM=1.D8/HK/CAS)
|
|
PARAMETER (CSTK=3.54,PSTK=2./3.,TSTK=UN/6.)
|
|
PARAMETER (CVDW=3.74,PVDW=0.4,TVDW=0.3)
|
|
PARAMETER (PI4V=0.25/3.141592654,CSIG=0.0149736)
|
|
PARAMETER (EXPIA1=-0.57721566,EXPIA2=0.99999193,
|
|
* EXPIA3=-0.24991055,EXPIA4=0.05519968,
|
|
* EXPIA5=-0.00976004,EXPIA6=0.00107857,
|
|
* EXPIB1=0.2677734343,EXPIB2=8.6347608925,
|
|
* EXPIB3=18.059016973,EXPIB4=8.5733287401,
|
|
* EXPIC1=3.9584969228,EXPIC2=21.0996530827,
|
|
* EXPIC3=25.6329561486,EXPIC4=9.5733223454)
|
|
DIMENSION E0FE(10),E0NI(10),E0CR(10)
|
|
DIMENSION VT0(MDEPTH),GT0(MDEPTH)
|
|
COMMON/COLKUR/OMES(100,100),EKU(15000),GKU(15000),GST,
|
|
& KKU(15000)
|
|
COMMON/LINED/WAVE(MLINE),VDOP(MLINE,MDODF),
|
|
& AGAM(MLINE,MDODF),SIG0(MLINE,MDODF),
|
|
& JTR(MLINE,2)
|
|
|
|
DATA E0FE/63480.,130563.,247220.,442000.,605000.,799000.,
|
|
& 1008000.,1218380.,1884000.,2114000./
|
|
DATA E0NI/61590.,146560.,283700.,443000.,613500.,871000.,
|
|
& 1070000.,1310000.,1560000.,1812000./
|
|
DATA E0CR/54576.,132966.,249700.,396500.,560200.,731020.,
|
|
& 1291900.,1490000.,1688000.,1971000./
|
|
C
|
|
IAT=IATM(NFIRST(ION))
|
|
E0=E0FE(IZ(ION))
|
|
IF(NUMAT(IAT).EQ.28) E0=E0NI(IZ(ION))
|
|
IF(NUMAT(IAT).EQ.24) E0=E0CR(IZ(ION))
|
|
CDOP=BOL2/AMASS(IAT)
|
|
TK35=UN/BOLCM/TEMP(JIDR(2))
|
|
CVR=19.7363/TEMP(JIDR(2))/SQRT(TEMP(JIDR(2)))
|
|
if(jidn.gt.3) then
|
|
TK35=UN/BOLCM/TEFF
|
|
CVR=19.7363/TEFF/SQRT(TEFF)
|
|
end if
|
|
TK357=TK35*1.E7
|
|
|
|
XION=0.
|
|
DO K=1,JIDN
|
|
XIONI=0.
|
|
XIATI=0.
|
|
ID=JIDR(K)
|
|
DO I=NFIRST(ION),NLAST(ION)
|
|
XIONI=XIONI+POPUL(I,ID)
|
|
END DO
|
|
DO I=N0A(IAT),NKA(IAT)
|
|
XIATI=XIATI+POPUL(I,ID)
|
|
END DO
|
|
XIONK=XIONI/XIATI
|
|
IF(XIONK.GT.XION) XION=XIONK
|
|
VT0(ID)=1.E-8/SQRT(CDOP*TEMP(ID)+VTURBS(ID)*VTURBS(ID))
|
|
GT0(ID)=TSTK*DLOG10(TEMP(ID))
|
|
END DO
|
|
|
|
NLINKU=0
|
|
WMIN=CAS/FRS1/TEN
|
|
WMAX=CAS/FRS2/TEN
|
|
IUN2=32
|
|
OPEN(IUN2,FILE=FIODF2(ION),STATUS='OLD')
|
|
10 READ(IUN2,180,ERR=20,END=20) WA,GFR,JEVR,JODR,IFPLI
|
|
GF=EXP(TENLG*GFR)
|
|
IF(WA.GT.WMAX) GO TO 11
|
|
IF(WA.LT.WMIN) GO TO 11
|
|
IF(IOBS.EQ.0 .AND. IFPLI.EQ.1) GO TO 10
|
|
IF(IOBS.EQ.2 .AND. EOD(JODR).GT.E0) GO TO 10
|
|
IF(IOBS.EQ.2 .AND. EEV(JEVR).GT.E0) GO TO 10
|
|
E00=EEV(JEVR)
|
|
IF(EOD(JODR).LT.EEV(JEVR)) E00=EOD(JODR)
|
|
XLSTR=XION*GF*EXP(-E00*TK35)
|
|
if(jidn.gt.3) XLSTR=XION*GF*EXP(-E00*8./E0)
|
|
IF(XLSTR.LT.STRLX) GO TO 10
|
|
NLINKU=NLINKU+1
|
|
WAVE(NLINKU)=WA*TEN
|
|
JTR(NLINKU,1)=JEVR
|
|
JTR(NLINKU,2)=JODR
|
|
GR=AEV(JEVR)+AOD(JODR)
|
|
C4=SEV(JEVR)
|
|
C4P=SOD(JODR)
|
|
SMX=DMAX1(ABS(C4P-C4),DMIN1(ABS(C4),ABS(C4P)))
|
|
GSLOG0=CSTK+PSTK*DLOG10(SMX)
|
|
DO I=1,JIDN
|
|
ID=JIDR(I)
|
|
VDOP(NLINKU,I)=real(WAVE(NLINKU)*VT0(ID))
|
|
GS=EXP(TENLG*(GSLOG0+GT0(ID)))
|
|
AGAM(NLINKU,I)=real((GR+GS*ELEC(ID))*PI4V*VDOP(NLINKU,I))
|
|
SIG0(NLINKU,I)=real(CSIG*GF*VDOP(NLINKU,I))
|
|
END DO
|
|
|
|
11 KA=KKU(JEVR)
|
|
KB=KKU(JODR+KEVE)
|
|
IF(KA.LE.KB) THEN
|
|
K1=KA
|
|
K2=KB
|
|
ELSE
|
|
K1=KB
|
|
K2=KA
|
|
END IF
|
|
IF(K1.EQ.K2) GO TO 10
|
|
U0=TK357/WA
|
|
IF(U0.LE.UN) THEN
|
|
EXPIU0=-LOG(U0)+EXPIA1+U0*(EXPIA2+U0*(EXPIA3+U0*(EXPIA4+
|
|
* U0*(EXPIA5+U0*EXPIA6))))
|
|
ELSE
|
|
EXPIU0=EXP(-U0)*((EXPIB1+U0*(EXPIB2+U0*(EXPIB3+
|
|
* U0*(EXPIB4+U0))))/(EXPIC1+U0*(EXPIC2+
|
|
* U0*(EXPIC3+U0*(EXPIC4+U0)))))/U0
|
|
END IF
|
|
GB=0.276*EXP(U0)*EXPIU0
|
|
IF(GB.LT.0.25) GB=0.25
|
|
OMES(K1,K2)=OMES(K1,K2)+(CVR/U0*GF*GB-GST)*EXP(-U0)
|
|
|
|
GO TO 10
|
|
20 CLOSE(IUN2)
|
|
WRITE(10,600) NUMAT(IAT),IZ(ION),NLINKU
|
|
C
|
|
C Store collisional excitation strengths
|
|
C
|
|
NLEVKU=NEVKU(ION)+NODKU(ION)
|
|
DO I=1,NLEVKU-1
|
|
II=NFIRST(ION)+I-1
|
|
I1=JEN(I)
|
|
IF(I1.LE.NEVKU(ION)) THEN
|
|
GSUP=YMKU(I1,1)
|
|
ELSE
|
|
GSUP=YMKU(I1-NEVKU(ION),2)
|
|
END IF
|
|
DO J=I+1,NLEVKU
|
|
JJ=NFIRST(ION)+J-1
|
|
J1=JEN(J)
|
|
IT=ITRA(II,JJ)
|
|
C2=CPAR(IT)
|
|
OMECOL(II,JJ)=OMES(I1,J1)/GSUP*C2/GES
|
|
OMECOL(JJ,II)=OMECOL(II,JJ)
|
|
END DO
|
|
END DO
|
|
c
|
|
RETURN
|
|
C
|
|
180 FORMAT(F11.4,F7.3,2I4,I1)
|
|
600 FORMAT(' Ion',2I3,' : ',I9,' Lines included')
|
|
END
|
|
C
|
|
C
|
|
C ***************************************************************
|
|
C
|
|
C
|
|
C
|
|
|
|
SUBROUTINE OPACFL(IJ)
|
|
C =====================
|
|
C
|
|
C Absorption, emission, and scattering coefficients
|
|
C at frequency IJ and for all depths
|
|
C
|
|
C Input: IJ opacity and emissivity is calculated for the
|
|
C frequency points with index IJ
|
|
C Output: ABSO1 - array of absorption coefficient
|
|
C EMIS1 - array of emission coefficient
|
|
C SCAT1 - array of scattering coefficient (all scattering
|
|
C mechanisms except electron scattering)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
PARAMETER (C14=2.99793D14, CFF1=1.3727D-25)
|
|
C
|
|
C initialize
|
|
c
|
|
DO ID=1,ND
|
|
ABSO1(ID)=ELSCAT(ID)
|
|
EMIS1(ID)=0.
|
|
SCAT1(ID)=ELSCAT(ID)
|
|
ABSO1L(ID)=0.
|
|
EMIS1L(ID)=0.
|
|
END DO
|
|
C
|
|
C basic frequency- and depth-dependent quantities
|
|
C
|
|
FR=FREQ(IJ)
|
|
FRINV=UN/FR
|
|
FR3INV=FRINV*FRINV*FRINV
|
|
DO ID=1,ND
|
|
XKF(ID)=EXP(-HKT1(ID)*FR)
|
|
XKF1(ID)=UN-XKF(ID)
|
|
XKFB(ID)=XKF(ID)*BNUE(IJ)
|
|
END DO
|
|
lfre=fr.gt.frtabm
|
|
C
|
|
C ******** 1a. bound-free contribution - without dielectronic rec.
|
|
C
|
|
if(ifdiel.eq.0) then
|
|
DO IBFT=1,NTRANC
|
|
ITR=ITRBF(IBFT)
|
|
SG=CROSS(IBFT,IJ)
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
idp=iadop(iatm(ii))
|
|
if(sg.gt.0.and.(idp.eq.0.or.(idp.gt.0.and.lfre))) then
|
|
IZZ=IZ(IEL(II))
|
|
IMER=IMRG(II)
|
|
DO ID=1,ND
|
|
SGD=SG
|
|
IF(MCDW(ITR).GT.0) THEN
|
|
CALL DWNFR1(FR,FR0(ITR),ID,IZZ,DW1)
|
|
DWF1(MCDW(ITR),ID)=DW1
|
|
SGD=SG*DW1
|
|
END IF
|
|
IF(IFWOP(II).LT.0) THEN
|
|
CALL SGMER1(FRINV,FR3INV,IMER,ID,SGME1)
|
|
SGMG(IMER,ID)=SGME1
|
|
SGD=SGME1
|
|
END IF
|
|
EMISBF=SGD*EMTRA(ITR,ID)
|
|
ABSO1(ID)=ABSO1(ID)+SGD*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+EMISBF
|
|
if(iluctr(itr).gt.0) then
|
|
ABSO1L(ID)=ABSO1L(ID)+SGD*ABTRA(ITR,ID)
|
|
EMIS1L(ID)=EMIS1L(ID)+EMISBF
|
|
end if
|
|
END DO
|
|
END IF
|
|
END DO
|
|
else
|
|
C
|
|
C ******** 1. bound-free contribution - with dielectronic rec.
|
|
C
|
|
DO IBFT=1,NTRANC
|
|
ITR=ITRBF(IBFT)
|
|
SG=CROSS(IBFT,IJ)
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
idp=iadop(iatm(ii))
|
|
if(sg.gt.0.and.(idp.eq.0.or.(idp.gt.0.and.lfre))) then
|
|
IZZ=IZ(IEL(II))
|
|
IMER=IMRG(II)
|
|
DO ID=1,ND
|
|
SG=CROSSD(IBFT,IJ,ID)
|
|
IF(SG.GT.0.) THEN
|
|
SGD=SG
|
|
IF(MCDW(ITR).GT.0) THEN
|
|
CALL DWNFR1(FR,FR0(ITR),ID,IZZ,DW1)
|
|
DWF1(MCDW(ITR),ID)=DW1
|
|
SGD=SG*DW1
|
|
END IF
|
|
IF(IFWOP(II).LT.0) THEN
|
|
CALL SGMER1(FRINV,FR3INV,IMER,ID,SGME1)
|
|
SGMG(IMER,ID)=SGME1
|
|
SGD=SGME1
|
|
END IF
|
|
EMISBF=SGD*EMTRA(ITR,ID)
|
|
ABSO1(ID)=ABSO1(ID)+SGD*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+EMISBF
|
|
if(iluctr(itr).eq.0) then
|
|
ABSO1L(ID)=ABSO1L(ID)+SGD*ABTRA(ITR,ID)
|
|
EMIS1L(ID)=EMIS1L(ID)+EMISBF
|
|
endif
|
|
END IF
|
|
END DO
|
|
END IF
|
|
END DO
|
|
end if
|
|
C
|
|
C ******** 2. free-free contribution
|
|
C
|
|
DO 40 ION=1,NION
|
|
IT=ITRA(NNEXT(ION),NNEXT(ION))
|
|
idp=iadop(iatm(nnext(ion)))
|
|
if(idp.gt.0.and..not.lfre) go to 40
|
|
C
|
|
C hydrogenic with Gaunt factor = 1
|
|
C
|
|
IF(IT.EQ.1) THEN
|
|
DO ID=1,ND
|
|
SF1=SFF3(ION,ID)*FR3INV
|
|
SF2=SFF2(ION,ID)
|
|
IF(FR.LT.FF(ION)) SF2=UN/XKF(ID)
|
|
ABSOFF=SF1*SF2
|
|
ABSO1(ID)=ABSO1(ID)+ABSOFF
|
|
EMIS1(ID)=EMIS1(ID)+ABSOFF
|
|
END DO
|
|
C
|
|
C hydrogenic with exact Gaunt factor
|
|
C
|
|
ELSE IF(IT.EQ.2) THEN
|
|
DO ID=1,ND
|
|
SF1=SFF3(ION,ID)*FR3INV
|
|
SF2=SFF2(ION,ID)
|
|
IF(FR.LT.FF(ION)) SF2=UN/XKF(ID)
|
|
X=C14*CHARG2(ION)/FR
|
|
SF2=SF2-UN+GFREE1(ID,X)
|
|
ABSOFF=SF1*SF2
|
|
ABSO1(ID)=ABSO1(ID)+ABSOFF
|
|
EMIS1(ID)=EMIS1(ID)+ABSOFF
|
|
END DO
|
|
C
|
|
C H minus free-free opacity
|
|
C
|
|
ELSE IF(IT.EQ.3) THEN
|
|
DO ID=1,ND
|
|
ABSOFF=SFFHMI(POPUL(NFIRST(IELH),ID),FR,TEMP(ID))*
|
|
* ELEC(ID)
|
|
ABSO1(ID)=ABSO1(ID)+ABSOFF
|
|
EMIS1(ID)=EMIS1(ID)+ABSOFF
|
|
END DO
|
|
C
|
|
C special evaluation of the cross-section
|
|
C
|
|
ELSE IF(IT.LT.0) THEN
|
|
DO ID=1,ND
|
|
ABSOFF=FFCROS(ION,IT,TEMP(ID),FR)*
|
|
* POPUL(NNEXT(ION),ID)*ELEC(ID)
|
|
ABSO1(ID)=ABSO1(ID)+ABSOFF
|
|
EMIS1(ID)=EMIS1(ID)+ABSOFF
|
|
END DO
|
|
END IF
|
|
40 CONTINUE
|
|
C
|
|
C ******** 3. - additional continuum opacity (OPADD)
|
|
C
|
|
IF(IOPADD.NE.0) THEN
|
|
ICALL=1
|
|
DO ID=1,ND
|
|
CALL OPADD(0,ICALL,IJ,ID)
|
|
ABSO1(ID)=ABSO1(ID)+ABAD
|
|
EMIS1(ID)=EMIS1(ID)+EMAD
|
|
SCAT1(ID)=SCAT1(ID)+SCAD
|
|
END DO
|
|
END IF
|
|
C
|
|
C ******** 4. - opacity and emissivity in lines
|
|
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)
|
|
iad=iadop(iatm(ilow(itr)))
|
|
if(iad.eq.0.or.(lfre.and.iad.gt.0)) then
|
|
DO ID=1,ND
|
|
SG=PRFLIN(ID,IJ)
|
|
ABSO1(ID)=ABSO1(ID)+SG*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+SG*EMTRA(ITR,ID)
|
|
END DO
|
|
if(iluctr(itr).gt.0) then
|
|
DO ID=1,ND
|
|
SG=PRFLIN(ID,IJ)
|
|
ABSO1L(ID)=ABSO1L(ID)+SG*ABTRA(ITR,ID)
|
|
EMIS1L(ID)=EMIS1L(ID)+SG*EMTRA(ITR,ID)
|
|
END DO
|
|
end if
|
|
end if
|
|
END IF
|
|
IF(NLINES(IJ).LE.0) GO TO 200
|
|
C
|
|
C the "overlapping" lines at the given frequency
|
|
C
|
|
DO 100 ILINT=1,NLINES(IJ)
|
|
ITR=ITRLIN(ILINT,IJ)
|
|
iad=iadop(iatm(ilow(itr)))
|
|
if(iad.gt.0.and..not.lfre) go to 100
|
|
if(linexp(itr)) go to 100
|
|
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))
|
|
A2=UN-A1
|
|
DO ID=1,ND
|
|
SG=A1*PRFLIN(ID,IJ1)+A2*PRFLIN(ID,IJ0)
|
|
ABSO1(ID)=ABSO1(ID)+SG*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+SG*EMTRA(ITR,ID)
|
|
END DO
|
|
100 CONTINUE
|
|
200 CONTINUE
|
|
C
|
|
C Opacity sampling option
|
|
C
|
|
ELSE
|
|
IF(NLINES(IJ).LE.0) GO TO 400
|
|
DO 300 ILINT=1,NLINES(IJ)
|
|
ITR=ITRLIN(ILINT,IJ)
|
|
iad=iadop(iatm(ilow(itr)))
|
|
if(iad.gt.0.and..not.lfre) go to 300
|
|
c IF(LINEXP(ITR)) GO TO 300
|
|
C IF(IJ.LT.IFR0(ITR) .OR. IJ.GT.IFR1(ITR)) GO TO 300
|
|
KJ=IJ-IFR0(ITR)+KFR0(ITR)
|
|
INDXPA=IABS(INDEXP(ITR))
|
|
IF(INDXPA.NE.3 .AND. INDXPA.NE.4) THEN
|
|
DO ID=1,ND
|
|
SG=PRFLIN(ID,KJ)
|
|
ABSO1(ID)=ABSO1(ID)+SG*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+SG*EMTRA(ITR,ID)
|
|
END DO
|
|
ELSE
|
|
DO ID=1,ND
|
|
KJD=JIDI(ID)
|
|
SG=EXP(XJID(ID)*SIGFE(KJD,KJ)+
|
|
* (UN-XJID(ID))*SIGFE(KJD+1,KJ))
|
|
ABSO1(ID)=ABSO1(ID)+SG*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+SG*EMTRA(ITR,ID)
|
|
END DO
|
|
END IF
|
|
300 CONTINUE
|
|
400 CONTINUE
|
|
END IF
|
|
C
|
|
C ----------------------------
|
|
C total opacity and emissivity
|
|
C ----------------------------
|
|
C
|
|
DO ID=1,ND
|
|
ABSO1(ID)=ABSO1(ID)-EMIS1(ID)*XKF(ID)
|
|
EMIS1(ID)=EMIS1(ID)*XKFB(ID)
|
|
ABSO1L(ID)=ABSO1L(ID)-EMIS1L(ID)*XKF(ID)
|
|
EMIS1L(ID)=EMIS1L(ID)*XKFB(ID)
|
|
ABSO1L(ID)=ABSO1(ID)-ABSO1L(ID)
|
|
EMIS1L(ID)=EMIS1(ID)-EMIS1L(ID)
|
|
END DO
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ***************************************************************
|
|
C
|
|
C
|
|
subroutine rdatax(itr,ic,iunit)
|
|
c ===============================
|
|
c
|
|
c for itr, itrx ne 0 - read input data for an individual transition
|
|
c and prepare necessary auxiliary arrays
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
c
|
|
parameter (mtrx=1000)
|
|
dimension iex(mtrx),itrind(mtrx),izx0(mtrx),izx1(mtrx),
|
|
* nmaxx(mtrx),izx(mtrx),nshx(mtrx),nax(mtrx),icx(mtrx),
|
|
* etx(mtrx),ssx(mtrx),dx(mtrx),
|
|
* aphx(11,5,mtrx),bphx(5,mtrx),a(11,5),b(5)
|
|
c
|
|
if(itr.gt.0) then
|
|
itrx=itrx+1
|
|
ntrx=itrx
|
|
ii=ilow(itr)
|
|
ie=iel(ii)
|
|
jj=iup(itr)
|
|
iex(itrx)=ie
|
|
icx(itrx)=ic
|
|
itrind(itrx)=itr
|
|
izx0(itrx)=iz(ie)
|
|
izx1(itrx)=jj-1000
|
|
c
|
|
c read inner-shell photoionization data from Omer's tables
|
|
c
|
|
read(iunit,*) etx(itrx)
|
|
read(iunit,*) nmaxx(itrx),izx(itrx),nshx(itrx)
|
|
read(iunit,*) ssx(itrx)
|
|
read(iunit,*) nax(itrx)
|
|
read(iunit,*) dx(itrx)
|
|
do i=1,nax(itrx)
|
|
read(iunit,*) bphx(i,itrx)
|
|
end do
|
|
do j=1,nax(itrx)
|
|
do i=1,11
|
|
read(iunit,*) aphx(i,j,itrx)
|
|
end do
|
|
end do
|
|
else if(itr.eq.0) then
|
|
c
|
|
c for itr=0 - set up array BFCS with actual cross-sections
|
|
c
|
|
if(ntrx.gt.0) then
|
|
do itx=1,ntrx
|
|
ie=iex(itx)
|
|
it=itrind(itx)
|
|
ii=ilow(it)
|
|
ia=iatm(ii)
|
|
iz1=izx1(itx)
|
|
ic=icx(itx)
|
|
jj=0
|
|
do i=1,nlevel
|
|
if(iatm(i).eq.ia) then
|
|
if(iz(iel(i)).eq.iz1) then
|
|
jj=i
|
|
go to 10
|
|
end if
|
|
end if
|
|
end do
|
|
10 continue
|
|
if(jj.eq.0) then
|
|
if(iz1.eq.iz(iel(nka(ia)-1))+1) jj=nka(ia)
|
|
end if
|
|
if(jj.eq.0) indexp(it)=0
|
|
c
|
|
if(indexp(it).ne.0) then
|
|
iup(it)=jj
|
|
fr0(it)=etx(itx)/4.1357e-15
|
|
line(it)=.false.
|
|
itrcon(it)=ic
|
|
if(icol(it).ne.99) then
|
|
itra(ii,jj)=it
|
|
itra(jj,ii)=ic
|
|
end if
|
|
c
|
|
write(6,601) itx,it,ii,jj,ia,
|
|
* itra(ii,jj),itra(jj,ii),
|
|
* icol(it),fr0(it),etx(itx)
|
|
601 format(8i4,1pe12.4,0pf10.2)
|
|
end if
|
|
end do
|
|
end if
|
|
c
|
|
else
|
|
nfreqb=nfreq
|
|
if(ibfint.gt.0) nfreqb=nfreqc
|
|
if(ntrx.gt.0) then
|
|
do itx=1,ntrx
|
|
it=itrind(itx)
|
|
ic=icx(itx)
|
|
if(indexp(it).ne.0) then
|
|
na=nax(itx)
|
|
do i=1,na
|
|
b(i)=bphx(i,itx)
|
|
end do
|
|
do j=1,na
|
|
do i=1,11
|
|
a(i,j)=aphx(i,j,itx)
|
|
end do
|
|
end do
|
|
c
|
|
do ij=1,nfreqb
|
|
call bkhsgo(freq(ij),etx(itx),dx(itx),b,na,a,
|
|
* ssx(itx),nmaxx(itx),izx(itx),nshx(itx),sg)
|
|
bfcs(ic,ij)=real(sg)
|
|
end do
|
|
write(97,681) it,ic,ilow(it),iup(it),bfcs(ic,1)
|
|
681 format(4i5,1p1e15.5)
|
|
end if
|
|
end do
|
|
end if
|
|
end if
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ************************************************************************
|
|
C
|
|
C
|
|
subroutine bkhsgo(freq,et,d,b,na,a,ss,nmax,iz,nsh,sg)
|
|
c =====================================================
|
|
c
|
|
c
|
|
c subroutine to calculate K and L shell photoionization cross-sections
|
|
c -based on Tim Kallman's bkhsgo subroutine from XSTAR, modified
|
|
c by Omer Blaes 5-7-98.
|
|
c -na.ne.2 bug corrected on 2/24/00 by Omer Blaes
|
|
c
|
|
c freq is photon frequency in Hz (note that this subroutine immediately
|
|
c converts it into eV)
|
|
c
|
|
c et is threshold energy in eV
|
|
c
|
|
c iz is the ionization stage of the species being photoionized (1=neutral etc.)
|
|
c
|
|
c ss is the iz'th element of the array ss(nmax) in Tim's original version
|
|
c
|
|
c sg is returned as the contribution to the photoionization cross-section
|
|
c in cm^2 due to whatever process is being considered.
|
|
c
|
|
c this routine does the work in computing cross sections by the
|
|
c method of barfield, et. al.
|
|
c
|
|
c
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
dimension b(5),a(11,5)
|
|
c
|
|
data sigth/1.e-34/
|
|
c
|
|
tmp1 = 0.
|
|
jj = 1
|
|
epii = 4.1357e-15*freq
|
|
sg=0.
|
|
if ( epii.gt.et ) then
|
|
xx = epii*(1.e-3) - d
|
|
if ( xx.le.0. ) return
|
|
do nna=1,na
|
|
if ( xx.ge.b(nna) ) jj = jj + 1
|
|
enddo
|
|
if ( jj.le.na ) then
|
|
if(xx.lt.0.) xx=0.
|
|
yy = log10(xx)
|
|
tmp = 0.
|
|
do kkk = 1,11
|
|
kk = 12 - kkk
|
|
tmp = a(kk,jj) + yy*tmp
|
|
end do
|
|
if(tmp.lt.-50.) tmp=-50.
|
|
if(tmp.gt.24.) tmp=24.
|
|
sgtmp = 10.**(tmp-24.)
|
|
nelec=nmax+1-iz
|
|
if(nelec.gt.nsh) nelec=nsh
|
|
enelec = float(nelec)
|
|
tmp1o = tmp1
|
|
tmp1=sgtmp*ss
|
|
if(tmp1.lt.sigth*enelec) tmp1=sigth*enelec
|
|
if ( epii.ge.5.e+4 ) then
|
|
if(tmp1.gt.tmp1o) tmp1 = tmp1o
|
|
end if
|
|
sg = sg + tmp1
|
|
endif
|
|
endif
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ************************************************************************
|
|
C
|
|
C
|
|
c
|
|
function cion(n,j,e,t)
|
|
c
|
|
c collisional ionization rate from Raymond
|
|
c rate is returned in units cm^3/s
|
|
c inputs are: n=nuclear charge,
|
|
c j=ion stage
|
|
c e=valence shell ionization threshold (in eV)
|
|
c t=temperature in K.
|
|
c
|
|
c Tim Kallman's routine for calculating collisional ionization rates.
|
|
c Note that this routine only accounts for valence shell ionization.
|
|
c It should be called only once for each ion stage and the valence
|
|
c shell ionization threshold should be the lowest one (e.g. the 2p
|
|
c ionization potential for CI).
|
|
c
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
c
|
|
c sm younger jqsrt 26, 329; 27, 541; 29, 61 with moores for undone
|
|
c a0 for b-like ion has twice 2s plus one 2p as in summers et al
|
|
c chi = kt / i
|
|
c
|
|
dimension a0(30),a1(30),a2(30),a3(30),b0(30),b1(30),
|
|
& b2(30),b3(30),c0(30),c1(30),c2(30),c3(30),
|
|
& d0(30),d1(30),d2(30),d3(30)
|
|
c
|
|
data a0/13.5,27.0,9.07,11.80,20.2,28.6,37.0,45.4,
|
|
& 53.8,62.2,11.7,38.8,37.27,46.7,57.4,67.0,
|
|
& 77.8,90.1,106.,120.8,135.6,150.4,165.2,180.0,
|
|
& 194.8,209.6,224.4,239.2,154.0,268.8/
|
|
data a1/ - 14.2,-60.1,4.30,27*0./
|
|
data a2/40.6,140.,7.69,27*0./
|
|
data a3/ - 17.1,-89.8,-7.53,27*0./
|
|
c
|
|
data b0/ - 4.81,-9.62,-2.47,-3.28,-5.96,-8.64,-11.32,
|
|
& -14.00,-16.68,-19.36,-4.29,-16.7,-14.58,-16.95,
|
|
& -19.93,-23.05,-26.00,-29.45,-34.25,-38.92,
|
|
& -43.59,-48.26,-52.93,-57.60,-62.27,-66.94,
|
|
& -71.62,-76.29,-80.96,-85.63/
|
|
data b1/9.77,33.1,-3.78,27*0./
|
|
data b2/ - 28.3,-82.5,-3.59,27*0./
|
|
data b3/11.4,54.6,3.34,27*0./
|
|
c
|
|
data c0/1.85,3.69,1.34,1.64,2.31,2.984,3.656,4.328,
|
|
& 5.00,5.672,1.061,1.87,3.26,5.07,6.67,8.10,
|
|
& 9.92,11.79,7.953,8.408,8.863,9.318,9.773,
|
|
& 10.228,10.683,11.138,11.593,12.048,12.505,12.96/
|
|
data c1/0.,4.32,.343,27*0./
|
|
data c2/0.,-2.527,-2.46,27*0./
|
|
data c3/0.,.262,1.38,27*0./
|
|
c
|
|
data d0/ - 10.9,-21.7,-5.37,-7.58,-12.66,-17.74,
|
|
& -22.82,-27.9,-32.98,-38.06,-7.34,-28.8,-24.87,
|
|
& -30.5,-37.9,-45.3,-53.8,-64.6,-54.54,-61.70,
|
|
& -68.86,-76.02,-83.18,-90.34,-97.50,-104.66,
|
|
& -111.82,-118.98,-126.14,-133.32/
|
|
data d1/8.90,42.5,-12.4,27*0./
|
|
data d2/ - 35.7,-131.,-8.09,27*0./
|
|
data d3/16.5,87.4,1.23,27*0./
|
|
c
|
|
cion = 0.
|
|
chir = t/(11590.*e)
|
|
if ( chir.le..0115 ) return
|
|
chi=chir
|
|
if(chi.lt.0.1) ch=0.1
|
|
ch2 = chi*chi
|
|
ch3 = ch2*chi
|
|
alpha = (.001193+.9764*chi+.6604*ch2+.02590*ch3)
|
|
& /(1.0+1.488*chi+.2972*ch2+.004925*ch3)
|
|
beta = (-.0005725+.01345*chi+.8691*ch2+.03404*ch3)
|
|
& /(1.0+2.197*chi+.2457*ch2+.002503*ch3)
|
|
j2 = j*j
|
|
j3 = j2*j
|
|
iso = n - j + 1
|
|
c
|
|
a = a0(iso) + a1(iso)/j + a2(iso)/j2 + a3(iso)/j3
|
|
b = b0(iso) + b1(iso)/j + b2(iso)/j2 + b3(iso)/j3
|
|
c = c0(iso) + c1(iso)/j + c2(iso)/j2 + c3(iso)/j3
|
|
d = d0(iso) + d1(iso)/j + d2(iso)/j2 + d3(iso)/j3
|
|
c
|
|
c fe ii experimental ionization montague et al: d. neufeld fit
|
|
if ( n.eq.26 .and. j.eq.2 ) then
|
|
a = -13.825
|
|
b = -11.0395
|
|
c = 21.07262
|
|
d = 0.
|
|
endif
|
|
c
|
|
ch = 1./chi
|
|
fchi = 0.3*ch*(a+b*(1.+ch)+(c-(a+b*(2.+ch))*ch)*alpha+d*beta*ch)
|
|
cion = 2.2e-6*sqrt(chir)*fchi*expo(-1./chir)/(e*sqrt(e))
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ************************************************************************
|
|
C
|
|
C
|
|
c
|
|
c
|
|
subroutine dielrc(iatom,iont,temp,xpx,dirt,sig0)
|
|
c ================================================
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
c
|
|
c
|
|
c Modification of Tim Kallman's XSTAR routine rrrec to calculate dielectronic
|
|
c recombination rates (only) to individual ionic species (modified by Omer
|
|
c Blaes 5-8-98)
|
|
c
|
|
c Here temp=temperature in K, xpx is the number density of atomic nuclei in
|
|
c cm^{-3} (hydrogen density=xpx/1.1, helium density=xpx*0.1/1.1),
|
|
c dirt =the dielectronic rate in cm^3/s,
|
|
c sig0 = the value of sigma_0, the corresponding pseudo-cross-section
|
|
c iatom - atomic number (1=H, 2=He, 6=C, etc.)
|
|
c iont - ionization stage (1 for neutrals, 2 for once ionized, etc.)
|
|
c
|
|
c this routine computes radiative recombination rates, both rr
|
|
c and dr. rates are output in units of cm**3/s for each ion
|
|
c stage, where ions are numbered from 1-168:
|
|
c 1=HI, 2=HeI, 3=HeII, 4=C I, 5=C II, ..., 9=C VI, 10=N I, ...,
|
|
c 16=N VII, 17=O I, ..., 24=O VIII, 25=Ne I, ..., 34=Ne X,
|
|
c 35=Mg I, ..., 46=Mg XII, 47=Si I, ..., 60=Si XIV, 61=S I, ...,
|
|
c 76=S XVI, 77=Ar I, ..., 94=Ar XVIII, 95=Ca I, ... 114=Ca XX,
|
|
c 115=Fe I, ..., 140=Fe XXVI, 141=Ni I, ... 168=Ni XXVIII.
|
|
c inputs are rate coefficients from Aldrovandi and Pequignot, Storey,
|
|
c and from Arnaud and Raymond for iron
|
|
c
|
|
parameter (nni=168)
|
|
parameter (cons=0.1239529*3.28805e15/13.595)
|
|
dimension inid(28,28),uu(28,28)
|
|
dimension adi(nni),bdi(nni),t0(nni),t1(nni),cdd(nni)
|
|
dimension dcfe(26,4),defe(26,4)
|
|
dimension gli(20),gfe(26),gni(28)
|
|
dimension istorey(13),rstorey(5,13)
|
|
c
|
|
c
|
|
c Each non-indented line in the following data statements corresponds
|
|
c to each of the elements H, He, C, N, O, Ne, Mg, Si, S, Ar, Ca, Fe,
|
|
c and Ni.
|
|
c
|
|
data inid/1, 27*0,
|
|
* 2, 3, 26*0,
|
|
* 28*0,
|
|
* 28*0,
|
|
* 28*0,
|
|
* 4, 5, 6, 7, 8, 9, 22*0,
|
|
* 10,11,12,13,14,15,16, 21*0,
|
|
* 17,18,19,20,21,22,23,24, 20*0,
|
|
* 28*0,
|
|
* 25,26,27,28,29,30,31,32,33,34, 18*0,
|
|
* 28*0,
|
|
* 35,36,37,38,39,40,41,42,43,44,45,46, 16*0,
|
|
* 28*0,
|
|
* 47,48,49,50,51,52,53,54,55,56,57,58,59,60,14*0,
|
|
* 28*0,
|
|
* 61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,12*0,
|
|
* 28*0,
|
|
* 77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,
|
|
* 10*0,
|
|
* 28*0,
|
|
* 95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,
|
|
* 110,111,112,113,114,8*0,
|
|
* 28*0,
|
|
* 28*0,
|
|
* 28*0,
|
|
* 28*0,
|
|
* 28*0,
|
|
* 115,116,117,118,119,120,121,122,123,124,125,126,127,128,
|
|
* 129,130,131,132,133,134,135,136,137,138,139,140,2*0,
|
|
* 28*0,
|
|
* 141,142,143,144,145,146,147,148,149,150,151,152,153,154,
|
|
* 155,156,157,158,159,160,161,162,163,164,165,166,167,168/
|
|
data adi/0.,
|
|
% 1.9E-03,0.,
|
|
% 6.9E-04,7.0E-03,3.8E-03,4.8E-02,4.8E-02,0.,
|
|
% 5.2E-04,1.7E-03,1.2E-02,5.5E-03,7.6E-02,6.6E-02,0.,
|
|
% 1.4E-03,1.4E-03,2.8E-03,1.7E-02,7.1E-03,1.1E-01,8.6E-02,
|
|
% 0.0,
|
|
% 1.3E-03,3.1E-03,7.5E-03,5.7E-03,1.0E-02,4.0E-02,1.1E-02,
|
|
% 1.8E-01,1.3E-01,0.,
|
|
% 1.7E-3,3.5E-3,3.9E-3,9.3E-3,1.5E-2,1.2E-2,
|
|
% 1.4E-2,3.8E-2,1.4E-2,2.6E-1,1.7E-1,0.,
|
|
% 6.2E-03,1.4E-02,1.1E-02,1.4E-02,7.8E-03,1.6E-02,2.3E-02,
|
|
% 1.1E-02,1.1E-02,4.8E-02,1.8E-02,3.4E-01,2.1E-01,0.,
|
|
% 7.3E-05,4.9E-03,9.1E-03,4.3E-02,2.5E-02,3.1E-02,1.3E-02,
|
|
% 2.1E-02,3.5E-02,3.0E-02,3.1E-02,6.3E-02,2.3E-02,
|
|
% 4.2E-01,2.5E-01,0.,
|
|
% .0001,.011,.034,.0685,.090,.0635,.0260,.017,
|
|
% .0210,.0350,.0540,.0713,.0960,.0850,.0170,
|
|
% .476,.297,0.,
|
|
% 3.28E-4,5.84E-02,1.12E-01,1.32E-01,1.33E-01,1.26E-01,
|
|
% 1.39E-01,9.55E-02,4.02E-01,4.19E-02,2.57E-02,4.45E-02,
|
|
% 5.48E-02,7.13E-02,9.03E-02,1.10E-01,2.05E-02,5.49E-01,
|
|
% 3.55E-01,0.,
|
|
% 1.8E-3,3.6E-2,7.8E-2,2.2E-1,1.4E-1,1.4E-1,
|
|
% 1.1E-1,6.3E-1,5.5E-1,3.6E-1,2.6E-1,1.6E-1,
|
|
% 6.6E-2,2.5E-1,1.2E-1,5.0E+0,3.7E-2,6.3E-2,
|
|
% 7.0E-2,1.1E-1,1.0E-1,1.1E-1,3.6E-2,7.5E-1,
|
|
% 5.2E-1,0.,
|
|
% 1.41E-03, 5.20E-03, 1.38E-02, 2.30E-02, 4.19E-02,
|
|
% 6.83E-02, 1.22E-01, 3.00E-01, 1.50E-01, 6.97E-01,
|
|
% 7.09E-01, 6.44E-01, 5.25E-01, 4.46E-01, 3.63E-01,
|
|
% 3.02E-01, 1.02E-01, 2.70E-01, 4.67E-02, 8.35E-02,
|
|
% 9.96E-02, 1.99E-01, 2.40E-01, 1.15E-01, 3.16E-02,
|
|
% 8.03E-01, 5.75E-01, 0./
|
|
data bdi/0.,
|
|
% 0.3,0.,
|
|
% 3.0, 0.5, 2.0, 0.2, 0.2, 0.,
|
|
% 3.8, 4.1, 1.4, 3.0, 0.2, 0.2, 0.,
|
|
% 2.5, 3.3, 6.0, 2.0, 3.2, 0.2, 0.2,
|
|
% 0.,
|
|
% 1.9, 0.6, 0.7, 4.3, 4.8, 1.6, 5.0,
|
|
% 0.2, 0.2, 0.,
|
|
% 0., 0., 3., 3.2, 3.2, 6.7,
|
|
% 4.4, 3.5, 10., 0.2, 0.2, 0.,
|
|
% 0., 0., 0., 0., 10., 4., 8.,
|
|
% 6.3, 6., 5., 10.5, 0.2, 0.2, 0.,
|
|
% 0., 2.5, 6.0, 0., 0., 0., 22.,
|
|
% 6.4, 13., 6.8, 6.3, 4.1, 12., 0.2,
|
|
% 0.2, 0.,
|
|
% .005, .045, .057, .087, .0769, .140, .120, .100, 1.92,
|
|
% 1.66, 1.67, 1.40, 1.31, 1.02, .245, .294, .277, 0.,
|
|
% 0.0907,.110,.0174,.132,.114,.162,.0878,.263,.0627,
|
|
% .0616,2.77,2.23,2.00,1.82,.424,.243,.185,.292,.275,
|
|
% 0.,
|
|
% 6*0.,1.3,4*0.4, 0.8, 2.7, 0.1, 1.9, 0.1,
|
|
% 26., 23., 17., 8., 11.7, 15.4, 29.,
|
|
% 0.3, 0.3, 0.,
|
|
% .469, .357, .281, .128, .0417, .0558, .0346, 0.,
|
|
% 1.90, .277, .135, .134, .192, .332, .337, .121,
|
|
% .0514, .183, 7.56, 4.55, 4.87, 2.19, 1.15, 1.23,
|
|
% .132, .289, .286, 0./
|
|
data t0/0.,
|
|
% 47.,0.,
|
|
% 11., 15., 9.1, 340., 410., 0.,
|
|
% 13., 14., 18., 11., 470., 540., 0.,
|
|
% 17., 17., 18., 22., 13., 620., 700.,
|
|
% 0.,
|
|
% 31., 29., 26., 24., 24., 29., 17.,
|
|
% 980., 1100., 0.,
|
|
% 5.1, 61., 44., 39., 34., 31.,
|
|
% 31., 36., 21., 1400., 1500., 0.,
|
|
% 11., 12., 10., 120., 55., 49.,
|
|
% 42., 38., 37., 42., 25., 1900.,
|
|
% 2000., 0.,
|
|
% 11., 12., 13., 18., 15., 190.,
|
|
% 67., 59., 55., 47., 42., 50.,
|
|
% 30., 2400., 2500., 0.,
|
|
% 32., 29., 23.9, 25.6, 25.0, 21.0, 18., 270., 83.,
|
|
% 69.5, 60.5, 66.8, 65.0, 53.0, 35.5, 3010.,3130.,0.,
|
|
% 3.46,38.5,40.8,38.2,35.3,31.9,32.2,24.7,22.9,373.,92.6,
|
|
% 79.6,69.0,67.0,47.2,56.7,42.1,3650.,3780.,0.,
|
|
% 5.8, 13., 28., 37., 49., 63.,
|
|
% 68., 77., 73., 71., 68., 61., 59.,
|
|
% 43., 35., 770., 100., 87., 62., 69.,
|
|
% 68., 67., 41., 5800., 5900., 0.,
|
|
% 9.82, 20.1, 30.5, 42.0, 55.6, 67.2, 79.3, 90.0, 100.,
|
|
% 78.1, 76.4, 74.4, 66.5, 59.7, 52.4, 49.6, 44.6, 849.,
|
|
% 136., 123., 106., 125., 123., 33.2, 64.5, 6650.,
|
|
% 6810., 0./
|
|
data t1/0.,
|
|
% 9.4,0.,
|
|
% 4.9, 23., 37., 51., 76., 0.,
|
|
% 4.8, 6.8, 38., 59., 72., 98., 0.,
|
|
% 13., 5.8, 9.1, 59., 80., 95., 130.,
|
|
% 0.,
|
|
% 15., 17., 45., 17., 35., 110., 130.,
|
|
% 140., 260., 0.,
|
|
% 0., 0., 41., 87., 100., 54.,
|
|
% 36., 160.,210.,240.,350., 0.,
|
|
% 0., 0., 0., 0., 100., 130., 170.,
|
|
% 60., 110., 250., 280., 310., 440., 0.,
|
|
% 0., 8.8, 15., 0., 0., 0.,
|
|
% 180., 200., 230., 120., 130., 340.,
|
|
% 360., 460., 550., 0.,
|
|
% 31., 55., 60., 38.1, 33., 21.5, 21.5, 330., 350.,
|
|
% 360., 380., 290., 360., 280., 110., 605., 654., 0.,
|
|
% 1.64,24.5,42.7,69.2,87.8,74.3,69.9,44.3,28.1,584.,
|
|
% 489.,462.,452.,332.,137.,441.,227.,725.,768.,0.,
|
|
% 6*0.,36.,63., 85., 89., 100., 120., 190.,
|
|
% 190., 250., 90., 630., 770., 620., 510.,
|
|
% 870., 990., 1000., 980., 1200., 0.,
|
|
% 10.1, 19.1, 23.2, 31.8, 45.5, 55.1, 52.8, 0.00, 55.0,
|
|
% 88.7, 180.,125., 189., 88.4, 129., 62.4, 159., 801.,
|
|
% 932., 945., 945., 801., 757., 264., 193., 1190.,
|
|
% 908., 0./
|
|
data gli /2.,1.,2.,1.,6.,9.,4.,9.,6.,1.,2.,1.,6.,9.,4.,9.,6.,1.,
|
|
* 2.,1./
|
|
data gfe /2.,1.,2.,1.,6.,9.,4.,9.,6.,1.,2.,1.,6.,9.,4.,9.,
|
|
* 6.,1.,10.,21.,28.,25.,6.,25.,30.,25./
|
|
data gni /2.,1.,2.,1.,6.,9.,4.,9.,6.,1.,2.,1.,6.,9.,4.,9.,
|
|
* 6.,1.,10.,21.,28.,25.,6.,25.,28.,21.,10.,21./
|
|
c
|
|
c parameters for calculating density dependent correction ap from Raymond
|
|
c
|
|
DATA cdd/.24E-02,.1430E-01,.9094E-03,.3500E-01,.3050E-01,
|
|
$ .9043E-02,.1077E-01,.2585E-03,.1953E-03,.8000E-01,
|
|
$ .8715E-02,.1346E-01,.4753E-02,.6304E-02,.1601E-03,
|
|
$ .1574E-03,.5600E-01,.1610E-01,.4081E-02,.7718E-02,
|
|
$ .2910E-02,.4070E-02,.1059E-03,.1306E-03,.3370E-01,
|
|
$ .1023E-01,.4726E-02,.3410E-02,.1660E-02,.3649E-02,
|
|
$ .1412E-02,.2040E-02,.5280E-04,12*0.,.9555E-04,.8100E-01,
|
|
$ .4168E-01,.2792E-01,.2585E-01,.2137E-02,.7325E-03,
|
|
$ .8059E-03,.7821E-03,.6306E-03,.1501E-02,.5546E-03,
|
|
$ .7711E-03,.1760E-04,.5965E-04,.6600E-01,.2842E-01,
|
|
$ .1740E-01,.1579E-01,.1355E-01,.1221E-01,.1272E-02,
|
|
$ .3673E-03,.4921E-03,.4976E-03,.4592E-03,.1108E-02,
|
|
$ .3973E-03,.5326E-03,.1098E-04,.4948E-04,18*0.,20*0.,9*0.,
|
|
$ .2030E-02,.2299E-02,.2313E-02,.2233E-02,.2734E-02,
|
|
$ .2934E-02,.2319E-02,.3406E-03,.5245E-04,.1246E-03,
|
|
$ .1320E-03,.1711E-03,.4206E-03,.1339E-03,.1461E-03,
|
|
$ .1015E-05,.2508E-04,28*0./
|
|
c
|
|
data dcfe/2.2e-4,2.3e-3,1.5e-2,3.8e-2,8.0e-2,9.2e-2,
|
|
& 0.16,0.18,0.14,0.1,0.225,0.24,0.26,0.19,
|
|
& 0.12,1.23,2.53e-3,5.67e-3,1.6e-2,1.85e-2,9.2e-4,
|
|
& 0.131,1.1e-2,0.256,0.43,0.,1.e-4,2.7e-3,
|
|
& 4.7e-3,1.6e-2,2.4e-2,4.1e-2,3.6e-2,0.07,0.26,
|
|
& 0.28,0.231,0.17,0.16,0.09,0.12,0.,3.36e-2,
|
|
& 7.82e-2,7.17e-2,9.53e-2,0.129,8.49e-2,4.88e-2,
|
|
& 0.452,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,
|
|
& 0.,0.,0.,0.,0.,0.,0.6,0.,0.181,3.18e-2,
|
|
& 9.06e-2,7.9e-2,0.192,0.613,8.01e-2,0.,0.,0.,
|
|
& 0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,
|
|
& 0.,0.,0.,0.,1.92,1.26,0.739,1.23,0.912,0.,
|
|
& 0.529,0.,0.,0./
|
|
data defe/5.12,16.7,28.6,37.3,54.2,45.5,66.7,66.1,
|
|
& 21.6,22.2,59.6,75.,36.3,39.4,24.6,560.,22.5,
|
|
& 16.2,23.7,13.2,39.1,73.2,0.1,4.625e3,5.3e3,
|
|
& 0.,12.9,31.4,52.1,67.4,100.,360.,123.,129.,
|
|
& 136.,144.,362.,205.,193.,198.,248.,0.,117.,
|
|
& 96.,85.1,66.6,80.3,316.,36.2,6.e3,0.,0.,
|
|
& 0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,
|
|
& 0.,0.,560.,0.,341.,330.,329.,297.,392.,
|
|
& 877.,306.,0.,0.,0.,0.,0.,0.,0.,0.,0.,
|
|
& 0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,683.,
|
|
& 729.,787.,714.,919.,0.,928.,0.,0.,0./
|
|
c
|
|
data istorey/5,6,7,11,12,13,14,18,19,20,21,22,0/
|
|
data rstorey/ 0.0108,-0.1075, 0.2810,-0.0193,-0.1127,
|
|
$ 1.8267, 4.1012, 4.8443, 0.2261, 0.5960,
|
|
$ 2.3196,10.7328, 6.8830,-0.1824, 0.4101,
|
|
$ 0.0000, 0.6310, 0.1990,-0.0197, 0.4398,
|
|
$ 0.0320,-0.6624, 4.3191, 0.0003, 0.5946,
|
|
$ -0.8806,11.2406,30.7066,-1.1721, 0.6127,
|
|
$ 0.4134,-4.6319,25.9172,-2.2290,-0.2360,
|
|
$ 0.0000, 0.0238, 0.0659, 0.0349, 0.5334,
|
|
$ -0.0036, 0.7519, 1.5252,-0.0838, 0.2769,
|
|
$ 0.0000,21.8790,16.2730,-0.7020, 1.1899,
|
|
$ 0.0061, 0.2269,32.1419, 1.9939,-0.0646,
|
|
$ -2.8425, 0.2283,40.4072,-3.4956, 1.7558,
|
|
$ 5*0./
|
|
c
|
|
data uu/109.6787, 27*0.,
|
|
* 198.3108,438.9089,26*0.,
|
|
* 28*0.,
|
|
* 28*0.,
|
|
* 28*0.,
|
|
* 90.82,196.665,386.241,520.178,3162.395,3952.06,
|
|
* 22*0.,
|
|
* 117.225,238.751,382.704,624.866,789.537,4452.758,
|
|
* 5380.089,21*0.,
|
|
* 109.837,283.24,443.086,624.384,918.657,1114.008,
|
|
* 5963.135,7028.393,20*0.,
|
|
* 28*0.,
|
|
* 173.93,330.391,511.8,783.3,1018.,1273.8,1671.792,
|
|
* 1928.462,9645.005,10986.876,18*0.,
|
|
* 28*0.,
|
|
* 61.671,121.268,646.41,881.1,1139.4,1504.3,1814.3,2144.7,
|
|
* 2645.2,2964.4,14210.261,15829.951,16*0.,
|
|
* 28*0.,
|
|
* 65.748,131.838,270.139,364.093,1345.1,1653.9,1988.4,
|
|
* 2445.3,2831.9,3237.8,3839.8,4222.4,19661.693,21560.63,
|
|
* 14*0.,
|
|
* 28*0.,
|
|
* 83.558,188.2,280.9,381.541,586.2,710.184,2265.9,2647.4,
|
|
* 3057.7,3606.1,4071.4,4554.3,5255.9,5703.6,26002.663,
|
|
* 28182.535,12*0.,
|
|
* 28*0.,
|
|
* 127.11,222.848,328.6,482.4,605.1,734.04,1002.73,1157.08,
|
|
* 3407.3,3860.9,4347.,4986.6,5533.8,6095.5,6894.2,7404.4,
|
|
* 33237.173,35699.936,10*0.,
|
|
* 28*0.,
|
|
* 49.306,95.752,410.642,542.6,681.6,877.4,1026.,1187.6,
|
|
* 1520.64,1704.047,4774.,5301.,5861.,6595.,7215.,7860.,
|
|
* 8770.,9338.,41366.,44177.4,8*0.,
|
|
* 28*0.,
|
|
* 28*0.,
|
|
* 28*0.,
|
|
* 28*0.,
|
|
* 28*0.,
|
|
* 63.737,130.563,247.22,442.,605.,799.,1008.,1218.38,
|
|
* 1884.,2114.,2341.,2668.,2912.,3163.,3686.,3946.82,
|
|
* 10180.,10985.,11850.,12708.,13620.,14510.,15797.,
|
|
* 16500.,71203.,74829.,2*0.,
|
|
* 28*0.,
|
|
* 61.6,146.542,283.8,443.,613.5,870.,1070.,1310.,1560.,
|
|
* 1812.,2589.,2840.,3100.,3470.,3740.,4020.,4606.,
|
|
* 4896.2,12430.,13290.,14160.,15280.,16220.,17190.,
|
|
* 18510.,19351.,82984.,86909.4/
|
|
c data hfrac/0.75/
|
|
data hfrac/1.0/
|
|
data ergsev/1.602192e-12/
|
|
data cc1/1.e-06/
|
|
c
|
|
c Tim Kallman works with temperatures in units of 10^4 K
|
|
c
|
|
t=temp/1.e4
|
|
c
|
|
dirt=0.
|
|
ini=inid(iont,iatom)
|
|
if(ini.le.0) return
|
|
c
|
|
ekt = t*(0.861707)
|
|
xst = sqrt(t)
|
|
hconst = hfrac*ekt*ergsev
|
|
t3s2=1./(t*xst)
|
|
tmr = 1.e-6*t3s2
|
|
alogt = log10(t)
|
|
kk = 0
|
|
ist=1
|
|
j=ini
|
|
dirt = 0.
|
|
c dr for iron from Arnaud and Raymond
|
|
if ( j.lt.115 .or. j.gt.139 ) go to 2901
|
|
kk = kk + 1
|
|
do 20 n = 1,4
|
|
dirt = dirt + dcfe(kk,n)*expo(-defe(kk,n)/ekt)
|
|
20 continue
|
|
dirt = dirt*tmr
|
|
go to 101
|
|
2901 continue
|
|
c aldrovandi and Pequignot rates
|
|
c The reference is Aldrovandi, S. M. V. and P\'equignot, D. (1973)
|
|
c A&A, 25, 137
|
|
c
|
|
c ap is the density dependent correction to dr from Raymond
|
|
c
|
|
enn = xpx**(0.2)
|
|
ap = 1./(1.+cdd(j)*enn)
|
|
dirt = adi(j)*ap*cc1*expo(-t0(j)/t)
|
|
& *(1.+bdi(j)*expo(-t1(j)/t))
|
|
$ /(t*sqrt(t))
|
|
dirtemp=0.
|
|
c storey dr rates
|
|
if ((j.ne.(istorey(ist)-1)).or.(t.gt.6.).or.(ist.gt.12))
|
|
$ go to 101
|
|
dirtemp=
|
|
$ (1.e-12)*(rstorey(1,ist)/t+rstorey(2,ist)
|
|
$ +t*(rstorey(3,ist)+t*rstorey(4,ist)))*t3s2
|
|
$ *expo(-rstorey(5,ist)/t)
|
|
dirt=dirt+dirtemp
|
|
ist=ist+1
|
|
101 continue
|
|
c
|
|
c pseudo cross-section
|
|
c
|
|
if(iatom.le.20) then
|
|
gp=gli(iont+1)
|
|
if(gp.le.0) gp=1.
|
|
gg=gp/gli(iont)
|
|
else if(iatom.le.26) then
|
|
gp=gfe(iont+1)
|
|
if(gp.le.0) gp=1.
|
|
gg=gp/gfe(iont)
|
|
else if(iatom.le.28) then
|
|
gp=gni(iont+1)
|
|
if(gp.le.0) gp=1.
|
|
gg=gp/gni(iont)
|
|
end if
|
|
frq0=cons*uu(iont,iatom)
|
|
frq1=1.1*frq0
|
|
delfr=frq1-frq0
|
|
fra=0.5*(frq0+frq1)
|
|
x=1.-expo(-4.79928e-11*delfr/temp)
|
|
sig0=dirt*8.47272e24*gg*sqrt(temp)/fra**2/x
|
|
return
|
|
end
|
|
c
|
|
c
|
|
C
|
|
C
|
|
C ************************************************************************
|
|
C
|
|
c
|
|
function expo(x)
|
|
c ================
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
crit=80.
|
|
if(x.lt.-crit) x=-crit
|
|
if(x.gt.crit) x=crit
|
|
expo=exp(x)
|
|
return
|
|
end
|
|
c
|
|
C
|
|
C
|
|
C ************************************************************************
|
|
C
|
|
c
|
|
SUBROUTINE IRC(N,T,IC,RNO,SE)
|
|
c =============================
|
|
c
|
|
C IRC CALCULATES THE EXCITATION RATE, SE [cm**3/s], FOR IONIZATION
|
|
C OF HYDROGEN ATOMS FROM STATE N DUE TO ELECTRON COLLISIONS, ASSUMING
|
|
C THE CONTINUUM STARTS AT LEVEL RNO.
|
|
C REF. JOHNSON (1972)
|
|
C
|
|
c a modification of Tim Kallman's XSTAR routine
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
IF(IC.NE.1) THEN ! MAB
|
|
CALL SZIRC(N,T,IC,rno,SE)
|
|
RETURN
|
|
END IF
|
|
c
|
|
XO=1.-N*N/RNO/RNO
|
|
YN=XO*157803./(T*N*N)
|
|
IF(N.LE.1) THEN
|
|
AN=1.9603*N*(1.133/3./XO**3-0.4059/4./XO**4+0.07014/5./XO**5)
|
|
BN=2./3.*N*N/XO*(3.+2./XO-0.603/XO/XO)
|
|
RN=0.45
|
|
ELSE IF(N.EQ.2) THEN
|
|
AN=1.9603*N*(1.0785/3./XO**3-0.2319/4./XO**4+0.02947/5./XO**5)
|
|
BN=(4.-18.63/N+36.24/(N*N)-28.09/(N*N*N))/N
|
|
BN=2./3.*N*N/XO*(3.+2./XO+BN/XO/XO)
|
|
RN=0.653
|
|
ELSE
|
|
G0=(0.9935+0.2328/N-0.1296/(N*N))/3./XO**3
|
|
G1=-(0.6282-0.5598/N+0.5299/(N*N))/(N*4.)/XO**4
|
|
G2=(0.3887-1.181/N+1.470/(N*N))/(N*N*5.)/XO**5
|
|
AN=1.9603*N*(G0+G1+G2)
|
|
BN=(4.-18.63/N+36.24/(N*N)-28.09/(N*N*N))/N
|
|
BN=(3.+2./XO+BN/XO/XO)*2.*N*N/3./XO
|
|
RN=1.94*N**(-1.57)
|
|
END IF
|
|
C
|
|
RN=RN*XO
|
|
ZN=RN+YN
|
|
CALL EXPINX(YN,EY)
|
|
CALL EXPINX(ZN,EZ)
|
|
SE=AN*(EY/YN/YN-EXP(-RN)*EZ/ZN/ZN)
|
|
EY=1.+1./YN-EY*(2./YN+1.)
|
|
EZ=EXP(-RN)*(1.+1./ZN-EZ*(2./ZN+1.))
|
|
SE=SE+(BN-AN*LOG(2.*N*N/XO))*(EY-EZ)
|
|
SE=SE*SQRT(T)*YN*YN*N*N*1.095E-10/XO
|
|
RETURN
|
|
END
|
|
c
|
|
C
|
|
C
|
|
C ************************************************************************
|
|
C
|
|
c
|
|
subroutine szirc(nn,T,ic,rno,cii)
|
|
c =================================
|
|
c
|
|
c calculates electron impact ionizition rates from semiempirical
|
|
c formula (eq.35) from Sampson & Zhang (1988, ApJ 335, 516)
|
|
c
|
|
c a modification of Tim Kallman's XSTAR routine
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
real abethe(11), hbethe(11), rbethe(11)
|
|
DATA(abethe(i),i=1,11)/ 1.134, 0.603, 0.412, 0.313, 0.252,
|
|
1 0.211, 0.181, 0.159, 0.142, 0.128, 1.307 /
|
|
DATA(hbethe(i),i=1,11)/ 1.48, 3.64, 5.93, 8.32, 10.75, 12.90,
|
|
1 15.05, 17.20, 19.35, 21.50, 2.15 /
|
|
DATA(rbethe(i),i=1,11)/ 2.20, 1.90, 1.73, 1.65, 1.60, 1.56,
|
|
1 1.54, 1.52, 1.52, 1.52, 1.52 /
|
|
rz=ic
|
|
Boltz=1.38066e-16
|
|
Eion=2.179874e-11
|
|
const=4.6513e-3
|
|
C
|
|
rc=float(int(rno))
|
|
if (nn.lt.11) then
|
|
an=abethe(nn)
|
|
hn=hbethe(nn)
|
|
rrn=rbethe(nn)
|
|
else
|
|
an=abethe(11)/float(nn)
|
|
hn=hbethe(11)*float(nn)
|
|
rrn=rbethe(11)
|
|
endif
|
|
tt= T*Boltz
|
|
rn=float(nn)
|
|
yy=rz*rz*Eion/tt*(1./rn/rn-1./rc/rc-.25*(1./(rc-1.)**2-
|
|
c 1./rc/rc))
|
|
call eint(yy,e1,e2,e3)
|
|
cii=const*sqrt(tt)*(rn**5)/(rz**4)*an*yy* (
|
|
1 e1/rn-(exp(-yy)-yy*e3)/(3.*rn)+(yy*e2-2.*yy*e1+exp(-yy))*
|
|
2 3.*hn/rn/(3.-rrn)+(e1-e2)*3.36*yy)
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ************************************************************************
|
|
C
|
|
c
|
|
subroutine expinx(x,em1)
|
|
c ========================
|
|
c
|
|
c expinx is a subroutine to calculate the value of e1, the exponential
|
|
c integral or em1=x*expo(x)*e1 at the point x. the polynomial
|
|
c expressions that are used come from abromowitz and stegen
|
|
c
|
|
c a modification of Tim Kallman's XSTAR routine
|
|
c
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
if(x.gt.1.) then
|
|
b1=9.5733223454
|
|
b2=25.6329561486
|
|
b3=21.0996530827
|
|
b4=3.9584969228
|
|
c1=8.5733287401
|
|
c2=18.0590169730
|
|
c3=8.6347608925
|
|
c4=0.2677737343
|
|
em1=x**4+c1*x**3+c2*x*x+c3*x+c4
|
|
em1=em1/(x**4+b1*x*x*x+b2*x*x+b3*x+b4)
|
|
else
|
|
a0=-0.57721566
|
|
a1=0.99999193
|
|
a2=-0.24991055
|
|
a3=0.05519968
|
|
a4=-0.00976004
|
|
a5=0.00107857
|
|
if(x.gt.0) then
|
|
e1= a0+a1*x+a2*x*x+a3*x**3+a4*x**4+a5*x**5-log(x)
|
|
else
|
|
e1=-a0+a1*x+a2*x*x+a3*x**3+a4*x**4+a5*x**5-log(-x)
|
|
end if
|
|
em1=e1*x*expo(x)
|
|
end if
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ************************************************************************
|
|
C
|
|
subroutine eint(t,e1,e2,e3)
|
|
c ============================
|
|
c
|
|
c returns the values of the exponential integral function of order
|
|
c 1, 2, and 3
|
|
c
|
|
c a modification of Tim Kallman's XSTAR routine
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
e1=0.
|
|
e2=0.
|
|
e3=0.
|
|
call expinx(t,ss)
|
|
e1=ss/t/expo(t)
|
|
e2=exp(-t)-t*e1
|
|
e3=0.5*(expo(-t)-t*e2)
|
|
return
|
|
end
|
|
c
|
|
c
|
|
C
|
|
C
|
|
C ************************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE COMSET
|
|
C =================
|
|
C
|
|
C sets up necessary parameters for treating the Compton scattering
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
dimension freqi(mfreq)
|
|
parameter (xcon=8.0935d-21,YCON=1.68638E-10)
|
|
parameter (t15=1.d-15)
|
|
common/auxcbc/cden1m(mdepth),cden10(mdepth),
|
|
* cden2m(mdepth),cden20(mdepth)
|
|
common/comgfs/gfm(mfreq,mdeptc),gfp(mfreq,mdeptc)
|
|
DIMENSION PL(MDEPTH),PLM(MDEPTH)
|
|
C
|
|
if(icompt.le.0) go to 100
|
|
nmuc=3
|
|
nsti=0
|
|
nedd=3
|
|
C
|
|
C frequency-dependent universal parameters
|
|
C
|
|
do ij=1,nfreq
|
|
cder10(ij)=0.
|
|
cder1p(ij)=0.
|
|
cder1m(ij)=0.
|
|
cder20(ij)=0.
|
|
cder2p(ij)=0.
|
|
cder2m(ij)=0.
|
|
iji=nfreq-kij(ij)+1
|
|
ijorig(iji)=ij
|
|
freqi(iji)=freq(ij)
|
|
fr=freqi(iji)
|
|
bnus(iji)=two*xcon*fr/(bn*(fr*1.d-15)**3)
|
|
end do
|
|
C
|
|
ij=1
|
|
dlnfr(ij)=log(freqi(ij+1)/freqi(ij))
|
|
do ij=2,nfreq-1
|
|
dlnfr(ij)=log(freqi(ij+1)/freqi(ij))
|
|
delp=dlnfr(ij)
|
|
delm=dlnfr(ij-1)
|
|
del0=delp+delm
|
|
cd0=two/del0
|
|
cder2m(ij)=cd0/delm
|
|
cder2p(ij)=cd0/delp
|
|
cder20(ij)=-cder2m(ij)-cder2p(ij)
|
|
end do
|
|
c
|
|
do ij=1,nfreq-1
|
|
frj0=freqi(ij)
|
|
frjp=freqi(ij+1)
|
|
frz=sqrt(frj0*frjp)
|
|
do id=1,nd
|
|
C to avoid over/underflow problems:
|
|
IF(HK*FRJ0/TEMP(ID).LT.200.) THEN
|
|
fjb0=un/(exp(hk*frj0/temp(id))-un)
|
|
ELSE
|
|
fjb0=0.
|
|
ENDIF
|
|
IF(HK*FRJP/TEMP(ID).LT.200.) THEN
|
|
fjbp=un/(exp(hk*frjp/temp(id))-un)
|
|
ELSE
|
|
fjbp=0.
|
|
ENDIF
|
|
fjz0=fjb0*(bn*(frj0*t15)**3)
|
|
fjzp=fjbp*(bn*(frjp*t15)**3)
|
|
if(ichcoo.eq.0) then
|
|
zj0=hk*frz/temp(id)
|
|
dfjz=fjz0-fjzp
|
|
dfjb=fjb0-fjbp
|
|
fzz=un+fjbp-3./zj0
|
|
aa=dfjz*dfjb
|
|
bb=dfjz*fzz+fjzp*dfjb
|
|
cc=fjzp*fzz-dfjz/dlnfr(ij)/zj0
|
|
else
|
|
e2=ycon*temp(id)
|
|
zxxp=xcon*frjp*(un+fjbp)-3.*e2
|
|
zxx0=xcon*frj0*(un+fjb0)-3.*e2
|
|
dzxx=zxx0-zxxp
|
|
dfjb=fjb0-fjbp
|
|
dfjz=fjz0-fjzp
|
|
aa=dfjz*dzxx
|
|
bb=dfjz*zxxp+fjzp*dzxx
|
|
cc=fjzp*zxxp-e2*dfjz/dlnfr(ij)
|
|
end if
|
|
CXXX to avoid division by zero:
|
|
if(abs(aa).eq.0.and.abs(bb).eq.0.) then
|
|
xx1=0.
|
|
elseif(abs(aa).lt.1.e-7*abs(bb)) then
|
|
xx1=-cc/bb
|
|
else
|
|
dd=bb*bb-4.*aa*cc
|
|
if(dd.lt.0.) dd=0.
|
|
dd=sqrt(dd)
|
|
xx1=(dd-bb)*half/aa
|
|
if(ichcoo.gt.0) then
|
|
xx2=-(dd+bb)*half/aa
|
|
dxx1=abs(xx1-half)
|
|
dxx2=abs(xx2-half)
|
|
if(dxx2.lt.dxx1) xx1=xx2
|
|
if((xx1.gt.1.).or.(xx1.lt.0.)) xx1=half
|
|
end if
|
|
end if
|
|
delj(ij,id)=xx1
|
|
end do
|
|
end do
|
|
c
|
|
C angle-dependent universal parameters
|
|
C
|
|
call angset
|
|
c
|
|
C frequency-dependent universal parameters
|
|
C
|
|
100 continue
|
|
do ij=1,nfreq
|
|
c
|
|
c first-order expression
|
|
c
|
|
if(knish.eq.0) then
|
|
SIGEC(IJ)=SIGE*(un-two*freq(ij)*xcon)
|
|
c
|
|
C Use full Klein-Nishina cross section (Rybicki & Lightman 1975):
|
|
c
|
|
else
|
|
xf=xcon*freq(ij)
|
|
if(xf.lt.1.d-1) then
|
|
SIGEC(IJ)=SIGE*(1.-xf*(2.-xf*(26./5.-xf*(13.3
|
|
* -xf*(1144./35.-xf*(544./7.-xf*(3784./21.
|
|
* -xf*(6148./15.-xf*(151552./165.
|
|
* -xf*111872./55.)))))))))
|
|
else if(xf.gt.1.d3) then
|
|
SIGEC(IJ)=SIGE*3./8./xf*(log(2.*xf)+0.5)
|
|
else
|
|
SIGEC(IJ)=SIGE*0.75*((1.+xf)/xf**3*(2.*xf*(1.+xf)/
|
|
* (1.+2.*xf)-log(1.+2.*xf))+0.5*log(1.+2.*xf)/xf
|
|
* -(1.+3.*xf)/(1.+2.*xf)**2)
|
|
endif
|
|
endif
|
|
end do
|
|
c
|
|
if(icompt.le.0) return
|
|
IJ=1
|
|
IJO=ijorig(ij)
|
|
DO ID=1,ND
|
|
PLM(ID)=BNUE(IJO)/(EXP(HK/Temp(ID)*FREQ(IJO))-UN)
|
|
END DO
|
|
C
|
|
DO IJ=2,NFREQ
|
|
IJO=ijorig(ij)
|
|
DO ID=1,ND
|
|
C to avoid over/underflow problems:
|
|
IF(HK/TEMP(ID)*FREQ(IJO).LT.200.) THEN
|
|
PL(ID)=BNUE(IJO)/(EXP(HK/temp(ID)*FREQ(IJO))-UN)
|
|
ELSE
|
|
PL(ID)=PLM(ID)
|
|
ENDIF
|
|
PLM(ID)=PL(ID)
|
|
END DO
|
|
END DO
|
|
C
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ******************************************************************
|
|
C
|
|
c
|
|
c
|
|
subroutine angset
|
|
c =================
|
|
c
|
|
c sets up angles points and angle-dependent quantities for treating
|
|
c the Compton scattering
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
parameter(three=3.d0, five=5.d0, zero=0.d0, tr16=3.d0/16.d0)
|
|
dimension amu0(mmuc),wtmu0(mmuc)
|
|
c
|
|
c amu=cos(angle between line of sight and normal to slab) grid and
|
|
c gauss-legendre integration weights for the interval mu=[0,1]
|
|
c
|
|
call gauleg(zero,un,amu0,wtmu0,nmuc,mmuc)
|
|
c
|
|
do i=1,nmuc
|
|
amuc(i)=-amu0(nmuc-i+1)
|
|
amuc(i+nmuc)=amu0(i)
|
|
wtmuc(i)=wtmu0(nmuc-i+1)
|
|
wtmuc(i+nmuc)=wtmu0(i)
|
|
end do
|
|
nmuc=2*nmuc
|
|
c
|
|
do i=1,nmuc
|
|
amuc1(i)=amuc(i)*wtmuc(i)
|
|
amuc2(i)=amuc(i)*amuc(i)*wtmuc(i)
|
|
amuc3(i)=amuc(i)*amuc(i)*amuc(i)*wtmuc(i)
|
|
a1=amuc(i)
|
|
a2=a1*a1
|
|
a3=a1*a2
|
|
do i1=1,nmuc
|
|
b1=amuc(i1)
|
|
b2=b1*b1
|
|
b3=b1*b2
|
|
trw=tr16*wtmuc(i1)
|
|
calph(i,i1)=(three*a2*b2-a2-b2+three)*trw
|
|
cbeta(i,i1)=(five*(a1*b1+a3*b3)-three*(a3*b1+a1*b3))*trw
|
|
cgamm(i,i1)=a1*b1*trw
|
|
end do
|
|
end do
|
|
c
|
|
return
|
|
end
|
|
|
|
C
|
|
C
|
|
C *********************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE GAULEG(X1,X2,X,W,N,M)
|
|
C ================================
|
|
C
|
|
C set up angle points
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
DIMENSION X(M),W(M)
|
|
PARAMETER (EPS=3.D-14,half=0.5d0,pi=3.141592654d0,quart=0.25,
|
|
* un=1.d0, two=2.d0)
|
|
c
|
|
N2=(N+1)/2
|
|
XM=HALF*(X2+X1)
|
|
XL=HALF*(X2-X1)
|
|
DO I=1,N2
|
|
Z=COS(PI*(I-quart)/(N+half))
|
|
1 CONTINUE
|
|
P1=1.D0
|
|
P2=0.D0
|
|
DO J=1,N
|
|
P3=P2
|
|
P2=P1
|
|
P1=((TWO*J-UN)*Z*P2-(J-UN)*P3)/J
|
|
END DO
|
|
PP=N*(Z*P1-P2)/(Z*Z-un)
|
|
Z1=Z
|
|
Z=Z1-P1/PP
|
|
IF(ABS(Z-Z1).GT.EPS) GO TO 1
|
|
X(I)=XM-XL*Z
|
|
X(N+1-I)=XM+XL*Z
|
|
W(I)=TWO*XL/((UN-Z*Z)*PP*PP)
|
|
W(N+1-I)=W(I)
|
|
END DO
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
subroutine rte_sc(dtau,st0,rup,rdown,amu0,ri,ali)
|
|
C ================================================
|
|
C
|
|
C formal solver of the radiative transfer equation
|
|
C for one frequency, angle, and for completely known source function;
|
|
c using short characteristics
|
|
C
|
|
c
|
|
c input: dtau - optical depth increments Delta tau
|
|
c st0 - total source function
|
|
c rup - intensity at the upper boundary (id=1)
|
|
c rdown- intensity at the lower boundary (id=nd)
|
|
c amu0 - cosine of angle of propagation (wrt. the normal)
|
|
c output: ri - radiation intensity
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
dimension dtau(mdepth),st0(mdepth),ri(mdepth),ali(mdepth),
|
|
* dtx1(mdepth),dtx2(mdepth),dtx0(mdepth)
|
|
C
|
|
do id=1,nd-1
|
|
dtx1(id)=exp(-dtau(id))
|
|
dtx2(id)=(un-dtx1(id))/dtau(id)
|
|
dtx0(id)=un-dtx2(id)
|
|
end do
|
|
c
|
|
c incoming intensity
|
|
c
|
|
if(amu0.lt.0) then
|
|
c
|
|
ID=1
|
|
ri(id)=rup
|
|
do id=1,nd-1
|
|
ri(id+1)=ri(id)*dtx1(id)+st0(id)*(dtx2(id)-dtx1(id))+
|
|
* st0(id+1)*dtx0(id)
|
|
ali(id+1)=dtx0(id)
|
|
end do
|
|
ali(1)=0.
|
|
C
|
|
c outgoing intensity
|
|
c
|
|
else
|
|
c
|
|
ri(nd)=rdown
|
|
do id=nd-1,1,-1
|
|
ri(id)=ri(id+1)*dtx1(id)+st0(id)*dtx0(id)+
|
|
* st0(id+1)*(dtx2(id)-dtx1(id))
|
|
ali(id)=dtx0(id)
|
|
end do
|
|
ali(nd)=0.
|
|
end if
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
subroutine rtesol(dtau,st0,rup,rdown,amu0,ri,ali)
|
|
C ================================================
|
|
C
|
|
C formal solver of the radiative transfer equation
|
|
C for one frequency, angle, and for completely known source function;
|
|
c by the Discontinuous Finite Element method
|
|
c Castor, Dykema, Klein, 1992, ApJ 387, 561.
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
parameter (one=1.d0)
|
|
dimension dtau(mdepth),st0(mdepth),ri(mdepth),ali(mdepth),
|
|
* rim(mdepth),rip(mdepth),aim(mdepth),aip(mdepth)
|
|
c
|
|
c incoming intensity
|
|
c
|
|
if(amu0.lt.0) then
|
|
c
|
|
id=1
|
|
rip(id)=rup
|
|
dt0=dtau(id)
|
|
dtaup1=dt0+one
|
|
dtau2=dt0*dt0
|
|
bb=two*dtaup1
|
|
cc=dt0*dtaup1
|
|
aa=dtau2+bb
|
|
rim(id)=(aa*rip(id)-cc*st0(id)+dt0*st0(id+1))/bb
|
|
do id=1,nd-1
|
|
dt0=dtau(id)
|
|
dtaup1=dt0+one
|
|
dtau2=dt0*dt0
|
|
bb=two*dtaup1
|
|
cc=dt0*dtaup1
|
|
aa=dtau2+bb
|
|
rim(id+1)=(two*rim(id)+dt0*st0(id)+cc*st0(id+1))/aa
|
|
rip(id)=(bb*rim(id)+cc*st0(id)-dt0*st0(id+1))/aa
|
|
aim(id+1)=cc/aa
|
|
aip(id)=(cc+bb*aim(id))/aa
|
|
enddo
|
|
do id=2,nd-1
|
|
dtt=un/(dtau(id-1)+dtau(id))
|
|
ri(id)=(rim(id)*dtau(id)+rip(id)*dtau(id-1))*dtt
|
|
ali(id)=(aim(id)*dtau(id)+aip(id)*dtau(id-1))*dtt
|
|
enddo
|
|
ri(1)=rip(1)
|
|
ri(nd)=rim(nd)
|
|
ali(1)=aim(1)
|
|
ali(nd)=aim(nd)
|
|
C
|
|
c outgoing intensity
|
|
c
|
|
else
|
|
c
|
|
rip(nd)=rdown
|
|
id=nd-1
|
|
dt0=dtau(id)
|
|
dtaup1=dt0+one
|
|
dtau2=dt0*dt0
|
|
bb=two*dtaup1
|
|
cc=dt0*dtaup1
|
|
aa=dtau2+bb
|
|
rim(id+1)=(aa*rip(id+1)-cc*st0(id+1)+dt0*st0(id))/bb
|
|
do id=nd-1,1,-1
|
|
dt0=dtau(id)
|
|
dtaup1=dt0+one
|
|
dtau2=dt0*dt0
|
|
bb=two*dtaup1
|
|
cc=dt0*dtaup1
|
|
aa=dtau2+bb
|
|
rim(id)=(two*rim(id+1)+dt0*st0(id+1)+cc*st0(id))/aa
|
|
rip(id+1)=(bb*rim(id+1)+cc*st0(id+1)-dt0*st0(id))/aa
|
|
aim(id)=cc/aa
|
|
aip(id+1)=(cc+bb*aim(id+1))/aa
|
|
enddo
|
|
do id=2,nd-1
|
|
dtt=un/(dtau(id-1)+dtau(id))
|
|
ri(id)=(rim(id)*dtau(id-1)+rip(id)*dtau(id))*dtt
|
|
ali(id)=(aim(id)*dtau(id-1)+aip(id)*dtau(id))*dtt
|
|
enddo
|
|
ri(1)=rim(1)
|
|
ri(nd)=rip(nd)
|
|
ali(1)=aim(1)
|
|
ali(nd)=aim(nd)
|
|
end if
|
|
c
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
subroutine rtefe2(dtau,s,rup,rdown,ri)
|
|
C ======================================
|
|
C
|
|
C formal solver of the radiative transfer equation
|
|
C for one frequency, angle, and for completely known source function;
|
|
c original Feautrier (second-order) scheme
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
parameter (one=1.d0)
|
|
dimension dtau(mdepth),s(mdepth),ri(mdepth)
|
|
dimension a(mdepth),b(mdepth),c(mdepth),d(mdepth),
|
|
* f(mdepth),v(mdepth),z(mdepth)
|
|
c
|
|
c set up the global tridiagonal matrix
|
|
c
|
|
c upper boundary condition
|
|
c
|
|
id=1
|
|
cc=two/dtau(id)
|
|
c(id)=cc/dtau(id)
|
|
b(id)=one+cc+c(id)
|
|
a(id)=0.
|
|
v(id)=s(id)+cc*rup
|
|
c
|
|
c normal depth points
|
|
c
|
|
do id=2,nd-1
|
|
dtinv=two/(dtau(id-1)+dtau(id))
|
|
a(id)=dtinv/dtau(id-1)
|
|
c(id)=dtinv/dtau(id)
|
|
b(id)=one+a(id)+c(id)
|
|
v(id)=s(id)
|
|
enddo
|
|
c
|
|
c lower boundary condition
|
|
c
|
|
id=nd
|
|
aa=two/dtau(id-1)
|
|
a(id)=aa/dtau(id-1)
|
|
b(id)=one+aa+a(id)
|
|
if(rdown.eq.0.) b(id)=one+a(id)
|
|
c(id)=0.
|
|
v(id)=s(id)+aa*rdown
|
|
c
|
|
c ---------------------------------------------------
|
|
c solution by elimination
|
|
c 1. forward sweep
|
|
c
|
|
f(1)=(b(1)-c(1))/c(1)
|
|
d(1)=one/(one+f(1))
|
|
z(1)=v(1)/b(1)
|
|
c
|
|
c ii) normal depth points
|
|
c
|
|
do id=2,nd-1
|
|
f(id)=(b(id)-a(id)-c(id)+a(id)*f(id-1)*d(id-1))/c(id)
|
|
d(id)=one/(one+f(id))
|
|
z(id)=(v(id)+a(id)*z(id-1))*d(id)/c(id)
|
|
enddo
|
|
c
|
|
c iii) upper boundary
|
|
c
|
|
id=nd
|
|
z(id)=(v(id)+a(id)*z(id-1))/(b(id)-a(id)*d(id-1))
|
|
c
|
|
c 2. backward elimination
|
|
c
|
|
ri(nd)=z(nd)
|
|
do id=nd-1,1,-1
|
|
ri(id)=ri(id+1)*d(id)+z(id)
|
|
enddo
|
|
c
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE RTECF0(IJ)
|
|
C =====================
|
|
C
|
|
C Setup of the individual matrix elements of matrices A,B,C, E,U,V,
|
|
C and alpha, beta, gamma, for solving the coupled transfer equation
|
|
C with Compton scattering
|
|
C Evaluation for a given frequency point IJ.
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
COMMON/OPTDPT/DT(MDEPTH)
|
|
PARAMETER (XCON=8.0935D-21,YCON=1.68638E-10)
|
|
COMMON/AUXRTE/
|
|
* COMA(MDEPTH),COMB(MDEPTH),COMC(MDEPTH),VL(MDEPTH),
|
|
* COME(MDEPTH),U(MDEPTH),V(MDEPTH),BS(MDEPTH),
|
|
* AL(MDEPTH),BE(MDEPTH),GA(MDEPTH)
|
|
common/auxcbc/cden1m(mdepth),cden10(mdepth),
|
|
* cden2m(mdepth),cden20(mdepth)
|
|
c
|
|
IJI=NFREQ-KIJ(IJ)+1
|
|
FR=FREQ(IJ)
|
|
frp=freq(ijorig(iji+1))
|
|
frm=freq(ijorig(iji-1))
|
|
xcomp=fr*xcon
|
|
C
|
|
C optical depth scale
|
|
C
|
|
do id=1,nd-1
|
|
dt(id)=deldmz(id)*(absot(id+1)+absot(id))
|
|
end do
|
|
C
|
|
C depth discretization matrices
|
|
C
|
|
c 1. upper boundary
|
|
c
|
|
id=1
|
|
dtp1=dt(id)
|
|
bb0=un/dtp1
|
|
bb1=two*bb0*bb0
|
|
be(id)=bb0*two*fh(ij)+bb1*fak(ij,id)
|
|
ga(id)=bb1*fak(ij,id+1)
|
|
sext=two*bb0*hextrd(ij)
|
|
c
|
|
c 2. normal depth point
|
|
c
|
|
do id=2,nd-1
|
|
dtm1=dtp1
|
|
dtp1=dt(id)
|
|
dt0=two/(dtm1+dtp1)
|
|
al(id)=fak(ij,id-1)/dtm1*dt0
|
|
ga(id)=fak(ij,id+1)/dtp1*dt0
|
|
be(id)=fak(ij,id)*dt0*(un/dtm1+un/dtp1)
|
|
end do
|
|
c
|
|
c 3. lower boundary
|
|
c
|
|
id=nd
|
|
c
|
|
c stellar atmospheric
|
|
c
|
|
IF(IDISK.EQ.0.OR.IFZ0.LT.0) then
|
|
IF(IBC.EQ.0) THEN
|
|
be(ID)=fak(ij,id)/DTP1+HALF
|
|
al(ID)=fak(ij,id-1)/DTP1
|
|
ELSE IF(IBC.LT.4) THEN
|
|
B=UN/DTP1
|
|
A=TWO*B*B
|
|
be(id)=B*TWO*fhd(ij)+a*fak(ij,id)
|
|
al(id)=a*fak(ij,id-1)
|
|
ELSE
|
|
B=UN/DTP1
|
|
A=TWO*B*B
|
|
be(id)=b+a*fak(ij,id)
|
|
al(id)=a*fak(ij,id-1)
|
|
END IF
|
|
c
|
|
c accretion disk - symmetric boundary
|
|
c
|
|
ELSE
|
|
bb0=un/dtp1
|
|
bb1=two*bb0*bb0
|
|
B=TWO/DTP1
|
|
be(id)=bb1*fak(ij,id)
|
|
al(id)=bb1*fak(ij,id-1)
|
|
END IF
|
|
C
|
|
C scattering matrices
|
|
C
|
|
do id=1,nd
|
|
scat0=elec(id)*sige
|
|
sa0=emis1(id)/abso1(id)
|
|
ss0=scat0/abso1(id)
|
|
epsnu=(abso1(id)-scat1(id))/abso1(id)
|
|
x0=ss0
|
|
e2=ycon*temp(id)+0.7*xcomp*xcomp
|
|
e1=xcomp-3.*e2-0.7*xcomp*xcomp
|
|
e0=1.-xcomp-4.2*xcomp*xcomp
|
|
coma(id)=0.
|
|
comc(id)=0.
|
|
u(id)=0.
|
|
v(id)=0.
|
|
vl(id)=sa0
|
|
if(id.eq.1.and.iwinbl.lt.0) vl(id)=sa0+sext
|
|
bs(id)=0.
|
|
if(iji.eq.1) then
|
|
comc(id)=0.
|
|
comb(id)=x0*(un-2.*xcomp)
|
|
else if(iji.lt.nfreq) then
|
|
del0=two/(dlnfr(iji)+dlnfr(iji-1))
|
|
cder1p(iji)=(un-delj(iji,id))*del0
|
|
cder1m(iji)=-delj(iji-1,id)*del0
|
|
if(ichcoo.eq.0) then
|
|
cder10(iji)=-cder1m(iji)-cder1p(iji)
|
|
coma(id)=x0*(e1*cder1m(iji)+e2*cder2m(iji))
|
|
comb(id)=x0*(e0+e1*cder10(iji)+e2*cder20(iji))
|
|
comc(id)=x0*(e1*cder1p(iji)+e2*cder2p(iji))
|
|
x0=ss0*bnus(iji)
|
|
IF(ICOMST.EQ.0) X0=0.
|
|
come(id)=x0*(cder10(iji)-un)
|
|
u(id)=x0*cder1m(iji)
|
|
v(id)=x0*cder1p(iji)
|
|
bs(id)=come(id)*rad(iji,id)+
|
|
* u(id)*rad(iji-1,id)+v(id)*rad(iji+1,id)
|
|
else
|
|
cder10(iji)=-del0*(un-delj(iji-1,id)-delj(iji,id))
|
|
zxxp=xcon*frp+0.5*bnus(iji+1)*rad(iji+1,id)-3.*e2
|
|
zxx0=xcomp+0.5*bnus(iji)*rad(iji,id)-3.*e2
|
|
zxxm=xcon*frm+0.5*bnus(iji-1)*rad(iji-1,id)-3.*e2
|
|
zxxp12=((un-delj(iji,id))*zxxp+delj(iji,id)*zxx0)*del0
|
|
zxxm12=((un-delj(iji-1,id))*zxx0+delj(iji-1,id)*zxxm)*
|
|
* del0
|
|
coma(id)=x0*(-delj(iji-1,id)*zxxm12+e2*cder2m(iji))
|
|
comc(id)=x0*((un-delj(iji,id))*zxxp12+e2*cder2p(iji))
|
|
comb(id)=x0*(delj(iji,id)*zxxp12-(un-delj(iji-1,id))*
|
|
* zxxm12+e2*cder20(iji))-epsnu+1
|
|
end if
|
|
else
|
|
dlt=delj(iji-1,id)
|
|
zj1=exp(-hk*freq(ij)/temp(id))
|
|
zj2=exp(-hk*freq(ij+1)/temp(id))
|
|
if(ichcoo.eq.0) then
|
|
zj0=un/(hk*sqrt(freq(ij)*freq(ij+1))/temp(id))
|
|
zxx=un-3.*zj0+(un-dlt)*zj1+dlt*zj2
|
|
comb(id)=zj0/dlnfr(iji-1)+(un-dlt)*zxx
|
|
coma(id)=-zj0/dlnfr(iji-1)+dlt*zxx
|
|
else
|
|
zxx0=xcomp*(un+zj1)-3.*e2
|
|
zxxm=xcon*frm*(un+zj2)-3.*e2
|
|
zxx=(un-dlt)*zxx0+dlt*zxxm
|
|
comb(id)=e2/dlnfr(iji-1)+(un-dlt)*zxx
|
|
coma(id)=-e2/dlnfr(iji-1)+dlt*zxx
|
|
end if
|
|
vl(id)=0.
|
|
if(icomde.ne.0) then
|
|
al(id)=0.
|
|
be(id)=-un
|
|
ga(id)=0.
|
|
end if
|
|
end if
|
|
if(icomde.eq.0) then
|
|
coma(id)=0.
|
|
comc(id)=0.
|
|
comb(id)=x0*(un-2.*xcomp)
|
|
end if
|
|
end do
|
|
C
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE INICOM
|
|
C =================
|
|
C
|
|
C Auxiliary procedure for INILAM
|
|
C initialization of g-factors for the Compton scattering
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
common/comgfs/gfm(mfreq,mdeptc),gfp(mfreq,mdeptc)
|
|
DIMENSION PL(MDEPTH),PLM(MDEPTH)
|
|
C
|
|
IJ=1
|
|
IJO=ijorig(ij)
|
|
DO ID=1,ND
|
|
PLM(ID)=BNUE(IJO)/(EXP(HKT1(ID)*FREQ(IJO))-UN)
|
|
END DO
|
|
C
|
|
DO IJ=2,NFREQ
|
|
IJO=ijorig(ij)
|
|
DO ID=1,ND
|
|
PL(ID)=BNUE(IJO)/(EXP(HKT1(ID)*FREQ(IJO))-UN)
|
|
PLM(ID)=PL(ID)
|
|
END DO
|
|
END DO
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE RTECOM
|
|
C =================
|
|
C
|
|
C Solution of the radiative transfer equation with Compton scattering
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
COMMON/OPTDPT/DT(MDEPTH)
|
|
COMMON/AUXRTE/
|
|
* COMA(MDEPTH),COMB(MDEPTH),COMC(MDEPTH),VL(MDEPTH),
|
|
* COME(MDEPTH),U(MDEPTH),V(MDEPTH),BS(MDEPTH),
|
|
* AL(MDEPTH),BE(MDEPTH),GA(MDEPTH)
|
|
common/comgfs/gfm(mfreq,mdeptc),gfp(mfreq,mdeptc)
|
|
dimension aa(mdepth),bb(mdepth),cc(mdepth),
|
|
* d(mdepth),f(mdepth),z(mdepth),rd(mdepth)
|
|
c
|
|
PRD0=0.
|
|
DO ID=1,ND
|
|
PRADT(ID)=0.
|
|
END DO
|
|
c
|
|
c ---------------------------------------------
|
|
c "1st formal solution" to update Eddington factors
|
|
c ---------------------------------------------
|
|
c
|
|
if(ncfor1.gt.0) then
|
|
do iform=1,ncfor1
|
|
ij0=1
|
|
if(icombc.gt.0) ij0=2
|
|
DO IJ=ij0,NFREQ
|
|
CALL OPACF1(IJ)
|
|
CALL RTECF1(IJ)
|
|
END DO
|
|
if(icombc.gt.0) then
|
|
ij=1
|
|
iji=nfreq
|
|
call rtecf0(ij)
|
|
do id=1,nd
|
|
rad(iji,id)=-rad(iji-1,id)*coma(id)/(comb(id)+bs(id))
|
|
end do
|
|
end if
|
|
end do
|
|
end if
|
|
c
|
|
c -----------------------------------------------
|
|
c coupled solution for the frequency derivatives terms
|
|
c -----------------------------------------------
|
|
c
|
|
c fully coupled treatment - traditional formulation
|
|
c
|
|
if(ncfull.gt.0) then
|
|
do icfull=1,ncfull
|
|
call rtecmc
|
|
c
|
|
c iterative treatment of the derivative terms
|
|
c
|
|
if(ncitot.gt.0) then
|
|
do ictot=1,ncitot
|
|
c
|
|
if(nccoup.gt.0) then
|
|
do iccoup=1,nccoup
|
|
do ij=1,nfreq
|
|
ijo=ijorig(ij)
|
|
fr=freq(ijo)
|
|
call opacf1(ijo)
|
|
call rtecf0(ijo)
|
|
do id=1,nd
|
|
comb(id)=comb(id)+bs(id)
|
|
bb(id)=be(id)+un-comb(id)
|
|
aa(id)=al(id)
|
|
cc(id)=ga(id)
|
|
vl(id)=vl(id)+
|
|
* (coma(id)*gfm(ij,id)+
|
|
* comc(id)*gfp(ij,id))*rad(ij,id)
|
|
end do
|
|
c
|
|
c ----------------
|
|
c forward sweep
|
|
c ----------------
|
|
c
|
|
c i) upper boundary
|
|
c
|
|
f(1)=(bb(1)-cc(1))/cc(1)
|
|
d(1)=un/(un+f(1))
|
|
z(1)=vl(1)/bb(1)
|
|
c
|
|
c ii) normal depth points
|
|
c
|
|
do id=2,nd-1
|
|
f(id)=(bb(id)-aa(id)-cc(id)+
|
|
* aa(id)*f(id-1)*d(id-1))/cc(id)
|
|
d(id)=un/(un+f(id))
|
|
z(id)=(vl(id)+aa(id)*z(id-1))*d(id)/cc(id)
|
|
end do
|
|
c
|
|
c iii) lower boundary
|
|
c
|
|
id=nd
|
|
z(id)=(vl(id)+aa(id)*z(id-1))/(bb(id)-aa(id)*d(id-1))
|
|
c
|
|
c --------------------
|
|
c backward elimination
|
|
c --------------------
|
|
c
|
|
rd(nd)=z(nd)
|
|
do id=nd-1,1,-1
|
|
rd(id)=rd(id+1)*d(id)+z(id)
|
|
end do
|
|
c
|
|
do id=1,nd
|
|
rad(ij,id)=rd(id)
|
|
end do
|
|
end do
|
|
end do
|
|
end if
|
|
c
|
|
c ---------------------------------------------
|
|
c "2nd formal solution" to update Eddington factors
|
|
c ---------------------------------------------
|
|
c
|
|
if(ncfor2.gt.0) then
|
|
do iform=1,ncfor2
|
|
ij0=nfreq
|
|
if(icombc.gt.0) ij0=nfreq-1
|
|
PRD0=0.
|
|
DO ID=1,ND
|
|
PRADT(ID)=0.
|
|
END DO
|
|
DO IJ=1,ij0
|
|
ijo=ijorig(ij)
|
|
CALL OPACF1(IJo)
|
|
CALL RTECF1(IJo)
|
|
END DO
|
|
PRD0=PRD0*PCK
|
|
DO ID=1,ND
|
|
PRADT(ID)=PRADT(ID)*PCK
|
|
END DO
|
|
if(icombc.gt.0) then
|
|
ij=1
|
|
iji=nfreq
|
|
call rtecf0(ij)
|
|
do id=1,nd
|
|
radcm(iji,id)=-radcm(iji-1,id)*coma(id)/
|
|
* (comb(id)+bs(id))
|
|
end do
|
|
flux(1)=radcm(iji,1)*fh(2)
|
|
end if
|
|
c
|
|
do id=1,nd
|
|
DO IJ=1,NFREQ
|
|
rad(ij,id)=radcm(ij,id)
|
|
END DO
|
|
end do
|
|
c
|
|
end do
|
|
end if
|
|
c
|
|
end do
|
|
end if
|
|
c
|
|
c ---------------------------------------------
|
|
c end of formal solutions
|
|
c ---------------------------------------------
|
|
c
|
|
end do
|
|
end if
|
|
return
|
|
end
|
|
c
|
|
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
C
|
|
|
|
SUBROUTINE RTECF1(IJ)
|
|
C =====================
|
|
C
|
|
C Solution of the radiative transfer equation with Compton scattering
|
|
C for one frequency (assuming the radiation intensity in i
|
|
C other frequencies is given
|
|
C solution is done for individual angles, and new Eddington factors
|
|
C are determined
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
PARAMETER (SIXTH=UN/6.D0,
|
|
* THIRD=UN/3.D0,
|
|
* TWOTHR=TWO/3.D0)
|
|
COMMON/OPTDPT/DT(MDEPTH)
|
|
COMMON/SURFEX/EXTJ(MFREQ),EXTH(MFREQ)
|
|
COMMON/EXTINT/WANGLE,EXTIN(MFREQ)
|
|
COMMON/AUXRTE/
|
|
* COMA(MDEPTH),COMB(MDEPTH),COMC(MDEPTH),VL(MDEPTH),
|
|
* COME(MDEPTH),U(MDEPTH),V(MDEPTH),BS(MDEPTH),
|
|
* AL(MDEPTH),BE(MDEPTH),GA(MDEPTH)
|
|
common/comgfs/gfm(mfreq,mdeptc),gfp(mfreq,mdeptc)
|
|
DIMENSION RI(MDEPTH),RDH(MDEPTH),RDK(MDEPTH),RDN(MDEPTH),
|
|
* DTAU(MDEPTH),ST0(MDEPTH),RDWN(MMUC),
|
|
* ali(mdepth)
|
|
DIMENSION AANU(MDEPTH),DDD(MDEPTH),FKK(MDEPTH),ali0(mdepth),
|
|
* SS0(MDEPTH),
|
|
* AAA(MDEPTH),BBB(MDEPTH),CCC(MDEPTH),EEE(MDEPTH),
|
|
* ZZZ(MDEPTH),ALRH(MDEPTH),ALRM(MDEPTH),ALRP(MDEPTH),
|
|
* ss0c(mdepth)
|
|
C
|
|
IF(IJ.EQ.1) THEN
|
|
if(icompt.gt.0.and.icombc.gt.0) then
|
|
IJE=IJEX(IJ)
|
|
DO ID=1,ND
|
|
rad1(id)=rad(nfreq,id)
|
|
fak1(id)=0.333333
|
|
ali1(id)=0.
|
|
if(ije.gt.0) then
|
|
RADEX(IJE,ID)=rad1(id)
|
|
FAKEX(IJE,ID)=fak1(id)
|
|
END IF
|
|
END DO
|
|
return
|
|
end if
|
|
END IF
|
|
C
|
|
WW=W(IJ)
|
|
IJI=NFREQ-KIJ(IJ)+1
|
|
FR=FREQ(IJ)
|
|
CALL RTECF0(IJ)
|
|
c
|
|
do id=1,nd
|
|
rad1(id)=0.
|
|
ali1(id)=0.
|
|
rdh(id)=0.
|
|
rdk(id)=0.
|
|
rdn(id)=0.
|
|
st0(id)=vl(id)+(comb(id)+bs(id))*rad(iji,id)
|
|
ss0(id)=0.
|
|
end do
|
|
rdh1=0.
|
|
rdhd=0.
|
|
c
|
|
if(iji.gt.1) then
|
|
do id=1,nd
|
|
st0(id)=st0(id)+coma(id)*rad(iji-1,id)
|
|
end do
|
|
end if
|
|
if(iji.lt.nfreq) then
|
|
do id=1,nd
|
|
st0(id)=st0(id)+comc(id)*rad(iji+1,id)
|
|
end do
|
|
end if
|
|
c
|
|
if(idisk.eq.0.or.ifz0.lt.0) then
|
|
FR15=FR*1.D-15
|
|
BNU=BN*FR15*FR15*FR15
|
|
PLAND=BNU/(EXP(HK*FR/TEMP(ND))-UN)*RRDIL
|
|
DPLAN=BNU/(EXP(HK*FR/TEMP(ND-1))-UN)*RRDIL
|
|
IF(TEMPBD.GT.0.) THEN
|
|
PLAND=BNU/(EXP(HK*FR/TEMPBD)-UN)*RRDIL
|
|
DPLAN=BNU/(EXP(HK*FR/TEMPBD)-UN)*RRDIL
|
|
ENDIF
|
|
DPLAN=(PLAND-DPLAN)/DT(ND-1)
|
|
end if
|
|
c
|
|
if(icomrt.eq.0) then
|
|
c
|
|
c ========================================================
|
|
c Formal angle-dependent solution done by Feautrier scheme
|
|
c ========================================================
|
|
c
|
|
c loop over angles points
|
|
c
|
|
do i=1,nmu
|
|
do id=1,nd-1
|
|
dtau(id)=dt(id)/amu(i)
|
|
end do
|
|
c
|
|
c boundary conditions
|
|
c
|
|
rup=0.
|
|
rdown=0.
|
|
rup=extint(ij,i)
|
|
if(idisk.eq.0.or.ifz0.lt.0) rdown=pland+amu(i)*dplan
|
|
c
|
|
c solution of the transfer equation
|
|
c
|
|
call rtefe2(dtau,st0,rup,rdown,ri)
|
|
ttau=0.
|
|
do id=1,nd
|
|
riid=wtmu(i)*ri(id)
|
|
rad1(id)=rad1(id)+riid
|
|
rdk(id)=rdk(id)+amu(i)*amu(i)*riid
|
|
end do
|
|
rdh1=rdh1+amu(i)*wtmu(i)*ri(1)
|
|
rdhd=rdhd+amu(i)*wtmu(i)*ri(nd)
|
|
end do
|
|
rdh1=rdh1-half*hextrd(ij)
|
|
c
|
|
c ----------------------
|
|
c end of the loop over angle points
|
|
c
|
|
c ===========================================
|
|
c Formal angle-dependent solution done by DFE
|
|
c ===========================================
|
|
c
|
|
else
|
|
c
|
|
c loop over angle points
|
|
c ----------------------
|
|
c
|
|
do i=1,nmuc
|
|
do id=1,nd-1
|
|
dtau(id)=dt(id)/abs(amuc(i))
|
|
end do
|
|
c
|
|
c boundary conditions
|
|
c
|
|
rup=0.
|
|
rdown=0.
|
|
if(amuc(i).lt.0.) rup=extint(ij,i)
|
|
C
|
|
C diffusion approximation for semi-infinite atmospheres
|
|
C
|
|
if(idisk.eq.0.or.ifz0.lt.0) rdown=pland+amuc(i)*dplan
|
|
c
|
|
c the case of finite slab - irradiation of the back side
|
|
c
|
|
if(amuc(i).gt.0.) rdown=rdwn(nmuc-i+1)
|
|
c
|
|
c solution of the transfer equation
|
|
c
|
|
call rtesol(dtau,st0,rup,rdown,amuc(i),ri,ali)
|
|
ttau=0.
|
|
do id=1,nd
|
|
riid=ri(id)*half
|
|
rad1(id)=rad1(id)+wtmuc(i)*riid
|
|
ali1(id)=ali1(id)+wtmuc(i)*ali(id)
|
|
rdh(id)=rdh(id)+amuc1(i)*riid
|
|
rdk(id)=rdk(id)+amuc2(i)*riid
|
|
rdn(id)=rdn(id)+amuc3(i)*riid
|
|
end do
|
|
rdwn(i)=ri(nd)
|
|
if(amuc(i).gt.0.) rdh1=rdh1+amuc1(i)*ri(1)*half
|
|
rdhd=rdhd+abs(amuc1(i))*ri(nd)*half
|
|
end do
|
|
c
|
|
c ----------------------
|
|
c end of the loop over angle points
|
|
c
|
|
end if
|
|
c
|
|
do id=1,nd
|
|
fak1(id)=fak(ij,id)
|
|
radk(ij,id)=rdk(id)
|
|
if(icomve .gt. 0) then
|
|
fkk(id)=rdk(id)/rad1(id)
|
|
else
|
|
fkk(id)=fak(ij,id)
|
|
endif
|
|
ss0(id)=0.
|
|
end do
|
|
if(icomve.gt.0) then
|
|
do id=1,nd
|
|
fak(ij,id)=rdk(id)/rad1(id)
|
|
fak1(id)=fak(ij,id)
|
|
fkk(id)=fak(ij,id)
|
|
end do
|
|
end if
|
|
if(rad1(1).gt.0.) then
|
|
flux(ij)=rdh1
|
|
fhd(ij)=rdhd/rad1(nd)
|
|
end if
|
|
c
|
|
ah=rdh1
|
|
if(iwinbl.lt.0) ah=ah+half*hextrd(ij)
|
|
aj=rad1(1)
|
|
fh(ij)=ah/aj
|
|
C
|
|
C ********************
|
|
C
|
|
C Again solution of the transfer equation, now with Eddington
|
|
C FKK and FH determined above, to insure strict consistency of the
|
|
C radiation field and Eddington factors
|
|
C
|
|
C Upper boundary condition
|
|
C
|
|
U0=0.
|
|
QQ0=0.
|
|
US0=0.
|
|
TAUMIN=ABSO1(1)*DEDM1
|
|
NMU=3
|
|
DO I=1,NMU
|
|
IF(IWINBL.EQ.0.AND.WANGLE.EQ.0.) THEN
|
|
C
|
|
C allowance for non-zero optical depth at the first depth point
|
|
C
|
|
TAMM=TAUMIN/AMU(I)
|
|
EX=EXP(-TAMM)
|
|
P0=UN-EX
|
|
QQ0=QQ0+P0*AMU(I)*WTMU(I)
|
|
U0=U0+EX*WTMU(I)
|
|
if(tamm.gt.0.) US0=US0+P0/TAMM*WTMU(I)
|
|
END IF
|
|
END DO
|
|
ID=1
|
|
DTP1=DT(ID)
|
|
IF(MOD(ISPLIN,3).EQ.0) THEN
|
|
B=DTP1*HALF
|
|
C=0.
|
|
ELSE
|
|
B=DTP1*THIRD
|
|
C=B*HALF
|
|
END IF
|
|
BQ=UN/(B+QQ0)
|
|
CQ=C*BQ
|
|
BBB(ID)=(FKK(ID)/DTP1+FH(IJ)+B)*BQ+SS0(ID)
|
|
CCC(ID)=(FKK(ID+1)/DTP1)*BQ-CQ*(UN+SS0(ID+1))
|
|
ZZZ(ID)=UN/BBB(ID)
|
|
VLL=ST0(ID)+CQ*ST0(ID+1)
|
|
c IF(IWINBL.LT.0) VLL=VLL+TWO*HEXTRD(IJ)/DTP1
|
|
AANU(ID)=VLL*ZZZ(ID)
|
|
DDD(ID)=CCC(ID)*ZZZ(ID)
|
|
IF(ISPLIN.GT.2) FFF=BBB(ID)/CCC(ID)-UN
|
|
C
|
|
C Normal depth point
|
|
C
|
|
DO ID=2,ND-1
|
|
DTM1=DTP1
|
|
DTP1=DT(ID)
|
|
DT0=TWO/(DTP1+DTM1)
|
|
ALP=UN/DTM1*DT0
|
|
GAM=UN/DTP1*DT0
|
|
IF(MOD(ISPLIN,3).EQ.0) THEN
|
|
A=0.
|
|
C=0.
|
|
ELSE IF(ISPLIN.EQ.1) THEN
|
|
A=DTM1*DT0*SIXTH
|
|
C=DTP1*DT0*SIXTH
|
|
ELSE
|
|
A=(UN-HALF*DTP1*DTP1*ALP)*SIXTH
|
|
C=(UN-HALF*DTM1*DTM1*GAM)*SIXTH
|
|
END IF
|
|
AAA(ID)=ALP*FKK(ID-1)-A*(UN+SS0(ID-1))
|
|
CCC(ID)=GAM*FKK(ID+1)-C*(UN+SS0(ID+1))
|
|
BBB(ID)=(ALP+GAM)*FKK(ID)+(UN-A-C)*(UN+SS0(ID))
|
|
VLL=A*ST0(ID-1)+C*ST0(ID+1)+(UN-A-C)*ST0(ID)
|
|
AANU(ID)=VLL+AAA(ID)*AANU(ID-1)
|
|
IF(ISPLIN.LE.2) THEN
|
|
ZZZ(ID)=UN/(BBB(ID)-AAA(ID)*DDD(ID-1))
|
|
DDD(ID)=CCC(ID)*ZZZ(ID)
|
|
AANU(ID)=AANU(ID)*ZZZ(ID)
|
|
ELSE
|
|
SUM=-AAA(ID)+BBB(ID)-CCC(ID)
|
|
FFF=(SUM+AAA(ID)*FFF*DDD(ID-1))/CCC(ID)
|
|
DDD(ID)=UN/(UN+FFF)
|
|
AANU(ID)=AANU(ID)*DDD(ID)/CCC(ID)
|
|
ENDIF
|
|
END DO
|
|
C
|
|
C Lower boundary condition
|
|
C
|
|
ID=ND
|
|
c
|
|
c stellar atmospheric
|
|
c
|
|
IF(IDISK.EQ.0.OR.IFZ0.LT.0) then
|
|
IF(IBC.EQ.0) THEN
|
|
BBB(ID)=FKK(ID)/DTP1+HALF
|
|
AAA(ID)=FKK(ID-1)/DTP1
|
|
VLL=HALF*PLAND+THIRD*DPLAN
|
|
ELSE IF(IBC.LT.4) THEN
|
|
B=UN/DTP1
|
|
A=TWO*B*B
|
|
BBB(ID)=UN+SS0(ID)+B*TWO*FHD(IJ)+A*FKK(ID)
|
|
AAA(ID)=A*FKK(ID-1)
|
|
VLL=ST0(ID)+B*(PLAND+TWOTHR*DPLAN)
|
|
ELSE
|
|
B=UN/DTP1
|
|
A=TWO*B*B
|
|
BBB(ID)=B+A*FKK(ID)
|
|
AAA(ID)=A*FKK(ID-1)
|
|
VLL=B*(PLAND+TWOTHR*DPLAN)
|
|
END IF
|
|
c
|
|
c accretion disk - symmetric boundary
|
|
c
|
|
ELSE
|
|
B=TWO/DTP1
|
|
BBB(ID)=FKK(ID)/DTP1*B+UN+SS0(ND)
|
|
AAA(ID)=FKK(ID-1)/DTP1*B
|
|
VLL=ST0(ID)
|
|
END IF
|
|
C
|
|
EEE(ND)=AAA(ID)/BBB(ID)
|
|
ZZZ(ID)=UN/(BBB(ID)-AAA(ID)*DDD(ID-1))
|
|
RAD1(ID)=(VLL+AAA(ID)*AANU(ID-1))*ZZZ(ID)
|
|
FAK1(ID)=FKK(ND)
|
|
ALRH(ID)=ZZZ(ID)
|
|
frd=bbb(nd)*rad1(nd)-aaa(nd)*rad1(nd-1)
|
|
frd1=(bbb(nd)-un)*rad1(nd)-aaa(nd)*rad1(nd-1)
|
|
C
|
|
C Backsolution
|
|
C
|
|
DO ID=ND-1,1,-1
|
|
EEE(ID)=AAA(ID)/(BBB(ID)-CCC(ID)*EEE(ID+1))
|
|
RAD1(ID)=AANU(ID)+DDD(ID)*RAD1(ID+1)
|
|
FAK1(ID)=FKK(ID)
|
|
C write(42,642),ij,id,rad1(id),st0(id),fak1(id)
|
|
ALRH(ID)=ZZZ(ID)/(UN-DDD(ID)*EEE(ID+1))
|
|
ALRM(ID)=0
|
|
ALRP(ID)=0
|
|
END DO
|
|
c
|
|
C evaluate approximate Lambda operator
|
|
C
|
|
C a) Rybicki-Hummer Lambda^star operator (diagonal)
|
|
C (for JALI = 1)
|
|
C
|
|
DO ID=1,ND
|
|
ALIM1(ID)=0.
|
|
ALIP1(ID)=0.
|
|
END DO
|
|
IF(JALI.EQ.1) THEN
|
|
DO ID=1,ND
|
|
ALI1(ID)=ALRH(ID)
|
|
END DO
|
|
c
|
|
IF(IBC.EQ.0) THEN
|
|
ali1(nd-1)=rad1(nd-1)/st0(nd-1)
|
|
ali1(nd)=rad1(nd)/st0(nd)
|
|
END IF
|
|
C
|
|
C for IFALI>5:
|
|
C tridiagonal Rybicki-Hummer operator (off-diagonal terms)
|
|
C
|
|
IF(IFALI.GE.6) THEN
|
|
ALIP1(1)=ALRH(2)*DDD(1)
|
|
DO ID=2,ND-1
|
|
ALIM1(ID)=ALRH(ID-1)*EEE(ID)
|
|
ALIP1(ID)=ALRH(ID+1)*DDD(ID)
|
|
END DO
|
|
ALIM1(ND)=ALRH(ND-1)*EEE(ND)
|
|
IF(IBC.EQ.0) THEN
|
|
ALIM1(nd)=0.
|
|
ALIM1(nd-1)=0.
|
|
ALIP1(nd)=0.
|
|
ALIP1(nd-1)=0.
|
|
END IF
|
|
END IF
|
|
c
|
|
C b) diagonal Olson-Kunasz Lambda^star operator,
|
|
C (for JALI = 2)
|
|
C
|
|
ELSE IF(JALI.EQ.2) THEN
|
|
DO ID=1,ND-1
|
|
ALI0(ID)=0.
|
|
DO I=1,NMU
|
|
DIV=DT(ID)/AMU(I)
|
|
ALI0(ID)=ALI0(ID)+(UN-EXP(-DIV))/DIV*WTMU(I)
|
|
END DO
|
|
END DO
|
|
DO ID=2,ND-1
|
|
ALI1(ID)=UN-HALF*(ALI0(ID)+ALI0(ID-1))
|
|
END DO
|
|
ALI1(1)=UN-HALF*(ALI0(1)+US0)
|
|
ALI1(ND)=UN-ALI0(ND-1)
|
|
ali1(nd-1)=rad1(nd-1)/st0(nd-1)
|
|
ali1(nd)=rad1(nd)/st0(nd)
|
|
END IF
|
|
C
|
|
C correction of Lambda^star for scattering
|
|
C
|
|
IF(ILMCOR.EQ.1) THEN
|
|
DO ID=1,ND
|
|
ALI1(ID)=ALI1(ID)*(UN+SS0(ID))
|
|
ALIM1(ID)=ALIM1(ID)*(UN+SS0(ID))
|
|
ALIP1(ID)=ALIP1(ID)*(UN+SS0(ID))
|
|
END DO
|
|
ELSE IF(ILMCOR.EQ.3) THEN
|
|
DO ID=1,ND
|
|
ALI1(ID)=ALI1(ID)/(UN+SS0C(ID)*ALI1(ID))
|
|
ALIM1(ID)=ALIM1(ID)/(UN+SS0C(ID)*ALIM1(ID))
|
|
ALIP1(ID)=ALIP1(ID)/(UN+SS0C(ID)*ALIP1(ID))
|
|
END DO
|
|
END IF
|
|
C
|
|
DO ID=1,ND
|
|
radcm(iji,id)=rad1(id)
|
|
END DO
|
|
C
|
|
C radiation pressure
|
|
C
|
|
if(.not.lskip(1,IJ))
|
|
* PRD0=PRD0+ABSO1(1)*WW*(RAD1(1)*FH(IJ)-HEXTRD(IJ))
|
|
DO ID=1,ND
|
|
if(.not.lskip(ID,IJ))
|
|
* PRADT(ID)=PRADT(ID)+RAD1(ID)*FAK1(ID)*WW
|
|
PRADA(ID)=PRADA(ID)+RAD1(ID)*FAK1(ID)*WW
|
|
END DO
|
|
c
|
|
if(chmax.ge.1.91e-3.and.chmax.le.2.03e-3) then
|
|
tauij=taumin
|
|
do id=1,nd
|
|
if(id.gt.1) tauij=tauij+dt(id-1)
|
|
write(97,697) ij,id,tauij,rad1(id),st0(id)/(un+ss0(id)),
|
|
* st0(id),un+ss0(id),ali1(id)
|
|
end do
|
|
697 format(2i4,1p6e12.4)
|
|
end if
|
|
c
|
|
do id=1,nd
|
|
fak(ij,id)=fak1(id)
|
|
end do
|
|
C
|
|
C store quantities for explicit (linearized) frequencies
|
|
C
|
|
IF(IJEX(IJ).LE.0) RETURN
|
|
IJE=IJEX(IJ)
|
|
DO ID=1,ND
|
|
RADEX(IJE,ID)=RAD1(ID)
|
|
FAKEX(IJE,ID)=FAK1(ID)
|
|
END DO
|
|
c
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE RTECMC
|
|
C =================
|
|
C
|
|
C Solution of the radiative transfer equation with Compton scattering
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
COMMON/AUXRTE/
|
|
* COMA(MDEPTH),COMB(MDEPTH),COMC(MDEPTH),VL(MDEPTH),
|
|
* COME(MDEPTH),U(MDEPTH),V(MDEPTH),BS(MDEPTH),
|
|
* AL(MDEPTH),BE(MDEPTH),GA(MDEPTH)
|
|
common/comgfs/gfm(mfreq,mdeptc),gfp(mfreq,mdeptc)
|
|
DIMENSION BB(MDEPTC,MDEPTC+1),AA(MDEPTC),CC(MDEPTC),
|
|
* Z(MFREQ,MDEPTC),D(MFREQ,MDEPTC,MDEPTC),
|
|
* FF(MDEPTC,MDEPTC),ZZ(MDEPTC),
|
|
* drad(mfreq,mdeptc)
|
|
c
|
|
nsti=1
|
|
if(icomst.gt.1) nsti=icomst
|
|
do isti=1,nsti
|
|
DO IJ=1,NFREQ
|
|
IJO=ijorig(ij)
|
|
FR=FREQ(IJO)
|
|
CALL OPACF1(IJO)
|
|
CALL RTECF0(IJO)
|
|
do id=1,nd
|
|
do id1=1,nd
|
|
bb(id,id1)=0.
|
|
end do
|
|
end do
|
|
id=1
|
|
bb(id,id)=be(id)
|
|
bb(id,id+1)=-ga(id)
|
|
do id=2,nd-1
|
|
bb(id,id)=be(id)
|
|
bb(id,id-1)=-al(id)
|
|
bb(id,id+1)=-ga(id)
|
|
end do
|
|
id=nd
|
|
bb(id,id)=be(id)
|
|
bb(id,id-1)=-al(id)
|
|
do id=1,nd
|
|
if(ichcoo.eq.0) then
|
|
bb(id,id)=bb(id,id)+un-comb(id)-bs(id)
|
|
else
|
|
bb(id,id)=bb(id,id)+un-comb(id)
|
|
end if
|
|
aa(id)=coma(id)
|
|
cc(id)=comc(id)
|
|
end do
|
|
c
|
|
c linearization matrices for stimulated emission
|
|
c
|
|
if(isti.gt.1) then
|
|
do id=1,nd
|
|
vl(id)=vl(id)-bb(id,id)*rad(ij,id)
|
|
bb(id,id)=bb(id,id)-come(id)*rad(ij,id)
|
|
aa(id)=aa(id)+u(id)*rad(ij,id)
|
|
cc(id)=cc(id)+v(id)*rad(ij,id)
|
|
end do
|
|
id=1
|
|
vl(id)=vl(id)-bb(id,id+1)*rad(ij,id+1)
|
|
do id=2,nd-1
|
|
vl(id)=vl(id)-bb(id,id-1)*rad(ij,id-1)-
|
|
* bb(id,id+1)*rad(ij,id+1)
|
|
end do
|
|
id=nd
|
|
vl(id)=vl(id)-bb(id,id-1)*rad(ij,id-1)
|
|
if(ij.gt.1) then
|
|
do id=1,nd
|
|
vl(id)=vl(id)+aa(id)*rad(ij-1,id)
|
|
end do
|
|
end if
|
|
if(ij.lt.nfreq) then
|
|
do id=1,nd
|
|
vl(id)=vl(id)+cc(id)*rad(ij+1,id)
|
|
end do
|
|
end if
|
|
end if
|
|
c
|
|
c forward sweep of the grand matrix
|
|
c
|
|
if(ij.eq.1) then
|
|
call matinv(bb,nd,mdepth)
|
|
do id=1,nd
|
|
sum=0.
|
|
do id1=1,nd
|
|
d(ij,id,id1)=bb(id,id1)*cc(id1)
|
|
sum=sum+bb(id,id1)*vl(id1)
|
|
end do
|
|
z(ij,id)=sum
|
|
end do
|
|
c
|
|
else
|
|
do id=1,nd
|
|
do id1=1,nd
|
|
ff(id,id1)=bb(id,id1)-aa(id)*d(ij-1,id,id1)
|
|
end do
|
|
end do
|
|
call matinv(ff,nd,mdepth)
|
|
do id=1,nd
|
|
do id1=1,nd
|
|
d(ij,id,id1)=ff(id,id1)*cc(id1)
|
|
end do
|
|
end do
|
|
do id=1,nd
|
|
zz(id)=vl(id)+aa(id)*z(ij-1,id)
|
|
end do
|
|
do id=1,nd
|
|
sum=0.
|
|
do id1=1,nd
|
|
sum=sum+ff(id,id1)*zz(id1)
|
|
end do
|
|
z(ij,id)=sum
|
|
end do
|
|
end if
|
|
END DO
|
|
c
|
|
c ----------------------------------
|
|
c backward sweep of the grand matrix
|
|
c ----------------------------------
|
|
c
|
|
if(isti.eq.1) then
|
|
ij=nfreq
|
|
do id=1,nd
|
|
rad(ij,id)=z(ij,id)
|
|
end do
|
|
c
|
|
DO IJ=NFREQ-1,1,-1
|
|
do id=1,nd
|
|
sum=0.
|
|
do id1=1,nd
|
|
sum=sum+d(ij,id,id1)*rad(ij+1,id1)
|
|
end do
|
|
rad(ij,id)=z(ij,id)+sum
|
|
end do
|
|
END DO
|
|
end if
|
|
c
|
|
if(isti.gt.1) then
|
|
ij=nfreq
|
|
do id=1,nd
|
|
drad(ij,id)=z(ij,id)
|
|
end do
|
|
c
|
|
DO IJ=NFREQ-1,1,-1
|
|
do id=1,nd
|
|
sum=0.
|
|
do id1=1,nd
|
|
sum=sum+d(ij,id,id1)*drad(ij+1,id1)
|
|
end do
|
|
drad(ij,id)=z(ij,id)+sum
|
|
end do
|
|
END DO
|
|
c
|
|
chmax=0.
|
|
DO IJ=1,NFREQ
|
|
dri=0.
|
|
do id=1,nd
|
|
if(rad(ij,id).gt.0.) dr=drad(ij,id)/rad(ij,id)
|
|
if(abs(dr).gt.chmax) chmax=abs(dr)
|
|
if(abs(dr).gt.dri) dri=abs(dr)
|
|
if(dr.gt.9.) dr=9.
|
|
if(dr.lt.-0.999) dr=-0.999
|
|
rad(ij,id)=rad(ij,id)*(un+dr)
|
|
end do
|
|
END DO
|
|
end if
|
|
c
|
|
if(isti.gt.1.and.chmax.lt.1.e-3) go to 100
|
|
end do
|
|
c
|
|
100 continue
|
|
return
|
|
end
|
|
|
|
C
|
|
C
|
|
C ************************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE COMPT0(IJ,ID,ab,compa,compb,compc,compe,comps,compd)
|
|
C ===============================================================
|
|
C
|
|
c auxiliary quantities for the Compton scattering source function
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
PARAMETER (XCON=8.0935D-21,YCON=1.68638E-10)
|
|
common/auxcbc/cden1m(mdepth),cden10(mdepth),
|
|
* cden2m(mdepth),cden20(mdepth)
|
|
c
|
|
IJI=NFREQ-KIJ(IJ)+1
|
|
if(iji.eq.1) then
|
|
compa=0.
|
|
compb=0.
|
|
compc=0.
|
|
compd=0.
|
|
compe=0.
|
|
comps=0.
|
|
return
|
|
end if
|
|
c
|
|
FR=FREQ(IJ)
|
|
frp=freq(ijorig(iji+1))
|
|
frm=freq(ijorig(iji-1))
|
|
xcomp=fr*xcon
|
|
e2=ycon*temp(id)
|
|
e1=xcomp-3.*e2
|
|
c
|
|
del0=two/(dlnfr(iji)+dlnfr(iji-1))
|
|
cder1p(iji)=(un-delj(iji,id))*del0
|
|
cder1m(iji)=-delj(iji-1,id)*del0
|
|
cder10(iji)=-del0*(un-delj(iji-1,id)-delj(iji,id))
|
|
ss0=elec(id)*sige/ab
|
|
if(ichcoo.eq.0) then
|
|
cder10(iji)=-cder1m(iji)-cder1p(iji)
|
|
compa=ss0*(e1*cder1m(iji)+e2*cder2m(iji))
|
|
compb=ss0*(un-xcomp-sigec(ij)/sige+e1*cder10(iji)+
|
|
* e2*cder20(iji))
|
|
compc=ss0*(e1*cder1p(iji)+e2*cder2p(iji))
|
|
else
|
|
epsnu=(ab-elec(id)*sigec(ij))/ab
|
|
zxxp=xcon*frp+0.5*bnus(iji+1)*rad(iji+1,id)-3.*e2
|
|
zxx0=xcomp+0.5*bnus(iji)*rad(iji,id)-3.*e2
|
|
zxxm=xcon*frm+0.5*bnus(iji-1)*rad(iji-1,id)-3.*e2
|
|
zxxp12=((un-delj(iji,id))*zxxp+delj(iji,id)*zxx0)*del0
|
|
zxxm12=((un-delj(iji-1,id))*zxx0+delj(iji-1,id)*zxxm)*del0
|
|
compa=ss0*(-delj(iji-1,id)*zxxm12+e2*cder2m(iji))
|
|
compc=ss0*((un-delj(iji,id))*zxxp12+e2*cder2p(iji))
|
|
compb=ss0*(delj(iji,id)*zxxp12-(un-delj(iji-1,id))*zxxm12+
|
|
* e2*cder20(iji)-sigec(ij)/sige)-epsnu+1.
|
|
compe=0.
|
|
end if
|
|
compd=(-3.*cder10(iji)+cder20(iji))*rad(iji,id)
|
|
c
|
|
IF(ICOMDE.EQ.0) THEN
|
|
COMPA=0.
|
|
COMPC=0.
|
|
COMPB=0.
|
|
END IF
|
|
c
|
|
x0=ss0*bnus(iji)
|
|
if(icomst.eq.0) x0=0.
|
|
if(ichcoo.eq.0) then
|
|
compe=x0*(cder10(iji)-un)
|
|
compu=x0*cder1m(iji)
|
|
compv=x0*cder1p(iji)
|
|
cbs=compe*rad(iji,id)
|
|
compe=cbs
|
|
end if
|
|
comps=compb*rad(iji,id)
|
|
if(iji.gt.1) then
|
|
if(ichcoo.eq.0) cbs=cbs+compu*rad(iji-1,id)
|
|
comps=comps+compa*rad(iji-1,id)
|
|
compd=compd+(-3.*cder1m(iji)+cder2m(iji))*rad(iji-1,id)
|
|
end if
|
|
if(iji.lt.nfreq) then
|
|
if(ichcoo.eq.0) cbs=cbs+compv*rad(iji+1,id)
|
|
comps=comps+compc*rad(iji+1,id)
|
|
compd=compd+(-3.*cder1p(iji)+cder2p(iji))*rad(iji+1,id)
|
|
end if
|
|
if(ichcoo.eq.0) then
|
|
compb=compb+cbs
|
|
compa=compa+compu*rad(iji,id)
|
|
compc=compc+compv*rad(iji,id)
|
|
comps=comps+cbs*rad(iji,id)
|
|
end if
|
|
compd=compd*ss0*ycon
|
|
IF(ICOMDE.EQ.0) COMPD=0.
|
|
c
|
|
c a variant with ICOMPT=2 - no off-diagonal terms in intensity
|
|
c
|
|
if(icompt.eq.2) then
|
|
if(iji.gt.1) compb=compb+compa*rad(iji-1,id)
|
|
if(iji.lt.nfreq) compb=compb+compc*rad(iji+1,id)
|
|
compa=0.
|
|
compc=0.
|
|
else if(icompt.eq.3) then
|
|
compa=0.
|
|
compb=0.
|
|
compc=0.
|
|
end if
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE TAUFR1(IJ)
|
|
C =====================
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
COMMON/OPTDPT/DT(MDEPTH)
|
|
dimension ST0(MDEPTH),SS0(MDEPTH),ab0(mdepth),
|
|
* tau(mdepth),taus(mdepth)
|
|
c PARAMETER (TAUREF = 0.6666666666667)
|
|
PARAMETER (TAUREF = 1.)
|
|
PARAMETER (XCON=8.0935D-21,YCON=1.68638E-10)
|
|
C
|
|
FR=FREQ(IJ)
|
|
DO ID=1,ND
|
|
AB0(ID)=ABSO1(ID)
|
|
C put in a floor to avoid division by zero:
|
|
IF(AB0(ID)-SCAT1(ID).GT.1.D-100) THEN
|
|
ST0(ID)=EMIS1(ID)/(AB0(ID)-scat1(id))
|
|
ELSE
|
|
ST0(ID)=0.
|
|
ENDIF
|
|
if(st0(id).eq.0) st0(id)=1.d-20*scat1(id)
|
|
SS0(ID)=-SCAT1(ID)/AB0(ID)
|
|
END DO
|
|
C
|
|
id=1
|
|
TAUMIN=ABSO1(1)*DEDM1
|
|
tau(1)=taumin
|
|
C to avoid a negative square root:
|
|
taus(1)=sqrt(3.*ab0(id)*max(ab0(id)-scat1(id),0.d0))*DEDM1
|
|
C
|
|
IREF=1
|
|
IREFs=1
|
|
DO ID=1,ND-1
|
|
DT(ID)=DELDMZ(ID)*(ABSOT(ID+1)+ABSOT(ID))
|
|
tau(id+1)=tau(id)+dt(id)
|
|
C to avoid negative square root:
|
|
eps0=sqrt(ab0(id)*max(ab0(id)-scat1(id),0.d0))
|
|
eps1=sqrt(ab0(id+1)*max(ab0(id+1)-scat1(id+1),0.d0))
|
|
dts=deldm(id)*(eps0*dens1(id)+eps1*dens1(id+1))*sqrt(3.)
|
|
taus(id+1)=taus(id)+dts
|
|
IF(TAU(Id).LE.TAUREF.AND.TAU(Id+1).GT.TAUREF) IREF=Id
|
|
IF(TAUs(Id).LE.TAUREF.AND.TAUs(Id+1).GT.TAUREF) IREFs=Id
|
|
END DO
|
|
if(iref.eq.1.and.tau(nd).le.tauref) iref=nd
|
|
if(irefs.eq.1.and.taus(nd).le.tauref) irefs=nd
|
|
C
|
|
t0=1.
|
|
iref0=iref
|
|
iref=irefs
|
|
if(irefs.lt.nd) then
|
|
T0=LOG(TAUs(IREF+1)/TAUs(IREF))
|
|
X0=LOG(TAUs(IREF+1)/TAUREF)/T0
|
|
X1=LOG(TAUREF/TAUs(IREF))/T0
|
|
DMREF=EXP(LOG(DM(IREF))*X0+LOG(DM(IREF+1))*X1)
|
|
TREF=EXP(LOG(TEMP(IREF))*X0+LOG(TEMP(IREF+1))*X1)
|
|
abREF=EXP(LOG(ab0(IREF))*X0+LOG(ab0(IREF+1))*X1)
|
|
scREF=EXP(LOG(scat1(IREF))*X0+LOG(scat1(IREF+1))*X1)
|
|
STREF=EXP(LOG(ST0(IREF))*X0+LOG(ST0(IREF+1))*X1)
|
|
tauef=EXP(LOG(TAU(IREF))*X0+LOG(TAU(IREF+1))*X1)
|
|
else
|
|
x0=1.
|
|
x1=0.
|
|
dmref=dm(nd)
|
|
tref=temp(nd)
|
|
abref=ab0(nd)
|
|
scref=scat1(nd)
|
|
stref=st0(nd)
|
|
tauef=tau(nd)
|
|
end if
|
|
epref=(abref-scref)/abref
|
|
CX add if statement to avoid overflow:
|
|
IF(hk*fr/tref.lt.200.) then
|
|
bref=1.4743e-2*(fr*1.e-15)**3/(exp(hk*fr/tref)-1.)
|
|
ELSE
|
|
bref=0.
|
|
END IF
|
|
taur=tauef*tauef
|
|
if(tauef.gt.taur) taur=tauef
|
|
yref=4.*ycon*tref*taur
|
|
ALM=2.997925E18/FREQ(IJ)
|
|
r1=rad(nfreq-kij(ij)+1,1)
|
|
if(epref.ge.0) rb1=sqrt(epref)*bref
|
|
if(epref.ge.0) rs1=sqrt(epref)*stref
|
|
C
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE RTECMU
|
|
C =================
|
|
C
|
|
C Solution of the radiative transfer equation with Compton scattering
|
|
C for one frequency at a time (assuming the radiation intensity in other
|
|
C frequencies given), for a number of specific intensities (Gaussian)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
PARAMETER (XCON=8.0935D-21,YCON=1.68638E-10)
|
|
COMMON/OPTDPT/DT(MDEPTH)
|
|
COMMON/AUXRTE/
|
|
* COMA(MDEPTH),COMB(MDEPTH),COMC(MDEPTH),VL(MDEPTH),
|
|
* COME(MDEPTH),U(MDEPTH),V(MDEPTH),BS(MDEPTH),
|
|
* AL(MDEPTH),BE(MDEPTH),GA(MDEPTH)
|
|
DIMENSION RI(MDEPTH),DTAU(MDEPTH),ST0(MDEPTH),ali(mdepth)
|
|
c PARAMETER (MW=10, nw=10, zero=0.)
|
|
PARAMETER (MW=3, nw=3, zero=0.)
|
|
DIMENSION rmu(MW),b(MW),rintmu(mw),rintpo(mw),rdwn(2*mw),
|
|
* rmmu(2*MW),wmmu(2*mw)
|
|
DIMENSION RJTOT(MDEPTH),RJNUT(MDEPTH),RDJ1(MDEPTH),
|
|
* ABSCAD(MDEPTH),ABRAD(MDEPTH),PLTOT(MDEPTH),
|
|
* retot(mdepth),re1(mdepth),re2(mdepth),
|
|
* recm(mdepth),recm0(mdepth),scom(mdepth)
|
|
c
|
|
c set-up Gaussian angle points
|
|
c
|
|
call gauleg(zero,un,rmu,b,nw,mw)
|
|
do i=1,nw
|
|
rmmu(i)=-rmu(nw-i+1)
|
|
rmmu(i+nw)=rmu(i)
|
|
wmmu(i)=b(nw-i+1)
|
|
wmmu(i+nw)=b(i)
|
|
end do
|
|
C
|
|
SUMW=0.
|
|
DO ID=1,ND
|
|
RJTOT(ID)=0.
|
|
RJNUT(ID)=0.
|
|
ABSCAD(ID)=0.
|
|
ABPLAD(ID)=0.
|
|
ABRAD(ID)=0.
|
|
pltot(id)=0.
|
|
retot(id)=0.
|
|
re1(id)=0.
|
|
re2(id)=0.
|
|
recm(id)=0.
|
|
recm0(id)=0.
|
|
END DO
|
|
C
|
|
c --------------------- loop over frequencies
|
|
c
|
|
do ij=1,nfreq
|
|
IJI=NFREQ-KIJ(IJ)+1
|
|
FR=FREQ(IJ)
|
|
xcomp=xcon*fr
|
|
CALL OPACF1(IJ)
|
|
if(icompt.gt.0) then
|
|
CALL RTECF0(IJ)
|
|
else
|
|
do id=1,nd
|
|
if(id.lt.nd) dt(id)=deldmz(id)*(absot(id+1)+absot(id))
|
|
comb(id)=elec(id)*sige/abso1(id)
|
|
vl(id)=emis1(id)/abso1(id)
|
|
coma(id)=0.
|
|
comc(id)=0.
|
|
bs(id)=0.
|
|
end do
|
|
end if
|
|
c
|
|
SUMW=SUMW+W(IJ)
|
|
do id=1,nd
|
|
x0=elec(id)*sige/abso1(id)
|
|
vl(id)=emis1(id)/abso1(id)
|
|
st0(id)=vl(id)+(comb(id)+bs(id))*rad(iji,id)
|
|
RDJ1(ID)=0.
|
|
ABSCAD(ID)=ABSCAD(ID)+SCAT1(ID)*W(IJ)
|
|
scom(id)=(comb(id)-x0*(un-two*xcomp)+bs(id))*rad(iji,id)
|
|
end do
|
|
rdh1=0.
|
|
rdhd=0.
|
|
c
|
|
if(iji.gt.1) then
|
|
do id=1,nd
|
|
st0(id)=st0(id)+coma(id)*rad(iji-1,id)
|
|
scom(id)=scom(id)+coma(id)*rad(iji-1,id)
|
|
end do
|
|
end if
|
|
if(iji.lt.nfreq) then
|
|
do id=1,nd
|
|
st0(id)=st0(id)+comc(id)*rad(iji+1,id)
|
|
scom(id)=scom(id)+comc(id)*rad(iji+1,id)
|
|
end do
|
|
end if
|
|
c
|
|
if(ifz0.lt.0) then
|
|
fr15=fr*1.d-15
|
|
bnu=bn*fr15*fr15*fr15
|
|
pland=0.
|
|
x=hk*fr/temp(nd)
|
|
ex=exp(-x)
|
|
pland=bnu*ex/(un-ex)
|
|
dplan=0.
|
|
x=hk*fr/temp(nd-1)
|
|
ex=exp(-x)
|
|
dplan=bnu*ex/(un-ex)
|
|
dplan=(pland-dplan)/dt(nd-1)
|
|
end if
|
|
C
|
|
c --------------------- loop over angles
|
|
c
|
|
do i=1,2*nw
|
|
do id=1,nd-1
|
|
dtau(id)=dt(id)/abs(rmmu(i))
|
|
end do
|
|
c
|
|
c boundary conditions
|
|
c
|
|
rup=extint(ij,i)
|
|
C
|
|
C diffusion approximation for semi-infinite atmospheres
|
|
C
|
|
if(ifz0.lt.0) rdown=pland+rmmu(i)*dplan
|
|
c
|
|
c the case of finite slab - irradiation of the back side
|
|
c
|
|
if(rmmu(i).gt.0.) rdown=rdwn(nw-i+1)
|
|
c
|
|
c solution of the transfer equation
|
|
c
|
|
call rtesol(dtau,st0,rup,rdown,rmmu(i),ri,ali)
|
|
c
|
|
if(rmmu(i).gt.0.) then
|
|
if(ri(1).lt.1.e-35) ri(1)=1.e-35
|
|
rintmu(i-nw)=ri(1)
|
|
rintpo(i-nw)=0.
|
|
rdh1=rdh1+rmmu(i)*wmmu(i)*ri(1)*half
|
|
end if
|
|
rdwn(i)=ri(nd)
|
|
rdhd=rdhd+abs(rmmu(i)*wmmu(i))*ri(nd)*half
|
|
DO ID=1,ND
|
|
RDJ1(ID)=RDJ1(ID)+WMMU(I)*RI(ID)*HALF
|
|
END DO
|
|
end do
|
|
C
|
|
c --------------------- end of loop over angles
|
|
c
|
|
BBN=1.4743E-2*(FR*1.E-15)**3
|
|
DO ID=1,ND
|
|
pla=0.
|
|
x=hk*fr/temp(nd)
|
|
ex=exp(-x)
|
|
pla=bbn*ex/(un-ex)*w(ij)
|
|
RJTOT(ID)=RJTOT(ID)+RDJ1(ID)*W(IJ)
|
|
RJNUT(ID)=RJNUT(ID)+RDJ1(ID)*FREQ(IJ)*W(IJ)
|
|
ABRAD(ID)=ABRAD(ID)+RDJ1(ID)*W(IJ)*(ABSO1(ID)-SCAT1(ID))
|
|
ABPLAD(ID)=ABPLAD(ID)+PLA*(ABSO1(ID)-SCAT1(ID))
|
|
PLTOT(ID)=PLTOT(ID)+PLA
|
|
retot(id)=retot(id)+abso1(id)*(st0(id)-rdj1(id))*w(ij)
|
|
re1(id)=re1(id)+(abso1(id)-scat1(id))*rdj1(id)*w(ij)
|
|
re2(id)=re2(id)+emis1(id)*w(ij)
|
|
recm(id)=recm(id)+(st0(id)-vl(id)-
|
|
* scat1(id)/abso1(id)*rdj1(id))*w(ij)
|
|
recm0(id)=recm0(id)+scom(id)*w(ij)
|
|
END DO
|
|
c
|
|
c wll=2.997925e18/fr
|
|
c WRITE(14,641) wll,rdh1,(RINTMU(I),RINTPO(I),I=1,NW)
|
|
END DO
|
|
C
|
|
c --------------------- end of loop over frequencies
|
|
c
|
|
c 641 FORMAT(1H ,f15.3,1pe15.5/(1P5E15.5))
|
|
c
|
|
tautot=dm(nd)*elec(nd)*sige/dens(nd)
|
|
DO ID=1,ND
|
|
ABSCAD(ID)=elec(ID)*sige/DENS(ID)
|
|
ABRAD(ID)=ABRAD(ID)/DENS(ID)/RJTOT(ID)
|
|
ABPLAD(ID)=ABPLAD(ID)/DENS(ID)/PLTOT(ID)
|
|
XNU=RJNUT(ID)/RJTOT(ID)
|
|
re1(id)=re1(id)/dens(id)
|
|
re2(id)=re2(id)/dens(id)
|
|
retot(id)=retot(id)/dens(id)
|
|
taurr=dm(id)*abscad(id)
|
|
xl=abplad(id)*(temp(id)/teff)**4
|
|
xr1=0.75*(1./sqrt(3.)+taurr*(1.-0.5*taurr/tautot))
|
|
xr3a=4.*temp(id)*ycon
|
|
xr3b=xnu*xcon
|
|
xr3=xr3a-xr3b
|
|
xr4=abscad(id)*xr3
|
|
xx1=xr1*(abrad(id)-xr4)
|
|
xx2=0.25/dm(nd)
|
|
xr=xx1+xx2
|
|
xtj=sig4p*4.*teff**4*xr1
|
|
XH1=ABPLAD(ID)*PLTOT(ID)
|
|
XH2=ABRAD(ID)*RJTOT(ID)
|
|
XH12=XH1-XH2
|
|
XH3=XR4*RJTOT(ID)
|
|
XH123=XH12+XH3
|
|
XHR=SIG4P*TEFF**4/DM(ND)
|
|
END DO
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE RTEANG
|
|
C =================
|
|
C
|
|
C initialization of the angle quadrature points for the radiative
|
|
C transfer equation
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
PARAMETER (NMU3=3, NMU5=5, ZERO=0.D0)
|
|
COMMON/EXTINT/WANGLE,EXTIN(MFREQ)
|
|
COMMON/SURFEX/EXTJ(MFREQ),EXTH(MFREQ)
|
|
DIMENSION AMU0(MMU),WTMU0(MMU)
|
|
C
|
|
C If irradiation is neglected, the angular quadrature is a standard
|
|
C NMU-point Gaussian quadrature
|
|
C
|
|
X=WANGLE*HALF
|
|
XJ=0.
|
|
XH=0.
|
|
IF(X.LE.0.) THEN
|
|
call gauleg(zero,un,amu0,wtmu0,nmu,mmu)
|
|
do i=1,nmu
|
|
amu(i)=amu0(i)
|
|
wtmu(i)=wtmu0(i)
|
|
fmu(i)=0.
|
|
end do
|
|
ELSE
|
|
C
|
|
C Here, allowance is made for irradiation by central star.
|
|
C First, establish angular integration that takes into account
|
|
C angles with mu < 0; instead of the standard 3-point integration
|
|
C over angles, we have now a more general NMU5-point integration
|
|
C
|
|
X0=HALF-X
|
|
X1=HALF+X
|
|
call gauleg(-un,un,amu0,wtmu0,nmu3,mmu)
|
|
DO I=1,NMU3
|
|
AMU(I)=X0*AMU0(I)+X1
|
|
WTMU(I)=X0*WTMU0(I)
|
|
FMU(I)=0.
|
|
END DO
|
|
NMU=NMU5
|
|
i4=nmu3+1
|
|
i5=nmu3+2
|
|
AMU(i4)=X*(UN+0.577350269189626D0)
|
|
AMU(i5)=X*(UN-0.577350269189626D0)
|
|
DO I=NMU3+1,NMU5
|
|
WTMU(I)=X
|
|
FMU(I)=ASIN(SQRT((WANGLE**2-AMU(I)**2)/(UN-AMU(I)**2)))/
|
|
* 3.141592653589793D0
|
|
XJ=XJ+WTMU(I)*FMU(I)
|
|
XH=XH+WTMU(I)*AMU(I)*FMU(I)
|
|
END DO
|
|
END IF
|
|
C
|
|
DO IJ=1,NFREQ
|
|
EXTJ(IJ)=XJ*EXTIN(IJ)*HALF
|
|
EXTH(IJ)=XH*EXTIN(IJ)*HALF
|
|
END DO
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE PRD(IJ)
|
|
c ==================
|
|
c
|
|
c modification of the line emission coefficient
|
|
c and the scattering coefficient in the case of PRD
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
parameter(a21=4.699e8,pi2=6.28318531,gr=2.*4.8e-8)
|
|
c
|
|
if(ij.gt.0) then
|
|
c if(ilam.le.1) return
|
|
FR=FREQ(IJ)
|
|
IF(ISPODF.EQ.0) THEN
|
|
IF(IJLIN(IJ).GT.0) THEN
|
|
C
|
|
C the "primary" line at the given frequency
|
|
C
|
|
ITR=IJLIN(IJ)
|
|
ITRPRD=IPRD(ITR)
|
|
IF(ITRPRD.GT.0) THEN
|
|
DFR=ABS(FREQ(IJ)-FR0(ITR))
|
|
if(ilow(itr).eq.nfirst(ielh)) then
|
|
omeg=dfr*pi2
|
|
gra=a21+gr*popul(nfirst(ielh),id)
|
|
do id=1,nd
|
|
coher(itrprd,id)=a21/
|
|
* (gra+gami(2,'elec',omeg,temp(id),elec(id)))
|
|
end do
|
|
end if
|
|
DO ID=1,ND
|
|
SG=PRFLIN(ID,IJ)
|
|
IF(DFR/DOPTR(ITRPRD,ID).LE.XPDIV) SG=0.
|
|
SCALIN=SG*ABTRA(ITR,ID)*COHER(ITRPRD,ID)
|
|
SCAT1(ID)=SCAT1(ID)+SCALIN
|
|
scem=sg*emtra(itr,id)*coher(itrprd,id)*xkfb(id)
|
|
c EMIS1(ID)=EMIS1(ID)-SCALIN*RJBAR(ITRPRD,ID)
|
|
EMIS1(ID)=EMIS1(ID)-SCEM
|
|
END DO
|
|
END IF
|
|
END IF
|
|
IF(NLINES(IJ).GT.0) THEN
|
|
C
|
|
C the "overlapping" lines at the given frequency
|
|
C
|
|
DO 100 ILINT=1,NLINES(IJ)
|
|
ITR=ITRLIN(ILINT,IJ)
|
|
ITRPRD=IPRD(ITR)
|
|
IF(ITRPRD.EQ.0) GO TO 100
|
|
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))
|
|
A2=UN-A1
|
|
DFR=ABS(FREQ(IJ)-FR0(ITR))
|
|
if(ilow(itr).eq.nfirst(ielh)) then
|
|
omeg=dfr*pi2
|
|
gra=a21+gr*popul(nfirst(ielh),id)
|
|
do id=1,nd
|
|
coher(itrprd,id)=a21/
|
|
* (gra+gami(2,'elec',omeg,temp(id),elec(id)))
|
|
end do
|
|
end if
|
|
DO ID=1,ND
|
|
SG=A1*PRFLIN(ID,IJ1)+A2*PRFLIN(ID,IJ0)
|
|
IF(DFR/DOPTR(ITRPRD,ID).LE.XPDIV) SG=0.
|
|
SCALIN=SG*ABTRA(ITR,ID)*COHER(ITRPRD,ID)
|
|
scem=sg*emtra(itr,id)*coher(itrprd,id)*xkfb(id)
|
|
SCAT1(ID)=SCAT1(ID)+SCALIN
|
|
c EMIS1(ID)=EMIS1(ID)-SCALIN*RJBAR(ITRPRD,ID)
|
|
EMIS1(ID)=EMIS1(ID)-SCEM
|
|
END DO
|
|
100 CONTINUE
|
|
END IF
|
|
C
|
|
C Opacity sampling option
|
|
C
|
|
ELSE
|
|
IF(NLINES(IJ).GT.0) THEN
|
|
DO 300 ILINT=1,NLINES(IJ)
|
|
ITR=ITRLIN(ILINT,IJ)
|
|
ITRPRD=IPRD(ITR)
|
|
IF(ITRPRD.EQ.0) GO TO 300
|
|
KJ=IJ-IFR0(ITR)+KFR0(ITR)
|
|
INDXPA=IABS(INDEXP(ITR))
|
|
IF(INDXPA.NE.3 .AND. INDXPA.NE.4) THEN
|
|
DFR=ABS(FREQ(IJ)-FR0(ITR))
|
|
if(ilow(itr).eq.nfirst(ielh)) then
|
|
omeg=dfr*pi2
|
|
gra=a21+gr*popul(nfirst(ielh),id)
|
|
do id=1,nd
|
|
coher(itrprd,id)=a21/
|
|
* (gra+gami(2,'elec',omeg,temp(id),elec(id)))
|
|
end do
|
|
end if
|
|
DO ID=1,ND
|
|
SG=PRFLIN(ID,KJ)
|
|
IF(DFR/DOPTR(ITRPRD,ID).LE.XPDIV) SG=0.
|
|
SCALIN=SG*ABTRA(ITR,ID)*COHER(ITRPRD,ID)
|
|
SCAT1(ID)=SCAT1(ID)+SCALIN
|
|
EMIS1(ID)=EMIS1(ID)-SCEM
|
|
END DO
|
|
END IF
|
|
300 CONTINUE
|
|
END IF
|
|
END IF
|
|
RETURN
|
|
c
|
|
|
|
|
|
end if
|
|
c
|
|
do itrp=1,ntrprd
|
|
itr=itrtot(itrp)
|
|
aji=osc0(itr)*g(ilow(itr))/g(iup(itr))*7.42163e-22*
|
|
* fr0(itr)**2
|
|
omeg=0.
|
|
do id=1,nd
|
|
t=temp(id)
|
|
ane=elec(id)
|
|
call dopgam(itr,id,t,dop,agam)
|
|
doptr(itrp,id)=dop
|
|
coher(itrp,id)=0.99
|
|
if(agam.gt.0.) coher(itrp,id)=aji/(12.5664*dop*agam)
|
|
if(coher(itrp,id).gt.0.999) coher(itrp,id)=0.999
|
|
c
|
|
c special expression for Lyman-alpha
|
|
c
|
|
coher(itrp,id)=aji/(aji+9.8e-8*popul(nfirst(ielh),id)+
|
|
* 0.667*(gami(2,'iont',omeg,t,ane)+
|
|
* gami(2,'elec',omeg,t,ane)))
|
|
rjbar(itrp,id)=pjbar(itrp,id)
|
|
end do
|
|
end do
|
|
return
|
|
END
|
|
|
|
C
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE PRDINI
|
|
c =================
|
|
c
|
|
c initialization of PRD
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
c
|
|
ntrprd=0
|
|
do itr=1,ntrans
|
|
iprd(itr)=0
|
|
if(ifprd.gt.0.and.line(itr).and.indexp(itr).ne.0) then
|
|
ii=ilow(itr)
|
|
jj=iup(itr)
|
|
iat=iatm(ii)
|
|
c
|
|
c select Lyman alpha for PRD
|
|
c
|
|
if(iat.eq.iath.and.ii.eq.nfirst(ielh).and.
|
|
* fr0(itr).lt.2.5e15) then
|
|
ntrprd=ntrprd+1
|
|
iprd(itr)=ntrprd
|
|
itrtot(ntrprd)=itr
|
|
end if
|
|
c
|
|
c select Mg I resonance line for PRD
|
|
c
|
|
if(numat(iat).eq.12.and.iz(iel(ii)).eq.1.and.
|
|
* ii.eq.nfirst(iel(ii)).and.fr0(itr).lt.1.06e15) then
|
|
ntrprd=ntrprd+1
|
|
iprd(itr)=ntrprd
|
|
itrtot(ntrprd)=itr
|
|
end if
|
|
c
|
|
c select Mg II resonance lines for PRD
|
|
c
|
|
if(numat(iat).eq.12.and.iz(iel(ii)).eq.2.and.
|
|
* ii.eq.nfirst(iel(ii)).and.fr0(itr).lt.1.08e15) then
|
|
ntrprd=ntrprd+1
|
|
iprd(itr)=ntrprd
|
|
itrtot(ntrprd)=itr
|
|
end if
|
|
end if
|
|
end do
|
|
c
|
|
do itrp=1,ntrprd
|
|
do id=1,nd
|
|
pjbar(itrp,id)=0.
|
|
end do
|
|
end do
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
function gami(j,aper,omeg,t,ane)
|
|
c ================================
|
|
c
|
|
c function i(j) defined by eqs. (4.5)-(4.9) of
|
|
c cooper, ballagh, and hubeny (1989), ap.j. 344, 949.
|
|
c j = principal quantum number
|
|
c aper = either 'iont', or 'elec', whether one calculates the
|
|
c ion or electron contribution
|
|
c omeg = delta omega (circular frequency)
|
|
c t = temperature
|
|
c ane = electron density (assumed equal to proton density)
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
character*4 aper
|
|
dimension xx(3)
|
|
data xx/0., 50.6205, 68.6112/
|
|
c
|
|
if(omeg.gt.0.) then
|
|
gami=xx(j)*ane/sqrt(omeg)
|
|
return
|
|
end if
|
|
c
|
|
x=j*j
|
|
omegp=5.64e4*sqrt(ane)
|
|
amu=1.
|
|
if(aper.eq.'iont') then
|
|
amu=30.2
|
|
omegp=omegp/42.85
|
|
end if
|
|
omegc=1.7455e11*t/amu/amu/j
|
|
corr=0.27-log(8.356e-13*x*amu*amu*ane/t/t)
|
|
gami=3.885e-5*amu*x*ane/sqrt(t)*corr
|
|
if(omeg.lt.omegp) return
|
|
gamp=gami
|
|
gam0=22.58*x**0.75*ane
|
|
gamc=gam0/sqrt(omegc)
|
|
if(omeg.lt.omegc) then
|
|
gami=log(omeg/omegp)/log(omegc/omegp)*log(gamc/gamp)+
|
|
* log(gamp)
|
|
gami=exp(gami)
|
|
else
|
|
gami=gam0/sqrt(omeg)
|
|
end if
|
|
return
|
|
end
|
|
c
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE INPDIS
|
|
C =================
|
|
C
|
|
C driver for input specific for disks
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
PARAMETER (VELC=2.997925E10,
|
|
* pi4=12.5663706d0)
|
|
PARAMETER (GRCON = 6.668D-8)
|
|
common/relcor/arh,brh,crh,drh
|
|
C
|
|
C ----------------------
|
|
C Basic input parameters
|
|
C ----------------------
|
|
C
|
|
C The user may choose one of the two
|
|
C following possibilities to input the basic physical parameters:
|
|
C
|
|
C XMSTAR - M(star), either in M(Sun), or in grams;
|
|
C XMDOT - M(dot), either in M(Sun)/year; or in g/s
|
|
C RSTAR - R(star), either in R(Sun), or in cm
|
|
C RELDST - R/R(star)
|
|
C
|
|
C or to directly give parameters with which the program works, ie
|
|
C
|
|
C TEFF - effective temperature
|
|
C QGRAV - coefficient in the hydrostatic equilibrium equation
|
|
C QGRAV=G*M(star)/R**3
|
|
C DMTOT - total column mass at the midplane
|
|
C
|
|
WRITE(6,660)
|
|
IF(FRACTV.LT.0.) THEN
|
|
AMUV0=DMVISC**(ZETA0+UN)
|
|
FRACTV=UN/(UN+(ZETA0+UN)/(ZETA1+UN)*AMUV0/(UN-AMUV0))
|
|
END IF
|
|
IF(DMVISC.LT.0.) DMVISC=(UN/(UN+(ZETA0+UN)/(ZETA1+UN)*
|
|
* FRACTV/(UN-FRACTV)))**(UN/(ZETA0+UN))
|
|
alpha0=alphav
|
|
WRITE(6,600) XMSTAR,XMDOT,RSTAR,RELDST,ALPHAV
|
|
C
|
|
c if XMSTAR<0, turn on general relativistic corrections
|
|
c RSTAR now has the input meaning of dimensionless angular
|
|
c momentum of the Kerr black hole, but we will call this
|
|
c value AA and RSTAR will take on the meaning of 1 radius-
|
|
c equivalent of mass of the black hole
|
|
c RELDST now is expressed in multiples of 1*G*XMSTAR/c^2
|
|
c (note that for Schwarzschild black hole, the
|
|
c horizon is at RELDST=2 and the smallest radius of
|
|
c stable circular orbit is at RELDST=6)
|
|
C
|
|
IF(XMSTAR.NE.0.) THEN
|
|
IF(XMSTAR.LT.0) THEN
|
|
AA=RSTAR
|
|
RSTAR=-XMSTAR*1.989D33*GRCON/VELC/VELC
|
|
ELSE
|
|
AA=0.
|
|
END IF
|
|
IF(abs(XMSTAR).GT.1.D16) XMSTAR=XMSTAR/1.989D33
|
|
IF(XMDOT.GT.1.D3) XMDOT=XMDOT/6.3029D25
|
|
IF(RSTAR.GT.1.D3) RSTAR=RSTAR/6.9598D10
|
|
R=RSTAR*ABS(RELDST)
|
|
QGRAV=5.9D0*GRCON*abs(XMSTAR)/R**3
|
|
OMEG32=SQRT(QGRAV)*1.5
|
|
c
|
|
c apply general relativistic corrections to
|
|
c QGRAV and TEFF; keep MSTAR<0 for future use
|
|
c
|
|
RR0=RELDST
|
|
CALL GRCOR(AA,RR0,XMSTAR,QCOR,TCOR,ARH,BRH,CRH,DRH)
|
|
TEFF0=(1.79049311D-1*QGRAV*3.34379D24*XMDOT/SIG4P)**0.25
|
|
TEFF=TEFF0*TCOR
|
|
QGRAV=QGRAV*QCOR
|
|
OMEG32=OMEG32*ARH/BRH
|
|
rr0=abs(rr0)
|
|
xmas9=abs(Xmstar)*1.d-9
|
|
xmdt=Xmdot/xmas9/2.22
|
|
XMD=XMDOT*6.3029D25
|
|
alpav=abs(alphav)
|
|
c
|
|
c following is the old procedure
|
|
c
|
|
if(alphav.le.0.) then
|
|
C -------------------------
|
|
chih=0.39
|
|
if(reynum.le.0.) then
|
|
reynum=(rr0/xmdt)**2/alpav*arh*crh/drh/drh
|
|
c REYNUM=(R/XMDOT*1.10422E-15*12.5663*VELC/CHIH)**2*
|
|
c * 2./ALPAV*ARH*CRH/DRH/DRH
|
|
else
|
|
alpav=(rr0/xmdt)**2/reynum*arh*crh/drh/drh
|
|
c ALPAV=(R/XMDOT*1.10422E-15*12.5663*VELC/CHIH)**2*
|
|
c * 2./REYNUM*ARH*CRH/DRH/DRH
|
|
endif
|
|
VISC=1.176565D22*SQRT(GRCON*abs(XMSTAR)*R)/REYNUM
|
|
DMTOT=3.34379D24*XMDOT/VISC*BRH*DRH/ARH/ARH
|
|
C
|
|
if(alphav.lt.0.) then
|
|
c
|
|
C ****************************************************************
|
|
C Compute the Keplerian rotation frequency (omega=c/r_g/x^1.5):
|
|
C
|
|
RE=ABS(RR0)
|
|
OMEGA=VELC/RSTAR/6.9698D10/RE**1.5D0
|
|
C
|
|
C Compute Relativistic factors, using Krolik (1998) notation:
|
|
C
|
|
RELT=DRH/ARH
|
|
RELR=DRH/BRH
|
|
RL2=RE*(1.D0-2.D0*AA/RE**1.5D0+AA*AA/RE/RE)**2/BRH
|
|
EINF=(1.D0-2.D0/RE+AA/RE**1.5D0)/SQRT(BRH)
|
|
RELZ=(RL2-AA*AA*(EINF-1.D0))/RE
|
|
C
|
|
C Compute the surface mass density (assuming pure electron scattering,
|
|
C pure hydrogen composition, and that T_rphi = \alpha P_tot):
|
|
C
|
|
DMTOT=0.5D0*SIGMAR(ALPAV,XMD,TEFF,OMEGA,RELR,RELT,RELZ)
|
|
end if
|
|
c ----------------------------
|
|
c
|
|
c new procedure
|
|
c
|
|
else
|
|
call column
|
|
end if
|
|
c
|
|
EDISC=SIG4P*TEFF**4/DMTOT
|
|
WBARM=XMDOT*6.3029D25/6./3.1415926*BRH*DRH/(ARH*ARH)
|
|
reynum=dmtot/wbarm*sqrt(xmstar*r)*3.03818e18
|
|
WRITE(6,601) TEFF,QGRAV,DMTOT,
|
|
* ZETA0,ZETA1,FRACTV,DMVISC,TSTAR
|
|
write(6,321) tcor,qcor,arh,brh,crh,drh,
|
|
* reynum,alpav,
|
|
* dmtot,edisc,wbarm
|
|
321 FORMAT(
|
|
* ' tcor =',1PD10.3/
|
|
* ' qcor =',D10.3/
|
|
* ' A(RH) =',D10.3/
|
|
* ' B(RB) =',D10.3/
|
|
* ' C(RH) =',D10.3/
|
|
* ' D(RH) =',D10.3/
|
|
* ' Re =',D10.3/
|
|
* ' alpha =',D10.3//
|
|
* ' DMTOT =',D10.3/
|
|
* ' EDISC =',D10.3/
|
|
* ' WBARM =',D10.3//)
|
|
C
|
|
ELSE
|
|
TEFF=XMDOT
|
|
QGRAV=RSTAR
|
|
DMTOT=RELDST
|
|
EDISC=SIG4P*TEFF**4/DMTOT
|
|
OMEG32=SQRT(QGRAV)*1.5
|
|
WRITE(6,601) TEFF,QGRAV,DMTOT,
|
|
* ZETA0,ZETA1,FRACTV,DMVISC,TSTAR
|
|
END IF
|
|
C
|
|
C set up the maximum frequency
|
|
C
|
|
c if(idgrey.le.2) then
|
|
c IF(FRCMAX.EQ.0.) FRCMAX=2.83e11*(dmtot*0.39)**0.25*teff
|
|
c end if
|
|
IF(FRLMAX.EQ.0.) FRLMAX=1.D11*CNU1*TEFF
|
|
C
|
|
660 FORMAT(1H1,'***************************************'//
|
|
* ' M O D E L O F A D I S K R I N G'//
|
|
* ' ***************************************'//)
|
|
600 FORMAT(
|
|
* ' M(STAR) =',1PD10.3/
|
|
* ' M(DOT) =',D10.3/
|
|
* ' R(STAR) =',D10.3/
|
|
* ' R/R(STAR) =',D10.3/
|
|
* ' ALPHA =',D10.3//)
|
|
601 FORMAT(
|
|
* ' TEFF =',F10.0/
|
|
* ' QGRAV =',1PD10.3/
|
|
* ' DMTOT =',D10.3/
|
|
* ' ZETA0 =',D10.3/
|
|
* ' ZETA1 =',D10.3/
|
|
* ' FRACTV =',D10.3/
|
|
* ' DMVISC =',D10.3/
|
|
* ' TSTAR =',0PF10.0//)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
subroutine column
|
|
c =================
|
|
c
|
|
c approximate determination of the total disk column
|
|
c mass, DMTOT
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
common/relcor/arh,brh,crh,drh
|
|
c
|
|
parameter (xmdsun = 6.3029e25,
|
|
* xmsun = 1.989e33,
|
|
* rsun = 6.9598e10,
|
|
* grcon = 6.668e-8,
|
|
* velc = 2.997925e10,
|
|
* rgas = 1.3e8,
|
|
* xkram0 = 7.e25,
|
|
* xkap0 = 6.4e24,
|
|
* chiel = 0.39,
|
|
* pi = 3.14159265e0,
|
|
* pi4 = 4.*pi)
|
|
c
|
|
alpha= abs(alphav)
|
|
r = rstar*abs(reldst)
|
|
ga=xmdot*xmdsun/pi4*sqrt(5.9*grcon*abs(xmstar)/r**3)*drh/arh
|
|
c
|
|
be=0.77*rgas*xkap0**0.125*(two*qgrav/pi/rgas)**0.0625*sqrt(teff)
|
|
be=be*fractv**0.125
|
|
al=(sig4p*pi4*teff**4*chiel/velc)**2/(3.*qgrav)
|
|
c
|
|
dm00=(ga/alpha/be)**0.8
|
|
write(6,640) ga,al,be,dm00
|
|
640 format(/' new procedure to determine M_tot'/
|
|
* ' gam, al, be, dm0 ',1p4e11.3/
|
|
* ' iter M delta(M)/M p, jac'/)
|
|
itdm=0
|
|
10 itdm=itdm+1
|
|
p0=alpha*dm00*(al+be*dm00**0.25)-ga
|
|
ppr=alpha*(al+1.25*be*dm00**0.25)
|
|
ddm0=-p0/ppr
|
|
write(6,641) itdm,dm00,ddm0/dm00,p0,ppr
|
|
641 format(i4,1p4e11.3)
|
|
dm00=dm00+ddm0
|
|
if(abs(ddm0/dm00).gt.1.e-2.and.itdm.lt.20) go to 10
|
|
dmtot=dm00
|
|
visc=3.34379D24*XMDOT/dmtot*BRH*DRH/ARH/ARH
|
|
c
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
SUBROUTINE GRCOR(AA,RR,XMSTAR,QCOR,TCOR,ARH,BRH,CRH,DRH)
|
|
C =======================================================
|
|
C
|
|
C Procedure for computing general-relativistic correction
|
|
C factors to gravitational factor (QGRAV) and effective
|
|
C temperature (TEFF)
|
|
C Also calculates all frour quantities in the Riffer-Herlod (RH)
|
|
C notation - ARH, BRH, CRH, DRH
|
|
C
|
|
C Input:
|
|
C AA - angular momentum (0.98 maximum)
|
|
C RR - R/R_g = r/(GM/c^2)
|
|
C Outout:
|
|
C QCOR - g-correction = C/B in RH notation
|
|
C TCOR - T-correction = (D/B)^(1/4) in RH notation
|
|
C ARH - A in RH notation
|
|
C BRH - B in RH notation
|
|
C CRH - C in RH notation
|
|
C DRH - D in RH notation
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
PARAMETER (THIRD=1.D0/3.D0, PI3=1.0471976)
|
|
C
|
|
C ----------------
|
|
C Imput parameters
|
|
C ----------------
|
|
C
|
|
C AA - specific angular momentum/mass
|
|
C of the Kerr black hole
|
|
C RR - distance/mass of the Kerr black hole
|
|
C
|
|
C -----------------------------------
|
|
C Classical case - no GR corrections
|
|
C ------------------------------------
|
|
C
|
|
if(Xmstar.gt.0.) then
|
|
arh=1.
|
|
brh=1.
|
|
crh=1.
|
|
drh=1.-sqrt(1./rr)
|
|
qcor=1.
|
|
tcor=drh**0.25
|
|
return
|
|
end if
|
|
c
|
|
C ---------------------------------
|
|
C Set correcion factors A through G (see Novikov & Thorne,'73, eq.5.4.1a-g)
|
|
C ---------------------------------
|
|
C
|
|
rror=rr
|
|
rr=abs(rr)
|
|
AA2=AA*AA
|
|
RR1=1/RR
|
|
RR12=SQRT(RR1)
|
|
RR2=RR1*RR1
|
|
A2R2=AA2*RR2
|
|
A4R4=A2R2*A2R2
|
|
A2R3=AA2*RR2*RR1
|
|
AR32=SQRT(A2R3)
|
|
C
|
|
A = 1 + A2R2 + 2*A2R3
|
|
B = 1 + AR32
|
|
C = 1 - 3*RR1 + 2*AR32
|
|
D = 1 - 2*RR1 + A2R2
|
|
E = 1 + 4*A2R2 - 4*A2R3 + 3*A4R4
|
|
C
|
|
C -------------------------------
|
|
C Set correction factor for QGRAV (see Novikov & Thorne,'73, eq.5.7.2)
|
|
C -------------------------------
|
|
C
|
|
if(rror.lt.0) QCOR = B*B*D*E/(A*A*C)
|
|
c
|
|
c correction - after Riffert and Harold
|
|
c
|
|
if(rror.gt.0) QCOR = (1. - 4.*AR32 + 3.*A2R2)/C
|
|
C
|
|
C -----------------------
|
|
C Set correction factor Q (see Page & Thorne,'73, eq.35)
|
|
C -----------------------
|
|
C
|
|
C Minimum radius for last stable circular orbit per unit mass, X0
|
|
C
|
|
Z1 = 1 + (1-AA2)**THIRD * ((1+AA)**THIRD + (1-AA)**THIRD)
|
|
Z2 = SQRT(3*AA2 + Z1*Z1)
|
|
X0 = SQRT(3 + Z2 - SQRT((3-Z1)*(3+Z1+2*Z2)))
|
|
C
|
|
C Roots of x^3 - 3x + 2a = 0
|
|
C
|
|
CA3 = THIRD * ACOS(AA)
|
|
X1 = 2*COS(CA3-PI3)
|
|
X2 = 2*COS(CA3+PI3)
|
|
X3 = -2*COS(CA3)
|
|
C
|
|
C FB = '[]' term in eq. (35) of Page&Thorne '73
|
|
C
|
|
X = SQRT(RR)
|
|
C1 = 3*(X1-AA)*(X1-AA)/(X1*(X1-X2)*(X1-X3))
|
|
C2 = 3*(X2-AA)*(X2-AA)/(X2*(X2-X1)*(X2-X3))
|
|
C3 = 3*(X3-AA)*(X3-AA)/(X3*(X3-X1)*(X3-X2))
|
|
AL0 = 1.5*AA*log(X/X0)
|
|
AL1 = log((X-X1)/(X0-X1))
|
|
AL2 = log((X-X2)/(X0-X2))
|
|
AL3 = log((X-X3)/(X0-X3))
|
|
FB = (X-X0 - AL0 - C1*AL1 - C2*AL2 - C3*AL3)
|
|
Q = FB*(1+AR32)*RR12/SQRT(1-3*RR1+2*AR32)
|
|
|
|
C ------------------------------
|
|
C Set correction factor for TEFF (see Novikov & Thorne,'73, eq.5.5.14b)
|
|
C ------------------------------
|
|
C
|
|
TCOR = (Q/B/SQRT(C))**0.25
|
|
C
|
|
C ------------------------------
|
|
C RH quantities
|
|
C ------------------------------
|
|
C
|
|
ARH = D
|
|
BRH = C
|
|
CRH = 1. - 4.*AR32 + 3.*A2R2
|
|
DRH = Q/B*SQRT(C)
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE DMDER
|
|
C ================
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
COMMON/DEPTDR/DDM(MDEPTH),DDP(MDEPTH),DD0(MDEPTH),
|
|
* DDMIN(MDEPTH),DDPLU(MDEPTH),DDA(MDEPTH),
|
|
* DDC(MDEPTH),DDB(MDEPTH)
|
|
C
|
|
DO ID=2,ND-1
|
|
DDM(ID)=DM(ID)-DM(ID-1)
|
|
DDP(ID)=DM(ID+1)-DM(ID)
|
|
DD0(ID)=DM(ID+1)-DM(ID-1)
|
|
DDMIN(ID)=DDP(ID)/DD0(ID)
|
|
DDPLU(ID)=DDM(ID)/DD0(ID)
|
|
DDA(ID)=DDMIN(ID)/DDM(ID)
|
|
DDC(ID)=DDPLU(ID)/DDP(ID)
|
|
END DO
|
|
C
|
|
DDM(1)=0.
|
|
DDM(ND)=DM(ND)-DM(ND-1)
|
|
DDP(1)=DM(2)-DM(1)
|
|
DDP(ND)=0.
|
|
DDMIN(1)=0.
|
|
DDMIN(ND)=1.
|
|
DDPLU(1)=1.
|
|
DDPLU(ND)=0.
|
|
DDA(1)=0.
|
|
DDA(ND)=UN/DDM(ND)
|
|
DDC(1)=UN/DDP(1)
|
|
DDC(ND)=0.
|
|
DO ID=1,ND
|
|
DDB(ID)=DDA(ID)-DDC(ID)
|
|
END DO
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
FUNCTION SIGMAR(ALPHA,XMDT,TEF,OMEGA,RELR,RELT,RELZ)
|
|
C =====================================================
|
|
c
|
|
C--------------------------------------------------------------------
|
|
C The following function takes as inpute various disk parameters computed
|
|
C at a certain radius in cgs units, and outputs the surface mass density,
|
|
C assuming that the opacity is electron-scattering dominated (or that kappa
|
|
C is independent of the density). The equations were derived assuming a 1-zone
|
|
C model (i.e. rho, T_g, mu are constant with height), assuming t_r,phi =
|
|
C -alpha P, and that the dissipation is constant per unit optical depth.
|
|
C See chapter 7 of Krolik for information on the notation used here
|
|
C (especially relativistic factors).
|
|
C
|
|
C--------------------------------------------------------------------
|
|
C Uses Numerical Recipes subroutine LAGUER
|
|
C--------------------------------------------------------------------
|
|
C ALPHA - viscosity parameter
|
|
C XMDT - accretion rate (in g/s)
|
|
C TEF - temperature in Kelvins
|
|
C OMEGA - Keplerian frequency (in Hz)
|
|
C RELR,RELT, RELZ - relativistic factors
|
|
C KAPPA - opacity (cm^2/g)
|
|
C MU - mean atomic mass (g) = rho/N
|
|
C--------------------------------------------------------------------
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
REAL*8 KAPPA,MU
|
|
COMPLEX*16 COEFF(11),XGUESS
|
|
C
|
|
C We should check that the physical constants used here agree with those in
|
|
C disk195g:
|
|
C
|
|
parameter (ZERO=0.D0,ONE=1.D0,TRES=3.D0,
|
|
* FOUR=4.D0,THIRD=ONE/TRES,FOURTH=0.25D0,EPS=1.D-5)
|
|
parameter (C=2.9979D10,SIGMAB=5.6703D-5)
|
|
parameter (BK=1.3807D-16)
|
|
PI=ACOS(-ONE)
|
|
C
|
|
C We'll assume fully ionized, pure hydrogen:
|
|
C
|
|
KAPPA=0.39D0
|
|
MU=0.5D0*1.6726D-24
|
|
FAC1=RELZ*(HALF*TRES*C*OMEGA/ALPHA/KAPPA/SIGMAB/TEF**4)**2
|
|
FAC2=(HALF*KAPPA)**FOURTH*BK*TEF/MU
|
|
FAC3=XMDT*OMEGA*RELT/PI
|
|
C
|
|
C Coefficients of the equation for x^4=Sigma:
|
|
C
|
|
COEFF(1)=DCMPLX(FAC1*(HALF*FAC3)**2,ZERO)
|
|
COEFF(2)=ZERO
|
|
COEFF(3)=ZERO
|
|
COEFF(4)=ZERO
|
|
COEFF(5)=DCMPLX(-(TRES*FAC3)/(8.D0*ALPHA),ZERO)
|
|
COEFF(6)=DCMPLX(-FAC1*FAC3*ALPHA*FAC2,ZERO)
|
|
COEFF(7)=ZERO
|
|
COEFF(8)=ZERO
|
|
COEFF(9)=ZERO
|
|
COEFF(10)=DCMPLX(FOURTH*FAC2,ZERO)
|
|
COEFF(11)=DCMPLX(FAC1*(ALPHA*FAC2)**2,ZERO)
|
|
C
|
|
C At small radii, we'll approximate P_rad >> P_gas
|
|
C First, compute sigma assuming radiation pressure dominates:
|
|
C
|
|
SIGRAD=FOUR*OMEGA*C*C*RELT*RELZ/ALPHA/KAPPA**2/SIGMAB/TEF**4/RELR
|
|
C
|
|
C Next, compute sigma assuming gas pressure dominates:
|
|
C
|
|
SIGGAS=((MU*XMDT*OMEGA*RELT/PI/ALPHA/BK/TEF)**4/8./KAPPA)**0.2D0
|
|
C
|
|
C Use a starting guess which has the correct value for P_gas >> P_rad
|
|
C or P_rad >> P_gas.
|
|
C
|
|
XGUESS=DCMPLX(ONE/(ONE/SIGRAD+ONE/SIGGAS)**FOURTH,ZERO)
|
|
C
|
|
C Look for root of the 10th order equation for x:
|
|
C
|
|
CALL LAGUER(COEFF,10,XGUESS,ITS)
|
|
C
|
|
C Make sure that we haven't landed a wrong root:
|
|
C
|
|
IF(ABS(DIMAG(XGUESS)).LT.EPS.AND.DBLE(XGUESS).GT.ZERO) THEN
|
|
SIGMAR=DBLE(XGUESS)**4
|
|
ELSE
|
|
SIGMAR=ONE/(ONE/SIGRAD+ONE/SIGGAS)
|
|
WRITE(6,*) 'Surface density approximated'
|
|
ENDIF
|
|
WRITE(6,2000) TEF,SIGRAD,SIGGAS,SIGMAR
|
|
RETURN
|
|
2000 FORMAT(20(2x,1pe12.5))
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE laguer(a,m,x,its)
|
|
C ============================
|
|
C
|
|
C Routine from Numerical Recipees
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
COMPLEX*16 a(m+1),x
|
|
PARAMETER (EPSS=2.e-7,MR=8,MT=10,MAXIT=MT*MR)
|
|
REAL frac(MR)
|
|
COMPLEX*16 dx,x1,b,d,f,g,h,sq,gp,gm,g2
|
|
SAVE frac
|
|
DATA frac /.5,.25,.75,.13,.38,.62,.88,1./
|
|
C
|
|
do iter=1,MAXIT
|
|
its=iter
|
|
b=a(m+1)
|
|
err=abs(b)
|
|
d=dcmplx(0.d0,0.d0)
|
|
f=dcmplx(0.d0,0.d0)
|
|
abx=abs(x)
|
|
do j=m,1,-1
|
|
f=x*f+d
|
|
d=x*d+b
|
|
b=x*b+a(j)
|
|
err=abs(b)+abx*err
|
|
end do
|
|
err=EPSS*err
|
|
if(abs(b).le.err) then
|
|
return
|
|
else
|
|
g=d/b
|
|
g2=g*g
|
|
h=g2-2.d0*f/b
|
|
sq=sqrt(dble(m-1)*(dble(m)*h-g2))
|
|
gp=g+sq
|
|
gm=g-sq
|
|
abp=abs(gp)
|
|
abm=abs(gm)
|
|
if(abp.lt.abm) gp=gm
|
|
if (max(abp,abm).gt.0.D0) then
|
|
dx=dble(m)/gp
|
|
else
|
|
dx=exp(dcmplx(log(1.d0+abx),dble(iter)))
|
|
endif
|
|
endif
|
|
x1=x-dx
|
|
if(x.eq.x1)return
|
|
if (mod(iter,MT).ne.0) then
|
|
x=x1
|
|
else
|
|
x=x-dx*frac(iter/MT)
|
|
endif
|
|
end do
|
|
c
|
|
write(6,601) x,x1
|
|
601 format(' too many iterations in laguer, x,x1 ',1p2e9.1)
|
|
return
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE LTEGRD
|
|
C =================
|
|
C
|
|
C Driving procedure for computing the initial LTE-grey disk model
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
C
|
|
PARAMETER (ERRT=1.D-3, THIRD=UN/3.D0, FOUR=4.D0)
|
|
DIMENSION TAU0(MDEPTH),TEMP0(MDEPTH),ELEC0(MDEPTH),
|
|
* DENS0(MDEPTH),ZD0(MDEPTH),DM0(MDEPTH)
|
|
COMMON/PRSAUX/VSND2(MDEPTH),HG1,HR1,RR1
|
|
COMMON/FACTRS/GAMJ(MDEPTH),GAMH,FAK0
|
|
COMMON/TOTJHK/TOTJ(MDEPTH),TOTH(MDEPTH),TOTK(MDEPTH),
|
|
* RDOPAC(MDEPTH),FLOPAC(MDEPTH)
|
|
COMMON/FLXAUX/T4,PGAS,PRAD,PGM,PRADM,ITGMAX,ITGMX0
|
|
COMMON/CUBCON/A,B,DEL,GRDADB,DELMDE,RHO,FLXTOT,GRAVD
|
|
C
|
|
C ----------------
|
|
C Input parameters
|
|
C ----------------
|
|
C
|
|
C NDEPTH - number of depth point for evaluating LTE-grey model
|
|
C < 0 - the program computes an isothermal structure;
|
|
C the temperature is specified by an extra record
|
|
C (see below)
|
|
C DM1 - mass at the first depth point
|
|
C ABROS0 - initial estimate of the Rosseland opacity (per gram)
|
|
C at the first depth point
|
|
C ABPLA0 - initial estimate of the Planck mean opacity (per
|
|
C gram) at the first depth point
|
|
C DION0 - initial estimate of the degree of ionization at the
|
|
C first depth point (=1 for completely ionized; =1/2 for
|
|
C completely neutral)
|
|
C ITGMAX - maximum number of global iterations of the procedure
|
|
C for determining the Eddington and opacity factors
|
|
C - number of iterations in recalculating new depth scale
|
|
C in order to get a better coverage of optical depths
|
|
C > 0 - subroutine NEWDM (blind addition of points)
|
|
C < 0 - subroutine NEWDMT - new depths determined as the
|
|
C equal-segment endpoints of the curve y=tauros(m)
|
|
C
|
|
C --------------------------------------------------------------------
|
|
C
|
|
C IDEPTH - mode of determining the mass-depth scale to be used
|
|
C in linearization
|
|
C = 0 - depth scale DM is set up by the program
|
|
C = 1 - interpolation to the depth scale DM (in g*cm**-2),
|
|
C which has been read in START
|
|
C = 2 - DM is evaluated as mass corresponding to Rosseland
|
|
C optical depths which are equidistantly spaced in
|
|
C logarithms between the first point TAU1 and the
|
|
C last-but-one point TAU2=0.99*TAUMAX; the last point
|
|
C is TAUMAX, where TAUMAX is the Ross. optical depth
|
|
C corresponding to the last depth point (midplane),
|
|
C set up by the program
|
|
C NCONIT - number of internal iterations for calculating the
|
|
C LTE-gray model with convection
|
|
C = 0 - if HMIX0>0, program sets NCONIT=10.
|
|
C IPRING - switch for determining an amount of output from
|
|
C the calculation of LTE-gray model
|
|
C = 0 - only final LTE-gray model is printed
|
|
C = 1 - more tables are printed
|
|
C = 2 - complete output
|
|
C IHM > 0 - negative hydrogen ion considered in particle and
|
|
C charge conservation in ELDENS
|
|
C IH2 > 0 - hydrogen molecule considered in particle
|
|
C conservation in ELDENS
|
|
C IH2P > 0 - ionized hydrogen molecule considered in particle
|
|
C and charge conservation in ELDENS
|
|
C
|
|
C --------------------------------------------------------------------
|
|
C
|
|
IF(NDGREY.EQ.0) THEN
|
|
NDEPTH=ND
|
|
ELSE
|
|
NDEPTH=NDGREY
|
|
END IF
|
|
IF(NDEPTH.GT.MDEPTH) call quit(' NDEPTH too large in LTEGR',
|
|
* ndept,mdepth)
|
|
IDEPTH=IDGREY
|
|
ITGMAX=ITGMX0
|
|
IF(HMIX0.GT.0..AND.NCONIT.EQ.0) NCONIT=10
|
|
if(dion0.lt.0) then
|
|
abpmin=-dion0
|
|
dion0=1.
|
|
end if
|
|
T4=TEFF**4
|
|
TOTF=SIG4P*T4
|
|
ABFL0=SIGE/WMM(1)
|
|
if(idmfix.eq.1) then
|
|
t0=teff
|
|
DMTOT=TOTF/EDISC
|
|
else
|
|
call greyd
|
|
t0=temp(1)
|
|
EDISC=TOTF/DMTOT
|
|
end if
|
|
c
|
|
ZND=0.
|
|
VSND20=2.76D-16*T0/WMM(1)*DION0+VTB*VTB
|
|
HSCALG=SQRT(TWO*VSND20/QGRAV)
|
|
HSCALR=4.19168946D-10*TOTF*ABFL0/QGRAV
|
|
R=HSCALR/HSCALG
|
|
WRITE(6,615) HSCALG,HSCALR,R
|
|
615 FORMAT(/' GAS PRESSURE SCALE HEIGHT = ',1PD10.3/
|
|
* ' RAD.PRESSURE SCALE HEIGHT = ',1PD10.3/
|
|
* ' RATIO = ',1PD10.3/)
|
|
GAMH=UN
|
|
FAK0=THIRD
|
|
ANEREL=(DION0-HALF)/DION0
|
|
IF(ANEREL.LT.ERRT) ANEREL=ERRT
|
|
IF(NDEPTH.EQ.0) NDEPTH=ND
|
|
LCHC0=LCHC
|
|
LCHC=.TRUE.
|
|
ND0=ND
|
|
ND=NDEPTH
|
|
DO ID=1,ND0
|
|
DM0(ID)=DM(ID)
|
|
END DO
|
|
C
|
|
C mass-depth scale
|
|
C Initial estimate of the density, geometrical distance z, and
|
|
C pressure
|
|
C
|
|
CALL ZMRHO(R,HSCALG)
|
|
C
|
|
if(ipring.eq.2) then
|
|
xdm=dm(1)
|
|
DO ID=1,ND
|
|
if(id.gt.1) xdm=xdm-half*(dens(id)+dens(id-1))*
|
|
* (zd(id)-zd(id-1))
|
|
WRITE(6,602) ID,DM(ID),TAUROS(ID),
|
|
* TEMP(ID),ELEC(ID),PTOTAL(ID),
|
|
* ZD(ID),ABROSD(ID),ABPLAD(ID)
|
|
* ,dens(id),xdm
|
|
end do
|
|
end if
|
|
c
|
|
ITGREY=-1
|
|
AMUV0=DMVISC**(ZETA0+UN)
|
|
AMUV1=UN-AMUV0
|
|
DO ID=1,ND
|
|
PGS(ID)=DENS(ID)*VSND20
|
|
IF(DM(ID).LE.DMVISC*DM(ND)) THEN
|
|
VISCD(ID)=(UN-FRACTV)*(ZETA1+UN)/
|
|
* DMVISC**(ZETA1+UN)*(DM(ID)/DM(ND))**ZETA1
|
|
THETA(ID)=(UN-FRACTV)*(DM(ID)/DMVISC/DM(ND))**(ZETA1+UN)
|
|
ELSE
|
|
VISCD(ID)=FRACTV*(ZETA0+UN)/AMUV1*
|
|
* (DM(ID)/DM(ND))**ZETA0
|
|
THETA(ID)=(UN-FRACTV)+FRACTV*((DM(ID)/DM(ND))**(ZETA0+UN)-
|
|
* AMUV0)/AMUV1
|
|
END IF
|
|
GAMJ(ID)=UN
|
|
C
|
|
C First estimates of the values of the Rosseland opacity
|
|
C and function tauthe
|
|
C
|
|
IF(ID.EQ.1) THEN
|
|
TAUR=DM(ID)*ABROS0
|
|
TAUTHE(ID)=TAUR*THETA(ID)/(ZETA1+TWO)
|
|
ABROSD(ID)=ABROS0
|
|
ABPLAD(ID)=ABPLA0
|
|
ELSE
|
|
DDM=DM(ID)-DM(ID-1)
|
|
TAUR=TAUROS(ID-1)+DDM*ABROSD(ID-1)
|
|
TAUTHE(ID)=TAUTHE(ID-1)+DDM*ABROSD(ID-1)*THETA(ID)
|
|
ABROSD(ID)=ABROSD(ID-1)
|
|
ABPLAD(ID)=ABPLAD(ID-1)
|
|
END IF
|
|
C
|
|
do ii=1,nlevel
|
|
wop(ii,id)=un
|
|
end do
|
|
C
|
|
C Determination of temperature and mean opacities
|
|
C
|
|
CALL TEMPER(ID,TAUR,ITGREY)
|
|
END DO
|
|
C
|
|
IF(IPRING.GE.2) THEN
|
|
WRITE(6,601)
|
|
xdm=dm(1)
|
|
DO ID=1,ND
|
|
if(id.gt.1) xdm=xdm-half*(dens(id)+dens(id-1))*
|
|
* (zd(id)-zd(id-1))
|
|
WRITE(6,602) ID,DM(ID),TAUROS(ID),
|
|
* TEMP(ID),ELEC(ID),PTOTAL(ID),
|
|
* ZD(ID),ABROSD(ID),ABPLAD(ID)
|
|
* ,dens(id),xdm
|
|
END DO
|
|
END IF
|
|
C
|
|
C
|
|
C Simultaneous solution of the hydrostatic equilibrium and the
|
|
C z-m relation, assuming sound speed fixed
|
|
C
|
|
if(nconit.ge.0) CALL HESOLV
|
|
C
|
|
if(nconit.lt.-2) then
|
|
do id=2,nd
|
|
dm(id)=dm(id-1)-half*(dens(id)+dens(id-1))*
|
|
* (zd(id)-zd(id-1))
|
|
end do
|
|
end if
|
|
IF(IPRING.GE.2) THEN
|
|
xdm=dm(1)
|
|
WRITE(6,601)
|
|
DO ID=1,ND
|
|
if(id.gt.1) xdm=xdm-half*(dens(id)+dens(id-1))*
|
|
* (zd(id)-zd(id-1))
|
|
WRITE(6,602) ID,DM(ID),TAUROS(ID),
|
|
* TEMP(ID),ELEC(ID),PTOTAL(ID),
|
|
* ZD(ID),ABROSD(ID),ABPLAD(ID)
|
|
* ,dens(id),xdm
|
|
END DO
|
|
END IF
|
|
C
|
|
C -------------------------------------------------------------------
|
|
C
|
|
C Outer iteration loop for the pseudo-grey model;
|
|
C basically generalized Unsold-Lucy procedure
|
|
C
|
|
C 1.iteration - assumes that
|
|
C Rosseland opacity = flux mean opacity
|
|
C Planck mean opac = absorption mean opacity
|
|
C Eddington factors = 1/3 and 1/sgrt(3)
|
|
C
|
|
C next iterations
|
|
C improvement of mean opacities and Eddington factors;
|
|
C corrections of the temperature (generalized Unsold-Lucy)
|
|
C
|
|
C
|
|
C 1.part
|
|
C
|
|
100 ITGREY=ITGREY+1
|
|
C
|
|
ANEREL=ELEC(1)/(DENS(1)/WMM(1)+ELEC(1))
|
|
DO ID=1,ND
|
|
TAUR=TAUROS(ID)
|
|
IF(ITGREY.GT.1) TAUR=TAUFLX(ID)
|
|
CALL TEMPER(ID,TAUR,ITGREY)
|
|
END DO
|
|
C
|
|
C Again simultaneous solution of the hydrostatic equilibrium
|
|
C and the z-m relation, assuming sound speed fixed
|
|
C
|
|
if(nconit.ge.0) CALL HESOLV
|
|
C
|
|
IF(IPRING.GE.1) THEN
|
|
WRITE(6,601)
|
|
xdm=dm(1)
|
|
DO ID=1,ND
|
|
WRITE(6,602) ID,DM(ID),TAUROS(ID),
|
|
* TEMP(ID),ELEC(ID),PTOTAL(ID),
|
|
* ZD(ID),ABROSD(ID),ABPLAD(ID)
|
|
* ,dens(id),xdm
|
|
END DO
|
|
END IF
|
|
C
|
|
601 FORMAT(1H1,' ID DM TAUROSS TEMP NE P',
|
|
* 8X,'ZD ROSS.MEAN PLANCK',' dens '/)
|
|
602 FORMAT(1H ,I3,1P2D9.2,0PF11.0,1P3D9.2,2X,2D9.2,2x,2d11.4,d9.2)
|
|
C
|
|
C If required, modification of the depth scale (logarithmically
|
|
C equidistant not in m, but in Tau(ross)
|
|
C
|
|
C *****************************************************
|
|
C
|
|
IF(NNEWD.GT.0.AND.ITGREY.EQ.0.AND.TAUROS(ND).GT.10.) THEN
|
|
DO III=1,NNEWD
|
|
CALL NEWDM
|
|
END DO
|
|
END IF
|
|
C
|
|
C another modification of the depth scale
|
|
C
|
|
IF(NNEWD.LT.0) THEN
|
|
DO III=1,-NNEWD
|
|
CALL NEWDMT
|
|
END DO
|
|
END IF
|
|
C
|
|
IF(HMIX0.GT.0.) THEN
|
|
CALL CONTMD
|
|
GO TO 200
|
|
END IF
|
|
C
|
|
C *****************************************************
|
|
C
|
|
C If ITGMAX = 0 - no iterative improvement of the pseudo-grey
|
|
C model is required
|
|
C
|
|
IF(ITGMAX.EQ.0) GO TO 200
|
|
IF(ITGREY.EQ.0) ITGREY=1
|
|
C
|
|
C Opacities and mean intensities in all frequency points ;
|
|
C evaluation of appropriate integrals over frequency
|
|
C
|
|
CALL RADTOT
|
|
C
|
|
C Interpolation of TOTH and FLOPAC, which are determined by RTE
|
|
C at the intermediate depth ponts DM(ID+1/2) to the grid DM
|
|
C
|
|
DO ID=2,ND-1
|
|
A1=DM(ID+1)-DM(ID-1)
|
|
A0=(DM(ID)-DM(ID-1))/A1
|
|
A1=(DM(ID+1)-DM(ID))/A1
|
|
TOTH(ID)=A0*TOTH(ID+1)+A1*TOTH(ID)
|
|
FLOPAC(ID)=A0*FLOPAC(ID+1)+A1*FLOPAC(ID)
|
|
END DO
|
|
TOTH(ND)=0.
|
|
FLOPAC(ND)=FLOPAC(ND-1)
|
|
C
|
|
C Determination of new temperature
|
|
C
|
|
IF(IPRING.GE.1) WRITE(6,613) ITGREY
|
|
DO ID=1,ND
|
|
HMECH=TOTF*(UN-THETA(ID))
|
|
DFLUX=TOTH(ID)-HMECH
|
|
FAKK=TOTK(ID)/TOTJ(ID)
|
|
ABRAD=RDOPAC(ID)/DENS(ID)/TOTJ(ID)
|
|
GAMJ(ID)=ABRAD/ABPLAD(ID)/FAKK*THIRD
|
|
IF(ID.NE.ND) THEN
|
|
ABFLX=FLOPAC(ID)/TOTH(ID)
|
|
ELSE
|
|
ABFLX=ABFLXM
|
|
END IF
|
|
abflx=abrosd(id)
|
|
IF(ID.EQ.1) THEN
|
|
FHH=TOTH(ID)/TOTJ(ID)
|
|
GAMH=FAKK/FHH/5.7753D-1
|
|
TAUFLX(ID)=ABFLX*DM(ID)
|
|
TAUTHE(ID)=TAUFLX(ID)*THETA(ID)/(ZETA1+TWO)
|
|
DFINT=TAUFLX(ID)*DFLUX
|
|
DB0=FAKK/FHH*DFLUX
|
|
ELSE
|
|
IF(DM(ID).LE.DMVISC*DM(ND)) THEN
|
|
ZETAD=ZETA1
|
|
ELSE
|
|
ZETAD=ZETA0
|
|
END IF
|
|
DDM=DM(ID)-DM(ID-1)
|
|
A0=(ABFLXM*DM(ID)-ABFLX*DM(ID-1))/DDM/(ZETAD+TWO)
|
|
A1=(ABFLX-ABFLXM)/DDM/(ZETAD+3.D0)
|
|
TAUFLX(ID)=TAUFLX(ID-1)+DDM*HALF*(ABFLXM+ABFLX)
|
|
TAUTHE(ID)=TAUTHE(ID-1)+
|
|
* A0*(THETA(ID)*DM(ID)-THETA(ID-1)*DM(ID-1))+
|
|
* A1*(THETA(ID)*DM(ID)**2-THETA(ID-1)*DM(ID-1)**2)
|
|
DFINT=DFINT+DDM*HALF*(ABFLXM*DFLUXM+ABFLX*DFLUX)
|
|
END IF
|
|
ABFLXM=ABFLX
|
|
DFLUXM=DFLUX
|
|
IF(ITGMAX.GE.0) THEN
|
|
C
|
|
C generalized Unsold-Lucy procedure
|
|
C
|
|
B0=FOUR*SIG4P*TEMP(ID)**4
|
|
DIS=TOTF*VISCD(ID)/ABPLAD(ID)/DM(ND)
|
|
DB1=ABRAD/ABPLAD(ID)*TOTJ(ID)-B0+DIS
|
|
DB=DB1-3.D0*GAMJ(ID)*(DB0+DFINT)
|
|
BNEW=FOUR*SIG4P*TEMP(ID)**4+DB
|
|
TEMP(ID)=SQRT(SQRT(BNEW/4.D0/SIG4P))
|
|
BREL=DB/B0
|
|
END IF
|
|
C
|
|
C diagnostic output of iterative improvement
|
|
C
|
|
R2=ABFLX/ABROSD(ID)
|
|
R3=ABRAD/ABPLAD(ID)
|
|
IF(IPRING.GE.1) WRITE(6,614) ID,FAKK,TAUROS(ID),
|
|
* ABROSD(ID),ABFLX,R2,
|
|
* ABRAD,ABPLAD(ID),R3,TOTH(ID),HMECH,BREL
|
|
END DO
|
|
C
|
|
613 FORMAT(1H1,'ITERATIVE IMPROVEMENT, ITGREY =',I2//
|
|
* ' ID FK TAUROS ABROS',4X,
|
|
* 'ABFLUX RATIO ABRAD ABPLA RATIO',10X,'FLUX',
|
|
* 7X,'MECH',4X,'DELTA(B)/B'/)
|
|
614 FORMAT(1H ,I3,1P2D9.2,1X,3D9.2,1X,3D9.2,3X,2D13.5,3X,D10.2)
|
|
C
|
|
IF(ITGREY.LE.IABS(ITGMAX)) GO TO 100
|
|
C
|
|
C End of iteration loop for the pseudo-grey model
|
|
C -------------------------------------------------------------------
|
|
C
|
|
C
|
|
C 2. The final part
|
|
C Interpolation of the computed model to the depth scale which is
|
|
C going to be used in the subsequent - complete-linearization -
|
|
C step of the model construction
|
|
C
|
|
C
|
|
C First option - no interpolation
|
|
C
|
|
C Second option - interpolation to the prescribed mass scale DM
|
|
C
|
|
200 CONTINUE
|
|
IF(IDEPTH.EQ.1) THEN
|
|
CALL INTERP(DM,TEMP,DM0,TEMP0,ND,ND0,2,1,0)
|
|
CALL INTERP(DM,ELEC,DM0,ELEC0,ND,ND0,2,1,1)
|
|
CALL INTERP(DM,DENS,DM0,DENS0,ND,ND0,2,1,1)
|
|
CALL INTERP(DM,ZD,DM0,ZD0,ND,ND0,2,1,0)
|
|
END IF
|
|
C
|
|
C Third option - logarithmically equidistant Rosseland opt.depths
|
|
C
|
|
IF(IDEPTH.EQ.2) THEN
|
|
READ(IBUFF,*) TAU1
|
|
TAU0(ND0)=TAUROS(ND)
|
|
TAU2=TAU0(ND0)*0.99
|
|
DML0=LOG(TAU1)
|
|
DLGM=(LOG(TAU2)-DML0)/(ND0-2)
|
|
DO I=1,ND0-1
|
|
TAU0(I)=EXP(DML0+(I-1)*DLGM)
|
|
END DO
|
|
CALL INTERP(TAUROS,DM,TAU0,DM0,ND,ND0,2,1,0)
|
|
CALL INTERP(TAUROS,TEMP,TAU0,TEMP0,ND,ND0,2,1,0)
|
|
CALL INTERP(TAUROS,ELEC,TAU0,ELEC0,ND,ND0,2,1,1)
|
|
CALL INTERP(TAUROS,DENS,TAU0,DENS0,ND,ND0,2,1,1)
|
|
CALL INTERP(TAUROS,ZD,TAU0,ZD0,ND,ND0,2,1,0)
|
|
END IF
|
|
C
|
|
C Fourth option - truncation of the disk and computing only
|
|
C a disk atmosphere
|
|
C
|
|
IF(IDEPTH.GE.3) THEN
|
|
TAU1=TAUROS(1)
|
|
IF(IDEPTH.EQ.3) THEN
|
|
READ(IBUFF,*) TDIV
|
|
ELSE IF(IDEPTH.EQ.4) THEN
|
|
READ(IBUFF,*) TAU0(ND)
|
|
ELSE IF(IDEPTH.EQ.5) THEN
|
|
READ(IBUFF,*) TDIV
|
|
ELSE IF(IDEPTH.EQ.6) THEN
|
|
READ(IBUFF,*) TAU0(1),TAU0(ND)
|
|
END IF
|
|
IF(IDEPTH.EQ.3.OR.IDEPTH.EQ.5) THEN
|
|
DO ID=1,ND
|
|
IF(TAUROS(ID).LE.TDIV.AND.TAUROS(ID+1).GT.TDIV)
|
|
* ID1=ID
|
|
END DO
|
|
END IF
|
|
if(tauros(nd).le.tdiv) ID1=ND
|
|
IF(IDEPTH.EQ.3) THEN
|
|
ND0=ID1
|
|
DO ID=1,ND0
|
|
DM0(ID)=DM(ID)
|
|
TEMP0(ID)=TEMP(ID)
|
|
ELEC0(ID)=ELEC(ID)
|
|
DENS0(ID)=DENS(ID)
|
|
ZD0(ID)=ZD(ID)
|
|
END DO
|
|
nd=nd0
|
|
ELSE IF(IDEPTH.EQ.5) THEN
|
|
TAU0(ND0)=TAUROS(ID1)
|
|
END IF
|
|
IF(IDEPTH.GE.4) THEN
|
|
TAU2=TAU0(ND0)*0.99
|
|
DML0=LOG(TAU1)
|
|
DLGM=(LOG(TAU2)-DML0)/(ND0-2)
|
|
DO I=1,ND0-1
|
|
TAU0(I)=EXP(DML0+(I-1)*DLGM)
|
|
END DO
|
|
CALL INTERP(TAUROS,DM,TAU0,DM0,ND,ND0,2,1,0)
|
|
CALL INTERP(TAUROS,TEMP,TAU0,TEMP0,ND,ND0,2,1,0)
|
|
CALL INTERP(TAUROS,ELEC,TAU0,ELEC0,ND,ND0,2,1,1)
|
|
CALL INTERP(TAUROS,DENS,TAU0,DENS0,ND,ND0,2,1,1)
|
|
CALL INTERP(TAUROS,ZD,TAU0,ZD0,ND,ND0,2,1,0)
|
|
END IF
|
|
c IFZ0=-1
|
|
ZND=ZD0(ND0)
|
|
IF(INZD.GT.0) THEN
|
|
INZD=0
|
|
IF(INSE.GT.0) INSE=INSE-1
|
|
END IF
|
|
END IF
|
|
C
|
|
C in the two last options - interpolation from the previous
|
|
C Rosseland opacity scale to the new scale and from the previous
|
|
C mass depth scale to the new one
|
|
C
|
|
IF(IDEPTH.GT.0) THEN
|
|
ND=ND0
|
|
DO I=1,ND
|
|
DM(I)=DM0(I)
|
|
TEMP(I)=TEMP0(I)
|
|
ELEC(I)=ELEC0(I)
|
|
DENS(I)=DENS0(I)
|
|
ZD(I)=ZD0(I)
|
|
END DO
|
|
END IF
|
|
C
|
|
C Recalculation of the populations
|
|
C
|
|
DO ID=1,ND
|
|
AN=DENS(ID)/WMM(ID)+ELEC(ID)
|
|
ANEREL=ELEC(ID)/AN
|
|
CALL ELDENS(ID,TEMP(ID),AN,ANE,ENRG,ENTT,WM,1)
|
|
ELEC(ID)=ANE
|
|
DENS(ID)=WMM(ID)*(AN-ANE)
|
|
PGS(ID)=AN*BOLK*TEMP(ID)
|
|
PHMOL(ID)=AHMOL
|
|
CALL WNSTOR(ID)
|
|
CALL STEQEQ(ID,POP,1)
|
|
END DO
|
|
if(nconit.lt.0) CALL PSOLVE
|
|
IF(HMIX0.GE.0.AND.IPRING.GT.0) CALL CONOUT(2,IPRING)
|
|
LCHC=LCHC0
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE TEMPER(ID,TAUF,ITGR)
|
|
C ===============================
|
|
C
|
|
C Auxiliary procedure for LTEGR
|
|
C Evaluation of temperature, electron density, Rosseland opacity
|
|
C and Planck mean opacity for at a given depth point
|
|
C
|
|
C Input parameters:
|
|
C ID - depth index
|
|
C TAUF - Rosseland optical depth (if ITGR = -1, 0 or 1
|
|
C - flux mean opacity (if ITGR > 1)
|
|
C ITGR = -1, 0, 1 - means that TEMPER is called in the first
|
|
C iteration of the pseudo-grey model;
|
|
C temperature is evaluated;
|
|
C > 1 - next iterations; temperature is given,
|
|
C only evaluation of electron density and
|
|
C populations
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
COMMON/PRSAUX/VSND2(MDEPTH),HG1,HR1,RR1
|
|
COMMON/FLXAUX/T4,PGAS,PRAD,PGM,PRADM,ITGMAX,ITGMX0
|
|
COMMON/FACTRS/GAMJ(MDEPTH),GAMH,FAK0
|
|
PARAMETER (ERRT=1.D-3)
|
|
C
|
|
IT=0
|
|
IF(ITGR.GT.1.AND.ITGMAX.GT.0) THEN
|
|
T=TEMP(ID)
|
|
GO TO 10
|
|
END IF
|
|
C
|
|
IF(ID.EQ.1) THEN
|
|
DDM=HALF*DM(ID)
|
|
ELSE
|
|
DDM=DM(ID)-DM(ID-1)
|
|
END IF
|
|
C
|
|
C
|
|
C Initial estimate of temperature for current values of Rosseland
|
|
C and Planck mean opacities
|
|
C
|
|
call tlocal(id,tauf,t)
|
|
C
|
|
C ********** Iteration loop for determining temperature at depth ID
|
|
C for a given total pressure
|
|
C
|
|
10 IT=IT+1
|
|
TEMP(ID)=T
|
|
C
|
|
C Estimate of the gas pressure
|
|
C
|
|
PRAD=1.8912D-15*T4*(GAMH*5.7735D-1+TAUF-TAUTHE(ID))
|
|
PTURB=HALF*DENS(ID)*VTURB(ID)*VTURB(ID)
|
|
PGAS=PGS(ID)
|
|
PTOT=PGAS+PRAD+PTURB
|
|
PTOTAL(ID)=PTOT
|
|
PRADT(ID)=PRAD
|
|
IF(PGAS.LE.0.) WRITE(6,603) ID,IT,PGAS,PTOT,PTURB,PRAD
|
|
603 format(' negative gas pressure!! id,it,pgas,p,pturb,prad =',
|
|
* 2i3,1p4d9.2)
|
|
C
|
|
C Determination of electron density from the known temperature
|
|
C and total pressure
|
|
C
|
|
if(ioptab.ge.-1) then
|
|
AN=PGAS/T/BOLK
|
|
CALL ELDENS(ID,T,AN,ANE,ENRG,ENTT,WM,1)
|
|
ELEC(ID)=ANE
|
|
DENS(ID)=WMM(ID)*(AN-ANE)
|
|
PHMOL(ID)=AHMOL
|
|
VSND2(ID)=PTOTAL(ID)/DENS(ID)
|
|
if(ioptab.ge.0) then
|
|
CALL WNSTOR(ID)
|
|
CALL STEQEQ(ID,POP,1)
|
|
end if
|
|
end if
|
|
c IF(IT.GT.1.AND.REL.LT.ERRT) GO TO 30
|
|
C
|
|
C For itgr.gt.1 - only new electron density and populations
|
|
C
|
|
IF(ITGR.GT.1) RETURN
|
|
C
|
|
C Evaluation of the Rosseland and Planck mean opacities
|
|
C for the new values of temperature, electron density, and
|
|
C populations (OPROS - Rosseland opacity per 1 cm**3; OPPLA - Planck
|
|
C mean opacity per 1 cm**3)
|
|
C
|
|
if(ioptab.ge.0) then
|
|
CALL OPACF0(ID,NFREQ)
|
|
CALL MEANOP(T,ABSO,SCAT,OPROS,OPPLA)
|
|
ABROS=OPROS/DENS(ID)
|
|
ABPLA=OPPLA/DENS(ID)
|
|
if(abpla.lt.abpmin) abpla=abpmin
|
|
ABFLX=ABROS
|
|
ABPLAD(ID)=ABPLA
|
|
ABROSD(ID)=ABROS
|
|
else if(ioptab.eq.-1) then
|
|
rho=dens(id)
|
|
call meanopt(t,id,rho,opros,oppla)
|
|
abrosd(id)=opros
|
|
abplad(id)=oppla
|
|
abros=opros
|
|
abpla=oppla
|
|
else
|
|
temp(id)=t
|
|
rho=rhoeos(t,p)
|
|
dens(id)=rho
|
|
call meanopt(t,id,rho,opros,oppla)
|
|
abrosd(id)=opros
|
|
abplad(id)=oppla
|
|
abros=opros
|
|
abpla=oppla
|
|
end if
|
|
c
|
|
IF(IT.GT.1.AND.REL.LT.ERRT) GO TO 30
|
|
C
|
|
C New values of the Rosseland opacity and function tauthe
|
|
C
|
|
IF(ID.EQ.1) THEN
|
|
TAUR=DM(ID)*ABROS
|
|
TAUTHE(ID)=DM(ID)*ABFLX*THETA(ID)/(ZETA1+TWO)
|
|
ELSE
|
|
TAUR=TAUROS(ID-1)+DDM*HALF*(ABROSD(ID-1)+ABROS)
|
|
ABFLXM=ABROSD(ID-1)
|
|
ZETAD=ZETA0
|
|
IF(DM(ID).LE.DMVISC*DM(ND)) ZETAD=ZETA1
|
|
A0=(ABFLXM*DM(ID)-ABFLX*DM(ID-1))/DDM/(ZETAD+TWO)
|
|
A1=(ABFLX-ABFLXM)/DDM/(ZETAD+3.D0)
|
|
TAUTHE(ID)=TAUTHE(ID-1)+
|
|
* A0*(THETA(ID)*DM(ID)-THETA(ID-1)*DM(ID-1))+
|
|
* A1*(THETA(ID)*DM(ID)**2-THETA(ID-1)*DM(ID-1)**2)
|
|
END IF
|
|
TAUF=TAUR
|
|
C
|
|
C New value of temperature
|
|
C
|
|
call tlocal(id,tauf,t)
|
|
C
|
|
C Convergence criterion for temperature
|
|
C (if REL < 1e-3, temperature is not recalculated again, but for
|
|
C consistency the electron density and pressures are still
|
|
C calculated consistently with the last temperature)
|
|
C
|
|
REL=ABS(T-TEMP(ID))/TEMP(ID)
|
|
IF(IT.LE.5) GO TO 10
|
|
C
|
|
C Store the final quantitites
|
|
C
|
|
30 TEMP(ID)=T
|
|
PGS(ID)=PGAS
|
|
VSND2(ID)=PTOTAL(ID)/DENS(ID)
|
|
ABROSD(ID)=ABROS
|
|
ABPLAD(ID)=ABPLA
|
|
TAUROS(ID)=TAUR
|
|
TAUFLX(ID)=TAUF
|
|
IF(ID.NE.1) RETURN
|
|
DPRAD=1.8912D-15*T4*(TAUF-TAUTHE(ID))
|
|
HG1=SQRT(2.D0*PGS(1)/DENS(1)/QGRAV)
|
|
HR1=DPRAD/DM(1)/QGRAV
|
|
RR1=HR1/HG1
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
subroutine tlocal(id,tauf,t)
|
|
c ============================
|
|
c
|
|
c local temperature as a a function of optical depth
|
|
c for a grey model
|
|
c
|
|
c input; ID - depth index
|
|
c TAUF - current estimate of the flux-mean opacity
|
|
c output: T - local temperature
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
parameter (c1=0.8112,c2=3.966e14,c3=6.745e-10,c4=0.96,
|
|
* c23=c2*c3,c34=c3*c4)
|
|
c
|
|
COMMON/FLXAUX/T4,PGAS,PRAD,PGM,PRADM,ITGMAX,ITGMX0
|
|
COMMON/FACTRS/GAMJ(MDEPTH),GAMH,FAK0
|
|
C
|
|
if(tdisk.gt.0.) then
|
|
t=tdisk
|
|
return
|
|
end if
|
|
c
|
|
vis=viscd(id)/(3.*dm(nd))
|
|
extra=4.*fak0*wdil*(tstar/teff)**4
|
|
gj=gamj(id)
|
|
gh=gamh*5.7735e-1
|
|
gg=(tauf-tauthe(id))*fractv+gh+extra
|
|
c
|
|
if(icompt.eq.0.or.icomgr.eq.0) then
|
|
t=(0.75*t4*(gj*gg+vis/abplad(id)))**0.25
|
|
return
|
|
end if
|
|
c
|
|
epsbar=abplad(id)/abrosd(id)
|
|
tfor=c1*teff*epsbar**(-0.125)
|
|
tf0=tfor
|
|
if(tauf.gt.un.and.tfor.lt.temp(id).or.tauf.ge.100.) then
|
|
tfor=0.
|
|
b=gg*(c3-c34)
|
|
b=0.
|
|
else
|
|
b=gg*c3
|
|
end if
|
|
a=epsbar/(0.75*t4)
|
|
c=gg*(epsbar*gj+c34*tfor)+vis/abrosd(id)
|
|
call quartc(a,b,c,t1)
|
|
t=t1
|
|
c
|
|
return
|
|
end
|
|
|
|
C
|
|
C
|
|
C ***************************************************************
|
|
C
|
|
C
|
|
|
|
subroutine quartc(a,b,c,x)
|
|
C ==========================
|
|
c
|
|
c solver for the algebraic equation of the fourth order
|
|
c a*x**4 + b*x =c
|
|
c
|
|
c solution done by the Newton-Raphson method
|
|
c
|
|
c Initial estimate
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
c
|
|
if(a.gt.b) then
|
|
x=(c/a)**0.25
|
|
else
|
|
x=c/b
|
|
end if
|
|
c
|
|
it=0
|
|
10 continue
|
|
it=it+1
|
|
ax=a*x**3
|
|
v=c-b*x-x*ax
|
|
d=4.*ax+b
|
|
if(d.ne.0.) dx=v/d
|
|
x=x+dx
|
|
if(abs(dx/x).gt.1.e-3) then
|
|
if(it.lt.20) go to 10
|
|
else
|
|
if(it.ge.20) write(6,601) a,b,c,dx,x
|
|
end if
|
|
601 format(' slow convergence of quartic solver'/
|
|
* ' a,b,c,dx,x = ',1p5e13.4)
|
|
return
|
|
end
|
|
|
|
C
|
|
C
|
|
C ******************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE NEWDM
|
|
C ================
|
|
C
|
|
C New m-scale, calculated as that corresponding to a new
|
|
C tau(Ross)-scale, which is logarithmically equidistant, with
|
|
C a generally different step in six different regions:
|
|
C
|
|
C 1. region between the original tau(1) and T0 (taken as 0.01);
|
|
C 2. region between T0 and TC0 (taken as 0.01 and 0.1) - denser
|
|
C mesh (with number of points N0)
|
|
C 3. region between TC0 and TC1 (taken as 0.1 and 10.) - the
|
|
C central region with densest mesh (N1 points)
|
|
C 4. region between TC1 and T1 (taken as 10. and 100.) - as dens
|
|
C as the second region (N0 points)
|
|
C 5. the remaining region between T1 and the original last tau
|
|
C (more precisely, the last-but-one point TAUROS(ND-1).
|
|
C
|
|
C If T1 is greater than the original last tau, the new tau-scale
|
|
C is equidistant between T0 and the last tau.
|
|
C
|
|
C The procedure also calulates all the necessary state parameters
|
|
C for the new depth scale (density, z, pressure, opacities, and
|
|
C temperature)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (TEN=1.D1)
|
|
DIMENSION TAU(MDEPTH),TAUL(MDEPTH),DM0(MDEPTH),DENS0(MDEPTH),
|
|
* ABRS0(MDEPTH),ABPL0(MDEPTH)
|
|
COMMON/PRSAUX/VSND2(MDEPTH),HG1,HR1,RR1
|
|
COMMON/FACTRS/GAMJ(MDEPTH),GAMH,FAK0
|
|
COMMON/FLXAUX/T4,PGAS,PRAD,PGM,PRADM,ITGMAX,ITGMX0
|
|
C
|
|
DATA N0,NC0 /8,24/
|
|
DATA T0,TC0,TC1,T1 /-2.D0,-1.D0,1.D0,2.D0/
|
|
C
|
|
DO ID=1,ND
|
|
DM0(ID)=DM(ID)
|
|
DENS0(ID)=DENS(ID)
|
|
ABRS0(ID)=ABROSD(ID)
|
|
ABPL0(ID)=ABPLAD(ID)
|
|
TAUL(ID)=LOG10(TAUROS(ID))
|
|
IF(TAUL(ID).LT.T0) IMIN=ID
|
|
IF(TAUL(ID).LT.T1) IMAX=ID
|
|
END DO
|
|
ND1=ND-1
|
|
NC=2*N0+NC0
|
|
NB=ND1-NC
|
|
IF(IMAX.GE.ND1) THEN
|
|
IC=0
|
|
ELSE
|
|
X=(TAUL(IMIN)-TAUL(1))/(TAUL(ND1)-TAUL(IMAX))
|
|
X1=FLOAT(NB)/(X+UN)
|
|
IC=int(X1)
|
|
END IF
|
|
NB0=NB-IC
|
|
C
|
|
C New tau-scale
|
|
C
|
|
C First, logarithmically equidistant tau-points between tau(1)
|
|
C (which is the previous TAUROS(1)), and log tau = T0.
|
|
C Their number is NB0.
|
|
c
|
|
DT=(T0-TAUL(1))/FLOAT(NB0-1)
|
|
TAU(1)=TAUL(1)
|
|
DO ID=2,NB0
|
|
TAU(ID)=TAU(ID-1)+DT
|
|
END DO
|
|
C
|
|
IF(IC.GT.0) THEN
|
|
C
|
|
C 2.region - between log tau = T0 and TC0
|
|
C
|
|
DT=(TC0-T0)/FLOAT(N0)
|
|
DO I=1,N0
|
|
TAU(NB0+I)=TAU(NB0+I-1)+DT
|
|
END DO
|
|
C
|
|
C 3. The most dense region between TC0 and TC1 (central part)
|
|
C
|
|
NB1=NB0+N0
|
|
DT=(TC1-TC0)/FLOAT(NC0)
|
|
DO I=1,NC0
|
|
TAU(NB1+I)=TAU(NB1+I-1)+DT
|
|
END DO
|
|
C
|
|
C 4. The part similar to that between T0 and TC0, this time
|
|
C betwen TC1 and T1
|
|
C
|
|
NB2=NB1+NC0
|
|
DT=(T1-TC1)/FLOAT(N0)
|
|
DO I=1,N0
|
|
TAU(NB2+I)=TAU(NB2+I-1)+DT
|
|
END DO
|
|
C
|
|
C 5. The remainig part between T1 and the last-but-one tau
|
|
C
|
|
NB3=NB2+N0
|
|
DT=(TAUL(ND1)-T1)/FLOAT(IC)
|
|
DO I=1,IC
|
|
TAU(NB3+I)=TAU(NB3+I-1)+DT
|
|
END DO
|
|
TAU(ND)=TAUL(ND)
|
|
C
|
|
C The case where the last tau is smaller than T1; in this case
|
|
C the points are logarithmically equidistant between T0 and the
|
|
C last-but-one tau
|
|
C
|
|
ELSE
|
|
DT=(TAUL(ND1)-T0)/FLOAT(NC)
|
|
DO I=1,NC
|
|
TAU(NB0+I)=TAU(NB0+I-1)+DT
|
|
END DO
|
|
TAU(ND)=TAUL(ND)
|
|
C
|
|
END IF
|
|
C
|
|
C ---------------------------------------
|
|
C
|
|
C Final new Rosseland optical depth scale
|
|
C
|
|
DO ID=1,ND
|
|
TAU(ID)=TEN**TAU(ID)
|
|
END DO
|
|
C
|
|
C Interpolation from the old to the new tau(Ross) scale to
|
|
C get the new m-scale, density and Planck mean opacity
|
|
C
|
|
CALL INTERP(TAUROS,DM0,TAU,DM,ND,ND,2,1,1)
|
|
CALL INTERP(DM0,DENS0,DM,DENS,ND,ND,2,1,1)
|
|
CALL INTERP(DM0,ABRS0,DM,ABROSD,ND,ND,2,1,1)
|
|
CALL INTERP(DM0,ABPL0,DM,ABPLAD,ND,ND,2,1,1)
|
|
C
|
|
C New Rosseland opacity and functions theta and tauthe
|
|
C
|
|
AMUV0=DMVISC**(ZETA0+UN)
|
|
AMUV1=UN-AMUV0
|
|
DO ID=1,ND
|
|
IF(DM(ID).LE.DMVISC*DM(ND)) THEN
|
|
VISCD(ID)=(UN-FRACTV)*(ZETA1+UN)/
|
|
* DMVISC**(ZETA1+UN)*(DM(ID)/DM(ND))**ZETA1
|
|
THETA(ID)=(UN-FRACTV)*(DM(ID)/DMVISC/DM(ND))**(ZETA1+UN)
|
|
ELSE
|
|
VISCD(ID)=FRACTV*(ZETA0+UN)/AMUV1*
|
|
* (DM(ID)/DM(ND))**ZETA0
|
|
THETA(ID)=(UN-FRACTV)+FRACTV*((DM(ID)/DM(ND))**(ZETA0+UN)-
|
|
* AMUV0)/AMUV1
|
|
END IF
|
|
GAMJ(ID)=UN
|
|
IF(ID.EQ.1) THEN
|
|
TAUROS(ID)=DM(ID)*ABROSD(ID)
|
|
TAUTHE(ID)=TAUROS(ID)*THETA(ID)/(ZETA1+TWO)
|
|
ANEREL=ELEC(ID)/(DENS(ID)/WMM(ID)+ELEC(ID))
|
|
ELSE
|
|
DDM=DM(ID)-DM(ID-1)
|
|
TAUROS(ID)=TAUROS(ID-1)+DDM*HALF*(ABROSD(ID-1)+ABROSD(ID))
|
|
ZETAD=ZETA0
|
|
IF(DM(ID).LE.DMVISC*DM(ND)) ZETAD=ZETA1
|
|
A0=(ABROSD(ID-1)*DM(ID)-ABROSD(ID)*DM(ID-1))/DDM/
|
|
* (ZETAD+TWO)
|
|
A1=(ABROSD(ID)-ABROSD(ID-1))/DDM/(ZETAD+3.D0)
|
|
TAUTHE(ID)=TAUTHE(ID-1)+
|
|
* A0*(THETA(ID)*DM(ID)-THETA(ID-1)*DM(ID-1))+
|
|
* A1*(THETA(ID)*DM(ID)**2-THETA(ID-1)*DM(ID-1)**2)
|
|
END IF
|
|
TAUR=TAUROS(ID)
|
|
CALL TEMPER(ID,TAUR,1)
|
|
END DO
|
|
C
|
|
C Next step - simultaneous solution of the hydrostatic
|
|
C equilibrium and the z-m relation
|
|
C
|
|
if(nconit.ge.0) CALL HESOLV
|
|
C
|
|
C New temperature and mean opacities for the current density
|
|
C and pressure
|
|
C
|
|
DO ID=1,ND
|
|
TAUR=TAUROS(ID)
|
|
CALL TEMPER(ID,TAUR,1)
|
|
END DO
|
|
C
|
|
C Once again - simultaneous solution of the hydrostatic
|
|
C equilibrium and the z-m relation
|
|
C
|
|
if(nconit.ge.0) CALL HESOLV
|
|
C
|
|
IF(IPRING.GE.1) THEN
|
|
WRITE(6,601)
|
|
DO ID=1,ND
|
|
WRITE(6,602) ID,DM(ID),TAUROS(ID),
|
|
* TEMP(ID),ELEC(ID),PTOTAL(ID),
|
|
* ZD(ID),ABROSD(ID),ABPLAD(ID)
|
|
END DO
|
|
END IF
|
|
C
|
|
601 FORMAT(1H1,' NEW DEPTH GRID ESTABLISHED, NEW MODEL:'/
|
|
* ' --------------------------------------'/
|
|
* ' ID DM TAUROSS TEMP NE P',
|
|
* 8X,'ZD ROSS.MEAN PLANCK'/)
|
|
602 FORMAT(1H ,I3,1P2D9.2,0PF8.0,1P3D9.2,2X,2D9.2)
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE NEWDMT
|
|
C =================
|
|
C
|
|
C New m-scale, calculated as that corresponding to the new
|
|
C grid better representing temperature variations
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
DIMENSION DM0(MDEPTH),DM11(MDEPTH),DENS0(MDEPTH),ZD0(MDEPTH),
|
|
* T0(MDEPTH),T1(MDEPTH),ELEC0(MDEPTH),PT0(MDEPTH),
|
|
* ABRS0(MDEPTH),ABPL0(MDEPTH)
|
|
COMMON/PRSAUX/VSND2(MDEPTH),HG1,HR1,RR1
|
|
COMMON/FACTRS/GAMJ(MDEPTH),GAMH,FAK0
|
|
COMMON/FLXAUX/T4,PGAS,PRAD,PGM,PRADM,ITGMAX,ITGMX0
|
|
C
|
|
DO ID=1,ND
|
|
DM0(ID)=LOG10(DM(ID))
|
|
T0(ID)=LOG10(TAUROS(ID))
|
|
ELEC0(ID)=ELEC(ID)
|
|
DENS0(ID)=DENS(ID)
|
|
PT0(ID)=PTOTAL(ID)
|
|
ZD0(ID)=ZD(ID)
|
|
ABRS0(ID)=ABROSD(ID)
|
|
ABPL0(ID)=ABPLAD(ID)
|
|
END DO
|
|
ND1=ND-1
|
|
CALL GRIDP(DM0,T0,DM11,T1,ND1)
|
|
DM11(ND)=DM0(ND)
|
|
T1(ND)=T0(ND)
|
|
DO ID=1,ND
|
|
DM(ID)=EXP(2.3025851*DM11(ID))
|
|
TAUROS(ID)=EXP(2.3025851*T1(ID))
|
|
END DO
|
|
CALL INTERP(DM0,ELEC0,DM11,ELEC,ND,ND,2,0,1)
|
|
CALL INTERP(DM0,DENS0,DM11,DENS,ND,ND,2,0,1)
|
|
CALL INTERP(DM0,PT0,DM11,PTOTAL,ND,ND,2,0,1)
|
|
CALL INTERP(DM0,ZD0,DM11,ZD,ND,ND,2,0,0)
|
|
CALL INTERP(DM0,ABRS0,DM11,ABROSD,ND,ND,2,0,1)
|
|
CALL INTERP(DM0,ABPL0,DM11,ABPLAD,ND,ND,2,0,1)
|
|
DO ID=1,ND
|
|
VSND2(ID)=PTOTAL(ID)/DENS(ID)
|
|
END DO
|
|
C
|
|
C New Rosseland opacity and functions theta and tauthe
|
|
C
|
|
AMUV0=DMVISC**(ZETA0+UN)
|
|
AMUV1=UN-AMUV0
|
|
DO ID=1,ND
|
|
IF(DM(ID).LE.DMVISC*DM(ND)) THEN
|
|
VISCD(ID)=(UN-FRACTV)*(ZETA1+UN)/
|
|
* DMVISC**(ZETA1+UN)*(DM(ID)/DM(ND))**ZETA1
|
|
THETA(ID)=(UN-FRACTV)*(DM(ID)/DMVISC/DM(ND))**(ZETA1+UN)
|
|
ELSE
|
|
VISCD(ID)=FRACTV*(ZETA0+UN)/AMUV1*
|
|
* (DM(ID)/DM(ND))**ZETA0
|
|
THETA(ID)=(UN-FRACTV)+FRACTV*((DM(ID)/DM(ND))**(ZETA0+UN)-
|
|
* AMUV0)/AMUV1
|
|
END IF
|
|
GAMJ(ID)=UN
|
|
IF(ID.EQ.1) THEN
|
|
TAUROS(ID)=DM(ID)*ABROSD(ID)
|
|
TAUTHE(ID)=TAUROS(ID)*THETA(ID)/(ZETA1+TWO)
|
|
ANEREL=ELEC(ID)/(DENS(ID)/WMM(ID)+ELEC(ID))
|
|
ELSE
|
|
DDM=DM(ID)-DM(ID-1)
|
|
TAUROS(ID)=TAUROS(ID-1)+DDM*HALF*(ABROSD(ID-1)+ABROSD(ID))
|
|
ZETAD=ZETA0
|
|
IF(DM(ID).LE.DMVISC*DM(ND)) ZETAD=ZETA1
|
|
A0=(ABROSD(ID-1)*DM(ID)-ABROSD(ID)*DM(ID-1))/DDM/
|
|
* (ZETAD+TWO)
|
|
A1=(ABROSD(ID)-ABROSD(ID-1))/DDM/(ZETAD+3.D0)
|
|
TAUTHE(ID)=TAUTHE(ID-1)+
|
|
* A0*(THETA(ID)*DM(ID)-THETA(ID-1)*DM(ID-1))+
|
|
* A1*(THETA(ID)*DM(ID)**2-THETA(ID-1)*DM(ID-1)**2)
|
|
END IF
|
|
TAUR=TAUROS(ID)
|
|
CALL TEMPER(ID,TAUR,1)
|
|
END DO
|
|
C
|
|
C Next step - simultaneous solution of the hydrostatic
|
|
C equilibrium and the z-m relation
|
|
C
|
|
if(nconit.ge.0) CALL HESOLV
|
|
C
|
|
C New temperature and mean opacities for the current density
|
|
C and pressure
|
|
C
|
|
DO ID=1,ND
|
|
TAUR=TAUROS(ID)
|
|
CALL TEMPER(ID,TAUR,1)
|
|
END DO
|
|
C
|
|
C Once again - simultaneous solution of the hydrostatic
|
|
C equilibrium and the z-m relation
|
|
C
|
|
if(nconit.ge.0) CALL HESOLV
|
|
C
|
|
IF(IPRING.GE.1) THEN
|
|
WRITE(6,601)
|
|
DO ID=1,ND
|
|
WRITE(6,602) ID,DM(ID),TAUROS(ID),
|
|
* TEMP(ID),ELEC(ID),PTOTAL(ID),
|
|
* ZD(ID),ABROSD(ID),ABPLAD(ID)
|
|
END DO
|
|
END IF
|
|
C
|
|
601 FORMAT(1H1,' NEW DEPTH GRID ESTABLISHED, NEW MODEL:'/
|
|
* ' --------------------------------------'/
|
|
* ' ID DM TAUROSS TEMP NE P',
|
|
* 8X,'ZD ROSS.MEAN PLANCK'/)
|
|
602 FORMAT(1H ,I3,1P2D9.2,0PF8.0,1P3D9.2,2X,2D9.2)
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE GRIDP(X,Y,XNEW,YNEW,N)
|
|
c =================================
|
|
c
|
|
c evaluation of new grid points for a function; grid points
|
|
c determined by dividing the curve Y=f(x) into n-1 equal segments;
|
|
c the x-coordinates of the endpoints of the individual segments
|
|
c define new grid points
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
DIMENSION X(N),Y(N),XNEW(N),YNEW(N),Z(MDEPTH)
|
|
C
|
|
C original segments - lengths (Z), and directional cosines (CD);
|
|
C ZTOT - total length of the curve;
|
|
C Z0 - length of a new segment
|
|
C
|
|
ZTOT=0.
|
|
DO I=2,N
|
|
Z(I-1)=SQRT((X(I)-X(I-1))**2+(Y(I)-Y(I-1))**2)
|
|
ZTOT=ZTOT+Z(I-1)
|
|
END DO
|
|
Z0=ZTOT/(N-1)
|
|
C
|
|
ISEG=1
|
|
XLAST=X(ISEG)
|
|
YLAST=Y(ISEG)
|
|
ZREST=Z(ISEG)
|
|
ZREM=Z0
|
|
IP=1
|
|
XNEW(IP)=X(1)
|
|
YNEW(IP)=Y(1)
|
|
C
|
|
20 CONTINUE
|
|
IF(ZREM.LT.ZREST) THEN
|
|
ZREST=ZREST-ZREM
|
|
XLAST=XLAST+ZREM*(X(ISEG+1)-X(ISEG))/Z(ISEG)
|
|
YLAST=YLAST+ZREM*(Y(ISEG+1)-Y(ISEG))/Z(ISEG)
|
|
IP=IP+1
|
|
XNEW(IP)=XLAST
|
|
YNEW(IP)=YLAST
|
|
ZREM=Z0
|
|
IF(IP.GE.N-1) GO TO 50
|
|
ELSE
|
|
ZREM=ZREM-ZREST
|
|
ISEG=ISEG+1
|
|
XLAST=X(ISEG)
|
|
YLAST=Y(ISEG)
|
|
ZREST=Z(ISEG)
|
|
END IF
|
|
GO TO 20
|
|
50 XNEW(N)=X(N)
|
|
YNEW(N)=Y(N)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE HESOLV
|
|
C =================
|
|
C
|
|
C Solution of the coupled system of hydrostatic equilibrium equation
|
|
C and the z-m relation; with a given (generally depth-dependent) sound
|
|
C speed, defined as total pressure/density.
|
|
C Numerical solution by a Newton-Raphson method
|
|
C
|
|
C Input: P - initial total pressure
|
|
C VSND2 - sound speed squared
|
|
C HG1 - gas pressure scale height at the surface
|
|
C RR1 - ratio of radiation and gas pressure scale heights
|
|
C at the surface
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
COMMON/PRSAUX/VSND2(MDEPTH),HG1,HR1,RR1
|
|
DIMENSION P(MDEPTH),B(2,2),C(2,2),VL(2),
|
|
* D(2,2,MDEPTH),ANU(2,MDEPTH)
|
|
C
|
|
DATA ERROR /1.D-4/
|
|
C
|
|
C Density for a given total pressure and sound speed
|
|
C
|
|
DO ID=1,ND
|
|
P(ID)=PTOTAL(ID)
|
|
vsnd2(id)=p(id)/dens(id)
|
|
END DO
|
|
C
|
|
C Consistent z-values
|
|
C
|
|
c ZD(ND)=ZND
|
|
c DO IID=1,ND-1
|
|
c ID=ND-IID
|
|
c ZD(ID)=ZD(ID+1)+HALF*(DM(ID+1)-DM(ID))*(UN/DENS(ID)+
|
|
c * UN/DENS(ID+1))
|
|
c END DO
|
|
C
|
|
C Basic Newton-Raphson iteration loop
|
|
C
|
|
ITERH=0
|
|
30 CONTINUE
|
|
ITERH=ITERH+1
|
|
C
|
|
C -------------------
|
|
C Forward elimination
|
|
C -------------------
|
|
C
|
|
C Upper boundary condition
|
|
C
|
|
ID=1
|
|
X=ZD(1)/HG1-RR1
|
|
IF(X.LT.3.) THEN
|
|
IF(X.LT.0.) X=0.
|
|
F1=1.772453851D0*EXP(X*X)*ERFCX(X)
|
|
ELSE
|
|
F1=(UN-HALF/X/X)/X
|
|
END IF
|
|
BET0=HALF/DENS(ID)/P(ID)
|
|
BETP=HALF/DENS(ID+1)/P(ID+1)
|
|
GAMA=UN/(DM(ID+1)-DM(ID))
|
|
B(1,1)=F1
|
|
B(1,2)=TWO*(X*F1-UN)*P(1)/HG1
|
|
B(2,1)=BET0
|
|
B(2,2)=GAMA
|
|
C(1,1)=0.
|
|
C(1,2)=0.
|
|
C(2,1)=-BETP
|
|
C(2,2)=GAMA
|
|
VL(1)=DM(ID)*2.D0*VSND2(ID)/HG1-P(ID)*F1
|
|
VL(2)=BET0*P(ID)+BETP*P(ID+1)-GAMA*(ZD(ID)-ZD(ID+1))
|
|
ANU(1,ID)=0.
|
|
ANU(2,ID)=0.
|
|
CALL MATINV(B,2,2)
|
|
DO I=1,2
|
|
DO J=1,2
|
|
S=0.
|
|
DO K=1,2
|
|
S=S+B(I,K)*C(K,J)
|
|
END DO
|
|
D(I,J,ID)=S
|
|
ANU(I,ID)=ANU(I,ID)+B(I,J)*VL(J)
|
|
END DO
|
|
END DO
|
|
C
|
|
C Normal depth points 1 < ID < ND
|
|
C
|
|
DO ID=2,ND-1
|
|
BET0=BETP
|
|
BETP=HALF/DENS(ID+1)/P(ID+1)
|
|
GAMA=UN/(DM(ID+1)-DM(ID))
|
|
DMD=HALF*(DM(ID+1)-DM(ID-1))
|
|
AA=UN/(DM(ID)-DM(ID-1))/DMD
|
|
CC=GAMA/DMD
|
|
BB=AA+CC
|
|
BQ=QGRAV/P(ID)/DENS(ID)
|
|
B(1,1)=BB+BQ-AA*D(1,1,ID-1)
|
|
B(1,2)=-AA*D(1,2,ID-1)
|
|
B(2,1)=BET0
|
|
B(2,2)=GAMA
|
|
C(1,1)=CC
|
|
C(1,2)=0.
|
|
C(2,1)=-BETP
|
|
C(2,2)=GAMA
|
|
VL(1)=AA*P(ID-1)+CC*P(ID+1)-(BB-BQ)*P(ID)+AA*ANU(1,ID-1)
|
|
VL(2)=BET0*P(ID)+BETP*P(ID+1)-GAMA*(ZD(ID)-ZD(ID+1))
|
|
CALL MATINV(B,2,2)
|
|
ANU(1,ID)=0.
|
|
ANU(2,ID)=0.
|
|
DO I=1,2
|
|
DO J=1,2
|
|
S=0.
|
|
DO K=1,2
|
|
S=S+B(I,K)*C(K,J)
|
|
END DO
|
|
D(I,J,ID)=S
|
|
ANU(I,ID)=ANU(I,ID)+B(I,J)*VL(J)
|
|
END DO
|
|
END DO
|
|
END DO
|
|
C
|
|
C Lower boundary condition
|
|
C
|
|
ID=ND
|
|
AA=TWO/(DM(ID)-DM(ID-1))**2
|
|
BQ=QGRAV/P(ID)/DENS(ID)
|
|
B(1,1)=AA+BQ-AA*D(1,1,ID-1)
|
|
B(1,2)=-AA*D(1,2,ID-1)
|
|
B(2,1)=0.
|
|
B(2,2)=UN
|
|
VL(1)=QGRAV/DENS(ID)+AA*(P(ID-1)-P(ID)+ANU(1,ID-1))
|
|
VL(2)=0.
|
|
CALL MATINV(B,2,2)
|
|
ANU(1,ID)=0.
|
|
ANU(2,ID)=0.
|
|
DO I=1,2
|
|
DO J=1,2
|
|
S=0.
|
|
DO K=1,2
|
|
S=S+B(I,K)*C(K,J)
|
|
END DO
|
|
D(I,J,ID)=S
|
|
ANU(I,ID)=ANU(I,ID)+B(I,J)*VL(J)
|
|
END DO
|
|
END DO
|
|
C
|
|
C ------------
|
|
C Backsolution
|
|
C ------------
|
|
C
|
|
P(ID)=P(ID)+ANU(1,ID)
|
|
ZD(ID)=ZND
|
|
CHMAXX=ABS(ANU(1,ID)/P(ID))
|
|
DO IID=1,ND-1
|
|
ID=ND-IID
|
|
DO I=1,2
|
|
DO J=1,2
|
|
ANU(I,ID)=ANU(I,ID)+D(I,J,ID)*ANU(J,ID+1)
|
|
END DO
|
|
END DO
|
|
CH1=ANU(1,ID)/P(ID)
|
|
CH2=ANU(2,ID)/ZD(ID)
|
|
IF(ABS(CH1).GT.CHMAXX) CHMAXX=ABS(CH1)
|
|
IF(ABS(CH2).GT.CHMAXX) CHMAXX=ABS(CH2)
|
|
IF(CH1.LT.-0.9D0) CH1=-0.9D0
|
|
IF(CH1.GT.9.D0) CH1=9.D0
|
|
P(ID)=P(ID)*(UN+CH1)
|
|
END DO
|
|
C
|
|
C Recalculate density for the new total pressure
|
|
C
|
|
DO ID=1,ND
|
|
DENS(ID)=P(ID)/VSND2(ID)
|
|
END DO
|
|
C
|
|
C New z-values
|
|
C
|
|
ZD(ND)=ZND
|
|
DO IID=1,ND-1
|
|
ID=ND-IID
|
|
ZD(ID)=ZD(ID+1)+HALF*(DM(ID+1)-DM(ID))*(UN/DENS(ID)+
|
|
* UN/DENS(ID+1))
|
|
END DO
|
|
C
|
|
C Convergence criterion for the Newton-Raphson method
|
|
C
|
|
IF(IPRING.GE.1) WRITE(6,601) ITERH,CHMAXX
|
|
601 FORMAT(/' solution of hydrostatic eq. + z-m relation:',
|
|
* 'iter = ',I3,' max.rel.chan. =',1PD10.2)
|
|
IF(CHMAXX.GT.ERROR.AND.ITERH.LT.10) GO TO 30
|
|
C
|
|
DO ID=1,ND
|
|
X=PGS(ID)/PTOTAL(ID)
|
|
PTOTAL(ID)=P(ID)
|
|
PGS(ID)=X*P(ID)
|
|
END DO
|
|
C
|
|
C Recalculation of the populations
|
|
C
|
|
if(ih2p.ge.0) then
|
|
ID=1
|
|
ANEREL=ELEC(ID)/(DENS(ID)/WMM(ID)+ELEC(ID))
|
|
DO ID=1,ND
|
|
CALL RHONEN(ID,TEMP(ID),DENS(ID),AN,ANE)
|
|
ELEC(ID)=ANE
|
|
CALL WNSTOR(ID)
|
|
CALL STEQEQ(ID,POP,1)
|
|
END DO
|
|
end if
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE HESOL6
|
|
C =================
|
|
C
|
|
C Solution of the coupled system of
|
|
C 1) hydrostatic equilibrium equation;
|
|
C 2) definitions of Ptotal, Pgas and rho;
|
|
C 3) state equation
|
|
C 4) z-m relation
|
|
C with a given temperature and radiation pressure
|
|
C Numerical solution by a Newton-Raphson method
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (MP=6,NP=6,IP=1,IG=2,IR=3,IN=4,IE=5,IZ=6)
|
|
PARAMETER (NITERH=15)
|
|
COMMON/PRSAUX/VSND2(MDEPTH),HG1,HR1,RR1
|
|
DIMENSION P(MDEPTH),ANTT(MDEPTH),CHNG(MDEPTH),
|
|
* VEC(MP,MDEPTH),VEC1(MP,MDEPTH),
|
|
* VEC2(MP,MDEPTH),VEC3(MP,MDEPTH),
|
|
* SOL(MP),ERR(MP),CHN(MP),
|
|
* A(MP,MP),B(MP,MP),C(MP,MP),VL(MP),
|
|
* D(MP,MP,MDEPTH),ANU(MP,MDEPTH),
|
|
* anerl(mdepth)
|
|
C
|
|
DATA ERROR /1.D-4/
|
|
C
|
|
C radiation pressure scale feight at the surface
|
|
C
|
|
ID=1
|
|
IF(ITER.EQ.0) THEN
|
|
HR1=SIG4P*TEFF**4*PCK*ABROSD(ID)/QGRAV
|
|
ELSE
|
|
IF(NFREQE.GT.0) THEN
|
|
DO IJ=1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
IF(.NOT.LSKIP(ID,IJT)) THEN
|
|
FLUXW=W(IJT)*(FH(IJT)*RADEX(IJ,ID)-HEXTRD(IJT))
|
|
GRD=GRD+FLUXW*ABSOE1(IJ)
|
|
END IF
|
|
END DO
|
|
END IF
|
|
HR1=PCK/QGRAV*(GRD+FPRD(ID))/DENS(ID)
|
|
END IF
|
|
do id=1,nd
|
|
ANTT(ID)=DENS(ID)/WMM(ID)+ELEC(ID)
|
|
PGS(ID)=ANTT(ID)*BOLK*TEMP(ID)
|
|
PTOTAL(ID)=PRADT(ID)+PGS(ID)
|
|
end do
|
|
C
|
|
C Basic Newton-Raphson iteration loop
|
|
C
|
|
ITERH=0
|
|
LAC2H=.FALSE.
|
|
IACH=6
|
|
IACDH=4
|
|
IACH0=IACH-3
|
|
10 CONTINUE
|
|
ITERH=ITERH+1
|
|
C
|
|
C -------------------
|
|
C Forward elimination
|
|
C -------------------
|
|
C
|
|
DO ID=1,ND
|
|
ANTT(ID)=DENS(ID)/WMM(ID)+ELEC(ID)
|
|
PGS(ID)=ANTT(ID)*BOLK*TEMP(ID)
|
|
PTOTAL(ID)=PRADT(ID)+PGS(ID)
|
|
P(ID)=PTOTAL(ID)
|
|
VEC(IP,ID)=PTOTAL(ID)
|
|
VEC(IG,ID)=PGS(ID)
|
|
VEC(IR,ID)=DENS(ID)
|
|
VEC(IN,ID)=ANTT(ID)
|
|
VEC(IE,ID)=ELEC(ID)
|
|
VEC(IZ,ID)=ZD(ID)
|
|
C
|
|
DO I=1,NP
|
|
VL(I)=0.
|
|
DO J=1,NP
|
|
B(I,J)=0.
|
|
A(I,J)=0.
|
|
C(I,J)=0.
|
|
END DO
|
|
END DO
|
|
C
|
|
IF(ID.EQ.1) THEN
|
|
HG1=SQRT(TWO*PGS(ID)/DENS(ID)/QGRAV)
|
|
X=(ZD(ID)-HR1)/HG1
|
|
IF(X.LT.3.) THEN
|
|
IF(X.LT.0.) X=0.
|
|
F1=8.86226925D-1*EXP(X*X)*ERFCX(X)
|
|
ELSE
|
|
F1=HALF*(UN-HALF/X/X)/X
|
|
END IF
|
|
X1=X*1.01
|
|
F1D=0.
|
|
IF(X1.LT.3.) THEN
|
|
F1D=8.86226925D-1*EXP(X1*X1)*ERFCX(X1)
|
|
ELSE
|
|
F1D=HALF*(UN-HALF/X1/X1)/X1
|
|
END IF
|
|
IF(X.GT.0.) F1D=(F1D-F1)*100./X
|
|
B(IG,IG)=DENS(ID)*HG1*HALF/PGS(ID)*(F1-F1D*X)
|
|
B(IG,IR)=HG1*HALF*(F1+F1D*X)
|
|
B(IG,IZ)=DENS(ID)*F1D
|
|
VL(IG)=DM(ID)-DENS(ID)*HG1*F1
|
|
B(IP,IP)=UN
|
|
B(IP,IG)=-UN
|
|
VL(IP)=PRADT(ID)+PGS(ID)-P(ID)
|
|
ELSE
|
|
DMM=UN/(DM(ID)-DM(ID-1))
|
|
QG=HALF*QGRAV
|
|
B(IP,IP)=DMM
|
|
B(IP,IZ)=-QG
|
|
A(IP,IP)=DMM
|
|
A(IP,IZ)=QG
|
|
VL(IP)=QG*(ZD(ID)+ZD(ID-1))-(P(ID)-P(ID-1))*DMM
|
|
B(IG,IP)=UN
|
|
B(IG,IG)=-UN
|
|
VL(IG)=PRADT(ID)+PGS(ID)-P(ID)
|
|
END IF
|
|
C
|
|
B(IR,IR)=UN
|
|
B(IR,IN)=-WMM(ID)
|
|
B(IR,IE)=WMM(ID)
|
|
VL(IR)=wmm(id)*(antt(id)-elec(id))-dens(id)
|
|
C
|
|
B(IN,IG)=UN
|
|
B(IN,IN)=-BOLK*TEMP(ID)
|
|
VL(IN)=antt(id)*bolk*temp(id)-pgs(id)
|
|
C
|
|
T=TEMP(ID)
|
|
AN=ANTT(ID)
|
|
ANERL(ID)=ELEC(ID)/AN
|
|
B(IE,IE)=UN
|
|
b(ie,in)=-anerl(id)
|
|
vl(ie)=anerl(id)*antt(id)-elec(id)
|
|
C
|
|
IF(ID.LT.ND) THEN
|
|
DMP=(DM(ID+1)-DM(ID))*HALF
|
|
B(IZ,IR)=DMP/DENS(ID)**2
|
|
B(IZ,IZ)=UN
|
|
C(IZ,IR)=-DMP/DENS(ID+1)**2
|
|
C(IZ,IZ)=UN
|
|
VL(IZ)=ZD(ID+1)-ZD(ID)+DMP/DENS(ID)+DMP/DENS(ID+1)
|
|
ELSE
|
|
B(IZ,IZ)=UN
|
|
VL(IZ)=0.
|
|
END IF
|
|
C
|
|
IF(ID.GT.1) THEN
|
|
B(IP,IR)=B(IP,IR)-
|
|
* A(IP,IP)*D(IP,IR,ID-1)-
|
|
* A(IP,IZ)*D(IZ,IR,ID-1)
|
|
B(IP,IZ)=B(IP,IZ)-
|
|
* A(IP,IP)*D(IP,IZ,ID-1)-
|
|
* A(IP,IZ)*D(IZ,IZ,ID-1)
|
|
VL(IP)=VL(IP)+A(IP,IP)*ANU(IP,ID-1)+
|
|
* A(IP,IZ)*ANU(IZ,ID-1)
|
|
END IF
|
|
C
|
|
CALL MATINV(B,NP,MP)
|
|
C
|
|
DO I=1,NP
|
|
SUM=0.
|
|
DO J=1,NP
|
|
SUM=SUM+B(I,J)*VL(J)
|
|
END DO
|
|
ANU(I,ID)=SUM
|
|
END DO
|
|
IF(ID.LT.ND) THEN
|
|
DO I=1,NP
|
|
D(I,IR,ID)=B(I,IZ)*C(IZ,IR)
|
|
D(I,IZ,ID)=B(I,IZ)*C(IZ,IZ)
|
|
END DO
|
|
END IF
|
|
END DO
|
|
C
|
|
C -------------------
|
|
C backsubstitution
|
|
C -------------------
|
|
C
|
|
CHANM=0
|
|
DO ID=ND,1,-1
|
|
CHNG(ID)=0.
|
|
IF(ID.EQ.ND) THEN
|
|
DO I=1,NP
|
|
SOL(I)=ANU(I,ID)
|
|
END DO
|
|
ELSE
|
|
DO I=1,NP
|
|
ANU(I,ID)=ANU(I,ID)+D(I,IR,ID)*ANU(IR,ID+1)+
|
|
* D(I,IZ,ID)*ANU(IZ,ID+1)
|
|
SOL(I)=ANU(I,ID)
|
|
END DO
|
|
END IF
|
|
DO I=1,NP
|
|
CHAN=0.
|
|
IF(VEC(I,ID).NE.0.) CHAN=SOL(I)/VEC(I,ID)
|
|
CHN(I)=CHAN
|
|
IF(ABS(CHAN).GT.CHANM) CHANM=ABS(CHAN)
|
|
IF(ABS(CHAN).GT.CHNG(ID)) CHNG(ID)=ABS(CHAN)
|
|
IF(CHAN.LT.-0.99) CHAN=-0.99
|
|
IF(CHAN.GT.99.00) CHAN=99.00
|
|
VEC(I,ID)=VEC(I,ID)*(UN+CHAN)
|
|
END DO
|
|
C
|
|
PTOTAL(ID)=VEC(IP,ID)
|
|
P(ID)=PTOTAL(ID)
|
|
PGS(ID)=VEC(IG,ID)
|
|
DENS(ID)=VEC(IR,ID)
|
|
ANTT(ID)=VEC(IN,ID)
|
|
ELEC(ID)=VEC(IE,ID)
|
|
ZD(ID)=VEC(IZ,ID)
|
|
C
|
|
IF(ID.EQ.1) THEN
|
|
HG1=SQRT(TWO*PGS(ID)/DENS(ID)/QGRAV)
|
|
X=(ZD(ID)-HR1)/HG1
|
|
IF(X.LT.3.) THEN
|
|
IF(X.LT.0.) X=0.
|
|
F1=8.86226925D-1*EXP(X*X)*ERFCX(X)
|
|
ELSE
|
|
F1=HALF*(UN-HALF/X/X)/X
|
|
END IF
|
|
ERR(IP)=(DENS(ID)*HG1*F1-DM(ID))/DM(ID)
|
|
ELSE IF(ID.LT.ND) THEN
|
|
ERR(IP)=(P(ID+1)-P(ID))/(DM(ID+1)-DM(ID))*
|
|
* TWO/QGRAV/(ZD(ID+1)+ZD(ID))-UN
|
|
ELSE
|
|
ERR(IP)=0.
|
|
END IF
|
|
IF(P(ID).NE.0.) ERR(IG)=
|
|
* (PRADT(ID)+PGS(ID)-P(ID))/P(ID)
|
|
IF(DENS(ID).NE.0.) ERR(IR)=
|
|
* (DENS(ID)-(ANTT(ID)-ELEC(ID))*WMM(ID))/DENS(ID)
|
|
IF(PGS(ID).NE.0.) ERR(IN)=
|
|
* (PGS(ID)-ANTT(ID)*BOLK*TEMP(ID))/PGS(ID)
|
|
IF(ELEC(ID).NE.0.)
|
|
* ERR(IE)=(ELEC(ID)-ANerl(id)*antt(id))/ELEC(ID)
|
|
IF(ID.LT.ND) THEN
|
|
ERR(IZ)=(ZD(ID)-ZD(ID+1))*TWO/(DM(ID+1)-DM(ID))/
|
|
* (UN/DENS(ID)+UN/DENS(ID+1))-UN
|
|
ELSE
|
|
ERR(IZ)=ZD(ID)
|
|
END IF
|
|
END DO
|
|
C
|
|
C acceleration
|
|
C
|
|
IF(NITERH.LT.IACH .OR. ITERH.LT.IACH0) GO TO 100
|
|
ipngH=1
|
|
if(iacdH.gt.0) ipngH=mod((iterH-iacH),iacdH)
|
|
if(.not.lac2H) then
|
|
IPT=MOD(ITERH,3)
|
|
IPT0=MOD(IACH,3)
|
|
IPT1=MOD((IACH+1),3)
|
|
IPT2=MOD((IACH+2),3)
|
|
IF(ITERH.EQ.IACH0) THEN
|
|
DO ID=1,ND
|
|
DO IX=1,NP
|
|
VEC3(IX,ID)=VEC(IX,ID)
|
|
END DO
|
|
END DO
|
|
ELSE IF(IPT.EQ.IPT1) THEN
|
|
DO ID=1,ND
|
|
DO IX=1,NP
|
|
VEC2(IX,ID)=VEC(IX,ID)
|
|
END DO
|
|
END DO
|
|
ELSE IF(IPT.EQ.IPT2) THEN
|
|
DO ID=1,ND
|
|
DO IX=1,NP
|
|
VEC1(IX,ID)=VEC(IX,ID)
|
|
END DO
|
|
END DO
|
|
ENDIF
|
|
else if (ipngH.ne.0) then
|
|
DO ID=1,ND
|
|
DO IX=1,NP
|
|
VEC3(IX,ID)=VEC2(IX,ID)
|
|
END DO
|
|
END DO
|
|
DO ID=1,ND
|
|
DO IX=1,NP
|
|
VEC2(IX,ID)=VEC1(IX,ID)
|
|
END DO
|
|
END DO
|
|
DO ID=1,ND
|
|
DO IX=1,NP
|
|
VEC1(IX,ID)=VEC(IX,ID)
|
|
END DO
|
|
END DO
|
|
GO TO 100
|
|
end if
|
|
|
|
IF(ITERH.LT.IACH) GO TO 100
|
|
C
|
|
A1=0.
|
|
B1=0.
|
|
B2=0.
|
|
C1=0.
|
|
C2=0.
|
|
DO IX=1,NP
|
|
DO ID=1,ND
|
|
WT=0.
|
|
IF(VEC(IX,ID).NE.0.) WT=1./ABS(VEC(IX,ID))
|
|
D0=VEC(IX,ID)-VEC1(IX,ID)
|
|
D1=D0-VEC1(IX,ID)+VEC2(IX,ID)
|
|
D2=D0-VEC2(IX,ID)+VEC3(IX,ID)
|
|
A1=A1+WT*D1*D1
|
|
B1=B1+WT*D1*D2
|
|
B2=B2+WT*D2*D2
|
|
C1=C1+WT*D0*D1
|
|
C2=C2+WT*D0*D2
|
|
END DO
|
|
END DO
|
|
AB=B2*A1-B1*B1
|
|
IF(AB.EQ.0.) THEN
|
|
IACH=IACH+IACDH
|
|
IACH0=IACH-3
|
|
GO TO 100
|
|
END IF
|
|
AA=(B2*C1-B1*C2)/AB
|
|
BB=(A1*C2-B1*C1)/AB
|
|
DO ID=1,ND
|
|
DO IX=1,NP
|
|
VEC(IX,ID)=(UN-AA-BB)*VEC(IX,ID)+AA*VEC1(IX,ID)+
|
|
* BB*VEC2(IX,ID)
|
|
END DO
|
|
END DO
|
|
LAC2H=.TRUE.
|
|
100 CONTINUE
|
|
C
|
|
DO ID=1,ND
|
|
PTOTAL(ID)=VEC(IP,ID)
|
|
P(ID)=PTOTAL(ID)
|
|
PGS(ID)=VEC(IG,ID)
|
|
DENS(ID)=VEC(IR,ID)
|
|
ANTT(ID)=VEC(IN,ID)
|
|
ELEC(ID)=VEC(IE,ID)
|
|
ZD(ID)=VEC(IZ,ID)
|
|
C
|
|
IF(ID.EQ.1) THEN
|
|
HG1=SQRT(TWO*PGS(ID)/DENS(ID)/QGRAV)
|
|
X=(ZD(ID)-HR1)/HG1
|
|
IF(X.LT.3.) THEN
|
|
IF(X.LT.0.) X=0.
|
|
F1=8.86226925D-1*EXP(X*X)*ERFCX(X)
|
|
ELSE
|
|
F1=HALF*(UN-HALF/X/X)/X
|
|
END IF
|
|
ERR(IP)=(DENS(ID)*HG1*F1-DM(ID))/DM(ID)
|
|
ELSE IF(ID.LT.ND) THEN
|
|
ERR(IP)=(P(ID)-P(ID-1))/(DM(ID)-DM(ID-1))*
|
|
* TWO/QGRAV/(ZD(ID)+ZD(ID-1))-UN
|
|
END IF
|
|
IF(P(ID).NE.0.) ERR(IG)=
|
|
* (PRADT(ID)+PGS(ID)-P(ID))/P(ID)
|
|
IF(DENS(ID).NE.0.) ERR(IR)=
|
|
* (DENS(ID)-(ANTT(ID)-ELEC(ID))*WMM(ID))/DENS(ID)
|
|
IF(PGS(ID).NE.0.) ERR(IN)=
|
|
* (PGS(ID)-ANTT(ID)*BOLK*TEMP(ID))/PGS(ID)
|
|
IF(ELEC(ID).NE.0.)
|
|
* ERR(IE)=(ELEC(ID)-ANerl(id)*antt(id))/ELEC(ID)
|
|
IF(ID.GT.1) THEN
|
|
ERR(IZ)=(ZD(ID-1)-ZD(ID))*TWO/(DM(ID)-DM(ID-1))/
|
|
* (UN/DENS(ID-1)+UN/DENS(ID))-UN
|
|
ELSE
|
|
ERR(IZ)=0.
|
|
END IF
|
|
END DO
|
|
C
|
|
C Convergence criterion for the Newton-Raphson method
|
|
C
|
|
IF(CHANM.GT.ERROR.AND.ITERH.LT.NITERH) GO TO 10
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C
|
|
C ***************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE PSOLVE
|
|
C =================
|
|
C
|
|
C "formal" solution of the second-order equation for the total
|
|
C pressure - d**2 P/d m**2 = Q/DENS;
|
|
C with known density
|
|
C the resulting tridiagonal system is solved by the standard
|
|
C elimination
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
DIMENSION D(MDEPTH),ANU(MDEPTH)
|
|
C
|
|
C forward elimination
|
|
C
|
|
ID=1
|
|
B=1.D0
|
|
VL=PTOTAL(ID)
|
|
D(ID)=0.
|
|
ANU(ID)=VL/B
|
|
DO ID=2,ND-1
|
|
DMD=HALF*(DM(ID+1)-DM(ID-1))
|
|
A=UN/DMD/(DM(ID)-DM(ID-1))
|
|
C=UN/DMD/(DM(ID+1)-DM(ID))
|
|
B=A+C-A*D(ID-1)
|
|
VL=QGRAV/DENS(ID)
|
|
D(ID)=C/B
|
|
ANU(ID)=(VL+A*ANU(ID-1))/B
|
|
END DO
|
|
ID=ND
|
|
A=TWO/(DM(ID)-DM(ID-1))**2
|
|
B=A-A*D(ID-1)
|
|
VL=QGRAV/DENS(ID)
|
|
ANU(ID)=(VL+A*ANU(ID-1))/B
|
|
PTOTAL(ND)=ANU(ND)
|
|
C
|
|
C backsubstitution
|
|
C
|
|
DO IID=1,ND-1
|
|
ID=ND-IID
|
|
PTOTAL(ID)=ANU(ID)+D(ID)*PTOTAL(ID+1)
|
|
END DO
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE ZMRHO(R,HG)
|
|
C ======================
|
|
C
|
|
C Initial estimate of DM, DENS, and ZD
|
|
C by an approximate solution of the hydrostatic equilibrium
|
|
C equation
|
|
C Both gas and radiation pressure contribute;
|
|
C
|
|
C Input: R - ration of radiation to gas pressure scale heights
|
|
C HG - gas pressure scale height
|
|
C DM1 - mass at the first depth point
|
|
C DMTOT - mass at the last depth point (central plane)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (PISQ=1.77245385090551D0,pisq2=pisq*half)
|
|
C
|
|
C Mass-depth grid - logarithmicaly equidistant
|
|
C
|
|
if(nd.gt.mdepth) nd=mdepth
|
|
C
|
|
if(dm1.gt.0) then
|
|
DM(ND)=DMTOT
|
|
DM(ND-1)=0.99D0*DMTOT
|
|
DML=LOG(DM(ND-1)/DM1)/(ND-2)
|
|
DML1=LOG(DM1)
|
|
DO ID=1,ND-1
|
|
DM(ID)=EXP(DML1+(ID-1)*DML)
|
|
END DO
|
|
else if(dm1.lt.-1.e-20.and.dm1.gt.-1.e-10) then
|
|
DM(ND)=DMTOT
|
|
DM1=ABS(DM1*1.e20)
|
|
DML=LOG(DM(ND)/DM1)/(ND-1)
|
|
DML1=LOG(DM1)
|
|
DO ID=1,ND-1
|
|
DM(ID)=EXP(DML1+(ID-1)*DML)
|
|
end do
|
|
else if(dm1.gt.-1.e-10) then
|
|
if(mod(nd,2).eq.0) nd=nd-1
|
|
dmha=dmtot*half
|
|
dm1=abs(dm1*1.e10)
|
|
ndha=nd/2
|
|
dml=log(dmha/dm1)/ndha
|
|
dml1=log(dm1)
|
|
dm(nd)=dmtot
|
|
do id=1,ndha
|
|
dm(id)=exp(dml1+(id-1)*dml)
|
|
dm(nd-id)=dm(nd)-exp(dml1+id*dml)
|
|
end do
|
|
C
|
|
C Determination of the total pressure scale height - function BETAH
|
|
C HH - total pressure scale height
|
|
C
|
|
end if
|
|
HH=BETAH(R)*R
|
|
DMH=PISQ/2.D0*EXP(-R*(HH-R))*ERFCX(HH-R)/HH
|
|
RHO0=DM(ND)/HH/HG
|
|
C
|
|
C Approximate solution of the hydrostatic equilibrium
|
|
C
|
|
DO ID=1,ND
|
|
DMREL=DM(ID)/DM(ND)
|
|
IF(DMREL.LE.DMH) THEN
|
|
X=R+ERFCIN(DMREL*2.D0/PISQ*HH*EXP(R*(HH-R)))
|
|
RHO=EXP(-(X-R)*(X-R)-(HH-R)*R)
|
|
ELSE IF(DMREL.LT.UN) THEN
|
|
HSQ=SQRT(HH*(HH-R))
|
|
X=ERFCIN(2.D0/PISQ*HSQ*(DMREL-DMH)+ERFCX(HSQ))*HH/HSQ
|
|
RHO=EXP(-X*X*(UN-R/HH))
|
|
ELSE
|
|
X=0.
|
|
RHO=UN
|
|
END IF
|
|
DENS(ID)=RHO0*RHO
|
|
ZD(ID)=X*HG
|
|
END DO
|
|
c
|
|
if(dm1.lt.-1.e-10) then
|
|
DM(ND)=DMTOT
|
|
DM(ND-1)=0.99D0*DMTOT
|
|
dm1=abs(dm1)
|
|
DML=LOG(DM(ND-1)/DM1)/(ND-2)
|
|
DML1=LOG(DM1)
|
|
DO ID=1,ND-1
|
|
DM(ID)=EXP(DML1+(ID-1)*DML)
|
|
end do
|
|
c
|
|
hr=r*hg
|
|
hg2=hg*pisq2
|
|
hrg=hr+hg2
|
|
dmh=hg2/hrg
|
|
rho0=dmtot/hrg
|
|
do id=1,nd
|
|
dmrel=dm(id)/dm(nd)
|
|
if(dmrel.ge.dmh) then
|
|
zd(id)=hrg*(un-dmrel)
|
|
dens(id)=rho0
|
|
else
|
|
zd(id)=hr+hg*erfcin(dmrel*hrg/hg2)
|
|
x=(zd(id)-hr)/hg
|
|
dens(id)=rho0*exp(-x*x)
|
|
end if
|
|
end do
|
|
end if
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION BETAH(R)
|
|
C =================
|
|
C
|
|
C Determination of the total pressure scale height
|
|
C Solution of the transcendental equation by the Newton-Raphson method
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
PARAMETER (UN=1.D0,
|
|
* PISQ=1.77245385090551D0)
|
|
IF(R.LT.0.88) THEN
|
|
BET0=PISQ/2.D0/R
|
|
ELSE
|
|
BET0=UN+UN/3.D0/R/R
|
|
END IF
|
|
C
|
|
ITER=0
|
|
BETA=BET0
|
|
10 ITER=ITER+1
|
|
B1=BETA-UN
|
|
RB1=R*B1
|
|
BSQ=SQRT(BETA*B1)
|
|
ERF1=ERFCX(R*BSQ)
|
|
ERF2=ERFCX(RB1)
|
|
RHS=BSQ/B1*(UN-ERF1)+EXP(-R*RB1)*ERF2
|
|
DP=R/PISQ*(2.D0-EXP(-R*BETA*RB1))+(UN-ERF1)/2.D0/B1/BSQ+
|
|
* R*R*EXP(-R*RB1)*ERF2
|
|
DBETA=(RHS-2.D0/PISQ*BETA*R)/DP
|
|
DEL=DBETA/BETA
|
|
BETA=BETA+DBETA
|
|
IF(ABS(DEL).GT.1.D-5.AND.ITER.LE.10) GO TO 10
|
|
BETAH=BETA
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ***********************************************************
|
|
C
|
|
C
|
|
FUNCTION ERFCIN(X)
|
|
C ==================
|
|
C
|
|
C Approximate inverse complementary error function inverfc(x)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
parameter (pisq=1.77245385090551D0, pisq2=pisq/2.d0)
|
|
XL=-LOG(X)
|
|
REL=0.88623D0+XL*(7.4871471D-3-XL*1.7726701D-4)
|
|
E=SQRT(-LOG(X*(2.D0-X)))*REL
|
|
iterr=0
|
|
10 continue
|
|
iterr=iterr+1
|
|
dele=(erfcx(e)-x)*pisq2*exp(e*e)
|
|
err=abs(dele/e)
|
|
e=e+dele
|
|
if(err.gt.1.e-6.and.iterr.lt.10) go to 10
|
|
erfcin=e
|
|
RETURN
|
|
END
|
|
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
|
|
SUBROUTINE RADTOT
|
|
C =================
|
|
C
|
|
C Evaluation of integrated radiative intensities and moments
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
COMMON/OPTDPT/DT(MDEPTH)
|
|
COMMON/SURFEX/EXTJ(MFREQ),EXTH(MFREQ)
|
|
COMMON/TOTJHK/TOTJ(MDEPTH),TOTH(MDEPTH),TOTK(MDEPTH),
|
|
* RDOPAC(MDEPTH),FLOPAC(MDEPTH)
|
|
DIMENSION SUMPL(MDEPTH)
|
|
C
|
|
C zero the quantities
|
|
C
|
|
DO ID=1,ND
|
|
ABROSD(ID)=0.
|
|
SUMDPL(ID)=0.
|
|
ABPLAD(ID)=0.
|
|
SUMPL(ID)=0.
|
|
TOTJ(ID)=0.
|
|
TOTH(ID)=0.
|
|
TOTK(ID)=0.
|
|
RDOPAC(ID)=0.
|
|
FLOPAC(ID)=0.
|
|
if(id.lt.nd) THEN
|
|
DELDM(ID)=HALF*(DM(ID+1)-DM(ID))
|
|
deldmz(id)=deldm(id)
|
|
if(izscal.eq.1) deldmz(id)=half*(zd(id)-zd(id+1))
|
|
end if
|
|
END DO
|
|
DEDM1=DM(1)/DENS(1)
|
|
C
|
|
C loop over frequencies
|
|
C
|
|
CALL TDPINI
|
|
CALL OPAINI(1)
|
|
DO IJ=1,NFREQ
|
|
FR=FREQ(IJ)
|
|
CALL OPACF1(IJ)
|
|
CALL RTEFR1(IJ)
|
|
WW=W(IJ)
|
|
DO ID=1,ND
|
|
PLAN=XKFB(ID)/XKF1(ID)*WW
|
|
DPLAN=PLAN/XKF1(ID)*FREQ(IJ)*HKT21(ID)
|
|
if(ioptab.ge.0) then
|
|
ABROSD(ID)=ABROSD(ID)+DPLAN/ABSO1(ID)
|
|
ABPLAD(ID)=ABPLAD(ID)+PLAN*(ABSO1(ID)-SCAT1(ID))
|
|
RDOPAC(ID)=RDOPAC(ID)+WW*RAD1(ID)*(ABSO1(ID)-SCAT1(ID))
|
|
else
|
|
ar=(ABSO1(ID)-SCAT1(ID))*dens(id)
|
|
ABROSD(ID)=ABROSD(ID)+DPLAN/(ABSO1(ID)*dens(id))
|
|
ABPLAD(ID)=ABPLAD(ID)+PLAN*AR
|
|
RDOPAC(ID)=RDOPAC(ID)+WW*RAD1(ID)*AR
|
|
end if
|
|
SUMDPL(ID)=SUMDPL(ID)+DPLAN
|
|
SUMPL(ID)=SUMPL(ID)+PLAN
|
|
TOTJ(ID)=TOTJ(ID)+WW*RAD1(ID)
|
|
TOTK(ID)=TOTK(ID)+WW*RAD1(ID)*FAK1(ID)
|
|
IF(ID.LT.ND) THEN
|
|
FLUX1=RAD1(ID+1)*FAK1(ID+1)-RAD1(ID)*FAK1(ID)
|
|
TOTH(ID+1)=TOTH(ID+1)+WW*FLUX1/DT(ID)
|
|
END IF
|
|
END DO
|
|
WF=WW*(FH(IJ)*RAD1(1)-HEXTRD(IJ))
|
|
TOTH(1)=TOTH(1)+WF
|
|
if(ioptab.ge.0) then
|
|
FLOPAC(1)=FLOPAC(1)+WF*ABSO1(1)/DENS(1)
|
|
else
|
|
FLOPAC(1)=FLOPAC(1)+WF*ABSO1(1)
|
|
end if
|
|
END DO
|
|
c
|
|
c Rosseland and Planck mean opacities
|
|
C
|
|
DO ID=1,ND
|
|
ABROSD(ID)=SUMDPL(ID)/ABROSD(ID)
|
|
ABPLAD(ID)=ABPLAD(ID)/SUMPL(ID)
|
|
END DO
|
|
C
|
|
c Rosseland optical depth scale; flux mean
|
|
c
|
|
ID=1
|
|
TAUROS(ID)=HALF*DEDM1*ABROSD(ID)
|
|
DO ID=2,ND
|
|
DTAUR=DELDM(ID-1)*(ABROSD(ID)*DENS1(ID)+
|
|
* ABROSD(ID-1)*DENS1(ID-1))
|
|
TAUROS(ID)=TAUROS(ID-1)+DTAUR
|
|
FLOPAC(ID)=(TOTK(ID)-TOTK(ID-1))/(DM(ID)-DM(ID-1))
|
|
END DO
|
|
c
|
|
c final Rosseland and Planck mean opacities
|
|
C
|
|
DO ID=1,ND
|
|
ABROSD(ID)=ABROSD(ID)/DENS(ID)
|
|
ABPLAD(ID)=ABPLAD(ID)/DENS(ID)
|
|
END DO
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE COOLRT
|
|
C =================
|
|
C
|
|
C Evaluation of cooling and heating rates for each ion
|
|
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'
|
|
parameter (pi4=4.*3.14159265d0)
|
|
DIMENSION CLHT1(MDEPTH),CLHT2(MDEPTH),CLHT3(MDEPTH)
|
|
DIMENSION CLRAT(MION,MDEPTH),HTRAT(MION,MDEPTH)
|
|
COMMON/COOLCO/ABSOTI(MION,MDEPTH),EMISTI(MION,MDEPTH),
|
|
* ABSOC1(MDEPTH),EMISC1(MDEPTH)
|
|
C
|
|
DO ID=1,ND
|
|
DO ION=1,NION
|
|
CLRAT(ION,ID)=0.
|
|
HTRAT(ION,ID)=0.
|
|
END DO
|
|
CLHT1(ID)=0.
|
|
CLHT2(ID)=0.
|
|
CLHT3(ID)=0.
|
|
END DO
|
|
C
|
|
DO IJ=1,NFREQ
|
|
IF(IJX(IJ).NE.-1) THEN
|
|
CALL OPACFA(IJ)
|
|
CALL RTEFR1(IJ)
|
|
DO ID=1,ND
|
|
DO ION=1,NION
|
|
CLRAT(ION,ID)=CLRAT(ION,ID)+W(IJ)*EMISTI(ION,ID)
|
|
HTRAT(ION,ID)=HTRAT(ION,ID)+
|
|
& W(IJ)*ABSOTI(ION,ID)*RAD1(ID)
|
|
END DO
|
|
EM=EMIS1(ID)+SCAT1(ID)*RAD1(ID)
|
|
CLHT2(ID)=CLHT2(ID)+W(IJ)*(EM-ABSO1(ID)*RAD1(ID))
|
|
CLHT3(ID)=CLHT3(ID)+W(IJ)*EMIS1(ID)
|
|
END DO
|
|
C
|
|
if(ipopac.eq.1) then
|
|
if(ij.le.nfreqc) then
|
|
write(85,685) ij,freq(ij),(absoc1(id)/dens(id),id=1,nd)
|
|
end if
|
|
end if
|
|
if(ipopac.eq.2) then
|
|
if(ij.le.nfreqc) then
|
|
write(87,686) ij,freq(ij)
|
|
taud=abso1(1)*dedm1
|
|
do id=1,nd
|
|
if(id.gt.1) taud=taud+deldmz(id-1)*
|
|
* (absot(id-1)+absot(id))
|
|
end do
|
|
end if
|
|
end if
|
|
685 format(i5,1pe15.7/(1p8e10.3))
|
|
686 format(i5,1pe15.7)
|
|
C
|
|
END IF
|
|
END DO
|
|
C
|
|
if(icoolp.le.0) return
|
|
C
|
|
DO ID=1,ND
|
|
DO ION=1,NION
|
|
CLHT1(ID)=CLHT1(ID)+CLRAT(ION,ID)-HTRAT(ION,ID)
|
|
END DO
|
|
WRITE(86,1060) ID,CLHT1(ID)*pi4,CLHT2(ID)*pi4,
|
|
* CLHT3(ID)*pi4
|
|
1060 FORMAT(I5,1P3E14.6)
|
|
END DO
|
|
c
|
|
if(icoolp.lt.2) return
|
|
c
|
|
DO ID=1,ND
|
|
WRITE(87,1071) id,
|
|
* ((CLRAT(ION,ID)-HTRAT(ION,ID))*pi4,ION=1,NION)
|
|
END DO
|
|
c
|
|
if(icoolp.lt.10) return
|
|
WRITE(87,1070) ND,NION
|
|
IOFE2=0
|
|
DO ION=1,NION
|
|
NN1=NFIRST(ION)
|
|
IAT2=IATM(NN1)
|
|
IF(NUMAT(IAT2).EQ.26 .and. IZ(ION).EQ.2) IOFE2=ION
|
|
END DO
|
|
REWIND 8
|
|
READ(8,*) NDR
|
|
READ(8,*) TTR,RSR
|
|
DO ID=ND,1,-1
|
|
READ(8,*) RSR
|
|
WRITE(88,1071) RSR,CLRAT(IOFE2,ID)
|
|
END DO
|
|
1070 FORMAT(2I5)
|
|
1071 FORMAT(i5/(1P6E13.5))
|
|
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
C
|
|
|
|
SUBROUTINE OPACFA(IJ)
|
|
C =====================
|
|
C
|
|
C Absorption, emission, and scattering coefficients
|
|
C at frequency IJ and for all depths
|
|
C
|
|
C Saves additionally contributions per ion (for computing
|
|
C ionic cooling and heating rates, see routine COOLRT)
|
|
C
|
|
C Input: IJ opacity and emissivity is calculated for the
|
|
C frequency points with index IJ
|
|
C Output: ABSO1 - array of absorption coefficient
|
|
C EMIS1 - array of emission coefficient
|
|
C SCAT1 - array of scattering coefficient (all scattering
|
|
C mechanisms except electron scattering)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ODFPAR.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
COMMON/COOLCO/ABSOTI(MION,MDEPTH),EMISTI(MION,MDEPTH),
|
|
* ABSOC1(MDEPTH),EMISC1(MDEPTH)
|
|
PARAMETER (C14=2.99793D14, CFF1=1.3727D-25)
|
|
C
|
|
C initialize
|
|
c
|
|
IF(ICOMPT.GT.0) THEN
|
|
DO ID=1,ND
|
|
ELSCAT(ID)=ELEC(ID)*SIGEC(IJ)
|
|
END DO
|
|
END IF
|
|
C
|
|
DO ID=1,ND
|
|
ABSO1(ID)=ELSCAT(ID)
|
|
EMIS1(ID)=0.
|
|
SCAT1(ID)=ELSCAT(ID)
|
|
ABSOC1(ID)=ABSO1(ID)
|
|
EMISC1(ID)=0.
|
|
DO ION=1,NION
|
|
ABSOTI(ION,ID)=0.
|
|
EMISTI(ION,ID)=0.
|
|
END DO
|
|
END DO
|
|
C
|
|
C basic frequency- and depth-dependent quantities
|
|
C
|
|
FR=FREQ(IJ)
|
|
FRINV=UN/FR
|
|
FR3INV=FRINV*FRINV*FRINV
|
|
lfre=fr.gt.frtabm
|
|
DO ID=1,ND
|
|
XKF(ID)=EXP(-HKT1(ID)*FR)
|
|
XKF1(ID)=UN-XKF(ID)
|
|
XKFB(ID)=XKF(ID)*BNUE(IJ)
|
|
END DO
|
|
C
|
|
C ******** 1a. bound-free contribution - without dielectronic rec.
|
|
C
|
|
if(ifdiel.eq.0) then
|
|
DO IBFT=1,NTRANC
|
|
ITR=ITRBF(IBFT)
|
|
SG=CROSS(IBFT,IJ)
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
iad=iadop(iatm(ii))
|
|
if(sg.gt.0..and.(iad.eq.0.or.(iad.gt.0.and.lfre))) then
|
|
IZZ=IZ(IEL(II))
|
|
IMER=IMRG(II)
|
|
DO ID=1,ND
|
|
SGD=SG
|
|
IF(MCDW(ITR).GT.0) THEN
|
|
CALL DWNFR1(FR,FR0(ITR),ID,IZZ,DW1)
|
|
DWF1(MCDW(ITR),ID)=DW1
|
|
SGD=SG*DW1
|
|
END IF
|
|
IF(IFWOP(II).LT.0) THEN
|
|
CALL SGMER1(FRINV,FR3INV,IMER,ID,SGME1)
|
|
SGMG(IMER,ID)=SGME1
|
|
SGD=SGME1
|
|
END IF
|
|
EMISBF=SGD*EMTRA(ITR,ID)
|
|
ABSO1(ID)=ABSO1(ID)+SGD*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+EMISBF
|
|
ABSOTI(IEL(II),ID)=ABSOTI(IEL(II),ID)+SGD*ABTRA(ITR,ID)
|
|
EMISTI(IEL(II),ID)=EMISTI(IEL(II),ID)+EMISBF
|
|
END DO
|
|
END IF
|
|
END DO
|
|
else
|
|
C
|
|
C ******** 1b. bound-free contribution - with dielectronic rec.
|
|
C
|
|
DO IBFT=1,NTRANC
|
|
ITR=ITRBF(IBFT)
|
|
II=ILOW(ITR)
|
|
JJ=IUP(ITR)
|
|
iad=iadop(iatm(ii))
|
|
if(sg.gt.0..and.(iad.eq.0.or.(iad.gt.0.and.lfre))) then
|
|
IZZ=IZ(IEL(II))
|
|
IMER=IMRG(II)
|
|
DO ID=1,ND
|
|
SG=CROSSD(IBFT,IJ,ID)
|
|
IF(SG.GT.0.) THEN
|
|
SGD=SG
|
|
IF(MCDW(ITR).GT.0) THEN
|
|
CALL DWNFR1(FR,FR0(ITR),ID,IZZ,DW1)
|
|
DWF1(MCDW(ITR),ID)=DW1
|
|
SGD=SG*DW1
|
|
END IF
|
|
IF(IFWOP(II).LT.0) THEN
|
|
CALL SGMER1(FRINV,FR3INV,IMER,ID,SGME1)
|
|
SGMG(IMER,ID)=SGME1
|
|
SGD=SGME1
|
|
END IF
|
|
EMISBF=SGD*EMTRA(ITR,ID)
|
|
ABSO1(ID)=ABSO1(ID)+SGD*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+EMISBF
|
|
ABSOTI(IEL(II),ID)=ABSOTI(IEL(II),ID)+SGD*ABTRA(ITR,ID)
|
|
EMISTI(IEL(II),ID)=EMISTI(IEL(II),ID)+EMISBF
|
|
END IF
|
|
END DO
|
|
END IF
|
|
END DO
|
|
end if
|
|
C
|
|
C ******** 2. free-free contribution
|
|
C
|
|
DO ION=1,NION
|
|
IT=ITRA(NNEXT(ION),NNEXT(ION))
|
|
iad=iadop(iatm(nnext(ion)))
|
|
if(iad.gt.0.and..not.lfre) go to 40
|
|
C
|
|
C hydrogenic with Gaunt factor = 1
|
|
C
|
|
IF(IT.EQ.1) THEN
|
|
DO ID=1,ND
|
|
SF1=SFF3(ION,ID)*FR3INV
|
|
SF2=SFF2(ION,ID)
|
|
IF(FR.LT.FF(ION)) SF2=UN/XKF(ID)
|
|
ABSOFF=SF1*SF2
|
|
ABSO1(ID)=ABSO1(ID)+ABSOFF
|
|
EMIS1(ID)=EMIS1(ID)+ABSOFF
|
|
ABSOTI(ION,ID)=ABSOTI(ION,ID)+ABSOFF
|
|
EMISTI(ION,ID)=EMISTI(ION,ID)+ABSOFF
|
|
END DO
|
|
C
|
|
C hydrogenic with exact Gaunt factor
|
|
C
|
|
ELSE IF(IT.EQ.2) THEN
|
|
DO ID=1,ND
|
|
SF1=SFF3(ION,ID)*FR3INV
|
|
SF2=SFF2(ION,ID)
|
|
IF(FR.LT.FF(ION)) SF2=UN/XKF(ID)
|
|
X=C14*CHARG2(ION)/FR
|
|
SF2=SF2-UN+GFREE1(ID,X)
|
|
ABSOFF=SF1*SF2
|
|
ABSO1(ID)=ABSO1(ID)+ABSOFF
|
|
EMIS1(ID)=EMIS1(ID)+ABSOFF
|
|
ABSOTI(ION,ID)=ABSOTI(ION,ID)+ABSOFF
|
|
EMISTI(ION,ID)=EMISTI(ION,ID)+ABSOFF
|
|
END DO
|
|
C
|
|
C H minus free-free opacity
|
|
C
|
|
ELSE IF(IT.EQ.3) THEN
|
|
DO ID=1,ND
|
|
ABSOFF=SFFHMI(POPUL(NFIRST(IELH),ID),FR,TEMP(ID))*
|
|
* ELEC(ID)
|
|
ABSO1(ID)=ABSO1(ID)+ABSOFF
|
|
EMIS1(ID)=EMIS1(ID)+ABSOFF
|
|
ABSOTI(ION,ID)=ABSOTI(ION,ID)+ABSOFF
|
|
EMISTI(ION,ID)=EMISTI(ION,ID)+ABSOFF
|
|
END DO
|
|
C
|
|
C special evaluation of the cross-section
|
|
C
|
|
ELSE IF(IT.LT.0) THEN
|
|
DO ID=1,ND
|
|
ABSOFF=FFCROS(ION,IT,TEMP(ID),FR)*
|
|
* POPUL(NNEXT(ION),ID)*ELEC(ID)
|
|
ABSO1(ID)=ABSO1(ID)+ABSOFF
|
|
EMIS1(ID)=EMIS1(ID)+ABSOFF
|
|
ABSOTI(ION,ID)=ABSOTI(ION,ID)+ABSOFF
|
|
EMISTI(ION,ID)=EMISTI(ION,ID)+ABSOFF
|
|
END DO
|
|
END IF
|
|
40 CONTINUE
|
|
END DO
|
|
C
|
|
C ******** 3. - additional continuum opacity (OPADD)
|
|
C
|
|
IF(IOPADD.NE.0) THEN
|
|
ICALL=1
|
|
DO ID=1,ND
|
|
CALL OPADD(0,ICALL,IJ,ID)
|
|
ABSO1(ID)=ABSO1(ID)+ABAD
|
|
EMIS1(ID)=EMIS1(ID)+EMAD
|
|
SCAT1(ID)=SCAT1(ID)+SCAD
|
|
ABSOTI(IELH,ID)=ABSOTI(IELH,ID)+ABAD
|
|
EMISTI(IELH,ID)=EMISTI(IELH,ID)+EMAD
|
|
END DO
|
|
END IF
|
|
C
|
|
DO ID=1,ND
|
|
ABSOC1(ID)=ABSO1(ID)
|
|
EMISC1(ID)=EMIS1(ID)
|
|
END DO
|
|
IF(ICOOLP.EQ.0) GO TO 500
|
|
C
|
|
C ******** 4. - opacity and emissivity in lines
|
|
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)
|
|
iad=iadop(iatm(ilow(itr)))
|
|
if(iad.eq.0.or.(lfre.and.iad.gt.0)) then
|
|
ION=IEL(ILOW(ITR))
|
|
DO ID=1,ND
|
|
SG=PRFLIN(ID,IJ)
|
|
ABSO1(ID)=ABSO1(ID)+SG*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+SG*EMTRA(ITR,ID)
|
|
ABSOTI(ION,ID)=ABSOTI(ION,ID)+SG*ABTRA(ITR,ID)
|
|
EMISTI(ION,ID)=EMISTI(ION,ID)+SG*EMTRA(ITR,ID)
|
|
END DO
|
|
end if
|
|
ENDIF
|
|
IF(NLINES(IJ).LE.0) GO TO 200
|
|
C
|
|
C the "overlapping" lines at the given frequency
|
|
C
|
|
DO 100 ILINT=1,NLINES(IJ)
|
|
ITR=ITRLIN(ILINT,IJ)
|
|
iad=iadop(iatm(ilow(itr)))
|
|
if(iad.gt.0.and..not.lfre) go to 100
|
|
if(linexp(itr)) goto 100
|
|
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))
|
|
A2=UN-A1
|
|
ION=IEL(ILOW(ITR))
|
|
DO ID=1,ND
|
|
SG=A1*PRFLIN(ID,IJ1)+A2*PRFLIN(ID,IJ0)
|
|
ABSO1(ID)=ABSO1(ID)+SG*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+SG*EMTRA(ITR,ID)
|
|
ABSOTI(ION,ID)=ABSOTI(ION,ID)+SG*ABTRA(ITR,ID)
|
|
EMISTI(ION,ID)=EMISTI(ION,ID)+SG*EMTRA(ITR,ID)
|
|
END DO
|
|
100 CONTINUE
|
|
200 CONTINUE
|
|
C
|
|
C Opacity sampling option
|
|
C
|
|
ELSE
|
|
IF(NLINES(IJ).LE.0) GO TO 400
|
|
DO 300 ILINT=1,NLINES(IJ)
|
|
ITR=ITRLIN(ILINT,IJ)
|
|
iad=iadop(iatm(ilow(itr)))
|
|
if(iad.gt.0.and..not.lfre) go to 300
|
|
ION=IEL(ILOW(ITR))
|
|
KJ=IJ-IFR0(ITR)+KFR0(ITR)
|
|
INDXPA=IABS(INDEXP(ITR))
|
|
IF(INDXPA.NE.3 .AND. INDXPA.NE.4) THEN
|
|
DO ID=1,ND
|
|
SG=PRFLIN(ID,KJ)
|
|
ABSO1(ID)=ABSO1(ID)+SG*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+SG*EMTRA(ITR,ID)
|
|
ABSOTI(ION,ID)=ABSOTI(ION,ID)+SG*ABTRA(ITR,ID)
|
|
EMISTI(ION,ID)=EMISTI(ION,ID)+SG*EMTRA(ITR,ID)
|
|
END DO
|
|
ELSE
|
|
DO ID=1,ND
|
|
KJD=JIDI(ID)
|
|
SG=EXP(XJID(ID)*SIGFE(KJD,KJ)+(UN-XJID(ID))*
|
|
* SIGFE(KJD+1,KJ))
|
|
ABSO1(ID)=ABSO1(ID)+SG*ABTRA(ITR,ID)
|
|
EMIS1(ID)=EMIS1(ID)+SG*EMTRA(ITR,ID)
|
|
ABSOTI(ION,ID)=ABSOTI(ION,ID)+SG*ABTRA(ITR,ID)
|
|
EMISTI(ION,ID)=EMISTI(ION,ID)+SG*EMTRA(ITR,ID)
|
|
END DO
|
|
END IF
|
|
300 CONTINUE
|
|
400 CONTINUE
|
|
ENDIF
|
|
500 CONTINUE
|
|
C
|
|
C ----------------------------
|
|
C total opacity and emissivity
|
|
C ----------------------------
|
|
C
|
|
DO ID=1,ND
|
|
ABSO1(ID)=ABSO1(ID)-EMIS1(ID)*XKF(ID)
|
|
ABSOC1(ID)=ABSOC1(ID)-EMISC1(ID)*XKF(ID)
|
|
DO ION=1,NION
|
|
ABSOTI(ION,ID)=ABSOTI(ION,ID)-EMISTI(ION,ID)*XKF(ID)
|
|
END DO
|
|
EMIS1(ID)=EMIS1(ID)*XKFB(ID)
|
|
EMISC1(ID)=EMISC1(ID)*XKFB(ID)
|
|
DO ION=1,NION
|
|
EMISTI(ION,ID)=EMISTI(ION,ID)*XKFB(ID)
|
|
END DO
|
|
absot(id)=abso1(id)
|
|
END DO
|
|
if(izscal.eq.0) then
|
|
do id=1,nd
|
|
absot(id)=abso1(id)*dens1(id)
|
|
end do
|
|
end if
|
|
c
|
|
if(ifprd.gt.0) call prd(ij)
|
|
c
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE VISINI
|
|
C =================
|
|
C
|
|
C Auxiliary procedure for RESOLV
|
|
C initialization of necessary quantities for treating the viscosity
|
|
C in disks
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
C
|
|
AMUV0=DMVISC**(ZETA0+UN)
|
|
AMUV1=UN-AMUV0
|
|
GP=0.
|
|
GN=UN
|
|
IF(INMP.GT.0) THEN
|
|
GP=UN
|
|
GN=0.
|
|
END IF
|
|
C
|
|
IF(IVISC.LE.1) THEN
|
|
x=0.
|
|
DO ID=1,ND
|
|
DMD=DM(1)
|
|
IF(ID.GT.1) DMD=(DM(ID)+DM(ID-1))*HALF
|
|
IF(DM(ID).LE.DMVISC*DM(ND)) THEN
|
|
VISCD(ID)=(UN-FRACTV)*(ZETA1+UN)/
|
|
* DMVISC**(ZETA1+UN)*(DM(ID)/DM(ND))**ZETA1
|
|
THETAV(ID)=(UN-FRACTV)*(DMD/DMVISC/DM(ND))**(ZETA1+UN)
|
|
ELSE
|
|
VISCD(ID)=FRACTV*(ZETA0+UN)/AMUV1*
|
|
* (DM(ID)/DM(ND))**ZETA0
|
|
THETAV(ID)=(UN-FRACTV)+FRACTV*((DMD/DM(ND))**(ZETA0+UN)-
|
|
* AMUV0)/AMUV1
|
|
END IF
|
|
TVISC(ID)=EDISC*VISCD(ID)*DENS(ID)
|
|
DTVIST(ID)=0.
|
|
DTVISR(ID)=EDISC*VISCD(ID)*WMM(ID)
|
|
DTVISN(ID)=0.
|
|
if(id.gt.1) then
|
|
X=X+HALF*(TVISC(ID)/DENS(ID)+TVISC(ID-1)/DENS(ID-1))*
|
|
* (DM(ID)-DM(ID-1))
|
|
end if
|
|
END DO
|
|
vtot=x
|
|
x=0.
|
|
if(iter.eq.niter) write(6,600)
|
|
do id=1,nd
|
|
AN=DENS(ID)/WMM(ID)+ELEC(ID)
|
|
PGS(ID)=BOLK*TEMP(ID)*AN
|
|
if(id.gt.1) then
|
|
X=X+HALF*(TVISC(ID)/DENS(ID)+TVISC(ID-1)/DENS(ID-1))*
|
|
* (DM(ID)-DM(ID-1))
|
|
end if
|
|
alp=tvisc(id)/omeg32/pgs(id)*12.5664
|
|
if(iter.eq.niter)
|
|
* write(6,601) id,dm(id),tvisc(id),thetav(id),x/vtot,
|
|
* viscd(id),alp
|
|
write(96,601) id,dm(id),tvisc(id),thetav(id),x/vtot,
|
|
* viscd(id),alp
|
|
if(id.eq.nd)
|
|
* write(96,601) id,edisc,viscd(id),dens(id),pgs(id),omeg32
|
|
end do
|
|
601 format(i5,1p6e12.4)
|
|
ELSE IF(IVISC.EQ.2) THEN
|
|
X=0.
|
|
THETAV(1)=0.
|
|
DO ID=1,ND
|
|
AN=DENS(ID)/WMM(ID)+ELEC(ID)
|
|
PGS(ID)=BOLK*TEMP(ID)*AN
|
|
TVISC(ID)=OMEG32*ALPHAV*PGS(ID)/12.5664
|
|
DTVIST(ID)=TVISC(ID)/TEMP(ID)
|
|
DTVISN(ID)=TVISC(ID)/AN
|
|
DTVISR(ID)=0.
|
|
if(id.gt.1) then
|
|
c X=X+HALF*(TVISC(ID)+TVISC(ID-1))*(DM(ID)-DM(ID-1))
|
|
X=X+HALF*(TVISC(ID)/DENS(ID)+TVISC(ID-1)/DENS(ID-1))*
|
|
* (DM(ID)-DM(ID-1))
|
|
end if
|
|
END DO
|
|
VTOT=X
|
|
X=0.
|
|
write(6,602)
|
|
600 format(/' ID DM TVISC THETAV(orig) THETAV',
|
|
* ' VISCD ALPHA'/)
|
|
602 format(/' ID DM TVISC THETAV PGAS',
|
|
* ' VISCD ALPHA'/)
|
|
DO ID=1,ND
|
|
if(id.gt.1) then
|
|
c X=X+HALF*(TVISC(ID)+TVISC(ID-1))*(DM(ID)-DM(ID-1))
|
|
X=X+HALF*(TVISC(ID)/DENS(ID)+TVISC(ID-1)/DENS(ID-1))*
|
|
* (DM(ID)-DM(ID-1))
|
|
end if
|
|
THETAV(ID)=X/VTOT
|
|
viscd(id)=tvisc(id)/dens(id)/edisc
|
|
write(6,601) id,dm(id),tvisc(id),thetav(id),pgs(id),
|
|
* viscd(id),alphav
|
|
write(96,601) id,dm(id),tvisc(id),thetav(id),pgs(id),
|
|
* viscd(id),alphav
|
|
if(id.eq.nd)
|
|
* write(96,601) id,edisc,viscd(id),dens(id),pgs(id),omeg32
|
|
END DO
|
|
END IF
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE DMEVAL
|
|
C =================
|
|
C
|
|
C Auxiliary procedure for RESOLV - for disks
|
|
C recomputation of the m-scale in the case where z-scale is the
|
|
C basic scale
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
dimension dma(mdepth),dmb(mdepth)
|
|
C
|
|
C total pressure and gas pressure
|
|
C
|
|
DO ID=1,ND
|
|
PTURB=HALF*DENS(ID)*VTURB(ID)*VTURB(ID)
|
|
PGS0=(DENS(ID)/WMM(ID)+ELEC(ID))*BOLK*TEMP(ID)
|
|
PGS(ID)=PGS0
|
|
PTOTL0=PGS(ID)+PRADT(ID)+PTURB
|
|
PTOTAL(ID)=PTOTL0
|
|
END DO
|
|
c
|
|
C mass at the first depth point
|
|
C
|
|
ID=1
|
|
GRD=0.
|
|
DO IJ=1,NFREQE
|
|
IJT=IJFR(IJ)
|
|
FLUXW=W(IJT)*FH(IJT)*RADEX(IJ,ID)
|
|
GRD=GRD+FLUXW*ABSOEX(IJ,ID)
|
|
END DO
|
|
HG1=SQRT(TWO*PGS(1)/DENS(1)/QGRAV)
|
|
HR1=PCK/QGRAV*(GRD+FPRD(1))/DENS(1)
|
|
if(iter.eq.1) pgas0=pgs(1)
|
|
X=(ZD(1)-HR1)/HG1
|
|
IF(X.LT.3.) THEN
|
|
IF(X.LT.0.) X=0.
|
|
F1=8.86226925D-1*EXP(X*X)*ERFCX(X)
|
|
ELSE
|
|
F1=HALF*(UN-HALF/X/X)/X
|
|
END IF
|
|
C
|
|
DMa(1)=HG1*DENS(1)*F1
|
|
DMb(1)=DMa(1)
|
|
c
|
|
c recompute the DM scale
|
|
C
|
|
write(6,600)
|
|
600 format(/' ID ZD DM(old) DMA DMB'/)
|
|
DO ID=1,ND
|
|
if(id.gt.1) then
|
|
dmb(id)=dm(id)
|
|
DMA(ID)=DMA(ID-1)-(ZD(ID)-ZD(ID-1))*TWO/
|
|
* (UN/DENS(ID)+UN/DENS(ID-1))
|
|
DMb(ID)=DMb(ID-1)-(ZD(ID)-ZD(ID-1))*
|
|
* (DENS(ID)+DENS(ID-1))*half
|
|
end if
|
|
write(6,601) id,zd(id),dm(id),dma(id),dmb(id)
|
|
c DM(ID)=DMB(ID)
|
|
DM(ID)=DMa(ID)
|
|
601 format(i5,1p4e12.4)
|
|
END DO
|
|
DMTOT=DM(ND)
|
|
EDISC=SIG4P*TEFF**4/DMTOT
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE GREYD
|
|
C ================
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
PARAMETER (ERRM0=1.E-3, NTRM=50)
|
|
C
|
|
CHI0=20.
|
|
IF(TEFF.GT.10000.) THEN
|
|
XION=2.
|
|
ELSE IF(TEFF.LT.6000.) THEN
|
|
XION=1.
|
|
ELSE
|
|
XION=1.+(TEFF-6000.)/4000.
|
|
END IF
|
|
ANEREL=1.-1./XION
|
|
C
|
|
DMP=0.
|
|
ID=1
|
|
C1=BOLK*XION/WMM(ID)
|
|
C2=3.1415926/2./QGRAV
|
|
C3=SQRT(C1*C2)
|
|
C4=WBARM*OMEG32/ALPHAV
|
|
C5=C4/C1
|
|
C6=C1/WBARM/OMEG32
|
|
C
|
|
ITRM=0
|
|
10 CONTINUE
|
|
ITRM=ITRM+1
|
|
C1=BOLK*XION/WMM(ID)
|
|
C3=SQRT(C1*C2)
|
|
C5=C4/C1
|
|
T=(0.375*TEFF**4*CHI0*C5)**0.2
|
|
DM0=C5/T
|
|
RHO=DM0/SQRT(T)/C3
|
|
TEMP(ID)=T
|
|
DENS(ID)=RHO
|
|
CALL RHONEN(ID,T,RHO,AN,ANE)
|
|
ELEC(ID)=ANE
|
|
XION=AN/(AN-ANE)
|
|
CALL WNSTOR(ID)
|
|
CALL STEQEQ(ID,POP,1)
|
|
C
|
|
C evaluation of the Rosseland and Planck mean opacities
|
|
C for the new values of temperature, electron density, and
|
|
C populations (OPROS - Rosseland opacity per 1 cm**3; OPPLA - Planck
|
|
C mean opacity per 1 cm**3)
|
|
C
|
|
CALL OPACF0(ID,NFREQ)
|
|
CALL MEANOP(T,ABSO,SCAT,OPROS,OPPLA)
|
|
ABROS=OPROS/DENS(ID)
|
|
ABPLA=OPPLA/DENS(ID)
|
|
if(abpla.lt.abpmin) abpla=abpmin
|
|
CHI0=(ABROS+chi0)/2.
|
|
WRITE(6,601) ITRM,T,DM0,RHO,CHI0,abros,CHI0*DM0,XION,ANE
|
|
601 FORMAT(i5,1p8e9.2)
|
|
ERRM=ABS(DM0-DMP)/DM0
|
|
DMP=DM0
|
|
IF(ERRM.GT.ERRM0.AND.ITRM.LT.NTRM) GO TO 10
|
|
C
|
|
DMTOT=DM0
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
subroutine rhonen(id,t,rho,an,ane)
|
|
c ==================================
|
|
c
|
|
c iterative determination of N and Ne from given T and RHO
|
|
C
|
|
C Input: T - temperature
|
|
C RHO - mass density
|
|
C Output: AN - total particle density
|
|
C ANE - elctron density
|
|
C ENRG- internal energy
|
|
C ENTT- entropy
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
C
|
|
it=0
|
|
if(id.eq.1.and.anerel.eq.0.) then
|
|
anerel=0.5
|
|
if(t.lt.9000.) anerel=0.4
|
|
if(t.lt.8000.) anerel=0.1
|
|
if(t.lt.7000.) anerel=0.01
|
|
if(t.lt.6000.) anerel=0.001
|
|
if(t.lt.5500.) anerel=0.0001
|
|
if(t.lt.5000.) anerel=1.e-5
|
|
if(t.lt.4000.) anerel=1.e-6
|
|
end if
|
|
wm=wmm(id)*(un-anerel)/hmass
|
|
wm0=wm
|
|
10 continue
|
|
it=it+1
|
|
an=rho/wm/hmass
|
|
ane0=anerel*an
|
|
wm0=wm
|
|
call eldens(id,t,an,ane,enrgi,entt,wm,0)
|
|
anerel=ane/an
|
|
if(abs((ane-ane0)/ane0).lt.1.e-5.and.
|
|
* abs((wm-wm0)/wm0).lt.1.e-5) go to 20
|
|
if(it.lt.30) go to 10
|
|
20 continue
|
|
return
|
|
end
|
|
c
|
|
C
|
|
C
|
|
C **************************************************************
|
|
C
|
|
C
|
|
subroutine quasim(ij)
|
|
c =====================
|
|
c
|
|
c quasi-molecular opacity for Lyman alpha, beta, gamma
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
common/quasun/tqmprf,iquasi,nunalp,nunbet,nungam,nunbal
|
|
dimension sgd(mdepth)
|
|
c
|
|
if(iquasi.le.0) return
|
|
fr=freq(ij)
|
|
wlam=2.997925e18/fr
|
|
if(wlam.lt.911..or.wlam.gt.1727.) return
|
|
ii=nfirst(ielh)
|
|
c
|
|
do jup=2,iquasi+1
|
|
jj=ii+1
|
|
itr=itra(ii,jj)
|
|
do id=1,nd
|
|
anp=popul(nnext(ielh),id)
|
|
t=temp(id)
|
|
if(tqmprf.gt.0.) t=tqmprf
|
|
call allard(wlam,t,popul(ii,id),anp,sg,1,jup)
|
|
sgd(id)=sg
|
|
end do
|
|
if(ijlin(ij).ne.itr) then
|
|
sg0=0.
|
|
do ilint=1,nlines(ij)
|
|
itt=itrlin(ilint,ij)
|
|
if(itt.eq.itr) then
|
|
IJ0=IFR0(ITR)
|
|
DO IJT=IJ0,IFR1(ITR)
|
|
IF(FREQ(IJT).LE.FR) THEN
|
|
IJ0=IJT
|
|
GO TO 20
|
|
END IF
|
|
END DO
|
|
20 IJ1=IJ0-1
|
|
A1=(FR-FREQ(IJ0))/(FREQ(IJ1)-FREQ(IJ0))
|
|
A2=UN-A1
|
|
do id=1,nd
|
|
SG0=A1*PRFLIN(ID,IJ1)+A2*PRFLIN(ID,IJ0)
|
|
end do
|
|
end if
|
|
end do
|
|
end if
|
|
do id=1,nd
|
|
abso1(id)=abso1(id)+sgd(id)*abtra(itr,id)
|
|
emis1(id)=emis1(id)+sgd(id)*emtra(itr,id)
|
|
end do
|
|
end do
|
|
c
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
subroutine getlal
|
|
c =================
|
|
c
|
|
c getlal reads in the profile functions for Lyman alpha, beta, gamma,
|
|
c and Balmer alpha, including the quasi-molecular satellites;
|
|
c valid for first and second order in neutral and ionized H density
|
|
c modified routine provided originally by D. Koester
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
parameter (NXMAX=1400,NNMAX=5,NTAMAX=6)
|
|
common/quasun/tqmprf,iquasi,nunalp,nunbet,nungam,nunbal
|
|
common /callarda/xlalp(NXMAX),plalp(NXMAX,NNMAX),stnnea,stncha,
|
|
* vneua,vchaa,nxalp,iwarna
|
|
common /callardb/xlbet(NXMAX),plbet(NXMAX,NNMAX),stnneb,stnchb,
|
|
* vneub,vchab,nxbet,iwarnb
|
|
common /callardg/xlgam(NXMAX),plgam(NXMAX,NNMAX),stnneg,stnchg,
|
|
* vneug,vchag,nxgam,iwarng
|
|
common /callardc/xlbal(NXMAX),plbal(NXMAX,NNMAX),stnnec,stnchc,
|
|
* vneuc,vchac,nxbal,iwarnc
|
|
common /calphatd/xlalpd(NXMAX,NTAMAX),plalpd(NXMAX,NNMAX,NTAMAX),
|
|
* stnead(ntamax),stnchd(ntamax),
|
|
* vneuad(ntamax),vchaad(ntamax),
|
|
* talpd(ntamax),nxalpd(ntamax),ntalpd
|
|
c
|
|
c Lyman alpha
|
|
c
|
|
nxalp=0
|
|
nunalp=67
|
|
if(nunalp.gt.0) then
|
|
open(unit=nunalp,file='./data/laquasi.dat',status='old')
|
|
read(nunalp,*) nxalp,stnnea,stncha,vneua,vchaa
|
|
do i=1,nxalp
|
|
read(nunalp,*) xlalp(i),(plalp(i,j),j=1,NNMAX)
|
|
end do
|
|
close(nunalp)
|
|
stnnea=10.0**stnnea
|
|
stncha=10.0**stncha
|
|
iwarna=0
|
|
else if(nunalp.lt.0) then
|
|
c
|
|
c input of temperature-dependent profile
|
|
c
|
|
nualp=-nunalp
|
|
read(nualp,*) ntalpd
|
|
do it=1,ntalpd
|
|
read(nualp,*) talpd(it)
|
|
read(nualp,*) nxalpd(it),stnead(it),stnchd(it),vneuad(it),
|
|
* vchaad(it)
|
|
do i=1,nxalpd(it)
|
|
read(nualp,*) xlalpd(i,it),(plalpd(i,j,it),j=1,NNMAX)
|
|
end do
|
|
stnead(it)=10.0**stnead(it)
|
|
stnchd(it)=10.0**stnchd(it)
|
|
end do
|
|
close(nualp)
|
|
end if
|
|
c
|
|
c Lyman beta
|
|
c
|
|
nxbet=0
|
|
if(nunbet.gt.0) then
|
|
nunbet=67
|
|
open(unit=nunbet,file='./data/lbquasi.dat',status='old')
|
|
read(nunbet,*) nxbet,stnneb,stnchb,vneub,vchab
|
|
do i=1,nxbet
|
|
read(nunbet,*) xlbet(i),(plbet(i,j),j=1,NNMAX)
|
|
end do
|
|
close(nunbet)
|
|
stnneb=10.0**stnneb
|
|
stnchb=10.0**stnchb
|
|
iwarnb=0
|
|
end if
|
|
c
|
|
c Lyman gamma
|
|
c
|
|
nxgam=0
|
|
if(nungam.gt.0) then
|
|
nungam=67
|
|
open(unit=nungam,file='./data/lgquasi.dat',status='old')
|
|
read(nungam,*) nxgam,stnneg,stnchg,vneug,vchag
|
|
do i=1,nxgam
|
|
read(nungam,*) xlgam(i),(plgam(i,j),j=1,NNMAX)
|
|
end do
|
|
close(nungam)
|
|
stnneg=10.0**stnneg
|
|
stnchg=10.0**stnchg
|
|
iwarng=0
|
|
end if
|
|
c
|
|
c Balmer alpha
|
|
c
|
|
nxbal=0
|
|
if(nunbal.gt.0) then
|
|
nunbal=67
|
|
open(unit=nunalp,file='./data/lhquasi.dat',status='old')
|
|
read(nunbal,*) nxbal,stnnec,stnchc,vneuc,vchac
|
|
do i=1,nxbal
|
|
read(nunbal,*) xlbal(i),(plbal(i,j),j=1,NNMAX)
|
|
end do
|
|
close(nunbal)
|
|
stnnec=10.0**stnnec
|
|
stnchc=10.0**stnchc
|
|
iwarnc=0
|
|
end if
|
|
return
|
|
end
|
|
c
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
subroutine allard(xl,t,hneutr,hcharg,prof,iq,jq)
|
|
c ================================================
|
|
c
|
|
c quasi-molecular opacity for Lyman alpha, beta, and Balmer alpha
|
|
c modified routine provided originally by D. Koester
|
|
c
|
|
c Input: xl: wavelength in [A]
|
|
c hneutr: neutral H particle density [cm-3]
|
|
c hcharg: ionized H particle density [cm-3]
|
|
c iq: quantum number of the lower level
|
|
c jq: quantum number of the upper level;
|
|
c =2 - Lyman alpha
|
|
c =3 - Lyman beta
|
|
c Output: prof: Lyman alpha line profile, normalized to 1.0e8
|
|
c if integrated over A;
|
|
c It then renormalized by multiplying by
|
|
c 8.853e-29*lambda_0^2*f_ij
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
parameter (NXMAX=1400,NNMAX=5,NTAMAX=6)
|
|
parameter (xnorma=8.8528e-29*1215.6*1215.6*0.41618,
|
|
* xnormb=8.8528e-29*1025.73*1025.7*0.0791,
|
|
* xnormg=8.8528e-29*972.53*972.53*0.0290,
|
|
* xnormc=8.8528e-29*6562.*6562.*0.6407)
|
|
common /callarda/xlalp(NXMAX),plalp(NXMAX,NNMAX),stnnea,stncha,
|
|
* vneua,vchaa,nxalp,iwarna
|
|
common /callardb/xlbet(NXMAX),plbet(NXMAX,NNMAX),stnneb,stnchb,
|
|
* vneub,vchab,nxbet,iwarnb
|
|
common /callardg/xlgam(NXMAX),plgam(NXMAX,NNMAX),stnneg,stnchg,
|
|
* vneug,vchag,nxgam,iwarng
|
|
common /callardc/xlbal(NXMAX),plbal(NXMAX,NNMAX),stnnec,stnchc,
|
|
* vneuc,vchac,nxbal,iwarnc
|
|
common /calphatd/xlalpd(NXMAX,NTAMAX),plalpd(NXMAX,NNMAX,NTAMAX),
|
|
* stnead(ntamax),stnchd(ntamax),
|
|
* vneuad(ntamax),vchaad(ntamax),
|
|
* talpd(ntamax),nxalpd(ntamax),ntalpd
|
|
common/quasun/tqmprf,iquasi,nunalp,nunbet,nungam,nunbal
|
|
c
|
|
prof=0.
|
|
c
|
|
c Lyman alpha
|
|
c
|
|
if(iq.eq.1.and.jq.eq.2) then
|
|
if(nunalp.lt.0) then
|
|
call allardt(xl,t,hneutr,hcharg,prof)
|
|
else
|
|
if(xl.lt.xlalp(1).or.xl.gt.xlalp(nxalp)) return
|
|
vn1=hneutr/stnnea
|
|
vn2=hcharg/stncha
|
|
vns=vn1*vneua+vn2*vchaa
|
|
if(iwarna.eq.0) then
|
|
if(vn1*vneua.gt.0.3.or.vn2*vchaa.gt.0.3) then
|
|
write(*,*) ' warning: density too high for',
|
|
* ' Lyman alpha expansion'
|
|
iwarna=1
|
|
endif
|
|
endif
|
|
vn11=vn1*vn1
|
|
vn22=vn2*vn2
|
|
vn12=vn1*vn2
|
|
xnorm=1.0/(1.0+vns+0.5*vns*vns)
|
|
c
|
|
jl=0
|
|
ju=nxalp+1
|
|
10 if(ju-jl.gt.1) then
|
|
jm=(ju+jl)/2
|
|
if((xlalp(nxalp).gt.xlalp(1)).eqv.(xl.gt.xlalp(jm))) then
|
|
jl=jm
|
|
else
|
|
ju=jm
|
|
endif
|
|
go to 10
|
|
endif
|
|
j=jl
|
|
c
|
|
if(j.eq.0) j=1
|
|
if(j.eq.nxalp) j=j-1
|
|
a1=(xl-xlalp(j))/(xlalp(j+1)-xlalp(j))
|
|
p1= vn1*((1.0-a1)*plalp(j,1)+a1*plalp(j+1,1))
|
|
p11=vn11*((1.0-a1)*plalp(j,2)+a1*plalp(j+1,2))
|
|
p2= vn2*((1.0-a1)*plalp(j,3)+a1*plalp(j+1,3))
|
|
p22=vn22*((1.0-a1)*plalp(j,4)+a1*plalp(j+1,4))
|
|
p12=vn12*((1.0-a1)*plalp(j,5)+a1*plalp(j+1,5))
|
|
prof=(p1+p2+p11+p22+p12)*xnorm*xnorma
|
|
return
|
|
end if
|
|
end if
|
|
c
|
|
c Lyman beta
|
|
c
|
|
if(iq.eq.1.and.jq.eq.3) then
|
|
if(nxbet.eq.0) return
|
|
if(xl.lt.xlbet(1).or.xl.gt.xlbet(nxbet)) return
|
|
vn1=hneutr/stnneb
|
|
vn2=hcharg/stnchb
|
|
vns=vn1*vneub+vn2*vchab
|
|
if(iwarnb.eq.0) then
|
|
if(vn1*vneub.gt.0.3.or.vn2*vchab.gt.0.3) then
|
|
write(*,*) ' warning: density too high for',
|
|
* ' Lyman beta expansion'
|
|
iwarnb=1
|
|
endif
|
|
endif
|
|
vn11=vn1*vn1
|
|
vn22=vn2*vn2
|
|
vn12=vn1*vn2
|
|
xnorm=1.0/(1.0+vns+0.5*vns*vns)
|
|
c
|
|
jl=0
|
|
ju=nxbet+1
|
|
20 if(ju-jl.gt.1) then
|
|
jm=(ju+jl)/2
|
|
if((xlbet(nxbet).gt.xlbet(1)).eqv.(xl.gt.xlbet(jm))) then
|
|
jl=jm
|
|
else
|
|
ju=jm
|
|
endif
|
|
go to 20
|
|
endif
|
|
j=jl
|
|
c
|
|
if(j.eq.0) j=1
|
|
if(j.eq.nxbet) j=j-1
|
|
a1=(xl-xlbet(j))/(xlbet(j+1)-xlbet(j))
|
|
p1= vn1*((1.0-a1)*plbet(j,1)+a1*plbet(j+1,1))
|
|
p11=vn11*((1.0-a1)*plbet(j,2)+a1*plbet(j+1,2))
|
|
p2= vn2*((1.0-a1)*plbet(j,3)+a1*plbet(j+1,3))
|
|
p22=vn22*((1.0-a1)*plbet(j,4)+a1*plbet(j+1,4))
|
|
p12=vn12*((1.0-a1)*plbet(j,5)+a1*plbet(j+1,5))
|
|
prof=(p1+p2+p11+p22+p12)*xnorm*xnormb
|
|
return
|
|
end if
|
|
c
|
|
c Lyman gamma
|
|
c
|
|
if(iq.eq.1.and.jq.eq.4) then
|
|
if(nxgam.eq.0) return
|
|
if(xl.lt.xlgam(1).or.xl.gt.xlgam(nxgam)) return
|
|
vn1=hneutr/stnneg
|
|
vn2=hcharg/stnchg
|
|
vns=vn1*vneug+vn2*vchag
|
|
if(iwarng.eq.0) then
|
|
if(vn1*vneug.gt.0.3.or.vn2*vchag.gt.0.3) then
|
|
write(*,*) ' warning: density too high for',
|
|
* ' Lyman gamma expansion'
|
|
iwarng=1
|
|
endif
|
|
endif
|
|
vn11=vn1*vn1
|
|
vn22=vn2*vn2
|
|
vn12=vn1*vn2
|
|
xnorm=1.0/(1.0+vns+0.5*vns*vns)
|
|
c
|
|
jl=0
|
|
ju=nxgam+1
|
|
30 if(ju-jl.gt.1) then
|
|
jm=(ju+jl)/2
|
|
if((xlgam(nxgam).gt.xlgam(1)).eqv.(xl.gt.xlgam(jm))) then
|
|
jl=jm
|
|
else
|
|
ju=jm
|
|
endif
|
|
go to 30
|
|
endif
|
|
j=jl
|
|
c
|
|
if(j.eq.0) j=1
|
|
if(j.eq.nxgam) j=j-1
|
|
a1=(xl-xlgam(j))/(xlgam(j+1)-xlgam(j))
|
|
p1= vn1*((1.0-a1)*plgam(j,1)+a1*plgam(j+1,1))
|
|
p11=vn11*((1.0-a1)*plgam(j,2)+a1*plgam(j+1,2))
|
|
p2= vn2*((1.0-a1)*plgam(j,3)+a1*plgam(j+1,3))
|
|
p22=vn22*((1.0-a1)*plgam(j,4)+a1*plgam(j+1,4))
|
|
p12=vn12*((1.0-a1)*plgam(j,5)+a1*plgam(j+1,5))
|
|
prof=(p1+p2+p11+p22+p12)*xnorm*xnormg
|
|
return
|
|
end if
|
|
c
|
|
c Balmer alpha
|
|
c
|
|
if(iq.eq.2.and.jq.eq.3) then
|
|
if(xl.lt.xlbal(1).or.xl.gt.xlbal(nxbal)) return
|
|
vn1=0.
|
|
vn2=hcharg/stnchc
|
|
vns=vn1*vneuc+vn2*vchac
|
|
vn11=vn1*vn1
|
|
vn22=vn2*vn2
|
|
vn12=vn1*vn2
|
|
xnorm=1.0/(1.0+vns+0.5*vns*vns)
|
|
c
|
|
jl=0
|
|
ju=nxbal+1
|
|
40 if(ju-jl.gt.1) then
|
|
jm=(ju+jl)/2
|
|
if((xlbal(nxbal).gt.xlbal(1)).eqv.(xl.gt.xlbal(jm))) then
|
|
jl=jm
|
|
else
|
|
ju=jm
|
|
endif
|
|
go to 40
|
|
endif
|
|
j=jl
|
|
c
|
|
if(j.eq.0) j=1
|
|
if(j.eq.nxbal) j=j-1
|
|
a1=(xl-xlbal(j))/(xlbal(j+1)-xlbal(j))
|
|
p1= vn1*((1.0-a1)*plbal(j,1)+a1*plbal(j+1,1))
|
|
p11=vn11*((1.0-a1)*plbal(j,2)+a1*plbal(j+1,2))
|
|
p2= vn2*((1.0-a1)*plbal(j,3)+a1*plbal(j+1,3))
|
|
p22=vn22*((1.0-a1)*plbal(j,4)+a1*plbal(j+1,4))
|
|
p12=vn12*((1.0-a1)*plbal(j,5)+a1*plbal(j+1,5))
|
|
prof=(p1+p2+p11+p22+p12)*xnorm*xnormc
|
|
end if
|
|
c
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
subroutine allardt(xl,t,hneutr,hcharg,prof)
|
|
c ===========================================
|
|
c
|
|
c quasi-molecular opacity for Lyman alpha, with T-dependent
|
|
c profile
|
|
c
|
|
c Input: xl: wavelength in [A]
|
|
c hneutr: neutral H particle density [cm-3]
|
|
c hcharg: ionized H particle density [cm-3]
|
|
c Output: prof: Lyman alpha line profile, normalized to 1.0e8
|
|
c if integrated over A;
|
|
c It then renormalized by multiplying by
|
|
c 8.853e-29*lambda_0^2*f_ij
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
parameter (NXMAX=1400,NNMAX=5,NTAMAX=6)
|
|
parameter (xnorma=8.8528e-29*1215.6*1215.6*0.41618)
|
|
common /calphatd/xlalpd(NXMAX,NTAMAX),plalpd(NXMAX,NNMAX,NTAMAX),
|
|
* stnead(ntamax),stnchd(ntamax),
|
|
* vneuad(ntamax),vchaad(ntamax),
|
|
* talpd(ntamax),nxalpd(ntamax),ntalpd
|
|
c
|
|
prof=0.
|
|
c
|
|
c find the two partial tables close to actual T
|
|
c
|
|
it0=0
|
|
do it=1,ntalpd
|
|
it0=it
|
|
if(t.lt.talpd(it)) then
|
|
it0=it-1
|
|
go to 10
|
|
end if
|
|
end do
|
|
10 continue
|
|
if(it0.eq.0) then
|
|
it0=1
|
|
go to 20
|
|
end if
|
|
if(it0.ge.ntalpd) then
|
|
it0=ntalpd
|
|
go to 20
|
|
end if
|
|
go to 30
|
|
20 continue
|
|
c
|
|
if(xl.lt.xlalpd(1,it0).or.xl.gt.xlalpd(nxalpd(it0),it0)) return
|
|
vn1=hneutr/stnead(it0)
|
|
vn2=hcharg/stnchd(it0)
|
|
vns=vn1*vneuad(it0)+vn2*vchaad(it0)
|
|
vn11=vn1*vn1
|
|
vn22=vn2*vn2
|
|
vn12=vn1*vn2
|
|
xnorm=1.0/(1.0+vns+0.5*vns*vns)
|
|
c
|
|
jl=0
|
|
ju=nxalpd(it0)+1
|
|
110 if(ju-jl.gt.1) then
|
|
jm=(ju+jl)/2
|
|
if(xl.gt.xlalpd(jm,it0)) then
|
|
jl=jm
|
|
else
|
|
ju=jm
|
|
endif
|
|
go to 110
|
|
endif
|
|
j=jl
|
|
c
|
|
if(j.eq.0) j=1
|
|
if(j.eq.nxalpd(it0)) j=j-1
|
|
a1=(xl-xlalpd(j,it0))/(xlalpd(j+1,it0)-xlalpd(j,it0))
|
|
p1= vn1*((1.0-a1)*plalpd(j,1,it0)+a1*plalpd(j+1,1,it0))
|
|
p11=vn11*((1.0-a1)*plalpd(j,2,it0)+a1*plalpd(j+1,2,it0))
|
|
p2= vn2*((1.0-a1)*plalpd(j,3,it0)+a1*plalpd(j+1,3,it0))
|
|
p22=vn22*((1.0-a1)*plalpd(j,4,it0)+a1*plalpd(j+1,4,it0))
|
|
p12=vn12*((1.0-a1)*plalpd(j,5,it0)+a1*plalpd(j+1,5,it0))
|
|
prof=(p1+p2+p11+p22+p12)*xnorm*xnorma
|
|
return
|
|
c
|
|
30 continue
|
|
c
|
|
c interpolate in the tables for different T
|
|
c
|
|
c the lower T
|
|
c
|
|
if(xl.lt.xlalpd(1,it0).or.xl.gt.xlalpd(nxalpd(it0),it0)) return
|
|
vn1=hneutr/stnead(it0)
|
|
vn2=hcharg/stnchd(it0)
|
|
vns=vn1*vneuad(it0)+vn2*vchaad(it0)
|
|
vn11=vn1*vn1
|
|
vn22=vn2*vn2
|
|
vn12=vn1*vn2
|
|
xnorm=1.0/(1.0+vns+0.5*vns*vns)
|
|
jl=0
|
|
ju=nxalpd(it0)+1
|
|
120 if(ju-jl.gt.1) then
|
|
jm=(ju+jl)/2
|
|
if(xl.gt.xlalpd(jm,it0)) then
|
|
jl=jm
|
|
else
|
|
ju=jm
|
|
endif
|
|
go to 120
|
|
endif
|
|
j=jl
|
|
c
|
|
if(j.eq.0) j=1
|
|
if(j.eq.nxalpd(it0)) j=j-1
|
|
a1=(xl-xlalpd(j,it0))/(xlalpd(j+1,it0)-xlalpd(j,it0))
|
|
p1= vn1*((1.0-a1)*plalpd(j,1,it0)+a1*plalpd(j+1,1,it0))
|
|
p11=vn11*((1.0-a1)*plalpd(j,2,it0)+a1*plalpd(j+1,2,it0))
|
|
p2= vn2*((1.0-a1)*plalpd(j,3,it0)+a1*plalpd(j+1,3,it0))
|
|
p22=vn22*((1.0-a1)*plalpd(j,4,it0)+a1*plalpd(j+1,4,it0))
|
|
p12=vn12*((1.0-a1)*plalpd(j,5,it0)+a1*plalpd(j+1,5,it0))
|
|
prof0=(p1+p2+p11+p22+p12)*xnorm*xnorma
|
|
c
|
|
c the higher T
|
|
c
|
|
it0=it0+1
|
|
if(xl.lt.xlalpd(1,it0).or.xl.gt.xlalpd(nxalpd(it0),it0)) return
|
|
vn1=hneutr/stnead(it0)
|
|
vn2=hcharg/stnchd(it0)
|
|
vns=vn1*vneuad(it0)+vn2*vchaad(it0)
|
|
vn11=vn1*vn1
|
|
vn22=vn2*vn2
|
|
vn12=vn1*vn2
|
|
xnorm=1.0/(1.0+vns+0.5*vns*vns)
|
|
jl=0
|
|
ju=nxalpd(it0)+1
|
|
130 if(ju-jl.gt.1) then
|
|
jm=(ju+jl)/2
|
|
if(xl.gt.xlalpd(jm,it0)) then
|
|
jl=jm
|
|
else
|
|
ju=jm
|
|
endif
|
|
go to 130
|
|
endif
|
|
j=jl
|
|
c
|
|
if(j.eq.0) j=1
|
|
if(j.eq.nxalpd(it0)) j=j-1
|
|
a1=(xl-xlalpd(j,it0))/(xlalpd(j+1,it0)-xlalpd(j,it0))
|
|
p1= vn1*((1.0-a1)*plalpd(j,1,it0)+a1*plalpd(j+1,1,it0))
|
|
p11=vn11*((1.0-a1)*plalpd(j,2,it0)+a1*plalpd(j+1,2,it0))
|
|
p2= vn2*((1.0-a1)*plalpd(j,3,it0)+a1*plalpd(j+1,3,it0))
|
|
p22=vn22*((1.0-a1)*plalpd(j,4,it0)+a1*plalpd(j+1,4,it0))
|
|
p12=vn12*((1.0-a1)*plalpd(j,5,it0)+a1*plalpd(j+1,5,it0))
|
|
prof1=(p1+p2+p11+p22+p12)*xnorm*xnorma
|
|
c
|
|
c final profile coefficient
|
|
c
|
|
dt=talpd(it0)-talpd(it0-1)
|
|
prof=(prof0*(talpd(it0)-t)+prof1*(t-talpd(it0-1)))/dt
|
|
c
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C **************************************************************
|
|
C
|
|
C
|
|
subroutine hedif
|
|
c ================
|
|
c
|
|
c subroutine to calculate the depth dependent abundance profile for
|
|
c a layered H+He atmosphere.
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
common/hediff/ hcmass,radstr
|
|
c real depth(mdepth+1),qs(mdepth+1),
|
|
dimension depth(mdepth+1),qs(mdepth+1),
|
|
* ps(mdepth+1),gams(mdepth+1),
|
|
* abunds(mdepth+1),hms(mdepth+1)
|
|
c
|
|
data smas,srad /1.9891e33,6.9599e10/
|
|
data z1,z2,a1,a2 /1.,2.,1.,4./
|
|
data bigg,pi / 6.6732e-8,3.141592654/
|
|
c
|
|
c Set up starting values
|
|
c
|
|
do id=1,nd
|
|
depth(id+1)=dm(id)
|
|
end do
|
|
if(radstr.lt.1.e3) radius=radstr*srad
|
|
if(hcmass.gt.1.e-10) hcmass=hcmass*1.e-13
|
|
c
|
|
gam=1.e-30
|
|
gams(1)=1.e-30
|
|
c
|
|
10 continue
|
|
depth(1)=1.e-10
|
|
q1=(depth(1)*4*pi*radius**2/smas)
|
|
p1=(q1*grav**2/(4*pi*bigg))
|
|
ps(1)=p1
|
|
qs(1)=q1
|
|
hms(1)=0
|
|
abunds(1)=0.0
|
|
dpsl=-6
|
|
hm=0.0
|
|
do i=2,nd+1,1
|
|
q2=(depth(i)*4*pi*radius**2/smas)
|
|
p2=(q2*grav**2/(4*pi*bigg))
|
|
dp=p2-p1
|
|
dlp=log(p2)-log(p1)
|
|
gam=gam+raph(gam,z1,z2,a1,a2)*dlp
|
|
abun0=gam
|
|
hm=hm+(q2-q1)/((1+gam*a2/a1))
|
|
p1=p2
|
|
ps(i)=p2
|
|
qs(i)=q2
|
|
gams(i)=gam
|
|
abunds(i)=abun0
|
|
hms(i)=hm
|
|
end do
|
|
c
|
|
dh1=(log10(hcmass)-log10(hms(nd+1)))
|
|
dh=hcmass/hms(nd+1)
|
|
if(dh.ge.0.99) go to 20
|
|
gam=gams(1)*1.1
|
|
gams(1)=gam
|
|
hm=0.0
|
|
go to 10
|
|
c
|
|
c Now work backwards to get the full profiles
|
|
c
|
|
20 continue
|
|
q1=(depth(nd+1)*4*pi*radius**2/smas)
|
|
p1=(q1*grav**2/(4*pi*bigg))
|
|
c
|
|
c store new helium abundance and corresponding new YTOT, MMY, WMM
|
|
c
|
|
write(6,600)
|
|
do id=1,nd
|
|
aheold=0.
|
|
ahenew=abunds(id+1)
|
|
if(iathe.gt.0) then
|
|
aheold=abund(iathe,id)
|
|
abund(iathe,id)=ahenew
|
|
end if
|
|
ytot(id)=ytot(id)-aheold+ahenew
|
|
wmy(id)=wmy(id)+(ahenew-aheold)*4.003
|
|
wmm(id)=wmy(id)*hmass/ytot(id)
|
|
write(6,601) id,aheold,ahenew,ytot(id),wmy(id),wmm(id)
|
|
end do
|
|
600 format(' stratified helium abundance'/
|
|
*' id He(old) He(new) ytot wmm wmy'/)
|
|
601 format(i4,1p5e11.3)
|
|
c
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
function raph(gam,z1,z2,a1,a2)
|
|
c ==============================
|
|
c
|
|
c auxiliary function for subroutine hedif
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
c
|
|
b=1+gam
|
|
c=z1+z2*gam
|
|
d=a1+a2*gam
|
|
e=(1+z1)+gam*(1+z2)
|
|
den=(c*d/(gam*b))+(d*(z1-z2)**2/(b*e))
|
|
dnum=e*(a2*z1-a1*z2)+d*(z2-z1)
|
|
dgam=dnum/den
|
|
raph=dgam
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE TABINI
|
|
C =================
|
|
C
|
|
C Initialization and reading of the opacity table for thermal processe
|
|
C and Rayleigh scattering
|
|
c raytab: scattering opacities in cm^2/gm at 5.0872638d14 Hz (sodium D)
|
|
c (NOTE: Quantities in rayleigh.tab are in log_e)
|
|
C
|
|
c tempvec: array of temperatures
|
|
c rhomat: array of densities (gm/cm^3)
|
|
c nu: array of frequencies
|
|
c table: absorptive opacities in cm^2/gm
|
|
c (NOTE: Quantities in absorption.tab are in log_e)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
parameter (mtabto=100,mtabro=100)
|
|
common/intcff/yint(mfreq),jint(mfreq)
|
|
common/abntab/abunt(matom),abuno(matom),tmolit,
|
|
* iophmt,ioph2t,iophet,iopcht,iopoht,
|
|
* ioh2mt,ih2h2t,ih2het,ioh2ht,iohhet,
|
|
* ifmolt
|
|
common/eletab/elecgr(mtabt,mtabr)
|
|
CHARACTER(len=100) :: DUM
|
|
c
|
|
real*4 absopa0
|
|
dimension frlt(mfrtab)
|
|
dimension absopa0(mtabto,mtabro),indt(mtabto),indr(mtabro)
|
|
dimension tempve0(100),rhove0(100,100),
|
|
* elecg0(100,100)
|
|
dimension rhov(mtabr),nden(mtabt)
|
|
dimension typa(matom)
|
|
character*(80) optable
|
|
character*4 typa
|
|
c
|
|
istept=1
|
|
istepr=1
|
|
istepf=1
|
|
c
|
|
read(15,*,err=10,end=10) optable,ibinop
|
|
go to 20
|
|
10 optable='./data/absopac.dat'
|
|
20 if(ibinop.eq.0) then
|
|
open(53,file=optable,status='old')
|
|
else
|
|
open(53,file=optable,form='unformatted',status='old')
|
|
end if
|
|
c
|
|
read(15,*,err=30,end=30) istept,istepr,istepf
|
|
30 continue
|
|
c
|
|
write(6,601) optable,ibinop
|
|
601 format(/' '
|
|
* /' OPACITY TABLE: READ FROM THE FILE ',a70/' IBINOP=',i2/
|
|
* ' --------------'/)
|
|
if(istept.gt.1.or.istepr.gt.1.or.istepf.gt.1) then
|
|
write(6,*) ' BUT ONLY SELECTED DATA USED'
|
|
write(6,*)
|
|
end if
|
|
c
|
|
c reading the opacity table in the old mode
|
|
c
|
|
if(ioptab.lt.0.and.iopold.gt.0) then
|
|
if(ibinop.eq.0) then
|
|
read(53,*) numfre0,numtem0,numrh0
|
|
read(53,*)
|
|
read(53,*) (tempve0(i),i=1,numtem0)
|
|
read(53,*)
|
|
read(53,*) (rhove0(1,j),j=1,numrh0)
|
|
else
|
|
read(53) numfre0,numtem0,numrh0
|
|
read(53) (tempve0(i),i=1,numtem0)
|
|
read(53) (rhove0(1,j),j=1,numrh0)
|
|
end if
|
|
c
|
|
c reading the opacity table in the new mode
|
|
c
|
|
else
|
|
io2hmt=0
|
|
ih2h2t=0
|
|
ih2het=0
|
|
ioh2ht=0
|
|
iohhet=0
|
|
if(ibinop.eq.0) then
|
|
read(53,*)
|
|
read(53,*)
|
|
do iat=1,matom
|
|
read(53,'(a100)') dum
|
|
read(dum,*,iostat=kst) typa(iat),abunt(iat),abuno(iat)
|
|
if(kst.ne.0) go to 40
|
|
end do
|
|
read(53,*)
|
|
40 continue
|
|
read(53,*)
|
|
read(53,*) ifmolt,tmolit
|
|
read(53,*)
|
|
read(53,*)
|
|
read(53,'(a100)') dum
|
|
read(dum,*,iostat=kst) iophmt,ioph2t,iophet,iopcht,iopoht,
|
|
* ioh2mt,ih2h2t,ih2het,ioh2ht,iohhet
|
|
if(kst.ne.0) read(dum,*) iophmt,ioph2t,iophet,iopcht,iopoht
|
|
read(53,*)
|
|
read(53,*)
|
|
read(53,*) numfre0,numtem0,numrh0
|
|
if(numrh0.gt.0) then
|
|
read(53,*)
|
|
read(53,*) (tempve0(i),i=1,numtem0)
|
|
read(53,*)
|
|
read(53,*) (rhov(j),j=1,numrh0)
|
|
nden(1)=numrh0
|
|
do j=1,numrh0
|
|
do i=1,numtem0
|
|
rhove0(i,j)=rhov(j)
|
|
end do
|
|
end do
|
|
do i=1,numtem0
|
|
nden(i)=nden(1)
|
|
end do
|
|
read(53,*)
|
|
read(53,*) ((elecg0(i,j),j=1,numrh0),i=1,numtem0)
|
|
else
|
|
read(53,*) (nden(i),i=1,numtem0)
|
|
read(53,*)
|
|
read(53,*) (tempve0(i),i=1,numtem0)
|
|
read(53,*)
|
|
do i=1,numtem0
|
|
read(53,*) (rhove0(i,j),j=1,nden(i))
|
|
end do
|
|
read(53,*)
|
|
do i=1,numtem0
|
|
read(53,*) (elecg0(i,j),j=1,nden(i))
|
|
end do
|
|
end if
|
|
else
|
|
do iat=1,92
|
|
read(53) typa(iat),abunt(iat),abuno(iat)
|
|
end do
|
|
read(53) ifmolt,tmolit
|
|
read(53) iophmt,ioph2t,iophet,iopcht,iopoht,
|
|
* ioh2mt,ih2h2t,ih2het,ioh2ht,iohhet
|
|
read(53) numfre0,numtem0,numrh0
|
|
if(numrh0.gt.0) then
|
|
read(53) (tempve0(i),i=1,numtem0)
|
|
read(53) (rhov(j),j=1,numrh0)
|
|
read(53) ((elecg0(i,j),j=1,numrh0),i=1,numtem0)
|
|
nden(1)=numrh0
|
|
do j=1,numrh0
|
|
do i=1,numtem0
|
|
rhove0(i,j)=rhov(j)
|
|
end do
|
|
end do
|
|
do i=1,numtem0
|
|
nden(i)=nden(1)
|
|
end do
|
|
else
|
|
read(53) (nden(i),i=1,numtem0)
|
|
read(53) (tempve0(i),i=1,numtem0)
|
|
do i=1,numtem0
|
|
read(53) (rhove0(i,j),j=1,nden(i))
|
|
end do
|
|
do i=1,numtem0
|
|
read(53) (elecg0(i,j),j=1,nden(i))
|
|
end do
|
|
end if
|
|
end if
|
|
c
|
|
end if
|
|
c
|
|
C select only a part of tabular data (if required)
|
|
C
|
|
j=0
|
|
nrmax=0.
|
|
do it=1,numtem0,istept
|
|
j=j+1
|
|
tempvec(j)=tempve0(it)
|
|
indt(j)=it
|
|
k=0.
|
|
numr=nden(it)
|
|
nrmax=max(nrmax,numr)
|
|
do ir=1,numr,istepr
|
|
k=k+1
|
|
rhomat(j,k)=rhove0(it,ir)
|
|
indr(k)=ir
|
|
elecgr(j,k)=elecg0(it,ir)
|
|
end do
|
|
numrh(j)=k
|
|
end do
|
|
numtemp=j
|
|
if(numrh0.gt.0) numrho=k
|
|
if(numtemp.gt.mtabt) then
|
|
write(*,*) 'number of temperatures in opac.table too large'
|
|
write(*,*) 'numtemp,mtabt = ',numtemp,mtabt
|
|
write(*,*) 'recompile with MTABT.ge.NUMTEMP in BASICS.FOR'
|
|
stop
|
|
end if
|
|
c
|
|
if(nrmax.gt.mtabr) then
|
|
write(*,*) 'number of densities in opac,table too large'
|
|
write(*,*) 'numrho,mtabr = ',numtemp,mtabr
|
|
write(*,*) 'recompile with MTABR.ge.NUMRHO in BASICS.FOR'
|
|
stop
|
|
end if
|
|
c
|
|
ij=0
|
|
do k=1,numfre0
|
|
if(mod(k,istepf).eq.0) ij=ij+1
|
|
end do
|
|
numfreq=ij
|
|
if(numfreq.gt.mfreqc) then
|
|
write(*,*) 'number of wavelengths in opac.table too large'
|
|
write(*,*) 'numfreq,mfreqc = ',numfreq,mfreqc
|
|
write(*,*) 'recompile with MFREQC.ge.NUMFREQ in BASICS.FOR'
|
|
stop
|
|
end if
|
|
c
|
|
write(6,602) numfre0,numtem0,numrh0
|
|
602 format(' original number of frequencies, temperatures',
|
|
* ' densities: ',3i7/)
|
|
C
|
|
if(istept.gt.1.or.istepr.gt.1.or.istepf.gt.1)
|
|
* write(6,603) numfreq,numtemp,numrho
|
|
603 format(' modified number of frequencies, temperatures',
|
|
* ' densities: ',3i7/)
|
|
C
|
|
write(*,*) 'temperatures:'
|
|
write(6,604) (exp(tempvec(i)),i=1,numtemp)
|
|
write(*,*) 'densities:'
|
|
do i=1,numtemp
|
|
numr=numrh(i)
|
|
write(6,605) exp(tempvec(i)),(exp(rhomat(i,j)),j=1,numr)
|
|
end do
|
|
604 format(10f8.1)
|
|
605 format('for T=',f7.1,(1p10e10.2))
|
|
c
|
|
c check the consistency (or a lack thereof) the parameters of
|
|
c the opacity table
|
|
c
|
|
c if(ioptab.gt.0.or.iopold.eq.0) call chctab
|
|
c
|
|
RTAB1 = rhomat(1,1)
|
|
RTAB2 = rhomat(1,numrho)
|
|
TTAB1 = tempvec(1)
|
|
TTAB2 = tempvec(numtemp)
|
|
c
|
|
if(ibinop.eq.0) then
|
|
ij=0
|
|
nden0=numrh0
|
|
do k=1,numfre0
|
|
read(53,*)
|
|
read(53,*)
|
|
read(53,*) frta
|
|
if(numrh0.gt.0) then
|
|
do j = 1, numrh0
|
|
read(53,*) (absopa0(i,j),i=1,numtem0)
|
|
end do
|
|
else
|
|
do i=1,numtem0
|
|
nden0=nden(i)
|
|
read(53,*) (absopa0(i,j),j=1,nden0)
|
|
end do
|
|
end if
|
|
if(mod(k,istepf).eq.0.and.frta.lt.frtlim) then
|
|
ij=ij+1
|
|
frtab(ij)=frta
|
|
frlt(ij)=log10(frta)
|
|
do i=1,numtemp
|
|
numr=numrh(i)
|
|
do j=1,numr
|
|
absopac(i,j,ij)=absopa0(indt(i),indr(j))
|
|
end do
|
|
end do
|
|
end if
|
|
end do
|
|
numfreq=ij
|
|
close(53)
|
|
else
|
|
ij=0
|
|
do k=1,numfre0
|
|
read(53) frta
|
|
if(numrh0.gt.0) then
|
|
do j = 1, numrh0
|
|
read(53) (absopa0(i,j),i=1,numtem0)
|
|
end do
|
|
else
|
|
do i=1,numtem0
|
|
nden0=nden(i)
|
|
read(53,err=11) (absopa0(i,j),j=1,nden0)
|
|
11 continue
|
|
end do
|
|
end if
|
|
if(mod(k,istepf).eq.0.and.frta.lt.frtlim) then
|
|
ij=ij+1
|
|
frtab(ij)=frta
|
|
frlt(ij)=log10(frta)
|
|
do i=1,numtemp
|
|
numr=numrh(i)
|
|
do j=1,numr
|
|
absopac(i,j,ij)=absopa0(indt(i),indr(j))
|
|
end do
|
|
end do
|
|
end if
|
|
end do
|
|
numfreq=ij
|
|
c
|
|
c write(*,*) 'final NUMFREQ, FREQ(1)',numfreq,freq(1)
|
|
c
|
|
DO K=1,NUMFREQ
|
|
IF(FRTAB(K).GT.2.997925E13) THEN
|
|
K0=K
|
|
ELSE
|
|
do i=1,numtemp
|
|
numr=numrh(i)
|
|
do j=1,numr
|
|
absopac(i,j,k)=absopac(i,j,k0)
|
|
end do
|
|
end do
|
|
END IF
|
|
END DO
|
|
close(53)
|
|
end if
|
|
c
|
|
frtabm=max(frtab(1),frtab(numfreq))
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE RAYINI
|
|
C =================
|
|
C
|
|
C Initialization and reading of the opacity table for thermal processe
|
|
C and Rayleigh scattering
|
|
c raytab: scattering opacities in cm^2/gm at 5.0872638d14 Hz (sodium D)
|
|
c (NOTE: Quantities in rayleigh.tab are in log_e)
|
|
C
|
|
c tempvec: array of temperatures
|
|
c rhomat: array of densities (gm/cm^3)
|
|
c nu: array of frequencies
|
|
c table: absorptive opacities in cm^2/gm
|
|
c (NOTE: Quantities in absorption.tab are in log_e)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
|
|
c
|
|
c read Rayleigh scattering opacity table (if needed)
|
|
c
|
|
numfreq2 = numfreq
|
|
if(ifrayl.lt.0) then
|
|
open(52,file='./data/rayleigh.tab',status='old')
|
|
read(52,*) numfreq2,numtemp,numrho
|
|
read(52,*)
|
|
read(52,*) (tempvec(i),i=1,numtemp)
|
|
read(52,*)
|
|
read(52,*) ((rhomat(i,j),j=1,numrho),i=1,numtemp)
|
|
read(52,*)
|
|
do j = 1, numrho
|
|
read(52,*) (raytab(i,j),i=1,numtemp)
|
|
end do
|
|
close(52)
|
|
call rayset
|
|
else if(ifrayl.gt.0) then
|
|
call rayleigh(0,0,0,scr)
|
|
end if
|
|
c
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE TABINT
|
|
C =================
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
common/intcff/yint(mfreq),jint(mfreq)
|
|
dimension absort(mfrtab)
|
|
C
|
|
IF(IOPTAB.LT.0.AND.IFRSET.EQ.0) THEN
|
|
c
|
|
C if frequencies are exactly tabular
|
|
c
|
|
nfreq=numfreq
|
|
nfreqc=numfreq
|
|
do ij=1,nfreq
|
|
freq(ij)=frtab(ij)
|
|
ijfr(ij)=ij
|
|
jik(ij)=ij
|
|
ijali(ij)=1
|
|
end do
|
|
w(1)=0.5*(frtab(1)-frtab(2))
|
|
w(nfreq)=0.5*(frtab(nfreq-1)-frtab(nfreq))
|
|
do ij=2,nfreq-1
|
|
w(ij)=0.5*(frtab(ij-1)-frtab(ij+1))
|
|
end do
|
|
C
|
|
ELSE
|
|
C
|
|
C if frequencies are already set
|
|
c
|
|
c set up interpolation coefficients for frequency interpolation
|
|
c by bisection
|
|
c
|
|
fr1=frtab(1)
|
|
fr2=frtab(numfreq)
|
|
do ij=1,nfreq
|
|
xint=freq(ij)
|
|
jl=0
|
|
ju=numfreq+1
|
|
10 continue
|
|
if(ju-jl.gt.1) then
|
|
jm=(ju+jl)/2
|
|
if((fr2.gt.fr1).eqv.(xint.gt.frtab(jm))) then
|
|
jl=jm
|
|
else
|
|
ju=jm
|
|
end if
|
|
go to 10
|
|
end if
|
|
j=jl
|
|
if(j.eq.numfreq) j=j-1
|
|
if(j.eq.0) j=j+1
|
|
jint(ij)=j
|
|
yint(ij)=un/log10(frtab(j+1)/frtab(j))
|
|
end do
|
|
c
|
|
do it=1,numtemp
|
|
numrho=numrh(it)
|
|
do ir=1,numrho
|
|
do k=1,numfreq
|
|
absort(k)=absopac(it,ir,k)
|
|
end do
|
|
do ij=1,nfreq
|
|
j=jint(ij)
|
|
rc=(absort(j+1)-absort(j))*yint(ij)
|
|
opac=rc*log10(freq(ij)/frtab(j))+absort(j)
|
|
absopac(it,ir,ij)=opac
|
|
end do
|
|
end do
|
|
end do
|
|
c
|
|
c reset tabular opacities to zero out of range of FREQ
|
|
c
|
|
do ij=1,nfreq
|
|
if(freq(ij).lt.fr2*0.99.or.freq(ij).gt.fr1*1.01) then
|
|
do it=1,numtemp
|
|
numrho=numrh(it)
|
|
do ir=1,numrho
|
|
absopac(it,ir,ij)=0.
|
|
end do
|
|
end do
|
|
end if
|
|
end do
|
|
END IF
|
|
C
|
|
RETURN
|
|
END
|
|
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
subroutine chctab
|
|
c =================
|
|
c
|
|
c check the consistency of the opacities in the opacity
|
|
c table; modify the input paramaters for additional opacities
|
|
c if needed
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
common/abntab/abunt(matom),abuno(matom),tmolit,
|
|
* iophmt,ioph2t,iophet,iopcht,iopoht,
|
|
* ioh2mt,ih2h2t,ih2het,ioh2ht,iohhet,
|
|
* ifmolt
|
|
c
|
|
character*4 typ
|
|
dimension typ(matom)
|
|
c
|
|
DATA TYP/' H ',' He ',' Li ',' Be ',' B ',' C ',
|
|
* ' N ',' O ',' F ',' Ne ',' Na ',' Mg ',
|
|
* ' Al ',' Si ',' P ',' S ',' Cl ',' Ar ',
|
|
* ' K ',' Ca ',' Sc ',' Ti ',' V ',' Cr ',
|
|
* ' Mn ',' Fe ',' Co ',' Ni ',' Cu ',' Zn ',
|
|
* ' Ga ',' Ge ',' As ',' Se ',' Br ',' Kr ',
|
|
* ' Rb ',' Sr ',' Y ',' Zr ',' Nb ',' Mo ',
|
|
* ' Tc ',' Ru ',' Rh ',' Pd ',' Ag ',' Cd ',
|
|
* ' In ',' Sn ',' Sb ',' Te ',' I ',' Xe ',
|
|
* ' Cs ',' Ba ',' La ',' Ce ',' Pr ',' Nd ',
|
|
* ' Pm ',' Sm ',' Eu ',' Gd ',' Tb ',' Dy ',
|
|
* ' Ho ',' Er ',' Tm ',' Yb ',' Lu ',' Hf ',
|
|
* ' Ta ',' W ',' Re ',' Os ',' Ir ',' Pt ',
|
|
* ' Au ',' Hg ',' Tl ',' Pb ',' Bi ',' Po ',
|
|
* ' At ',' Rn ',' Fr ',' Ra ',' Ac ',' Th ',
|
|
* ' Pa ',' U ',' Np ',' Pu ',' Am ',' Cm ',
|
|
* ' Bk ',' Cf ',' Es '/
|
|
c
|
|
write(6,600)
|
|
do ia=1,matom
|
|
write(6,601) typ(ia),abndd(ia,1),abunt(ia),abuno(ia)
|
|
end do
|
|
600 format(
|
|
* ' chemical abundances:'//
|
|
* 7x,' HERE OP.TAB.EOS OP.TAB.OPACITIES')
|
|
601 format(2x,a4,1p3e12.3)
|
|
603 format(/' treatment of molecules: IFMOL here: ',i4/
|
|
* ' op.tab:',i4/
|
|
* ' TMOLIM here: ',f10.1/
|
|
* ' op.tab:',f10.1)
|
|
c
|
|
write(6,603) ifmol,ifmolt,tmolim,tmolit
|
|
if(ifmol.ne.ifmolt) then
|
|
if(keepop.eq.0) then
|
|
ifmol=ifmolt
|
|
tmolim=tmolit
|
|
write(6,*)
|
|
* ' IFMOL and TMILIM changed to the values of op.table'
|
|
else
|
|
write(6,*) ' but IFMOL and TMOLIM retained here'
|
|
end if
|
|
end if
|
|
c
|
|
write(6,604)
|
|
604 format(/' additional opacities'/)
|
|
if(iophmt.gt.0.and.(iophmi.gt.0.or.ielhm.gt.0)) then
|
|
write(6,*) 'H- opacity included in the op.table and here'
|
|
if(keepop.eq.0) then
|
|
iophmi=0
|
|
write(6,*) ' so removed here (IOPHMI=0)'
|
|
if(ielhm.gt.0)
|
|
* write(6,*) ' but H- is explicit here, needs to be changed!!'
|
|
* '
|
|
else
|
|
write(6,*) ' but retained here, so it is taken twice!'
|
|
end if
|
|
end if
|
|
if(iophmi.gt.0.or.ielhm.gt.0) write(6,*)
|
|
* 'H- opacity included here'
|
|
c
|
|
if(ioph2t.gt.0.and.ioph2p.gt.0) then
|
|
write(6,*) 'H2+ opacity included in the op.table and here'
|
|
if(keepop.eq.0) then
|
|
ioph2p=0
|
|
write(6,*) ' so removed here (IOPH2P=0)'
|
|
else
|
|
write(6,*) ' but retained here, so it is taken twice!'
|
|
end if
|
|
end if
|
|
if(ioph2p.gt.0) write(6,*) 'H2+ opacity included here'
|
|
c
|
|
if(iophet.gt.0.and.iophem.gt.0) then
|
|
write(6,*) 'He- opacity included in the op.table and here'
|
|
if(keepop.eq.0) then
|
|
iophem=0
|
|
write(6,*) ' so removed here (IOPHEM=0)'
|
|
else
|
|
write(6,*) ' but retained here, so it is taken twice!'
|
|
end if
|
|
end if
|
|
c
|
|
if(iopcht.gt.0.and.iopch.gt.0) then
|
|
write(6,*) 'CH opacity included in the op.table and here'
|
|
if(keepop.eq.0) then
|
|
iopch=0
|
|
write(6,*) ' so removed here (IOPCH=0)'
|
|
else
|
|
write(6,*) ' but retained here, so it is taken twice!'
|
|
end if
|
|
end if
|
|
c
|
|
if(iopoht.gt.0.and.iopoh.gt.0) then
|
|
write(6,*) 'OH opacity included in the op.table and here'
|
|
if(keepop.eq.0) then
|
|
iopoh=0
|
|
write(6,*) ' so removed here (IOPOH=0)'
|
|
else
|
|
write(6,*) ' but retained here, so it is taken twice!'
|
|
end if
|
|
end if
|
|
c
|
|
if(ioh2mt.gt.0.and.ioph2m.gt.0) then
|
|
write(6,*) 'H2- opacity included in the op.table and here'
|
|
if(keepop.eq.0) then
|
|
ioph2m=0
|
|
write(6,*) ' so removed here (IOPH2M=0)'
|
|
else
|
|
write(6,*) ' but retained here, so it is taken twice!'
|
|
end if
|
|
end if
|
|
c
|
|
if(ih2h2t.gt.0.and.ioh2h2.gt.0) then
|
|
write(6,*) 'CIA H2-H2 opacity included in the op.table and here'
|
|
if(keepop.eq.0) then
|
|
ioh2h2=0
|
|
write(6,*) ' so removed here (IOH2H2=0)'
|
|
else
|
|
write(6,*) ' but retained here, so it is taken twice!'
|
|
end if
|
|
end if
|
|
c
|
|
if(ih2het.gt.0.and.ioh2he.gt.0) then
|
|
write(6,*) 'CIA H2-He opacity included in the op.table and here'
|
|
if(keepop.eq.0) then
|
|
ioh2he=0
|
|
write(6,*) ' so removed here (IOH2HE=0)'
|
|
else
|
|
write(6,*) ' but retained here, so it is taken twice!'
|
|
end if
|
|
end if
|
|
c
|
|
if(ioh2ht.gt.0.and.ioh2h.gt.0) then
|
|
write(6,*) 'CIA H2-H opacity included in the op.table and here'
|
|
if(keepop.eq.0) then
|
|
ioh2h=0
|
|
write(6,*) ' so removed here (IOH2H=0)'
|
|
else
|
|
write(6,*) ' but retained here, so it is taken twice!'
|
|
end if
|
|
end if
|
|
c
|
|
if(iohhet.gt.0.and.iohhe.gt.0) then
|
|
write(6,*) 'CIA H2-H2 opacity included in the op.table and here'
|
|
if(keepop.eq.0) then
|
|
iohhe=0
|
|
write(6,*) ' so removed here (IOHHE=0)'
|
|
else
|
|
write(6,*) ' but retained here, so it is taken twice!'
|
|
end if
|
|
end if
|
|
c
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
subroutine rayset
|
|
c ===================
|
|
c
|
|
c set up a table of Rayleigh scattering opacity
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
c
|
|
do id=1,nd
|
|
t=temp(id)
|
|
rho=dens(id)
|
|
c
|
|
if(numtemp.eq.nd) then
|
|
opac=raytab(id,1)
|
|
go to 10
|
|
end if
|
|
c
|
|
TL=LOG(T)
|
|
DELTAT=(TL-TTAB1)/(TTAB2-TTAB1)*FLOAT(numtemp-1)
|
|
JT = 1 + IDINT(DELTAT)
|
|
JU = JT + 1
|
|
IF(JT.LT.1) JT = 1
|
|
IF(JT.GT.numtemp-1) JT = numtemp-1
|
|
t1i=tempvec(jt)
|
|
t2i=tempvec(jt+1)
|
|
dti=(TL-T1i)/(T2i-T1i)
|
|
if(deltat.lt.0.) dti = 0.d0
|
|
C
|
|
if(numrho.gt.1) then
|
|
rtab1=rhomat(jt,1)
|
|
rtab2=rhomat(jt,numrho)
|
|
RL = LOG(RHO)
|
|
DELTAR=(RL-RTAB1)/(RTAB2-RTAB1)*FLOAT(numrho-1)
|
|
JR = 1 + IDINT(DELTAR)
|
|
IF(JR.LT.1) JR = 1
|
|
IF(JR.GT.(numrho-1)) JR = numrho-1
|
|
r1i=rhomat(jt,jr)
|
|
r2i=rhomat(jt,jr+1)
|
|
dri=(RL-R1i)/(R2i-R1i)
|
|
if(deltar.lt.0.) dri = 0.d0
|
|
opr1=raytab(jt,jr)+
|
|
* dri*(raytab(jt,jr+1)-raytab(jt,jr))
|
|
c
|
|
rtab1=rhomat(ju,1)
|
|
rtab2=rhomat(ju,numrho)
|
|
RL = LOG(RHO)
|
|
DELTAR=(RL-RTAB1)/(RTAB2-RTAB1)*FLOAT(numrho-1)
|
|
JR = 1 + IDINT(DELTAR)
|
|
IF(JR.LT.1) JR = 1
|
|
IF(JR.GT.(numrho-1)) JR = numrho-1
|
|
r1i=rhomat(ju,jr)
|
|
r2i=rhomat(ju,jr+1)
|
|
dri=(RL-R1i)/(R2i-R1i)
|
|
if(deltar.lt.0.) dri = 0.d0
|
|
opr2=raytab(ju,jr)+
|
|
* dri*(raytab(ju,jr+1)-raytab(ju,jr))
|
|
c
|
|
opac=opr1+(opr2-opr1)*dti
|
|
else
|
|
jr=1
|
|
opac=raytab(jt,jr)+(raytab(ju,jr)-raytab(jt,jr))*dti
|
|
end if
|
|
10 continue
|
|
raysc(id)=exp(opac)
|
|
end do
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ***********************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE RAYLEIGH(MODE,IJ,ID,SCR)
|
|
C ===================================
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
PARAMETER (FRRAY = 2.463D15,
|
|
* FRAYHe = 5.150E15,
|
|
* FRAYH2 = 2.922E15,
|
|
* C18 = 2.997925D18,
|
|
* CR0 = 5.799D-13,
|
|
* CR1 = 1.422D-6,
|
|
* CR2 = 2.784D0)
|
|
COMMON/RAYSCT/RCS(MFREQ),RCHE(MFREQ),RCH2(MFREQ)
|
|
common/eospar/anmol(600,mdepth),
|
|
* anato(100,mdepth),
|
|
* anion(100,mdepth)
|
|
C
|
|
IF(MODE.EQ.0) THEN
|
|
DO IK=1,NFREQ
|
|
FRM=MIN(FREQ(IK),FRRAY)
|
|
x=UN/(C18/FRM)**2
|
|
RCS(IK)=(CR0+(CR1+CR2*X)*X)*X*X
|
|
END DO
|
|
IF(IRSCHE.NE.0) THEN
|
|
DO IK=1,NFREQ
|
|
X=(C18/MIN(FR,FRAYHe))**2
|
|
RCHE(IK)=5.484E-14/X/X*(1.+(2.44E5+5.94E10/
|
|
* (X-2.90E5))/X)**2
|
|
END DO
|
|
END IF
|
|
IF(IRSCH2.NE.0.AND.IFMOL.GT.0) THEN
|
|
DO IK=1,NFREQ
|
|
X=(C18/MIN(FR,FRAYH2))**2
|
|
X2=1./X/X
|
|
RCH2(IK)=(8.14E-13+1.28E-6/X+1.61*X2)*X2
|
|
END DO
|
|
END IF
|
|
ELSE
|
|
SCR=RCS(IJ)*anato(1,id)
|
|
IF(IRSCHE.NE.0) SCR=SCR+RCHE(IJ)*ANATO(2,ID)
|
|
IF(IRSCH2.NE.0.AND.IFMOL.GT.0) SCR=SCR+RCH2(IJ)*ANMOL(2,ID)
|
|
END IF
|
|
RETURN
|
|
END
|
|
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE OPCTAB(FR,IJ,ID,T,RHO,AB,SC,SCT,IGRAM)
|
|
C =================================================
|
|
C
|
|
C opacity for a given temperature and density computed
|
|
C by an interpolation of the precalculated opacity table
|
|
C
|
|
C This is a simplified routine with all interpolations linear
|
|
C
|
|
C Input: FR - frequency (Hz)
|
|
C T - temperature (K)
|
|
C RHO - density (g cm^-3)
|
|
C Outout: AB - absorptive opacity (per gram)
|
|
C SC - scattering opacity (per gram)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
parameter (frray0 = 5.0872638d14)
|
|
C
|
|
jf=ij
|
|
frij=fr
|
|
c
|
|
if(numtemp.eq.nd) then
|
|
opac=absopac(id,1,jf)
|
|
go to 10
|
|
end if
|
|
c
|
|
TL=LOG(T)
|
|
DELTAT=(TL-TTAB1)/(TTAB2-TTAB1)*FLOAT(numtemp-1)
|
|
JT = 1 + IDINT(DELTAT)
|
|
JU = JT + 1
|
|
IF(JT.LT.1) JT = 1
|
|
IF(JT.GT.numtemp-1) JT = numtemp-1
|
|
t1i=tempvec(jt)
|
|
t2i=tempvec(jt+1)
|
|
dti=(TL-T1i)/(T2i-T1i)
|
|
if(deltat.lt.0.) dti = 0.d0
|
|
C
|
|
if(numrh(1).ne.1) then
|
|
c
|
|
c lower temperature
|
|
c
|
|
numrho=numrh(jt)
|
|
rtab1=rhomat(jt,1)
|
|
rtab2=rhomat(jt,numrho)
|
|
RL = LOG(RHO)
|
|
DELTAR=(RL-RTAB1)/(RTAB2-RTAB1)*FLOAT(numrho-1)
|
|
JR = 1 + IDINT(DELTAR)
|
|
IF(JR.LT.1) JR = 1
|
|
IF(JR.GT.(numrho-1)) JR = numrho-1
|
|
r1i=rhomat(jt,jr)
|
|
r2i=rhomat(jt,jr+1)
|
|
dri=(RL-R1i)/(R2i-R1i)
|
|
if(deltar.lt.0.) dri = 0.d0
|
|
opr1=absopac(jt,jr,jf)+
|
|
* dri*(absopac(jt,jr+1,jf)-absopac(jt,jr,jf))
|
|
c
|
|
c higher temperature
|
|
c
|
|
ju=jt+1
|
|
numrho=numrh(ju)
|
|
rtab1=rhomat(ju,1)
|
|
rtab2=rhomat(ju,numrho)
|
|
RL = LOG(RHO)
|
|
DELTAR=(RL-RTAB1)/(RTAB2-RTAB1)*FLOAT(numrho-1)
|
|
JR = 1 + IDINT(DELTAR)
|
|
IF(JR.LT.1) JR = 1
|
|
IF(JR.GT.(numrho-1)) JR = numrho-1
|
|
r1i=rhomat(ju,jr)
|
|
r2i=rhomat(ju,jr+1)
|
|
dri=(RL-R1i)/(R2i-R1i)
|
|
if(deltar.lt.0.) dri = 0.d0
|
|
opr2=absopac(ju,jr,jf)+
|
|
* dri*(absopac(ju,jr+1,jf)-absopac(ju,jr,jf))
|
|
opac=opr1+(opr2-opr1)*dti
|
|
else
|
|
jr=1
|
|
opac=absopac(jt,jr,jf)+(absopac(ju,jr,jf)-
|
|
* absopac(jt,jr,jf))*dti
|
|
end if
|
|
10 continue
|
|
opac=exp(opac)
|
|
C
|
|
AB=opac
|
|
C
|
|
C ************************************************************
|
|
C scattering
|
|
C ************************************************************
|
|
C 1. Rayleigh scattering
|
|
C
|
|
sct=0.
|
|
if(ifrayl.lt.0) then
|
|
sct=raysc(id)*(freq(jf)/frray0)**4
|
|
else if(ifrayl.gt.0) then
|
|
call rayleigh(1,ij,id,scr)
|
|
sct=scr/dens(id)
|
|
end if
|
|
if(ioptab.lt.0) sct=sct+sige*elec(id)/rho
|
|
c sct=sc+sige*elec(id)/dens(id)
|
|
c sct=sc
|
|
C
|
|
c 2. cloud scattering (not yet implemented)
|
|
c
|
|
if(iter.le.0) return
|
|
c
|
|
c ab=ab+abscld(id,jf)
|
|
c sct=sct+scacld(id,jf,1)
|
|
c
|
|
if(igram.eq.0) then
|
|
ab = ab*rho
|
|
sc = sc*rho
|
|
sct=sct*rho
|
|
end if
|
|
c
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE OPACT1(IJ)
|
|
C =====================
|
|
C
|
|
C Absorption, emission, and scattering coefficients
|
|
C at frequency IJ and for all depths
|
|
C
|
|
C Input: IJ opacity and emissivity is calculated for the
|
|
C frequency points with index IJ
|
|
C Output: ABSO1 - array of absorption coefficient
|
|
C EMIS1 - array of emission coefficient
|
|
C SCAT1 - array of scattering coefficient
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
common/hmolab/anh2(mdepth),anhm(mdepth)
|
|
C
|
|
FR=FREQ(IJ)
|
|
DO ID=1,ND
|
|
T=TEMP(ID)
|
|
RHO=DENS(ID)
|
|
HKT1(ID)=HK/T
|
|
XKF(ID)=EXP(-HKT1(ID)*FR)
|
|
XKF1(ID)=UN-XKF(ID)
|
|
XKFB(ID)=XKF(ID)*BNUE(IJ)
|
|
PLAN=XKFB(ID)/XKF1(ID)
|
|
CALL OPCTAB(FR,IJ,ID,T,RHO,AB,SC,SCT,0)
|
|
if(ioptab.lt.0) then
|
|
ABSO1(ID)=AB+sct
|
|
SCAT1(ID)=SCT
|
|
ABSOT(ID)=ABSOT(ID)+ABSO1(ID)/DENS(ID)
|
|
else if(ioptab.gt.0) then
|
|
ABSO1(ID)=ABSO1(ID)+AB
|
|
end if
|
|
EMIS1(ID)=EMIS1(ID)+AB*PLAN
|
|
END DO
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE OPACTD(IJ)
|
|
C =====================
|
|
C
|
|
C Absorption and emission coefficients, and their derivatives
|
|
C
|
|
C This procedure is very similar to OPACT1, the only difference is
|
|
C the evaluation of derivatives
|
|
C
|
|
C Input:
|
|
C IJ - depth index
|
|
C Output:
|
|
C ABSO1 - array of absorption coefficient
|
|
C EMIS1 - array of emission coefficient
|
|
C SCAT1 - array of scattering coefficient
|
|
C Dxxy - array of derivatives of xx (=AB for absorption, =EM for
|
|
C emission, =SC for scattering) coefficient
|
|
C wrt y (=T for temperature, =N for density)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
common/rhoder/drhodt(mdepth)
|
|
PARAMETER (DELT=1.D-3, DELR=1.D-3)
|
|
common/dsctva/dsct1(mdepth),dscn1(mdepth)
|
|
common/hmolab/anh2(mdepth),anhm(mdepth)
|
|
C
|
|
imodf=0
|
|
if(ifryb.gt.0) imodf=1
|
|
FR=FREQ(IJ)
|
|
DO ID=1,ND
|
|
T=TEMP(ID)
|
|
T1=T*(UN+DELT)
|
|
RHO=DENS(ID)
|
|
RHO1=RHO*(UN+DELR)
|
|
XKF(ID)=EXP(-HKT1(ID)*FR)
|
|
XKF1(ID)=UN-XKF(ID)
|
|
XKFB(ID)=XKF(ID)*BNUE(IJ)
|
|
PLAN=XKFB(ID)/XKF1(ID)
|
|
DPLAN=PLAN/XKF1(ID)*HKT1(ID)*FR/T
|
|
CALL OPCTAB(FR,IJ,ID,T,RHO,AB,SC,SCT,imodf)
|
|
CALL OPCTAB(FR,IJ,ID,T1,RHO,AB1,SC1,SCT1,imodf)
|
|
CALL OPCTAB(FR,IJ,ID,T,RHO1,AB2,SC2,SCT2,imodf)
|
|
ABSO1(ID)=AB+sct
|
|
SCAT1(ID)=SCT
|
|
EMIS1(ID)=AB*PLAN
|
|
ABSOT(ID)=ABSO1(ID)
|
|
IF(IMODF.EQ.0) ABSOT(ID)=ABSO1(ID)/DENS(ID)
|
|
c
|
|
c derivatives w.r.t. temperature
|
|
c
|
|
DABT1(ID)=(AB1-AB)/T/DELT
|
|
DEMT1(ID)=AB*DPLAN+DABT1(ID)*PLAN
|
|
DSCT1(ID)=(SCT1-SCT)/T/DELT
|
|
dabt1(id)=dabt1(id)+dsct1(id)
|
|
if(ifryb.gt.0) then
|
|
c
|
|
c derivatives w.r.t. density
|
|
c
|
|
DABN1(ID)=(AB2-AB)/RHO/DELR
|
|
DEMN1(ID)=DABN1(ID)*PLAN
|
|
DSCN1(ID)=(SCT2-SCT)/RHO/DELR
|
|
dabn1(id)=dabn1(id)+dscn1(id)
|
|
c
|
|
c modify derivatives in case density is not a state parameter
|
|
c
|
|
IF(INHE.LE.0) THEN
|
|
DABT1(ID)=DABT1(ID)+DABN1(ID)*DRHODT(ID)
|
|
DEMT1(ID)=DEMT1(ID)+DEMN1(ID)*DRHODT(ID)
|
|
DSCT1(ID)=DSCT1(ID)+DSCN1(ID)*DRHODT(ID)
|
|
DABN1(ID)=0.
|
|
DEMN1(ID)=0.
|
|
DSCN1(ID)=0.
|
|
END IF
|
|
end if
|
|
END DO
|
|
C
|
|
C store quantities for explicit (linearized) frequencies
|
|
C
|
|
IF(IJEX(IJ).LE.0.OR.IFRYB.GT.0) RETURN
|
|
IJE=IJEX(IJ)
|
|
DO ID=1,ND
|
|
ABSOEX(IJE,ID)=ABSO1(ID)
|
|
SCATEX(IJE,ID)=SCAT1(ID)
|
|
EMISEX(IJE,ID)=EMIS1(ID)
|
|
DABTEX(IJE,ID)=DABT1(ID)
|
|
DEMTEX(IJE,ID)=DEMT1(ID)
|
|
DABNEX(IJE,ID)=DABN1(ID)
|
|
DEMNEX(IJE,ID)=DEMN1(ID)
|
|
END DO
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ****************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE SETTRM
|
|
C =================
|
|
C
|
|
C reads the equation-of-state tables for the pressure (P)
|
|
C and entropy (S), as a function of T and rho;
|
|
C
|
|
C stores P(rho,T) and S(rho,t) in arrays PL and SL
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
COMMON/THERM/SL(330,100),PL(330,100)
|
|
COMMON/TABLTD/R1,R2,T1,T2,T12,T22,INDEX
|
|
common/tdedge/redge,pedge(100),sedge(100),cvedge(100),
|
|
& cpedge(100),gammaedge(100),tedge(100)
|
|
common/tdflag/JON
|
|
parameter (RCON=8.31434E7)
|
|
C
|
|
open(58,file='./data/stab.dat',status='old')
|
|
open(59,file='./data/ptab.dat',status='old')
|
|
C
|
|
READ(58,*) YHEA,INDEX,R1,R2,T1,T2,T12,T22
|
|
|
|
DO JR = 1,INDEX
|
|
DO JQS=1,10
|
|
JL = 1 + (JQS-1)*10
|
|
JU = JL + 9
|
|
READ(58,130) (SL(JR,JQ),JQ=JL,JU)
|
|
130 FORMAT(10F8.5)
|
|
END DO
|
|
END DO
|
|
C
|
|
READ(59,*) YHEA,INDEX,R1,R2,T1,T2,T12,T22
|
|
DO JR=1,INDEX
|
|
DO JQP=1,10
|
|
JL = 1 + (JQP-1)*10
|
|
JU = JL + 9
|
|
READ(59,130) (PL(JR,JQ),JQ=JL,JU)
|
|
END DO
|
|
END DO
|
|
C
|
|
CLOSE(58)
|
|
CLOSE(59)
|
|
c
|
|
c Edge arrays
|
|
c
|
|
r = 1.5d0*10.d0**r1
|
|
tmin = 1.5d0*10.d0**t1
|
|
tmax = 0.9d0*10.d0**t2
|
|
redge = r
|
|
do i = 1, 100
|
|
t = t1 + (t2-t1)*dfloat(i-1)/dfloat(99)
|
|
t = 10.d0**t
|
|
t = min(tmax,max(t,tmin))
|
|
tedge(i) = t
|
|
rho=r
|
|
CALL PRSENT(RHO*1.1,T,P1,S1)
|
|
CALL PRSENT(RHO,T*1.1,P2,S2)
|
|
CALL PRSENT(RHO,T,P0,S0)
|
|
S1=RCON*S1
|
|
S2=RCON*S2
|
|
S0=RCON*S0
|
|
DPDR=(P1-P0)/(.1*RHO)
|
|
DPDT=(P2-P0)/(.1*T)
|
|
DSDT=(S2-S0)/(.1*T)
|
|
DSDR=(S1-S0)/(.1*RHO)
|
|
DEN=DPDR*DSDT-DPDT*DSDR
|
|
P=P0
|
|
S=S0/RCON
|
|
CV=T*DSDT
|
|
CP=T*DEN/DPDR
|
|
DQ=DSDT*P/(DEN*RHO)
|
|
GAMMA=1.d0/DQ
|
|
c
|
|
pedge(i) = p
|
|
sedge(i) = s
|
|
cvedge(i) = cv
|
|
cpedge(i) = cp
|
|
gammaedge(i) = gamma
|
|
write(44,45) i,tedge(i),cvedge(i),cpedge(i),sedge(i),
|
|
& gammaedge(i)
|
|
45 format(i4,5e14.5)
|
|
enddo
|
|
c
|
|
RETURN
|
|
END
|
|
c
|
|
C
|
|
C
|
|
C ***************************************************************
|
|
C
|
|
C
|
|
FUNCTION RHOEOS(T,P)
|
|
C ====================
|
|
C
|
|
C equation of state - determining density from
|
|
C temperature and pressure
|
|
C
|
|
C Input: T - temperature (K)
|
|
C P - total pressure (cgs)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
parameter(wmol0=1.67333E-24/2.3)
|
|
data inirea /0/
|
|
C
|
|
C initialize EOS tables
|
|
C
|
|
if(inirea.eq.0) then
|
|
call settrm
|
|
inirea=1
|
|
end if
|
|
C
|
|
AN=P/BOLK/T
|
|
RHO=AN*wmol0
|
|
C
|
|
niteos=0
|
|
10 niteos=niteos+1
|
|
CALL PRSENT(RHO,T,P0,S0)
|
|
CALL PRSENT(RHO*1.01,T,P1,S1)
|
|
DPDR=(P1-P0)/(.01*RHO)
|
|
DRXX=(P-P0)/DPDR/rho
|
|
if(drxx.lt.-0.9) drxx=-0.9
|
|
rho=rho*(un+drxx)
|
|
IF(ABS(DRXX).GT.1.d-5.and.niteos.lt.20) GO TO 10
|
|
C
|
|
rhoeos=rho
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE SETDRT
|
|
C =================
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
COMMON/RHODER/DRHODT(MDEPTH)
|
|
PARAMETER(DDTMIN=0., DDTPLU=0.001)
|
|
C
|
|
DO ID=1,ND
|
|
T=TEMP(ID)
|
|
P=PTOTAL(ID)
|
|
RHO1=RHOEOS(T*(UN-DDTMIN),P)
|
|
RHO2=RHOEOS(T*(UN+DDTPLU),P)
|
|
DRHODT(ID)=(RHO2-RHO1)/T/(DDTMIN+DDTPLU)
|
|
END DO
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
|
|
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
|
|
|
|
C
|
|
C
|
|
C ***************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE PRSENT(R,T,FP,FS)
|
|
C ============================
|
|
C
|
|
C interpolates pressure and entropy from tables
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
COMMON/THERM/SL(330,100),PL(330,100)
|
|
COMMON/TABLTD/R1,R2,T1,T2,T12,T22,INDEX
|
|
common/tdedge/redge,pedge(100),sedge(100),cvedge(100),
|
|
& cpedge(100),gammaedge(100),tedge(100)
|
|
common/tdflag/JON
|
|
C
|
|
JON=0
|
|
RL = DLOG10(R)
|
|
ALPHA=T1+(RL-R1)/(R2-R1)*(T12-T1)
|
|
BETA=T2-T1+((T22-T12)-(T2-T1))*(RL-R1)/(R2-R1)
|
|
QL = (DLOG10(T) - ALPHA)/BETA
|
|
DELTA=(RL-R1)/(R2-R1)*FLOAT(INDEX-1)
|
|
JR = 1 + IDINT(DELTA)
|
|
JQ = 1 + IDINT(99.*QL)
|
|
IF(JR.LT.2) GO TO 300
|
|
IF(JR.GT.(INDEX-1)) GO TO 300
|
|
IF(JQ.LT.2) GO TO 300
|
|
IF(JQ.GT.99) GO TO 300
|
|
P = DELTA - (JR-1)
|
|
Q = 99.*QL - (JQ-1)
|
|
C interpolate:
|
|
FS = 0.5D0*Q*(Q-1.D0)*SL(JR,JQ-1)
|
|
1 + 0.5D0*P*(P-1.D0)*SL(JR-1,JQ)
|
|
2 + (1.D0+P*Q-P*P-Q*Q)*SL(JR,JQ)
|
|
3 + 0.5D0*P*(P-2.D0*Q+1.D0)*SL(JR+1,JQ)
|
|
4 + 0.5D0*Q*(Q-2.D0*P+1.D0)*SL(JR,JQ+1)
|
|
5 + P*Q*SL(JR+1,JQ+1)
|
|
FS = 10.D0**FS
|
|
C
|
|
FP = 0.5D0*Q*(Q-1.D0)*PL(JR,JQ-1)
|
|
1 + 0.5D0*P*(P-1.D0)*PL(JR-1,JQ)
|
|
2 + (1.D0+P*Q-P*P-Q*Q)*PL(JR,JQ)
|
|
3 + 0.5D0*P*(P-2.D0*Q+1.D0)*PL(JR+1,JQ)
|
|
4 + 0.5D0*Q*(Q-2.D0*P+1.D0)*PL(JR,JQ+1)
|
|
5 + P*Q*PL(JR+1,JQ+1)
|
|
FP = 10.D0**FP
|
|
RETURN
|
|
C
|
|
C off the table
|
|
C
|
|
300 CONTINUE
|
|
C
|
|
write(60,*) ' Off the table!'
|
|
C
|
|
JQ = min(98,max(JQ, 2))
|
|
JON = JQ
|
|
FP = pedge(JQ)*R*T/(redge*tedge(JQ))
|
|
FS = sedge(JQ) + 1.d0/(gammaedge(JQ)-1.d0)*
|
|
& dlog(FP/pedge(JQ)*(redge/R)**gammaedge(JQ))
|
|
write(60,*) JQ, R, T, FP, FS
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ***************************************************************
|
|
C
|
|
C
|
|
subroutine moleq(id,tt,an,aein,ane,energ,entt,wm,ipri)
|
|
c ======================================================
|
|
c
|
|
c calculation of the equilibrium state of atoms and molecules
|
|
c
|
|
c Input: id - depth point
|
|
c tt - temperature [K]
|
|
c an - total particle number density
|
|
c aein - initial estimate of the electron density
|
|
c
|
|
c Output: 1) parameters transported through formal parameters"
|
|
C ane - electron density
|
|
c entt - entropy
|
|
c energ - internal energy
|
|
c 2) parameters transported through COMMON blocks
|
|
c ELEC(ID) - electron denity
|
|
c DENS(ID) - mass density
|
|
c WMM(ID) - mean molecular weight
|
|
c QADD(ID) - total charge of non-explicit species
|
|
c ABUND(I,ID) - abundances of explicit atoms,
|
|
c counting only atoms and ions
|
|
c (not atoms sequestered in molecules)
|
|
c
|
|
c Input data for molecules given in file tsuji.molec
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
c
|
|
character*128 MOLEC
|
|
COMMON/COMFH1/C(600,5),PPMOL(600),APMLOG(600),
|
|
* XIP(100),XIP2(100),CCOMP(100),UIIDUI(100),
|
|
* P(100),FP(100),XKP(100),XK2(100),EPS,SWITER,
|
|
* NELEM(5,600),NATO(5,600),MMAX(600),
|
|
* NELEMX(100),NMETAL,NMOLEC,NIMAX
|
|
common/eospar/anmol(600,mdepth),
|
|
* anato(100,mdepth),
|
|
* anion(100,mdepth)
|
|
common/ioniz2/anion2(30,mdepth)
|
|
common/entrop/entato(100),ention(100),entmol(600)
|
|
common/hmolab/anh2(mdepth),anhm(mdepth)
|
|
common/terden/rhoter,anta,entrp
|
|
common/adchar/qadd(mdepth)
|
|
common/moldat/moltab,irwtab
|
|
DIMENSION NATOMM(5),NELEMM(5),
|
|
* emass(100),uelem(100),ull(100),anden(800),
|
|
* aelem(100),ammol(600),cmol(600)
|
|
dimension anat0(100),anio0(100),anmo0(600),pfmol(600)
|
|
dimension denso(mdepth),eleco(mdepth),wmmo(mdepth)
|
|
c
|
|
data nmetal/92/
|
|
c
|
|
data iread/1/
|
|
c
|
|
if(ifmol.eq.0) return
|
|
MOLEC ='data/tsuji.molec_bc2'
|
|
if(moltab.eq.0) MOLEC='data/tsuji.molec_orig'
|
|
c
|
|
ECONST=4.342945E-1
|
|
tk=1./(tt*bolk)
|
|
pgas=an/tk
|
|
sahcon=1.87840e20*tt*sqrt(tt)
|
|
ev2erg=1.6018e-12
|
|
nimax=3000
|
|
eps=0.001
|
|
switer=1
|
|
C
|
|
if(iread.eq.1) then
|
|
c
|
|
C---- data for atoms ----------------
|
|
C
|
|
do i=1,nmetal
|
|
ia=i
|
|
nelemx(i)=ia
|
|
ccomp(ia)=abndd(ia,id)
|
|
xip(ia)=enev(ia,1)
|
|
xip2(ia)=enev(ia,2)
|
|
emass(ia)=amas(ia)
|
|
end do
|
|
c
|
|
c---- read molecular data from tsuji.molec ----------------------
|
|
c
|
|
J=0
|
|
OPEN(UNIT=26,FILE=MOLEC,STATUS='OLD')
|
|
10 J=J+1
|
|
READ(26,510,END=20) CMOL(J),(C(J,K),K=1,5),MMAX(J),
|
|
* (NELEMM(M),NATOMM(M),M=1,4)
|
|
510 FORMAT(A8,5E13.5,9I3)
|
|
c
|
|
c for now, exclude all molecules with 4 or more C atoms
|
|
c
|
|
do m=1,4
|
|
if(nelemm(m).eq.6.and.natomm(m).ge.5) then
|
|
j=j-1
|
|
go to 10
|
|
end if
|
|
end do
|
|
|
|
MMAXJ=MMAX(J)
|
|
IF(MMAXJ.GT.0) THEN
|
|
DO M=1,MMAXJ
|
|
NELEM(M,J)=NELEMM(M)
|
|
NATO(M,J)=NATOMM(M)
|
|
END DO
|
|
GO TO 10
|
|
END IF
|
|
20 CONTINUE
|
|
NMOLEC=J-1
|
|
close(26)
|
|
c
|
|
DO I=1,NMETAL
|
|
NELEMI=NELEMX(I)
|
|
P(NELEMI)=1.D-70
|
|
END DO
|
|
iread=0
|
|
end if
|
|
c
|
|
c---- end of reading atomic and molecular data ----------------------
|
|
c
|
|
p(99)= aein/tk
|
|
pesave=p(99)
|
|
p(99)=pesave
|
|
c
|
|
THET=5040./tt
|
|
TEM=tt
|
|
PGLOG=log10(Pgas)
|
|
PG=Pgas
|
|
tkln25=-log(tk)*2.5
|
|
tkln15=log(bolk*tt)*1.5
|
|
tkev=5040./tt
|
|
c
|
|
CALL RUSSEL(TEM,PG)
|
|
c
|
|
PE=P(99)
|
|
ane=pe*tk
|
|
PELOG=log10(PE)
|
|
emass(99)=5.486e-4
|
|
uelem(99)=2.
|
|
aelem(99)=pe*tk/(2.*sahcon*emass(nelemi)**1.5)
|
|
ull(99)=log10(aelem(99))
|
|
idstd=nd*2/3
|
|
entcon=103.973
|
|
ann=an-ane
|
|
tkk=bolk*tt*tt
|
|
c
|
|
c----atoms-----------------------------------------------------------------
|
|
c
|
|
entt=0
|
|
antt=0.
|
|
energ=0.
|
|
tmass=0.
|
|
DO I=1,NMETAL
|
|
NELEMI=NELEMX(I)
|
|
FPLOG=log10(FP(NELEMI))
|
|
anden(i)=(p(nelemi)+1.d-70)*tk
|
|
tmass=tmass+anden(i)*emass(nelemi)
|
|
call mpartf(nelemi,1,0,tt,u0,dulog)
|
|
uelem(nelemi)=u0
|
|
aelem(nelemi)=anden(i)/(u0*sahcon*emass(nelemi)**1.5)
|
|
ull(nelemi)=log10(aelem(nelemi))
|
|
anat0(nelemi)=anden(i)
|
|
if(dulog.lt.0.) dulog=0.
|
|
entato(nelemi)=tkln15-log(anden(i))+log(u0)+
|
|
* 1.5*log(emass(nelemi))+entcon+tkk*dulog
|
|
anx=anden(i)/ann
|
|
antt=antt+anx
|
|
entt=entt+entato(nelemi)*anden(i)
|
|
energ=energ+dulog/tk*anden(i)
|
|
END DO
|
|
an1=anden(1)
|
|
c
|
|
c---- positive ions ---------------------------------------------------------
|
|
c
|
|
DO I=1,NMETAL
|
|
NELEMI=NELEMX(I)
|
|
PLOG= log10(P(NELEMI)+1.0D-70)
|
|
XKPLOG=log10(XKP(NELEMI)+1.0D-70)
|
|
PIONL=PLOG+XKPLOG-PELOG
|
|
anden(i+nmetal)=exp(pionl/econst)*tk
|
|
tmass=tmass+anden(i+nmetal)*emass(nelemi)
|
|
call mpartf(nelemi,2,0,tt,u1,dulog)
|
|
if(dulog.lt.0.) dulog=0.
|
|
anio0(nelemi)=anden(i+nmetal)
|
|
ention(nelemi)=tkln15-log(anden(i+nmetal))+log(u1)+
|
|
* 1.5*log(emass(nelemi))+entcon+tkk*dulog
|
|
anx=anio0(nelemi)/ann
|
|
antt=antt+anx
|
|
entt=entt+ention(nelemi)*anio0(nelemi)
|
|
energ=energ+(xip(nelemi)*1.6018e-12+
|
|
* dulog/tk)*anio0(nelemi)
|
|
if(nelemi.ge.2.and.nelemi.le.30) then
|
|
x2log=log10(XK2(NELEMI)+1.0D-70)
|
|
pion2=pionl+x2log-pelog
|
|
anion2(nelemi,id)=exp(pion2/econst)*tk
|
|
end if
|
|
END DO
|
|
c
|
|
c H- (incorrect in the original Tsuji's table)
|
|
c
|
|
jbeg=1
|
|
if(moltab.eq.0) then
|
|
j=1
|
|
anmo0(1)=1.0353e-16/tt/sqrt(tt)*exp(8762.9/tt)*
|
|
* anat0(1)*ane
|
|
ammol(1)=emass(1)
|
|
pfmol(1)=1.
|
|
entmol(1)=tkln15-log(anmo0(1))+1.5*log(emass(1))+entcon
|
|
anx=anmo0(1)/ann
|
|
antt=antt+anx
|
|
entt=entt+entmol(j)*anmo0(1)
|
|
tmass=tmass+emass(1)*anmo0(1)
|
|
jbeg=2
|
|
end if
|
|
c
|
|
c---- molecules-------------------------------------------------------------
|
|
c
|
|
DO J=jbeg,NMOLEC
|
|
jm=j+2*nmetal
|
|
PMOLL=log10(PPMOL(J)+1.0D-70)
|
|
anden(jm)=exp(pmoll/econst)*tk
|
|
if(pmoll.lt.-20.) go to 100
|
|
umoll=log10(anden(jm))+c(j,2)*thet
|
|
amasm=0.
|
|
do jjj=1,mmax(j)
|
|
i=nelem(jjj,j)
|
|
amasm=amasm+NATO(jjj,j)*emass(i)
|
|
umoll=umoll-NATO(jjj,j)*ull(i)
|
|
end do
|
|
ammol(j)=amasm
|
|
tmass=tmass+anden(jm)*amasm
|
|
umoll=exp(umoll/econst)/(sahcon*amasm**1.5)
|
|
c
|
|
c replace with Irwin data whenever available
|
|
c
|
|
call mpartf(0,0,j,tt,um,dulog)
|
|
if(um.gt.0.) umoll=um
|
|
if(umoll.lt.1.) umoll=1.
|
|
c
|
|
anmo0(j)=anden(jm)
|
|
pfmol(j)=umoll
|
|
if(dulog.lt.0.) dulog=0.
|
|
entmol(j)=tkln15-log(anden(jm))+log(umoll)+
|
|
* 1.5*log(amasm)+entcon+tkk*dulog
|
|
anx=anden(jm)/ann
|
|
antt=antt+anx
|
|
entt=entt+entmol(j)*anden(jm)
|
|
energ=energ+dulog/tk*anden(jm)
|
|
if(j.eq.2) energ=energ-4.476*ev2erg*anden(jm)
|
|
c if(ipri.gt.0.and.ipmole.gt.0.and.mod(id,10).eq.1.and.j.le.10)
|
|
c * write(80,680) id,j,anmo0(j),anx,antt,pfmol(j),
|
|
c * entmol(j),entt,dulog,dulog/tk*anden(jm),energ
|
|
100 continue
|
|
END DO
|
|
c
|
|
c electrons
|
|
c
|
|
entel=tkln15-log(ane)+1.5*log(emass(99))+entcon
|
|
entt=entt+entel*ane
|
|
antt=antt+ane/ann
|
|
c
|
|
c final entropy, density, and mean mnolecular weight
|
|
c
|
|
entt=entt*bolk
|
|
rhoter=tmass*hmass
|
|
ahtot=anat0(1)+anio0(1)+anmo0(1)+2.*anmo0(2)
|
|
wm=tmass/antt/ann
|
|
c
|
|
if(ipri.eq.0) return
|
|
c
|
|
do i=1,nmetal
|
|
j=nelemx(i)
|
|
anato(j,id)=anat0(j)
|
|
anion(j,id)=anio0(j)
|
|
end do
|
|
c
|
|
do j=1,nmolec
|
|
anmol(j,id)=anmo0(j)
|
|
end do
|
|
c
|
|
anhm(id)=anmol(1,id)
|
|
anh2(id)=anmol(2,id)
|
|
C
|
|
C save new density, molecular weight, and abundances of
|
|
c atomic species
|
|
c
|
|
denso(id)=dens(id)
|
|
eleco(id)=elec(id)
|
|
wmmo(id)=wmm(id)
|
|
dens(id)=tmass*hmass
|
|
elec(id)=ane
|
|
wmm(id)=dens(id)/(an-elec(id))
|
|
qadd(id)=0.
|
|
do i=1,nmetal
|
|
NELEMI=NELEMX(I)
|
|
ia=iatex(nelemi)
|
|
if(ia.gt.0) then
|
|
abund(ia,id)=(anato(nelemi,id)+anion(nelemi,id))*
|
|
* wmm(id)/dens(id)*ytot(id)
|
|
else
|
|
qadd(id)=qadd(id)+anion(nelemi,id)
|
|
end if
|
|
end do
|
|
if(ielhm.eq.0) qadd(id)=qadd(id)-anhm(id)
|
|
c
|
|
if(ipri.eq.0) return
|
|
c
|
|
c don't change structure if particle conservation in not solved
|
|
c
|
|
c IF(INPC.eq.0.and.ifryb.eq.0) THEN
|
|
IF(INPC.eq.0) THEN
|
|
dens(id)=denso(id)
|
|
elec(id)=eleco(id)
|
|
wmm(id)=wmmo(id)
|
|
ENDIF
|
|
c
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C *************************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE RUSSEL(TEM,PG)
|
|
c =========================
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
COMMON/COMFH1/C(600,5),PPMOL(600),APMLOG(600),
|
|
* XIP(100),XIP2(100),CCOMP(100),UIIDUI(100),
|
|
* P(100),FP(100),XKP(100),XK2(100),EPS,SWITER,
|
|
* NELEM(5,600),NATO(5,600),MMAX(600),
|
|
* NELEMX(100),NMETAL,NMOLEC,NIMAX
|
|
DIMENSION FX(100),DFX(100),Z(100),PREV(100),WA(100),
|
|
* UIIDU2(100)
|
|
C
|
|
C ECONST=4.342945E-1
|
|
ECONST=4.3426E-1
|
|
XKCON=6.667343E-1
|
|
EPSDIE=5.0E-5
|
|
T=5040.4/TEM
|
|
PGLOG=log10(PG)
|
|
tk=1./(tem*1.38054e-16)
|
|
C
|
|
C HEH=helium/hydrogen ratio by number
|
|
C
|
|
c HEH=CCOMP(2)/CCOMP(1)
|
|
HEH=YTOT(1)-UN
|
|
C
|
|
C evaluation of log XKP(MOL)
|
|
C
|
|
DO J=1,NMOLEC
|
|
APLOGJ=C(J,5)
|
|
DO K=1,4
|
|
KM5=5-K
|
|
APLOGJ=APLOGJ*T + C(J,KM5)
|
|
END DO
|
|
APMLOG(J)=APLOGJ
|
|
END DO
|
|
apmlog(1)=-log10(1.0353e-16/tem/sqrt(tem)*tk*exp(8762.9/tem))
|
|
DHH=(((0.1196952E-02*T-0.2125713E-01)*T+0.1545253E+00)*T
|
|
* -0.5161452E+01)*T+0.1277356E+02
|
|
DHH=EXP(DHH/ECONST)
|
|
C
|
|
C evaluation of the ionization constants
|
|
C
|
|
TEM25=TEM**2*SQRT(TEM)
|
|
DO I=1,NMETAL
|
|
NELEMI = NELEMX(I)
|
|
*
|
|
* calculation of the partition functions following Irwin (1981)
|
|
C
|
|
call mpartf(nelemi,1,0,tem,g0,dulog)
|
|
call mpartf(nelemi,2,0,tem,g1,dulog)
|
|
call mpartf(nelemi,3,0,tem,g2,dulog)
|
|
uiidui(nelemi)=g1/g0*xkcon
|
|
uiidu2(nelemi)=g2/g1*xkcon
|
|
uiidui(nelemi)=g1/g0*xkcon
|
|
XKP(NELEMI)=UIIDUI(NELEMI)*TEM25*
|
|
* EXP(-XIP(NELEMI)*T/ECONST)
|
|
XK2(NELEMI)=UIIDU2(NELEMI)*TEM25*
|
|
* EXP(-XIP2(NELEMI)*T/ECONST)
|
|
xk2(nelemi)=max(xk2(nelemi),1.d-70)
|
|
END DO
|
|
XK2(1)=0.
|
|
C
|
|
C preliminary value of PH at high temperatures
|
|
C
|
|
HKP=XKP(1)
|
|
IF(T.LT.0.6) THEN
|
|
PPH=SQRT(HKP*(PG/(1.0+HEH)+HKP))-HKP
|
|
PH=PPH**2/HKP
|
|
ELSE
|
|
IF(PG/DHH.LE.0.1) THEN
|
|
PH=PG/(1.0+HEH)
|
|
ELSE
|
|
PH=0.5 * (SQRT(DHH*(DHH+4.0 *PG/(1.0+HEH)))-DHH)
|
|
END IF
|
|
END IF
|
|
C
|
|
C evaluation of the fictitious pressures of hydrogen
|
|
C PG=PH+PHH+2.0*PPH+HEH*(PH+2.0*PHH+PPH)
|
|
C
|
|
U=(1.0+2.0*HEH)/DHH
|
|
Q=1.0+HEH
|
|
R=(2.0+HEH)*SQRT(HKP)
|
|
S=-1.0*PG
|
|
X=SQRT(PH)
|
|
C
|
|
C Russell iterations
|
|
C
|
|
ITERAT=0
|
|
10 CONTINUE
|
|
F=((U*X**2+Q)*X+R)*X+S
|
|
DF=2.0*(2.0*U*X**2+Q)*X+R
|
|
XR=X-F/DF
|
|
C
|
|
IF(ABS((X-XR)/XR).GT.EPSDIE) THEN
|
|
ITERAT=ITERAT+1
|
|
IF(ITERAT.GT.50) THEN
|
|
WRITE(6,710) TEM,PG,X,XR,PH
|
|
710 FORMAT(1H1, ' NOT CONVERGE IN RUSSEL '/// 'TEM=',F9.2,5X,'PG=',
|
|
* E12.5,5X,'X1=',E12.5,5X,'X2=',E12.5,5X,'PH=',E12.5/////)
|
|
ELSE
|
|
X=XR
|
|
GO TO 10
|
|
END IF
|
|
END IF
|
|
PH=XR**2
|
|
PHH=PH**2/DHH
|
|
PPH=SQRT(HKP*PH)
|
|
FPH=PH+2.0*PHH+PPH
|
|
P(100)=PPH
|
|
C
|
|
C evaluation of the fictitious pressure of each element
|
|
C
|
|
DO I=1,NMETAL
|
|
NELEMI=NELEMX(I)
|
|
FP(NELEMI)=CCOMP(NELEMI)*FPH
|
|
END DO
|
|
C
|
|
C check of initialization
|
|
C
|
|
PE=P(99)
|
|
C
|
|
C Russell equations
|
|
C
|
|
NITERR = 0
|
|
20 CONTINUE
|
|
DO I=1,NMETAL
|
|
NELEMI=NELEMX(I)
|
|
c FX(NELEMI)=-FP(NELEMI)+P(NELEMI)*(1.0+XKP(NELEMI)/PE)
|
|
c DFX(NELEMI)=1.0+XKP(NELEMI)/PE
|
|
DFX(NELEMI)=1.0+XKP(NELEMI)/PE*(1.0+XK2(NELEMI)/PE)
|
|
FX(NELEMI)=-FP(NELEMI)+P(NELEMI)*DFX(NELEMI)
|
|
END DO
|
|
C
|
|
SPNION=0.0
|
|
spnplu=0.
|
|
DO J=1,NMOLEC
|
|
MMAXJ=MMAX(J)
|
|
PMOLJL=-APMLOG(J)
|
|
DO M=1,MMAXJ
|
|
NELEMJ=NELEM(M,J)
|
|
NATOMJ=NATO(M,J)
|
|
PMOLJL=PMOLJL+DFLOAT(NATOMJ)*log10(P(NELEMJ))
|
|
END DO
|
|
C
|
|
PMOLJ=EXP(PMOLJL/ECONST)
|
|
DO M=1,MMAXJ
|
|
NELEMJ=NELEM(M,J)
|
|
NATOMJ=NATO(M,J)
|
|
ATOMJ=DFLOAT(NATOMJ)
|
|
IF(NELEMJ.EQ.99) then
|
|
if(natomj.ge.0) then
|
|
SPNION=SPNION+PMOLJ*NATOMJ
|
|
else
|
|
SPNPLU=SPNPLU-PMOLJ*NATOMJ
|
|
end if
|
|
end if
|
|
DO I=1,NMETAL
|
|
NELEMI=NELEMX(I)
|
|
IF(NELEMJ.EQ.NELEMI) THEN
|
|
FX(NELEMI)=FX(NELEMI)+ATOMJ*PMOLJ
|
|
DFX(NELEMI)=DFX(NELEMI)+ATOMJ**2*
|
|
* PMOLJ/P(NELEMI)
|
|
END IF
|
|
END DO
|
|
END DO
|
|
PPMOL(J)=PMOLJ
|
|
END DO
|
|
C
|
|
C solution of the Russell equations by Newton-Raphson method
|
|
C
|
|
DO I=1,NMETAL
|
|
NELEMI=NELEMX(I)
|
|
WA(I)=log10(P(NELEMI)+1.0D-70)
|
|
END DO
|
|
IMAXP1=NMETAL+1
|
|
WA(IMAXP1)=log10(PE+1.0D-70)
|
|
DELTRS = 0.0
|
|
DO I=1,NMETAL
|
|
NELEMI=NELEMX(I)
|
|
PREV(NELEMI)=P(NELEMI)-FX(NELEMI)/DFX(NELEMI)
|
|
PREV(NELEMI)=ABS(PREV(NELEMI))
|
|
IF(PREV(NELEMI).LT.1.0D-70) PREV(NELEMI)=1.0D-70
|
|
Z(NELEMI)=PREV(NELEMI)/P(NELEMI)
|
|
DELTRS=DELTRS+ABS(Z(NELEMI)-1.0)
|
|
IF(SWITER.GT.0.0) THEN
|
|
P(NELEMI)=(PREV(NELEMI)+P(NELEMI))*0.5
|
|
ELSE
|
|
P(NELEMI)=PREV(NELEMI)
|
|
END IF
|
|
END DO
|
|
C
|
|
C ionization equilibrium
|
|
C
|
|
PEREV =0.0
|
|
DO I=1,NMETAL
|
|
NELEMI = NELEMX(I)
|
|
PEREV=PEREV+XKP(NELEMI)*P(NELEMI)*(1.+xk2(nelemi)/pe)
|
|
END DO
|
|
C
|
|
PEREV=SQRT(PEREV/(1.0+SPNION/PE))
|
|
DELTRS=DELTRS+ABS((PE-PEREV)/PE)
|
|
PE=(PEREV+PE)*0.5
|
|
P(99)=PE
|
|
IF(DELTRS.GT.EPS) THEN
|
|
NITERR=NITERR+1
|
|
IF(NITERR.LE.NIMAX) THEN
|
|
GO TO 20
|
|
ELSE
|
|
WRITE(6,605) NIMAX
|
|
END IF
|
|
END IF
|
|
605 FORMAT(1H0,'*DOES NOT CONVERGE AFTER ',I4,' ITERATIONS')
|
|
C
|
|
RETURN
|
|
END
|
|
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
c
|
|
subroutine mpartf(jatom,ion,indmol,t,u,dulog)
|
|
c =============================================
|
|
c
|
|
c yields partition functions with polynomial data from
|
|
c ref. Irwin, A.W., 1981, ApJ Suppl. 45, 621.
|
|
c ln u(temp)=sum(a(i)*(ln(temp))**(i-1)) 1<=a<=6
|
|
c
|
|
c Input:
|
|
c jatom = element number in periodic table
|
|
c ion = 1 for neutral, 2 for once ionized and 3 for twice ionized
|
|
c indmol= index of a molecular specie (Tsuji index)
|
|
c temp = temperature
|
|
c Output:
|
|
c u = partf.(linear scale) for iat,ion, or indmol, and temperature t
|
|
c dulog = d ln(u)/d ln(T)
|
|
c
|
|
c
|
|
implicit real*8 (a-h,o-z)
|
|
common/moldat/moltab,irwtab
|
|
real*8 a(6,3,92),aa(6),am(6,600)
|
|
dimension indtsu(324),irw(600),igle(28)
|
|
save iread,a,am
|
|
DATA IGLE/2,1,2,1,6,9,4,9,6,1,2,1,6,9,4,9,6,1,
|
|
* 10,21,28,25,6,25,28,21,10,21/
|
|
C
|
|
data indtsu / 2, 5, 12, 4, 8, 7, 6,
|
|
* 9, 11, 10, 29, 50, 59, 46, 133, 52, 19,
|
|
* 13, 42, 38, 39, 37, 44, 36, 14, 118, 33,
|
|
* 3, 16, 57, 32, 49, 60, 54, 41, 107,304,
|
|
* 148, 152, 153, 155, 303, 17, 24, 25, 28, 51,
|
|
* 112, 119, 102, 0, 21, 15, 43, 22,478, 64,
|
|
* 47, 65, 414, 61, 191, 62 ,109, 40, 66,214,
|
|
* 120*0, 30, 136*0/
|
|
c
|
|
data iread /0/
|
|
c
|
|
c read data if first call:
|
|
c
|
|
if(iread.ne.1) then
|
|
if(irwtab.eq.0) then
|
|
open(67,file= './data/irwin_orig.dat',status='old')
|
|
nmoli=66
|
|
else
|
|
open(67,file= './data/irwin_bc.dat',status='old')
|
|
nmoli=324
|
|
end if
|
|
read(67,*)
|
|
read(67,*)
|
|
do j=1,92
|
|
do i=1,3
|
|
if(j.eq.1.and.i.eq.3) go to 10
|
|
sp=float(j)+float(i-1)/100.
|
|
read(67,*) spec,aa
|
|
do k=1,6
|
|
a(k,i,j)=aa(k)
|
|
end do
|
|
10 continue
|
|
end do
|
|
end do
|
|
c
|
|
read(67,*)
|
|
read(67,*)
|
|
read(67,*)
|
|
do i=1,600
|
|
irw(i)=0
|
|
end do
|
|
do i=1,nmoli
|
|
read(67,*) spec,aa
|
|
indm=indtsu(i)
|
|
if(indm.gt.0) then
|
|
irw(indm)=i
|
|
do j=1,6
|
|
am(j,indm)=aa(j)
|
|
end do
|
|
end if
|
|
end do
|
|
close(67)
|
|
iread=1
|
|
endif
|
|
c
|
|
c evaluation of the partition function
|
|
c stop if T is out of limits of Irwin's tables
|
|
c
|
|
u=1.
|
|
dulog=0.
|
|
if(t.lt.1000.) then
|
|
stop 'partf; temp<1000 K'
|
|
else if(t.gt.16000.) then
|
|
c stop 'partf; temp>16000 K'
|
|
c write(6,601) t
|
|
c 601 format(' warning! T = ',f12.1, 'larger than 16000.'/)
|
|
if(indmol.eq.0) then
|
|
if(jatom.le.28.and.ion.le.jatom) u=igle(jatom-ion+1)
|
|
end if
|
|
return
|
|
endif
|
|
tl=log(t)
|
|
u=0.
|
|
c
|
|
c atomic species
|
|
c
|
|
if(jatom.gt.0.and.ion.gt.0) then
|
|
ulog= a(1,ion,jatom)+
|
|
* tl*(a(2,ion,jatom)+
|
|
* tl*(a(3,ion,jatom)+
|
|
* tl*(a(4,ion,jatom)+
|
|
* tl*(a(5,ion,jatom)+
|
|
* tl*(a(6,ion,jatom))))))
|
|
if(jatom.eq.5.and.ion.eq.3) ulog=1.
|
|
u=exp(ulog)
|
|
dulog= a(2,ion,jatom)+
|
|
* tl*(a(3,ion,jatom)*2.+
|
|
* tl*(a(4,ion,jatom)*3.+
|
|
* tl*(a(5,ion,jatom)*4.+
|
|
* tl*(a(6,ion,jatom)*5.))))
|
|
end if
|
|
c
|
|
c molecular species
|
|
c
|
|
if(indmol.gt.0) then
|
|
indm=indmol
|
|
if(irw(indm).gt.0) then
|
|
ulog= am(1,indm)+
|
|
* tl*(am(2,indm)+
|
|
* tl*(am(3,indm)+
|
|
* tl*(am(4,indm)+
|
|
* tl*(am(5,indm)+
|
|
* tl*(am(6,indm))))))
|
|
u=exp(ulog)
|
|
dulog= am(2,indm)+
|
|
* tl*(am(3,indm)*2.+
|
|
* tl*(am(4,indm)*3.+
|
|
* tl*(am(5,indm)*4.+
|
|
* tl*(am(6,indm)*5.))))
|
|
end if
|
|
end if
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C *************************************************************************
|
|
C
|
|
C
|
|
subroutine tiopf(t,pf)
|
|
c ======================
|
|
c
|
|
c TiO partition function (data from Kurucz web site)
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
dimension pf0(800)
|
|
data pf0/
|
|
* 29.107, 55.425, 82.417, 111.190, 142.564, 176.916,
|
|
* 214.340, 254.774, 298.065, 344.021, 392.431, 443.089,
|
|
* 495.795, 550.365, 606.632, 664.449, 723.686, 784.230,
|
|
* 845.981, 908.862, 972.800, 1037.739, 1103.636, 1170.451,
|
|
* 1238.155, 1306.723, 1376.144, 1446.403, 1517.492, 1589.409,
|
|
* 1662.152, 1735.724, 1810.122, 1885.352, 1961.428, 2038.351,
|
|
* 2116.119, 2194.758, 2274.260, 2354.633, 2435.907, 2518.063,
|
|
* 2601.125, 2685.096, 2769.992, 2855.809, 2942.560, 3030.257,
|
|
* 3118.897, 3208.496, 3299.067, 3390.598, 3483.106, 3576.598,
|
|
* 3671.095, 3766.569, 3863.048, 3960.522, 4059.035, 4158.545,
|
|
* 4259.074, 4360.642, 4463.259, 4566.905, 4671.582, 4777.321,
|
|
* 4884.105, 4991.937, 5100.852, 5210.813, 5321.838, 5433.972,
|
|
* 5547.154, 5661.417, 5776.789, 5893.211, 6010.774, 6129.422,
|
|
* 6249.173, 6370.026, 6491.973, 6615.042, 6739.240, 6864.542,
|
|
* 6990.959, 7118.533, 7247.214, 7377.053, 7508.012, 7640.121,
|
|
* 7773.370, 7907.764, 8043.309, 8180.032, 8317.835, 8456.861,
|
|
* 8597.055, 8738.396, 8880.926, 9024.672, 9169.570, 9315.610,
|
|
* 9462.927, 9611.339, 9760.963, 9911.798, 10063.900, 10217.148,
|
|
* 10371.572, 10527.253, 10684.109, 10842.173, 11001.469, 11161.970,
|
|
* 11323.751, 11486.758, 11650.978, 11816.415, 11983.159, 12151.134,
|
|
* 12320.243, 12490.668, 12662.333, 12835.234, 13009.470, 13184.926,
|
|
* 13361.601, 13539.660, 13718.891, 13899.456, 14081.252, 14264.326,
|
|
* 14448.643, 14634.341, 14821.225, 15009.476, 15199.021, 15389.829,
|
|
* 15581.955, 15775.377, 15970.188, 16166.239, 16363.513, 16562.006,
|
|
* 16761.930, 16963.301, 17165.906, 17369.881, 17575.236, 17781.814,
|
|
* 17989.816, 18198.996, 18409.707, 18621.680, 18835.068, 19049.715,
|
|
* 19265.768, 19483.375, 19702.006, 19922.209, 20143.668, 20366.555,
|
|
* 20590.742, 20816.402, 21043.338, 21271.672, 21501.369, 21732.563,
|
|
* 21965.119, 22199.068, 22434.432, 22671.266, 22909.307, 23148.898,
|
|
* 23389.893, 23632.322, 23875.969, 24121.160, 24367.707, 24615.848,
|
|
* 24865.471, 25116.320, 25368.604, 25622.342, 25877.512, 26134.055,
|
|
* 26392.404, 26651.764, 26912.826, 27175.250, 27439.197, 27704.539,
|
|
* 27971.287, 28239.572, 28509.373, 28780.707, 29053.516, 29327.602,
|
|
* 29603.338, 29880.539, 30159.105, 30439.322, 30721.055, 31004.254,
|
|
* 31288.818, 31575.061, 31862.693, 32151.781, 32442.586, 32734.619,
|
|
* 33027.777, 33323.023, 33619.535, 33917.707, 34217.711, 34518.996,
|
|
* 34821.676, 35126.195, 35432.141, 35739.602, 36048.926, 36359.488,
|
|
* 36672.023, 36985.633, 37300.863, 37617.965, 37936.469, 38256.309,
|
|
* 38578.074, 38901.668, 39226.461, 39552.969, 39880.852, 40210.785,
|
|
* 40541.852, 40874.691, 41209.359, 41545.535, 41883.602, 42222.715,
|
|
* 42563.895, 42906.508, 43250.656, 43596.902, 43944.355, 44293.695,
|
|
* 44644.504, 44997.621, 45351.590, 45707.242, 46065.008, 46424.367,
|
|
* 46785.605, 47148.023, 47512.496, 47878.418, 48246.426, 48615.895,
|
|
* 48987.336, 49360.082, 49734.758, 50111.004, 50489.383, 50868.996,
|
|
* 51250.250, 51633.691, 52018.945, 52405.715, 52794.090, 53184.340,
|
|
* 53576.375, 53970.605, 54366.176, 54763.148, 55162.430, 55563.215,
|
|
* 55966.391, 56371.000, 56777.176, 57185.570, 57596.074, 58007.617,
|
|
* 58421.418, 58837.172, 59254.539, 59673.418, 60094.066, 60517.410,
|
|
* 60941.844, 61368.660, 61797.395, 62227.590, 62659.789, 63094.238,
|
|
* 63529.695, 63967.488, 64407.887, 64849.496, 65292.867, 65735.922,
|
|
* 66182.000, 66631.266, 67082.055, 67534.391, 67988.992, 68446.117,
|
|
* 68904.789, 69365.180, 69827.914, 70292.781, 70759.352, 71228.500,
|
|
* 71699.375, 72171.672, 72647.086, 73123.984, 73603.023, 74083.516,
|
|
* 74566.359, 75050.555, 75537.758, 76027.258, 76518.125, 77012.008,
|
|
* 77507.063, 78003.813, 78503.977, 79006.125, 79509.320, 80015.375,
|
|
* 80522.461, 81031.938, 81544.164, 82058.313, 82574.352, 83093.914,
|
|
* 83614.367, 84136.820, 84662.211, 85188.867, 85719.375, 86249.977,
|
|
* 86783.781, 87319.219, 87857.180, 88396.797, 88939.805, 89484.266,
|
|
* 90032.023, 90580.930, 91132.563, 91686.148, 92242.742, 92799.406,
|
|
* 93360.016, 93923.453, 94488.313, 95055.211, 95625.297, 96197.477,
|
|
* 96771.531, 97348.156, 97926.922, 98507.453, 99091.563, 99677.938,
|
|
*100267.234,100856.438,101449.828,102045.750,102643.094,103244.117,
|
|
*103846.969,104450.313,105057.641,105667.188,106279.516,106894.937,
|
|
*107512.789,108133.117,108754.758,109377.687,110005.039,110634.602,
|
|
*111266.141,111902.133,112537.984,113178.891,113819.766,114464.312,
|
|
*115110.969,115760.687,116412.469,117068.055,117724.547,118384.383,
|
|
*119047.469,119712.469,120380.187,121051.336,121724.102,122399.250,
|
|
*123076.266,123756.977,124441.195,125126.406,125816.453,126506.766,
|
|
*127202.367,127899.086,128598.266,129299.969,130004.969,130712.016,
|
|
*131409.266,132117.719,132828.969,133544.016,134262.750,134986.344,
|
|
*135712.891,136439.937,137170.969,137905.562,138641.578,139380.266,
|
|
*140122.937,140868.641,141615.484,142366.703,143123.078,143880.000,
|
|
*144638.484,145401.594,146168.125,146935.359,147707.484,148482.641,
|
|
*149256.578,150037.281,150821.953,151606.750,152396.094,153188.766,
|
|
*153983.391,154782.141,155582.203,156387.234,157192.719,158003.156,
|
|
*158815.125,159632.437,160450.766,161274.750,162098.172,162926.000,
|
|
*163756.609,164593.141,165430.859,166270.937,167114.750,167960.797,
|
|
*168811.562,169663.906,170517.203,171376.531,172239.469,173105.891,
|
|
*173975.250,174847.203,175721.453,176597.250,177480.984,178366.094,
|
|
*179253.828,180145.734,181038.000,181936.031,182837.969,183739.922,
|
|
*184645.937,185558.281,186470.844,187387.422,188307.234,189232.281,
|
|
*190156.000,191088.234,192022.062,192957.250,193899.328,194842.984,
|
|
*195788.391,196736.156,197687.828,198645.719,199603.422,200569.234,
|
|
*201536.437,202508.641,203481.000,204459.016,205438.750,206424.312,
|
|
*207409.953,208398.734,209393.234,210391.047,211390.984,212395.516,
|
|
*213401.547,214420.141,215431.812,216453.453,217476.734,218501.266,
|
|
*219530.219,220560.719,221597.891,222637.875,223677.750,224725.500,
|
|
*225777.406,226829.297,227893.125,228954.547,230020.969,231086.453,
|
|
*232157.469,233233.047,234315.406,235395.625,236480.953,237572.125,
|
|
*238666.484,239765.125,240863.281,241969.750,243079.250,244191.719,
|
|
*245304.812,246427.937,247548.234,248673.562,249804.984,250942.781,
|
|
*252078.953,253222.812,254369.641,255519.359,256671.406,257827.906,
|
|
*258988.859,260154.734,261322.281,262458.781,263606.437,264770.625,
|
|
*265947.750,267125.156,268314.125,269507.687,270702.344,271905.156,
|
|
*273110.156,274318.937,275531.687,276751.344,277970.781,279198.531,
|
|
*280425.750,281663.250,282897.469,284138.906,285383.594,286637.031,
|
|
*287891.156,289147.625,290413.312,291678.719,292946.031,294225.875,
|
|
*295501.344,296782.656,298070.094,299363.875,300652.250,301953.750,
|
|
*303260.062,304563.781,305874.375,307191.437,308517.031,309835.750,
|
|
*311159.375,312490.937,313827.469,315166.781,316511.031,317860.406,
|
|
*319214.969,320565.875,321929.344,323296.906,324660.219,326035.687,
|
|
*327413.844,328794.406,330173.156,331566.156,332953.469,334356.187,
|
|
*335757.625,337165.562,338566.094,339984.750,341402.937,342828.125,
|
|
*344257.562,345686.750,347123.125,348564.250,350008.906,351453.219,
|
|
*352908.062,354361.469,355828.000,357292.500,358765.719,360233.687,
|
|
*361713.562,363200.187,364685.656,366174.500,367673.594,369174.906,
|
|
*370678.969,372191.125,373708.937,375225.281,376743.719,378270.406,
|
|
*379804.500,381334.250,382879.125,384420.812,385969.531,387519.812,
|
|
*389078.937,390639.781,392213.875,393782.437,395359.156,396943.625,
|
|
*398527.625,400110.937,401711.750,403310.344,404908.937,406513.875,
|
|
*408125.781,409741.906,411356.875,412979.500,414613.125,416245.500,
|
|
*417889.094,419530.000,421179.906,422831.531,424484.344,426153.187,
|
|
*427816.406,429489.094,431161.312,432840.656,434517.000,436215.281,
|
|
*437896.000,439602.594,441300.625,443016.156,444722.906,446445.437,
|
|
*448164.812,449885.937,451615.094,453351.594,455090.125,456833.281,
|
|
*458582.719,460335.344,462094.844,463857.094,465629.906,467402.781,
|
|
*469178.406,470963.750,472745.906,474539.594,476333.312,478131.125,
|
|
*479934.000,481740.750,483557.844,485376.625,487202.937,489033.562,
|
|
*490868.031,492709.281,494547.375,496401.094,498249.594,500110.250,
|
|
*501966.594,503836.062,505704.437,507580.687,509469.187,511349.781,
|
|
*513239.000,515137.187,517038.812,518942.906,520858.156,522767.094,
|
|
*524610.625,526433.812,528331.062,530253.437,532185.500,534127.875,
|
|
*536073.937,538028.312,539983.375,541954.687,543916.312,545902.500,
|
|
*547874.812,549857.125,551850.937,553839.937,555836.625,557838.500,
|
|
*559849.937,561859.375,563880.625,565889.875,567916.000,569953.625,
|
|
*571990.375,574034.937,576085.062,578127.375,580188.937,582251.000,
|
|
*584328.812,586385.562,588464.062,590551.875,592644.625,594722.250,
|
|
*596829.937,598931.375,601029.687,603142.812,605262.812,607384.625,
|
|
*609513.125,611644.000,613775.875,615930.375,618073.750,620218.437,
|
|
*622381.937,624524.312,626697.500,628869.000,631040.937,633223.562,
|
|
*635409.187,637597.562,639800.187,642002.125,644212.562,646416.250,
|
|
*648633.562,650864.187,653083.687,655315.312,657549.687,659795.500,
|
|
*662032.250,664292.875,666542.312,668806.250,671071.312,673340.937,
|
|
*675626.938,677898.750/
|
|
c
|
|
it=int(t/10.)
|
|
if(it.gt.800) it=800
|
|
pf=pf0(it)
|
|
return
|
|
end
|
|
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE RYBSOL
|
|
C =================
|
|
C
|
|
C driver of the complete-linearization solution in the Rybicki
|
|
C formalism
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
COMMON/RYBMTX/RA(MDEPTH),RB(MDEPTH),RC(MDEPTH),VR(MDEPTH),
|
|
* UA(MDEPTH),UB(MDEPTH),UC(MDEPTH),
|
|
* VA(MDEPTH),VB(MDEPTH),VC(MDEPTH),WR(MDEPTH),
|
|
* WM(MDEPTH,MDEPTH)
|
|
common/imodlc/imodl0(mlevel)
|
|
DIMENSION AL(MDEPTH),AU(MDEPTH),VAL(MDEPTH),UCOL(MDEPTH),
|
|
* VAU(MDEPTH,MDEPTH),CHANGT(MDEPTH)
|
|
dimension pop1(mlevel),babs(mlevel,mdepth)
|
|
C
|
|
C zeroing needed quantities
|
|
C
|
|
DO ID=1,ND
|
|
REIT(ID)=0.
|
|
REIN(ID)=0.
|
|
AREIT(ID)=0.
|
|
AREIN(ID)=0.
|
|
CREIT(ID)=0.
|
|
CREIN(ID)=0.
|
|
REDT(ID)=0.
|
|
REDTM(ID)=0.
|
|
REDTP(ID)=0.
|
|
REDN(ID)=0.
|
|
REDNM(ID)=0.
|
|
REDNP(ID)=0.
|
|
FCOOLI(ID)=0.
|
|
FLFIX(ID)=0.
|
|
FLRD(ID)=0.
|
|
ABROSD(ID)=0.
|
|
SUMDPL(ID)=0.
|
|
END DO
|
|
C
|
|
C zero vectors and matrices of the Rybicki formalism
|
|
C
|
|
DO ID=1,ND
|
|
RA(ID)=0.
|
|
RB(ID)=0.
|
|
RC(ID)=0.
|
|
UA(ID)=0.
|
|
UB(ID)=0.
|
|
UC(ID)=0.
|
|
VA(ID)=0.
|
|
VB(ID)=0.
|
|
VC(ID)=0.
|
|
VR(ID)=0.
|
|
WR(ID)=0.
|
|
AL(ID)=0.
|
|
AU(ID)=0.
|
|
VAL(ID)=0.
|
|
DO ID1=1,ND
|
|
WM(ID1,ID)=0.
|
|
VAU(ID1,ID)=0.
|
|
END DO
|
|
END DO
|
|
C
|
|
if(ioptab.lt.-1) call setdrt
|
|
c
|
|
DO IJ=1,NFREQ
|
|
FR=FREQ(IJ)
|
|
W0=W0E(IJ)
|
|
c IF(IOPTAB.GE.0) THEN
|
|
CALL OPACTR(IJ)
|
|
c ELSE
|
|
c CALL OPACFD(IJ)
|
|
c END IF
|
|
CALL RTEFR1(IJ)
|
|
CALL ALIFR1(IJ)
|
|
CALL ROSSTD(IJ)
|
|
C
|
|
CALL RYBMAT(IJ)
|
|
CALL TRIDAG(RA,RB,RC,VR,AL,ND)
|
|
ID=1
|
|
VAL(ID)=VAL(ID)+VB(ID)*AL(ID)+VC(ID)*AL(ID+1)
|
|
DO ID=2,ND-1
|
|
VAL(ID)=VAL(ID)+VA(ID)*AL(ID-1)+VB(ID)*AL(ID)+
|
|
* VC(ID)*AL(ID+1)
|
|
END DO
|
|
ID=ND
|
|
VAL(ID)=VAL(ID)+VA(ID)*AL(ID-1)+VB(ID)*AL(ID)
|
|
C
|
|
DO IDC=1,ND
|
|
DO ID=1,ND
|
|
UCOL(ID)=0.
|
|
END DO
|
|
UCOL(IDC)=UB(IDC)
|
|
IF(IDC.GT.1) UCOL(IDC-1)=UC(IDC-1)
|
|
IF(IDC.LT.ND) UCOL(IDC+1)=UA(IDC+1)
|
|
CALL TRIDAG(RA,RB,RC,UCOL,AU,ND)
|
|
ID=1
|
|
VAU(ID,IDC)=VAU(ID,IDC)+VB(ID)*AU(ID)+VC(ID)*AU(ID+1)
|
|
DO ID=2,ND-1
|
|
VAU(ID,IDC)=VAU(ID,IDC)+
|
|
* VA(ID)*AU(ID-1)+VB(ID)*AU(ID)+VC(ID)*AU(ID+1)
|
|
END DO
|
|
ID=ND
|
|
VAU(ID,IDC)=VAU(ID,IDC)+VA(ID)*AU(ID-1)+VB(ID)*AU(ID)
|
|
END DO
|
|
END DO
|
|
C
|
|
DO ID=1,ND
|
|
ABROSD(ID)= SUMDPL(ID)/ABROSD(ID)
|
|
FCOOL(ID)=REINT(ID)*FCOOLI(ID)*DENS(ID)-REDIF(ID)*FLFIX(ID)
|
|
END DO
|
|
if(ioptab.lt.0) CALL ROSSTD(0)
|
|
C
|
|
C final evaluation of matrices and the global inversion
|
|
C
|
|
CALL RYBENE
|
|
C
|
|
do id=1,70,34
|
|
write(6,603) id,wm(id,id),wm(id,id+1),wr(id)
|
|
end do
|
|
603 format('rybene ',8x,i4,1p4e11.3)
|
|
DO ID=1,ND
|
|
DO IDC=1,ND
|
|
WM(ID,IDC)=WM(ID,IDC)-VAU(ID,IDC)
|
|
END DO
|
|
WR(ID)=WR(ID)-VAL(ID)
|
|
END DO
|
|
CALL LINEQS(WM,WR,CHANGT,ND,MDEPTH)
|
|
C
|
|
IF(.NOT.LTE.and.ifryb.gt.1) THEN
|
|
lte=.true.
|
|
iflev0=iflev
|
|
iflev=1
|
|
do i=1,nlevel
|
|
imodl(i)=imodl0(i)
|
|
end do
|
|
call levset
|
|
do id=1,nd
|
|
call steqeq(id,pop1,0)
|
|
do i=1,nlevel
|
|
babs(i,id)=un
|
|
if(pop1(i).gt.0.) babs(i,id)=popul(i,id)/pop1(i)
|
|
end do
|
|
end do
|
|
lte=.false.
|
|
iflev=iflev0
|
|
do i=1,nlevel
|
|
imodl(i)=imodl0(i)
|
|
end do
|
|
call levset
|
|
end if
|
|
C
|
|
IF(.NOT.LTE.and.ifryb.gt.2) THEN
|
|
DO IJ=1,NFREQ
|
|
CALL OPACTR(IJ)
|
|
CALL RTEFR1(IJ)
|
|
CALL ALIFR1(IJ)
|
|
CALL ROSSTD(IJ)
|
|
CALL RYBMAT(IJ)
|
|
ID=1
|
|
WR(ID)=VR(ID)-UB(ID)*CHANGT(ID)-UC(ID)*CHANGT(ID+1)
|
|
DO ID=2,ND-1
|
|
WR(ID)=VR(ID)-UA(ID)*CHANGT(ID-1)-UB(ID)*CHANGT(ID)-
|
|
* UC(ID)*CHANGT(ID+1)
|
|
END DO
|
|
ID=ND
|
|
WR(ID)=VR(ID)-UA(ID)*CHANGT(ID-1)-UB(ID)*CHANGT(ID)
|
|
CALL TRIDAG(RA,RB,RC,WR,AL,ND)
|
|
RAD(IJ,ID)=RAD1(ID)+AL(ID)
|
|
END DO
|
|
END IF
|
|
C
|
|
CALL RYBCHN(CHANGT)
|
|
c
|
|
if(.not.lte.and.ifryb.gt.1) then
|
|
lte=.true.
|
|
iflev0=iflev
|
|
iflev=1
|
|
do i=1,nlevel
|
|
imodl(i)=imodl0(i)
|
|
end do
|
|
call levset
|
|
do id=1,nd
|
|
call steqeq(id,pop1,0)
|
|
do i=1,nlevel
|
|
popul(i,id)=pop1(i)*babs(i,id)
|
|
end do
|
|
end do
|
|
lte=.false.
|
|
iflev=iflev0
|
|
do i=1,nlevel
|
|
imodl(i)=imodl0(i)
|
|
end do
|
|
call levset
|
|
end if
|
|
c
|
|
RETURN
|
|
END
|
|
|
|
|
|
|
|
|
|
SUBROUTINE RYBMAT(IJ)
|
|
C =====================
|
|
C
|
|
C evaluation of the complete-linearization matrices in the Rybicki
|
|
c formalism
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
COMMON/RYBMTX/RA(MDEPTH),RB(MDEPTH),RC(MDEPTH),VR(MDEPTH),
|
|
* UA(MDEPTH),UB(MDEPTH),UC(MDEPTH),
|
|
* VA(MDEPTH),VB(MDEPTH),VC(MDEPTH),WR(MDEPTH),
|
|
* WM(MDEPTH,MDEPTH)
|
|
common/dsctva/dsct1(mdepth),dscn1(mdepth)
|
|
PARAMETER (SIXTH=UN/6.D0,
|
|
* THIRD=UN/3.D0,
|
|
* TWOTHR=TWO/3.D0)
|
|
C
|
|
IJT=IJFR(IJ)
|
|
C
|
|
C ==============================================================
|
|
C 1. components corresponding to the radiative transfer equation
|
|
C ==============================================================
|
|
C
|
|
C -----------------------------------
|
|
C ID = 1 - upper boundary condition
|
|
C
|
|
ID=1
|
|
DDM=(DM(ID+1)-DM(ID))*HALF
|
|
DTM=UN/((ABSO1(ID)+ABSO1(ID+1))*DDM)
|
|
DTM2=DTM*DTM
|
|
ALF=DTM*DDM
|
|
FD=TWO*FH(IJ)
|
|
EXTI=EXTRAD(IJ)
|
|
BET=(EXTI-FD*RAD1(ID))*DTM
|
|
GAM=(FAK1(ID)*RAD1(ID)-FAK1(ID+1)*RAD1(ID+1))*TWO*DTM2
|
|
S0=(EMIS1(ID)+SCAT1(ID)*RAD1(ID))/ABSO1(ID)
|
|
C1=ALF*(TWO*GAM-BET)
|
|
B1=C1-S0/ABSO1(ID)
|
|
UNQ=UN+TWO*DTM*Q0(IJ)
|
|
c unq=un
|
|
RB(ID)=-(UN+DTM*(FD+TWO*FAK1(ID)*DTM))+
|
|
* SCAT1(ID)/ABSO1(ID)*UNQ
|
|
RC(ID)= TWO*FAK1(ID+1)*DTM2
|
|
VR(ID)= GAM-BET+RAD1(ID)-S0*UNQ
|
|
UB(ID)= B1*DABT1(ID)+(DEMT1(ID)+
|
|
* DSCT1(ID)*RAD1(ID))/ABSO1(ID)*UNQ-
|
|
* emis1(id)/abso1(id)**2*dabt1(id)*two*dtm*q0(ij)+
|
|
* dtm*s0*(uu0(ij)*dm(1)*dabt1(id)-
|
|
* two*q0(ij)*dtm*ddm*dabt1(id))
|
|
UC(ID)= C1*DABT1(ID+1)-two*dtm*q0(ij)*s0*dtm*ddm*dabt1(id+1)
|
|
c
|
|
if(iubc.gt.0) then
|
|
corf=half/dtm
|
|
rb(id)=rb(id)*corf
|
|
rc(id)=rc(id)*corf
|
|
vr(id)=vr(id)*corf
|
|
c1=(gam-rad1(id)+s0)*corf*alf
|
|
b1=c1-corf*s0/abso1(id)
|
|
UB(ID)= B1*DABT1(ID)+(DEMT1(ID)+
|
|
* DSCT1(ID)*RAD1(ID))/ABSO1(ID)*corf
|
|
UC(ID)= C1*DABT1(ID+1)
|
|
end if
|
|
C
|
|
C
|
|
C ----------------------------------
|
|
C 1 < ID < ND - normal depth point
|
|
C
|
|
DO ID=2,ND-1
|
|
DDM=(DM(ID)-DM(ID-1))*HALF
|
|
DDP=(DM(ID+1)-DM(ID))*HALF
|
|
DZM=ABSO1(ID)+ABSO1(ID-1)
|
|
DZP=ABSO1(ID)+ABSO1(ID+1)
|
|
DTAUP=DZP*DDP
|
|
DTAUM=DZM*DDM
|
|
DTAU0=HALF *(DTAUP+DTAUM)
|
|
FRD=FAK1(ID)*RAD1(ID)
|
|
ALF1=(FRD-FAK1(ID+1)*RAD1(ID+1))/DTAUP/DTAU0
|
|
GAM1=(FRD-FAK1(ID-1)*RAD1(ID-1))/DTAUM/DTAU0
|
|
BET1=ALF1+GAM1
|
|
X1=HALF *BET1/DTAU0
|
|
A1=(GAM1+X1*DTAUM)/DZM
|
|
C1=(ALF1+X1*DTAUP)/DZP
|
|
B1=A1+C1
|
|
BS=UN
|
|
CHIELM=SCAT1(ID-1)
|
|
CHIEL0=SCAT1(ID)
|
|
CHIELP=SCAT1(ID+1)
|
|
S0=(EMIS1(ID)+CHIEL0*RAD1(ID))/ABSO1(ID)
|
|
AS=0.
|
|
CS=0.
|
|
A2=0.
|
|
C2=0.
|
|
A3=0.
|
|
C3=0.
|
|
BET2=0.
|
|
SM=0.
|
|
SP=0.
|
|
IF(MOD(ISPLIN,3).EQ.0) GO TO 60
|
|
SM=(EMIS1(ID-1)+RAD1(ID-1)*CHIELM)/ABSO1(ID-1)
|
|
SP=(EMIS1(ID+1)+RAD1(ID+1)*CHIELP)/ABSO1(ID+1)
|
|
IF(ISPLIN.EQ.1) THEN
|
|
C
|
|
C spline collocation (ISPLIN=1)
|
|
C
|
|
AS=DTAUM/DTAU0*SIXTH
|
|
CS=DTAUP/DTAU0*SIXTH
|
|
BS=0.666666666666667D0
|
|
ALF2=AS*(RAD1(ID-1)-SM)
|
|
GAM2=CS*(RAD1(ID+1)-SP)
|
|
BET2=ALF2+GAM2
|
|
X =HALF *BET2/DTAU0
|
|
A2=(GAM2-X*DTAUM)/DZM
|
|
C2=(ALF2-X*DTAUP)/DZP
|
|
ELSE
|
|
C
|
|
C Hermitian method (ISPLIN=2)
|
|
C
|
|
AS=DTAUP*DTAUP/DTAUM/DTAU0
|
|
CS=DTAUM*DTAUM/DTAUP/DTAU0
|
|
AL3=(RAD1(ID+1)-SP-RAD1(ID)+S0)*SIXTH
|
|
GA3=(RAD1(ID-1)-SM-RAD1(ID)+S0)*SIXTH
|
|
AV=AL3*CS
|
|
CV=GA3*AS
|
|
AS=(UN-HALF *AS)*SIXTH
|
|
CS=(UN-HALF *CS)*SIXTH
|
|
BS=UN-AS-CS
|
|
X=(AV+CV)/DTAU0/4.D0
|
|
A2=(X*DTAUM+HALF *CV-AV)/DZM
|
|
C2=(X*DTAUP+HALF *AV-CV)/DZP
|
|
BET2=AS*(RAD1(ID-1)-SM)+CS*(RAD1(ID+1)-SP)
|
|
END IF
|
|
C
|
|
C auxiliary quantities
|
|
C
|
|
B1=B1-(A2+C2)
|
|
A1=A1-A2
|
|
C1=C1-C2
|
|
A2=AS/ABSO1(ID-1)
|
|
C2=CS/ABSO1(ID+1)
|
|
A3=A2*SM
|
|
C3=C2*SP
|
|
C
|
|
60 CONTINUE
|
|
B2=BS/ABSO1(ID)
|
|
B3=B2*S0
|
|
A1=A1-A3
|
|
B1=B1-B3
|
|
C1=C1-C3
|
|
C
|
|
C *** elements of the matrices
|
|
C
|
|
RA(ID)= FAK1(ID-1)/DTAUM/DTAU0-AS*(UN-CHIELM/ABSO1(ID-1))
|
|
RB(ID)=-FAK1(ID)/DTAU0*(UN/DTAUP+UN/DTAUM)-
|
|
* BS*(UN-CHIEL0/ABSO1(ID))
|
|
RC(ID)= FAK1(ID+1)/DTAUP/DTAU0-CS*(UN-CHIELP/ABSO1(ID+1))
|
|
VR(ID)= BET1+BET2+BS*(RAD1(ID)-S0)
|
|
UA(ID)= A1*DABT1(ID-1)+A2*(DEMT1(ID-1)+DSCT1(ID-1)*RAD1(ID-1))
|
|
UB(ID)= B1*DABT1(ID)+B2*(DEMT1(ID)+DSCT1(ID)*RAD1(ID))
|
|
UC(ID)= C1*DABT1(ID+1)+C2*(DEMT1(ID+1)+DSCT1(ID+1)*RAD1(ID+1))
|
|
END DO
|
|
C
|
|
C ----------------------------------
|
|
C ID=ND - lower boundary condition
|
|
C
|
|
ID=ND
|
|
DDM=HALF*(DM(ID)-DM(ID-1))
|
|
T0=TEMP(ID)
|
|
TM=TEMP(ID-1)
|
|
IF(IBC.GT.0.AND.IBC.LT.4.AND.IDISK.EQ.0) THEN
|
|
DTM=UN/((ABSO1(ID-1)+ABSO1(ID))*DDM)
|
|
DTM2=DTM*DTM
|
|
FD=TWO*FHD(IJT)
|
|
FR=FREQ(IJT)
|
|
FR15=FR*1.D-15
|
|
BNU=BN*FR15*FR15*FR15
|
|
X0=HK*FR/T0
|
|
XM=HK*FR/TM
|
|
PLAND=BNU/(EXP(X0)-UN)
|
|
PLANM=BNU/(EXP(XM)-UN)
|
|
DPLDT0=PLAND/(UN-EXP(-X0))*X0/T0
|
|
DPLDTM=PLANM/(UN-EXP(-XM))*XM/TM
|
|
DPLAN=(PLAND-PLANM)*DTM
|
|
ALF=DTM*DDM
|
|
BET=(PLAND-FD*RAD1(ID))*DTM
|
|
GAM=(FAK1(ID)*RAD1(ID)-FAK1(ID-1)*RAD1(ID-1)-
|
|
* THIRD*(PLAND-PLANM))*TWO*DTM2
|
|
S0=(EMIS1(ID)+SCAT1(ID)*RAD1(ID))/ABSO1(ID)
|
|
A1=ALF*(TWO*GAM-BET)
|
|
B1=A1-S0/ABSO1(ID)
|
|
RA(ID)= TWO*FAK1(ID-1)*DTM2
|
|
RB(ID)=-(UN+DTM*(FD+TWO*FAK1(ID)*DTM))+
|
|
* SCAT1(ID)/ABSO1(ID)
|
|
VR(ID)= GAM-BET+RAD1(ID)-S0
|
|
UA(ID)= B1*DABT1(ID-1)
|
|
* +(DEMT1(ID-1)+
|
|
* DSCT1(ID-1)*RAD1(ID-1))/ABSO1(ID-1)
|
|
* -DPLDTM*DTM2*TWOTHR
|
|
UB(ID)= B1*DABT1(ID)+(DEMT1(ID)+
|
|
* DSCT1(ID)*RAD1(ID))/ABSO1(ID)+
|
|
* DPLDT0*DTM*(UN+TWOTHR*DTM)
|
|
C
|
|
if(ifryb.gt.0) then
|
|
DTM=UN/((ABSO1(ID-1)+ABSO1(ID))*DDM)
|
|
FR=FREQ(IJT)
|
|
FR15=FR*1.D-15
|
|
BNU=BN*FR15*FR15*FR15
|
|
X0=HK*FR/T0
|
|
XM=HK*FR/TM
|
|
PLAND=BNU/(EXP(X0)-UN)
|
|
PLANM=BNU/(EXP(XM)-UN)
|
|
DPLDT0=PLAND/(UN-EXP(-X0))*X0/T0
|
|
DPLDTM=PLANM/(UN-EXP(-XM))*XM/TM
|
|
GAM=(FAK1(ID)*RAD1(ID)-FAK1(ID-1)*RAD1(ID-1)-
|
|
* THIRD*(PLAND-PLANM))*DTM
|
|
S0=(EMIS1(ID)+SCAT1(ID)*RAD1(ID))/ABSO1(ID)
|
|
BS=HALF/DTM
|
|
BET=BS*(RAD1(ID)-S0)
|
|
A1=(GAM-BET)*DTM*DDM
|
|
B1=A1-BS*S0/ABSO1(ID)
|
|
RA(ID)=FAK1(ID-1)*DTM
|
|
RB(ID)=-FAK1(ID)*DTM-BS*(UN-SCAT1(ID)/ABSO1(ID))-FHD(IJT)
|
|
VR(ID)=GAM+BET-HALF*PLAND+FHD(IJT)*RAD1(ID)
|
|
UA(ID)=A1*DABT1(ID-1)-DPLDTM*DTM*THIRD
|
|
UB(ID)=B1*DABT1(ID)+
|
|
* BS*(DEMT1(ID)+DSCT1(ID)*RAD1(ID))/ABSO1(ID)+
|
|
* (HALF+THIRD*DTM)*DPLDT0
|
|
end if
|
|
C
|
|
ELSE
|
|
C
|
|
C for disks -
|
|
C lower b.c. expresses just I(taumax,-mu,nu)=I(taumax,+mu,nu)
|
|
C
|
|
DZM=ABSO1(ID)+ABSO1(ID-1)
|
|
FRD=FAK1(ID)*RAD1(ID)-FAK1(ID-1)*RAD1(ID-1)
|
|
DTAUM=DZM*DDM
|
|
GAM1=FRD/DTAUM
|
|
A1=GAM1/DZM
|
|
AS=0.
|
|
BS=DTAUM*HALF
|
|
S0=(EMIS1(ID)+SCAT1(ID)*RAD1(ID))/ABSO1(ID)
|
|
GAM2=BS*(RAD1(ID)-S0)
|
|
X1=GAM2/DZM
|
|
A1=A1-X1
|
|
B2=BS/ABSO1(ID)
|
|
B1=A1-B2*S0
|
|
RA(ID)=FAK1(ID-1)/DTAUM-AS*(UN-SCAT1(ID-1)/ABSO1(ID-1))
|
|
RB(ID)=-FAK1(ID)/DTAUM-BS*(UN-SCAT1(ID)/ABSO1(ID))
|
|
UA(ID)=A1*DABT1(ID-1)+A2*(DEMT1(ID-1)+DSCT1(ID-1)*RAD1(ID-1))
|
|
UB(ID)=B1*DABT1(ID)+B2*(DEMT1(ID)+DSCT1(ID)*RAD1(ID))
|
|
VR(ID)=GAM1+GAM2
|
|
END IF
|
|
C
|
|
C
|
|
C =====================================================
|
|
C components corresponding to the radiative equilibrium
|
|
C =====================================================
|
|
C
|
|
DO ID=1,ND
|
|
C
|
|
C ********* integral equation part
|
|
C
|
|
IF(REINT(ID).GT.0.) THEN
|
|
HEAT = ABSO1(ID)-SCAT1(ID)
|
|
DHEAT = (DABT1(ID)-DSCT1(ID))*RAD1(ID)
|
|
WDR = W(IJ)*dens(id)*reint(id)
|
|
VB(ID) = HEAT*WDR
|
|
WM(ID,ID)= WM(ID,ID)+(DHEAT-DEMT1(ID))*WDR
|
|
WR(ID) = WR(ID)-(HEAT*RAD1(ID)-EMIS1(ID))*WDR
|
|
END IF
|
|
END DO
|
|
C
|
|
C ********* differential equation part
|
|
C
|
|
ID=1
|
|
IF(REDIF(ID).GT.0.) THEN
|
|
WF=W(IJ)*FH(IJT)*REDIF(ID)
|
|
VB(ID)=VB(ID)+WF
|
|
WR(ID)=WR(ID)-WF*RAD1(ID)
|
|
END IF
|
|
c
|
|
c original variant with 1st-order mid-point differences
|
|
c
|
|
if(icentr.eq.0) then
|
|
nd1=nd
|
|
if(ilbc.ne.0) nd1=nd-1
|
|
DO ID=2,nd1
|
|
IF(REDIF(ID).GT.0.) THEN
|
|
DDM=(DM(ID)-DM(ID-1))*HALF
|
|
OMEG0=ABSO1(ID)
|
|
OMEGM=ABSO1(ID-1)
|
|
DTAUM=(OMEG0+OMEGM)*DDM
|
|
FRD=FAK1(ID)*RAD1(ID)-FAK1(ID-1)*RAD1(ID-1)
|
|
GAMR=FRD/DTAUM*redif(id)
|
|
A1=GAMR/(OMEG0+OMEGM)
|
|
VA(ID) =-W(IJ)*FAK1(ID-1)/DTAUM*redif(id)
|
|
VB(ID) = VB(ID)+W(IJ)*FAK1(ID)/DTAUM*redif(id)
|
|
WM(ID,ID-1)= WM(ID,ID-1)-A1*W(IJ)*DABT1(ID-1)
|
|
WM(ID,ID) = WM(ID,ID)-A1*W(IJ)*DABT1(ID)
|
|
WR(ID) = WR(ID)-W(IJ)*GAMR
|
|
END IF
|
|
END DO
|
|
c
|
|
if(ilbc.gt.0) then
|
|
id=nd
|
|
IF(REDIF(ID).GT.0.) THEN
|
|
DDM=(DM(ID)-DM(ID-1))*HALF
|
|
DTAUM=(ABSO1(ID)+ABSO1(ID-1))*DDM*3.D0
|
|
FR=FREQ(IJT)
|
|
FR15=FR*1.D-15
|
|
BNU=BN*FR15*FR15*FR15
|
|
X0=HK*FR/TEMP(ID)
|
|
XM=HK*FR/TEMP(ID-1)
|
|
PLAND=BNU/(EXP(X0)-UN)
|
|
PLANM=BNU/(EXP(XM)-UN)
|
|
DPLDT0=PLAND/(UN-EXP(-X0))*X0/TEMP(ID)
|
|
DPLDTM=PLANM/(UN-EXP(-XM))*XM/TEMP(ID-1)
|
|
FLX=(PLAND-PLANM)/DTAUM*redif(id)
|
|
A1=FLX/(ABSO1(ID)+ABSO1(ID-1))
|
|
WM(ID,ID-1)= WM(ID,ID-1)+W(IJ)*(DPLDTM-A1*DABT1(ID-1))
|
|
WM(ID,ID) = WM(ID,ID)+W(IJ)*(DPLDT0-A1*DABT1(ID))
|
|
WR(ID) = WR(ID)-W(IJ)*FLX
|
|
END IF
|
|
end if
|
|
c
|
|
c centered difference variant
|
|
c
|
|
else
|
|
do id=2,nd-1
|
|
if(redif(id).gt.0) then
|
|
wwr=w(ij)*redif(id)
|
|
ddm=half*(dm(id)-dm(id-1))
|
|
ddp=half*(dm(id+1)-dm(id))
|
|
dtm=(abso1(id-1)+abso1(id))*ddm
|
|
dtp=(abso1(id+1)+abso1(id))*ddp
|
|
dt0=dtm+dtp
|
|
frm=fak1(id)*rad1(id)-fak1(id-1)*rad1(id-1)
|
|
frp=fak1(id+1)*rad1(id+1)-fak1(id)*rad1(id)
|
|
alp=dtp/dtm/dt0
|
|
gam=dtm/dtp/dt0
|
|
flx=alp*frm+gam*frp
|
|
c
|
|
c matrix elements
|
|
c
|
|
va(id)=-wwr*fak1(id-1)*alp
|
|
vb(id)=vb(id)+wwr*fak1(id)*(alp-gam)
|
|
vc(id)=wwr*fak1(id+1)*gam
|
|
c
|
|
dmtm=ddm/(dtm*dtm)
|
|
dmtp=ddp/(dtp*dtp)
|
|
rm=dtm/dt0
|
|
rp=dtp/dt0
|
|
wm(id,id-1) = wm(id,id-1)+wwr*dabt1(id-1)*dmtm*
|
|
* (rm*rm*frp-(un+rm)*frm)
|
|
wm(id,id) = wm(id,id)+wwr*dabt1(id)*
|
|
* ((dmtp*rp*rp-dmtm*rp*(un+rm))*frm +
|
|
* (dmtm*rm*rm-dmtp*rm*(un+rp)*frp))
|
|
wr(id)=wr(id)-wwr*flx
|
|
end if
|
|
end do
|
|
c
|
|
id=nd
|
|
IF(REDIF(ID).GT.0.) THEN
|
|
DDM=(DM(ID)-DM(ID-1))*HALF
|
|
DTAUM=(ABSO1(ID)+ABSO1(ID-1))*DDM
|
|
FRD=FAK1(ID)*RAD1(ID)-FAK1(ID-1)*RAD1(ID-1)
|
|
FLX=FRD/DTAUM*redif(id)
|
|
A1=FLX/(ABSO1(ID)+ABSO1(ID-1))
|
|
VA(ID) =-W(IJ)*FAK1(ID-1)/DTAUM*redif(id)
|
|
VB(ID) = VB(ID)+W(IJ)*FAK1(ID)/DTAUM*redif(id)
|
|
WM(ID,ID-1)= WM(ID,ID-1)-A1*W(IJ)*DABT1(ID-1)
|
|
WM(ID,ID) = WM(ID,ID)-A1*W(IJ)*DABT1(ID)
|
|
WR(ID) = WR(ID)-W(IJ)*FLX
|
|
END IF
|
|
end if
|
|
c
|
|
if(nretc.gt.0) then
|
|
do id=1,nretc
|
|
wr(id)=0.
|
|
vb(id)=0.
|
|
va(id)=0.
|
|
wm(id,id)=1.
|
|
if(id.gt.1) wm(id,id-1)=0.
|
|
end do
|
|
end if
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C *************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE RYBENE
|
|
C =================
|
|
C
|
|
C complementing partial matrices of complete linearization
|
|
c corresponding to the contribution of ALI frequencies and the
|
|
c convection to the radiative/convective equilibrium equation in
|
|
c the Rybicki formalism
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
COMMON/CUBCON/ACNV,BCNV,DEL,GRDADB,DELMDE,RHO,FLXTOT,GRAVD
|
|
COMMON/RYBMTX/RA(MDEPTH),RB(MDEPTH),RC(MDEPTH),VR(MDEPTH),
|
|
* UA(MDEPTH),UB(MDEPTH),UC(MDEPTH),
|
|
* VA(MDEPTH),VB(MDEPTH),VC(MDEPTH),WR(MDEPTH),
|
|
* WM(MDEPTH,MDEPTH)
|
|
common/deridt/dert
|
|
C
|
|
C contribution from the radiative equilibrium part of the energy eq.
|
|
c
|
|
flxto0=sig4p*teff**4
|
|
DO ID=1,ND
|
|
WR(ID)=WR(ID)+FCOOL(ID)
|
|
IF(IDISK.EQ.1) WR(ID)=WR(ID)-reint(id)*TVISC(ID)
|
|
if(reint(id).gt.0.) then
|
|
IF(ID.GT.1) WM(ID,ID-1)
|
|
* =WM(ID,ID-1)+AREIT(ID)*dens(id)*reint(id)
|
|
WM(ID,ID) =WM(ID,ID) + REIT(ID)*dens(id)*reint(id)
|
|
IF(IDISK.EQ.1) WM(ID,ID)=WM(ID,ID)+
|
|
* DTVIST(ID)*reint(id)
|
|
IF(ID.LT.ND) WM(ID,ID+1)
|
|
* =WM(ID,ID+1)+CREIT(ID)*dens(id)*reint(id)
|
|
end if
|
|
c
|
|
if(idisk.eq.0) then
|
|
flxtot=flxto0
|
|
gravd=grav
|
|
else
|
|
flxtot=flxto0*(1.d0-thetav(id))
|
|
gravd=qgrav*zd(id)
|
|
end if
|
|
c
|
|
if(redif(id).gt.0) then
|
|
WR(ID)=WR(ID)+flxtot*redif(id)
|
|
IF(ID.GT.1) WM(ID,ID-1)=WM(ID,ID-1)+REDTM(ID)*REDIF(ID)
|
|
WM(ID,ID)= WM(ID,ID)+ REDT (ID)*REDIF(ID)
|
|
IF(ID.LT.ND) WM(ID,ID+1)=WM(ID,ID+1)+REDTP(ID)*REDIF(ID)
|
|
end if
|
|
END DO
|
|
c
|
|
C contribution from convection
|
|
C
|
|
IF(HMIX0.LE.0.OR.ICONV.LE.0) RETURN
|
|
if(dert.eq.0.) dert=0.01
|
|
DO 10 ID=idconz,ND
|
|
T=TEMP(ID)
|
|
P=PTOTAL(ID)
|
|
TM=TEMP(ID-1)
|
|
PM=PTOTAL(ID-1)
|
|
pr0=0.
|
|
if(icentr.eq.0.or.id.eq.nd) then
|
|
T0=SQRT(T*TM)
|
|
P0=SQRT(P*PM)
|
|
AB0=SQRT(ABROSD(ID)*ABROSD(ID-1))
|
|
pr0=sqrt(pradt(id)*pradt(id-1))*pck
|
|
DLP=UN/LOG(P/PM)
|
|
DLT=LOG(T/TM)*DLP
|
|
DELTA(ID)=DLT
|
|
DDT0= DLP/T
|
|
DDTM=-DLP/TM
|
|
CALL CONVEC(ID,T0,P0,P0-pr0,pr0,AB0,DLT,FLXCNV,VCON)
|
|
FLXC(ID)=FLXCNV
|
|
DHCDD=0.
|
|
IF(DELMDE.GT.0.) THEN
|
|
bb=bcnv*half
|
|
cord=un-bb/sqrt(bb*bb+(dlt-grdadb))
|
|
DHCDD=1.5D0/DELMDE*FLXCNV*cord
|
|
END IF
|
|
if(id.lt.icbegp-2) then
|
|
flxc(id)=0.
|
|
go to 10
|
|
end if
|
|
T1=(un+dert)*T0
|
|
CALL CONVEC(ID,T1,P0,p0-pr0,pr0,AB0,DLT,FLXC1,VCON)
|
|
DHCDT0=(FLXC1-FLXCNV)*HALF/dert
|
|
DHCDT =DHCDT0/T+DHCDD*DDT0
|
|
DHCDTM=DHCDT0/TM+DHCDD*DDTM
|
|
else
|
|
dlm=log(p/pm)
|
|
dlp=log(ptotal(id+1)/p)
|
|
dl0=dlm+dlp
|
|
palf=dlp/dlm/dl0
|
|
pgam=dlm/dlp/dl0
|
|
dlt=palf*log(t/tm)+pgam*log(temp(id+1)/t)
|
|
delta(id)=dlt
|
|
ddtm=-palf/tm
|
|
ddtp=pgam/temp(id+1)
|
|
ddt0=(palf-pgam)/t
|
|
pr0=sqrt(pradt(id)*pradt(id-1))*pck
|
|
call convec(id,t,p,p-pr0,pr0,abrosd(id),dlt,flxcnv,vcon)
|
|
flxc(id)=flxcnv
|
|
dhcdd=0.
|
|
IF(DELMDE.GT.0.) then
|
|
bb=bcnv*half
|
|
cord=un-bb/sqrt(bb*bb+(dlt-grdadb))
|
|
DHCDD=1.5D0/DELMDE*FLXCNV*cord
|
|
end if
|
|
if(id.lt.icbegp-2) then
|
|
flxc(id)=0.
|
|
go to 10
|
|
end if
|
|
T1=(un+dert)*T
|
|
CALL CONVEC(ID,T1,P,p-pr0,pr0,abrosd(id),DLT,FLXC1,VCON)
|
|
DHCDT0=(FLXC1-FLXCNV)*HALF/dert
|
|
DHCDT =DHCDT0/T+DHCDD*DDT0
|
|
DHCDTM=DHCDD*DDTM
|
|
DHCDTP=DHCDD*DDTP
|
|
end if
|
|
|
|
C
|
|
C additional terms in matrix WM
|
|
C
|
|
C ** 1. differential equation form
|
|
C
|
|
if(redif(id).gt.0) then
|
|
WM(ID,ID-1)=WM(ID,ID-1)+DHCDTM*redif(id)
|
|
WM(ID,ID)= WM(ID,ID)+DHCDT*redif(id)
|
|
WR(ID)=WR(ID)-FLXC(ID)*redif(id)
|
|
if(icentr.ne.0.and.id.lt.nd) then
|
|
WM(ID,ID+1)=WM(ID,ID+1)+DHCDTP*redif(id)
|
|
end if
|
|
END IF
|
|
C
|
|
C ** 2. integral equation form
|
|
C
|
|
if(reint(id).gt.0.) then
|
|
if(id.lt.nd) then
|
|
TP=TEMP(ID+1)
|
|
PTP=PTOTAL(ID+1)
|
|
T0=SQRT(T*TP)
|
|
P0=SQRT(P*PTP)
|
|
pr0=sqrt(pradt(id)*pradt(id-1))*pck
|
|
AB0=SQRT(ABROSD(ID)*ABROSD(ID+1))
|
|
DLP=UN/LOG(PTP/P)
|
|
DLT=LOG(TP/T)*DLP
|
|
DDTP0= DLP/TP
|
|
DDTPM=-DLP/T
|
|
CALL CONVEC(ID,T0,P0,p0-pr0,pr0,AB0,DLT,FLXCNV,VCON)
|
|
DHCDDP=0.
|
|
IF(DELMDE.GT.0.) DHCDDP=1.5D0/DELMDE*FLXCNV
|
|
T1=1.001D0*T0
|
|
CALL CONVEC(ID,T1,P0,p0-pr0,pr0,AB0,DLT,FLXC1,VCON)
|
|
DHCDT0=(FLXC1-FLXCNV)*500.
|
|
DHCDTP=DHCDT0/TP+DHCDDP*DDTP0
|
|
DHCDTU=DHCDT0/T+DHCDDP*DDTPM
|
|
C
|
|
C additional terms in matrices A and B (the row corresponding to
|
|
C energy balance, i.e. T) due to convection
|
|
C
|
|
DELM=(DM(ID+1)-DM(ID-1))*HALF
|
|
RDELM=DENS(ID)/DELM*reint(id)
|
|
IF(ICONV.GT.0) THEN
|
|
WM(ID,ID-1)=WM(ID,ID-1)-RDELM*DHCDTM
|
|
WM(ID,ID)=WM(ID,ID)+RDELM*(DHCDTP-DHCDTU)
|
|
WM(ID,ID+1)=WM(ID,ID+1)+RDELM*DHCDTP
|
|
END IF
|
|
WR(ID)=WR(ID)-RDELM*(FLXCNV-FLXC(ID))
|
|
ELSE
|
|
TP=TEMP(ID-2)
|
|
PTP=PTOTAL(ID-2)
|
|
T0=SQRT(T*TP)
|
|
P0=SQRT(P*PTP)
|
|
pr0=sqrt(pradt(id)*pradt(id-1))*pck
|
|
AB0=SQRT(ABROSD(ID)*ABROSD(ID-2))
|
|
DLP=UN/LOG(PTP/P)
|
|
DLT=LOG(TP/T)*DLP
|
|
DDTP0= DLP/TP
|
|
DDTPM=-DLP/T
|
|
CALL CONVEC(ID,T0,P0,p0-pr0,pr0,AB0,DLT,FLXCNV,VCON)
|
|
if(flxcnv.le.0.) go to 10
|
|
DHCDDP=0.
|
|
IF(DELMDE.GT.0.) DHCDDP=1.5D0/DELMDE*FLXCNV
|
|
T1=1.001D0*T0
|
|
CALL CONVEC(ID,T1,P0,p0-pr0,pr0,AB0,DLT,FLXC1,VCON)
|
|
DHCDTP=(FLXC1-FLXCNV)*1.D3/T0*HALF+DHCDDP*DDTP0
|
|
C
|
|
C additional terms in matrices A and B (the row corresponding to
|
|
C energy balance, i.e. T) due to convection
|
|
C
|
|
DELM=(DM(ID)-DM(ID-2))*HALF
|
|
RDELM=DENS(ID)/DELM*reint(id)
|
|
DELHC=WMM(ID)/DELM*(FLXCNV-FLXC(ID))
|
|
WM(ID,ID-1)=WM(ID,ID-1)+RDELM*(DHCDT-DHCDTP)
|
|
WM(ID,ID)=WM(ID,ID)+RDELM*DHCDT
|
|
WR(ID)=WR(ID)-RDELM*(FLXC(ID)-FLXCNV)
|
|
END IF
|
|
END IF
|
|
10 CONTINUE
|
|
c
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C *************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE RYBCHN(CHANGT)
|
|
C =========================
|
|
C
|
|
C handling relative changes in the Rybicki formalism
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ARRAY1.FOR'
|
|
common/grdpra/GRD(MDEPTH),pra(mdepth),pgs0(mdepth),ANTP(MDEPTH)
|
|
common/rybpgs/CS(MDEPTH),PRAD2D(MDEPTH),F1HE
|
|
DIMENSION CHANGT(MDEPTH),TMPOLD(MDEPTH)
|
|
C
|
|
CHMX=0.
|
|
CHN=0.
|
|
JJR=0
|
|
DPLP=DPSILT-UN
|
|
DPLM=UN/DPSILT-UN
|
|
NRE=NFREQE+1
|
|
IF(ITER.EQ.1) WRITE(9,800)
|
|
DO ID=ND,1,-1
|
|
CHT=CHANGT(ID)/TEMP(ID)
|
|
CHAN=CHT
|
|
IF(CHAN.LE.DPLM) CHAN=DPLM
|
|
IF(CHAN.GT.DPLP) CHAN=DPLP
|
|
TMPOLD(ID)=TEMP(ID)
|
|
TEMP(ID)=TEMP(ID)*(CHAN+UN)
|
|
PSI0(NRE)=TEMP(ID)
|
|
PSY0(NRE,ID)=PSI0(NRE)
|
|
WRITE(9,801) ITER,ID,CHT,chn,chN,CHN,chT,jjr,jjr
|
|
IF(ABS(CHT).GT.CHMX) CHMX=ABS(CHT)
|
|
END DO
|
|
c
|
|
if(ioptab.le.-2) go to 10
|
|
if(nretc.lt.0) then
|
|
do id=-nretc,1,-1
|
|
temp(id)=temp(id+1)
|
|
PSY0(NRE,ID)=PSY0(NRE,ID+1)
|
|
end do
|
|
end if
|
|
c
|
|
if(idisk.eq.0) then
|
|
if(ifprad.gt.0) then
|
|
DO ID=1,ND
|
|
T=TEMP(ID)
|
|
dtod=temp(id)/tmpold(id)-un
|
|
if(dtod.gt.0.2) dtod=0.2
|
|
if(dtod.lt.-0.2) dtod=-0.2
|
|
gfac=un+4.*dtod
|
|
if(idisk.eq.0) then
|
|
if(id.eq.1) then
|
|
pgs(id)=dm(id)*(grav-grd(id)*gfac)
|
|
else
|
|
pgs(id)=pgs(id-1)+grav*(dm(id)-dm(id-1))-
|
|
* pck*grd(id)*gfac
|
|
end if
|
|
end if
|
|
c if(iprybc.gt.0)
|
|
c write(6,603) iter,id,grd(id),gfac,pgs(id),dtod,temp(id)
|
|
c 603 format(2i5,1p6e13.5)
|
|
c
|
|
AN=PGS(ID)/BOLK/T
|
|
CALL ELDENS(ID,T,AN,ANE,ENRG,ENTT,WM,1)
|
|
RHO=WMM(ID)*(AN-ANE)
|
|
DENS(ID)=RHO
|
|
ELEC(ID)=ANE
|
|
END DO
|
|
else
|
|
DO ID=1,ND
|
|
T=TEMP(ID)
|
|
PGS(ID)=DM(ID)*GRAV
|
|
AN=PGS(ID)/BOLK/T
|
|
CALL ELDENS(ID,T,AN,ANE,ENRG,ENTT,WM,1)
|
|
RHO=WMM(ID)*(AN-ANE)
|
|
DENS(ID)=RHO
|
|
ELEC(ID)=ANE
|
|
END DO
|
|
end if
|
|
else
|
|
pgpre=pgs(1)
|
|
id=1
|
|
do id=2,nd
|
|
pgpre=pgs(id)
|
|
dtod=temp(id)/tmpold(id)-un
|
|
if(dtod.gt.0.2) dtod=0.2
|
|
if(dtod.lt.-0.2) dtod=-0.2
|
|
gfac=un+4.*dtod
|
|
grv=(dm(id)-dm(id-1))*qgrav*(zd(id)+zd(id-1))*half
|
|
pgs(id)=pgs(id-1)-pck*grd(id)*gfac+grv
|
|
pgs0(id)=pgs(id)
|
|
end do
|
|
pgs0(1)=pgs(1)
|
|
c
|
|
itpg=0
|
|
5 continue
|
|
z1=zd(1)
|
|
itpg=itpg+1
|
|
call pgset(1)
|
|
c
|
|
DO ID=1,ND
|
|
T=TEMP(ID)
|
|
AN=ANTP(ID)
|
|
CALL ELDENS(ID,T,AN,ANE,ENRG,ENTT,WM,1)
|
|
RHO=WMM(ID)*(AN-ANE)
|
|
DENS(ID)=RHO
|
|
ELEC(ID)=ANE
|
|
PGS(ID)=BOLK*T*AN
|
|
pgs0(id)=pgs(id)
|
|
END DO
|
|
c
|
|
c recomputing the z-distance
|
|
c
|
|
do id=nd-1,1,-1
|
|
ddp=(dm(id+1)-dm(id))*half
|
|
zd(id)=zd(id+1)+ddp/dens(id+1)+ddp/dens(id)
|
|
end do
|
|
c
|
|
if(abs((zd(1)-z1)/z1).lt.1.e-3.or.itpg.gt.5) go to 8
|
|
c
|
|
do id=1,nd
|
|
cs(id)=pgs(id)/dens(id)/temp(id)
|
|
end do
|
|
|
|
hr1=grd(1)/qgrav
|
|
hg1=sqrt(two*cs(1)*temp(1)/qgrav)
|
|
x=(zd(1)-hr1)/hg1
|
|
IF(X.LT.3.) THEN
|
|
IF(X.LT.0.) X=0.
|
|
F1HE=8.86226925D-1*EXP(X*X)*ERFCX(X)
|
|
ELSE
|
|
F1HE=HALF*(UN-HALF/X/X)/X
|
|
END IF
|
|
if(abs((zd(1)-z1)/z1).lt.1.e-4.or.itpg.gt.5) go to 8
|
|
go to 5
|
|
8 continue
|
|
end if
|
|
10 continue
|
|
C
|
|
C STOP if changes become too large
|
|
C
|
|
IF(ITER.NE.1 .AND. ABS(CHMX).GT.1.D16) THEN
|
|
WRITE(6,610) ITER,CHMX
|
|
WRITE(10,610) ITER,CHMX
|
|
STOP
|
|
END IF
|
|
C
|
|
C Finally, set up quantity LFIN that indicates whether or not
|
|
C this iteration of complete linearization is the last one
|
|
C
|
|
LFIN=ABS(CHMX).LE.CHMAX.OR.ITER.GE.NITER
|
|
c
|
|
610 FORMAT(' **** STOP in RYBSOL after ITER',I4,/,
|
|
* ' Max change:',1PE12.2)
|
|
800 FORMAT(' RELATIVE CHANGES OF VECTOR PSI'/
|
|
* ' ITER ID TEMP NE POP RAD MAXIMUM',
|
|
* ' ilev ifr',/)
|
|
801 FORMAT(2I5,1P5D10.2,2I5)
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C *************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE TRIDAG(A,B,C,R,U,N)
|
|
C ==============================
|
|
C
|
|
C solution of the tridiagonal system
|
|
c
|
|
c from Numerical recipes, Sect 2.4
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
DIMENSION A(N),B(N),C(N),R(N),U(N),GAM(N)
|
|
C
|
|
BET=B(1)
|
|
U(1)=R(1)/BET
|
|
DO J=2,N
|
|
GAM(J)=C(J-1)/BET
|
|
BET=B(J)-A(J)*GAM(J)
|
|
U(J)=(R(J)-A(J)*U(J-1))/BET
|
|
END DO
|
|
DO J=N-1,1,-1
|
|
U(J)=U(J)-GAM(J+1)*U(J+1)
|
|
END DO
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ******************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE OPACTR(IJ)
|
|
C =====================
|
|
C
|
|
C Absorption and emission coefficients and their derivatives
|
|
C for the use by Rybicki variant (RYBSOL)
|
|
C
|
|
C This procedure is very similar to OPACT1, the only difference is
|
|
C the evaluation of derivatives
|
|
C
|
|
C Input:
|
|
C IJ - depth index
|
|
C Output:
|
|
C ABSO1 - array of absorption coefficient
|
|
C EMIS1 - array of emission coefficient
|
|
C SCAT1 - array of scattering coefficient
|
|
C Dxxy - array of derivatives of xx (=AB for absorption, =EM for
|
|
C emission, =SC for scattering) coefficient wrt T
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ALIPAR.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
PARAMETER (DELT=1.D-2)
|
|
common/dsctva/dsct1(mdepth),dscn1(mdepth)
|
|
common/hmolab/anh2(mdepth),anhm(mdepth)
|
|
common/grdpra/GRD(MDEPTH),pra(mdepth),pgs0(mdepth),ANTP(MDEPTH)
|
|
|
|
DIMENSION ABSOPP(MFREQ,MDEPTH),SCATPP(MFREQ,MDEPTH),
|
|
* EMISPP(MFREQ,MDEPTH),AES(MLEVEL,MLEVEL),BES(MLEVEL),
|
|
* ELEC0(MDEPTH),DENS0(MDEPTH),AN0(MDEPTH),
|
|
* BFABS(MLEVEL,MDEPTH),ELERAT(MDEPTH),
|
|
* POPUL0(MLEVEL,MDEPTH),POPLTE(MLEVEL)
|
|
c
|
|
C compute opacities at T+DELTA(T) - for derivatives
|
|
C
|
|
IF(IJ.EQ.1) THEN
|
|
C
|
|
C first, sab\ve absolute b-factors (for evaluating
|
|
C derivatives w.r.t. T)
|
|
C
|
|
IF(.NOT.LTE) THEN
|
|
LTE0=LTE
|
|
DO ID=1,ND
|
|
CALL WNSTOR(ID)
|
|
CALL SABOLF(ID)
|
|
CALL RATMAL(ID,AES,BES)
|
|
CALL LEVSOL(AES,BES,POPLTE,IIFOR,NLEVEL,0)
|
|
ELERAT(ID)=ELEC(ID)/(DENS(ID)/WMM(ID)+ELEC(ID))
|
|
DO I=1,NLEVEL
|
|
POPUL0(I,ID)=POPUL(I,ID)
|
|
BFABS(I,ID)=1.
|
|
IF(POPLTE(I).GT.0.) BFABS(I,ID)=POPUL(I,ID)/POPLTE(I)
|
|
END DO
|
|
END DO
|
|
LTE=LTE0
|
|
END IF
|
|
C
|
|
C opacities at T+DELTA(T) - for derivatives
|
|
C for that, one needs also to estimate ELEC and DENS for T+DELTA(T)
|
|
C
|
|
DO ID=1,ND
|
|
TEMP(ID)=TEMP(ID)*(UN+DELT)
|
|
ELEC0(ID)=ELEC(ID)
|
|
DENS0(ID)=DENS(ID)
|
|
an0(id)=dens(id)/wmm(id)+elec(id)
|
|
END DO
|
|
CALL TDPINI
|
|
DO ID=1,ND
|
|
T=TEMP(ID)
|
|
if(ifprad.gt.0) then
|
|
if(idisk.eq.0) then
|
|
if(id.eq.1) then
|
|
pgs(id)=dm(id)*(grav-grd(id)*(un+4.*delt))
|
|
else
|
|
pgs(id)=pgs(id-1)+grav*(dm(id)-dm(id-1))
|
|
* -pck*grd(id)*(un+4.*delt)
|
|
end if
|
|
end if
|
|
end if
|
|
end do
|
|
|
|
do id=1,nd
|
|
t=temp(id)
|
|
an=pgs(id)/bolk/t
|
|
if(idisk.gt.0) an=antp(id)
|
|
c IF(LTE) THEN
|
|
CALL ELDENS(ID,T,AN,ANE,ENRG,ENTT,WM,1)
|
|
c ELSE
|
|
c ANE=AN*ELERAT(ID)
|
|
c END IF
|
|
RHO=WMM(ID)*(AN-ANE)
|
|
DENS(ID)=RHO
|
|
ELEC(ID)=ANE
|
|
CALL WNSTOR(ID)
|
|
IF(LTE.OR.IFMOL.GT.0) THEN
|
|
CALL STEQEQ(ID,POP,1)
|
|
ELSE
|
|
CALL SABOLF(ID)
|
|
CALL RATMAL(ID,AES,BES)
|
|
CALL LEVSOL(AES,BES,POPLTE,IIFOR,NLEVEL,0)
|
|
DO I=1,NLEVEL
|
|
POPUL(I,ID)=POPLTE(I)*BFABS(I,ID)
|
|
END DO
|
|
END IF
|
|
END DO
|
|
CALL OPAINI(1)
|
|
IOPLY0=IOPLYM
|
|
IOPLYM=0
|
|
DO IJP=1,NFREQ
|
|
CALL OPACF1(IJP)
|
|
DO ID=1,ND
|
|
ABSOPP(IJP,ID)=ABSO1(ID)/DENS(ID)
|
|
EMISPP(IJP,ID)=EMIS1(ID)/DENS(ID)
|
|
SCATPP(IJP,ID)=SCAT1(ID)/DENS(ID)
|
|
END DO
|
|
END DO
|
|
IOPLYM=IOPLY0
|
|
C
|
|
C reset the original structural parameters
|
|
C
|
|
DO ID=1,ND
|
|
TEMP(ID)=TEMP(ID)/(UN+DELT)
|
|
END DO
|
|
CALL TDPINI
|
|
c
|
|
IF(IDISK.EQ.0) THEN
|
|
DO ID=1,ND
|
|
ELEC(ID)=ELEC0(ID)
|
|
DENS(ID)=DENS0(ID)
|
|
T=TEMP(ID)
|
|
AN=DENS0(ID)/WMM(ID)+ELEC0(ID)
|
|
PGS(ID)=AN*BOLK*T
|
|
END DO
|
|
ELSE
|
|
call pgset(1)
|
|
DO ID=1,ND
|
|
T=TEMP(ID)
|
|
AN=ANTP(ID)
|
|
CALL ELDENS(ID,T,AN,ANE,ENRG,ENTT,WM,1)
|
|
RHO=WMM(ID)*(AN-ANE)
|
|
DENS(ID)=RHO
|
|
ELEC(ID)=ANE
|
|
PGS(ID)=AN*BOLK*T
|
|
END DO
|
|
END IF
|
|
DO ID=1,ND
|
|
CALL WNSTOR(ID)
|
|
CALL STEQEQ(ID,POP,1)
|
|
c DO I=1,NLEVEL
|
|
c POPUL(I,ID)=POPUL0(I,ID)
|
|
c END DO
|
|
END DO
|
|
CALL OPAINI(1)
|
|
END IF
|
|
C
|
|
C opacity at the original T, and derivatives
|
|
C
|
|
CALL OPACF1(IJ)
|
|
DO ID=1,ND
|
|
ABSO1(ID)=ABSO1(ID)/DENS(ID)
|
|
SCAT1(ID)=SCAT1(ID)/DENS(ID)
|
|
EMIS1(ID)=EMIS1(ID)/DENS(ID)
|
|
DABT1(ID)=(ABSOPP(IJ,ID)-ABSO1(ID))/T/DELT
|
|
DSCT1(ID)=(SCATPP(IJ,ID)-SCAT1(ID))/T/DELT
|
|
XKF(ID)=EXP(-HKT1(ID)*FREQ(IJ))
|
|
XKF1(ID)=UN-XKF(ID)
|
|
XKFB(ID)=XKF(ID)*BNUE(IJ)
|
|
IF(LTE.OR.IFMOL.GT.0) THEN
|
|
PLAN=XKFB(ID)/XKF1(ID)
|
|
DPLAN=PLAN/XKF1(ID)*HKT1(ID)*FREQ(IJ)/TEMP(ID)
|
|
DEMT1(ID)=(DABT1(ID)-DSCT1(ID))*PLAN+
|
|
* (ABSO1(ID)-SCAT1(ID))*DPLAN
|
|
ELSE
|
|
DEMT1(ID)=(EMISPP(IJ,ID)-EMIS1(ID))/T/DELT
|
|
END IF
|
|
END DO
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C ******************************************************************
|
|
C
|
|
C
|
|
|
|
SUBROUTINE RYBHEQ
|
|
C =================
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
common/grdpra/GRD(MDEPTH),pra(mdepth),pgs0(mdepth),ANTP(MDEPTH)
|
|
common/rybpgs/CS(MDEPTH),PRAD2D(MDEPTH),F1HE
|
|
dimension pradfc(mdepth)
|
|
c
|
|
DO ID=1,ND
|
|
GRD(ID)=0.
|
|
pra(id)=0.
|
|
pradt(id)=0.
|
|
pradfc(id)=0.
|
|
END DO
|
|
PRD0=0.
|
|
c
|
|
if(ifprad.gt.0) then
|
|
CALL OPAINI(1)
|
|
DO IJ=1,NFREQ
|
|
CALL OPACF1(IJ)
|
|
CALL RTEFR1(IJ)
|
|
if(.not.lskip(1,ij))
|
|
* GRD(1)=GRD(1)+W(IJ)*ABSO1(1)*FH(IJ)*RAD1(1)
|
|
DO ID=2,ND
|
|
if(.not.lskip(id,ij)) then
|
|
GRD(ID)=GRD(ID)+(RAD1(ID)*FAK1(ID)-
|
|
* RAD1(ID-1)*FAK1(ID-1))*W(IJ)
|
|
pra(id)=pra(id)+RAD1(ID)*FAK1(ID)*W(IJ)
|
|
end if
|
|
END DO
|
|
pra(1)=pra(1)+RAD1(1)*FAK1(1)*W(IJ)-ABSO1(1)*W(IJ)*
|
|
* (RAD1(1)*FH(IJ)-HEXTRD(IJ))
|
|
END DO
|
|
if(idisk.eq.0) then
|
|
GRD(1)=PCK*GRD(1)/DENS(1)
|
|
else
|
|
grd(1)=pck*grd(2)
|
|
end if
|
|
PRD0=PRD0*DENS(1)*DM(1)*PCK
|
|
c
|
|
do id=1,nd
|
|
pra(id)=pra(id)*pck
|
|
pradt(id)=pra(id)
|
|
pradfc(id)=pra(id)/(2.5213e-15*temp(id)**4)
|
|
end do
|
|
C
|
|
do id=2,nd-1
|
|
dmm=un/(dm(id)-dm(id-1))
|
|
dmp=un/(dm(id+1)-dm(id))
|
|
dm0=two/(dm(id+1)-dm(id-1))
|
|
qq=((pra(id+1)-pra(id))*dmp-(pra(id)-pra(id-1))*dmm)*dm0
|
|
prad2d(id)=qq
|
|
end do
|
|
prad2d(1)=prad2d(2)
|
|
prad2d(nd)=0.
|
|
end if
|
|
c
|
|
if(idisk.eq.0) then
|
|
PGS0(1)=DM(1)*(GRAV-GRD(1))
|
|
DO ID=2,ND
|
|
PGS0(ID)=PGS0(ID-1)-PCK*GRD(ID)+GRAV*(DM(ID)-DM(ID-1))
|
|
END DO
|
|
else
|
|
pgs0(1)=pgs(1)
|
|
do id=2,nd
|
|
grv=(dm(id)-dm(id-1))*qgrav*(zd(id)+zd(id-1))*half
|
|
pgs0(id)=pgs0(id-1)-pck*grd(id)+grv
|
|
end do
|
|
end if
|
|
if(iprybh.gt.0) write(6,603) iter
|
|
603 format(/' rybheq in iter',i4,
|
|
* ' dm,dens,pgs0,pra,pradfc,grd,grad,ggrav'/)
|
|
c
|
|
if(iprybh.gt.0) then
|
|
do id=1,nd
|
|
if(id.eq.1) then
|
|
gra=grd(id)
|
|
ggr=qgrav*zd(id)
|
|
else
|
|
gra=pck*grd(id)/(dm(id)-dm(id-1))
|
|
ggr=qgrav*(zd(id)+zd(id-1))*half
|
|
end if
|
|
if(idisk.eq.0) then
|
|
write(6,604) id,dm(id),dens(id),pgs0(id),pra(id),
|
|
* pradfc(id),grd(id),gra
|
|
else
|
|
write(6,604) id,dm(id),dens(id),pgs0(id),pra(id),
|
|
* pradfc(id),grd(id),gra,ggr,zd(id)
|
|
end if
|
|
end do
|
|
end if
|
|
604 format(i4,1p9e13.4)
|
|
C
|
|
if(idisk.eq.0) then
|
|
DO ID=1,ND
|
|
T=TEMP(ID)
|
|
pgs(id)=pgs0(id)
|
|
AN=PGS(ID)/BOLK/T
|
|
CALL ELDENS(ID,T,AN,ANE,ENRG,ENTT,WM,1)
|
|
RHO=WMM(ID)*(AN-ANE)
|
|
DENS(ID)=RHO
|
|
ELEC(ID)=ANE
|
|
CALL WNSTOR(ID)
|
|
CALL STEQEQ(ID,POP,1)
|
|
c IF(.NOT.LCHC.and.iter.lt.ielcor) CALL ELCOR(ID)
|
|
END DO
|
|
else
|
|
c
|
|
c --------------------------
|
|
c the rest is only for disks
|
|
c --------------------------
|
|
c
|
|
cprad=2.5213e-15
|
|
do id=1,nd
|
|
cs(id)=pgs0(id)/dens(id)/temp(id)
|
|
c pi(id)=cprad*pradfc(id)
|
|
end do
|
|
c
|
|
hr1=grd(1)/qgrav
|
|
hg1=sqrt(two*cs(1)*temp(1)/qgrav)
|
|
x=(zd(1)-hr1)/hg1
|
|
IF(X.LT.3.) THEN
|
|
IF(X.LT.0.) X=0.
|
|
F1HE=8.86226925D-1*EXP(X*X)*ERFCX(X)
|
|
ELSE
|
|
F1HE=HALF*(UN-HALF/X/X)/X
|
|
END IF
|
|
c
|
|
ntemp=2
|
|
call pgset(ntemp)
|
|
c
|
|
do id=1,nd
|
|
pgs(id)=pgs0(id)
|
|
ptotal(id)=pgs0(id)+pra(id)
|
|
end do
|
|
c
|
|
END IF
|
|
C
|
|
RETURN
|
|
END
|
|
c
|
|
c
|
|
c *****************************************************************
|
|
c
|
|
c
|
|
subroutine pgset(ntemp)
|
|
c =======================
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ITERAT.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
common/grdpra/GRD(MDEPTH),pra(mdepth),pgs0(mdepth),ANTP(MDEPTH)
|
|
common/rybpgs/CS(MDEPTH),PRAD2D(MDEPTH),F1HE
|
|
dimension a(mdepth),b(mdepth),c(mdepth),v(mdepth),
|
|
* p(mdepth),pnew(mdepth),delp(mdepth)
|
|
dimension temp0(mdepth),pg0(mdepth)
|
|
C
|
|
do id=1,nd
|
|
p(id)=pgs0(id)
|
|
temp0(id)=temp(id)
|
|
end do
|
|
c
|
|
item=0
|
|
10 continue
|
|
item=item+1
|
|
c
|
|
itp=0
|
|
20 continue
|
|
itp=itp+1
|
|
c
|
|
id=1
|
|
b(id)=un
|
|
v(id)=dm(1)*sqrt(cs(id)*temp(id)*qgrav*half)/f1he-p(id)
|
|
do id=2,nd-1
|
|
dmm=un/(dm(id)-dm(id-1))
|
|
dmp=un/(dm(id+1)-dm(id))
|
|
dm0=two/(dm(id+1)-dm(id-1))
|
|
alp=dmm*dm0
|
|
gam=dmp*dm0
|
|
bet=alp+gam
|
|
QQ=PRAD2D(ID)
|
|
a(id)=p(id)*alp
|
|
c(id)=p(id)*gam
|
|
b(id)=p(id-1)*alp+p(id+1)*gam-two*p(id)*bet+qq
|
|
v(id)=-p(id-1)*p(id)*alp-p(id+1)*p(id)*gam+p(id)**2*bet-
|
|
* p(id)*qq-cs(id)*temp(id)*qgrav
|
|
end do
|
|
c
|
|
id=nd
|
|
alp=two/(dm(id)-dm(id-1))**2
|
|
a(id)=alp*p(id)
|
|
b(id)=alp*(p(id-1)-two*p(id))
|
|
v(id)=alp*p(id)*(p(id)-p(id-1))-cs(id)*temp(id)*qgrav
|
|
c
|
|
call tridag(a,b,c,v,delp,nd)
|
|
c
|
|
pdmax=0.
|
|
do id=1,nd
|
|
pnew(id)=p(id)+delp(id)
|
|
pd=(pnew(id)-p(id))/p(id)
|
|
pnew(id)=max(pnew(id),0.5*p(id))
|
|
pdmax=max(pdmax,abs(pd))
|
|
c if(ippgst.ge.2) write(6,602) iter,item,itp,id,p(id),pnew(id),pd
|
|
c 602 format('pgset',4i4,1p3e12.4)
|
|
p(id)=pnew(id)
|
|
end do
|
|
c if(ippgst.ge.1) write(6,606) iter,item,itp,pdmax
|
|
c 606 format('pgset iter,itp,pdmax:',3i4,1pe10.2)
|
|
c
|
|
if(itp.lt.30.and.pdmax.gt.1.e-4) go to 20
|
|
c
|
|
if(item.lt.ntemp) then
|
|
do id=1,nd
|
|
temp0(id)=temp(id)
|
|
pg0(id)=p(id)
|
|
temp(id)=temp(id)*1.01
|
|
end do
|
|
go to 10
|
|
end if
|
|
c
|
|
do id=1,nd
|
|
antp(id)=p(id)/bolk/temp(id)
|
|
ant0=pg0(id)/bolk/temp0(id)
|
|
temp(id)=temp0(id)
|
|
c if(ippgst.ge.2)
|
|
c * write(6,605) iter,id,pg0(id),p(id),p(id)/pg0(id)
|
|
c 605 format('new P',2i4,1p2e12.4,0p2f10.4)
|
|
end do
|
|
if(ntemp.eq.1) then
|
|
do id=1,nd
|
|
pgs0(id)=p(id)
|
|
end do
|
|
end if
|
|
c
|
|
return
|
|
end
|
|
|
|
c
|
|
c
|
|
c *****************************************************************
|
|
c
|
|
c
|
|
|
|
SUBROUTINE locate(xx,n,x,j,nxdim)
|
|
c =================================
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
dimension xx(nxdim)
|
|
c
|
|
jl=0
|
|
ju=n+1
|
|
10 if(ju-jl.gt.1) then
|
|
jm=(ju+jl)/2
|
|
if((xx(n).ge.xx(1)).eqv.(x.ge.xx(jm)))then
|
|
jl=jm
|
|
else
|
|
ju=jm
|
|
endif
|
|
go to 10
|
|
end if
|
|
if(x.eq.xx(1)) then
|
|
j=1
|
|
else if(x.eq.xx(n)) then
|
|
j=n-1
|
|
else
|
|
j=jl
|
|
endif
|
|
return
|
|
END
|
|
|
|
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE XENINI
|
|
C =================
|
|
C
|
|
C Initializes necessary arrays for evaluating hydrogen line profiles
|
|
C from the XENOMORPH tables
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
C
|
|
DO I=1,4
|
|
DO J=1,22
|
|
ILXEN(I,J)=0
|
|
END DO
|
|
END DO
|
|
if(ihxenb.gt.0) then
|
|
IHXENB=23
|
|
ihxenr=ihxenb+1
|
|
open(unit=ihxenb,file='xenomorph.blue.dat',status='old')
|
|
open(unit=ihxenr,file='xenomorph.red.dat',status='old')
|
|
write(6,641) ihxenb,ihxenr
|
|
else
|
|
return
|
|
end if
|
|
c
|
|
641 format(' -----------'/
|
|
* ' reading XENOMORPH tables; ihxen =',2i3,/
|
|
* ' -----------')
|
|
C
|
|
C ---------------------------------
|
|
C read tables - blue wing
|
|
C ---------------------------------
|
|
C
|
|
ILINE=0
|
|
READ(IHXENB,*) NTAB
|
|
DO ITAB=1,NTAB
|
|
ILINEB=ILINE
|
|
READ(IHXENB,*) NLXEN
|
|
DO ILI=1,NLXEN
|
|
ILINE=ILINE+1
|
|
READ(IHXENB,*) I,J,ALMIN,ANEMIN,TMIN,DLA,DLE,DLT,
|
|
* NWL,NE,NT
|
|
XNEMIN=ANEMIN
|
|
ILXEN(I,J)=ILINE
|
|
NWLXEN(ILINE)=NWL
|
|
NTHXEN(ILINE)=NT
|
|
NEHXEN(ILINE)=NE
|
|
DO IWL=1,NWL
|
|
ALXEN(ILINE,IWL)=ALMIN+(IWL-1)*DLA
|
|
END DO
|
|
DO INE=1,NE
|
|
XNEXEN(INE,ILINE)=ANEMIN+(INE-1)*DLE
|
|
END DO
|
|
DO IT=1,NT
|
|
XTXEN(IT,ILINE)=TMIN+(IT-1)*DLT
|
|
END DO
|
|
END DO
|
|
c
|
|
DO ILI=1,NLXEN
|
|
ILNE=ILINEB+ILI
|
|
NWL=NWLXEN(ILNE)
|
|
READ(IHXENB,500)
|
|
DO INE=1,NEHXEN(ILNE)
|
|
DO IT=1,NTHXEN(ILNE)
|
|
READ(IHXENB,*) QLT,(PRFXB(ILNE,IWL,IT,INE),IWL=1,NWL)
|
|
END DO
|
|
END DO
|
|
C
|
|
END DO
|
|
END DO
|
|
CLOSE(IHXENB)
|
|
500 FORMAT(1X)
|
|
C
|
|
C ---------------------------------
|
|
C read tables - red wing
|
|
C ---------------------------------
|
|
C
|
|
ILINE=0
|
|
READ(IHXENR,*) NTAB
|
|
DO ITAB=1,NTAB
|
|
ILINEB=ILINE
|
|
READ(IHXENR,*) NLXEN
|
|
DO ILI=1,NLXEN
|
|
ILINE=ILINE+1
|
|
READ(IHXENR,*) I,J,ALMIN,ANEMIN,TMIN,DLA,DLE,DLT,
|
|
* NWL,NE,NT
|
|
END DO
|
|
c
|
|
DO ILI=1,NLXEN
|
|
ILNE=ILINEB+ILI
|
|
NWL=NWLXEN(ILNE)
|
|
READ(IHXENR,500)
|
|
DO INE=1,NEHXEN(ILNE)
|
|
DO IT=1,NTHXEN(ILNE)
|
|
READ(IHXENR,*) QLT,(PRFXR(ILNE,IWL,IT,INE),IWL=1,NWL)
|
|
END DO
|
|
END DO
|
|
C
|
|
END DO
|
|
END DO
|
|
CLOSE(IHXENR)
|
|
C
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE INTXEN(W0B,W0R,X0,Z0,IWL,ILINE,id)
|
|
C =============================================
|
|
C
|
|
C Interpolation in temperature and electron density from the
|
|
C Xenomorph tables for hydrogen lines to the actual valus of
|
|
C temperature and electron density
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
DIMENSION ZZ(3),XX(3),WXB(3),WZB(3),WXR(3),WZR(3)
|
|
C
|
|
id1=id
|
|
NX=2
|
|
NZ=2
|
|
NT=NTHXEN(ILINE)
|
|
NE=NEHXEN(ILINE)
|
|
C
|
|
DO IZZ=1,NE-1
|
|
IPZ=IZZ
|
|
IF(Z0.LE.XNEXEN(IZZ+1,ILINE)) GO TO 20
|
|
END DO
|
|
20 N0Z=IPZ-NZ/2+1
|
|
IF(N0Z.LT.1) N0Z=1
|
|
IF(N0Z.GT.NE-NZ+1) N0Z=NE-NZ+1
|
|
N1Z=N0Z+NZ-1
|
|
C
|
|
DO IZZ=N0Z,N1Z
|
|
I0Z=IZZ-N0Z+1
|
|
ZZ(I0Z)=XNEXEN(IZZ,ILINE)
|
|
DO IX=1,NT-1
|
|
IPX=IX
|
|
IF(X0.LE.XTXEN(IX+1,ILINE)) GO TO 40
|
|
END DO
|
|
40 N0X=IPX-NX/2+1
|
|
IF(N0X.LT.1) N0X=1
|
|
IF(N0X.GT.NT-NX+1) N0X=NT-NX+1
|
|
N1X=N0X+NX-1
|
|
DO IX=N0X,N1X
|
|
I0=IX-N0X+1
|
|
XX(I0)=XTXEN(IX,ILINE)
|
|
WXB(I0)=PRFXB(ILINE,IWL,IX,IZZ)
|
|
WXR(I0)=PRFXR(ILINE,IWL,IX,IZZ)
|
|
END DO
|
|
WZB(I0Z)=YINT(XX,WXB,X0)
|
|
WZR(I0Z)=YINT(XX,WXR,X0)
|
|
END DO
|
|
W0B=YINT(ZZ,WZB,Z0)
|
|
W0R=YINT(ZZ,WZR,Z0)
|
|
RETURN
|
|
END
|
|
|
|
C
|
|
C
|
|
C ******************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE GOMINI
|
|
C =================
|
|
C
|
|
C Initialization and reading of the opacity table for thermal processe
|
|
C and Rayleigh scattering
|
|
c raytab: scattering opacities in cm^2/gm at 5.0872638d14 Hz (sodium D)
|
|
c (NOTE: Quantities in rayleigh.tab are in log_e)
|
|
C
|
|
c tempvec: array of temperatures
|
|
c nu: array of frequencies
|
|
c table: absorptive opacities in cm^2/gm
|
|
c (NOTE: Quantities in absorption.tab are in log_e)
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
common/intcfg/yint(mfreq),jgint(mfreq)
|
|
c
|
|
dimension absort(mfhtab),frlt(mfhtab)
|
|
c
|
|
if(ihgom.eq.0) return
|
|
C
|
|
open(53,file='gomhyd.dat',status='old')
|
|
c
|
|
read(53,*) nugfreq,nugtemp,nugele
|
|
read(53,*)
|
|
read(53,*) (temvec(i),i=1,nugtemp)
|
|
read(53,*)
|
|
read(53,*) (elevec(j),j=1,nugele)
|
|
do it=1,nugtemp
|
|
temvec(it)=log(temvec(it)*1.161e4)
|
|
end do
|
|
c write(6,600) ihgom,nugfreq,nugtemp,nugele
|
|
c 600 format(' ihgom,nugfr,nugt,nuge ',4i4)
|
|
c
|
|
EGTAB1 = elevec(1)
|
|
EGTAB2 = elevec(nugele)
|
|
TGTAB1 = temvec(1)
|
|
TGTAB2 = temvec(nugtemp)
|
|
c
|
|
do k = 1, nugfreq
|
|
read(53,501) eneev
|
|
frgtab(k)=3.28805e15/13.595*eneev
|
|
frlt(k)=log10(frgtab(k))
|
|
do i = 1, nugtemp
|
|
read(53,*) (hydcrs(i,j,k),j=1,nugele)
|
|
end do
|
|
end do
|
|
501 format(40x,f17.14)
|
|
close(53)
|
|
c
|
|
FRGTB1 = log10(frgtab(1))
|
|
FRGTB2 = log10(frgtab(nugfreq))
|
|
c
|
|
c interpolate HYDCRS from tabular to actual frequencies
|
|
c
|
|
c set up interpolation coefficients for frequency interpolation
|
|
c by bisection
|
|
c
|
|
frg1=frgtab(1)
|
|
frg2=frgtab(nugfreq)
|
|
do ij=1,nfreq
|
|
jgint(ij)=0
|
|
xint=freq(ij)
|
|
if(xint.ge.frg1.and.xint.le.frg2) then
|
|
jl=0
|
|
ju=nugfreq+1
|
|
40 continue
|
|
if(ju-jl.gt.1) then
|
|
jm=(ju+jl)/2
|
|
if((frg2.gt.frg1).eqv.(xint.gt.frgtab(jm))) then
|
|
jl=jm
|
|
else
|
|
ju=jm
|
|
end if
|
|
go to 40
|
|
end if
|
|
j=jl
|
|
if(j.eq.nugfreq) j=j-1
|
|
if(j.eq.0) j=j+1
|
|
jgint(ij)=j
|
|
yint(ij)=un/log10(frgtab(j+1)/frgtab(j))
|
|
end if
|
|
end do
|
|
c
|
|
do it=1,nugtemp
|
|
do ir=1,nugele
|
|
do k=1,nugfreq
|
|
absort(k)=log(hydcrs(it,ir,k))
|
|
end do
|
|
do ij=1,nfreq
|
|
j=jgint(ij)
|
|
hydcrs(it,ir,ij)=0.
|
|
if(j.gt.0) then
|
|
rc=(absort(j+1)-absort(j))*yint(ij)
|
|
hcs=rc*log10(freq(ij)/frgtab(j))+absort(j)
|
|
hydcrs(it,ir,ij)=hcs
|
|
end if
|
|
end do
|
|
end do
|
|
end do
|
|
c
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
SUBROUTINE GHYDOP(IJ)
|
|
C =====================
|
|
c
|
|
c hydrogen opacity -lines + pseudocontinuum from Gomez tables
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
common/intcfg/yint(mfreq),jgint(mfreq)
|
|
c
|
|
if(ihgom.eq.0.or.jgint(ij).eq.0) return
|
|
jf=ij
|
|
do 10 id=1,nd
|
|
if(elec(id).lt.HGLIM) go to 10
|
|
rl=log(elec(id))
|
|
tl=log(temp(id))
|
|
c
|
|
DELTAR=(RL-EGTAB1)/(EGTAB2-EGTAB1)*FLOAT(nugele-1)
|
|
JR = 1 + IDINT(DELTAR)
|
|
IF(JR.LT.1) JR = 1
|
|
IF(JR.GT.(nugele-1)) JR = nugele-1
|
|
r1i=elevec(jr)
|
|
r2i=elevec(jr+1)
|
|
dri=(RL-R1i)/(R2i-R1i)
|
|
if(JR .eq. 1) dri = 0.d0
|
|
C
|
|
DELTAT=(TL-TGTAB1)/(TGTAB2-TGTAB1)*FLOAT(nugtemp-1)
|
|
JT = 1 + IDINT(DELTAT)
|
|
IF(JT.LT.1) JT = 1
|
|
IF(JT.GT.nugtemp-1) JT = nugtemp-1
|
|
t1i=temvec(jt)
|
|
t2i=temvec(jt+1)
|
|
dti=(TL-T1i)/(T2i-T1i)
|
|
if(JT .eq. 1) dti = 0.d0
|
|
C
|
|
opr1=hydcrs(jt,jr,jf)+dti*
|
|
* (hydcrs(jt+1,jr,jf)-hydcrs(jt,jr,jf))
|
|
opr2=hydcrs(jt,jr+1,jf)+dti*
|
|
* (hydcrs(jt+1,jr+1,jf)-hydcrs(jt,jr+1,jf))
|
|
opac=opr1+dri*(opr2-opr1)
|
|
ab = exp(opac)*0.0265*4.1347e-15
|
|
c
|
|
if(freq(ij).gt.8.22013e14) then
|
|
ii=nfirst(ielh)
|
|
else
|
|
ii=nfirst(ielh)+1
|
|
end if
|
|
c
|
|
oph=ab*popul(ii,id)*g(ii)
|
|
abso1(id)=abso1(id)+oph
|
|
emis1(id)=emis1(id)+oph*xkfb(id)/xkf1(id)
|
|
10 continue
|
|
c
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION SBFCH(FR,T)
|
|
C ====================
|
|
C
|
|
C cross-section times partition function for CH
|
|
C
|
|
C from Kurucz ATLAS9
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
parameter (fihu=500.,fihui=1./fihu,
|
|
* twhu=200.,twhui=1./twhu,
|
|
* tenl=2.30258509299405E0)
|
|
c
|
|
DIMENSION CROSSCH(15,105),PARTCH(41),CROSSCHT(15)
|
|
DIMENSION C1(150),C2(150),C3(150),C4(150),C5(150)
|
|
DIMENSION C6(150),C7(150),C8(150),C9(150),C10(150)
|
|
DIMENSION C11(75)
|
|
C
|
|
EQUIVALENCE (CROSSCH(1, 1),C1(1)),(CROSSCH(1,11),C2(1))
|
|
EQUIVALENCE (CROSSCH(1,21),C3(1)),(CROSSCH(1,31),C4(1))
|
|
EQUIVALENCE (CROSSCH(1,41),C5(1)),(CROSSCH(1,51),C6(1))
|
|
EQUIVALENCE (CROSSCH(1,61),C7(1)),(CROSSCH(1,71),C8(1))
|
|
EQUIVALENCE (CROSSCH(1,81),C9(1)),(CROSSCH(1,91),C10(1))
|
|
EQUIVALENCE (CROSSCH(1,101),C11(1))
|
|
C
|
|
DATA C1/-38.000,-38.000,-38.000,-38.000,-38.000,-38.000,-38.000,
|
|
1-38.000,-38.000,-38.000,-38.000,-38.000,-38.000,-38.000,-38.000,
|
|
2 -32.727,-31.151,-30.133,-29.432,-28.925,-28.547,-28.257,
|
|
2-28.030,-27.848,-27.701,-27.580,-27.479,-27.395,-27.322,-27.261,
|
|
3 -31.588,-30.011,-28.993,-28.290,-27.784,-27.405,-27.115,
|
|
3-26.887,-26.705,-26.558,-26.437,-26.336,-26.251,-26.179,-26.117,
|
|
4 -30.407,-28.830,-27.811,-27.108,-26.601,-26.223,-25.932,
|
|
4-25.705,-25.523,-25.376,-25.255,-25.154,-25.069,-24.997,-24.935,
|
|
5 -29.513,-27.937,-26.920,-26.218,-25.712,-25.334,-25.043,
|
|
5-24.816,-24.635,-24.487,-24.366,-24.266,-24.181,-24.109,-24.047,
|
|
6 -28.910,-27.341,-26.327,-25.628,-25.123,-24.746,-24.457,
|
|
6-24.230,-24.049,-23.902,-23.782,-23.681,-23.597,-23.525,-23.464,
|
|
7 -28.517,-26.961,-25.955,-25.261,-24.760,-24.385,-24.098,
|
|
7-23.873,-23.694,-23.548,-23.429,-23.329,-23.245,-23.174,-23.113,
|
|
8 -28.213,-26.675,-25.680,-24.993,-24.497,-24.127,-23.843,
|
|
8-23.620,-23.443,-23.299,-23.181,-23.082,-22.999,-22.929,-22.869,
|
|
9 -27.942,-26.427,-25.446,-24.769,-24.280,-23.915,-23.635,
|
|
9-23.416,-23.241,-23.100,-22.983,-22.887,-22.805,-22.736,-22.677,
|
|
A -27.706,-26.210,-25.241,-24.572,-24.088,-23.728,-23.451,
|
|
A-23.235,-23.063,-22.923,-22.808,-22.713,-22.633,-22.565,-22.507/
|
|
DATA C2/-27.475,-26.000,-25.043,-24.382,-23.905,-23.548,-23.275,
|
|
1-23.062,-22.891,-22.753,-22.640,-22.546,-22.467,-22.400,-22.343,
|
|
2 -27.221,-25.783,-24.844,-24.193,-23.723,-23.372,-23.102,
|
|
2-22.892,-22.724,-22.588,-22.476,-22.384,-22.306,-22.240,-22.184,
|
|
3 -26.863,-25.506,-24.607,-23.979,-23.523,-23.182,-22.919,
|
|
3-22.714,-22.550,-22.417,-22.309,-22.218,-22.142,-22.078,-22.023,
|
|
4 -26.685,-25.347,-24.457,-23.835,-23.382,-23.044,-22.784,
|
|
4-22.580,-22.418,-22.286,-22.178,-22.089,-22.014,-21.950,-21.896,
|
|
5 -26.085,-24.903,-24.105,-23.538,-23.120,-22.805,-22.561,
|
|
5-22.370,-22.217,-22.093,-21.991,-21.906,-21.835,-21.775,-21.723,
|
|
6 -25.902,-24.727,-23.936,-23.376,-22.964,-22.654,-22.415,
|
|
6-22.227,-22.076,-21.955,-21.855,-21.772,-21.702,-21.644,-21.593,
|
|
7 -25.215,-24.196,-23.510,-23.019,-22.655,-22.378,-22.163,
|
|
7-21.992,-21.855,-21.744,-21.653,-21.577,-21.513,-21.459,-21.412,
|
|
8 -24.914,-23.937,-23.284,-22.820,-22.475,-22.212,-22.007,
|
|
8-21.845,-21.715,-21.609,-21.522,-21.449,-21.388,-21.336,-21.292,
|
|
9 -24.519,-23.637,-23.039,-22.606,-22.281,-22.030,-21.834,
|
|
9-21.678,-21.552,-21.450,-21.365,-21.295,-21.236,-21.185,-21.142,
|
|
A -24.086,-23.222,-22.650,-22.246,-21.948,-21.722,-21.546,
|
|
A-21.407,-21.296,-21.205,-21.131,-21.070,-21.018,-20.974,-20.937/
|
|
DATA C3/-23.850,-23.018,-22.472,-22.088,-21.805,-21.590,-21.422,
|
|
1-21.289,-21.182,-21.095,-21.024,-20.964,-20.914,-20.872,-20.835,
|
|
2 -23.136,-22.445,-21.994,-21.676,-21.440,-21.259,-21.117,
|
|
2-21.004,-20.912,-20.837,-20.775,-20.723,-20.679,-20.642,-20.611,
|
|
3 -23.199,-22.433,-21.927,-21.573,-21.314,-21.119,-20.969,
|
|
3-20.851,-20.758,-20.682,-20.621,-20.571,-20.529,-20.493,-20.463,
|
|
4 -22.696,-22.020,-21.585,-21.286,-21.071,-20.912,-20.791,
|
|
4-20.697,-20.622,-20.563,-20.514,-20.475,-20.442,-20.414,-20.391,
|
|
5 -22.119,-21.557,-21.194,-20.943,-20.761,-20.624,-20.518,
|
|
5-20.434,-20.367,-20.313,-20.268,-20.231,-20.201,-20.175,-20.153,
|
|
6 -21.855,-21.300,-20.931,-20.673,-20.485,-20.344,-20.235,
|
|
6-20.151,-20.084,-20.031,-19.988,-19.953,-19.924,-19.900,-19.880,
|
|
7 -21.126,-20.673,-20.382,-20.184,-20.044,-19.943,-19.868,
|
|
7-19.811,-19.769,-19.736,-19.710,-19.690,-19.674,-19.662,-19.652,
|
|
8 -20.502,-20.150,-19.922,-19.766,-19.657,-19.578,-19.520,
|
|
8-19.478,-19.446,-19.422,-19.404,-19.390,-19.379,-19.371,-19.365,
|
|
9 -20.030,-19.724,-19.530,-19.399,-19.309,-19.245,-19.199,
|
|
9-19.166,-19.142,-19.125,-19.112,-19.103,-19.096,-19.091,-19.088,
|
|
A -19.640,-19.364,-19.189,-19.074,-18.996,-18.943,-18.906,
|
|
A-18.881,-18.863,-18.852,-18.844,-18.839,-18.837,-18.836,-18.836/
|
|
DATA C4/-19.333,-19.092,-18.939,-18.838,-18.770,-18.725,-18.695,
|
|
1-18.675,-18.662,-18.655,-18.651,-18.649,-18.649,-18.651,-18.653,
|
|
2 -19.070,-18.880,-18.756,-18.674,-18.621,-18.585,-18.562,
|
|
2-18.548,-18.540,-18.536,-18.536,-18.537,-18.539,-18.542,-18.546,
|
|
3 -18.851,-18.708,-18.617,-18.558,-18.521,-18.498,-18.484,
|
|
3-18.477,-18.475,-18.476,-18.478,-18.482,-18.487,-18.493,-18.498,
|
|
4 -18.709,-18.599,-18.533,-18.494,-18.471,-18.459,-18.454,
|
|
4-18.454,-18.457,-18.462,-18.469,-18.476,-18.483,-18.490,-18.498,
|
|
5 -18.656,-18.572,-18.524,-18.497,-18.485,-18.480,-18.482,
|
|
5-18.486,-18.493,-18.501,-18.510,-18.519,-18.527,-18.536,-18.544,
|
|
6 -18.670,-18.613,-18.582,-18.566,-18.561,-18.562,-18.568,
|
|
6-18.575,-18.583,-18.592,-18.601,-18.610,-18.619,-18.627,-18.635,
|
|
7 -18.728,-18.700,-18.687,-18.683,-18.685,-18.691,-18.698,
|
|
7-18.706,-18.715,-18.723,-18.731,-18.739,-18.745,-18.752,-18.758,
|
|
8 -18.839,-18.835,-18.836,-18.842,-18.849,-18.857,-18.865,
|
|
8-18.872,-18.878,-18.883,-18.888,-18.892,-18.895,-18.898,-18.900,
|
|
9 -19.034,-19.041,-19.049,-19.057,-19.064,-19.069,-19.071,
|
|
9-19.071,-19.070,-19.068,-19.065,-19.061,-19.058,-19.054,-19.051,
|
|
A -19.372,-19.378,-19.382,-19.380,-19.372,-19.359,-19.341,
|
|
A-19.321,-19.300,-19.280,-19.261,-19.243,-19.227,-19.212,-19.199/
|
|
DATA C5/-19.780,-19.777,-19.763,-19.732,-19.686,-19.631,-19.573,
|
|
1-19.517,-19.465,-19.419,-19.379,-19.344,-19.314,-19.288,-19.265,
|
|
2 -20.151,-20.133,-20.087,-20.009,-19.911,-19.810,-19.715,
|
|
2-19.631,-19.559,-19.497,-19.446,-19.402,-19.365,-19.333,-19.306,
|
|
3 -20.525,-20.454,-20.312,-20.138,-19.970,-19.825,-19.705,
|
|
3-19.607,-19.528,-19.464,-19.411,-19.367,-19.330,-19.300,-19.274,
|
|
4 -20.869,-20.655,-20.366,-20.104,-19.894,-19.731,-19.604,
|
|
4-19.505,-19.426,-19.363,-19.312,-19.271,-19.236,-19.208,-19.184,
|
|
5 -21.179,-20.768,-20.380,-20.081,-19.856,-19.686,-19.556,
|
|
5-19.454,-19.375,-19.311,-19.260,-19.218,-19.184,-19.155,-19.131,
|
|
6 -21.167,-20.601,-20.206,-19.925,-19.719,-19.565,-19.447,
|
|
6-19.355,-19.283,-19.226,-19.180,-19.143,-19.112,-19.087,-19.066,
|
|
7 -20.918,-20.348,-19.976,-19.720,-19.536,-19.401,-19.299,
|
|
7-19.220,-19.159,-19.112,-19.073,-19.043,-19.018,-18.998,-18.981,
|
|
8 -20.753,-20.204,-19.847,-19.602,-19.427,-19.299,-19.203,
|
|
8-19.129,-19.072,-19.028,-18.993,-18.965,-18.942,-18.924,-18.909,
|
|
9 -20.456,-19.987,-19.677,-19.460,-19.302,-19.186,-19.098,
|
|
9-19.030,-18.978,-18.937,-18.904,-18.878,-18.857,-18.841,-18.827,
|
|
A -20.154,-19.734,-19.461,-19.272,-19.136,-19.035,-18.960,
|
|
A-18.902,-18.858,-18.824,-18.797,-18.775,-18.759,-18.745,-18.735/
|
|
DATA C6/-19.941,-19.544,-19.288,-19.114,-18.992,-18.903,-18.837,
|
|
1-18.788,-18.751,-18.723,-18.701,-18.684,-18.671,-18.661,-18.654,
|
|
2 -19.657,-19.321,-19.104,-18.956,-18.853,-18.779,-18.724,
|
|
2-18.684,-18.655,-18.632,-18.615,-18.602,-18.592,-18.585,-18.579,
|
|
3 -19.388,-19.109,-18.930,-18.810,-18.725,-18.664,-18.620,
|
|
3-18.586,-18.562,-18.543,-18.529,-18.518,-18.510,-18.503,-18.498,
|
|
4 -19.201,-18.953,-18.794,-18.686,-18.611,-18.556,-18.515,
|
|
4-18.485,-18.462,-18.446,-18.433,-18.423,-18.416,-18.410,-18.406,
|
|
5 -18.923,-18.719,-18.588,-18.500,-18.439,-18.396,-18.365,
|
|
5-18.344,-18.328,-18.318,-18.311,-18.307,-18.304,-18.303,-18.302,
|
|
6 -18.614,-18.458,-18.361,-18.298,-18.258,-18.232,-18.216,
|
|
6-18.206,-18.202,-18.201,-18.202,-18.205,-18.208,-18.213,-18.218,
|
|
7 -18.419,-18.295,-18.222,-18.178,-18.153,-18.139,-18.132,
|
|
7-18.131,-18.133,-18.138,-18.143,-18.150,-18.157,-18.164,-18.172,
|
|
8 -18.296,-18.201,-18.148,-18.118,-18.101,-18.094,-18.091,
|
|
8-18.093,-18.096,-18.101,-18.107,-18.113,-18.120,-18.126,-18.132,
|
|
9 -18.021,-17.992,-17.977,-17.970,-17.967,-17.968,-17.970,
|
|
9-17.974,-17.978,-17.983,-17.989,-17.994,-18.000,-18.005,-18.011,
|
|
A -17.694,-17.686,-17.686,-17.691,-17.698,-17.708,-17.718,
|
|
A-17.729,-17.740,-17.750,-17.761,-17.771,-17.781,-17.790,-17.798/
|
|
DATA C7/-17.374,-17.384,-17.400,-17.420,-17.440,-17.462,-17.483,
|
|
1-17.503,-17.523,-17.541,-17.558,-17.575,-17.590,-17.603,-17.616,
|
|
2 -17.169,-17.199,-17.230,-17.262,-17.293,-17.323,-17.351,
|
|
2-17.378,-17.404,-17.427,-17.449,-17.469,-17.488,-17.505,-17.520,
|
|
3 -17.151,-17.184,-17.217,-17.250,-17.282,-17.313,-17.342,
|
|
3-17.369,-17.395,-17.418,-17.440,-17.461,-17.480,-17.497,-17.513,
|
|
4 -17.230,-17.260,-17.290,-17.320,-17.348,-17.375,-17.401,
|
|
4-17.425,-17.448,-17.469,-17.489,-17.508,-17.525,-17.541,-17.556,
|
|
5 -17.379,-17.403,-17.425,-17.446,-17.467,-17.486,-17.505,
|
|
5-17.524,-17.541,-17.558,-17.574,-17.588,-17.602,-17.615,-17.627,
|
|
6 -17.596,-17.604,-17.609,-17.612,-17.616,-17.622,-17.628,
|
|
6-17.636,-17.644,-17.652,-17.661,-17.670,-17.679,-17.687,-17.695,
|
|
7 -17.846,-17.823,-17.795,-17.770,-17.750,-17.735,-17.725,
|
|
7-17.719,-17.716,-17.715,-17.716,-17.719,-17.722,-17.726,-17.730,
|
|
8 -18.089,-18.015,-17.942,-17.882,-17.836,-17.802,-17.777,
|
|
8-17.760,-17.748,-17.740,-17.736,-17.734,-17.733,-17.734,-17.736,
|
|
9 -18.299,-18.156,-18.038,-17.947,-17.881,-17.833,-17.798,
|
|
9-17.774,-17.757,-17.745,-17.738,-17.733,-17.730,-17.729,-17.729,
|
|
A -18.441,-18.243,-18.096,-17.991,-17.915,-17.860,-17.821,
|
|
A-17.792,-17.772,-17.757,-17.746,-17.738,-17.733,-17.730,-17.728/
|
|
DATA C8/-18.474,-18.262,-18.111,-18.004,-17.926,-17.869,-17.826,
|
|
1-17.795,-17.771,-17.753,-17.740,-17.730,-17.722,-17.717,-17.713,
|
|
2 -18.387,-18.191,-18.053,-17.952,-17.878,-17.823,-17.782,
|
|
2-17.752,-17.729,-17.711,-17.698,-17.689,-17.681,-17.676,-17.672,
|
|
3 -18.161,-17.990,-17.874,-17.793,-17.736,-17.696,-17.668,
|
|
3-17.648,-17.634,-17.625,-17.619,-17.616,-17.614,-17.614,-17.615,
|
|
4 -17.908,-17.774,-17.690,-17.637,-17.604,-17.583,-17.572,
|
|
4-17.567,-17.566,-17.568,-17.571,-17.576,-17.581,-17.587,-17.593,
|
|
5 -17.681,-17.589,-17.540,-17.515,-17.506,-17.505,-17.511,
|
|
5-17.520,-17.530,-17.542,-17.554,-17.566,-17.578,-17.589,-17.600,
|
|
6 -17.647,-17.606,-17.584,-17.575,-17.573,-17.576,-17.582,
|
|
6-17.589,-17.597,-17.605,-17.614,-17.623,-17.631,-17.639,-17.646,
|
|
7 -17.300,-17.291,-17.291,-17.297,-17.307,-17.319,-17.333,
|
|
7-17.347,-17.361,-17.375,-17.389,-17.402,-17.415,-17.427,-17.438,
|
|
8 -16.786,-16.802,-16.825,-16.853,-16.883,-16.914,-16.944,
|
|
8-16.974,-17.003,-17.030,-17.055,-17.079,-17.101,-17.122,-17.141,
|
|
9 -16.489,-16.533,-16.579,-16.625,-16.670,-16.713,-16.754,
|
|
9-16.793,-16.830,-16.864,-16.896,-16.925,-16.952,-16.977,-17.000,
|
|
A -16.694,-16.724,-16.756,-16.789,-16.823,-16.856,-16.888,
|
|
A-16.919,-16.949,-16.976,-17.002,-17.026,-17.048,-17.069,-17.088/
|
|
DATA C9/-16.935,-16.951,-16.971,-16.993,-17.016,-17.040,-17.064,
|
|
1-17.088,-17.111,-17.132,-17.153,-17.172,-17.190,-17.206,-17.222,
|
|
2 -17.200,-17.208,-17.220,-17.235,-17.251,-17.269,-17.286,
|
|
2-17.304,-17.322,-17.338,-17.354,-17.369,-17.384,-17.397,-17.409,
|
|
3 -17.597,-17.591,-17.589,-17.590,-17.594,-17.600,-17.608,
|
|
3-17.617,-17.626,-17.635,-17.645,-17.654,-17.662,-17.671,-17.679,
|
|
4 -18.166,-18.134,-18.107,-18.085,-18.068,-18.056,-18.047,
|
|
4-18.041,-18.038,-18.036,-18.035,-18.035,-18.036,-18.038,-18.039,
|
|
5 -19.000,-18.917,-18.838,-18.770,-18.714,-18.669,-18.632,
|
|
5-18.603,-18.579,-18.560,-18.545,-18.532,-18.522,-18.514,-18.507,
|
|
6 -20.313,-19.982,-19.754,-19.592,-19.472,-19.380,-19.309,
|
|
6-19.253,-19.208,-19.172,-19.143,-19.119,-19.099,-19.083,-19.069,
|
|
7 -19.751,-19.611,-19.520,-19.461,-19.423,-19.398,-19.382,
|
|
7-19.372,-19.366,-19.364,-19.363,-19.364,-19.366,-19.368,-19.371,
|
|
8 -19.581,-19.431,-19.337,-19.277,-19.240,-19.218,-19.207,
|
|
8-19.202,-19.203,-19.207,-19.212,-19.220,-19.228,-19.236,-19.245,
|
|
9 -19.685,-19.506,-19.389,-19.311,-19.258,-19.222,-19.199,
|
|
9-19.184,-19.175,-19.170,-19.168,-19.169,-19.171,-19.174,-19.177,
|
|
A -19.977,-19.756,-19.606,-19.501,-19.425,-19.370,-19.330,
|
|
A-19.300,-19.278,-19.262,-19.250,-19.241,-19.235,-19.230,-19.227/
|
|
DATAC10/-20.445,-20.158,-19.958,-19.815,-19.711,-19.633,-19.574,
|
|
1-19.528,-19.493,-19.465,-19.442,-19.425,-19.410,-19.398,-19.389,
|
|
2 -20.980,-20.625,-20.391,-20.229,-20.110,-20.020,-19.949,
|
|
2-19.892,-19.846,-19.807,-19.775,-19.748,-19.724,-19.704,-19.687,
|
|
3 -21.404,-21.023,-20.771,-20.594,-20.461,-20.358,-20.274,
|
|
3-20.205,-20.148,-20.099,-20.058,-20.022,-19.991,-19.965,-19.942,
|
|
4 -21.309,-20.970,-20.753,-20.603,-20.495,-20.412,-20.348,
|
|
4-20.295,-20.252,-20.215,-20.185,-20.158,-20.135,-20.115,-20.098,
|
|
5 -21.221,-20.906,-20.707,-20.574,-20.480,-20.412,-20.361,
|
|
5-20.322,-20.292,-20.268,-20.249,-20.233,-20.221,-20.210,-20.201,
|
|
6 -21.441,-21.097,-20.878,-20.728,-20.623,-20.546,-20.489,
|
|
6-20.446,-20.413,-20.387,-20.368,-20.352,-20.340,-20.330,-20.322,
|
|
7 -21.668,-21.305,-21.071,-20.911,-20.797,-20.713,-20.650,
|
|
7-20.602,-20.565,-20.536,-20.514,-20.496,-20.481,-20.470,-20.460,
|
|
8 -21.926,-21.556,-21.316,-21.150,-21.031,-20.942,-20.874,
|
|
8-20.822,-20.782,-20.750,-20.724,-20.704,-20.687,-20.674,-20.663,
|
|
9 -22.319,-21.937,-21.686,-21.510,-21.380,-21.282,-21.206,
|
|
9-21.147,-21.099,-21.061,-21.031,-21.006,-20.985,-20.968,-20.954,
|
|
A -22.969,-22.561,-22.288,-22.092,-21.945,-21.832,-21.743,
|
|
A-21.672,-21.616,-21.570,-21.533,-21.503,-21.477,-21.457,-21.439/
|
|
DATAC11/-24.001,-23.527,-23.199,-22.957,-22.772,-22.629,-22.516,
|
|
1-22.427,-22.355,-22.297,-22.250,-22.212,-22.180,-22.153,-22.131,
|
|
2 -24.233,-23.774,-23.477,-23.273,-23.128,-23.022,-22.943,
|
|
2-22.883,-22.837,-22.802,-22.774,-22.752,-22.735,-22.721,-22.710,
|
|
3 -24.550,-23.913,-23.521,-23.266,-23.094,-22.976,-22.893,
|
|
3-22.836,-22.796,-22.768,-22.750,-22.737,-22.730,-22.726,-22.725,
|
|
4 -24.301,-23.665,-23.274,-23.019,-22.848,-22.730,-22.648,
|
|
4-22.591,-22.552,-22.525,-22.507,-22.495,-22.489,-22.485,-22.485,
|
|
5 -24.519,-23.883,-23.491,-23.237,-23.065,-22.948,-22.866,
|
|
5-22.809,-22.770,-22.743,-22.724,-22.713,-22.706,-22.703,-22.702/
|
|
DATA PARTCH/
|
|
1 203.741, 249.643, 299.341, 353.477, 412.607, 477.237,
|
|
2 547.817, 624.786, 708.543, 799.463, 897.912, 1004.227,
|
|
3 1118.738, 1241.761, 1373.588, 1514.481, 1664.677, 1824.394,
|
|
4 1993.801, 2173.050, 2362.234, 2561.424, 2770.674, 2989.930,
|
|
5 3219.204, 3458.378, 3707.355, 3966.005, 4234.155, 4511.604,
|
|
6 4798.135, 5093.554, 5397.593, 5709.948, 6030.401, 6358.646,
|
|
7 6694.379, 7037.313, 7387.147, 7743.579, 8106.313/
|
|
DATA FREQ1/0./
|
|
C
|
|
SBFCH=0.
|
|
IF(FR.EQ.FREQ1) GO TO 30
|
|
FREQ1=FR
|
|
WAVENO=FR/2.99792458E10
|
|
EVOLT=WAVENO/8065.479
|
|
N=int(EVOLT*10.)
|
|
EN=FLOAT(N)*.1
|
|
IF(N.LT.20) RETURN
|
|
IF(N.GE.105) RETURN
|
|
c
|
|
DO IT=1,15
|
|
CROSSCHT(IT)=(CROSSCH(IT,N)+(CROSSCH(IT,N+1)-CROSSCH(IT,N))*
|
|
* (EVOLT-EN)*10.)
|
|
END DO
|
|
c
|
|
c interpolate to obtain partition function
|
|
c
|
|
30 IF(T.GE.9000.) RETURN
|
|
IF(N.LT.20) RETURN
|
|
IF(N.GE.105) RETURN
|
|
IT=int((T-1000.)*twhui+1.)
|
|
IF(IT.LT.1) IT=1
|
|
TN=FLOAT(IT)*twhu+800.
|
|
PART=PARTCH(IT)+(PARTCH(IT+1)-PARTCH(IT))*(T-TN)*twhui
|
|
c
|
|
c interpolate to obtain cross-section
|
|
c
|
|
IT=int((T-2000.)*fihui+1.)
|
|
IF(IT.LT.1) IT=1
|
|
TN=FLOAT(IT)*fihu+1500.
|
|
CHOP=EXP((CROSSCHT(IT)+(CROSSCHT(IT+1)-CROSSCHT(IT))*
|
|
* (T-TN)*fihui)*tenl)*PART
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ***********************************************************************
|
|
C
|
|
C
|
|
|
|
FUNCTION SBFOH(FR,T)
|
|
C ====================
|
|
C
|
|
C cross-section times partition function for OH
|
|
C
|
|
C from Kurucz ATLAS9
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
parameter (fihu=500.,fihui=1./fihu,
|
|
* twhu=200.,twhui=1./twhu,
|
|
* tenl=2.30258509299405E0)
|
|
DIMENSION CROSSOH(15,130),PARTOH(41),CROSSOHT(15)
|
|
DIMENSION C1(150),C2(150),C3(150),C4(150),C5(150)
|
|
DIMENSION C6(150),C7(150),C8(150),C9(150),C10(150)
|
|
DIMENSION C11(150),C12(150),C13(150)
|
|
EQUIVALENCE (CROSSOH(1, 1),C1(1)),(CROSSOH(1,11),C2(1))
|
|
EQUIVALENCE (CROSSOH(1,21),C3(1)),(CROSSOH(1,31),C4(1))
|
|
EQUIVALENCE (CROSSOH(1,41),C5(1)),(CROSSOH(1,51),C6(1))
|
|
EQUIVALENCE (CROSSOH(1,61),C7(1)),(CROSSOH(1,71),C8(1))
|
|
EQUIVALENCE (CROSSOH(1,81),C9(1)),(CROSSOH(1,91),C10(1))
|
|
EQUIVALENCE (CROSSOH(1,101),C11(1))
|
|
EQUIVALENCE (CROSSOH(1,111),C12(1))
|
|
EQUIVALENCE (CROSSOH(1,121),C13(1))
|
|
C
|
|
DATA C1/-30.855,-29.121,-27.976,-27.166,-26.566,-26.106,-25.742,
|
|
1-25.448,-25.207,-25.006,-24.836,-24.691,-24.566,-24.457,-24.363,
|
|
2 -30.494,-28.760,-27.615,-26.806,-26.206,-25.745,-25.381,
|
|
2-25.088,-24.846,-24.645,-24.475,-24.330,-24.205,-24.097,-24.002,
|
|
3 -30.157,-28.425,-27.280,-26.472,-25.872,-25.411,-25.048,
|
|
3-24.754,-24.513,-24.312,-24.142,-23.997,-23.872,-23.764,-23.669,
|
|
4 -29.848,-28.117,-26.974,-26.165,-25.566,-25.105,-24.742,
|
|
4-24.448,-24.207,-24.006,-23.836,-23.692,-23.567,-23.458,-23.364,
|
|
5 -29.567,-27.837,-26.693,-25.885,-25.286,-24.826,-24.462,
|
|
5-24.169,-23.928,-23.727,-23.557,-23.412,-23.287,-23.179,-23.084,
|
|
6 -29.307,-27.578,-26.436,-25.628,-25.029,-24.569,-24.205,
|
|
6-23.912,-23.671,-23.470,-23.300,-23.155,-23.031,-22.922,-22.828,
|
|
7 -29.068,-27.341,-26.199,-25.391,-24.792,-24.332,-23.969,
|
|
7-23.676,-23.435,-23.234,-23.064,-22.920,-22.795,-22.687,-22.592,
|
|
8 -28.820,-27.115,-25.978,-25.172,-24.574,-24.115,-23.752,
|
|
8-23.459,-23.218,-23.017,-22.848,-22.703,-22.579,-22.470,-22.376,
|
|
9 -28.540,-26.891,-25.768,-24.968,-24.372,-23.914,-23.552,
|
|
9-23.259,-23.019,-22.818,-22.649,-22.504,-22.380,-22.272,-22.177,
|
|
A -28.275,-26.681,-25.574,-24.779,-24.186,-23.729,-23.368,
|
|
A-23.076,-22.836,-22.636,-22.467,-22.322,-22.198,-22.090,-21.996/
|
|
DATA C2/-27.993,-26.470,-25.388,-24.602,-24.014,-23.560,-23.200,
|
|
1-22.909,-22.669,-22.470,-22.301,-22.157,-22.033,-21.925,-21.831,
|
|
2 -27.698,-26.252,-25.204,-24.433,-23.851,-23.401,-23.043,
|
|
2-22.754,-22.515,-22.316,-22.148,-22.005,-21.881,-21.773,-21.679,
|
|
3 -27.398,-26.026,-25.019,-24.267,-23.696,-23.251,-22.896,
|
|
3-22.609,-22.372,-22.174,-22.007,-21.864,-21.741,-21.634,-21.540,
|
|
4 -27.100,-25.791,-24.828,-24.102,-23.543,-23.106,-22.756,
|
|
4-22.472,-22.238,-22.041,-21.875,-21.733,-21.611,-21.504,-21.411,
|
|
5 -26.807,-25.549,-24.631,-23.933,-23.391,-22.964,-22.621,
|
|
5-22.341,-22.109,-21.915,-21.751,-21.610,-21.488,-21.383,-21.290,
|
|
6 -26.531,-25.310,-24.431,-23.761,-23.238,-22.823,-22.488,
|
|
6-22.214,-21.986,-21.795,-21.633,-21.494,-21.374,-21.269,-21.178,
|
|
7 -26.239,-25.066,-24.225,-23.585,-23.082,-22.681,-22.356,
|
|
7-22.089,-21.866,-21.679,-21.520,-21.383,-21.265,-21.162,-21.072,
|
|
8 -25.945,-24.824,-24.017,-23.405,-22.923,-22.538,-22.223,
|
|
8-21.964,-21.748,-21.565,-21.410,-21.276,-21.160,-21.059,-20.970,
|
|
9 -25.663,-24.587,-23.810,-23.222,-22.761,-22.391,-22.088,
|
|
9-21.838,-21.629,-21.452,-21.300,-21.170,-21.057,-20.958,-20.872,
|
|
A -25.372,-24.350,-23.603,-23.038,-22.596,-22.241,-21.950,
|
|
A-21.710,-21.508,-21.337,-21.190,-21.064,-20.954,-20.858,-20.774/
|
|
DATA C3/-25.076,-24.111,-23.396,-22.853,-22.429,-22.088,-21.809,
|
|
1-21.578,-21.384,-21.220,-21.078,-20.957,-20.851,-20.758,-20.676,
|
|
2 -24.779,-23.870,-23.189,-22.669,-22.261,-21.934,-21.667,
|
|
2-21.445,-21.259,-21.101,-20.965,-20.848,-20.746,-20.656,-20.578,
|
|
3 -24.486,-23.629,-22.983,-22.486,-22.095,-21.781,-21.524,
|
|
3-21.311,-21.132,-20.980,-20.850,-20.737,-20.639,-20.553,-20.478,
|
|
4 -24.183,-23.382,-22.774,-22.302,-21.928,-21.627,-21.381,
|
|
4-21.177,-21.005,-20.859,-20.734,-20.625,-20.531,-20.449,-20.376,
|
|
5 -23.867,-23.127,-22.561,-22.116,-21.761,-21.474,-21.238,
|
|
5-21.043,-20.878,-20.738,-20.617,-20.513,-20.423,-20.344,-20.274,
|
|
6 -23.538,-22.862,-22.340,-21.926,-21.592,-21.320,-21.096,
|
|
6-20.909,-20.751,-20.617,-20.502,-20.402,-20.315,-20.239,-20.172,
|
|
7 -23.234,-22.604,-22.120,-21.734,-21.422,-21.166,-20.953,
|
|
7-20.776,-20.625,-20.497,-20.387,-20.291,-20.208,-20.135,-20.071,
|
|
8 -22.934,-22.347,-21.898,-21.541,-21.250,-21.010,-20.811,
|
|
8-20.643,-20.500,-20.378,-20.273,-20.182,-20.102,-20.033,-19.971,
|
|
9 -22.637,-22.092,-21.676,-21.345,-21.075,-20.853,-20.666,
|
|
9-20.508,-20.374,-20.259,-20.159,-20.073,-19.997,-19.931,-19.872,
|
|
A -22.337,-21.835,-21.452,-21.147,-20.899,-20.693,-20.520,
|
|
A-20.373,-20.247,-20.139,-20.046,-19.964,-19.892,-19.830,-19.774/
|
|
DATA C4/-22.049,-21.584,-21.230,-20.950,-20.721,-20.531,-20.372,
|
|
1-20.236,-20.119,-20.019,-19.931,-19.855,-19.788,-19.729,-19.676,
|
|
2 -21.768,-21.337,-21.011,-20.754,-20.544,-20.370,-20.223,
|
|
2-20.098,-19.991,-19.898,-19.817,-19.746,-19.683,-19.628,-19.579,
|
|
3 -21.494,-21.096,-20.796,-20.559,-20.367,-20.208,-20.074,
|
|
3-19.960,-19.861,-19.776,-19.701,-19.636,-19.578,-19.527,-19.482,
|
|
4 -21.233,-20.861,-20.585,-20.368,-20.193,-20.048,-19.926,
|
|
4-19.821,-19.732,-19.654,-19.586,-19.526,-19.473,-19.426,-19.384,
|
|
5 -20.983,-20.635,-20.380,-20.181,-20.021,-19.889,-19.778,
|
|
5-19.683,-19.602,-19.531,-19.469,-19.415,-19.367,-19.324,-19.286,
|
|
6 -20.743,-20.418,-20.182,-19.999,-19.853,-19.733,-19.633,
|
|
6-19.547,-19.474,-19.410,-19.354,-19.305,-19.261,-19.223,-19.189,
|
|
7 -20.515,-20.210,-19.991,-19.824,-19.690,-19.581,-19.490,
|
|
7-19.413,-19.347,-19.290,-19.240,-19.196,-19.157,-19.122,-19.092,
|
|
8 -20.297,-20.011,-19.808,-19.654,-19.532,-19.434,-19.352,
|
|
8-19.282,-19.223,-19.172,-19.127,-19.088,-19.054,-19.023,-18.996,
|
|
9 -20.090,-19.822,-19.633,-19.491,-19.381,-19.291,-19.218,
|
|
9-19.156,-19.103,-19.057,-19.018,-18.983,-18.952,-18.925,-18.901,
|
|
A -19.893,-19.642,-19.467,-19.337,-19.236,-19.155,-19.089,
|
|
A-19.034,-18.987,-18.946,-18.912,-18.881,-18.854,-18.831,-18.810/
|
|
DATA C5/-19.705,-19.472,-19.309,-19.190,-19.098,-19.025,-18.966,
|
|
1-18.917,-18.876,-18.840,-18.810,-18.783,-18.760,-18.739,-18.721,
|
|
2 -19.527,-19.310,-19.161,-19.051,-18.968,-18.903,-18.851,
|
|
2-18.807,-18.771,-18.740,-18.713,-18.690,-18.670,-18.653,-18.637,
|
|
3 -19.357,-19.159,-19.022,-18.922,-18.847,-18.789,-18.743,
|
|
3-18.704,-18.673,-18.646,-18.623,-18.603,-18.586,-18.571,-18.558,
|
|
4 -19.195,-19.016,-18.892,-18.803,-18.736,-18.684,-18.643,
|
|
4-18.610,-18.583,-18.560,-18.540,-18.523,-18.509,-18.496,-18.485,
|
|
5 -19.042,-18.883,-18.772,-18.693,-18.634,-18.589,-18.553,
|
|
5-18.525,-18.501,-18.481,-18.465,-18.451,-18.438,-18.428,-18.419,
|
|
6 -18.894,-18.758,-18.662,-18.593,-18.542,-18.503,-18.473,
|
|
6-18.448,-18.428,-18.412,-18.398,-18.386,-18.376,-18.367,-18.359,
|
|
7 -18.752,-18.639,-18.559,-18.501,-18.458,-18.426,-18.400,
|
|
7-18.380,-18.363,-18.350,-18.338,-18.328,-18.320,-18.313,-18.306,
|
|
8 -18.611,-18.523,-18.460,-18.415,-18.381,-18.355,-18.334,
|
|
8-18.318,-18.304,-18.293,-18.284,-18.276,-18.269,-18.263,-18.258,
|
|
9 -18.471,-18.408,-18.362,-18.329,-18.304,-18.285,-18.269,
|
|
9-18.257,-18.247,-18.238,-18.231,-18.224,-18.219,-18.214,-18.210,
|
|
A -18.330,-18.290,-18.261,-18.239,-18.223,-18.211,-18.201,
|
|
A-18.192,-18.185,-18.179,-18.174,-18.169,-18.165,-18.162,-18.159/
|
|
DATA C6/-18.190,-18.168,-18.154,-18.143,-18.135,-18.129,-18.124,
|
|
1-18.120,-18.116,-18.112,-18.109,-18.106,-18.104,-18.102,-18.100,
|
|
2 -18.055,-18.047,-18.043,-18.042,-18.040,-18.039,-18.039,
|
|
2-18.038,-18.037,-18.036,-18.035,-18.034,-18.033,-18.033,-18.032,
|
|
3 -17.929,-17.931,-17.935,-17.939,-17.943,-17.946,-17.948,
|
|
3-17.950,-17.952,-17.953,-17.955,-17.956,-17.957,-17.958,-17.959,
|
|
4 -17.818,-17.826,-17.834,-17.842,-17.849,-17.855,-17.860,
|
|
4-17.865,-17.869,-17.872,-17.875,-17.878,-17.881,-17.883,-17.886,
|
|
5 -17.724,-17.736,-17.747,-17.758,-17.767,-17.775,-17.782,
|
|
5-17.788,-17.793,-17.798,-17.803,-17.807,-17.811,-17.815,-17.819,
|
|
6 -17.651,-17.665,-17.678,-17.690,-17.701,-17.710,-17.718,
|
|
6-17.725,-17.732,-17.738,-17.744,-17.749,-17.755,-17.760,-17.765,
|
|
7 -17.601,-17.615,-17.629,-17.642,-17.653,-17.663,-17.672,
|
|
7-17.680,-17.688,-17.695,-17.701,-17.708,-17.714,-17.720,-17.726,
|
|
8 -17.572,-17.587,-17.602,-17.614,-17.626,-17.636,-17.645,
|
|
8-17.654,-17.662,-17.670,-17.677,-17.684,-17.691,-17.698,-17.704,
|
|
9 -17.565,-17.581,-17.595,-17.607,-17.619,-17.629,-17.638,
|
|
9-17.647,-17.656,-17.664,-17.671,-17.679,-17.686,-17.693,-17.700,
|
|
A -17.580,-17.594,-17.608,-17.620,-17.630,-17.640,-17.650,
|
|
A-17.658,-17.667,-17.675,-17.682,-17.690,-17.697,-17.704,-17.711/
|
|
DATA C7/-17.613,-17.626,-17.639,-17.649,-17.659,-17.669,-17.677,
|
|
1-17.686,-17.694,-17.701,-17.709,-17.716,-17.723,-17.730,-17.737,
|
|
2 -17.663,-17.675,-17.685,-17.695,-17.703,-17.711,-17.719,
|
|
2-17.727,-17.734,-17.741,-17.748,-17.755,-17.761,-17.768,-17.774,
|
|
3 -17.728,-17.737,-17.745,-17.752,-17.759,-17.766,-17.772,
|
|
3-17.778,-17.785,-17.791,-17.797,-17.803,-17.808,-17.814,-17.820,
|
|
4 -17.803,-17.809,-17.814,-17.818,-17.823,-17.828,-17.832,
|
|
4-17.837,-17.842,-17.847,-17.852,-17.856,-17.861,-17.866,-17.871,
|
|
5 -17.884,-17.886,-17.888,-17.889,-17.891,-17.893,-17.896,
|
|
5-17.899,-17.902,-17.905,-17.908,-17.912,-17.915,-17.919,-17.922,
|
|
6 -17.966,-17.964,-17.961,-17.959,-17.958,-17.958,-17.958,
|
|
6-17.959,-17.960,-17.961,-17.963,-17.964,-17.966,-17.968,-17.970,
|
|
7 -18.040,-18.034,-18.028,-18.023,-18.019,-18.016,-18.013,
|
|
7-18.012,-18.010,-18.010,-18.009,-18.009,-18.009,-18.009,-18.010,
|
|
8 -18.096,-18.087,-18.078,-18.071,-18.065,-18.059,-18.055,
|
|
8-18.051,-18.047,-18.045,-18.042,-18.040,-18.039,-18.037,-18.036,
|
|
9 -18.125,-18.115,-18.105,-18.097,-18.089,-18.082,-18.076,
|
|
9-18.070,-18.065,-18.061,-18.057,-18.053,-18.051,-18.048,-18.046,
|
|
A -18.120,-18.112,-18.103,-18.095,-18.087,-18.079,-18.072,
|
|
A-18.066,-18.060,-18.055,-18.050,-18.046,-18.042,-18.039,-18.036/
|
|
DATA C8/-18.083,-18.078,-18.071,-18.064,-18.057,-18.050,-18.044,
|
|
1-18.037,-18.032,-18.026,-18.022,-18.017,-18.014,-18.010,-18.007,
|
|
2 -18.025,-18.022,-18.017,-18.012,-18.006,-18.000,-17.994,
|
|
2-17.989,-17.984,-17.979,-17.975,-17.971,-17.968,-17.965,-17.963,
|
|
3 -17.957,-17.955,-17.952,-17.948,-17.943,-17.938,-17.934,
|
|
3-17.929,-17.925,-17.922,-17.918,-17.916,-17.913,-17.911,-17.910,
|
|
4 -17.890,-17.889,-17.886,-17.882,-17.879,-17.875,-17.871,
|
|
4-17.867,-17.864,-17.862,-17.860,-17.858,-17.857,-17.856,-17.855,
|
|
5 -17.831,-17.829,-17.826,-17.822,-17.819,-17.815,-17.812,
|
|
5-17.810,-17.807,-17.806,-17.804,-17.803,-17.803,-17.803,-17.803,
|
|
6 -17.786,-17.782,-17.777,-17.773,-17.769,-17.766,-17.763,
|
|
6-17.761,-17.759,-17.758,-17.757,-17.757,-17.757,-17.758,-17.759,
|
|
7 -17.753,-17.747,-17.741,-17.735,-17.731,-17.727,-17.724,
|
|
7-17.722,-17.721,-17.720,-17.720,-17.720,-17.721,-17.722,-17.724,
|
|
8 -17.733,-17.724,-17.716,-17.709,-17.703,-17.699,-17.696,
|
|
8-17.694,-17.693,-17.692,-17.692,-17.693,-17.694,-17.695,-17.697,
|
|
9 -17.723,-17.711,-17.700,-17.691,-17.685,-17.680,-17.676,
|
|
9-17.674,-17.673,-17.672,-17.673,-17.673,-17.675,-17.676,-17.678,
|
|
A -17.718,-17.702,-17.689,-17.679,-17.672,-17.667,-17.663,
|
|
A-17.660,-17.659,-17.659,-17.659,-17.660,-17.661,-17.663,-17.665/
|
|
DATA C9/-17.713,-17.695,-17.681,-17.670,-17.662,-17.656,-17.653,
|
|
1-17.650,-17.649,-17.649,-17.649,-17.650,-17.651,-17.653,-17.655,
|
|
2 -17.705,-17.686,-17.671,-17.660,-17.652,-17.647,-17.643,
|
|
2-17.641,-17.640,-17.640,-17.640,-17.641,-17.643,-17.645,-17.647,
|
|
3 -17.690,-17.671,-17.657,-17.647,-17.640,-17.635,-17.632,
|
|
3-17.630,-17.630,-17.630,-17.631,-17.632,-17.634,-17.636,-17.639,
|
|
4 -17.667,-17.649,-17.637,-17.629,-17.623,-17.619,-17.618,
|
|
4-17.617,-17.617,-17.618,-17.619,-17.621,-17.623,-17.626,-17.628,
|
|
5 -17.635,-17.621,-17.611,-17.605,-17.601,-17.600,-17.599,
|
|
5-17.599,-17.601,-17.602,-17.604,-17.607,-17.609,-17.612,-17.615,
|
|
6 -17.596,-17.585,-17.579,-17.576,-17.575,-17.575,-17.576,
|
|
6-17.578,-17.580,-17.582,-17.585,-17.588,-17.591,-17.595,-17.598,
|
|
7 -17.550,-17.544,-17.542,-17.542,-17.544,-17.546,-17.548,
|
|
7-17.552,-17.555,-17.558,-17.562,-17.566,-17.570,-17.573,-17.577,
|
|
8 -17.501,-17.500,-17.501,-17.504,-17.508,-17.513,-17.517,
|
|
8-17.521,-17.526,-17.530,-17.535,-17.539,-17.544,-17.548,-17.553,
|
|
9 -17.449,-17.452,-17.457,-17.463,-17.470,-17.476,-17.482,
|
|
9-17.488,-17.493,-17.499,-17.504,-17.509,-17.514,-17.519,-17.524,
|
|
A -17.396,-17.403,-17.412,-17.420,-17.429,-17.437,-17.444,
|
|
A-17.451,-17.458,-17.464,-17.470,-17.476,-17.481,-17.487,-17.492/
|
|
DATAC10/-17.344,-17.355,-17.366,-17.377,-17.387,-17.396,-17.405,
|
|
1-17.413,-17.420,-17.427,-17.434,-17.440,-17.446,-17.452,-17.458,
|
|
2 -17.295,-17.307,-17.321,-17.333,-17.345,-17.355,-17.365,
|
|
2-17.373,-17.382,-17.389,-17.397,-17.404,-17.410,-17.417,-17.423,
|
|
3 -17.249,-17.264,-17.278,-17.292,-17.304,-17.316,-17.326,
|
|
3-17.335,-17.344,-17.352,-17.360,-17.368,-17.375,-17.382,-17.389,
|
|
4 -17.209,-17.225,-17.241,-17.255,-17.268,-17.280,-17.291,
|
|
4-17.301,-17.310,-17.319,-17.327,-17.335,-17.343,-17.350,-17.357,
|
|
5 -17.177,-17.194,-17.210,-17.225,-17.239,-17.251,-17.262,
|
|
5-17.272,-17.282,-17.291,-17.300,-17.308,-17.316,-17.324,-17.331,
|
|
6 -17.154,-17.172,-17.189,-17.204,-17.218,-17.230,-17.242,
|
|
6-17.252,-17.262,-17.272,-17.280,-17.289,-17.298,-17.306,-17.314,
|
|
7 -17.144,-17.162,-17.179,-17.194,-17.208,-17.220,-17.232,
|
|
7-17.242,-17.253,-17.262,-17.271,-17.280,-17.289,-17.297,-17.306,
|
|
8 -17.146,-17.164,-17.181,-17.196,-17.210,-17.222,-17.234,
|
|
8-17.245,-17.255,-17.265,-17.274,-17.283,-17.292,-17.301,-17.309,
|
|
9 -17.163,-17.180,-17.197,-17.212,-17.225,-17.237,-17.249,
|
|
9-17.260,-17.270,-17.280,-17.289,-17.298,-17.307,-17.316,-17.325,
|
|
A -17.193,-17.211,-17.227,-17.241,-17.254,-17.266,-17.277,
|
|
A-17.288,-17.298,-17.308,-17.317,-17.327,-17.336,-17.345,-17.353/
|
|
DATAC11/-17.239,-17.256,-17.271,-17.284,-17.297,-17.309,-17.320,
|
|
1-17.330,-17.340,-17.350,-17.359,-17.369,-17.378,-17.387,-17.395,
|
|
2 -17.299,-17.315,-17.329,-17.342,-17.354,-17.365,-17.376,
|
|
2-17.386,-17.396,-17.405,-17.415,-17.424,-17.433,-17.442,-17.451,
|
|
3 -17.373,-17.388,-17.402,-17.414,-17.425,-17.436,-17.446,
|
|
3-17.456,-17.466,-17.475,-17.484,-17.493,-17.502,-17.511,-17.520,
|
|
4 -17.462,-17.476,-17.489,-17.500,-17.511,-17.521,-17.531,
|
|
4-17.541,-17.550,-17.559,-17.569,-17.578,-17.587,-17.595,-17.604,
|
|
5 -17.567,-17.581,-17.592,-17.603,-17.613,-17.623,-17.632,
|
|
5-17.641,-17.651,-17.660,-17.669,-17.678,-17.686,-17.695,-17.704,
|
|
6 -17.689,-17.701,-17.712,-17.722,-17.732,-17.741,-17.750,
|
|
6-17.759,-17.768,-17.777,-17.786,-17.795,-17.803,-17.812,-17.821,
|
|
7 -17.829,-17.840,-17.851,-17.860,-17.869,-17.878,-17.887,
|
|
7-17.896,-17.904,-17.913,-17.922,-17.930,-17.939,-17.948,-17.956,
|
|
8 -17.988,-18.000,-18.010,-18.019,-18.028,-18.036,-18.045,
|
|
8-18.053,-18.062,-18.070,-18.079,-18.087,-18.096,-18.104,-18.112,
|
|
9 -18.171,-18.183,-18.192,-18.201,-18.210,-18.218,-18.227,
|
|
9-18.235,-18.243,-18.252,-18.260,-18.268,-18.277,-18.285,-18.293,
|
|
A -18.381,-18.393,-18.403,-18.413,-18.422,-18.430,-18.438,
|
|
A-18.447,-18.455,-18.463,-18.471,-18.479,-18.487,-18.495,-18.503/
|
|
DATAC12/-18.625,-18.638,-18.650,-18.660,-18.669,-18.678,-18.687,
|
|
1-18.695,-18.703,-18.711,-18.719,-18.726,-18.734,-18.742,-18.750,
|
|
2 -18.912,-18.929,-18.943,-18.955,-18.966,-18.975,-18.984,
|
|
2-18.993,-19.001,-19.008,-19.016,-19.023,-19.031,-19.038,-19.045,
|
|
3 -19.260,-19.283,-19.303,-19.320,-19.333,-19.345,-19.355,
|
|
3-19.364,-19.372,-19.380,-19.387,-19.394,-19.400,-19.407,-19.413,
|
|
4 -19.704,-19.740,-19.771,-19.796,-19.816,-19.832,-19.845,
|
|
4-19.855,-19.863,-19.870,-19.876,-19.882,-19.887,-19.892,-19.897,
|
|
5 -20.339,-20.386,-20.424,-20.454,-20.476,-20.492,-20.502,
|
|
5-20.509,-20.513,-20.516,-20.518,-20.520,-20.521,-20.523,-20.524,
|
|
6 -21.052,-21.075,-21.093,-21.105,-21.114,-21.120,-21.123,
|
|
6-21.125,-21.126,-21.127,-21.128,-21.130,-21.131,-21.133,-21.135,
|
|
7 -21.174,-21.203,-21.230,-21.255,-21.278,-21.299,-21.320,
|
|
7-21.339,-21.357,-21.375,-21.392,-21.408,-21.424,-21.439,-21.454,
|
|
8 -21.285,-21.317,-21.346,-21.372,-21.395,-21.416,-21.435,
|
|
8-21.452,-21.468,-21.483,-21.497,-21.511,-21.524,-21.536,-21.548,
|
|
9 -21.396,-21.429,-21.459,-21.486,-21.511,-21.532,-21.551,
|
|
9-21.569,-21.585,-21.600,-21.614,-21.627,-21.640,-21.652,-21.663,
|
|
A -21.516,-21.549,-21.580,-21.609,-21.635,-21.658,-21.678,
|
|
A-21.696,-21.713,-21.728,-21.742,-21.755,-21.767,-21.779,-21.790/
|
|
DATAC13/-21.651,-21.681,-21.711,-21.738,-21.763,-21.785,-21.804,
|
|
1-21.821,-21.837,-21.851,-21.864,-21.876,-21.887,-21.898,-21.908,
|
|
2 -21.810,-21.831,-21.853,-21.874,-21.893,-21.910,-21.925,
|
|
2-21.938,-21.950,-21.961,-21.971,-21.980,-21.989,-21.998,-22.006,
|
|
3 -22.009,-22.016,-22.026,-22.037,-22.048,-22.058,-22.066,
|
|
3-22.074,-22.081,-22.088,-22.094,-22.099,-22.105,-22.111,-22.117,
|
|
4 -22.353,-22.317,-22.296,-22.284,-22.276,-22.270,-22.266,
|
|
4-22.262,-22.260,-22.258,-22.257,-22.257,-22.257,-22.258,-22.259,
|
|
5 -22.705,-22.609,-22.552,-22.515,-22.488,-22.468,-22.451,
|
|
5-22.438,-22.427,-22.418,-22.410,-22.405,-22.400,-22.397,-22.395,
|
|
6 -22.889,-22.791,-22.731,-22.690,-22.659,-22.634,-22.612,
|
|
6-22.594,-22.579,-22.566,-22.555,-22.546,-22.539,-22.533,-22.528,
|
|
7 -23.211,-23.109,-23.041,-22.989,-22.945,-22.906,-22.872,
|
|
7-22.842,-22.816,-22.793,-22.774,-22.757,-22.743,-22.732,-22.722,
|
|
8 -25.312,-24.669,-24.250,-23.959,-23.746,-23.587,-23.463,
|
|
8-23.366,-23.288,-23.225,-23.173,-23.131,-23.095,-23.066,-23.041,
|
|
9 -25.394,-24.752,-24.333,-24.041,-23.829,-23.669,-23.546,
|
|
9-23.449,-23.371,-23.308,-23.256,-23.214,-23.178,-23.149,-23.124,
|
|
A -25.430,-24.787,-24.369,-24.077,-23.865,-23.705,-23.582,
|
|
A-23.484,-23.407,-23.344,-23.292,-23.249,-23.214,-23.185,-23.160/
|
|
DATA PARTOH/
|
|
1 145.979, 178.033, 211.618, 247.053, 284.584, 324.398,
|
|
2 366.639, 411.425, 458.854, 509.012, 561.976, 617.823,
|
|
3 676.626, 738.448, 803.363, 871.437, 942.735, 1017.330,
|
|
4 1095.284, 1176.654, 1261.510, 1349.898, 1441.875, 1537.483,
|
|
5 1636.753, 1739.733, 1846.434, 1956.883, 2071.080, 2189.029,
|
|
6 2310.724, 2436.155, 2565.283, 2698.103, 2834.571, 2974.627,
|
|
7 3118.242, 3265.366, 3415.912, 3569.837, 3727.077/
|
|
DATA FREQ1/0./
|
|
C
|
|
SBFOH=0.
|
|
IF(FR.EQ.FREQ1) GO TO 30
|
|
FREQ1=FR
|
|
WAVENO=FR/2.99792458E10
|
|
EVOLT=WAVENO/8065.479
|
|
N=int(EVOLT*10.-20.)
|
|
EN=FLOAT(N)*.1+2.
|
|
IF(N.LE.0) RETURN
|
|
IF(N.GE.130) RETURN
|
|
DO IT=1,15
|
|
CROSSOHT(IT)=(CROSSOH(IT,N)+(CROSSOH(IT,N+1)-CROSSOH(IT,N))*
|
|
* (EVOLT-EN)*10.)
|
|
END DO
|
|
c
|
|
c interpolate to obtain partition function
|
|
c
|
|
30 IF(T.GE.9000.) RETURN
|
|
IF(N.LE.0) RETURN
|
|
IF(N.GE.130) RETURN
|
|
IT=int((T-1000.)*twhui+1.)
|
|
IF(IT.LT.1) IT=1
|
|
TN=FLOAT(IT)*twhu+800.
|
|
PART=PARTOH(IT)+(PARTOH(IT+1)-PARTOH(IT))*(T-TN)*twhui
|
|
c
|
|
c interpolate to obtain cross-section
|
|
c
|
|
IT=int((T-2000.)*fihui+1.)
|
|
IF(IT.LT.1) IT=1
|
|
TN=FLOAT(IT)*fihu+1500.
|
|
SBFOH=EXP((CROSSOHT(IT)+(CROSSOHT(IT+1)-CROSSOHT(IT))*
|
|
* (T-TN)*fihui)*tenl)*PART
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
subroutine eldenc
|
|
C =================
|
|
C
|
|
C compare the actual electon density to that which follows
|
|
C from the values used in the opacity table, interpolated to
|
|
C the actual temperature and mass density
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
common/eletab/elecgr(mtabt,mtabr)
|
|
common/eospar/anmol(600,mdepth),
|
|
* anato(100,mdepth),
|
|
* anion(100,mdepth)
|
|
common/hmolab/anh2(mdepth),anhm(mdepth)
|
|
dimension elcon(31,mdepth)
|
|
c
|
|
if(ipelch.gt.0) then
|
|
write(6,600)
|
|
600 format(/' -------------------------'/
|
|
* ' CHECK OF ELECTRON DENSITY'/
|
|
* ' -------------------------'/
|
|
* ' ID TEMP ACTUAL LTE EOS interpol.op.tab.'/)
|
|
c
|
|
do id=1,nd
|
|
t=temp(id)
|
|
rho=dens(id)
|
|
if(numtemp.eq.nd) then
|
|
opac=elecgr(id,1)
|
|
go to 10
|
|
end if
|
|
c
|
|
TTAB1=TEMPVEC(1)
|
|
TTAB2=TEMPVEC(NUMTEMP)
|
|
TL=LOG(T)
|
|
DELTAT=(TL-TTAB1)/(TTAB2-TTAB1)*FLOAT(numtemp-1)
|
|
JT = 1 + IDINT(DELTAT)
|
|
IF(JT.LT.1) JT = 1
|
|
IF(JT.GT.numtemp-1) JT = numtemp-1
|
|
ju = jt+1
|
|
t1i=tempvec(jt)
|
|
t2i=tempvec(jt+1)
|
|
dti=(TL-T1i)/(T2i-T1i)
|
|
if(deltat.lt.0.) dti = 0.d0
|
|
C
|
|
if(numrh(1).ne.1) then
|
|
c
|
|
c lower temperature
|
|
c
|
|
numrho=numrh(jt)
|
|
rtab1=rhomat(jt,1)
|
|
rtab2=rhomat(jt,numrho)
|
|
RL = LOG(RHO)
|
|
DELTAR=(RL-RTAB1)/(RTAB2-RTAB1)*FLOAT(numrho-1)
|
|
JR = 1 + IDINT(DELTAR)
|
|
IF(JR.LT.1) JR = 1
|
|
IF(JR.GT.(numrho-1)) JR = numrho-1
|
|
r1i=rhomat(jt,jr)
|
|
r2i=rhomat(jt,jr+1)
|
|
dri=(RL-R1i)/(R2i-R1i)
|
|
if(deltar.lt.0.) dri = 0.d0
|
|
opr1=elecgr(jt,jr)+
|
|
* dri*(elecgr(jt,jr+1)-elecgr(jt,jr))
|
|
c
|
|
c higher temperature
|
|
c
|
|
ju=jt+1
|
|
numrho=numrh(ju)
|
|
rtab1=rhomat(ju,1)
|
|
rtab2=rhomat(ju,numrho)
|
|
RL = LOG(RHO)
|
|
DELTAR=(RL-RTAB1)/(RTAB2-RTAB1)*FLOAT(numrho-1)
|
|
JR = 1 + IDINT(DELTAR)
|
|
IF(JR.LT.1) JR = 1
|
|
IF(JR.GT.(numrho-1)) JR = numrho-1
|
|
r1i=rhomat(ju,jr)
|
|
r2i=rhomat(ju,jr+1)
|
|
dri=(RL-R1i)/(R2i-R1i)
|
|
if(deltar.lt.0.) dri = 0.d0
|
|
opr2=elecgr(ju,jr)+
|
|
* dri*(elecgr(ju,jr+1)-elecgr(ju,jr))
|
|
opac=opr1+(opr2-opr1)*dti
|
|
else
|
|
jr=1
|
|
opac=elecgr(jt,jr)+(elecgr(ju,jr)-elecgr(jt,jr))*dti
|
|
end if
|
|
10 continue
|
|
elecg=exp(opac)
|
|
call rhonen(id,t,rho,an,ane)
|
|
write(6,601) id,t,elec(id),ane,elecg
|
|
601 format(i4,f10.1,1p3e12.4)
|
|
end do
|
|
end if
|
|
c
|
|
c electron donors
|
|
c
|
|
if(idisk.eq.0.or.ipeldo.eq.0) return
|
|
do id=1,nd
|
|
t=temp(id)
|
|
if(ifmol.gt.0.and.t.lt.tmolim) then
|
|
rho=dens(id)
|
|
call rhonen(id,t,rho,an,ane)
|
|
aein=ane
|
|
call moleq(id,t,an,aein,ane,enrg,entt,wm,1)
|
|
do ia=1,30
|
|
elcon(ia,id)=anion(ia,id)/elec(id)
|
|
end do
|
|
elcon(31,id)=-anhm(id)/elec(id)
|
|
else
|
|
call state(2,id,t,elec(id))
|
|
do ia=1,30
|
|
iat=iatex(ia)
|
|
if(iat.gt.0) then
|
|
qs=0.
|
|
n1=n0a(iat)
|
|
if(ia.eq.1) n1=nfirst(ielh)
|
|
do i=n1,nka(iat)
|
|
ch=iz(iel(i))-1
|
|
if(ilk(i).gt.0) ch=iz(ilk(i))
|
|
qs=qs+ch*popul(i,id)
|
|
end do
|
|
elcon(ia,id)=qs/elec(id)
|
|
else
|
|
elcon(ia,id)=rr(ia,99)/elec(id)
|
|
end if
|
|
end do
|
|
if(ielhm.gt.0) then
|
|
elcon(31,id)=-popul(nfirst(ielhm),id)/elec(id)
|
|
else
|
|
aref=dens(id)/wmm(id)/ytot(id)
|
|
elcon(31,id)=-qm*rr(1,1)*aref
|
|
end if
|
|
end if
|
|
end do
|
|
c
|
|
write(6,611)
|
|
do id=1,nd
|
|
write(6,612) id,temp(id),elcon(31,id),elcon(1,id),elcon(2,id),
|
|
* elcon(6,id),elcon(7,id),elcon(8,id),
|
|
* (elcon(i,id),i=11,15),elcon(20,id),elcon(26,id)
|
|
end do
|
|
611 format(/' RELATIVE CONTRIBUTIONS OF INDIVIDUAL ELECTRON DONORS'//
|
|
* ' ID TEMP H- H He C N O',
|
|
* ' Na Mg Al',
|
|
* ' Si S Ca Fe')
|
|
612 format(i3,f9.1,1pe10.2,0p12f7.3)
|
|
c
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
FUNCTION SFFHMI_add(POPI,FR,T)
|
|
C ==============================
|
|
C
|
|
C Free-free cross-section for H- (negative hydrogen ion)
|
|
C Taken from Kurucz ATLAS9
|
|
C
|
|
C From Bell and Berrington J.Phys.B,vol. 20, 801-806,1987.
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
PARAMETER (CONFF=5040.*1.380658E-16, CONTH=5040.)
|
|
PARAMETER (HK = 4.79928144D-11)
|
|
DIMENSION FFLOG(22,11),FFCS(11,22),FFLOG2(22)
|
|
DIMENSION FFBEG(11,11),FFEND(11,11),FFTT(11),WFFLOG(22)
|
|
DIMENSION THETAFF(11),WAVEK(22)
|
|
EQUIVALENCE (FFCS(1,1),FFBEG(1,1)),(FFCS(1,12),FFEND(1,1))
|
|
C
|
|
DATA WAVEK/.50,.40,.35,.30,.25,.20,.18,.16,.14,.12,.10,.09,.08,
|
|
1 .07,.06,.05,.04,.03,.02,.01,.008,.006/
|
|
DATA THETAFF/
|
|
1 0.5, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.8, 3.6/
|
|
DATA FFBEG/
|
|
1.0178,.0222,.0308,.0402,.0498,.0596,.0695,.0795,.0896, .131, .172,
|
|
2.0228,.0280,.0388,.0499,.0614,.0732,.0851,.0972, .110, .160, .211,
|
|
3.0277,.0342,.0476,.0615,.0760,.0908, .105, .121, .136, .199, .262,
|
|
4.0364,.0447,.0616,.0789,.0966, .114, .132, .150, .169, .243, .318,
|
|
5.0520,.0633,.0859, .108, .131, .154, .178, .201, .225, .321, .418,
|
|
6.0791,.0959, .129, .161, .194, .227, .260, .293, .327, .463, .602,
|
|
7.0965, .117, .157, .195, .234, .272, .311, .351, .390, .549, .711,
|
|
8 .121, .146, .195, .241, .288, .334, .381, .428, .475, .667, .861,
|
|
9 .154, .188, .249, .309, .367, .424, .482, .539, .597, .830, 1.07,
|
|
A .208, .250, .332, .409, .484, .557, .630, .702, .774, 1.06, 1.36,
|
|
B .293, .354, .468, .576, .677, .777, .874, .969, 1.06, 1.45, 1.83/
|
|
DATA FFEND/
|
|
1 .358, .432, .572, .702, .825, .943, 1.06, 1.17, 1.28, 1.73, 2.17,
|
|
2 .448, .539, .711, .871, 1.02, 1.16, 1.29, 1.43, 1.57, 2.09, 2.60,
|
|
3 .579, .699, .924, 1.13, 1.33, 1.51, 1.69, 1.86, 2.02, 2.67, 3.31,
|
|
4 .781, .940, 1.24, 1.52, 1.78, 2.02, 2.26, 2.48, 2.69, 3.52, 4.31,
|
|
5 1.11, 1.34, 1.77, 2.17, 2.53, 2.87, 3.20, 3.51, 3.80, 4.92, 5.97,
|
|
6 1.73, 2.08, 2.74, 3.37, 3.90, 4.50, 5.01, 5.50, 5.95, 7.59, 9.06,
|
|
7 3.04, 3.65, 4.80, 5.86, 6.86, 7.79, 8.67, 9.50, 10.3, 13.2, 15.6,
|
|
8 6.79, 8.16, 10.7, 13.1, 15.3, 17.4, 19.4, 21.2, 23.0, 29.5, 35.0,
|
|
9 27.0, 32.4, 42.6, 51.9, 60.7, 68.9, 76.8, 84.2, 91.4, 117., 140.,
|
|
A 42.3, 50.6, 66.4, 80.8, 94.5, 107., 120., 131., 142., 183., 219.,
|
|
B 75.1, 90.0, 118., 144., 168., 191., 212., 234., 253., 325., 388./
|
|
DATA ISTART/0/
|
|
C
|
|
IF(ISTART.EQ.0) THEN
|
|
ISTART=1
|
|
DO IWAVE=1,22
|
|
WFFLOG(IWAVE)=LOG(91.134D0/WAVEK(IWAVE))
|
|
DO ITHETA=1,11
|
|
FFLOG(IWAVE,ITHETA)=LOG(FFCS(ITHETA,IWAVE)*1.E-26)
|
|
END DO
|
|
END DO
|
|
END IF
|
|
C
|
|
WAVE=2.99792458E17/FR
|
|
WAVELOG=LOG(WAVE)
|
|
C
|
|
DO ITHETA=1,11
|
|
DO IWAVE=1,22
|
|
FFLOG2(IWAVE)=FFLOG(IWAVE,ITHETA)
|
|
END DO
|
|
FFTLOG=YLINTP(WAVELOG,WFFLOG,FFLOG2,22,22)
|
|
FFTT(ITHETA)=EXP(FFTLOG)/THETAFF(ITHETA)*CONFF
|
|
END DO
|
|
c
|
|
THETA=CONTH/T
|
|
FFTH=YLINTP(THETA,THETAFF,FFTT,11,11)
|
|
SFFHMI_add=FFTH*POPI/(1.-exp(-hk*fr/t))
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C ******************************************************************
|
|
C
|
|
C
|
|
|
|
subroutine cia_h2h2(t,ah2,ff,opac)
|
|
c ===================--=============
|
|
c
|
|
c CIA H2-H2 opacity
|
|
c data from Borysow A., Jorgensen U.G., Fu Y. 2001, JQSRT 68, 235
|
|
c
|
|
IMPLICIT REAL*8(A-H,O-Z)
|
|
parameter (nlines=1000)
|
|
dimension freq(nlines),temp(7),alpha(nlines,7)
|
|
parameter (amagat=2.6867774d+19,fac=1./amagat**2)
|
|
data temp / 1000. , 2000. , 3000. , 4000. , 5000. , 6000. ,
|
|
* 7000. /
|
|
data ntemp /7/
|
|
data ifirst /0/
|
|
PARAMETER (CAS=2.997925D10)
|
|
c input frequency in Hz but needed wave numbers in cm^-1
|
|
f=ff/cas
|
|
c read in CIA tables if this is the first call
|
|
if (ifirst.eq.0) then
|
|
write(*,'(a)') 'Reading in H2-H2 CIA opacity tables...'
|
|
open(10,file="./data/CIA_H2H2.dat",status='old')
|
|
do i=1,3
|
|
read (10,*)
|
|
end do
|
|
do i=1,nlines
|
|
read (10,*) freq(i),(alpha(i,j),j=1,ntemp)
|
|
end do
|
|
close(10)
|
|
|
|
c take logarithm of tables prior to doing linear interpolations
|
|
|
|
do i=1,nlines
|
|
do j=1,ntemp
|
|
alpha(i,j)=log(alpha(i,j))
|
|
end do
|
|
end do
|
|
|
|
ifirst=1
|
|
end if
|
|
|
|
c locate position in temperature array
|
|
call locate(temp,ntemp,t,j,ntemp)
|
|
|
|
if (j.eq.0) then
|
|
write(*,*)
|
|
write(*,'(a,f6.0,a)')
|
|
* 'Warning: requested temperature is below',temp(1),' K'
|
|
write(*,'(a)') 'CIA H2-H2 opacity set to 0'
|
|
write(*,*)
|
|
opac=0.
|
|
return
|
|
end if
|
|
|
|
c locate position in frequency array
|
|
call locate(freq,nlines,f,i,nlines)
|
|
|
|
c linearly interpolate in frequency and temperature
|
|
|
|
if (j.eq.ntemp) then
|
|
c hold values constant if off high temperature end of table
|
|
y1=alpha(i,j)
|
|
y2=alpha(i+1,j)
|
|
tt=(f-freq(i))/(freq(i+1)-freq(i))
|
|
alp=(1.-tt)*y1 + tt*y2
|
|
else if (i.eq.0 .or. i.eq.nlines) then
|
|
c set values to a very small number if off frequency table
|
|
alp=-50.
|
|
else
|
|
c interpolate linearly within table
|
|
y1=alpha(i,j)
|
|
y2=alpha(i+1,j)
|
|
y3=alpha(i+1,j+1)
|
|
y4=alpha(i,j+1)
|
|
|
|
tt=(f-freq(i))/(freq(i+1)-freq(i))
|
|
uu=(t-temp(j))/(temp(j+1)-temp(j))
|
|
|
|
alp=(1.-tt)*(1.-uu)*y1 + tt*(1.-uu)*y2 + tt*uu*y3 +
|
|
* (1.-tt)*uu*y4
|
|
end if
|
|
|
|
alp=exp(alp)
|
|
|
|
c final opacity
|
|
|
|
opac=fac*ah2*ah2*alp
|
|
c
|
|
return
|
|
end
|
|
|
|
C
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
|
|
subroutine cia_h2he(t,ah2,ahe,ff,opac)
|
|
c ======================================
|
|
c
|
|
c CIA H2-He opacity
|
|
c data from Jorgensen U.G., Hammer D., Borysow A., Falkesgaard J., 2000,
|
|
c Astronomy & Astrophysics 361, 283
|
|
c
|
|
IMPLICIT REAL*8(A-H,O-Z)
|
|
parameter (nlines=242)
|
|
dimension freq(nlines),temp(7),alpha(nlines,7)
|
|
parameter (amagat=2.6867774d+19,fac=1./amagat**2)
|
|
data temp / 1000. , 2000. , 3000. , 4000. , 5000. , 6000. ,
|
|
* 7000. /
|
|
data ntemp /7/
|
|
data ifirst /0/
|
|
PARAMETER (CAS=2.997925D10)
|
|
c input frequency in Hz but needed wave numbers in cm^-1
|
|
f=ff/cas
|
|
c read in CIA tables if this is the first call
|
|
if (ifirst.eq.0) then
|
|
write(*,'(a)') 'Reading in H2-He CIA opacity tables...'
|
|
open(10,file="./data/CIA_H2He.dat",status='old')
|
|
do i=1,3
|
|
read (10,*)
|
|
end do
|
|
do i=1,nlines
|
|
read (10,*) freq(i),(alpha(i,j),j=1,ntemp)
|
|
end do
|
|
close(10)
|
|
|
|
c take logarithm of tables prior to doing linear interpolations
|
|
|
|
do i=1,nlines
|
|
do j=1,ntemp
|
|
alpha(i,j)=log(alpha(i,j))
|
|
end do
|
|
end do
|
|
|
|
ifirst=1
|
|
end if
|
|
|
|
c locate position in temperature array
|
|
call locate(temp,ntemp,t,j,ntemp)
|
|
|
|
if (j.eq.0) then
|
|
write(*,*)
|
|
write(*,'(a,f6.0,a)')
|
|
* 'Warning: requested temperature is below',temp(1),' K'
|
|
write(*,'(a)') 'CIA H2-He opacity set to 0'
|
|
write(*,*)
|
|
opac=0.
|
|
return
|
|
end if
|
|
|
|
c locate position in frequency array
|
|
call locate(freq,nlines,f,i,nlines)
|
|
|
|
c linearly interpolate in frequency and temperature
|
|
|
|
if (j.eq.ntemp) then
|
|
c hold values constant if off high temperature end of table
|
|
y1=alpha(i,j)
|
|
y2=alpha(i+1,j)
|
|
tt=(f-freq(i))/(freq(i+1)-freq(i))
|
|
alp=(1.-tt)*y1 + tt*y2
|
|
else if (i.eq.0 .or. i.eq.nlines) then
|
|
c set values to a very small number if off frequency table
|
|
alp=-50.
|
|
else
|
|
c interpolate linearly within table
|
|
y1=alpha(i,j)
|
|
y2=alpha(i+1,j)
|
|
y3=alpha(i+1,j+1)
|
|
y4=alpha(i,j+1)
|
|
|
|
tt=(f-freq(i))/(freq(i+1)-freq(i))
|
|
uu=(t-temp(j))/(temp(j+1)-temp(j))
|
|
|
|
alp=(1.-tt)*(1.-uu)*y1 + tt*(1.-uu)*y2 + tt*uu*y3 +
|
|
* (1.-tt)*uu*y4
|
|
end if
|
|
|
|
alp=exp(alp)
|
|
|
|
c final opacity
|
|
|
|
opac=fac*ah2*ahe*alp
|
|
c
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C ********************************************************************
|
|
C
|
|
C
|
|
subroutine cia_h2h(t,ah2,ah,ff,opac)
|
|
c ====================================
|
|
c
|
|
c CIA H2-H opacity - data taken from TURBOSPEC
|
|
c
|
|
IMPLICIT REAL*8(A-H,O-Z)
|
|
parameter (nlines=67)
|
|
dimension freq(nlines),temp(4),alpha(nlines,4)
|
|
parameter (amagat=2.6867774d+19,fac=1./amagat**2)
|
|
data temp / 1000. , 1500., 2000. , 2500. /
|
|
data ntemp /4/
|
|
data ifirst /0/
|
|
PARAMETER (CAS=2.997925D10)
|
|
c input frequency in Hz but needed wave numbers in cm^-1
|
|
f=ff/cas
|
|
c read in CIA tables if this is the first call
|
|
if (ifirst.eq.0) then
|
|
write(*,'(a)') 'Reading in H2-H CIA opacity tables...'
|
|
open(10,file="./data/CIA_H2H.dat",status='old')
|
|
do i=1,3
|
|
read (10,*)
|
|
end do
|
|
do i=1,nlines
|
|
read (10,*) freq(i),(alpha(i,j),j=1,ntemp)
|
|
end do
|
|
close(10)
|
|
|
|
c take logarithm of tables prior to doing linear interpolations
|
|
|
|
do i=1,nlines
|
|
do j=1,ntemp
|
|
alpha(i,j)=log(alpha(i,j))
|
|
end do
|
|
end do
|
|
|
|
ifirst=1
|
|
end if
|
|
|
|
c locate position in temperature array
|
|
|
|
if(t.gt.2500.) return
|
|
call locate(temp,ntemp,t,j,ntemp)
|
|
|
|
if (j.eq.0) then
|
|
write(*,*)
|
|
write(*,'(a,f6.0,a)')
|
|
* 'Warning: requested temperature is below',temp(1),' K'
|
|
write(*,'(a)') 'CIA H2-H CIA opacity set to zero'
|
|
write(*,*)
|
|
opac=0.
|
|
return
|
|
end if
|
|
|
|
c locate position in frequency array
|
|
call locate(freq,nlines,f,i,nlines)
|
|
|
|
c linearly interpolate in frequency and temperature
|
|
|
|
if (j.eq.ntemp) then
|
|
c hold values constant if off high temperature end of table
|
|
y1=alpha(i,j)
|
|
y2=alpha(i+1,j)
|
|
tt=(f-freq(i))/(freq(i+1)-freq(i))
|
|
alp=(1.-tt)*y1 + tt*y2
|
|
else if (i.eq.0 .or. i.eq.nlines) then
|
|
c set values to a very small number if off frequency table
|
|
alp=-50.
|
|
else
|
|
c interpolate linearly within table
|
|
y1=alpha(i,j)
|
|
y2=alpha(i+1,j)
|
|
y3=alpha(i+1,j+1)
|
|
y4=alpha(i,j+1)
|
|
|
|
tt=(f-freq(i))/(freq(i+1)-freq(i))
|
|
uu=(t-temp(j))/(temp(j+1)-temp(j))
|
|
|
|
alp=(1.-tt)*(1.-uu)*y1 + tt*(1.-uu)*y2 + tt*uu*y3 +
|
|
* (1.-tt)*uu*y4
|
|
end if
|
|
|
|
alp=exp(alp)
|
|
|
|
c final opacity
|
|
|
|
opac=fac*ah2*ah*alp
|
|
c
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C *******************************************************************
|
|
C
|
|
C
|
|
|
|
subroutine cia_hhe(t,ah,ahe,ff,opac)
|
|
c ====================================
|
|
c
|
|
c CIA H-He opacity
|
|
c data from Gustafsson M., Frommhold, L. 2001, ApJ 546, 1168
|
|
c
|
|
IMPLICIT REAL*8(A-H,O-Z)
|
|
parameter (nlines=43)
|
|
dimension freq(nlines),temp(11),alpha(nlines,11)
|
|
parameter (amagat=2.6867774d+19,fac=1./amagat**2)
|
|
data temp / 1000., 1500., 2250., 3000., 4000., 5000.,
|
|
* 6000., 7000., 8000., 9000., 10000./
|
|
data ntemp /11/
|
|
data ifirst /0/
|
|
PARAMETER (CAS=2.997925D10)
|
|
c input frequency in Hz but needed wave numbers in cm^-1
|
|
f=ff/cas
|
|
c read in CIA tables if this is the first call
|
|
if (ifirst.eq.0) then
|
|
write(*,'(a)') 'Reading in H-He CIA opacity tables...'
|
|
open(10,file="./data/CIA_HHe.dat",status='old')
|
|
do i=1,3
|
|
read (10,*)
|
|
end do
|
|
do i=1,nlines
|
|
read (10,*) freq(i),(alpha(i,j),j=1,ntemp)
|
|
end do
|
|
close(10)
|
|
|
|
c take logarithm of tables prior to doing linear interpolations
|
|
|
|
do i=1,nlines
|
|
do j=1,ntemp
|
|
alpha(i,j)=log(alpha(i,j))
|
|
end do
|
|
end do
|
|
|
|
ifirst=1
|
|
end if
|
|
|
|
c locate position in temperature array
|
|
call locate(temp,ntemp,t,j,ntemp)
|
|
|
|
if (j.eq.0) then
|
|
write(*,*)
|
|
write(*,'(a,f6.0,a)')
|
|
* 'Warning: requested temperature is below',temp(1),' K'
|
|
write(*,'(a)') 'CIA H-He opacity set to 0'
|
|
write(*,*)
|
|
opac=0.
|
|
return
|
|
end if
|
|
|
|
c locate position in frequency array
|
|
call locate(freq,nlines,f,i,nlines)
|
|
|
|
c linearly interpolate in frequency and temperature
|
|
|
|
if (j.eq.ntemp) then
|
|
c hold values constant if off high temperature end of table
|
|
y1=alpha(i,j)
|
|
y2=alpha(i+1,j)
|
|
tt=(f-freq(i))/(freq(i+1)-freq(i))
|
|
alp=(1.-tt)*y1 + tt*y2
|
|
else if (i.eq.0 .or. i.eq.nlines) then
|
|
c set values to a very small number if off frequency table
|
|
alp=-50.
|
|
else
|
|
c interpolate linearly within table
|
|
y1=alpha(i,j)
|
|
y2=alpha(i+1,j)
|
|
y3=alpha(i+1,j+1)
|
|
y4=alpha(i,j+1)
|
|
|
|
tt=(f-freq(i))/(freq(i+1)-freq(i))
|
|
uu=(t-temp(j))/(temp(j+1)-temp(j))
|
|
|
|
alp=(1.-tt)*(1.-uu)*y1 + tt*(1.-uu)*y2 + tt*uu*y3 +
|
|
* (1.-tt)*uu*y4
|
|
end if
|
|
|
|
alp=exp(alp)
|
|
|
|
c final opacity
|
|
|
|
opac=fac*ah*ahe*alp
|
|
c
|
|
return
|
|
end
|
|
C
|
|
C
|
|
C *******************************************************************
|
|
C
|
|
C
|
|
subroutine h2minus(t,anh2,ane,fr,oph2m)
|
|
C =======================================
|
|
C
|
|
C H- free-free opacity
|
|
C
|
|
C K L Bell 1980 J. Phys. B: At. Mol. Phys. 13 1859, Table 1
|
|
C The first column is theta=5040/T(K)
|
|
C The first row are names for each row corresponding to lambda (angstroms)
|
|
C The last row for 10.0 is linearly extrapolated
|
|
C The units of everything else is 10^26 cm4/dyn-1
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
dimension FFthet(9),FFlamb(18),FFkapp(18,9)
|
|
data FFthet / 0.5, 0.8, 1.0, 1.2, 1.6, 2.0,
|
|
* 2.8, 3.6, 10.0 /
|
|
data nthet /9/
|
|
data FFlamb /151883., 113913., 91130., 60753.,
|
|
* 45565., 36452., 30377., 22783.,
|
|
* 18226., 15188., 11391., 9113., 7594.,
|
|
* 6509., 5696., 5063., 4142., 3505./
|
|
data nlamb /18/
|
|
data FFkapp /
|
|
* 7.16e+01,4.03e+01,2.58e+01,1.15e+01,6.47e+00,
|
|
* 4.15e+00,2.89e+00,1.63e+00,1.05e+00,7.36e-01,
|
|
* 4.20e-01,2.73e-01,1.92e-01,1.43e-01,1.10e-01,
|
|
* 8.70e-02,5.84e-02,4.17e-02,9.23e+01,5.20e+01,
|
|
* 3.33e+01,1.48e+01,8.37e+00,5.38e+00,3.76e+00,
|
|
* 2.14e+00,1.39e+00,9.75e-01,5.64e-01,3.71e-01,
|
|
* 2.64e-01,1.98e-01,1.54e-01,1.24e-01,8.43e-02,
|
|
* 6.10e-02,1.01e+02,5.70e+01,3.65e+01,1.63e+01,
|
|
* 9.20e+00,5.92e+00,4.14e+00,2.36e+00,1.54e+00,
|
|
* 1.09e+00,6.35e-01,4.22e-01,3.03e-01,2.30e-01,
|
|
* 1.80e-01,1.46e-01,1.01e-01,7.34e-02,1.08e+02,
|
|
* 6.08e+01,3.90e+01,1.74e+01,9.84e+00,6.35e+00,
|
|
* 4.44e+00,2.55e+00,1.66e+00,1.18e+00,6.97e-01,
|
|
* 4.67e-01,3.39e-01,2.59e-01,2.06e-01,1.67e-01,
|
|
* 1.17e-01,8.59e-02,1.18e+02,6.65e+01,4.27e+01,
|
|
* 1.91e+01,1.08e+01,6.99e+00,4.91e+00,2.84e+00,
|
|
* 1.87e+00,1.34e+00,8.06e-01,5.52e-01,4.08e-01,
|
|
* 3.17e-01,2.55e-01,2.10e-01,1.49e-01,1.11e-01,
|
|
* 1.26e+02,7.08e+01,4.54e+01,2.04e+01,1.16e+01,
|
|
* 7.50e+00,5.28e+00,3.07e+00,2.04e+00,1.48e+00,
|
|
* 9.09e-01,6.33e-01,4.76e-01,3.75e-01,3.05e-01,
|
|
* 2.53e-01,1.82e-01,1.37e-01,1.38e+02,7.76e+01,
|
|
* 4.98e+01,2.24e+01,1.28e+01,8.32e+00,5.90e+00,
|
|
* 3.49e+00,2.36e+00,1.74e+00,1.11e+00,7.97e-01,
|
|
* 6.13e-01,4.92e-01,4.06e-01,3.39e-01,2.49e-01,
|
|
* 1.87e-01,1.47e+02,8.30e+01,5.33e+01,2.40e+01,
|
|
* 1.38e+01,9.02e+00,6.44e+00,3.90e+00,2.68e+00,
|
|
* 2.01e+00,1.32e+00,9.63e-01,7.51e-01,6.09e-01,
|
|
* 5.07e-01,4.27e-01,3.16e-01,2.40e-01,2.19e+02,
|
|
* 1.26e+02,8.13e+01,3.68e+01,2.18e+01,1.46e+01,
|
|
* 1.08e+01,7.18e+00,5.24e+00,4.17e+00,3.00e+00,
|
|
* 2.29e+00,1.86e+00,1.55e+00,1.32e+00,1.13e+00,
|
|
* 8.52e-01,6.64e-01/
|
|
|
|
c locate position in temperature array
|
|
theta=5040./t
|
|
|
|
call locate(FFthet,nthet,theta,j,nthet)
|
|
if (j.eq.0) then
|
|
write(*,*)
|
|
write(*,'(a,f6.0,a)')
|
|
* 'Error: requested temperature is outside the ranges'
|
|
write(*,'(a)') 'h2minus:Stop'
|
|
write(*,*)
|
|
stop
|
|
end if
|
|
flamb=2.997925e18/fr
|
|
c locate position in wavelength array
|
|
call locate(FFlamb,nlamb,flamb,i,nlamb)
|
|
|
|
c linearly interpolate in frequency and temperature
|
|
if (j.eq.nthet) then
|
|
c hold values constant if off high temperature end of table
|
|
y1=FFkapp(i,j)
|
|
y2=FFkapp(i+1,j)
|
|
tt=(flamb-FFlamb(i))/(FFlamb(i+1)-FFlamb(i))
|
|
Fkappa=(1.-tt)*y1 + tt*y2
|
|
else if (i.eq.0 .or. i.eq.nlines) then
|
|
c set values to 0 if off frequency table
|
|
Fkappa=0.0
|
|
else
|
|
c interpolate linearly within table
|
|
y1=FFkapp(i,j)
|
|
y2=FFkapp(i+1,j)
|
|
y3=FFkapp(i+1,j+1)
|
|
y4=FFkapp(i,j+1)
|
|
|
|
tt=(flamb-FFlamb(i))/(FFlamb(i+1)-FFlamb(i))
|
|
uu=(theta-FFthet(j))/(FFthet(j+1)-FFthet(j))
|
|
|
|
Fkappa=(1.-tt)*(1.-uu)*y1 + tt*(1.-uu)*y2 + tt*uu*y3 +
|
|
* (1.-tt)*uu*y4
|
|
end if
|
|
pe=ane*BOLK*t
|
|
oph2m= anh2 * 1.0E-26 *pe * Fkappa
|
|
return
|
|
end
|
|
c
|
|
c
|
|
c **********************************************************************
|
|
c
|
|
c
|
|
|
|
subroutine prnt
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
dimension ipop(4)
|
|
c
|
|
data ipop /98,99,100,115/
|
|
c
|
|
do id=1,nd,69
|
|
hkt=hk/temp(id)
|
|
ane=elec(id)
|
|
call sabolf(id)
|
|
c do k=1,4
|
|
do k=3,3
|
|
ii=ipop(k)-3
|
|
iat=iatm(ii)
|
|
ie=iel(ii)
|
|
psum=0.
|
|
psuu=0.
|
|
do j=n0a(iat),nka(iat)
|
|
psum=psum+popul(j,id)
|
|
if(ilk(j).gt.0)
|
|
* psuu=psuu+usum(ilk(j))*elec(id)*popul(j,id)
|
|
end do
|
|
BB=DENS(ID)/WMM(ID)/YTOT(ID)*ABUND(IAT,ID)
|
|
rin=0.
|
|
rou=0.
|
|
c write(63,601) id,ii,psum,bb,popul(ii,id)
|
|
do jj=nfirst(ie),ii-1
|
|
itr=itra(jj,ii)
|
|
ru=rru(itr,id)*wop(ii,id)
|
|
cu=colrat(itr,id)*wop(ii,id)
|
|
if(ii.le.nlast(ie)) then
|
|
rd=rrd(itr,id)*g(jj)/g(ii)*exp(hkt*fr0(itr))*wop(jj,id)
|
|
else
|
|
rd=rrd(itr,id)*sbf(jj)*ane*wop(jj,id)
|
|
end if
|
|
cd=coltar(itr,id)*wop(jj,id)
|
|
c write(63,602) jj,itr,popul(jj,id),ru,cu,rd,cd
|
|
rin=rin+(ru+cu)*popul(jj,id)
|
|
rou=rou+(rd+cd)*popul(ii,id)
|
|
end do
|
|
c
|
|
do jj=ii+1,nnext(ie)
|
|
itr=itra(ii,jj)
|
|
ru=rru(itr,id)*wop(jj,id)
|
|
cu=colrat(itr,id)*wop(jj,id)
|
|
if(jj.le.nlast(ie)) then
|
|
rd=rrd(itr,id)*g(ii)/g(jj)*exp(hkt*fr0(itr))*wop(ii,id)
|
|
else
|
|
rd=rrd(itr,id)*sbf(ii)*ane*wop(ii,id)
|
|
end if
|
|
cd=coltar(itr,id)*wop(ii,id)
|
|
c write(63,602) jj,itr,popul(jj,id),rd,cd,ru,cu
|
|
rou=rou+(ru+cu)*popul(ii,id)
|
|
rin=rin+(rd+cd)*popul(jj,id)
|
|
end do
|
|
c
|
|
c write(63,603) id,ii,rou,rin,(rou-rin)/rin
|
|
end do
|
|
c write(63,*)
|
|
end do
|
|
c write(63,*) '=============================='
|
|
c write(63,*)
|
|
c
|
|
c 601 format('id,ii',2i4,1p4e12.4)
|
|
c 602 format(' jj ',i4,i5,1p5e12.4)
|
|
c 603 format('iitot',2i4,1p3e12.4/)
|
|
c
|
|
return
|
|
end
|
|
|
|
c
|
|
c **********************************************************************
|
|
c
|
|
c
|
|
subroutine rechck
|
|
c =================
|
|
c
|
|
c check of radiative equilibrium - integral version
|
|
c
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
dimension abt(mdepth),emt(mdepth)
|
|
c
|
|
do id=1,nd
|
|
abt(id)=0.
|
|
emt(id)=0.
|
|
end do
|
|
c
|
|
do ij=1,nfreq
|
|
call opacf1(ij)
|
|
call rtefr1(ij)
|
|
do id=1,nd
|
|
abt(id)=abt(id)+(abso1(id)-scat1(id))*rad1(id)*w(ij)
|
|
emt(id)=emt(id)+emis1(id)*w(ij)
|
|
end do
|
|
end do
|
|
c
|
|
write(17,600)
|
|
600 format(/' id dm T int(kappa*J) int(emis) rel'/)
|
|
do id=1,nd
|
|
re=(abt(id)-emt(id))/emt(id)
|
|
write(17,601) id,dm(id),temp(id),abt(id),emt(id),re
|
|
end do
|
|
601 format(i4,1pe11.3,0pf10.1,2x,1p3e13.5)
|
|
c
|
|
return
|
|
end
|
|
|
|
c
|
|
c **********************************************************************
|
|
c
|
|
c
|
|
SUBROUTINE LYMLIN(IJ)
|
|
C =====================
|
|
C
|
|
C opacity and emissibvity in first 30 Lyman lines
|
|
C
|
|
INCLUDE 'IMPLIC.FOR'
|
|
INCLUDE 'BASICS.FOR'
|
|
INCLUDE 'ATOMIC.FOR'
|
|
INCLUDE 'MODELQ.FOR'
|
|
C
|
|
PARAMETER (SIXTH=1./6.,TTW=2./3.,
|
|
* OS0=0.02654,CPP=4.1412E-16,CPJ=157803.,
|
|
* C00=1.25E-9,C18=2.997925E18)
|
|
PARAMETER (MLEVL=30)
|
|
C
|
|
DIMENSION ABLYM(MDEPTH),EMLYM(MDEPTH),
|
|
* XKIJL(MLEVL),FIJL(MLEVL),WL0L(MLEVL),FR0L(MLEVL),
|
|
* F00(MDEPTH),DOP0(MDEPTH),PJ(MLEVL,MDEPTH),
|
|
* ABTR(MLEVL,MDEPTH),EMTR(MLEVL,MDEPTH),FID(MLEVL,MDEPTH),
|
|
* AD0(MLEVL,MDEPTH),DIV0(MLEVL,MDEPTH),
|
|
* DBET0(MLEVL,MDEPTH),BETAD0(MLEVL,MDEPTH)
|
|
C
|
|
DATA INIP/1/
|
|
C
|
|
IF(IELH.EQ.0) RETURN
|
|
C
|
|
FR=FREQ(IJ)
|
|
IF(FR.GT.3.28805E15.OR.FR.LT.1.5E15) RETURN
|
|
C
|
|
IF(INIP.EQ.1) THEN
|
|
N0H=NFIRST(IELH)
|
|
N1H=NLAST(IELH)
|
|
NKH=NNEXT(IELH)
|
|
NLH=N1H-N0H
|
|
XII=1.
|
|
DO J=2,30
|
|
CALL STARK0(1,J,1,XKIJ0,WL00,FIJ0)
|
|
XKIJL(J)=XKIJ0
|
|
FIJL(J)=FIJ0
|
|
WL0L(J)=WL00
|
|
FR0L(J)=C18/WL0L(J)
|
|
END DO
|
|
DO ID=1,ND
|
|
T=TEMP(ID)
|
|
T1=1./T
|
|
SQT=SQRT(T)
|
|
ANE=ELEC(ID)
|
|
ANP=POPUL(NKH,ID)
|
|
F00(ID)=C00*ANE**TTW
|
|
DOP0(ID)=1.E8*SQRT(1.65E8*T+VTURB(ID))
|
|
C
|
|
P0=CPP*ANE*ANP*T1/SQT
|
|
P1=POPUL(N0H,ID)
|
|
DO J=2,30
|
|
X=J*J
|
|
JJ=N0H+J-1
|
|
XJJ=1./JJ
|
|
IF(J.LE.NLH) THEN
|
|
PJ(J,ID)=POPUL(JJ,ID)
|
|
ELSE
|
|
PJ(J,ID)=P0*EXP(CPJ/(X*T))*X*WNHINT(J,ID)
|
|
END IF
|
|
ABTR(J,ID)=P1*WNHINT(J,ID)
|
|
EMTR(J,ID)=PJ(J,ID)*XJJ*EXP(CPJ*(XII-XJJ)*T1)
|
|
C
|
|
FXK=F00(ID)*XKIJL(J)
|
|
DBETA=WL0L(J)*WL0L(J)/(C18*FXK)
|
|
FID(J,ID)=OS0*FIJL(J)*DBETA
|
|
DOP=DOP0(ID)/WL0L(J)
|
|
BETAD=DOP*DBETA
|
|
CALL DIVSTR(1)
|
|
AD0(J,ID)=ADH
|
|
DIV0(J,ID)=DIVH
|
|
DBET0(J,ID)=DBETA
|
|
BETAD0(J,ID)=BETAD
|
|
END DO
|
|
END DO
|
|
INIP=0
|
|
END IF
|
|
C
|
|
FR=FREQ(IJ)
|
|
WL=C18/FR
|
|
F15=FR*1.E-15
|
|
DO ID=1,ND
|
|
ABLYM(ID)=0.
|
|
EMLYM(ID)=0.
|
|
DO J=2,30
|
|
BETA=DBET0(J,ID)*ABS(FR-FR0L(J))
|
|
BETAD=BETAD0(J,ID)
|
|
ADH=AD0(J,ID)
|
|
DIVH=DIV0(J,ID)
|
|
SG=STARKA(BETA,TWO)*FID(J,ID)
|
|
ABLYM(ID)=ABLYM(ID)+SG*ABTR(J,ID)
|
|
EMLYM(ID)=EMLYM(ID)+SG*EMTR(J,ID)
|
|
c if(wl.gt.1120.0.and.wl.lt.1120.3.and.id.eq.50)
|
|
c * write(6,600) j,fr,fr0l(j),abs(fr-fr0l(j)),
|
|
c * dbet0(j,id),beta,fid(j,id),sg,abtr(j,id),
|
|
c * emtr(j,id),sg*abtr(j,id),ablym(id)
|
|
c if(wl.gt.1120.0.and.wl.lt.1120.3.and.id.eq.50)
|
|
c * write(6,600) j,fid(j,id),dbet0(j,id),wl0l(j),xkijl(j),
|
|
c * dop0(id),fijl(j)
|
|
c 600 format('lymsig',i4,1p11e11.3)
|
|
END DO
|
|
XKT=EXP(-4.79928e-11*FR/TEMP(ID))
|
|
XKB=XKT*1.4743E-2*F15*F15*F15
|
|
ABLYM(ID)=ABLYM(ID)-XKT*EMLYM(ID)
|
|
EMLYM(ID)=XKB*EMLYM(ID)
|
|
ABSO1(ID)=ABSO1(ID)+ABLYM(ID)
|
|
EMIS1(ID)=EMIS1(ID)+EMLYM(ID)
|
|
c if(wl.gt.1120.0.and.wl.lt.1120.3)
|
|
c * write(6,601) ij,wl,ablym(50),emlym(50),xkt,xkb
|
|
c 601 format('lymlin',i6,f10.3,1p4e11.3)
|
|
END DO
|
|
RETURN
|
|
END
|
|
|
|
|