LCOV - code coverage report
Current view: top level - physics/carma/base - miess.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 263 0.0 %
Date: 2025-03-14 01:33:33 Functions: 0 1 0.0 %

          Line data    Source code
       1             : ! Include shortname defintions, so that the F77 code does not have to be modified to
       2             : ! reference the CARMA structure.
       3             : #include "carma_globaer.h"
       4             : 
       5             : !! This subroutine computes mie scattering by a stratified sphere,
       6             : !! i.e. a particle consisting of a spherical core surrounded by a
       7             : !! Spherical shell.  The basic code used was that described in the
       8             : !! report: " Subroutines for computing the parameters of the
       9             : !! electromagnetic radiation scattered by a sphere " J.V. Dave,
      10             : !! IBM Scientific Center, Palo Alto , California.
      11             : !! Report No. 320 - 3236 .. May 1968 .
      12             : !!
      13             : !! The modifications for stratified spheres are described in
      14             : !!   Toon and Ackerman, Appl. Optics, in press, 1981
      15             : !!
      16             : !! The definitions for the output parameters can be found in "Light
      17             : !! scattering by small particles, H.C.Van de Hulst, John Wiley '
      18             : !! Sons, Inc., New York, 1957".
      19             : !!
      20             : !! Also the subroutine computes the capital A function by making use of
      21             : !! downward recurrence relationship.
      22             : !!
      23             : !! @author Brian Toon
      24             : !! @version 1981?
      25           0 : SUBROUTINE miess(carma,RO,RFR,RFI,THETD,JX,QEXT,QSCAT,QBS,CTBRQS,R,RE2,TMAG2,WVNO,rc)
      26             : 
      27             :         ! types
      28             :   use carma_precision_mod
      29             :   use carma_constants_mod, only : IT, DEG2RAD
      30             :   use carma_enums_mod, only     : RC_ERROR
      31             :   use carma_types_mod, only     : carma_type
      32             :   use carma_mod
      33             : 
      34             :         implicit none
      35             : 
      36             :   type(carma_type), intent(in)         :: carma   !! the carma object
      37             :   real(kind=f), intent(in)             :: RO         !! OUTER (SHELL) RADIUS
      38             :   real(kind=f), intent(in)             :: RFR        !! REAL PART OF THE SHELL INDEX OF REFRACTION
      39             :   real(kind=f), intent(in)             :: RFI        !! IMAGINARY PART OF THE SHELL INDEX OF REFRACTION
      40             :   real(kind=f), intent(in)             :: R          !! CORE RADIUS
      41             :   real(kind=f), intent(in)             :: RE2        !! REAL PART OF THE CORE INDEX OF REFRACTION
      42             :   real(kind=f), intent(in)             :: TMAG2      !! IMAGINARY PART OF THE CORE INDEX OF REFRACTION
      43             : 
      44             :   !! ANGLE IN DEGREES BETWEEN THE DIRECTIONS OF THE INCIDENT
      45             :   !! AND THE SCATTERED RADIATION.  THETD(J) IS< OR= 90.0
      46             :   !! IF THETD(J) SHOULD HAPPEN TO BE GREATER THAN 90.0, ENTER WITH
      47             :   !! SUPPLEMENTARY VALUE, SEE COMMENTS ON ELTRMX.
      48             :   real(kind=f), intent(inout)          :: THETD(IT)
      49             :   
      50             :   !! TOTAL NUMBER OF THETD FOR WHICH THE COMPUTATIONS ARE
      51             :   !! REQUIRED.  JX SHOULD NOT EXCEED IT UNLESS THE DIMENSIONS
      52             :   !! STATEMENTS ARE APPROPRIATEDLY MODIFIED.
      53             :   integer, intent(in)                  :: JX
      54             :   
      55             :   real(kind=f), intent(out)            :: QEXT       !! EFFICIENCY FACTOR FOR EXTINCTION,VAN DE HULST,P.14 ' 127.
      56             :   real(kind=f), intent(out)            :: QSCAT      !! EFFICIENCY FACTOR FOR SCATTERING,V.D. HULST,P.14 ' 127.
      57             :   real(kind=f), intent(out)            :: QBS        !! BACK SCATTER CROSS SECTION.
      58             :   real(kind=f), intent(out)            :: CTBRQS     !! AVERAGE(COSINE THETA) * QSCAT,VAN DE HULST,P.128.
      59             :   real(kind=f), intent(in)             :: WVNO       !! 2*PI / WAVELENGTH.
      60             :   integer, intent(inout)               :: rc         !! return code, negative indicates failure
      61             : 
      62             :   ! Local declarations
      63             :   real(kind=f), parameter              :: EPSILON_MIE = 1.e-14_f
      64             :   
      65             :   integer                              :: I
      66             :   integer                              :: J
      67             :   integer                              :: K
      68             :   integer                              :: M
      69             :   integer                              :: N
      70             :   integer                              :: NN
      71             :   integer                              :: NMX1
      72             :   integer                              :: NMX2
      73             :   integer                              :: IFLAG
      74             :   integer                              :: IACAP
      75             :   
      76             :   ! FNAP, FNBP  ARE THE PRECEDING VALUES OF FNA, FNB RESPECTIVELY.
      77             :   complex(kind=f) :: FNAP,   FNBP,   &
      78             :                      FNA,    FNB,    RF,       RRF, &
      79             :                      RRFX,   WM1,    FN1,      FN2, &
      80             :                      TC1,    TC2,    WFN(2),   Z(4), &
      81             :                      K1,     K2,     K3,       &
      82             :                      RCR,    U(8),   DH1, &
      83             :                      DH2,    DH4,    P24H24,   P24H21, &
      84             :                      PSTORE, HSTORE, DUMMY,    DUMSQ
      85             : 
      86           0 :   complex(kind=f), allocatable :: ACAP(:), W(:,:)
      87             : 
      88             :  
      89             :   ! TA(1): REAL PART OF WFN(1).  TA(2): IMAGINARY PART OF WFN(1).
      90             :   ! TA(3): REAL PART OF WFN(2).  TA(4): IMAGINARY PART OF WFN(2).
      91             :   real(kind=f) :: T(5), TA(4), &
      92             :                   PI(3,IT), TAU(3,IT), CSTHT(IT), SI2THT(IT), &  
      93             :                   X, X1, X4, Y1, Y4, RX, SINX1, SINX4, COSX1, COSX4, &
      94             :                   EY1, E2Y1, EY4, EY1MY4, EY1PY4, AA, BB, CC, DD, DENOM, &
      95             :                   REALP, AMAGP, QBSR, QBSI, RMM, PIG, RXP4
      96             :   
      97             :   !! ELTRMX(I,J,K): ELEMENTS OF THE TRANSFORMATION MATRIX F,V.D.HULST,P.34,45 ' 125.
      98             :   !!   I=1: ELEMENT M SUB 2..I=2: ELEMENT M SUB 1..
      99             :   !!   I = 3: ELEMENT S SUB 21.. I = 4: ELEMENT D SUB 21..
     100             :   !! ELTRMX(I,J,1) REPRESENTS THE ITH ELEMENT OF THE MATRIX FOR
     101             :   !!   THE ANGLE THETD(J).. ELTRMX(I,J,2) REPRESENTS THE ITH ELEMENT
     102             :   !!   OF THE MATRIX FOR THE ANGLE 180.0 - THETD(J) ..
     103             :   real(kind=f)                         :: ELTRMX(4,IT,2)
     104             :   
     105             : 
     106             :   ! IF THE CORE IS SMALL SCATTERING IS COMPUTED FOR THE SHELL ONLY
     107           0 :   IFLAG = 1
     108           0 :   if ( R/RO .LT. 1.e-6_f ) IFLAG = 2
     109             :   
     110           0 :   if ( JX .gt. IT ) then
     111           0 :     if (do_print) then
     112           0 :        write(LUNOPRT, '(a,i3,a)') "miess:: The value of the argument JX=", &
     113           0 :             JX, " is greater than IT."
     114             :     end if
     115           0 :     rc = RC_ERROR
     116           0 :     return
     117             :   endif
     118             :       
     119           0 :   RF =  CMPLX( RFR,  -RFI, kind=f )
     120           0 :   RCR =  CMPLX( RE2, -TMAG2, kind=f )
     121           0 :   X  =  RO * WVNO
     122           0 :   K1 =  RCR * WVNO
     123           0 :   K2 =  RF * WVNO
     124           0 :   K3 =  CMPLX( WVNO, 0.0_f, kind=f )
     125           0 :   Z(1) =  K2 * RO
     126           0 :   Z(2) =  K3 * RO
     127           0 :   Z(3) =  K1 * R
     128           0 :   Z(4) =  K2 * R
     129           0 :   X1   =  REAL( Z(1) ,f)
     130           0 :   X4   =  REAL( Z(4) ,f)
     131           0 :   Y1   =  aimag( Z(1) )
     132           0 :   Y4   =  aimag( Z(4) )
     133           0 :   RRF  =  1.0_f / RF
     134           0 :   RX   =  1.0_f / X
     135           0 :   RRFX =  RRF * RX
     136           0 :   T(1) =  ( X**2 ) * ( RFR**2 + RFI**2 )
     137           0 :   T(1) =  SQRT( T(1) )
     138           0 :   NMX1 =  1.10_f * T(1)
     139             :     
     140             :   ! The dimension of ACAP.
     141             :   !
     142             :   ! In the original program the dimension of ACAP was 7000.
     143             :   ! For conserving space this should be not much higher than
     144             :   ! The value, NMX1=1.1*(NREAL**2 + NIMAG**2)**.5 * X + 1  
     145           0 :   IACAP = max(7000, int(1.5_f * NMX1))
     146           0 :   allocate(ACAP(IACAP))
     147           0 :   allocate(W(3,IACAP))
     148             :       
     149           0 :   NMX2 = T(1)
     150             :  
     151           0 :   if ( NMX1 .le. 150 ) then
     152           0 :     NMX1 = 150
     153           0 :     NMX2 = 135
     154             :   endif
     155             : 
     156           0 :   ACAP( NMX1+1 )  =  ( 0.0_f, 0.0_f )
     157             :  
     158           0 :   if ( IFLAG .ne. 2 ) then
     159           0 :     do N = 1,3
     160           0 :       W( N,NMX1+1 )  =  ( 0.0_f, 0.0_f )
     161             :     enddo
     162             :   endif
     163             :  
     164           0 :   do N = 1,NMX1
     165           0 :     NN = NMX1 - N + 1
     166           0 :     ACAP(NN) = (NN+1) * RRFX - 1.0_f / ( (NN+1) * RRFX + ACAP(NN+1) )
     167           0 :     if ( IFLAG .ne. 2 ) then
     168           0 :       do M = 1,3
     169           0 :         W( M,NN ) = (NN+1) / Z(M+1)  - &
     170           0 :                     1.0_f / (  (NN+1) / Z(M+1)  +  W( M,NN+1 )  )
     171             :       enddo
     172             :     endif
     173             :   enddo
     174             : 
     175           0 :   do J = 1,JX
     176           0 :     if ( THETD(J) .lt. 0.0_f )  THETD(J) =  ABS( THETD(J) )
     177             : 
     178           0 :     if ( THETD(J) .le. 0.0_f )  then
     179           0 :       CSTHT(J)  = 1.0_f
     180           0 :       SI2THT(J) = 0.0_f
     181           0 :     else if ( THETD(J) .lt. 90.0_f ) then
     182           0 :       T(1)      =  THETD(J) * DEG2RAD
     183           0 :       CSTHT(J)  =  COS( T(1) )
     184           0 :       SI2THT(J) =  1.0_f - CSTHT(J)**2
     185           0 :     else if ( THETD(J) .le. 90.0_f ) then
     186           0 :       CSTHT(J)  =  0.0_f
     187           0 :       SI2THT(J) =  1.0_f
     188             :     else 
     189           0 :       if (do_print) then
     190             :          write(LUNOPRT, '(a,i3)') "miess:: The value of the scattering angle &
     191           0 :               &is greater than 90.0 Degrees. It is .", THETD(J)
     192             :       end if
     193           0 :       rc = RC_ERROR
     194           0 :       return
     195             :     end if
     196             :   enddo
     197             :     
     198           0 :   do J = 1,JX
     199           0 :     PI(1,J)  =  0.0_f
     200           0 :     PI(2,J)  =  1.0_f
     201           0 :     TAU(1,J) =  0.0_f
     202           0 :     TAU(2,J) =  CSTHT(J)
     203             :   enddo
     204             : 
     205             :   ! INITIALIZATION OF HOMOGENEOUS SPHERE
     206           0 :   T(1)   =  COS(X)
     207           0 :   T(2)   =  SIN(X)
     208           0 :   WM1    =  CMPLX( T(1),-T(2), kind=f )
     209           0 :   WFN(1) =  CMPLX( T(2), T(1), kind=f )
     210           0 :   TA(1)  =  T(2)
     211           0 :   TA(2)  =  T(1)
     212           0 :   WFN(2) =  RX * WFN(1) - WM1
     213           0 :   TA(3)  =  REAL(WFN(2),f)
     214           0 :   TA(4)  =  aimag(WFN(2))
     215             : 
     216           0 :   if ( IFLAG .ne. 2 ) then
     217           0 :     N = 1
     218             : 
     219             :     ! INITIALIZATION PROCEDURE FOR STRATIFIED SPHERE BEGINS HERE
     220           0 :     SINX1   =  SIN( X1 )
     221           0 :     SINX4   =  SIN( X4 )
     222           0 :     COSX1   =  COS( X1 )
     223           0 :     COSX4   =  COS( X4 )
     224           0 :     EY1     =  EXP( Y1 )
     225           0 :     E2Y1    =  EY1 * EY1
     226           0 :     EY4     =  EXP( Y4 )
     227           0 :     EY1MY4  =  EXP( Y1 - Y4 )
     228           0 :     EY1PY4  =  EY1 * EY4
     229           0 :     EY1MY4  =  EXP( Y1 - Y4 )
     230           0 :     AA  =  SINX4 * ( EY1PY4 + EY1MY4 )
     231           0 :     BB  =  COSX4 * ( EY1PY4 - EY1MY4 )
     232           0 :     CC  =  SINX1 * ( E2Y1 + 1.0_f )
     233           0 :     DD  =  COSX1 * ( E2Y1 - 1.0_f )
     234           0 :     DENOM   =  1.0_f  +  E2Y1 * ( 4.0_f * SINX1 * SINX1 - 2.0_f + E2Y1 )
     235           0 :     REALP   =  ( AA * CC  +  BB * DD ) / DENOM
     236           0 :     AMAGP   =  ( BB * CC  -  AA * DD ) / DENOM
     237           0 :     DUMMY   =  CMPLX( REALP, AMAGP, kind=f )
     238           0 :     AA  =  SINX4 * SINX4 - 0.5_f
     239           0 :     BB  =  COSX4 * SINX4
     240           0 :     P24H24  =  0.5_f + CMPLX( AA,BB, kind=f ) * EY4 * EY4
     241           0 :     AA  =  SINX1 * SINX4  -  COSX1 * COSX4
     242           0 :     BB  =  SINX1 * COSX4  +  COSX1 * SINX4
     243           0 :     CC  =  SINX1 * SINX4  +  COSX1 * COSX4
     244           0 :     DD  = -SINX1 * COSX4  +  COSX1 * SINX4
     245           0 :     P24H21  =  0.5_f * CMPLX( AA,BB, kind=f ) * EY1 * EY4  + 0.5_f * CMPLX( CC,DD, kind=f ) * EY1MY4
     246           0 :     DH4  =  Z(4) / ( 1.0_f + ( 0.0_f, 1.0_f ) * Z(4) )  -  1.0_f / Z(4)
     247           0 :     DH1  =  Z(1) / ( 1.0_f + ( 0.0_f, 1.0_f ) * Z(1) )  -  1.0_f / Z(1)
     248           0 :     DH2  =  Z(2) / ( 1.0_f + ( 0.0_f, 1.0_f ) * Z(2) )  -  1.0_f / Z(2)
     249           0 :     PSTORE  =  ( DH4 + N / Z(4) )  *  ( W(3,N) + N / Z(4) )
     250           0 :     P24H24  =  P24H24 / PSTORE
     251           0 :     HSTORE  =  ( DH1 + N / Z(1) )  *  ( W(3,N) + N / Z(4) )
     252           0 :     P24H21  =  P24H21 / HSTORE
     253           0 :     PSTORE  =  ( ACAP(N) + N / Z(1) )  /  ( W(3,N) + N / Z(4) )
     254           0 :     DUMMY   =  DUMMY * PSTORE
     255           0 :     DUMSQ   =  DUMMY * DUMMY
     256             : 
     257             :     ! NOTE:  THE DEFINITIONS OF U(I) IN THIS PROGRAM ARE NOT THE SAME AS
     258             :     !        THE USUBI DEFINED IN THE ARTICLE BY TOON AND ACKERMAN.  THE
     259             :     !        CORRESPONDING TERMS ARE:
     260             :     !          USUB1 = U(1)                       USUB2 = U(5)
     261             :     !          USUB3 = U(7)                       USUB4 = DUMSQ
     262             :     !          USUB5 = U(2)                       USUB6 = U(3)
     263             :     !          USUB7 = U(6)                       USUB8 = U(4)
     264             :     !          RATIO OF SPHERICAL BESSEL FTN TO SPHERICAL HENKAL FTN = U(8)
     265             : 
     266           0 :     U(1) =  K3 * ACAP(N)  -  K2 * W(1,N)
     267           0 :     U(2) =  K3 * ACAP(N)  -  K2 * DH2
     268           0 :     U(3) =  K2 * ACAP(N)  -  K3 * W(1,N)
     269           0 :     U(4) =  K2 * ACAP(N)  -  K3 * DH2
     270           0 :     U(5) =  K1 *  W(3,N)  -  K2 * W(2,N)
     271           0 :     U(6) =  K2 *  W(3,N)  -  K1 * W(2,N)
     272           0 :     U(7) =  ( 0.0_f, -1.0_f )  *  ( DUMMY * P24H21 - P24H24 )
     273           0 :     U(8) =  TA(3) / WFN(2)
     274             : 
     275             :     FNA  =  U(8) * ( U(1)*U(5)*U(7)  +  K1*U(1)  -  DUMSQ*K3*U(5) ) / &
     276           0 :                    ( U(2)*U(5)*U(7)  +  K1*U(2)  -  DUMSQ*K3*U(5) )
     277             :     FNB  =  U(8) * ( U(3)*U(6)*U(7)  +  K2*U(3)  -  DUMSQ*K2*U(6) ) / &
     278           0 :                    ( U(4)*U(6)*U(7)  +  K2*U(4)  -  DUMSQ*K2*U(6) )
     279             :   else
     280           0 :     TC1  =  ACAP(1) * RRF  +  RX
     281           0 :     TC2  =  ACAP(1) * RF   +  RX
     282           0 :     FNA  =  ( TC1 * TA(3)  -  TA(1) ) / ( TC1 * WFN(2)  -  WFN(1) )
     283           0 :     FNB  =  ( TC2 * TA(3)  -  TA(1) ) / ( TC2 * WFN(2)  -  WFN(1) )
     284             :   endif
     285             : 
     286           0 :   FNAP = FNA
     287           0 :   FNBP = FNB
     288           0 :   T(1) = 1.50_f
     289             : 
     290             :   ! FROM HERE TO THE STATMENT NUMBER 90, ELTRMX(I,J,K) HAS
     291             :   ! FOLLOWING MEANING:
     292             :   ! ELTRMX(1,J,K): REAL PART OF THE FIRST COMPLEX AMPLITUDE.
     293             :   ! ELTRMX(2,J,K): IMAGINARY PART OF THE FIRST COMPLEX AMPLITUDE.
     294             :   ! ELTRMX(3,J,K): REAL PART OF THE SECOND COMPLEX AMPLITUDE.
     295             :   ! ELTRMX(4,J,K): IMAGINARY PART OF THE SECOND COMPLEX AMPLITUDE.
     296             :   ! K = 1 : FOR THETD(J) AND K = 2 : FOR 180.0 - THETD(J)
     297             :   ! DEFINITION OF THE COMPLEX AMPLITUDE: VAN DE HULST,P.125.
     298           0 :   FNA = T(1) * FNA
     299           0 :   FNB = T(1) * FNB
     300             :   
     301           0 :   do J = 1,JX
     302           0 :     TC1 = FNA * PI(2,J) + FNB * TAU(2,J)
     303           0 :     TC2 = FNB * PI(2,J) + FNA * TAU(2,J)
     304           0 :     ELTRMX(1,J,1) =  real(TC1)
     305           0 :     ELTRMX(2,J,1) = aimag(TC1)
     306           0 :     ELTRMX(3,J,1) =  real(TC2)
     307           0 :     ELTRMX(4,J,1) = aimag(TC2)
     308           0 :     TC1 = FNA * PI(2,J) - FNB * TAU(2,J)
     309           0 :     TC2 = FNB * PI(2,J) - FNA * TAU(2,J)
     310           0 :     ELTRMX(1,J,2) =  real(TC1)
     311           0 :     ELTRMX(2,J,2) = aimag(TC1)
     312           0 :     ELTRMX(3,J,2) =  real(TC2)
     313           0 :     ELTRMX(4,J,2) = aimag(TC2)
     314             :   enddo
     315             : 
     316           0 :   QEXT   = 2.0_f * ( real(FNA) + real(FNB) )
     317             :   QSCAT  = ( real(FNA)**2 + aimag(FNA)**2 + &
     318           0 :              real(FNB)**2 + aimag(FNB)**2 ) / 0.75_f
     319           0 :   CTBRQS = 0.0_f
     320           0 :   TC1 = -2.0_f * (FNB - FNA)
     321           0 :   QBSR   =  real(TC1)
     322           0 :   QBSI   = aimag(TC1)
     323           0 :   RMM    = -1.0_f
     324           0 :   N = 2
     325             :   
     326             :   ! Iterate until the answer converges.
     327           0 :   T(4) = EPSILON_MIE
     328             :   
     329           0 :   do while ( T(4) .ge. EPSILON_MIE )
     330             :   
     331           0 :     T(1) = 2*N - 1
     332           0 :     T(2) =   N - 1
     333           0 :     T(3) = 2*N + 1
     334             :     
     335           0 :     do J = 1,JX
     336           0 :       PI(3,J)  = ( T(1) * PI(2,J) * CSTHT(J) - N * PI(1,J) ) / T(2)
     337             :       TAU(3,J) = CSTHT(J) * ( PI(3,J) - PI(1,J) )  - &
     338           0 :                 T(1) * SI2THT(J) * PI(2,J)  +  TAU(1,J)
     339             :     end do
     340             :   
     341             :     ! HERE SET UP HOMOGENEOUS SPHERE
     342           0 :     WM1    =  WFN(1)
     343           0 :     WFN(1) =  WFN(2)
     344           0 :     TA(1)  =  REAL(WFN(1),f)
     345           0 :     TA(2)  =  aimag(WFN(1))
     346           0 :     TA(4)  =  aimag(WFN(2))
     347           0 :     WFN(2) =  T(1) * RX * WFN(1)  -  WM1
     348           0 :     TA(3)  =  REAL(WFN(2),f)
     349             :   
     350           0 :     if ( IFLAG .ne. 2 ) then
     351             :   
     352             :       ! HERE SET UP STRATIFIED SPHERE
     353           0 :       DH2  =  - N / Z(2)  +  1.0_f / ( N / Z(2) - DH2 )
     354           0 :       DH4  =  - N / Z(4)  +  1.0_f / ( N / Z(4) - DH4 )
     355           0 :       DH1  =  - N / Z(1)  +  1.0_f / ( N / Z(1) - DH1 )
     356           0 :       PSTORE  =  ( DH4 + N / Z(4) )  *  ( W(3,N) + N / Z(4) )
     357           0 :       P24H24  =  P24H24 / PSTORE
     358           0 :       HSTORE  =  ( DH1 + N / Z(1) )  *  ( W(3,N) + N / Z(4) )
     359           0 :       P24H21  =  P24H21 / HSTORE
     360           0 :       PSTORE  =  ( ACAP(N) + N / Z(1) )  /  ( W(3,N) + N / Z(4) )
     361           0 :       DUMMY   =  DUMMY * PSTORE
     362           0 :       DUMSQ   =  DUMMY * DUMMY
     363             :   
     364           0 :       U(1) =  K3 * ACAP(N)  -  K2 * W(1,N)
     365           0 :       U(2) =  K3 * ACAP(N)  -  K2 * DH2
     366           0 :       U(3) =  K2 * ACAP(N)  -  K3 * W(1,N)
     367           0 :       U(4) =  K2 * ACAP(N)  -  K3 * DH2
     368           0 :       U(5) =  K1 *  W(3,N)  -  K2 * W(2,N)
     369           0 :       U(6) =  K2 *  W(3,N)  -  K1 * W(2,N)
     370           0 :       U(7) =  ( 0.0_f, -1.0_f )  *  ( DUMMY * P24H21 - P24H24 )
     371           0 :       U(8) =  TA(3) / WFN(2)
     372             :   
     373             :       FNA  =  U(8) * ( U(1)*U(5)*U(7)  +  K1*U(1)  -  DUMSQ*K3*U(5) ) / &
     374           0 :                      ( U(2)*U(5)*U(7)  +  K1*U(2)  -  DUMSQ*K3*U(5) )
     375             :       FNB  =  U(8) * ( U(3)*U(6)*U(7)  +  K2*U(3)  -  DUMSQ*K2*U(6) ) / &
     376           0 :                      ( U(4)*U(6)*U(7)  +  K2*U(4)  -  DUMSQ*K2*U(6) )
     377             :     endif
     378             :     
     379           0 :     TC1  =  ACAP(N) * RRF  +  N * RX
     380           0 :     TC2  =  ACAP(N) * RF   +  N * RX
     381           0 :     FN1  =  ( TC1 * TA(3)  -  TA(1) ) /  ( TC1 * WFN(2) - WFN(1) )
     382           0 :     FN2  =  ( TC2 * TA(3)  -  TA(1) ) /  ( TC2 * WFN(2) - WFN(1) )
     383           0 :     M    =  WVNO * R
     384             :     
     385           0 :     if ( N .ge. M ) then
     386           0 :       if ( IFLAG .ne. 2 ) then
     387           0 :         if ( abs(  ( FN1-FNA ) / FN1  )  .LT.  EPSILON_MIE .AND. &
     388             :              abs(  ( FN2-FNB ) / FN2  )  .LT. EPSILON_MIE  ) IFLAG = 2
     389             :              
     390           0 :         if ( IFLAG .ne. 1 ) then
     391             :           FNA  =  FN1
     392             :           FNB  =  FN2
     393             :         endif
     394             :       else
     395             :         FNA  =  FN1
     396             :         FNB  =  FN2
     397             :      endif
     398             :     endif
     399             :     
     400           0 :     T(5)  =  N
     401           0 :     T(4)  =  T(1) / ( T(5) * T(2) )
     402           0 :     T(2)  =  (  T(2) * ( T(5) + 1.0_f )  ) / T(5)
     403             :   
     404             :     CTBRQS  =  CTBRQS  +  T(2) * ( real(FNAP) * real(FNA)  +  &
     405             :                                   aimag(FNAP) *aimag(FNA) &
     406             :                       +            real(FNBP) * real(FNB)  +  &
     407             :                                   aimag(FNBP) *aimag(FNB) ) &
     408             :                       +  T(4) * ( real(FNAP) * real(FNBP)  +  &
     409           0 :                                  aimag(FNAP) *aimag(FNBP) )
     410           0 :     QEXT    =   QEXT  +  T(3) * ( real(FNA) + real(FNB) )
     411             :     
     412             :     !     $        T(3), real(FNA), real(FNB), QEXT
     413             :     T(4)    =  real(FNA)**2 + aimag(FNA)**2 + &
     414           0 :                real(FNB)**2 + aimag(FNB)**2
     415           0 :     QSCAT   =  QSCAT  +  T(3) * T(4)
     416           0 :     RMM     =  -RMM
     417           0 :     TC1     =  T(3)*RMM*(FNB - FNA)
     418           0 :     QBSR    =  QBSR +  real(TC1)
     419           0 :     QBSI    =  QBSI + aimag(TC1)
     420             :   
     421           0 :     T(2)    =  N * (N+1)
     422           0 :     T(1)    =  T(3) / T(2)
     423           0 :     K = (N/2)*2
     424             :     
     425           0 :     do J = 1,JX
     426           0 :       TC1 = FNA * PI(3,J) + FNB * TAU(3,J)
     427           0 :       TC2 = FNB * PI(3,J) + FNA * TAU(3,J)
     428           0 :       ELTRMX(1,J,1) = ELTRMX(1,J,1)+T(1)* real(TC1)
     429           0 :       ELTRMX(2,J,1) = ELTRMX(2,J,1)+T(1)*aimag(TC1)
     430           0 :       ELTRMX(3,J,1) = ELTRMX(3,J,1)+T(1)* real(TC2)
     431           0 :       ELTRMX(4,J,1) = ELTRMX(4,J,1)+T(1)*aimag(TC2)
     432             :       
     433           0 :       IF ( K .EQ. N )  THEN
     434           0 :        TC1 = -FNA * PI(3,J) + FNB * TAU(3,J)
     435           0 :        TC2 = -FNB * PI(3,J) + FNA * TAU(3,J)
     436             :       ELSE
     437           0 :        TC1 = FNA * PI(3,J) - FNB * TAU(3,J)
     438           0 :        TC2 = FNB * PI(3,J) - FNA * TAU(3,J)
     439             :       END IF
     440           0 :       ELTRMX(1,J,2) = ELTRMX(1,J,2)+T(1)* real(TC1)
     441           0 :       ELTRMX(2,J,2) = ELTRMX(2,J,2)+T(1)*aimag(TC1)
     442           0 :       ELTRMX(3,J,2) = ELTRMX(3,J,2)+T(1)* real(TC2)
     443           0 :       ELTRMX(4,J,2) = ELTRMX(4,J,2)+T(1)*aimag(TC2)
     444             : 
     445             :     enddo
     446             :   
     447           0 :     if ( T(4) .ge. EPSILON_MIE ) then
     448           0 :       N = N + 1
     449             :       
     450           0 :       do J = 1,JX
     451           0 :         PI(1,J)   =   PI(2,J)
     452           0 :         PI(2,J)   =   PI(3,J)
     453           0 :         TAU(1,J)  =  TAU(2,J)
     454           0 :         TAU(2,J)  =  TAU(3,J)
     455             :       enddo
     456             :       
     457           0 :       FNAP  =  FNA
     458           0 :       FNBP  =  FNB
     459             :       
     460           0 :       if ( N .gt. NMX2 ) then
     461           0 :         if (do_print) write(LUNOPRT, '(a)') "miess:: The upper limit for acap is not enough."
     462           0 :         rc = RC_ERROR
     463           0 :         return
     464             :       endif
     465             :     endif
     466             :   enddo
     467             :   
     468             :   ! Calculate the results.
     469           0 :   do J = 1,JX
     470           0 :     do K = 1,2
     471           0 :       do I= 1,4
     472           0 :         T(I)  =  ELTRMX(I,J,K)
     473             :       enddo
     474             :       
     475           0 :       ELTRMX(2,J,K)  =  T(1)**2  +  T(2)**2
     476           0 :       ELTRMX(1,J,K)  =  T(3)**2  +  T(4)**2
     477           0 :       ELTRMX(3,J,K)  =  T(1) * T(3)  +  T(2) * T(4)
     478           0 :       ELTRMX(4,J,K)  =  T(2) * T(3)  -  T(4) * T(1)
     479             :     enddo
     480             :   enddo
     481             :   
     482           0 :   T(1)    = 2.0_f * RX**2
     483           0 :   QEXT    = QEXT * T(1)
     484           0 :   QSCAT   = QSCAT * T(1)
     485           0 :   CTBRQS  = 2.0_f * CTBRQS * T(1)
     486             : 
     487             :   ! QBS IS THE BACK SCATTER CROSS SECTION
     488           0 :   PIG   = ACOS(-1.0_f)
     489           0 :   RXP4  = RX*RX/(4.0_f*PIG)
     490           0 :   QBS   = RXP4*(QBSR**2 + QBSI**2)
     491             : 
     492           0 :   deallocate(ACAP)
     493           0 :   deallocate(W)
     494             : 
     495           0 :   return
     496           0 : end

Generated by: LCOV version 1.14