*IF DEF,A70_1A,OR,DEF,A70_1B APB4F405.89 *IF DEF,A01_3A,OR,DEF,A02_3A SLHGDR3A.2 C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. SLHGDR3A.3 C SLHGDR3A.4 C Use, duplication or disclosure of this code is subject to the SLHGDR3A.5 C restrictions as set forth in the contract. SLHGDR3A.6 C SLHGDR3A.7 C Meteorological Office SLHGDR3A.8 C London Road SLHGDR3A.9 C BRACKNELL SLHGDR3A.10 C Berkshire UK SLHGDR3A.11 C RG12 2SZ SLHGDR3A.12 C SLHGDR3A.13 C If no contract has been raised with this copy of the code, the use, SLHGDR3A.14 C duplication or disclosure of it is strictly prohibited. Permission SLHGDR3A.15 C to do so must first be obtained in writing from the Head of Numerical SLHGDR3A.16 C Modelling at the above address. SLHGDR3A.17 C ******************************COPYRIGHT****************************** SLHGDR3A.18 C SLHGDR3A.19 !+ Subroutine to calculate fluxes in a homogeneous column directly. SLHGDR3A.20 ! SLHGDR3A.21 ! Method: SLHGDR3A.22 ! Straightforward. SLHGDR3A.23 ! SLHGDR3A.24 ! Current Owner of Code: J. M. Edwards SLHGDR3A.25 ! SLHGDR3A.26 ! History: SLHGDR3A.27 ! Version Date Comment SLHGDR3A.28 ! 4.1 09-04-96 Original Code SLHGDR3A.29 ! (J. M. Edwards) SLHGDR3A.30 ! SLHGDR3A.31 ! Description of Code: SLHGDR3A.32 ! FORTRAN 77 with extensions listed in documentation. SLHGDR3A.33 ! SLHGDR3A.34 !- --------------------------------------------------------------------- SLHGDR3A.35SUBROUTINE SOLVER_HOMOGEN_DIRECT(N_PROFILE, N_LAYER 3SLHGDR3A.36 & , TRANS, REFLECT SLHGDR3A.37 & , S_DOWN, S_UP SLHGDR3A.38 & , ALBEDO_SURFACE_DIFF, ALBEDO_SURFACE_DIR SLHGDR3A.39 & , FLUX_DIRECT_GROUND, FLUX_INC_DOWN SLHGDR3A.40 & , SOURCE_GROUND SLHGDR3A.41 & , FLUX_TOTAL SLHGDR3A.42 & , NPD_PROFILE, NPD_LAYER SLHGDR3A.43 & ) SLHGDR3A.44 ! SLHGDR3A.45 ! SLHGDR3A.46 IMPLICIT NONE SLHGDR3A.47 ! SLHGDR3A.48 ! SLHGDR3A.49 ! SIZES OF DUMMY ARRAYS. SLHGDR3A.50 INTEGER !, INTENT(IN) SLHGDR3A.51 & NPD_PROFILE SLHGDR3A.52 ! MAXIMUM NUMBER OF PROFILES SLHGDR3A.53 & , NPD_LAYER SLHGDR3A.54 ! MAXIMUM NUMBER OF LAYERS SLHGDR3A.55 ! SLHGDR3A.56 ! SLHGDR3A.57 ! DUMMY ARGUMENTS. SLHGDR3A.58 INTEGER !, INTENT(IN) SLHGDR3A.59 & N_PROFILE SLHGDR3A.60 ! NUMBER OF PROFILES SLHGDR3A.61 & , N_LAYER SLHGDR3A.62 ! NUMBER OF LAYERS SLHGDR3A.63 REAL !, INTENT(IN) SLHGDR3A.64 & TRANS(NPD_PROFILE, NPD_LAYER) SLHGDR3A.65 ! TRANSMISSION COEFFICIENT SLHGDR3A.66 & , REFLECT(NPD_PROFILE, NPD_LAYER) SLHGDR3A.67 ! REFLECTION COEFFICIENT SLHGDR3A.68 & , S_DOWN(NPD_PROFILE, NPD_LAYER) SLHGDR3A.69 ! DOWNWARD DIFFUSE SOURCE SLHGDR3A.70 & , S_UP(NPD_PROFILE, NPD_LAYER) SLHGDR3A.71 ! UPWARD DIFFUSE SOURCE SLHGDR3A.72 & , ALBEDO_SURFACE_DIFF(NPD_PROFILE) SLHGDR3A.73 ! DIFFUSE SURFACE ALBEDO SLHGDR3A.74 & , ALBEDO_SURFACE_DIR(NPD_PROFILE) SLHGDR3A.75 ! DIRECT SURFACE ALBEDO SLHGDR3A.76 & , SOURCE_GROUND(NPD_PROFILE) SLHGDR3A.77 ! SOURCE FUNCTION OF GROUND SLHGDR3A.78 & , FLUX_INC_DOWN(NPD_PROFILE) SLHGDR3A.79 ! INCIDENT TOTAL FLUX SLHGDR3A.80 & , FLUX_DIRECT_GROUND(NPD_PROFILE) SLHGDR3A.81 ! DIRECT FLUX AT SLHGDR3A.82 ! GROUND LEVEL SLHGDR3A.83 ! SLHGDR3A.84 REAL !, INTENT(OUT) SLHGDR3A.85 & FLUX_TOTAL(NPD_PROFILE, 2*NPD_LAYER+2) SLHGDR3A.86 ! TOTAL FLUX SLHGDR3A.87 ! SLHGDR3A.88 ! DECLARATION OF LOCAL VARIABLES. SLHGDR3A.89 INTEGER SLHGDR3A.90 & I SLHGDR3A.91 ! LOOP VARIABLE SLHGDR3A.92 & , L SLHGDR3A.93 ! LOOP VARIABLE SLHGDR3A.94 ! SLHGDR3A.95 REAL SLHGDR3A.96 & ALPHA(NPD_PROFILE, NPD_LAYER+1) SLHGDR3A.97 ! COMBINED ALBEDO OF LOWER LAYERS SLHGDR3A.98 & , BETA(NPD_PROFILE, NPD_LAYER) SLHGDR3A.99 ! WORKING ARRAY SLHGDR3A.100 & , GAMMA(NPD_PROFILE, NPD_LAYER) SLHGDR3A.101 ! WORKING ARRAY SLHGDR3A.102 & , H(NPD_PROFILE, NPD_LAYER) SLHGDR3A.103 ! WORKING ARRAY SLHGDR3A.104 & , S_UP_PRIME(NPD_PROFILE, NPD_LAYER+1) SLHGDR3A.105 ! MODIFIED UPWARD SOURCE FUNCTION SLHGDR3A.106 ! SLHGDR3A.107 ! SLHGDR3A.108 ! SLHGDR3A.109 ! INITIALIZATION AT THE BOTTOM FOR UPWARD ELIMINATION: SLHGDR3A.110 DO L=1, N_PROFILE SLHGDR3A.111 ALPHA(L, N_LAYER+1)=ALBEDO_SURFACE_DIFF(L) SLHGDR3A.112 S_UP_PRIME(L, N_LAYER+1)=SOURCE_GROUND(L) SLHGDR3A.113 & +(ALBEDO_SURFACE_DIR(L)-ALBEDO_SURFACE_DIFF(L)) SLHGDR3A.114 & *FLUX_DIRECT_GROUND(L) SLHGDR3A.115 ENDDO SLHGDR3A.116 ! SLHGDR3A.117 ! ELIMINATING LOOP: SLHGDR3A.118 DO I=N_LAYER, 1, -1 SLHGDR3A.119 DO L=1, N_PROFILE SLHGDR3A.120 BETA(L, I)=1.0E+00/(1.0E+00-ALPHA(L, I+1)*REFLECT(L, I)) SLHGDR3A.121 GAMMA(L, I)=ALPHA(L, I+1)*TRANS(L, I) SLHGDR3A.122 H(L, I)=S_UP_PRIME(L, I+1)+ALPHA(L, I+1)*S_DOWN(L, I) SLHGDR3A.123 ALPHA(L, I)=REFLECT(L, I) SLHGDR3A.124 & +BETA(L, I)*GAMMA(L, I)*TRANS(L, I) SLHGDR3A.125 S_UP_PRIME(L, I)=S_UP(L, I)+BETA(L, I)*TRANS(L, I)*H(L, I) SLHGDR3A.126 ENDDO SLHGDR3A.127 ENDDO SLHGDR3A.128 ! SLHGDR3A.129 ! INITIALIZE FOR BACKWARD SUBSTITUTION. SLHGDR3A.130 DO L=1, N_PROFILE SLHGDR3A.131 FLUX_TOTAL(L, 2)=FLUX_INC_DOWN(L) SLHGDR3A.132 FLUX_TOTAL(L, 1)=ALPHA(L, 1)*FLUX_TOTAL(L, 2)+S_UP_PRIME(L, 1) SLHGDR3A.133 ENDDO SLHGDR3A.134 ! SLHGDR3A.135 ! BACKWARD SUBSTITUTION: SLHGDR3A.136 DO I=1, N_LAYER SLHGDR3A.137 DO L=1, N_PROFILE SLHGDR3A.138 ! UPWARD FLUX SLHGDR3A.139 FLUX_TOTAL(L, 2*I+1) SLHGDR3A.140 & =BETA(L, I)*(H(L, I)+GAMMA(L, I)*FLUX_TOTAL(L, 2*I)) SLHGDR3A.141 ! DOWNWARD FLUX SLHGDR3A.142 FLUX_TOTAL(L, 2*I+2)=S_DOWN(L, I) SLHGDR3A.143 & +TRANS(L, I)*FLUX_TOTAL(L, 2*I) SLHGDR3A.144 & +REFLECT(L, I)*FLUX_TOTAL(L, 2*I+1) SLHGDR3A.145 ENDDO SLHGDR3A.146 ENDDO SLHGDR3A.147 ! SLHGDR3A.148 ! SLHGDR3A.149 ! SLHGDR3A.150 RETURN SLHGDR3A.151 END SLHGDR3A.152 *ENDIF DEF,A01_3A,OR,DEF,A02_3A SLHGDR3A.153 *ENDIF DEF,A70_1A,OR,DEF,A70_1B APB4F405.90