*IF DEF,A70_1A,OR,DEF,A70_1B                                               APB4F405.49     
*IF DEF,A01_3A,OR,DEF,A02_3A                                               MXCOF3A.2      
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    GTS2F400.13501  
C                                                                          GTS2F400.13502  
C Use, duplication or disclosure of this code is subject to the            GTS2F400.13503  
C restrictions as set forth in the contract.                               GTS2F400.13504  
C                                                                          GTS2F400.13505  
C                Meteorological Office                                     GTS2F400.13506  
C                London Road                                               GTS2F400.13507  
C                BRACKNELL                                                 GTS2F400.13508  
C                Berkshire UK                                              GTS2F400.13509  
C                RG12 2SZ                                                  GTS2F400.13510  
C                                                                          GTS2F400.13511  
C If no contract has been raised with this copy of the code, the use,      GTS2F400.13512  
C duplication or disclosure of it is strictly prohibited.  Permission      GTS2F400.13513  
C to do so must first be obtained in writing from the Head of Numerical    GTS2F400.13514  
C Modelling at the above address.                                          GTS2F400.13515  
C ******************************COPYRIGHT******************************    GTS2F400.13516  
C                                                                          GTS2F400.13517  
!+ Subroutine implementing an endekadiagonal solution of the equations.    MXCOF3A.3      
!                                                                          MXCOF3A.4      
! Method:                                                                  MXCOF3A.5      
!       This subroutine calls subroutines to set the endekadiagonal        MXCOF3A.6      
!       matrix for the clear and cloudy upward and downward fluxes         MXCOF3A.7      
!       and to solve those equations. It is kept separate to avoid         MXCOF3A.8      
!       allocating space for so large a matrix in the upper routine        MXCOF3A.9      
!       when that is used in a GCM and this routine is very                MXCOF3A.10     
!       unlikely to be used.                                               MXCOF3A.11     
!                                                                          MXCOF3A.12     
! Current Owner of Code: J. M. Edwards                                     MXCOF3A.13     
!                                                                          MXCOF3A.14     
! History:                                                                 MXCOF3A.15     
!       Version         Date                    Comment                    MXCOF3A.16     
!       4.0             27-07-95                Original Code              MXCOF3A.17     
!                                               (J. M. Edwards)            MXCOF3A.18     
!                                                                          MXCOF3A.19     
! Description of Code:                                                     MXCOF3A.20     
!   FORTRAN 77  with extensions listed in documentation.                   MXCOF3A.21     
!                                                                          MXCOF3A.22     
!- ---------------------------------------------------------------------   MXCOF3A.23     

      SUBROUTINE MIX_COLUMN_FULL(N_PROFILE, N_LAYER, N_CLOUD_TOP            1,2MXCOF3A.24     
     &   , T_FREE, R_FREE, S_DOWN_FREE, S_UP_FREE                          MXCOF3A.25     
     &   , T_CLOUD, R_CLOUD, S_DOWN_CLOUD, S_UP_CLOUD                      MXCOF3A.26     
     &   , G_M, G_P, B_M, B_P                                              MXCOF3A.27     
     &   , FLUX_INC_DOWN                                                   MXCOF3A.28     
     &   , SOURCE_GROUND, ALBEDO_SURFACE_DIFF, ALBEDO_SURFACE_DIR          MXCOF3A.29     
     &   , FLUX_DIRECT_GROUND                                              MXCOF3A.30     
     &   , FLUX_TOTAL                                                      MXCOF3A.31     
     &   , NPD_PROFILE, NPD_LAYER                                          MXCOF3A.32     
     &   )                                                                 MXCOF3A.33     
!                                                                          MXCOF3A.34     
!                                                                          MXCOF3A.35     
!                                                                          MXCOF3A.36     
      IMPLICIT NONE                                                        MXCOF3A.37     
!                                                                          MXCOF3A.38     
!                                                                          MXCOF3A.39     
!     SIZES OF DUMMY ARRAYS.                                               MXCOF3A.40     
      INTEGER   !, INTENT(IN)                                              MXCOF3A.41     
     &     NPD_PROFILE                                                     MXCOF3A.42     
!             MAXIMUM NUMBER OF PROFILES                                   MXCOF3A.43     
     &   , NPD_LAYER                                                       MXCOF3A.44     
!             MAXIMUM NUMBER OF LAYERS                                     MXCOF3A.45     
!                                                                          MXCOF3A.46     
!                                                                          MXCOF3A.47     
!     DUMMY ARGUMENTS.                                                     MXCOF3A.48     
      INTEGER   !, INTENT(IN)                                              MXCOF3A.49     
     &     N_PROFILE                                                       MXCOF3A.50     
!             NUMBER OF PROFILES                                           MXCOF3A.51     
     &   , N_LAYER                                                         MXCOF3A.52     
!             NUMBER OF LAYERS                                             MXCOF3A.53     
     &   , N_CLOUD_TOP                                                     MXCOF3A.54     
!             TOPMOST CLOUDY LAYER                                         MXCOF3A.55     
      REAL      !, INTENT(IN)                                              MXCOF3A.56     
     &     T_FREE(NPD_PROFILE, NPD_LAYER)                                  MXCOF3A.57     
!             FREE TRANSMISSION                                            MXCOF3A.58     
     &   , R_FREE(NPD_PROFILE, NPD_LAYER)                                  MXCOF3A.59     
!             FREE REFLECTION                                              MXCOF3A.60     
     &   , S_DOWN_FREE(NPD_PROFILE, NPD_LAYER)                             MXCOF3A.61     
!             FREE DOWNWARD SOURCE FUNCTION                                MXCOF3A.62     
     &   , S_UP_FREE(NPD_PROFILE, NPD_LAYER)                               MXCOF3A.63     
!             FREE UPWARD SOURCE FUNCTION                                  MXCOF3A.64     
     &   , T_CLOUD(NPD_PROFILE, NPD_LAYER)                                 MXCOF3A.65     
!             CLOUDY TRANSMISSION                                          MXCOF3A.66     
     &   , R_CLOUD(NPD_PROFILE, NPD_LAYER)                                 MXCOF3A.67     
!             CLOUDY REFLECTION                                            MXCOF3A.68     
     &   , S_DOWN_CLOUD(NPD_PROFILE, NPD_LAYER)                            MXCOF3A.69     
!             DOWNWARD CLOUDY SOURCE FUNCTION                              MXCOF3A.70     
     &   , S_UP_CLOUD(NPD_PROFILE, NPD_LAYER)                              MXCOF3A.71     
!             UPWARD CLOUDY SOURCE FUNCTION                                MXCOF3A.72     
      REAL      !, INTENT(IN)                                              MXCOF3A.73     
     &     B_M(NPD_PROFILE, 0: NPD_LAYER)                                  MXCOF3A.74     
!             ENERGY TRANSFER COEFFICIENT                                  MXCOF3A.75     
     &   , B_P(NPD_PROFILE, 0: NPD_LAYER)                                  MXCOF3A.76     
!             ENERGY TRANSFER COEFFICIENT                                  MXCOF3A.77     
     &   , G_M(NPD_PROFILE, 0: NPD_LAYER)                                  MXCOF3A.78     
!             ENERGY TRANSFER COEFFICIENT                                  MXCOF3A.79     
     &   , G_P(NPD_PROFILE, 0: NPD_LAYER)                                  MXCOF3A.80     
!             ENERGY TRANSFER COEFFICIENT                                  MXCOF3A.81     
      REAL      !, INTENT(IN)                                              MXCOF3A.82     
     &     FLUX_INC_DOWN(NPD_PROFILE)                                      MXCOF3A.83     
!             INCIDENT TOTAL FLUX                                          MXCOF3A.84     
     &   , SOURCE_GROUND(NPD_PROFILE)                                      MXCOF3A.85     
!             SOURCE FROM GROUND                                           MXCOF3A.86     
     &   , ALBEDO_SURFACE_DIFF(NPD_PROFILE)                                MXCOF3A.87     
!             DIFFUSE ALBEDO                                               MXCOF3A.88     
     &   , ALBEDO_SURFACE_DIR(NPD_PROFILE)                                 MXCOF3A.89     
!             DIRECT ALBEDO                                                MXCOF3A.90     
     &   , FLUX_DIRECT_GROUND(NPD_PROFILE)                                 MXCOF3A.91     
!             DIRECT FLUX AT GROUND                                        MXCOF3A.92     
      REAL      !, INTENT(OUT)                                             MXCOF3A.93     
     &     FLUX_TOTAL(NPD_PROFILE, 2*NPD_LAYER+2)                          MXCOF3A.94     
!             TOTAL FLUX                                                   MXCOF3A.95     
!                                                                          MXCOF3A.96     
!     LOCAL VARIABLES.                                                     MXCOF3A.97     
      INTEGER                                                              MXCOF3A.98     
     &     I                                                               MXCOF3A.99     
!             LOOP VARIABLE                                                MXCOF3A.100    
     &   , L                                                               MXCOF3A.101    
!             LOOP VARIABLE                                                MXCOF3A.102    
     &   , N_EQUATION                                                      MXCOF3A.103    
!             NUMBER OF EQUATIONS                                          MXCOF3A.104    
      REAL                                                                 MXCOF3A.105    
     &     A11(NPD_PROFILE, 11, 4*NPD_LAYER+4)                             MXCOF3A.106    
!             MATRIX TO BE SOLVED                                          MXCOF3A.107    
     &   , B(NPD_PROFILE, 4*NPD_LAYER+4)                                   MXCOF3A.108    
!             RIGHT-HAND SIDE OF EQUATION                                  MXCOF3A.109    
     &   , X(NPD_PROFILE, 4*NPD_LAYER+4)                                   MXCOF3A.110    
!             SOLUTION TO MATRIX EQUATION                                  MXCOF3A.111    
     &   , WORK(NPD_PROFILE)                                               MXCOF3A.112    
!             WORKING ARRAY                                                MXCOF3A.113    
!                                                                          MXCOF3A.114    
!     SUBROUTINES CALLED:                                                  MXCOF3A.115    
      EXTERNAL                                                             MXCOF3A.116    
     &     MIX_MATRIX_ELEM, BAND_SOLVER                                    MXCOF3A.117    
!                                                                          MXCOF3A.118    
!                                                                          MXCOF3A.119    
!                                                                          MXCOF3A.120    
!     ASSIGN THE ELEMENTS OF THE MATRIX A11 AND THE VECTOR B.              MXCOF3A.121    
      CALL MIX_MATRIX_ELEM(N_PROFILE, N_LAYER, N_CLOUD_TOP                 MXCOF3A.122    
     &   , T_FREE, R_FREE, S_DOWN_FREE, S_UP_FREE                          MXCOF3A.123    
     &   , T_CLOUD, R_CLOUD, S_DOWN_CLOUD, S_UP_CLOUD                      MXCOF3A.124    
     &   , G_M, G_P, B_M, B_P                                              MXCOF3A.125    
     &   , FLUX_INC_DOWN                                                   MXCOF3A.126    
     &   , SOURCE_GROUND, ALBEDO_SURFACE_DIFF, ALBEDO_SURFACE_DIR          MXCOF3A.127    
     &   , FLUX_DIRECT_GROUND                                              MXCOF3A.128    
     &   , A11, B                                                          MXCOF3A.129    
     &   , NPD_PROFILE, NPD_LAYER                                          MXCOF3A.130    
     &   )                                                                 MXCOF3A.131    
!                                                                          MXCOF3A.132    
      N_EQUATION=4*N_LAYER+4                                               MXCOF3A.133    
      CALL BAND_SOLVER(N_PROFILE, N_EQUATION                               MXCOF3A.134    
     &   , 5, 5                                                            MXCOF3A.135    
     &   , A11, B                                                          MXCOF3A.136    
     &   , X                                                               MXCOF3A.137    
     &   , NPD_PROFILE, 4*NPD_LAYER+4                                      MXCOF3A.138    
     &   , WORK                                                            MXCOF3A.139    
     &   )                                                                 MXCOF3A.140    
!                                                                          MXCOF3A.141    
!     PICK OUT THE SUMMED FLUXES FROM THE LONG VECTOR                      MXCOF3A.142    
      DO I=1, 2*N_LAYER+2                                                  MXCOF3A.143    
         DO L=1, N_PROFILE                                                 MXCOF3A.144    
            FLUX_TOTAL(L, I)=X(L, 2*I)                                     MXCOF3A.145    
         ENDDO                                                             MXCOF3A.146    
      ENDDO                                                                MXCOF3A.147    
!                                                                          MXCOF3A.148    
!                                                                          MXCOF3A.149    
      RETURN                                                               MXCOF3A.150    
      END                                                                  MXCOF3A.151    
*ENDIF DEF,A01_3A,OR,DEF,A02_3A                                            MXCOF3A.152    
*ENDIF DEF,A70_1A,OR,DEF,A70_1B                                            APB4F405.50