*IF DEF,A70_1A,OR,DEF,A70_1B                                               APB4F405.91     
*IF DEF,A01_3A,OR,DEF,A02_3A                                               SLMXDR3A.2      
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    SLMXDR3A.3      
C                                                                          SLMXDR3A.4      
C Use, duplication or disclosure of this code is subject to the            SLMXDR3A.5      
C restrictions as set forth in the contract.                               SLMXDR3A.6      
C                                                                          SLMXDR3A.7      
C                Meteorological Office                                     SLMXDR3A.8      
C                London Road                                               SLMXDR3A.9      
C                BRACKNELL                                                 SLMXDR3A.10     
C                Berkshire UK                                              SLMXDR3A.11     
C                RG12 2SZ                                                  SLMXDR3A.12     
C                                                                          SLMXDR3A.13     
C If no contract has been raised with this copy of the code, the use,      SLMXDR3A.14     
C duplication or disclosure of it is strictly prohibited.  Permission      SLMXDR3A.15     
C to do so must first be obtained in writing from the Head of Numerical    SLMXDR3A.16     
C Modelling at the above address.                                          SLMXDR3A.17     
C ******************************COPYRIGHT******************************    SLMXDR3A.18     
C                                                                          SLMXDR3A.19     
!+ Subroutine to solve for mixed fluxes scattering without a matrix.       SLMXDR3A.20     
!                                                                          SLMXDR3A.21     
! Method:                                                                  SLMXDR3A.22     
!       Gaussian elimination in an upward direction is employed to         SLMXDR3A.23     
!       determine effective albedos for lower levels of the atmosphere.    SLMXDR3A.24     
!       This allows a downward pass of back-substitution to be carried     SLMXDR3A.25     
!       out to determine the upward and downward fluxes.                   SLMXDR3A.26     
!                                                                          SLMXDR3A.27     
! Current Owner of Code: J. M. Edwards                                     SLMXDR3A.28     
!                                                                          SLMXDR3A.29     
! History:                                                                 SLMXDR3A.30     
!       Version         Date                    Comment                    SLMXDR3A.31     
!       4.1             10-04-96                Original Code              SLMXDR3A.32     
!                                               (J. M. Edwards)            SLMXDR3A.33     
!                                                                          SLMXDR3A.34     
! Description of Code:                                                     SLMXDR3A.35     
!   FORTRAN 77  with extensions listed in documentation.                   SLMXDR3A.36     
!                                                                          SLMXDR3A.37     
!- ---------------------------------------------------------------------   SLMXDR3A.38     

      SUBROUTINE SOLVER_MIX_DIRECT(N_PROFILE, N_LAYER, N_CLOUD_TOP          1SLMXDR3A.39     
     &   , T, R, S_DOWN, S_UP                                              SLMXDR3A.40     
     &   , T_CLOUD, R_CLOUD, S_DOWN_CLOUD, S_UP_CLOUD                      SLMXDR3A.41     
     &   , V11, V21, V12, V22                                              SLMXDR3A.42     
     &   , U11, U12, U21, U22                                              SLMXDR3A.43     
     &   , L_NET                                                           SLMXDR3A.44     
     &   , FLUX_INC_DOWN                                                   SLMXDR3A.45     
     &   , SOURCE_GROUND_FREE, SOURCE_GROUND_CLOUD, ALBEDO_SURFACE_DIFF    SLMXDR3A.46     
     &   , FLUX_TOTAL                                                      SLMXDR3A.47     
     &   , NPD_PROFILE, NPD_LAYER                                          SLMXDR3A.48     
     &   )                                                                 SLMXDR3A.49     
!                                                                          SLMXDR3A.50     
!                                                                          SLMXDR3A.51     
      IMPLICIT NONE                                                        SLMXDR3A.52     
!                                                                          SLMXDR3A.53     
!                                                                          SLMXDR3A.54     
!     SIZES OF DUMMY ARRAYS.                                               SLMXDR3A.55     
      INTEGER   !, INTENT(IN)                                              SLMXDR3A.56     
     &     NPD_PROFILE                                                     SLMXDR3A.57     
!             MAXIMUM NUMBER OF PROFILES                                   SLMXDR3A.58     
     &   , NPD_LAYER                                                       SLMXDR3A.59     
!             MAXIMUM NUMBER OF LAYERS                                     SLMXDR3A.60     
!                                                                          SLMXDR3A.61     
!                                                                          SLMXDR3A.62     
!     DUMMY ARGUMENTS.                                                     SLMXDR3A.63     
      INTEGER   !, INTENT(IN)                                              SLMXDR3A.64     
     &     N_PROFILE                                                       SLMXDR3A.65     
!             NUMBER OF PROFILES                                           SLMXDR3A.66     
     &   , N_LAYER                                                         SLMXDR3A.67     
!             NUMBER OF LAYERS                                             SLMXDR3A.68     
     &   , N_CLOUD_TOP                                                     SLMXDR3A.69     
!             TOPMOST CLOUDY LAYER                                         SLMXDR3A.70     
      LOGICAL   !, INTENT(IN)                                              SLMXDR3A.71     
     &     L_NET                                                           SLMXDR3A.72     
!             FLAG FOR CALCULATION OF NET FLUXES                           SLMXDR3A.73     
      REAL      !, INTENT(IN)                                              SLMXDR3A.74     
     &     T(NPD_PROFILE, NPD_LAYER)                                       SLMXDR3A.75     
!             CLEAR-SKY TRANSMISSION                                       SLMXDR3A.76     
     &   , R(NPD_PROFILE, NPD_LAYER)                                       SLMXDR3A.77     
!             CLEAR-SKY REFLECTION                                         SLMXDR3A.78     
     &   , S_DOWN(NPD_PROFILE, NPD_LAYER)                                  SLMXDR3A.79     
!             CLEAR-SKY DOWNWARD SOURCE FUNCTION                           SLMXDR3A.80     
     &   , S_UP(NPD_PROFILE, NPD_LAYER)                                    SLMXDR3A.81     
!             CLEAR-SKY UPWARD SOURCE FUNCTION                             SLMXDR3A.82     
     &   , T_CLOUD(NPD_PROFILE, NPD_LAYER)                                 SLMXDR3A.83     
!             CLOUDY TRANSMISSION                                          SLMXDR3A.84     
     &   , R_CLOUD(NPD_PROFILE, NPD_LAYER)                                 SLMXDR3A.85     
!             CLOUDY REFLECTION                                            SLMXDR3A.86     
     &   , S_DOWN_CLOUD(NPD_PROFILE, NPD_LAYER)                            SLMXDR3A.87     
!             DOWNWARD CLOUDY SOURCE FUNCTION                              SLMXDR3A.88     
     &   , S_UP_CLOUD(NPD_PROFILE, NPD_LAYER)                              SLMXDR3A.89     
!             UPWARD CLOUDY SOURCE FUNCTION                                SLMXDR3A.90     
      REAL      !, INTENT(IN)                                              SLMXDR3A.91     
     &     V11(NPD_PROFILE, 0: NPD_LAYER)                                  SLMXDR3A.92     
!             ENERGY TRANSFER COEFFICIENT                                  SLMXDR3A.93     
     &   , V21(NPD_PROFILE, 0: NPD_LAYER)                                  SLMXDR3A.94     
!             ENERGY TRANSFER COEFFICIENT                                  SLMXDR3A.95     
     &   , V12(NPD_PROFILE, 0: NPD_LAYER)                                  SLMXDR3A.96     
!             ENERGY TRANSFER COEFFICIENT                                  SLMXDR3A.97     
     &   , V22(NPD_PROFILE, 0: NPD_LAYER)                                  SLMXDR3A.98     
!             ENERGY TRANSFER COEFFICIENT                                  SLMXDR3A.99     
     &   , U11(NPD_PROFILE, 0: NPD_LAYER)                                  SLMXDR3A.100    
!             ENERGY TRANSFER COEFFICIENT                                  SLMXDR3A.101    
     &   , U12(NPD_PROFILE, 0: NPD_LAYER)                                  SLMXDR3A.102    
!             ENERGY TRANSFER COEFFICIENT                                  SLMXDR3A.103    
     &   , U21(NPD_PROFILE, 0: NPD_LAYER)                                  SLMXDR3A.104    
!             ENERGY TRANSFER COEFFICIENT                                  SLMXDR3A.105    
     &   , U22(NPD_PROFILE, 0: NPD_LAYER)                                  SLMXDR3A.106    
!             ENERGY TRANSFER COEFFICIENT                                  SLMXDR3A.107    
      REAL      !, INTENT(IN)                                              SLMXDR3A.108    
     &     FLUX_INC_DOWN(NPD_PROFILE)                                      SLMXDR3A.109    
!             INCIDENT FLUX                                                SLMXDR3A.110    
     &   , SOURCE_GROUND_FREE(NPD_PROFILE)                                 SLMXDR3A.111    
!             SOURCE FROM GROUND (CLEAR SKY)                               SLMXDR3A.112    
     &   , SOURCE_GROUND_CLOUD(NPD_PROFILE)                                SLMXDR3A.113    
!             SOURCE FROM GROUND (CLOUDY REGION)                           SLMXDR3A.114    
     &   , ALBEDO_SURFACE_DIFF(NPD_PROFILE)                                SLMXDR3A.115    
!             DIFFUSE ALBEDO                                               SLMXDR3A.116    
      REAL      !, INTENT(OUT)                                             SLMXDR3A.117    
     &     FLUX_TOTAL(NPD_PROFILE, 2*NPD_LAYER+2)                          SLMXDR3A.118    
!             TOTAL FLUX                                                   SLMXDR3A.119    
!                                                                          SLMXDR3A.120    
!     LOCAL VARIABLES.                                                     SLMXDR3A.121    
      INTEGER                                                              SLMXDR3A.122    
     &     I                                                               SLMXDR3A.123    
!             LOOP VARIABLE                                                SLMXDR3A.124    
     &   , L                                                               SLMXDR3A.125    
!             LOOP VARIABLE                                                SLMXDR3A.126    
!                                                                          SLMXDR3A.127    
!     EFFECTIVE COUPLING ALBEDOS AND SOURCE FUNCTIONS:                     SLMXDR3A.128    
      REAL                                                                 SLMXDR3A.129    
     &     ALPHA11(NPD_PROFILE, NPD_LAYER+1)                               SLMXDR3A.130    
     &   , ALPHA22(NPD_PROFILE, NPD_LAYER+1)                               SLMXDR3A.131    
     &   , ALPHA21(NPD_PROFILE, NPD_LAYER+1)                               SLMXDR3A.132    
     &   , ALPHA12(NPD_PROFILE, NPD_LAYER+1)                               SLMXDR3A.133    
     &   , G1(NPD_PROFILE, NPD_LAYER+1)                                    SLMXDR3A.134    
     &   , G2(NPD_PROFILE, NPD_LAYER+1)                                    SLMXDR3A.135    
!     TERMS FOR DOWNWARD PROPAGATION:                                      SLMXDR3A.136    
      REAL                                                                 SLMXDR3A.137    
     &     GAMMA11(NPD_PROFILE, NPD_LAYER)                                 SLMXDR3A.138    
     &   , GAMMA12(NPD_PROFILE, NPD_LAYER)                                 SLMXDR3A.139    
     &   , GAMMA21(NPD_PROFILE, NPD_LAYER)                                 SLMXDR3A.140    
     &   , GAMMA22(NPD_PROFILE, NPD_LAYER)                                 SLMXDR3A.141    
     &   , BETA11_INV(NPD_PROFILE, NPD_LAYER)                              SLMXDR3A.142    
     &   , BETA21(NPD_PROFILE, NPD_LAYER)                                  SLMXDR3A.143    
     &   , BETA22_INV(NPD_PROFILE, NPD_LAYER)                              SLMXDR3A.144    
     &   , H1(NPD_PROFILE, NPD_LAYER)                                      SLMXDR3A.145    
     &   , H2(NPD_PROFILE, NPD_LAYER)                                      SLMXDR3A.146    
!                                                                          SLMXDR3A.147    
!     AUXILAIRY NUMERICAL VARIABLES REQUIRED ONLY IN THE CURRENT LAYER:    SLMXDR3A.148    
      REAL                                                                 SLMXDR3A.149    
     &     THETA11                                                         SLMXDR3A.150    
     &   , THETA12                                                         SLMXDR3A.151    
     &   , THETA21                                                         SLMXDR3A.152    
     &   , THETA22                                                         SLMXDR3A.153    
     &   , LAMBDA                                                          SLMXDR3A.154    
     &   , LAMBDA_BAR                                                      SLMXDR3A.155    
!                                                                          SLMXDR3A.156    
!     TEMPORARY FLUXES                                                     SLMXDR3A.157    
      REAL                                                                 SLMXDR3A.158    
     &     FLUX_DOWN_1(NPD_PROFILE, 0: NPD_LAYER)                          SLMXDR3A.159    
!             DOWNWARD FLUXES OUTSIDE CLOUDS JUST BELOW I'TH LEVEL         SLMXDR3A.160    
     &   , FLUX_DOWN_2(NPD_PROFILE, 0: NPD_LAYER)                          SLMXDR3A.161    
!             DOWNWARD FLUXES INSIDE CLOUDS JUST BELOW I'TH LEVEL          SLMXDR3A.162    
     &   , FLUX_UP_1(NPD_PROFILE, 0: NPD_LAYER)                            SLMXDR3A.163    
!             UPWARD FLUXES OUTSIDE CLOUDS JUST ABOVE I'TH LEVEL           SLMXDR3A.164    
     &   , FLUX_UP_2(NPD_PROFILE, 0: NPD_LAYER)                            SLMXDR3A.165    
!             UPWARD FLUXES INSIDE CLOUDS JUST ABOVE I'TH LEVEL            SLMXDR3A.166    
!                                                                          SLMXDR3A.167    
!                                                                          SLMXDR3A.168    
!                                                                          SLMXDR3A.169    
!     INITIALIZE AT THE BOTTOM OF THE COLUMN FOR UPWARD ELIMINATION.       SLMXDR3A.170    
      DO L=1, N_PROFILE                                                    SLMXDR3A.171    
         ALPHA11(L, N_LAYER+1)=ALBEDO_SURFACE_DIFF(L)                      SLMXDR3A.172    
         ALPHA22(L, N_LAYER+1)=ALBEDO_SURFACE_DIFF(L)                      SLMXDR3A.173    
         ALPHA21(L, N_LAYER+1)=0.0E+00                                     SLMXDR3A.174    
         ALPHA12(L, N_LAYER+1)=0.0E+00                                     SLMXDR3A.175    
         G1(L, N_LAYER+1)=SOURCE_GROUND_FREE(L)                            SLMXDR3A.176    
         G2(L, N_LAYER+1)=SOURCE_GROUND_CLOUD(L)                           SLMXDR3A.177    
      ENDDO                                                                SLMXDR3A.178    
!                                                                          SLMXDR3A.179    
!     UPWARD ELIMINATION THROUGH THE CLOUDY LAYERS.                        SLMXDR3A.180    
      DO I=N_LAYER, N_CLOUD_TOP, -1                                        SLMXDR3A.181    
         DO L=1, N_PROFILE                                                 SLMXDR3A.182    
!                                                                          SLMXDR3A.183    
            THETA11=ALPHA11(L, I+1)*V11(L, I)+ALPHA12(L, I+1)*V21(L, I)    SLMXDR3A.184    
            THETA12=ALPHA11(L, I+1)*V12(L, I)+ALPHA12(L, I+1)*V22(L, I)    SLMXDR3A.185    
            THETA21=ALPHA21(L, I+1)*V11(L, I)+ALPHA22(L, I+1)*V21(L, I)    SLMXDR3A.186    
            THETA22=ALPHA21(L, I+1)*V12(L, I)+ALPHA22(L, I+1)*V22(L, I)    SLMXDR3A.187    
                                                                           SLMXDR3A.188    
            BETA21(L, I)=-THETA21*R(L, I)                                  SLMXDR3A.189    
            BETA22_INV(L, I)=1.0E+00/(1.0E+00-THETA22*R_CLOUD(L, I))       SLMXDR3A.190    
            GAMMA21(L, I)=THETA21*T(L, I)                                  SLMXDR3A.191    
            GAMMA22(L, I)=THETA22*T_CLOUD(L, I)                            SLMXDR3A.192    
            H2(L, I)=G2(L, I+1)+THETA21*S_DOWN(L, I)                       SLMXDR3A.193    
     &         +THETA22*S_DOWN_CLOUD(L, I)                                 SLMXDR3A.194    
                                                                           SLMXDR3A.195    
            LAMBDA=THETA12*R_CLOUD(L, I)*BETA22_INV(L, I)                  SLMXDR3A.196    
            BETA11_INV(L, I)=1.0E+00                                       SLMXDR3A.197    
     &         /(1.0E+00-THETA11*R(L, I)+LAMBDA*BETA21(L, I))              SLMXDR3A.198    
            GAMMA11(L, I)=THETA11*T(L, I)+LAMBDA*GAMMA21(L, I)             SLMXDR3A.199    
            GAMMA12(L, I)=THETA12*T_CLOUD(L, I)+LAMBDA*GAMMA22(L, I)       SLMXDR3A.200    
            H1(L, I)=G1(L, I+1)+THETA11*S_DOWN(L, I)                       SLMXDR3A.201    
     &         +THETA12*S_DOWN_CLOUD(L, I)+LAMBDA*H2(L, I)                 SLMXDR3A.202    
                                                                           SLMXDR3A.203    
            LAMBDA=U22(L, I-1)*T_CLOUD(L, I)*BETA22_INV(L, I)              SLMXDR3A.204    
            LAMBDA_BAR=(U21(L, I-1)*T(L, I)+LAMBDA*BETA21(L, I))           SLMXDR3A.205    
     &         *BETA11_INV(L, I)                                           SLMXDR3A.206    
            ALPHA21(L, I)=U21(L, I-1)*R(L, I)+LAMBDA*GAMMA21(L, I)         SLMXDR3A.207    
     &         +LAMBDA_BAR*GAMMA11(L, I)                                   SLMXDR3A.208    
            ALPHA22(L, I)=U22(L, I-1)*R_CLOUD(L, I)                        SLMXDR3A.209    
     &         +LAMBDA*GAMMA22(L, I)+LAMBDA_BAR*GAMMA12(L, I)              SLMXDR3A.210    
            G2(L, I)=U21(L, I-1)*S_UP(L, I)+U22(L, I-1)*S_UP_CLOUD(L, I)   SLMXDR3A.211    
     &         +LAMBDA*H2(L, I)+LAMBDA_BAR*H1(L, I)                        SLMXDR3A.212    
!                                                                          SLMXDR3A.213    
            LAMBDA=U12(L, I-1)*T_CLOUD(L, I)*BETA22_INV(L, I)              SLMXDR3A.214    
            LAMBDA_BAR=(U11(L, I-1)*T(L, I)+LAMBDA*BETA21(L, I))           SLMXDR3A.215    
     &         *BETA11_INV(L, I)                                           SLMXDR3A.216    
            ALPHA11(L, I)=U11(L, I-1)*R(L, I)+LAMBDA*GAMMA21(L, I)         SLMXDR3A.217    
     &         +LAMBDA_BAR*GAMMA11(L, I)                                   SLMXDR3A.218    
            ALPHA12(L, I)=U12(L, I-1)*R_CLOUD(L, I)                        SLMXDR3A.219    
     &         +LAMBDA*GAMMA22(L, I)+LAMBDA_BAR*GAMMA12(L, I)              SLMXDR3A.220    
            G1(L, I)=U11(L, I-1)*S_UP(L, I)+U12(L, I-1)*S_UP_CLOUD(L, I)   SLMXDR3A.221    
     &         +LAMBDA*H2(L, I)+LAMBDA_BAR*H1(L, I)                        SLMXDR3A.222    
!                                                                          SLMXDR3A.223    
         ENDDO                                                             SLMXDR3A.224    
      ENDDO                                                                SLMXDR3A.225    
!                                                                          SLMXDR3A.226    
!     THE LAYER ABOVE THE CLOUD: ONLY ONE SET OF ALPHAS IS NOW NEEDED.     SLMXDR3A.227    
!                                                                          SLMXDR3A.228    
      I=N_CLOUD_TOP-1                                                      SLMXDR3A.229    
      DO L=1, N_PROFILE                                                    SLMXDR3A.230    
!                                                                          SLMXDR3A.231    
         IF (N_CLOUD_TOP.LT.N_LAYER) THEN                                  SLMXDR3A.232    
!           IF THERE IS NO CLOUD IN THE COLUMN THE V'S WILL NOT BE         SLMXDR3A.233    
!           ASSIGNED SO AN IF TEST IS REQUIRED.                            SLMXDR3A.234    
            THETA11=ALPHA11(L, I+1)*V11(L, I)+ALPHA12(L, I+1)*V21(L, I)    SLMXDR3A.235    
         ELSE                                                              SLMXDR3A.236    
            THETA11=ALPHA11(L, I+1)                                        SLMXDR3A.237    
         ENDIF                                                             SLMXDR3A.238    
!                                                                          SLMXDR3A.239    
         BETA11_INV(L, I)=1.0E+00/(1.0E+00-THETA11*R(L, I))                SLMXDR3A.240    
         GAMMA11(L, I)=THETA11*T(L, I)                                     SLMXDR3A.241    
         H1(L, I)=G1(L, I+1)+THETA11*S_DOWN(L, I)                          SLMXDR3A.242    
!                                                                          SLMXDR3A.243    
         LAMBDA=T(L, I)*BETA11_INV(L, I)                                   SLMXDR3A.244    
         ALPHA11(L, I)=R(L, I)+LAMBDA*GAMMA11(L, I)                        SLMXDR3A.245    
         G1(L, I)=S_UP(L, I)+LAMBDA*H1(L, I)                               SLMXDR3A.246    
!                                                                          SLMXDR3A.247    
      ENDDO                                                                SLMXDR3A.248    
!                                                                          SLMXDR3A.249    
      DO I=N_CLOUD_TOP-2, 1, -1                                            SLMXDR3A.250    
         DO L=1, N_PROFILE                                                 SLMXDR3A.251    
!                                                                          SLMXDR3A.252    
            BETA11_INV(L, I)=1.0E+00/(1.0E+00-ALPHA11(L, I+1)*R(L, I))     SLMXDR3A.253    
            GAMMA11(L, I)=ALPHA11(L, I+1)*T(L, I)                          SLMXDR3A.254    
            H1(L, I)=G1(L, I+1)+ALPHA11(L, I+1)*S_DOWN(L, I)               SLMXDR3A.255    
!                                                                          SLMXDR3A.256    
            LAMBDA=T(L, I)*BETA11_INV(L, I)                                SLMXDR3A.257    
            ALPHA11(L, I)=R(L, I)+LAMBDA*GAMMA11(L, I)                     SLMXDR3A.258    
            G1(L, I)=S_UP(L, I)+LAMBDA*H1(L, I)                            SLMXDR3A.259    
!                                                                          SLMXDR3A.260    
         ENDDO                                                             SLMXDR3A.261    
      ENDDO                                                                SLMXDR3A.262    
!                                                                          SLMXDR3A.263    
!                                                                          SLMXDR3A.264    
!     INITIALIZE FOR DOWNWARD BACK-SUBSTITUTION.                           SLMXDR3A.265    
      DO L=1, N_PROFILE                                                    SLMXDR3A.266    
         FLUX_TOTAL(L, 2)=FLUX_INC_DOWN(L)                                 SLMXDR3A.267    
         FLUX_TOTAL(L, 1)=ALPHA11(L, 1)*FLUX_TOTAL(L, 2)+G1(L, 1)          SLMXDR3A.268    
      ENDDO                                                                SLMXDR3A.269    
!                                                                          SLMXDR3A.270    
!     SWEEP DOWNWARD THROUGH THE CLEAR-SKY REGION, FINDING THE DOWNWARD    SLMXDR3A.271    
!     FLUX AT THE TOP OF THE LAYER AND THE UPWARD FLUX AT THE BOTTOM.      SLMXDR3A.272    
      DO I=1, N_CLOUD_TOP-1                                                SLMXDR3A.273    
         DO L=1, N_PROFILE                                                 SLMXDR3A.274    
            FLUX_TOTAL(L, 2*I+1)=(GAMMA11(L, I)*FLUX_TOTAL(L, 2*I)         SLMXDR3A.275    
     &         +H1(L, I))*BETA11_INV(L, I)                                 SLMXDR3A.276    
            FLUX_TOTAL(L, 2*I+2)=T(L, I)*FLUX_TOTAL(L, 2*I)                SLMXDR3A.277    
     &         +R(L, I)*FLUX_TOTAL(L, 2*I+1)+S_DOWN(L, I)                  SLMXDR3A.278    
         ENDDO                                                             SLMXDR3A.279    
      ENDDO                                                                SLMXDR3A.280    
!                                                                          SLMXDR3A.281    
!     PASS INTO THE TOP CLOUDY LAYER. USE FLUX_DOWN_[1,2] TO HOLD,         SLMXDR3A.282    
!     PROVISIONALLY, THE DOWNWARD FLUXES JUST BELOW THE TOP OF THE         SLMXDR3A.283    
!     LAYER, THEN CALCULATE THE UPWARD FLUXES AT THE BOTTOM AND            SLMXDR3A.284    
!     FINALLY THE DOWNWARD FLUXES AT THE BOTTOM OF THE LAYER.              SLMXDR3A.285    
      I=N_CLOUD_TOP                                                        SLMXDR3A.286    
      DO L=1, N_PROFILE                                                    SLMXDR3A.287    
         FLUX_DOWN_1(L, I)=V11(L, I-1)*FLUX_TOTAL(L, 2*I)                  SLMXDR3A.288    
         FLUX_DOWN_2(L, I)=V21(L, I-1)*FLUX_TOTAL(L, 2*I)                  SLMXDR3A.289    
         FLUX_UP_1(L, I)=(GAMMA11(L, I)*FLUX_DOWN_1(L, I)                  SLMXDR3A.290    
     &      +GAMMA12(L, I)*FLUX_DOWN_2(L, I)+H1(L, I))*BETA11_INV(L, I)    SLMXDR3A.291    
         FLUX_UP_2(L, I)=(GAMMA21(L, I)*FLUX_DOWN_1(L, I)                  SLMXDR3A.292    
     &      +GAMMA22(L, I)*FLUX_DOWN_2(L, I)+H2(L, I)                      SLMXDR3A.293    
     &      -BETA21(L, I)*FLUX_UP_1(L, I))*BETA22_INV(L, I)                SLMXDR3A.294    
         FLUX_DOWN_1(L, I)=T(L, I)*FLUX_DOWN_1(L, I)                       SLMXDR3A.295    
     &      +R(L, I)*FLUX_UP_1(L, I)+S_DOWN(L, I)                          SLMXDR3A.296    
         FLUX_DOWN_2(L, I)=T_CLOUD(L, I)*FLUX_DOWN_2(L, I)                 SLMXDR3A.297    
     &      +R_CLOUD(L, I)*FLUX_UP_2(L, I)+S_DOWN_CLOUD(L, I)              SLMXDR3A.298    
      ENDDO                                                                SLMXDR3A.299    
!                                                                          SLMXDR3A.300    
!     THE MAIN LOOP OF BACK-SUBSTITUTION. THE PROVISIONAL USE OF THE       SLMXDR3A.301    
!     DOWNWARD FLUXES IS AS ABOVE.                                         SLMXDR3A.302    
      DO I=N_CLOUD_TOP+1, N_LAYER                                          SLMXDR3A.303    
         DO L=1, N_PROFILE                                                 SLMXDR3A.304    
            FLUX_DOWN_1(L, I)=V11(L, I-1)*FLUX_DOWN_1(L, I-1)              SLMXDR3A.305    
     &         +V12(L, I-1)*FLUX_DOWN_2(L, I-1)                            SLMXDR3A.306    
            FLUX_DOWN_2(L, I)=V21(L, I-1)*FLUX_DOWN_1(L, I-1)              SLMXDR3A.307    
     &         +V22(L, I-1)*FLUX_DOWN_2(L, I-1)                            SLMXDR3A.308    
            FLUX_UP_1(L, I)=(GAMMA11(L, I)*FLUX_DOWN_1(L, I)               SLMXDR3A.309    
     &         +GAMMA12(L, I)*FLUX_DOWN_2(L, I)+H1(L, I))                  SLMXDR3A.310    
     &         *BETA11_INV(L, I)                                           SLMXDR3A.311    
            FLUX_UP_2(L, I)=(GAMMA21(L, I)*FLUX_DOWN_1(L, I)               SLMXDR3A.312    
     &         +GAMMA22(L, I)*FLUX_DOWN_2(L, I)                            SLMXDR3A.313    
     &         -BETA21(L, I)*FLUX_UP_1(L, I)+H2(L, I))                     SLMXDR3A.314    
     &         *BETA22_INV(L, I)                                           SLMXDR3A.315    
            FLUX_DOWN_1(L, I)=T(L, I)*FLUX_DOWN_1(L, I)                    SLMXDR3A.316    
     &         +R(L, I)*FLUX_UP_1(L, I)+S_DOWN(L, I)                       SLMXDR3A.317    
            FLUX_DOWN_2(L, I)=T_CLOUD(L, I)*FLUX_DOWN_2(L, I)              SLMXDR3A.318    
     &         +R_CLOUD(L, I)*FLUX_UP_2(L, I)+S_DOWN_CLOUD(L, I)           SLMXDR3A.319    
         ENDDO                                                             SLMXDR3A.320    
      ENDDO                                                                SLMXDR3A.321    
!                                                                          SLMXDR3A.322    
!                                                                          SLMXDR3A.323    
!     CALCULATE THE OVERALL FLUX.                                          SLMXDR3A.324    
      DO I=N_CLOUD_TOP, N_LAYER                                            SLMXDR3A.325    
         DO L=1, N_PROFILE                                                 SLMXDR3A.326    
            FLUX_TOTAL(L, 2*I+1)=FLUX_UP_1(L, I)+FLUX_UP_2(L, I)           SLMXDR3A.327    
            FLUX_TOTAL(L, 2*I+2)=FLUX_DOWN_1(L, I)+FLUX_DOWN_2(L, I)       SLMXDR3A.328    
         ENDDO                                                             SLMXDR3A.329    
      ENDDO                                                                SLMXDR3A.330    
!                                                                          SLMXDR3A.331    
!     REDUCE TO NET FLUXES IF REQUIRED.                                    SLMXDR3A.332    
      IF (L_NET) THEN                                                      SLMXDR3A.333    
         DO I=0, N_LAYER                                                   SLMXDR3A.334    
            DO L=1, N_PROFILE                                              SLMXDR3A.335    
               FLUX_TOTAL(L, I+1)                                          SLMXDR3A.336    
     &            =FLUX_TOTAL(L, 2*I+2)-FLUX_TOTAL(L, 2*I+1)               SLMXDR3A.337    
            ENDDO                                                          SLMXDR3A.338    
         ENDDO                                                             SLMXDR3A.339    
      ENDIF                                                                SLMXDR3A.340    
!                                                                          SLMXDR3A.341    
!                                                                          SLMXDR3A.342    
!                                                                          SLMXDR3A.343    
      RETURN                                                               SLMXDR3A.344    
      END                                                                  SLMXDR3A.345    
*ENDIF DEF,A01_3A,OR,DEF,A02_3A                                            SLMXDR3A.346    
*ENDIF DEF,A70_1A,OR,DEF,A70_1B                                            APB4F405.92