|
|
我用的是BHMIE代码,对原程序修改,可计算相函数P(θ),但是计算截止误差的T的积分不知道如何插入,我想用梯形面积积分写这段代码。
! 用Mie算前向截止误差和相函数随粒径的变化的情况
! 2012年12月17日
PROGRAM CALLBH
! CALLBH CALCULATES THE SIZE PARAMETER (X) AND RELATIVE REFRACTIVE
! & INDEX (REFREL) FOR A GIVEN SPHERE REFRACTIVE INDEX, MEDIUM REFRACTIVE
! & INDEX , RADIUS, AND FREE SPACE WAVELENGTH. IT THEN CALLS BUMIE, THE SUBROUTINE
! & THAT COMPUTES AMPLITUDE SCATTERING MATRIX ELEMENTS AND EFFICIENCIES
COMPLEX REFREL, S1(200),S2(200) !REFREL 是球的相对折射率
WRITE(*,11)
! REFMED (REAL) REFRACTIVE INDEX OF SURROUNDING MEDIUM !周围介质的折射率
REFMED=1.0
REFRE=1.5
REFIM=0.0
! REFRACTIVE INDEX OF SPHERE = REFRE + i*REFIM
REFREL=CMPLX(REFRE,REFIM)/REFMED
WRITE (*,12) REFMED,REFRE,REFIM
! RADIUS (RAD) AND WAVELENGTH (WAVEL) SAME UNITS
RAD=.500
WAVEL=.532
X=2.*3.14159265*RAD*REFMED/WAVEL
WRITE (*,13) RAD,WAVEL
WRITE (*,14) X
! NANG = NUMBER OF ANGLES BETWEEN 0 AND 90 DEGREES
! MATRIX ELEMENTS CALCULATED AT 2*NANG - 1 ANGLES
! INCLUDING 0, 90, AND 180 DEGREES
NANG=14
DANG=1.570796327/FLOAT(NANG-1)
CALL BHMIE(X,REFREL,NANG,S1,S2,QEXT,QSCA,QBACK)
WRITE (*,65) QSCA,QEXT,QBACK
WRITE (*,17)
! S33 AND S34 MATRIX ELEMENTS NORMALIZED BY S11
! S11 IS NORMALIZED TO 1.0 IN THE FORWARD DIRECTION
! POL=DEGEREE OF POLARIZATION (INCIDENT UNPOLARIZED LIGHT)
S11NOR=0.5*(CABS(S2(1))**2+CABS(S1(1))**2)
NAN=2*NANG-1
DO 355 J=1,NAN
AJ=J
S11=0.5*CABS(S2(J))*CABS(S2(J))
S11=S11+0.5*CABS(S1(J))*CABS(S1(J))
S12=0.5*CABS(S2(J))*CABS(S2(J))
S12=S12-0.5*CABS(S1(J))*CABS(S1(J))
POL=-S12/S11
S33=REAL(S2(J)*CONJG(S1(J)))
S33=S33/S11
S34=AIMAG(S2(J)*CONJG(S1(J)))
S34=S34/S11
S11=S11/S11NOR
ANG=DANG*(AJ-1.)*57.2958
PHMIE=(CABS(S1(J))*CABS(S1(J))+CABS(S2(J))*CABS(S2(J)))/(2*3.14159265*X*X*QSCA) !添加的
355 WRITE (*,75) ANG,S11,POL,S33,S34,PHMIE !修改
65 FORMAT (//,1X,"QSCA= ",E13.6,3X,"QEXT=",E13.6,3X,"QBACK= ",E13.6)
75 FORMAT (1X,F6.2,2X,E13.4,2X,E13.4,2X,E13.4,2X,E13.4,2X,E13.4,1X,F6.2)
11 FORMAT (/"SPHERE SCATTERING PROGRAM"//)
12 FORMAT (5X,"REFMED= ",F8.4,3X,"REFRE= ",E14.6,3X,"REFIM= ",E14.6)
13 FORMAT (5X,"SPHERE RADIUS = ",F7.3 ,3X,"WAVELENGTH = ", F7.4)
14 FORMAT (5X,"SIZE PARAMETER = ",F8.3/)
17 FORMAT (//,2X,"ANGLE",7X,"Sll",13X,"POL",13X,"S33",13X,"S34",13X,"PHMIE"//) !修改
STOP
END
! SUBROUTINE BHMIE CALCULATES AMPLITUDE SCATTERING MATRIX
! ELEMENTS AND EFFICIENCIES FOR EXTINCTION, TOTAL SCATTERING
! AND BACKSCATTERING FOR A GIVEN SIZE PARAMETER AND
! RELATIVE REFRACTIVE INDEX
SUBROUTINE BHMIE (X,REFREL,NANG,S1,S2,QEXT, QSCA,QBACK)
DIMENSION AMU(100),THETA(100),PI(100),TAU(100),PI0(100),PI1(100)
COMPLEX D(3000),Y,REFREL,XI,XI0,XI1,AN,BN,S1(200),S2(200) !AN和BN为散射系数
DOUBLE PRECISION PSI0,PSI1,PSI,DN,DX
DX=X !把形状因子X赋给DX
Y=X*REFREL
! SERIES TERMINATED AFTER NSTOP TERMS
XSTOP = X+4.*X**0.3333+2.0 !XSTOP是前面的近似
NSTOP=XSTOP
YMOD=CABS(Y)
NMX=AMAX1(XSTOP,YMOD)+15 !比较两者的最大值再加15
DANG=1.570796327/FLOAT(NANG-1) !求总角度数
DO 555 J=1,NANG
THETA(J)=(FLOAT(J)-1.)*DANG
555 AMU(J)=COS(THETA(J))
! LOGARITHMIC DERIVATIVE D(J) CALCULATED BY DOWNWARD
! RECURRENCE BEGINNING WITH INITIAL VALUE 0.0 + I*0.0 用初值为 0.0 + I*0.0 的下递归计算对数导数
! AT J = NMX
D(NMX)=CMPLX(0.0,0.0) ! NMX=0.0+i0.0为递归初值
NN=NMX-1
DO 120 N=1,NN
RN=NMX-N+1
120 D(NMX-N)=(RN/Y)-(1./(D(NMX-N+1)+RN/Y))
DO 666 J=1,NANG
PI0(J)=0.0
666 PI1(J)=1.0
NN = 2*NANG-1
DO 777 J=1,NN
S1(J)=CMPLX(0.0,0.0)
777 S2(J)=CMPLX(0.0,0.0)
! RICCATI-BESSEL FUNCTIONS WITH REAL ARGUMENT X 用上递归计算实元X的黎卡迪-贝塞尔函数
! CALCULATED BY UPWARD RECURRENCE
PSI0=DCOS(DX)
PSI1=DSIN(DX)
CHI0=-SIN(X)
CHI1=COS(X)
APSI0=PSI0
APSI1=PSI1
XI0=CMPLX(APSI0,-CHI0)
XI1=CMPLX(APSI1,-CHI1)
QSCA=0.0
N=1
200 DN=N !DN是向下或向上递归的结果
RN=N
FN=(2.*RN+1.)/(RN*(RN+1.))
PSI=(2.*DN-1.)*PSI1/DX-PSI0
APSI=PSI
CHI=(2.*RN-1.)*CHI1/X-CHI0
XI=CMPLX(APSI, -CHI)
AN =(D(N)/REFREL+RN/X)*APSI-APSI1
AN=AN/((D(N)/REFREL+RN/X)*XI-XI1)
BN=(REFREL*D(N) + RN/X)*APSI-APSI1
BN =BN/((REFREL*D(N)+ RN/X)*XI-XI1)
QSCA = QSCA+(2.*RN+1.)*(CABS(AN)*CABS(AN) + CABS(BN)*CABS(BN))
DO 789 J=1,NANG
JJ=2*NANG-J
PI(J) =PI1(J)
TAU(J)=RN*AMU(J)*PI(J)-(RN +1.)*PI0 (J)
P=(-1.)**(N-1)
S1(J) = S1(J)+FN*(AN*PI(J)+BN*TAU(J))
T = (-1.)**N
S2(J) = S2(J) + FN*(AN*TAU(J)+BN*PI(J))
IF(J.EQ.JJ) GO TO 789
S1(JJ) = S1(JJ) + FN*(AN*PI(J)*P+BN*TAU(J)*T)
S2(JJ) = S2(JJ) + FN*(AN*TAU(J)*T + BN*PI(J)*P)
789 CONTINUE
PSI0 = PSI1
PSI1=PSI
APSI1=PSI1
CHI0=CHI1
CHI1=CHI
XI1 = CMPLX(APSI1,-CHI1)
N=N+1
RN=N
DO 999 J=1,NANG
PI1(J)=((2.*RN-1.)/(RN-1.))*AMU(J)*PI(J)
PI1(J)=PI1(J)-RN*PI0(J)/(RN-1.)
999 PI0(J)=PI(J)
IF (N-1-NSTOP) 200,300,300
300 QSCA=(2./(X*X))*QSCA
QEXT=(4./(X*X))*REAL(S1(1))
QBACK=(4./(X*X))*CABS(S1(2*NANG-1))*CABS(S1(2*NANG-1))
RETURN
END |
|