⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 code210.f90

📁 Fortran 90 and HPF Programs Related to the Book
💻 F90
字号:
!!!!!!!!!!!!!!!!!!!!!!!!!!!   Program 2.10   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                                                                       !! Please Note:                                                          !!                                                                       !! (1) This computer program is written by Tao Pang in conjunction with  !!     his book, "An Introduction to Computational Physics," published   !!     by Cambridge University Press in 1997.                            !!                                                                       !! (2) No warranties, express or implied, are made for this program.     !!                                                                       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!MODULE CB  REAL :: B,E,AEND MODULE CB!PROGRAM SCATTERING!! This is the main program for the scattering problem.! Copyright (c) Tao Pang 1997.!  USE CB  IMPLICIT NONE  INTEGER, PARAMETER :: M=21,N=10001  INTEGER I,J,ISTEP  REAL :: DL,B0,DB,DX,X0,X,DX0,F,FX,FB,FBX,G1,G2,RU,RUTH,SI  REAL, DIMENSION (N) :: FI  REAL, DIMENSION (M) :: THETA,SIG,SIG1!  DL = 1.E-06  B0 = 0.01  DB = 0.5  DX = 0.01  E  = 1.0  A  = 100.0  DO I = 1, M    B  = B0+(I-1)*DB!! Calculate the first term of theta!    DO J = 1, N      X = B+DX*J      FI(J) = 1.0/(X*X*SQRT(FBX(X)))    END DO    CALL SIMP(N,DX,FI,G1)!! Find r_m from 1-b*b/(r*r)-U/E=0!    X0  = B    DX0 = DX    CALL SECANT (DL,X0,DX0,ISTEP)!! Calculate the second term of theta!    DO J = 1, N      X = X0+DX*J      FI(J) = 1.0/(X*X*SQRT(FX(X)))    END DO    CALL SIMP (N,DX,FI,G2)    THETA(I) = 2.0*B*(G1-G2)    END DO!! Calculate d_theta/d_b!    CALL THREE (M,DB,THETA,SIG,SIG1)!! Put the cross section in log form with the exact result of! the Coulomb scattering (RUTH)!    DO I = M, 1, -1      B      = B0+(I-1)*DB      SIG(I) = B/ABS(SIG(I))/SIN(THETA(I))      RUTH   = 1.0/SIN(THETA(I)/2.0)**4/16.0      SI     = ALOG(SIG(I))      RU     = ALOG(RUTH)      WRITE (6,"(3F16.8)") THETA(I),SI,RU    END DOEND PROGRAM SCATTERING!SUBROUTINE SIMP (N,H,FI,S)!! Subroutine for integration over f(x) with the Simpson rule.  FI:! integrand f(x); H: interval; S: integral.  Copyright (c) Tao Pang 1997.!  IMPLICIT NONE  INTEGER, INTENT (IN) :: N  INTEGER :: I  REAL, INTENT (IN) :: H  REAL :: S0,S1,S2  REAL, INTENT (OUT) :: S  REAL, INTENT (IN), DIMENSION (N) :: FI!  S  = 0.0  S0 = 0.0  S1 = 0.0  S2 = 0.0  DO I = 2, N-1, 2    S1 = S1+FI(I-1)    S0 = S0+FI(I)    S2 = S2+FI(I+1)  END DO  S = H*(S1+4.0*S0+S2)/3.0!! If N is even, add the last slice separately!  IF (MOD(N,2).EQ.0) S = S &     +H*(5.0*FI(N)+8.0*FI(N-1)-FI(N-2))/12.0END SUBROUTINE SIMP!SUBROUTINE SECANT (DL,X0,DX,ISTEP)!! Subroutine for the root of f(x)=0 with the secant method.! Copyright (c) Tao Pang 1997.!  IMPLICIT NONE  INTEGER, INTENT (INOUT) :: ISTEP  REAL, INTENT (INOUT) :: X0,DX  REAL :: X1,X2,D,F,FX  REAL, INTENT (IN) :: DL!  ISTEP = 0  X1 = X0+DX  DO WHILE (ABS(DX).GT.DL)    D  = FX(X1)-FX(X0)    X2 = X1-FX(X1)*(X1-X0)/D    X0 = X1    X1 = X2    DX = X1-X0    ISTEP = ISTEP+1  END DOEND SUBROUTINE SECANT!SUBROUTINE THREE (N,H,FI,F1,F2)!! Subroutine for 1st and 2nd order derivatives with the three-point! formulas. Extrapolations are made at the boundaries.  FI: input! f(x); H: interval; F1: f'; and F2: f".  Copyright (c) Tao Pang 1997.!  IMPLICIT NONE  INTEGER, INTENT (IN) :: N  INTEGER :: I  REAL, INTENT (IN) :: H  REAL, INTENT (IN), DIMENSION (N) :: FI  REAL, INTENT (OUT), DIMENSION (N) :: F1,F2!! f' and f" from three-point formulas!  DO I = 2, N-1    F1(I) = (FI(I+1)-FI(I-1))/(2.*H)    F2(I) = (FI(I+1)-2.0*FI(I)+FI(I-1))/(H*H)  END DO!! Linear extrapolation for the boundary points!  F1(1) = 2.0*F1(2)-F1(3)  F1(N) = 2.0*F1(N-1)-F1(N-2)  F2(1) = 2.0*F2(2)-F2(3)  F2(N) = 2.0*F2(N-1)-F2(N-2)END SUBROUTINE THREE!FUNCTION FX(X) RESULT (F)  USE CB  IMPLICIT NONE  REAL :: X,F,U,UX!  F = 1.0-B*B/(X*X)-UX(X)/EEND FUNCTION FX!FUNCTION FBX(X) RESULT (FB)  USE CB  IMPLICIT NONE  REAL :: X,FB!    FB = 1.0-B*B/(X*X)END FUNCTION FBX! FUNCTION UX(X) RESULT (U)  USE CB  IMPLICIT NONE  REAL :: X,U!  U = 1.0/X*EXP(-X/A)END FUNCTION UX

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -