*IF DEF,A70_1A,OR,DEF,A70_1B APB4F405.27 C ******************************COPYRIGHT****************************** GASCAL1A.3 C (c) CROWN COPYRIGHT 1996, METEOROLOGICAL OFFICE, All Rights Reserved. GASCAL1A.4 C GASCAL1A.5 C Use, duplication or disclosure of this code is subject to the GASCAL1A.6 C restrictions as set forth in the contract. GASCAL1A.7 C GASCAL1A.8 C Meteorological Office GASCAL1A.9 C London Road GASCAL1A.10 C BRACKNELL GASCAL1A.11 C Berkshire UK GASCAL1A.12 C RG12 2SZ GASCAL1A.13 C GASCAL1A.14 C If no contract has been raised with this copy of the code, the use, GASCAL1A.15 C duplication or disclosure of it is strictly prohibited. Permission GASCAL1A.16 C to do so must first be obtained in writing from the Head of Numerical GASCAL1A.17 C Modelling at the above address. GASCAL1A.18 C ******************************COPYRIGHT****************************** GASCAL1A.19 CLL Subroutine GAS_CALC ---------------------------------------------- GASCAL1A.20 CLL GASCAL1A.21 CLL Purpose : GASCAL1A.22 CLL Calculates the trace gas mixing ratio (or weighting factor for GASCAL1A.23 CLL aerosol forcing fields. Rates of increase (yearly compound factors) AWI1F403.358 CLL can be supplied, or spot values (which will be linearly GASCAL1A.25 CLL interpolated) or a mixture of these. It is designed so it can be GASCAL1A.26 CLL called each time step, but when rates of increase are being used, GASCAL1A.27 CLL values are in fact only updated at New Year. GASCAL1A.28 CLL The rules are: GASCAL1A.29 CLL If rates exist (i.e. are positive) for the first & current years AWI1F403.359 CLL then all concentrations are ignored, except for the initial value. GASCAL1A.31 CLL If there is a positive rate for the current year but not for the AWI1F403.360 CLL start, the current rate & most recent concentration are used. GASCAL1A.33 CLL If rates do not exist for the current year then the concentration GASCAL1A.34 CLL is calculated by linear interpolation between the concentrations at GASCAL1A.35 CLL the given years. GASCAL1A.36 CLL The mixing ratios calculated after the last given year use the GASCAL1A.37 CLL rate for the final given year. GASCAL1A.38 CLL The 360-day year is assumed. GASCAL1A.39 CLL CARE should be taken if solitary rates are specified, as this can GASCAL1A.40 CLL result in discontinuities in the concentration time profile at GASCAL1A.41 CLL the next given year without a corresponding given rate. GASCAL1A.42 CLL GASCAL1A.43 CLL Authors : Andrew Brady, Tim Johns, William Ingram GASCAL1A.44 CLL GASCAL1A.45 CLL Version for : Cray YMP GASCAL1A.46 CLL GASCAL1A.47 CLL Model GASCAL1A.48 CLL version Date GASCAL1A.49 CLL 4.2 19/11/96 Author: William Ingram, reviewer Cath Senior. GASCAL1A.50 CLL 4.4 22/9/97 Correct code for the case when one changes AWI1F404.1 CLL from linear interpolation to a rate & then changes the rate. WJI AWI1F404.2 CLL GASCAL1A.51 CLL GASCAL1A.52 CLLEND ----------------------------------------------------------------- GASCAL1A.53 C*L Arguments GASCAL1A.54 GASCAL1A.55SUBROUTINE GAS_CALC(GAS_NOW 10,4GASCAL1A.56 & ,GAS_INDEX_MAX GASCAL1A.57 & ,GAS_YEAR GASCAL1A.58 & ,GAS_CONC GASCAL1A.59 & ,GAS_RATE GASCAL1A.60 & ,MAX_SCENARIO_PTS AWI1F403.354 & ,ICODE GASCAL1A.61 & ,CMESSAGE) GASCAL1A.62 GASCAL1A.63 IMPLICIT NONE GASCAL1A.64 GASCAL1A.65 *CALL CMAXSIZE
! Maximum size of common block arrays GASCAL1A.66 *CALL CSUBMODL
! Submodel parameters for array sizes GASCAL1A.67 GASCAL1A.68 REAL GAS_NOW !OUT Gas concentration at time step GASCAL1A.69 INTEGER GAS_INDEX_MAX!IN GASCAL1A.70 & , MAX_SCENARIO_PTS ! IN AWI1F403.355 INTEGER GAS_YEAR(MAX_SCENARIO_PTS) !IN GASCAL1A.71 REAL GAS_CONC(MAX_SCENARIO_PTS) !IN GASCAL1A.72 REAL GAS_RATE(MAX_SCENARIO_PTS) !IN GASCAL1A.73 INTEGER ICODE !OUT Return code: successful=0 GASCAL1A.74 CHARACTER*(*) CMESSAGE !OUT Error message if ICODE >0 GASCAL1A.75 C* GASCAL1A.76 GASCAL1A.77 ! Common blocks GASCAL1A.78 GASCAL1A.79 *CALL CTIME
! Model time GASCAL1A.80 GASCAL1A.81 ! Local variables GASCAL1A.82 GASCAL1A.83 INTEGER INDEX ! to subscript gas concs for NOW_TIME GASCAL1A.84 INTEGER I ! Loop over indices GASCAL1A.85 INTEGER YEAR_IN_SECS! Year length in seconds GASCAL1A.86 INTEGER NOW_TIME_DAY, NOW_TIME_SEC GASCAL1A.87 ! ! Time now in days/secs from time zero GASCAL1A.88 INTEGER GAS_YR_DAY1, GAS_YR_SEC1 GASCAL1A.89 ! ! Time in days/secs of current GAS_YEAR GASCAL1A.90 INTEGER TIME1 GASCAL1A.91 ! ! The same converted to seconds GASCAL1A.92 INTEGER GAS_YR_DAY2, GAS_YR_SEC2 GASCAL1A.93 ! ! Time in days/secs of next GAS_YEAR GASCAL1A.94 GASCAL1A.95 ! Check that GASCNST namelist is defined for this year GASCAL1A.96 IF ( I_YEAR .LT. GAS_YEAR(1) ) THEN GASCAL1A.97 ICODE = 8325 GASCAL1A.98 CMESSAGE = 'GAS_CALC: no gas data for this year' GASCAL1A.99 RETURN GASCAL1A.100 ENDIF GASCAL1A.101 GASCAL1A.102 ! Loop over I to find correct index for current NOW_TIME GASCAL1A.103 INDEX = 0 GASCAL1A.104 DO I=1, GAS_INDEX_MAX GASCAL1A.105 IF ( I_YEAR .GE. GAS_YEAR(I) ) INDEX = INDEX+1 GASCAL1A.106 ENDDO GASCAL1A.107 GASCAL1A.108 ! Calculate time now in seconds GASCAL1A.109 CALL TIME2SEC
(I_YEAR, I_MONTH, I_DAY, I_HOUR, I_MINUTE, I_SECOND, GASCAL1A.110 & 0, 0, NOW_TIME_DAY, NOW_TIME_SEC, .TRUE.) GASCAL1A.111 GASCAL1A.112 ! If gas rate at current year is non zero calculate new GAS_NOW GASCAL1A.113 ! by considering compound increases of GAS_RATE(1:INDEX) GASCAL1A.114 IF ( GAS_RATE(INDEX) .GT. 0. ) THEN AWI1F403.356 YEAR_IN_SECS = 360 * 86400 GASCAL1A.116 CALL TIME2SEC
(GAS_YEAR(INDEX), 1, 1, 0, 0, 0, GASCAL1A.117 & 0, 0, GAS_YR_DAY1, GAS_YR_SEC1, .TRUE.) AWI1F404.3 GAS_NOW = GAS_CONC(1) AWI1F404.4 DO I=1, INDEX-1 AWI1F404.5 IF ( GAS_RATE(I) .LT. 0. ) THEN AWI1F404.6 GAS_NOW = GAS_CONC(I+1) AWI1F404.7 ELSE AWI1F404.8 GAS_NOW = GAS_NOW * AWI1F404.9 & ( GAS_RATE(I) ** REAL(GAS_YEAR(I+1)-GAS_YEAR(I)) ) AWI1F404.10 ENDIF AWI1F404.11 ENDDO AWI1F404.12 ! GAS_NOW now holds the concentration in year INDEX - need only GASCAL1A.130 ! update it to the current year. GASCAL1A.131 GAS_NOW=GAS_NOW*(GAS_RATE(INDEX)** GASCAL1A.132 & REAL(((NOW_TIME_DAY-GAS_YR_DAY1)*86400+ GASCAL1A.134 & NOW_TIME_SEC-GAS_YR_SEC1)/YEAR_IN_SECS)) GASCAL1A.135 GASCAL1A.136 ! Otherwise calculate by linear interpolation between respective GASCAL1A.137 ! GAS concentrations of given years. GASCAL1A.138 ELSE GASCAL1A.139 CALL TIME2SEC
(GAS_YEAR(INDEX), 1, 1, 0, 0, 0, GASCAL1A.140 & 0, 0, GAS_YR_DAY1, GAS_YR_SEC1, .TRUE.) GASCAL1A.141 CALL TIME2SEC
(GAS_YEAR(INDEX+1), 1, 1, 0, 0, 0, GASCAL1A.142 & 0, 0, GAS_YR_DAY2, GAS_YR_SEC2, .TRUE.) GASCAL1A.143 TIME1 = GAS_YR_DAY1*86400 - GAS_YR_SEC1 GASCAL1A.144 GAS_NOW = GAS_CONC(INDEX) + GASCAL1A.145 & ( GAS_CONC(INDEX+1) - GAS_CONC(INDEX) ) GASCAL1A.146 & * REAL ( NOW_TIME_DAY*86400 + NOW_TIME_SEC - TIME1 ) GASCAL1A.147 & / REAL ( GAS_YR_DAY2*86400 + GAS_YR_SEC2 - TIME1 ) GASCAL1A.148 ENDIF GASCAL1A.149 GASCAL1A.150 RETURN GASCAL1A.151 END GASCAL1A.152 *ENDIF DEF,A70_1A,OR,DEF,A70_1B APB4F405.28