*IF DEF,A70_1A,OR,DEF,A70_1B APB4F405.101 *IF DEF,A01_3A,OR,DEF,A02_3A SOLCF3A.2 C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.13960 C GTS2F400.13961 C Use, duplication or disclosure of this code is subject to the GTS2F400.13962 C restrictions as set forth in the contract. GTS2F400.13963 C GTS2F400.13964 C Meteorological Office GTS2F400.13965 C London Road GTS2F400.13966 C BRACKNELL GTS2F400.13967 C Berkshire UK GTS2F400.13968 C RG12 2SZ GTS2F400.13969 C GTS2F400.13970 C If no contract has been raised with this copy of the code, the use, GTS2F400.13971 C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.13972 C to do so must first be obtained in writing from the Head of Numerical GTS2F400.13973 C Modelling at the above address. GTS2F400.13974 C ******************************COPYRIGHT****************************** GTS2F400.13975 C GTS2F400.13976 !+ Subroutine to calculate the basic coefficients for the solar beam. SOLCF3A.3 ! SOLCF3A.4 ! Method: SOLCF3A.5 ! Straightforward. SOLCF3A.6 ! SOLCF3A.7 ! Current Owner of Code: J. M. Edwards SOLCF3A.8 ! SOLCF3A.9 ! History: SOLCF3A.10 ! Version Date Comment SOLCF3A.11 ! 4.0 27-07-95 Original Code SOLCF3A.12 ! (J. M. Edwards) SOLCF3A.13 ! 4.2 Nov. 96 T3E migration: CALL WHENFLT replaced GSS2F402.77 ! by portable fortran code. GSS2F402.78 ! S.J.Swarbrick GSS2F402.79 ! 4.2 08-08-96 Extra two-stream option ADB1F402.684 ! added. ADB1F402.685 ! (J. M. Edwards) ADB1F402.686 !LL 4.5 27/04/98 Add Fujitsu vectorization directive. GRB0F405.152 !LL RBarnes@ecmwf.int GRB0F405.153 ! SOLCF3A.14 ! Description of Code: SOLCF3A.15 ! FORTRAN 77 with extensions listed in documentation. SOLCF3A.16 ! SOLCF3A.17 !- --------------------------------------------------------------------- SOLCF3A.18 ! Fujitsu directive to encourage vectorization for whole routine GRB0F405.154 !OCL NOVREC GRB0F405.155SUBROUTINE SOLAR_COEFFICIENT_BASIC(IERR 2SOLCF3A.19 & , N_PROFILE, I_LAYER_FIRST, I_LAYER_LAST SOLCF3A.20 & , OMEGA, ASYMMETRY, SEC_0 SOLCF3A.21 & , I_2STREAM SOLCF3A.22 & , SUM, DIFF, LAMBDA SOLCF3A.23 & , GAMMA_UP, GAMMA_DOWN SOLCF3A.24 & , NPD_PROFILE, NPD_LAYER SOLCF3A.25 & ) SOLCF3A.26 ! SOLCF3A.27 ! SOLCF3A.28 ! SOLCF3A.29 IMPLICIT NONE SOLCF3A.30 ! SOLCF3A.31 ! SOLCF3A.32 ! SIZES OF DUMMY ARRAYS. SOLCF3A.33 INTEGER SOLCF3A.34 & NPD_PROFILE SOLCF3A.35 ! MAXIMUM NUMBER OF PROFILES SOLCF3A.36 & , NPD_LAYER SOLCF3A.37 ! MAXIMUM NUMBER OF LAYERS SOLCF3A.38 ! SOLCF3A.39 ! INCLUDE COMDECKS. SOLCF3A.40 *CALL PRMCH3A
SOLCF3A.41 *CALL PRECSN3A
SOLCF3A.42 *CALL TWOSTR3A
SOLCF3A.43 *CALL STDIO3A
SOLCF3A.44 *CALL ERROR3A
SOLCF3A.45 ! SOLCF3A.46 ! SOLCF3A.47 ! DUMMY VARIABLES. SOLCF3A.48 INTEGER !, INTENT(OUT) SOLCF3A.49 & IERR SOLCF3A.50 ! ERROR FLAG SOLCF3A.51 INTEGER !, INTENT(IN) SOLCF3A.52 & N_PROFILE SOLCF3A.53 ! NUMBER OF PROFILES SOLCF3A.54 & , I_LAYER_FIRST SOLCF3A.55 ! FIRST LAYER TO CONSIDER SOLCF3A.56 & , I_LAYER_LAST SOLCF3A.57 ! FIRST LAYER TO CONSIDER SOLCF3A.58 & , I_2STREAM SOLCF3A.59 ! TWO-STREAM SCHEME SOLCF3A.60 ! SOLCF3A.61 REAL !, INTENT(IN) SOLCF3A.62 & OMEGA(NPD_PROFILE, NPD_LAYER) SOLCF3A.63 ! ALBEDO OF SINGLE SCATTERING SOLCF3A.64 & , ASYMMETRY(NPD_PROFILE, NPD_LAYER) SOLCF3A.65 ! ASYMMETRY SOLCF3A.66 & , SEC_0(NPD_PROFILE) SOLCF3A.67 ! SECANT OF SOLAR ZENITH ANGLE SOLCF3A.68 & , SUM(NPD_PROFILE, NPD_LAYER) SOLCF3A.69 ! SUM OF TWO-STREAM COEFFICIENTS SOLCF3A.70 & , DIFF(NPD_PROFILE, NPD_LAYER) SOLCF3A.71 ! DIFFERENCE OF TWO-STREAM COEFFICIENTS SOLCF3A.72 & , LAMBDA(NPD_PROFILE, NPD_LAYER) SOLCF3A.73 ! LAMBDA SOLCF3A.74 ! SOLCF3A.75 ! BASIC TWO-STREAM COEFFICIENTS: SOLCF3A.76 REAL !, INTENT(OUT) SOLCF3A.77 & GAMMA_UP(NPD_PROFILE, NPD_LAYER) SOLCF3A.78 ! COEFFICIENT FOR UPWARD RADIATION SOLCF3A.79 & , GAMMA_DOWN(NPD_PROFILE, NPD_LAYER) SOLCF3A.80 ! COEFFICIENT FOR DOWNWAD RADIATION SOLCF3A.81 ! SOLCF3A.82 ! SOLCF3A.83 ! LOCAL VARIABLES. SOLCF3A.84 INTEGER SOLCF3A.85 & I SOLCF3A.86 ! LOOP VARIABLE SOLCF3A.87 & , L SOLCF3A.88 ! LOOP VARIABLE SOLCF3A.89 & , K SOLCF3A.90 ! LOOP VARIABLE SOLCF3A.91 & , KK SOLCF3A.92 ! TEMPORARY VARIABLE SOLCF3A.93 & , N_INDEX SOLCF3A.94 ! NUMBER OF INDICES SATISFYING TEST SOLCF3A.95 & , INDEX(NPD_PROFILE) SOLCF3A.96 ! INDICES OF TESTED POINTS SOLCF3A.97 REAL SOLCF3A.98 & KSI_0(NPD_PROFILE, NPD_LAYER) SOLCF3A.99 ! DIFFERENCE IN SOLAR SCATTERING FRACTIONS SOLCF3A.100 & , TEST_ARRAY(NPD_PROFILE) SOLCF3A.101 ! ARRAY TO TEST SOLCF3A.102 & , FACTOR SOLCF3A.103 ! TEMPORARY VARIABLE SOLCF3A.104 REAL SOLCF3A.105 & ROOT_3 SOLCF3A.106 ! SQUARE ROOT OF 3 SOLCF3A.107 PARAMETER( SOLCF3A.108 & ROOT_3=1.7320508075688772E+00 SOLCF3A.109 & ) SOLCF3A.110 ! SOLCF3A.111 ! SUBROUTINES CALLED: SOLCF3A.112 ! SOLCF3A.115 ! CRAY DIRECTIVES FOR THE WHOLE ROUTINE: ADB1F402.687 ! POINTS ARE NOT REPEATED IN THE INDEXING ARRAY, SO IT IS SAFE ADB1F402.688 ! TO VECTORIZE OVER INDIRECTLY ADDRESSED ARRAYS. ADB1F402.689 Cfpp$ NODEPCHK R ADB1F402.690 ! SOLCF3A.116 ! SOLCF3A.117 ! SOLCF3A.118 ! IF LAMBDA IS TOO CLOSE TO SEC_0 IT MUST BE PERTURBED SOLCF3A.119 DO I=I_LAYER_FIRST, I_LAYER_LAST SOLCF3A.120 DO L=1, N_PROFILE SOLCF3A.121 TEST_ARRAY(L)=ABS(LAMBDA(L, I)-SEC_0(L)) SOLCF3A.122 ENDDO SOLCF3A.123 ! GSS2F402.82 N_INDEX=0 GSS2F402.83 DO L =1,N_PROFILE GSS2F402.84 IF (TEST_ARRAY(L).LT.TOL_DIV) THEN GSS2F402.85 N_INDEX =N_INDEX+1 GSS2F402.86 INDEX(N_INDEX)=L GSS2F402.87 END IF GSS2F402.88 END DO GSS2F402.89 ! GSS2F402.90 CDIR$ IVDEP SOLCF3A.126 DO K=1, N_INDEX SOLCF3A.127 KK=INDEX(K) SOLCF3A.128 SUM(KK, I)=(1.0E+00+TOL_DIV)*SUM(KK, I) SOLCF3A.129 DIFF(KK, I)=(1.0E+00+TOL_DIV)*DIFF(KK, I) SOLCF3A.130 LAMBDA(KK, I)=(1.0E+00+TOL_DIV)*LAMBDA(KK, I) SOLCF3A.131 ENDDO SOLCF3A.132 ENDDO SOLCF3A.133 ! SOLCF3A.134 IF ( (I_2STREAM.EQ.IP_EDDINGTON).OR. SOLCF3A.135 & (I_2STREAM.EQ.IP_ELSASSER).OR. SOLCF3A.136 & (I_2STREAM.EQ.IP_PIFM85).OR. ADB1F401.936 & (I_2STREAM.EQ.IP_2S_TEST).OR. SOLCF3A.138 & (I_2STREAM.EQ.IP_HEMI_MEAN).OR. ADB1F402.691 & (I_2STREAM.EQ.IP_PIFM80) ) THEN ADB1F402.692 ! SOLCF3A.140 DO I=I_LAYER_FIRST, I_LAYER_LAST SOLCF3A.141 DO L=1, N_PROFILE SOLCF3A.142 KSI_0(L, I)=1.5E+00*ASYMMETRY(L, I)/SEC_0(L) SOLCF3A.143 ENDDO SOLCF3A.144 ENDDO SOLCF3A.145 ! SOLCF3A.146 ELSE IF (I_2STREAM.EQ.IP_DISCRETE_ORD) THEN SOLCF3A.147 ! SOLCF3A.148 DO I=I_LAYER_FIRST, I_LAYER_LAST SOLCF3A.149 DO L=1, N_PROFILE SOLCF3A.150 KSI_0(L, I)=ROOT_3*ASYMMETRY(L, I)/SEC_0(L) SOLCF3A.151 ENDDO SOLCF3A.152 ENDDO SOLCF3A.153 ! SOLCF3A.154 ELSE SOLCF3A.155 ! SOLCF3A.156 WRITE(IU_ERR, '(/A)') SOLCF3A.157 & '*** ERROR: AN ILLEGAL SOLAR TWO-STREAM SCHEME HAS ' SOLCF3A.158 & //'BEEN SELECTED.' SOLCF3A.159 IERR=I_ERR_FATAL SOLCF3A.160 RETURN SOLCF3A.161 ! SOLCF3A.162 ENDIF SOLCF3A.163 ! SOLCF3A.164 ! SOLCF3A.165 ! DETERMINE THE BASIC SOLAR COEFFICIENTS FOR THE SOLCF3A.166 ! TWO-STREAM EQUATIONS. SOLCF3A.167 ! SOLCF3A.168 DO I=I_LAYER_FIRST, I_LAYER_LAST SOLCF3A.169 DO L=1, N_PROFILE SOLCF3A.170 FACTOR=0.5E+00*OMEGA(L, I)*SEC_0(L) SOLCF3A.171 & /((LAMBDA(L, I)-SEC_0(L))*(LAMBDA(L, I)+SEC_0(L))) SOLCF3A.172 GAMMA_UP(L, I)=FACTOR*(SUM(L, I)-SEC_0(L) SOLCF3A.173 & -KSI_0(L, I)*(DIFF(L, I)-SEC_0(L))) SOLCF3A.174 GAMMA_DOWN(L, I)=FACTOR*(SUM(L, I)+SEC_0(L) SOLCF3A.175 & +KSI_0(L, I)*(DIFF(L, I)+SEC_0(L))) SOLCF3A.176 ENDDO SOLCF3A.177 ENDDO SOLCF3A.178 ! SOLCF3A.179 ! SOLCF3A.180 ! SOLCF3A.181 RETURN SOLCF3A.182 END SOLCF3A.183 *ENDIF DEF,A01_3A,OR,DEF,A02_3A SOLCF3A.184 *ENDIF DEF,A70_1A,OR,DEF,A70_1B APB4F405.102