*IF DEF,A70_1A,OR,DEF,A70_1B                                               APB4F405.129    
*IF DEF,A01_3A,OR,DEF,A02_3A                                               TSTR3A.2      
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.14266  
C                                                                          GTS2F400.14267  
C Use, duplication or disclosure of this code is subject to the            GTS2F400.14268  
C restrictions as set forth in the contract.                               GTS2F400.14269  
C                                                                          GTS2F400.14270  
C                Meteorological Office                                     GTS2F400.14271  
C                London Road                                               GTS2F400.14272  
C                BRACKNELL                                                 GTS2F400.14273  
C                Berkshire UK                                              GTS2F400.14274  
C                RG12 2SZ                                                  GTS2F400.14275  
C                                                                          GTS2F400.14276  
C If no contract has been raised with this copy of the code, the use,      GTS2F400.14277  
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.14278  
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.14279  
C Modelling at the above address.                                          GTS2F400.14280  
C ******************************COPYRIGHT******************************    GTS2F400.14281  
C                                                                          GTS2F400.14282  
!+ Subroutine to solve the two-stream equations in a column.               TSTR3A.3      
!                                                                          TSTR3A.4      
! Method:                                                                  TSTR3A.5      
!       The coefficients of the two-stream equations are calculated.       TSTR3A.6      
!       From these we obtain the transmission and reflection               TSTR3A.7      
!       coefficients and the source terms. Depending on the solver         TSTR3A.8      
!       selected, an appropriate set of matrix equations is formulated     TSTR3A.9      
!       and solved to give the fluxes.                                     TSTR3A.10     
!                                                                          TSTR3A.11     
! Current Owner of Code: J. M. Edwards                                     TSTR3A.12     
!                                                                          TSTR3A.13     
! History:                                                                 TSTR3A.14     
!       Version         Date                    Comment                    TSTR3A.15     
!       4.0             27-07-95                Original Code              TSTR3A.16     
!                                               (J. M. Edwards)            TSTR3A.17     
!       4.1             10-04-96                New solver added.          ADB1F401.1235   
!                                               (J. M. Edwards)            ADB1F401.1236   
!       4.5             18-05-98                Obsolete solvers           ADB1F405.988    
!                                               removed.                   ADB1F405.989    
!                                               (J. M. Edwards)            ADB1F405.990    
!                                                                          TSTR3A.18     
! Description of Code:                                                     TSTR3A.19     
!   FORTRAN 77  with extensions listed in documentation.                   TSTR3A.20     
!                                                                          TSTR3A.21     
!- ---------------------------------------------------------------------   TSTR3A.22     

      SUBROUTINE TWO_STREAM(IERR                                            1,6TSTR3A.23     
!                       Atmospheric Properties                             TSTR3A.24     
     &   , N_PROFILE, N_LAYER                                              TSTR3A.25     
!                       Two-stream Scheme                                  TSTR3A.26     
     &   , I_2STREAM                                                       TSTR3A.27     
!                       Corrections to Two-stream scheme                   TSTR3A.28     
     &   , L_2_STREAM_CORRECT, PLANCK_SOURCE, GROUND_EMISSION              TSTR3A.29     
!                       Options for Solver                                 TSTR3A.30     
     &   , L_NET, I_SOLVER                                                 TSTR3A.31     
!                       Options for Equivalent Extinction                  TSTR3A.32     
     &   , L_SCALE_SOLAR, ADJUST_SOLAR_KE                                  TSTR3A.33     
!                       Spectral Region                                    TSTR3A.34     
     &   , ISOLIR                                                          TSTR3A.35     
!                       Infra-red Properties                               TSTR3A.36     
     &   , DIFF_PLANCK                                                     TSTR3A.37     
     &   , L_IR_SOURCE_QUAD, DIFF_PLANCK_2                                 TSTR3A.38     
!                       Conditions at TOA                                  TSTR3A.39     
     &   , FLUX_INC_DOWN, FLUX_INC_DIRECT, SEC_0                           TSTR3A.40     
!                       Surface Conditions                                 TSTR3A.41     
     &   , ALBEDO_SURFACE_DIFF, ALBEDO_SURFACE_DIR, SOURCE_GROUND          TSTR3A.42     
!                       Single Scattering Properties                       TSTR3A.43     
     &   , TAU, OMEGA, ASYMMETRY                                           TSTR3A.44     
!                       Fluxes Calculated                                  TSTR3A.45     
     &   , FLUX_DIRECT, FLUX_TOTAL                                         TSTR3A.46     
!                       Flag for Clear-sky Fluxes                          TSTR3A.47     
     &   , L_CLEAR                                                         TSTR3A.48     
!                       Clear-sky Fluxes Calculated                        TSTR3A.49     
     &   , FLUX_DIRECT_CLEAR, FLUX_TOTAL_CLEAR                             TSTR3A.50     
     &   , NPD_PROFILE, NPD_LAYER                                          TSTR3A.51     
     &   )                                                                 TSTR3A.52     
!                                                                          TSTR3A.53     
!                                                                          TSTR3A.54     
!                                                                          TSTR3A.55     
      IMPLICIT NONE                                                        TSTR3A.56     
!                                                                          TSTR3A.57     
!                                                                          TSTR3A.58     
!     SIZES OF DUMMY ARRAYS.                                               TSTR3A.59     
      INTEGER   !, INTENT(IN)                                              TSTR3A.60     
     &     NPD_PROFILE                                                     TSTR3A.61     
!             MAXIMUM NUMBER OF PROFILES                                   TSTR3A.62     
     &   , NPD_LAYER                                                       TSTR3A.63     
!             MAXIMUM NUMBER OF LAYERS                                     TSTR3A.64     
!     INCLUDE COMDECKS.                                                    TSTR3A.65     
*CALL DIMFIX3A                                                             TSTR3A.66     
*CALL STDIO3A                                                              TSTR3A.67     
*CALL ERROR3A                                                              TSTR3A.68     
*CALL SOLVER3A                                                             TSTR3A.69     
*CALL SPCRG3A                                                              TSTR3A.70     
!                                                                          TSTR3A.71     
!     DUMMY VARIABLES.                                                     TSTR3A.72     
      INTEGER   !, INTENT(IN)                                              TSTR3A.73     
     &     N_PROFILE                                                       TSTR3A.74     
!             NUMBER OF PROFILES                                           TSTR3A.75     
     &   , N_LAYER                                                         TSTR3A.76     
!             NUMBER OF LAYERS                                             TSTR3A.77     
     &   , ISOLIR                                                          TSTR3A.78     
!             SPECTRAL REGION                                              TSTR3A.79     
     &   , I_SOLVER                                                        TSTR3A.80     
!             SOLVER EMPLOYED                                              TSTR3A.81     
     &   , I_2STREAM                                                       TSTR3A.82     
!             TWO-STREAM SCHEME                                            TSTR3A.83     
      INTEGER   !, INTENT(OUT)                                             TSTR3A.84     
     &     IERR                                                            TSTR3A.85     
!             ERROR FLAG                                                   TSTR3A.86     
      LOGICAL   !, INTENT(IN)                                              TSTR3A.87     
     &     L_NET                                                           TSTR3A.88     
!             CALCULATE NET FLUXES                                         TSTR3A.89     
     &   , L_CLEAR                                                         TSTR3A.90     
!             CALCULATE CLEAR FLUXES                                       TSTR3A.91     
     &   , L_SCALE_SOLAR                                                   TSTR3A.92     
!             SCALING APPLIED TO SOLAR FLUX                                TSTR3A.93     
     &   , L_IR_SOURCE_QUAD                                                TSTR3A.94     
!             USE QUADRATIC SOURCE TERM                                    TSTR3A.95     
     &   , L_2_STREAM_CORRECT                                              TSTR3A.96     
!             EDGE CORRECTION FOR 2-STREAM                                 TSTR3A.97     
      REAL      !, INTENT(IN)                                              TSTR3A.98     
     &     TAU(NPD_PROFILE, NPD_LAYER)                                     TSTR3A.99     
!             OPTICAL DEPTH                                                TSTR3A.100    
     &   , OMEGA(NPD_PROFILE, NPD_LAYER)                                   TSTR3A.101    
!             ALBEDO OF SINGLE SCATTERING                                  TSTR3A.102    
     &   , ASYMMETRY(NPD_PROFILE, NPD_LAYER)                               TSTR3A.103    
!             ASYMMETRY                                                    TSTR3A.104    
     &   , SEC_0(NPD_PROFILE)                                              TSTR3A.105    
!             SECANTS OF SOLAR ZENITH ANGLES                               TSTR3A.106    
     &   , ALBEDO_SURFACE_DIFF(NPD_PROFILE)                                TSTR3A.107    
!             DIFFUSE ALBEDO                                               TSTR3A.108    
     &   , ALBEDO_SURFACE_DIR(NPD_PROFILE)                                 TSTR3A.109    
!             DIRECT ALBEDO                                                TSTR3A.110    
     &   , FLUX_INC_DOWN(NPD_PROFILE)                                      TSTR3A.111    
!             INCIDENT TOTAL FLUX                                          TSTR3A.112    
     &   , FLUX_INC_DIRECT(NPD_PROFILE)                                    TSTR3A.113    
!             INCIDENT DIRECT FLUX                                         TSTR3A.114    
     &   , DIFF_PLANCK(NPD_PROFILE, NPD_LAYER)                             TSTR3A.115    
!             DIFFERENCE IN PI*PLANCK FUNCTION                             TSTR3A.116    
     &   , SOURCE_GROUND(NPD_PROFILE)                                      TSTR3A.117    
!             GROUND SOURCE FUNCTION                                       TSTR3A.118    
     &   , ADJUST_SOLAR_KE(NPD_PROFILE, NPD_LAYER)                         TSTR3A.119    
!             ADJUSTMENT OF SOLAR BEAM WITH EQUIVALENT EXTINCTION          TSTR3A.120    
     &   , DIFF_PLANCK_2(NPD_PROFILE, NPD_LAYER)                           TSTR3A.121    
!             2x2ND DIFFERENCES OF PLANCKIAN                               TSTR3A.122    
     &   , PLANCK_SOURCE(NPD_PROFILE, NPD_LAYER)                           TSTR3A.123    
!             PLANCKIAN SOURCE FUNCTION                                    TSTR3A.124    
     &   , GROUND_EMISSION(NPD_PROFILE)                                    TSTR3A.125    
!             TOTAL FLUX EMITTED FROM GROUND                               TSTR3A.126    
      REAL      !, INTENT(OUT)                                             TSTR3A.127    
     &     FLUX_DIRECT(NPD_PROFILE, 0: NPD_LAYER)                          TSTR3A.128    
!             DIRECT FLUX                                                  TSTR3A.129    
     &   , FLUX_TOTAL(NPD_PROFILE, 2*NPD_LAYER+2)                          TSTR3A.130    
!             TOTAL FLUXES                                                 TSTR3A.131    
     &   , FLUX_DIRECT_CLEAR(NPD_PROFILE, 0: NPD_LAYER)                    TSTR3A.132    
!             CLEAR DIRECT FLUX                                            TSTR3A.133    
     &   , FLUX_TOTAL_CLEAR(NPD_PROFILE, 2*NPD_LAYER+2)                    TSTR3A.134    
!             CLEAR TOTAL FLUXES                                           TSTR3A.135    
!                                                                          TSTR3A.136    
!                                                                          TSTR3A.137    
!     LOCAL VARIABALES.                                                    TSTR3A.138    
      INTEGER                                                              TSTR3A.139    
     &     N_EQUATION                                                      TSTR3A.140    
!             NUMBER OF EQUATIONS                                          TSTR3A.141    
     &   , I                                                               TSTR3A.142    
!             LOOP VARIABLE                                                TSTR3A.143    
     &   , L                                                               TSTR3A.144    
!             LOOP VARIABLE                                                TSTR3A.145    
      REAL                                                                 TSTR3A.146    
     &     TRANS(NPD_PROFILE, NPD_LAYER)                                   TSTR3A.147    
!             TRANSMISSION OF LAYER                                        TSTR3A.148    
     &   , REFLECT(NPD_PROFILE, NPD_LAYER)                                 TSTR3A.149    
!             REFLECTANCE OF LAYER                                         TSTR3A.150    
     &   , TRANS_0(NPD_PROFILE, NPD_LAYER)                                 TSTR3A.151    
!             DIRECT TRANSMITTANCE                                         TSTR3A.152    
     &   , SOURCE_COEFF(NPD_PROFILE, NPD_LAYER, NPD_SOURCE_COEFF)          TSTR3A.153    
!             SOURCE COEFFICIENTS                                          TSTR3A.154    
     &   , S_DOWN(NPD_PROFILE, NPD_LAYER)                                  TSTR3A.155    
!             DOWNWARD SOURCE                                              TSTR3A.156    
     &   , S_UP(NPD_PROFILE, NPD_LAYER)                                    TSTR3A.157    
!             UPWARD SOURCE                                                TSTR3A.158    
      REAL                                                                 TSTR3A.159    
     &     A3(NPD_PROFILE, 3, 2*NPD_LAYER+2)                               TSTR3A.160    
!             TRIDIAGONAL MATRIX                                           TSTR3A.161    
     &   , A5(NPD_PROFILE, 5, 2*NPD_LAYER+2)                               TSTR3A.162    
!             PENTADIGONAL MATRIX                                          TSTR3A.163    
     &   , B(NPD_PROFILE, 2*NPD_LAYER+2)                                   TSTR3A.164    
!             RHS OF MATRIX EQUATION                                       TSTR3A.165    
     &   , WORK_1(NPD_PROFILE, 2*NPD_LAYER+2)                              TSTR3A.166    
!             WORKING ARRAY FOR SOLVER                                     TSTR3A.167    
!                                                                          TSTR3A.170    
!     SUBROUTINES CALLED:                                                  TSTR3A.171    
      EXTERNAL                                                             TSTR3A.172    
     &     TWO_COEFF, SOLAR_SOURCE, IR_SOURCE                              TSTR3A.173    
     &   , SET_MATRIX_PENTADIAGONAL                                        ADB1F405.991    
     &   , BAND_SOLVER, SOLVER_HOMOGEN_DIRECT                              ADB1F401.1237   
!                                                                          TSTR3A.177    
!                                                                          TSTR3A.178    
!                                                                          TSTR3A.179    
!     CALCULATE THE TWO-STREAM COEFFICIENTS.                               TSTR3A.180    
      CALL TWO_COEFF(IERR                                                  TSTR3A.181    
     &   , N_PROFILE, 1, N_LAYER                                           TSTR3A.182    
     &   , I_2STREAM, L_IR_SOURCE_QUAD                                     TSTR3A.183    
     &   , ASYMMETRY, OMEGA, TAU                                           TSTR3A.184    
     &   , ISOLIR, SEC_0                                                   TSTR3A.185    
     &   , TRANS, REFLECT, TRANS_0                                         TSTR3A.186    
     &   , SOURCE_COEFF                                                    TSTR3A.187    
     &   , NPD_PROFILE, NPD_LAYER                                          TSTR3A.188    
     &   )                                                                 TSTR3A.189    
      IF (IERR.NE.I_NORMAL) THEN                                           TSTR3A.190    
         RETURN                                                            TSTR3A.191    
      ENDIF                                                                TSTR3A.192    
!                                                                          TSTR3A.193    
!     CALCULATE THE APPROPRIATE SOURCE TERMS.                              TSTR3A.194    
      IF (ISOLIR.EQ.IP_SOLAR) THEN                                         TSTR3A.195    
         CALL SOLAR_SOURCE(N_PROFILE, N_LAYER                              TSTR3A.196    
     &      , FLUX_INC_DIRECT                                              TSTR3A.197    
     &      , TRANS_0, SOURCE_COEFF                                        TSTR3A.198    
     &      , L_SCALE_SOLAR, ADJUST_SOLAR_KE                               TSTR3A.199    
     &      , FLUX_DIRECT                                                  TSTR3A.200    
     &      , S_DOWN, S_UP                                                 TSTR3A.201    
     &      , NPD_PROFILE, NPD_LAYER                                       TSTR3A.202    
     &      )                                                              TSTR3A.203    
      ELSE IF (ISOLIR.EQ.IP_INFRA_RED) THEN                                TSTR3A.204    
         CALL IR_SOURCE(N_PROFILE, 1, N_LAYER                              TSTR3A.205    
     &      , SOURCE_COEFF, DIFF_PLANCK                                    TSTR3A.206    
     &      , L_IR_SOURCE_QUAD, DIFF_PLANCK_2                              TSTR3A.207    
     &      , L_2_STREAM_CORRECT, PLANCK_SOURCE                            TSTR3A.208    
     &      , GROUND_EMISSION, N_LAYER                                     TSTR3A.209    
     &      , TAU, TRANS                                                   TSTR3A.210    
     &      , S_DOWN, S_UP                                                 TSTR3A.211    
     &      , NPD_PROFILE, NPD_LAYER                                       TSTR3A.212    
     &      )                                                              TSTR3A.213    
      ENDIF                                                                TSTR3A.214    
!                                                                          TSTR3A.215    
!                                                                          TSTR3A.229    
!     SELECT AN APPROPRIATE SOLVER FOR THE EQUATIONS OF TRANSFER.          ADB1F405.992    
!                                                                          TSTR3A.256    
      IF (I_SOLVER.EQ.IP_SOLVER_PENTADIAGONAL) THEN                        ADB1F405.993    
         CALL SET_MATRIX_PENTADIAGONAL(N_PROFILE, N_LAYER                  TSTR3A.268    
     &      , TRANS, REFLECT                                               TSTR3A.269    
     &      , S_DOWN, S_UP                                                 TSTR3A.270    
     &      , ALBEDO_SURFACE_DIFF, ALBEDO_SURFACE_DIR                      TSTR3A.271    
     &      , FLUX_DIRECT(1, N_LAYER), FLUX_INC_DOWN                       TSTR3A.272    
     &      , SOURCE_GROUND                                                TSTR3A.273    
     &      , A5, B                                                        TSTR3A.274    
     &      , NPD_PROFILE, NPD_LAYER                                       TSTR3A.275    
     &      )                                                              TSTR3A.276    
         N_EQUATION=2*N_LAYER+2                                            TSTR3A.277    
!                                                                          TSTR3A.278    
         CALL BAND_SOLVER(N_PROFILE, N_EQUATION                            TSTR3A.279    
     &      , 2, 2                                                         TSTR3A.280    
     &      , A5, B                                                        TSTR3A.281    
     &      , FLUX_TOTAL                                                   TSTR3A.282    
     &      , NPD_PROFILE, 2*NPD_LAYER+2                                   TSTR3A.283    
     &      , WORK_1                                                       TSTR3A.284    
     &      )                                                              TSTR3A.285    
!                                                                          TSTR3A.286    
      ELSE IF (I_SOLVER.EQ.IP_SOLVER_HOMOGEN_DIRECT) THEN                  ADB1F401.1238   
!                                                                          ADB1F401.1239   
         CALL SOLVER_HOMOGEN_DIRECT(N_PROFILE, N_LAYER                     ADB1F401.1240   
     &      , TRANS, REFLECT                                               ADB1F401.1241   
     &      , S_DOWN, S_UP                                                 ADB1F401.1242   
     &      , ALBEDO_SURFACE_DIFF, ALBEDO_SURFACE_DIR                      ADB1F401.1243   
     &      , FLUX_DIRECT(1, N_LAYER), FLUX_INC_DOWN                       ADB1F401.1244   
     &      , SOURCE_GROUND                                                ADB1F401.1245   
     &      , FLUX_TOTAL                                                   ADB1F401.1246   
     &      , NPD_PROFILE, NPD_LAYER                                       ADB1F401.1247   
     &      )                                                              ADB1F401.1248   
!                                                                          ADB1F401.1249   
      ELSE                                                                 TSTR3A.287    
!                                                                          ADB1F401.1250   
         WRITE(IU_ERR, '(/A)')                                             TSTR3A.288    
     &      '***ERROR: THE SOLVER AND CLOUD SCHEME ARE NOT COMPATIBLE.'    TSTR3A.289    
         IERR=I_ERR_FATAL                                                  TSTR3A.290    
         RETURN                                                            TSTR3A.291    
!                                                                          TSTR3A.292    
      ENDIF                                                                TSTR3A.293    
!                                                                          TSTR3A.294    
!                                                                          ADB1F401.1251   
!                                                                          ADB1F401.1252   
      IF (L_CLEAR) THEN                                                    TSTR3A.295    
!        THE CLEAR FLUXES HERE CAN BE COPIED DIRECTLY WITHOUT              TSTR3A.296    
!        ANY FURTHER CALCULATION.                                          TSTR3A.297    
         IF (ISOLIR.EQ.IP_SOLAR) THEN                                      TSTR3A.298    
            DO I=0, N_LAYER                                                TSTR3A.299    
               DO L=1, N_PROFILE                                           TSTR3A.300    
                  FLUX_DIRECT_CLEAR(L, I)=FLUX_DIRECT(L, I)                TSTR3A.301    
               ENDDO                                                       TSTR3A.302    
            ENDDO                                                          TSTR3A.303    
         ENDIF                                                             TSTR3A.304    
         IF (L_NET) THEN                                                   TSTR3A.305    
            DO I=1, N_LAYER+1                                              TSTR3A.306    
               DO L=1, N_PROFILE                                           TSTR3A.307    
                  FLUX_TOTAL_CLEAR(L, I)=FLUX_TOTAL(L, I)                  TSTR3A.308    
               ENDDO                                                       TSTR3A.309    
            ENDDO                                                          TSTR3A.310    
         ELSE                                                              TSTR3A.311    
            DO I=1, 2*N_LAYER+2                                            TSTR3A.312    
               DO L=1, N_PROFILE                                           TSTR3A.313    
                  FLUX_TOTAL_CLEAR(L, I)=FLUX_TOTAL(L, I)                  TSTR3A.314    
               ENDDO                                                       TSTR3A.315    
            ENDDO                                                          TSTR3A.316    
         ENDIF                                                             TSTR3A.317    
      ENDIF                                                                TSTR3A.318    
!                                                                          ADB1F401.1253   
!                                                                          TSTR3A.319    
!                                                                          TSTR3A.320    
      RETURN                                                               TSTR3A.321    
      END                                                                  TSTR3A.322    
*ENDIF DEF,A01_3A,OR,DEF,A02_3A                                            TSTR3A.323    
*ENDIF DEF,A70_1A,OR,DEF,A70_1B                                            APB4F405.130