#!/usr/bin/perl # # This program modifies the GEOS-Chem files to work with kpp. # # First create a .kpp file with the #GEOSCHEM command and use # KPP to create the model using the command: kpp ROOT.kpp gckpp # and place this model in the GEOS-Chem directory. # # Run this parser in the directory of GEOS-Chem v7-04-10 # using this command: perl gckpp_parser.pl # This will modify the GEOS-Chem to work with KPP. # #============================================ # Variable Declarations #============================================ my $FILE; my $TEMP; my $input; my $skipadjem; #============================================= # Set Up Parser to Modify a File #============================================= sub initModFile { #Open the Geos-chem files open(FILE, "<$_[0]") || die "Unable to open $_[0]"; open(TEMP, ">temp") || die "Unable to open temporary file"; $input = ; while(!eof(FILE)) { print TEMP "$input"; $input = ; } print TEMP "$input"; close(FILE); close(TEMP); open(FILE, ">$_[0]") || die "Unable to $_[0]"; open(TEMP,"; while( $input !~ m/PUBLIC :: DO_WETDEP/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " PUBLIC :: DO_WETDEP_ADJ\n"; $input = ; while( $input !~ m/PUBLIC :: INIT_WETSCAV/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " PUBLIC :: INIT_WETSCAV_ADJ\n"; $input = ; while( $input !~ m/END SUBROUTINE INIT_WETSCAV/ ) { print FILE "$input"; $input = ; } print FILE "$input" . "\n" . "!==============================================================================\n" . "! ADJOINT SUBROUTINES\n" . "!==============================================================================\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE INIT_WETSCAV_ADJ\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine INIT_WETSCAV initializes updraft velocity, cloud liquid water\n" . "! content, cloud ice content, and mixing ratio of water fields, which\n" . "! are used in the wet scavenging routines. (bmy, 2/23/00, 3/7/05)\n" . "!\n" . "! NOTES:\n" . "! (1 ) References \"e_ice.f\" -- routine to compute Eice(T).\n" . "! (2 ) Vud, CLDLIQ, CLDICE, C_H2O are all independent of tracer, so we\n" . "! can compute them once per timestep, before calling the cloud \n" . "! convection and wet deposition routines.\n" . "! (3 ) Set C_H2O = 0 below -120 Celsius. E_ICE(T) has a lower limit of\n" . "! -120 Celsius, so temperatures lower than this will cause a stop\n" . "! with an error message. (bmy, 6/15/00)\n" . "! (4 ) Replace {IJL}GLOB with IIPAR,JJPAR,LLPAR. Also rename PW to P.\n" . "! Remove IREF, JREF, these are obsolete. Now reference IS_WATER\n" . "! from \"dao_mod.f\" to determine water boxes. \n" . "! (5 ) Removed obsolete code from 9/01. Updated comments and made\n" . "! cosmetic changes. (bmy, 10/24/01)\n" . "! (6 ) Now use routine GET_PCENTER from \"pressure_mod.f\" to compute the\n" . "! pressure at the midpoint of grid box (I,J,L). Also removed P and\n" . "! SIG from the argument list (dsa, bdf, bmy, 8/20/02)\n" . "! (7 ) Now reference T from \"dao_mod.f\". Updated comments. Now allocate\n" . "! Vud, C_H2O, CLDLIQ and CLDICE here on the first call. Now references\n" . "! ALLOC_ERR from \"error_mod.f\". Now set H2O2s and SO2s to the initial\n" . "! values from for the first call to COMPUTE_F . Now call WETDEPID\n" . "! on the first call to initialize the wetdep index array. (bmy, 1/27/03)\n" . "! (8 ) Now references STT from \"tracer_mod.f\". Also now we call WETDEPID\n" . "! from \"input_mod.f\" (bmy, 7/20/04)\n" . "! (9 ) Now references new function E_ICE, which is an analytic function of \n" . "! Kelvin temperature instead of Celsius. (bmy, 3/7/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE DAO_MOD, ONLY : T, IS_WATER\n" . " USE ERROR_MOD, ONLY : ALLOC_ERR\n" . " USE PRESSURE_MOD, ONLY : GET_PCENTER\n" . " USE TRACER_MOD, ONLY : STT\n" . " USE TRACERID_MOD, ONLY : IDTH2O2, IDTSO2\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, L, AS\n" . " REAL*8 :: PL, TK\n" . " LOGICAL, SAVE :: FIRST = .TRUE. \n" . "\n" . " !=================================================================\n" . " ! Compute Vud, CLDLIQ, CLDICE, C_H2O, following Jacob et al, 2000.\n" . " !=================================================================\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L, TK, PL )\n" . "!\$OMP+SCHEDULE( DYNAMIC )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . "\n" . " ! Compute Temp [K] and Pressure [hPa]\n" . " TK = T(I,J,L)\n" . " PL = GET_PCENTER(I,J,L)\n" . "\n" . " !==============================================================\n" . " ! Compute Vud -- 5 m/s over oceans, 10 m/s over land (or ice?)\n" . " ! Assume Vud is the same at all altitudes; the array can be 2-D\n" . " !==============================================================\n" . " IF ( L == 1 ) THEN\n" . " IF ( IS_WATER( I, J ) ) THEN\n" . " Vud(I,J) = 5d0\n" . " ELSE\n" . " Vud(I,J) = 10d0\n" . " ENDIF\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! CLDLIQ, the cloud liquid water content [cm3 H2O/cm3 air], \n" . " ! is a function of the local Kelvin temperature:\n" . " ! \n" . " ! CLDLIQ = 2e-6 [ T >= 268 K ]\n" . " ! CLDLIQ = 2e-6 * ((T - 248) / 20) [ 248 K < T < 268 K ]\n" . " ! CLDLIQ = 0 [ T <= 248 K ]\n" . " !==============================================================\n" . " IF ( TK >= 268d0 ) THEN\n" . " CLDLIQ(I,J,L) = 2d-6\n" . "\n" . " ELSE IF ( TK > 248d0 .and. TK < 268d0 ) THEN\n" . " CLDLIQ(I,J,L) = 2d-6 * ( ( TK - 248d0 ) / 20d0 )\n" . "\n" . " ELSE\n" . " CLDLIQ(I,J,L) = 0d0\n" . " \n" . " ENDIF\n" . " \n" . " !=============================================================\n" . " ! CLDICE, the cloud ice content [cm3 ice/cm3 air] is given by:\n" . " !\n" . " ! CLDICE = 2e-6 - CLDLIQ\n" . " !=============================================================\n" . " CLDICE(I,J,L) = 2d-6 - CLDLIQ(I,J,L)\n" . "\n" . " !=============================================================\n" . " ! C_H2O is given by Dalton's Law as:\n" . " !\n" . " ! C_H2O = Eice( Tk(I,J,L) ) / P(I,J,L)\n" . " !\n" . " ! where P(L) = pressure in grid box (I,J,L)\n" . " !\n" . " ! and Tk(I,J,L) is the Kelvin temp. of grid box (I,J,L).\n" . " !\n" . " ! and Eice( Tk(I,J,L) ) is the saturation vapor pressure \n" . " ! of ice [hPa] at temperature Tk(I,J,L) -- computed in \n" . " ! routine E_ICE above.\n" . " !==============================================================\n" . " C_H2O(I,J,L) = E_ICE( TK ) / PL\n" . "\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE INIT_WETSCAV_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE DO_WETDEP_ADJ\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine DO_WETDEP is a driver for the wet deposition code, called\n" . "! from the MAIN program. (bmy, 3/27/03, 7/20/04)\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now references LPRT from \"logical_mod.f\" (bmy, 7/20/04)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " !=================================================================\n" . " ! DO_WETDEP begins here!\n" . " !=================================================================\n" . "\n" . " ! Wetdep by convective precip\n" . " CALL MAKE_QQ( .FALSE. )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### DO_WETDEP: before conv wetdep' )\n" . " CALL WETDEP_ADJ( .FALSE. )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### DO_WETDEP: after conv wetdep' )\n" . "\n" . " ! Wetdep by large-scale (stratiform) precip\n" . " CALL MAKE_QQ( .TRUE. )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### DO_WETDEP: before LS wetdep' )\n" . " CALL WETDEP_ADJ( .TRUE. )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### DO_WETDEP: after LS wetdep' )\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE DO_WETDEP_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "!*****************************************************************************!\n" . "!*********************** TO EDIT *******************************!\n" . "!*****************************************************************************!\n" . "\n" . "\n" . " SUBROUTINE WETDEP_ADJ( LS )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine WETDEP computes the downward mass flux of tracer due to washout \n" . "! and rainout of aerosols and soluble tracers in a column. The timestep is \n" . "! the dynamic timestep. (hyl, bey, bmy, djj, 4/2/99, 5/24/06)\n" . "!\n" . "! The precip fields through the bottom of each level are indexed as follows:\n" . "!\n" . "! Layer GISS-CTM II GEOS-CTM\n" . "!\n" . "! ------------------------------------------------- Top of Atm.\n" . "! LM PSSW4(I,J,LM-1) PDOWN(LM,I,J)\n" . "! | |\n" . "! ====================V==================V========= Max Extent \n" . "! LM-1 PSSW4(I,J,LM) PDOWN(LM-1,I,J) of Clouds\n" . "! | |\n" . "! --------------------V------------------V---------\n" . "! ... ... \n" . "!\n" . "! -------------------------------------------------\n" . "! 4 PSSW4(I,J,3) PDOWN(4,I,J)\n" . "! | |\n" . "! --------------------V------------------V----------\n" . "! 3 PSSW4(I,J,2) PDOWN(3,I,J)\n" . "! | |\n" . "! --------------------V------------------V--------- Cloud base\n" . "! 2 PSSW4(I,J,1) PDOWN(2,I,J) \n" . "! | |\n" . "! - - - - - - - V - - - - - V - - - \n" . "! 1 PDOWN(1,I,J) \n" . "! |\n" . "! =======================================V========= Ground\n" . "!\n" . "! From the diagram, we have the following for layer L:\n" . "! \n" . "! GISS-CTM:\n" . "! (a) Precip coming in thru top of layer L = PSSW4(I,J,L )\n" . "! (b) Precip going out thru bottom of layer L = PSSW4(I,J,L-1)\n" . "!\n" . "! GEOS-CHEM\n" . "! (a) Precip coming in thru top of layer L = PDOWN(L+1,I,J)\n" . "! (b) Precip going out thru bottom of layer L = PDOWN(L, I,J) \n" . "!\n" . "! Thus: Precip coming in: PSSW4(I,J,L ) is analogous to PDOWN(L+1,I,J).\n" . "! Precip going out: PSSW4(I,J,L-1) is analogous to PDOWN(L,I,J ).\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) LS : =T for Large-Scale precipitation; =F otherwise \n" . "!\n" . "! References (see above for full citations):\n" . "! ============================================================================\n" . "! (1 ) Jacob et al, 2000\n" . "! (2 ) Balkanski et al, 1993\n" . "! (3 ) Giorgi & Chaimedes, 1986\n" . "!\n" . "! NOTES: \n" . "! (1 ) WETDEP should be called twice, once with LS = .TRUE. and once\n" . "! with LS = .FALSE. This will handle both large-scale and\n" . "! convective precipitation. (bmy, 2/28/00)\n" . "! (2 ) Call subroutine MAKE_QQ to construct the QQ and PDOWN precipitation\n" . "! fields before calling WETDEP. (bmy, 2/28/00)\n" . "! (3 ) Since we are working with an (I,J) column, the ordering of the\n" . "! loops goes J - I - L - N. Dimension arrays DSTT, PDOWN, QQ\n" . "! to take advantage of this optimal configuration (bmy, 2/28/00)\n" . "! (4 ) Use double-precision exponents to force REAL*8 accuracy\n" . "! (e.g. 1d0, bmy, 2/28/00)\n" . "! (5 ) Diagnostics ND16, ND17, ND18, and ND39 use allocatable arrays \n" . "! from \"diag_mod.f\" (bmy, bey, 3/14/00)\n" . "! (6 ) WETDEP only processes soluble tracers and/or aerosols, as are\n" . "! defined in the NSOL and IDWETD arrays (bmy, 3/14/00)\n" . "! (7 ) Add kludge to prevent wet deposition in the stratosphere (bmy, 6/21/00)\n" . "! (8 ) Removed obsolete code from 10/27/00 (bmy, 12/21/00)\n" . "! (9 ) Remove IREF, JREF -- they are obsolete (bmy, 9/27/01)\n" . "! (10) Removed obsolete commented out code from 9/01 (bmy, 10/24/01)\n" . "! (11) Replaced all instances of IM with IIPAR and JM with JJPAR, in order\n" . "! to prevent namespace confusion for the new TPCORE (bmy, 6/25/02)\n" . "! (12) Now reference BXHEIGHT from \"dao_mod.f\". Also references routine\n" . "! GEOS_CHEM_STOP from \"error_mod.f\". Also fix ND39 diagnostic so that\n" . "! the budget of tracer lost to wetdep is closed. Now bundled into\n" . "! \"wetscav_mod.f\". Now only save to AD16, AD17, AD18, AD39 if L<=LD16,\n" . "! L<=LD17, L<=LD18, and L<=LD39 respectively; this avoids out-of-bounds\n" . "! array errors. Updated comments, cosmetic changes. (qli, bmy, 11/26/02)\n" . "! (13) References IDTSO2, IDTSO4 from \"tracerid_mod.f\". SO2 in sulfate \n" . "! chemistry is wet-scavenged on the raindrop and converted to SO4 by \n" . "! aqueous chem. If evaporation occurs then SO2 comes back as SO4.\n" . "! (rjp, bmy, 3/23/03) \n" . "! (14) Now use function GET_TS_DYN() from \"time_mod.f\" (bmy, 3/27/03)\n" . "! (15) Now parallelize over outermost J-loop. Also move internal routines\n" . "! LS_K_RAIN, LS_F_PRIME, CONV_F_PRIME, and SAFETY to the module, since\n" . "! we cannot call internal routines from w/in a parallel loop. \n" . "! (bmy, 3/18/04)\n" . "! (16) Now references STT & N_TRACERS from \"tracer_mod.f\". Also now make\n" . "! DSTT a 4-d internal array so as to facilitate -C checking on the\n" . "! SGI platform. (bmy, 7/20/04)\n" . "! (17) Now references IDTHg2 from \"tracerid_mod.f\". Now pass the amt of\n" . "! Hg2 wet scavenged out of the column to \"ocean_mercury_mod.f\" via\n" . "! routine ADD_Hg2_WD. (sas, bmy, 1/19/05)\n" . "! (18) Bug fix: replace line that can cause numerical blowup with a safer\n" . "! analytical expression. (bmy, 2/23/05)\n" . "! (19) Block out parallel loop with #ifdef statements for SGI_MIPS compiler.\n" . "! For some reason this causes an error. (bmy, 5/5/05)\n" . "! (20) Now use function IS_Hg2 to determine if a tracer is a tagged Hg2 \n" . "! tracer. Now also pass N to ADD_Hg2_WD. Now references LDYNOCEAN\n" . "! from \"logical_mod.f\". Now do not call ADD_Hg2_WD if we are not\n" . "! using the dynamic ocean model. (eck, sas, cdh, bmy, 2/27/06)\n" . "! (21) Eliminate unnecessary variables XDSTT, L_PLUS_W. Also zero all \n" . "! unused variables for each grid box. (bmy, 5/24/06)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE DAO_MOD, ONLY : BXHEIGHT\n" . " USE ERROR_MOD, ONLY : GEOS_CHEM_STOP, IT_IS_NAN\n" . " USE TIME_MOD!, ONLY : GET_TS_DYN\n" . " USE TRACER_MOD, ONLY : STT_ADJ\n" . " USE TRACERID_MOD, ONLY : IDTSO2, IDTSO4, IS_Hg2\n" . " \n" . " IMPLICIT NONE\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"CMN_DIAG\" ! Diagnostic arrays and switches \n" . "\n" . " ! Arguments\n" . " LOGICAL, INTENT(IN) :: LS\n" . "\n" . " ! Local Variables\n" . " LOGICAL, SAVE :: FIRST = .TRUE.\n" . " LOGICAL :: IS_Hg\n" . " LOGICAL :: AER\n" . "\n" . " INTEGER :: I, IDX, J, L, N, NN\n" . " \n" . " REAL*8 :: Q, QDOWN, DT, DT_OVER_TAU\n" . " REAL*8 :: K, K_MIN, K_RAIN, RAINFRAC\n" . " REAL*8 :: F, FTOP, F_PRIME, WASHFRAC\n" . " REAL*8 :: LOST, GAINED, MASS_WASH, MASS_NOWASH\n" . " REAL*8 :: ALPHA, ALPHA2, WETLOSS, TMP\n" . "\n" . " REAl*8 :: F_TMP(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: K_TMP(IIPAR,JJPAR,LLPAR)\n" . "\n" . " ! DSTT is the accumulator array of rained-out \n" . " ! soluble tracer for a given (I,J) column\n" . " REAL*8 :: DSTT_ADJ(NSOLMAX,LLPAR,IIPAR,JJPAR)\n" . " \n" . " !=================================================================\n" . " ! WETDEP begins here!\n" . " !\n" . " ! (1) I n i t i a l i z e V a r i a b l e s\n" . " !=================================================================\n" . "\n" . " ! Dynamic timestep [s]\n" . " DT = GET_TS_DYN() * 60d0\n" . " ! Select index for diagnostic arrays -- will archive either\n" . " ! large-scale or convective rainout/washout fractions\n" . " IF ( LS ) THEN\n" . " IDX = 1\n" . " ELSE\n" . " IDX = 2\n" . " ENDIF\n" . "\n" . " !=================================================================\n" . " ! (2) L o o p O v e r (I, J) S u r f a c e B o x e s\n" . " !\n" . " ! Process rainout / washout by columns.\n" . " !=================================================================\n" . " MASS_WASH = 0.\n" . " WETLOSS = 0.\n" . "\n" . "#if !defined( SGI_MIPS )\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, FTOP )\n" . "!\$OMP+PRIVATE( F, F_PRIME, K_RAIN )\n" . "!\$OMP+PRIVATE( F_TMP, K_TMP, N )\n" . "!\$OMP+PRIVATE( L, Q, NN )\n" . "!\$OMP+PRIVATE( QDOWN, AER, RAINFRAC )\n" . "!\$OMP+PRIVATE( WASHFRAC )\n" . "!\$OMP+SCHEDULE( DYNAMIC )\n" . "#endif\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . "\n" . " ! Zero FTOP\n" . " FTOP = 0d0\n" . "\n" . " ! Zero accumulator array\n" . " DO L = 1, LLPAR\n" . " DO NN = 1, NSOLMAX\n" . " DSTT_ADJ(NN,L,I,J) = 0d0\n" . " ENDDO\n" . " ENDDO \n" . "\n" . " !==============================================================\n" . " ! (3) R a i n o u t F r o m T o p L a y e r (L = LLPAR) \n" . " !============================================================== \n" . "\n" . " ! Zero variables for this level\n" . " F_PRIME = 0d0\n" . " K_RAIN = 0d0\n" . " Q = 0d0\n" . "\n" . " ! Start at the top of the atmosphere\n" . " L = LLPAR\n" . "\n" . " ! If precip forms at (L), assume it all rains out\n" . " IF ( QQ(L,I,J) > 0d0 ) THEN\n" . "\n" . " ! Compute K_RAIN and F' for either large-scale or convective\n" . " ! precipitation (cf. Eqs. 11-13, Jacob et al, 2000) \n" . " IF ( LS ) THEN\n" . " K_RAIN = LS_K_RAIN( Q )\n" . " F_PRIME = LS_F_PRIME( Q, K_RAIN )\n" . " ELSE\n" . " K_RAIN = 1.5d-3\n" . " F_PRIME = CONV_F_PRIME( Q, K_RAIN, DT )\n" . " ENDIF\n" . " \n" . " ! Set F = F', since there is no FTOP at L = LLPAR\n" . " F = F_PRIME\n" . "\n" . " ! Save FTOP for the next lower level \n" . " FTOP = F\n" . " ENDIF\n" . "\n" . " F_TMP(I,J,L) = F\n" . " K_TMP(I,J,L) = K_RAIN\n" . " !==============================================================\n" . " ! (4) R a i n o u t i n t h e M i d d l e L e v e l s\n" . " !==============================================================\n" . " DO L = LLPAR-1, 2, -1\n" . "\n" . " ! Zero variables for each level\n" . " F_PRIME = 0d0\n" . " F = 0d0\n" . " K_RAIN = 0d0\n" . "\n" . " ! Rainout criteria\n" . " IF ( PDOWN(L,I,J) > 0d0 .and. QQ(L,I,J) > 0d0 ) THEN\n" . "\n" . " ! Q is the new precip that is forming within grid box (L)\n" . " Q = QQ(L,I,J)\n" . "\n" . " ! Compute K_RAIN and F' for either large-scale or convective\n" . " ! precipitation (cf. Eqs. 11-13, Jacob et al, 2000) \n" . " IF ( LS ) THEN\n" . " K_RAIN = LS_K_RAIN( Q )\n" . " F_PRIME = LS_F_PRIME( Q, K_RAIN )\n" . " ELSE\n" . " K_RAIN = 1.5d-3\n" . " F_PRIME = CONV_F_PRIME( Q, K_RAIN, DT )\n" . " ENDIF\n" . "\n" . " ! F is the effective area of precip seen by grid box (L) \n" . " F = MAX( F_PRIME, FTOP )\n" . "\n" . " ! Save FTOP for next level\n" . " FTOP = F \n" . " !==============================================================\n" . " ! (5) W a s h o u t i n t h e m i d d l e l e v e l s\n" . " !==============================================================\n" . "\n" . " ELSE IF ( PDOWN(L,I,J) > 0d0 .and. QQ(L,I,J) <= 0d0 ) THEN\n" . "\n" . " ! Since no precipitation is forming within grid box (L),\n" . " ! F' = 0, and F = MAX( F', FTOP ) reduces to F = FTOP.\n" . " F = FTOP \n" . "\n" . " ! Save FTOP for next level\n" . " FTOP = F\n" . "\n" . " !===========================================================\n" . " ! (6) N o D o w n w a r d P r e c i p i t a t i o n \n" . " !===========================================================\n" . " ELSE IF ( ABS( PDOWN(L,I,J) ) < 1d-30 ) THEN\n" . "\n" . " ! No precipitation at grid box (L), thus F = 0\n" . " F = 0d0\n" . " ! Save FTOP for next level\n" . " FTOP = F\n" . " ENDIF \n" . " F_TMP(I,J,L) = F\n" . " K_TMP(I,J,L) = K_RAIN\n" . " ENDDO \n" . "\n" . " !==============================================================\n" . " ! (7) W a s h o u t i n L e v e l 1\n" . " !==============================================================\n" . " ! We are at the surface, set L = 1\n" . " L = 1\n" . "\n" . " ! Washout at level 1 criteria\n" . " IF ( PDOWN(L+1,I,J) > 0d0 ) THEN\n" . " F = FTOP\n" . " ENDIF\n" . " F_TMP(I,J,L) = F \n" . " K_TMP(I,J,L) = K_RAIN \n" . "\n" . " !===========================================!\n" . " ! A D J O I N T C A L C U L A T I O N !\n" . " !===========================================!\n" . "\n" . " !==============================================================\n" . " ! (7) W a s h o u t i n L e v e l 1\n" . " !==============================================================\n" . "\n" . " ! Zero variables for this level\n" . " RAINFRAC = 0d0\n" . " WASHFRAC = 0d0\n" . " \n" . " ! We are at the surface, set L = 1\n" . " L = 1\n" . "\n" . " ! RESET F and K_RAIN Values\n" . " F = F_TMP(I,J,L)\n" . " K_RAIN = K_TMP(I,J,L)\n" . "\n" . " ! Washout at level 1 criteria\n" . " IF ( PDOWN(L+1,I,J) > 0d0 ) THEN\n" . "\n" . " ! QDOWN is the precip leaving thru the bottom of box (I,J,L+1)\n" . " QDOWN = PDOWN(L+1,I,J)\n" . "\n" . " ! Only compute washout if F > 0.\n" . " ! This helps to eliminate unnecessary CPU cycles.\n" . " IF ( F > 0d0 ) THEN\n" . "\n" . " ! Loop over soluble tracers and/or aerosol tracers\n" . " DO NN = 1, NSOL\n" . " N = IDWETD(NN)\n" . "\n" . " ! Call WASHOUT to compute the fraction of tracer \n" . " ! in grid box (I,J,L) that is lost to washout. \n" . " CALL WASHOUT( I, J, L, N, \n" . " & QDOWN, DT, F, WASHFRAC, AER )\n" . "\n" . " ! Subtract STT_ADJ from WETLOSS\n" . " WETLOSS = 0.\n" . " WETLOSS = WETLOSS - STT_ADJ(i,j,l,n)\n" . " STT_ADJ(i,j,l,n) = STT_ADJ(i,j,l,n) \n" . " & + WETLOSS*WASHFRAC*F\n" . " WETLOSS = 0.\n" . "\n" . " ENDDO\n" . " ENDIF \n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! (6) R a i n o u t i n t h e M i d d l e L e v e l s\n" . " !==============================================================\n" . " DO L = 2, LLPAR-1\n" . "\n" . " ! Zero variables for each level\n" . " Q = 0d0\n" . " QDOWN = 0d0\n" . " RAINFRAC = 0d0\n" . " WASHFRAC = 0d0\n" . "\n" . " ! RESET F and K_RAIN Values\n" . " F = F_TMP(I,J,L)\n" . " K_RAIN = K_TMP(I,J,L)\n" . "\n" . " ! Rainout criteria\n" . " IF ( PDOWN(L,I,J) > 0d0 .and. QQ(L,I,J) > 0d0 ) THEN\n" . " \n" . " ! Only compute rainout if F > 0. \n" . " ! This helps to eliminate unnecessary CPU cycles. \n" . " IF ( F > 0d0 ) THEN\n" . "\n" . " ! Loop over soluble tracers and/or aerosol tracers \n" . " DO NN = 1, NSOL\n" . " N = IDWETD(NN)\n" . "\n" . " ! Call subroutine RAINOUT to comptue the fraction\n" . " ! of tracer lost to rainout in grid box (I,J,L) \n" . " CALL RAINOUT( I, J, L, N, K_RAIN, DT, F, RAINFRAC )\n" . "\n" . " ! Subtract the rainout loss in grid box (I,J,L) from STT_ADJ\n" . " WETLOSS = 0.\n" . " WETLOSS = WETLOSS + DSTT_ADJ(nn,l,i,j)\n" . " DSTT_ADJ(nn,l+1,i,j) = DSTT_ADJ(nn,l+1,i,j) \n" . " & + DSTT_ADJ(nn,l,i,j)\n" . " DSTT_ADJ(nn,l,i,j) = 0.\n" . " WETLOSS = WETLOSS - STT_ADJ(i,j,l,n)\n" . " STT_ADJ(i,j,l,n) = STT_ADJ(i,j,l,n) \n" . " & + WETLOSS*rainfrac\n" . " WETLOSS = 0.\n" . "\n" . " ENDDO\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! (5) W a s h o u t i n t h e m i d d l e l e v e l s\n" . " !==============================================================\n" . " ELSE IF ( PDOWN(L,I,J) > 0d0 .and. QQ(L,I,J) <= 0d0 ) THEN\n" . "\n" . " ! QDOWN is the precip leaving thru the bottom of box (I,J,L)\n" . " ! Q is the new precip that is forming within box (I,J,L)\n" . " QDOWN = PDOWN(L,I,J)\n" . " Q = QQ(L,I,J)\n" . " \n" . " ! Only compute washout if F > 0.\n" . " ! This helps to eliminate needless CPU cycles.\n" . " IF ( F > 0d0 ) THEN\n" . "\n" . " ! Loop over soluble tracers and/or aerosol tracers \n" . " DO NN = 1, NSOL\n" . " N = IDWETD(NN)\n" . "\n" . " ! Call WASHOUT to compute the fraction of \n" . " ! tracer lost to washout in grid box (I,J,L)\n" . " CALL WASHOUT( I, J, L, N, \n" . " & QDOWN, DT, F, WASHFRAC, AER )\n" . "\n" . " ! The tracer left in grid box (I,J,L) is what was\n" . " ! in originally in the non-precipitating fraction \n" . " ! of the box, plus MASS_WASH, less WETLOSS. \n" . " MASS_WASH = 0.\n" . " WETLOSS = 0.\n" . " WETLOSS = WETLOSS + DSTT_ADJ(nn,l,i,j)\n" . " DSTT_ADJ(nn,l+1,i,j) = DSTT_ADJ(nn,l+1,i,j) \n" . " & + DSTT_ADJ(nn,l,i,j)\n" . " DSTT_ADJ(nn,l,i,j) = 0.\n" . " WETLOSS = WETLOSS - STT_ADJ(i,j,l,n)\n" . " DSTT_ADJ(nn,l+1,i,j) = DSTT_ADJ(nn,l+1,i,j) \n" . " & - WETLOSS\n" . " MASS_WASH = MASS_WASH + WETLOSS * washfrac\n" . " WETLOSS = 0.\n" . " DSTT_ADJ(nn,l+1,i,j) = DSTT_ADJ(nn,l+1,i,j) \n" . " & + MASS_WASH\n" . " STT_ADJ(i,j,l,n) = STT_ADJ(i,j,l,n) \n" . " & + MASS_WASH * f\n" . " MASS_WASH = 0.\n" . "\n" . " ENDDO \n" . " ENDIF\n" . "\n" . " !===========================================================\n" . " ! (6) N o D o w n w a r d P r e c i p i t a t i o n \n" . " !===========================================================\n" . " ELSE IF ( ABS( PDOWN(L,I,J) ) < 1d-30 ) THEN\n" . "\n" . " ! Loop over soluble tracers and/or aerosol tracers \n" . " DO NN = 1, NSOL\n" . " N = IDWETD(NN) \n" . "\n" . " ! All of the rained-out tracer coming from grid box\n" . " ! (I,J,L+1) goes back into the gas phase at (I,J,L)\n" . " ! In evap, SO2 comes back as SO4 (rjp, bmy, 3/23/03)\n" . " WETLOSS = 0.\n" . " DSTT_ADJ(nn,l,i,j) = 0.\n" . " WETLOSS = WETLOSS - STT_ADJ(i,j,l,n)\n" . " DSTT_ADJ(nn,l+1,i,j) = DSTT_ADJ(nn,l+1,i,j) - WETLOSS\n" . " WETLOSS = 0.\n" . " ENDDO\n" . " ENDIF \n" . "\n" . " ENDDO \n" . "\n" . " !==============================================================\n" . " ! (3) R a i n o u t F r o m T o p L a y e r (L = LLPAR) \n" . " !============================================================== \n" . "\n" . " ! Zero variables for this level\n" . " Q = 0d0\n" . " QDOWN = 0d0\n" . " RAINFRAC = 0d0\n" . " WASHFRAC = 0d0\n" . " \n" . " ! RESET F and K_RAIN Values\n" . " F = F_TMP(I,J,L)\n" . " K_RAIN = K_TMP(I,J,L)\n" . "\n" . " ! Start at the top of the atmosphere\n" . " L = LLPAR\n" . "\n" . " ! If precip forms at (I,J,L), assume it all rains out\n" . " IF ( QQ(L,I,J) > 0d0 ) THEN\n" . "\n" . " ! Only compute rainout if F > 0. \n" . " ! This helps to eliminate unnecessary CPU cycles.\n" . " IF ( F > 0d0 ) THEN \n" . "\n" . " ! Loop over soluble tracers and/or aerosol tracers \n" . " DO NN = 1, NSOL\n" . " N = IDWETD(NN)\n" . "\n" . " ! Call subroutine RAINOUT to compute the fraction\n" . " ! of tracer lost to rainout in grid box (I,J,L=LLPAR)\n" . " CALL RAINOUT( I, J, L, N, K_RAIN, DT, F, RAINFRAC )\n" . "\n" . " ! Remove rainout losses in grid box (I,J,L=LLPAR) from STT_ADJ\n" . " WETLOSS = 0.\n" . " WETLOSS = WETLOSS + DSTT_ADJ(nn,l,i,j)\n" . " DSTT_ADJ(nn,l,i,j) = 0.\n" . " WETLOSS = WETLOSS - STT_ADJ(i,j,l,n)\n" . " STT_ADJ(i,j,l,n) = STT_ADJ(i,j,l,n) + WETLOSS*rainfrac\n" . " WETLOSS = 0.\n" . " ENDDO\n" . " ENDIF\n" . " ENDIF\n" . "\n" . " ! Zero accumulator array\n" . " DO L = 1, LLPAR\n" . " DO NN = 1, NSOLMAX\n" . " DSTT_ADJ(NN,L,I,J) = 0d0\n" . " ENDDO\n" . " ENDDO \n" . "\n" . " ENDDO !\n" . " ENDDO \n" . "#if !defined( SGI_MIPS )\n" . "!\$OMP END PARALLEL DO\n" . "#endif\n" . "\n" . " IF(maxval(STT_ADJ(:,:,1:4,:))==0.and.\n" . " & maxval(STT_ADJ(:,:,6:20,:))==0)THEN\n" . " PRINT*,'STT_ADJ ALL ZERO'\n" . " ELSE\n" . " !PRINT*,'STT_ADJ NOW BECOMING NON-ZERO'\n" . " ENDIF\n" . " \n" . " ! Return to calling program\n" . " END SUBROUTINE WETDEP_ADJ\n"; $input = ; while( !eof(TEMP) ) { print FILE "$input"; $input = ; } print FILE "$input"; close(FILE); close(TEMP); } #============================================= # Modify partition.f #============================================= sub modPartition { printf "Modifying partition.f\n"; $input = ; while( $input !~ m/USE COMODE_MOD/ ) { print FILE "$input"; $input = ; } print FILE " USE COMODE_MOD, ONLY : CSPEC, JLOP, VOLUME, PART_CASE\n"; $input = ; while( $input !~ m/IF \( CSPEC\(JLOOP,JJ\) \> 0\.0d0 \)/ ) { print FILE "$input"; $input = ; } print FILE " IF ( CSPEC(JLOOP,JJ) > 0.0d0 ) THEN \n" . " PART_CASE(JLOOP) = 1d0 \n" . " GOTO 220\n" . " ELSE\n" . " PART_CASE(JLOOP) = 2d0\n" . " ENDIF\n"; $input = ; while( !eof(TEMP) ) { print FILE "$input"; $input = ; } print FILE "$input"; close(FILE); close(TEMP); } #============================================= # Modify tpcore_fvdas_mod.f #============================================= sub modTpFvdasMod { printf "Modifying tpcore_fvdas_mod.f90\n"; $input = ; while( $input !~ m/iord, jord, kord, n_adj/ ) { print FILE "$input"; $input = ; } print FILE " iord, jord, kord, n_adj, iv, &\n"; $input = ; while( $input !~ m/integer iv/ ) { print FILE "$input"; $input = ; } print FILE " integer, intent(in):: iv ! Monotonicity constraints for top and bottom\n"; $input = ; while( $input !~ m/iv = 1/ ) { print FILE "$input"; $input = ; } print FILE "!$input"; $input = ; while( !eof(TEMP) ) { print FILE "$input"; $input = ; } print FILE "$input"; close(FILE); close(TEMP); } #============================================= # Modify setemis.f #============================================= sub modSetemis { printf "Modifying setemis.f\n"; $input = ; while( $input !~ m/USE COMODE_MOD/ ) { print FILE "$input"; $input = ; } print FILE "$input"; $input = ; chomp($input); $input = $input . ", EMIS_RATE\n"; while( $input !~ m/REAL\*8 *:: EMIS_BL, *NOXTOT, *TOTAL/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " INTEGER :: IT_NUM\n" . " LOGICAL, SAVE :: FIRSTIME = .TRUE.\n"; $input = ; for($i=0; $i<5; $i++) { print FILE "$input"; $input = ; } print FILE " EMIS_RATE = 0d0\n" . "\n" . " open(20,file='ITER')\n" , " read(20,*)IT_NUM\n" . " close(20)\n" . "\n"; while( $input !~ m/REMIS\(JLOOP,N\) = EMIS_BL \/ VOLUME\(JLOOP\)/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " !-----------SAVING INDIVIDUAL EMISSIONS--------------!\n" . " IF(IT_NUM==0)THEN\n" . " REMIS(JLOOP,N) = (1.01)*EMIS_BL / VOLUME(JLOOP)\n" . " ELSEIF(IT_NUM==1)THEN\n" . " REMIS(JLOOP,N) = (0.99)*EMIS_BL / VOLUME(JLOOP)\n" . " ENDIF\n" . " EMIS_RATE(JLOOP,1) = EMIS_BL / VOLUME(JLOOP)\n" . " !----------------------------------------------------!\n"; $input = ; while( $input !~ m/&* \( EMIS_BL \/ VOLUME\(JLOOP\) \)/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " !-----------SAVING INDIVIDUAL EMISSIONS--------------!\n" . " EMIS_RATE(JLOOP,2) = EMIS_BL / VOLUME(JLOOP)\n" . " !----------------------------------------------------!\n"; $input = ; while( $input !~ m/REMIS\(JLOOP,N\) = REMIS\(JLOOP,N\) \+ EMIS_BL/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " !-----------SAVING INDIVIDUAL EMISSIONS--------------!\n" . " EMIS_RATE(JLOOP,3) = EMIS_BL\n" . " !----------------------------------------------------!\n"; $input = ; while( $input !~ m/REMIS\(JLOOP,N\) = EMIS_BL \/ VOLUME\(JLOOP\)/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " !-----------SAVING INDIVIDUAL EMISSIONS--------------!\n" . " EMIS_RATE(JLOOP,2+N) = EMIS_BL / VOLUME(JLOOP)\n" . " !----------------------------------------------------!\n"; $input = ; while( $input !~ m/&* \( EMIS_BL \/ VOLUME\(JLOOP\) \)/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " !-----------SAVING INDIVIDUAL EMISSIONS--------------!\n" . " EMIS_RATE(JLOOP,13+N) = EMIS_BL / VOLUME(JLOOP)\n" . " !----------------------------------------------------!\n"; $input = ; while( $input !~ m/&* \( EMIS_BL \/ VOLUME\(JLOOP\) \)/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " !-----------SAVING INDIVIDUAL EMISSIONS--------------!\n" . " EMIS_RATE(JLOOP,24+N) = EMIS_BL / VOLUME(JLOOP)\n" . " !----------------------------------------------------!\n"; $input = ; while( !eof(TEMP) ) { print FILE "$input"; $input = ; } print FILE "$input"; close(FILE); close(TEMP); } #============================================= # Modify gasconc.f #============================================= sub modGasconc { printf "Modifying gasconc.f\n"; $input = ; while( $input !~ m/USE PRESSURE_MOD/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " !***************KPP_INTERFACE****************\n" . " USE CHECKPOINT_MOD\n" . " USE TIME_MOD\n" . " !********************************************\n"; $input = ; while( $input !~ m/REAL\*8 *:: TK,CONSEXP,VPRESH2O/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " INTEGER :: NYMD, NHMS\n" . " REAL*8 :: TAU\n"; $input = ; while( $input !~ m/CALL PARTITION/ ) { print FILE "$input"; $input = ; } print FILE " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . " CALL MAKE_CHEMISTRY_CHKFILE_CSP1( NYMD, NHMS, TAU )\n" . "\n" . "$input" . "\n"; $input = ; while( !eof(TEMP) ) { print FILE "$input"; $input = ; } print FILE "$input"; close(FILE); close(TEMP); } #============================================= # Modify emissions_mod.f #============================================= sub modEmissionsMod { printf "Modifying emissions_mod.f\n"; $input = ; while( $input !~ m/References to F90 modules/ ) { print EMISSMOD "$input"; $input = ; } print EMISSMOD "$input" . " USE BIOMASS_MOD, ONLY : NBIOMAX\n" . " USE BIOMASS_MOD, ONLY : COMPUTE_BIOMASS_EMISSIONS\n" . " USE BRAVO_MOD, ONLY : EMISS_BRAVO\n" . " USE C2H6_MOD, ONLY : EMISSC2H6\n" . " USE CARBON_MOD, ONLY : EMISSCARBON\n" . " USE CH3I_MOD, ONLY : EMISSCH3I\n" . " USE CO2_MOD, ONLY : EMISSCO2\n" . " USE DUST_MOD, ONLY : EMISSDUST\n" . " USE EDGAR_MOD, ONLY : EMISS_EDGAR\n" . " USE EMEP_MOD, ONLY : EMISS_EMEP\n" . " USE EPA_NEI_MOD, ONLY : EMISS_EPA_NEI\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE GLOBAL_CH4_MOD, ONLY : EMISSCH4\n" . " USE HCN_CH3CN_MOD, ONLY : EMISS_HCN_CH3CN\n" . " USE Kr85_MOD, ONLY : EMISSKr85\n" . " USE LOGICAL_MOD \n" . " USE MERCURY_MOD, ONLY : EMISSMERCURY\n" . " USE RnPbBe_MOD, ONLY : EMISSRnPbBe\n" . " USE SEASALT_MOD, ONLY : EMISSSEASALT\n" . " USE STREETS_ANTHRO_MOD, ONLY : EMISS_STREETS_ANTHRO\n" . " USE SULFATE_MOD, ONLY : EMISSSULFATE \n" . " USE TIME_MOD, ONLY : GET_MONTH, GET_YEAR\n" . " USE TIME_MOD, ONLY : ITS_A_NEW_MONTH, ITS_A_NEW_YEAR\n" . " USE TRACER_MOD \n" . " USE TAGGED_CO_MOD, ONLY : EMISS_TAGGED_CO\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Local Variables\n" . " INTEGER :: MONTH, YEAR\n" . " REAL*8 :: BIOMASS(IIPAR,JJPAR,NBIOMAX)\n" . "\n" . " !=================================================================\n" . " ! DO_EMISSIONS begins here!\n" . " !=================================================================\n" . "\n" . " ! Get year and month\n" . " YEAR = GET_YEAR()\n" . " MONTH = GET_MONTH()\n" . "\n" . " ! Get biomass burning emissions for use below\n" . " IF ( LBIOMASS ) THEN\n" . " CALL COMPUTE_BIOMASS_EMISSIONS( YEAR, MONTH )\n" . " ENDIF\n" . " \n" . " ! Test by simulation type\n" . " IF ( ITS_A_FULLCHEM_SIM() ) THEN\n" . "\n" . " !--------------------\n" . " ! NOx-Ox-HC-aerosol\n" . " !--------------------\n" . "\n" . " ! Read David Streets' emisisons over China / SE ASia\n" . " IF ( LSTREETS .and. ITS_A_NEW_YEAR() ) THEN\n" . " CALL EMISS_STREETS_ANTHRO\n" . " ENDIF\n" . "\n" . " ! Read EDGAR emissions once per month\n" . " IF ( LEDGAR .and. ITS_A_NEW_MONTH() ) THEN\n" . " CALL EMISS_EDGAR( YEAR, MONTH )\n" . " ENDIF\n" . "\n" . " ! Read EPA/NEI99 (USA) emissions once per month\n" . " IF ( LNEI99 .and. ITS_A_NEW_MONTH() ) CALL EMISS_EPA_NEI\n" . "\n" . " ! Read BRAVO (Mexico) emissions once per year\n" . " IF ( LBRAVO .and. ITS_A_NEW_YEAR() ) CALL EMISS_BRAVO\n" . "\n" . " ! Read EMEP (Europe) emissions once per year\n" . " IF ( LEMEP .and. ITS_A_NEW_YEAR() ) CALL EMISS_EMEP\n" . "\n" . " ! NOx-Ox-HC (w/ or w/o aerosols)\n" . " CALL EMISSDR\n" . "\n" . " ! Emissions for various aerosol types\n" . " IF ( LSSALT ) CALL EMISSSEASALT\n" . " IF ( LSULF .or. LCRYST ) CALL EMISSSULFATE\n" . " IF ( LCARB ) CALL EMISSCARBON\n" . " IF ( LDUST ) CALL EMISSDUST\n" . "\n" . " ELSE IF ( ITS_AN_AEROSOL_SIM() ) THEN\n" . " \n" . " !--------------------\n" . " ! Offline aerosol\n" . " !--------------------\n" . "\n" . " ! Read David Streets' emisisons over China / SE ASia\n" . " IF ( LSTREETS .and. ITS_A_NEW_YEAR() ) THEN\n" . " CALL EMISS_STREETS_ANTHRO\n" . " ENDIF\n" . "\n" . " ! Read EDGAR emissions once per month\n" . " IF ( LEDGAR .and. ITS_A_NEW_MONTH() ) THEN\n" . " CALL EMISS_EDGAR( YEAR, MONTH )\n" . " ENDIF\n" . "\n" . " ! Read EPA/NEI99 emissions once per month\n" . " IF ( LNEI99 .and. ITS_A_NEW_MONTH() ) CALL EMISS_EPA_NEI\n" . "\n" . " ! Read BRAVO (Mexico) emissions once per year\n" . " IF ( LBRAVO .and. ITS_A_NEW_YEAR() ) CALL EMISS_BRAVO\n" . "\n" . " ! Read EMEP (Europe) emissions once per year\n" . " IF ( LEMEP .and. ITS_A_NEW_YEAR() ) CALL EMISS_EMEP\n" . "\n" . " ! Emissions for various aerosol types\n" . " IF ( LSSALT ) CALL EMISSSEASALT\n" . " IF ( LSULF .or. LCRYST ) CALL EMISSSULFATE\n" . " IF ( LCARB ) CALL EMISSCARBON\n" . " IF ( LDUST ) CALL EMISSDUST\n" . "\n" . " ELSE IF ( ITS_A_RnPbBe_SIM() ) THEN\n" . " \n" . " !--------------------\n" . " ! Rn-Pb-Be\n" . " !--------------------\n" . " CALL EMISSRnPbBe\n" . "\n" . " ELSE IF ( ITS_A_CH3I_SIM() ) THEN\n" . "\n" . " !--------------------\n" . " ! CH3I\n" . " !--------------------\n" . "\n" . " ! Emit CH3I\n" . " CALL EMISSCH3I\n" . "\n" . " ELSE IF ( ITS_A_HCN_SIM() ) THEN\n" . "\n" . " !--------------------\n" . " ! HCN - CH3CN\n" . " !--------------------\n" . " CALL EMISS_HCN_CH3CN( N_TRACERS, STT )\n" . "\n" . " ELSE IF ( ITS_A_TAGCO_SIM() ) THEN\n" . "\n" . " !--------------------\n" . " ! Tagged CO\n" . " !--------------------\n" . "\n" . " ! Read David Streets' emisisons over China / SE ASia\n" . " IF ( LSTREETS .and. ITS_A_NEW_YEAR() ) THEN\n" . " CALL EMISS_STREETS_ANTHRO\n" . " ENDIF\n" . "\n" . " ! Read EDGAR emissions once per month\n" . " IF ( LEDGAR .and. ITS_A_NEW_MONTH() ) THEN\n" . " CALL EMISS_EDGAR( YEAR, MONTH )\n" . " ENDIF\n" . "\n" . " ! Read EPA (USA) emissions once per month\n" . " IF ( LNEI99 .and. ITS_A_NEW_MONTH() ) CALL EMISS_EPA_NEI\n" . "\n" . " ! Read BRAVO (Mexico) emissions once per year\n" . " IF ( LBRAVO .and. ITS_A_NEW_YEAR() ) CALL EMISS_BRAVO\n" . "\n" . " ! Read EPA (Europe) emissions once per year\n" . " IF ( LEMEP .and. ITS_A_NEW_YEAR() ) CALL EMISS_EMEP\n" . "\n" . " ! Emit tagged CO\n" . " CALL EMISS_TAGGED_CO\n" . "\n" . " ELSE IF ( ITS_A_C2H6_SIM() ) THEN\n" . "\n" . " !--------------------\n" . " ! C2H6\n" . " !--------------------\n" . "\n" . " ! Emit C2H6\n" . " CALL EMISSC2H6\n" . "\n" . " ELSE IF ( ITS_A_CH4_SIM() ) THEN\n" . "\n" . " !--------------------\n" . " ! CH4\n" . " !--------------------\n" . "\n" . " ! Read David Streets' emisisons over China / SE ASia\n" . " IF ( LSTREETS .and. ITS_A_NEW_YEAR() ) THEN\n" . " CALL EMISS_STREETS_ANTHRO\n" . " ENDIF\n" . "\n" . " ! Emit CH4\n" . " CALL EMISSCH4\n" . "\n" . " ELSE IF ( ITS_A_MERCURY_SIM() ) THEN\n" . "\n" . " !--------------------\n" . " ! Mercury\n" . " !--------------------\n" . " CALL EMISSMERCURY\n" . "\n" . " ELSE IF ( ITS_A_CO2_SIM() ) THEN\n" . "\n" . " !--------------------\n" . " ! CO2\n" . " !--------------------\n" . "\n" . " ! Read David Streets' emisisons over China / SE ASia\n" . " IF ( LSTREETS .and. ITS_A_NEW_YEAR() ) THEN\n" . " CALL EMISS_STREETS_ANTHRO\n" . " ENDIF\n" . "\n" . " ! Emit CO2\n" . " CALL EMISSCO2\n" . "\n" . " ENDIF\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG ( '### DO_EMISSIONS: a EMISSIONS' )\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE DO_EMISSIONS\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " ! End of module\n" . " END MODULE EMISSIONS_MOD\n"; } #============================================= # Modify time_mod.f #============================================= sub modTimeMod { printf "Modifying time_mod.f\n"; $input = ; while( $input !~ m/Module Variables/ ) { print FILE "$input"; $input = ; } print FILE "! Added SET_ELAPSED_MIN_ADJ, SET_ELAPSED_HOUR_ADJ, ITS_TIME_FOR_EXIT_ADJ\n" . "! subroutines required for adjoint calculations. (Kumaresh, 01/24/08)\n" . "\n" . "$input"; $input = ; while( $input !~ m/SYSTEM_TIMESTAMP/ ) { print FILE "$input"; $input = ; } print FILE "$input" . "! (88) SET_ELAPSED_MIN_ADJ : Updates the elapsed minutes since the start of adjoint run\n" . "! (89) SET_ELAPSED_HOUR_ADJ : Updates the elapsed minutes since the start of adjoint run\n" . "! (90) ITS_TIME_FOR_EXIT_ADJ: Returns TRUE if it is the end of the adjoint run\n"; $input = ; while( $input !~ m/PRIVATE *:: *NSEASON, *DAY_OF_YEAR, *ELAPSED_MIN/ ) { print FILE "$input"; $input = ; } print FILE " PRIVATE :: NSEASON, DAY_OF_YEAR\n"; $input = ; while( $input !~ m/END SUBROUTINE SET_ELAPSED_MIN/ ) { print FILE "$input"; $input = ; } for($i=0; $i<4; $i++) { print FILE "$input"; $input = ; } print FILE " SUBROUTINE SET_ELAPSED_HOUR\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine SET_ELAPSED_MIN increments the number of elapsed minutes by\n" . "! the dynamic timestep TS_DYN. (bmy, 3/21/03)\n" . "!******************************************************************************\n" . "!\n" . " !=================================================================\n" . " ! SET_ELAPSED_MIN begins here!\n" . " !=================================================================\n" . " ELAPSED_MIN = ELAPSED_MIN + 2*TS_DYN\n" . " \n" . " ! Return to calling program\n" . " END SUBROUTINE SET_ELAPSED_HOUR\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n"; while( $input !~ m/END FUNCTION SYSTEM_TIMESTAMP/ ) { print FILE "$input"; $input = ; } for($i=0; $i<4; $i++) { print FILE "$input"; $input = ; } print FILE "!=============----------------=====================--------------------===========\n" . "! ***************************ADJOINT SUBROUTINES****************************\n" . "!=============----------------=====================--------------------===========\n" . "\n" . " SUBROUTINE SET_ELAPSED_MIN_ADJ\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine SET_ELAPSED_MIN_ADJ decrements the number of elapsed minutes by\n" . "! the dynamic timestep TS_DYN. (Kumaresh, 01/24/08)\n" . "!******************************************************************************\n" . "!\n" . " !=================================================================\n" . " ! SET_ELAPSED_MIN begins here!\n" . " !=================================================================\n" . " ELAPSED_MIN = ELAPSED_MIN - TS_DYN\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE SET_ELAPSED_MIN_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE SET_ELAPSED_HOUR_ADJ\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine SET_ELAPSED_HOUR_ADJ decrements the number of elapsed minutes by\n" . "! the dynamic timestep 2*TS_DYN. (Kumaresh, 01/24/08)\n" . "!******************************************************************************\n" . "!\n" . " !=================================================================\n" . " ! SET_ELAPSED_MIN begins here!\n" . " !=================================================================\n" . " ELAPSED_MIN = ELAPSED_MIN - 2*TS_DYN\n" . " \n" . " ! Return to calling program\n" . " END SUBROUTINE SET_ELAPSED_HOUR_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION ITS_TIME_FOR_EXIT_ADJ() RESULT( FLAG )\n" . "!\n" . "!******************************************************************************\n" . "! Function ITS_TIME_FOR_EXIT_ADJ returns TRUE if it is the end of the adjoint \n" . "! run (i.e. Elapsed time <= 0) and false otherwise. (Kumaresh, 01/24/08)\n" . "!\n" . "! NOTES:\n" . "!******************************************************************************\n" . "!\n" . " ! Function value\n" . " LOGICAL :: FLAG \n" . "\n" . " !=================================================================\n" . " ! ITS_FOR_EXIT begins here!\n" . " !=================================================================\n" . " FLAG = ( ELAPSED_MIN <= 0 )\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION ITS_TIME_FOR_EXIT_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " END MODULE TIME_MOD\n"; close(FILE); close(TEMP); } #============================================= # Modify transport_mod.f #============================================= sub modTransportMod { printf "Modifying transport_mod.f\n"; $input = ; while( $input !~ m/Module Variables/ ) { print FILE "$input"; $input = ; } print FILE "! Added subroutines to carryout transport adjoint calculations. This is a\n" . "! continous adjoint obtained by reversing the wind fields. Tested and verified\n" . "! against Finite Differences. (Kumaresh, 01/24/08)\n" . "!\n"; while( $input !~ m/N_ADJ/ ) { print FILE "$input"; $input = ; } print FILE "! (14) ADJN (INTEGER) : For GEOS-4 TPCORE\n"; $input = ; while( $input !~ m/CLEANUP_TRANSPORT/ ) { print FILE "$input"; $input = ; } print FILE "$input" . "! (8 ) DO_TRANSPORT_ADJ : Driver which calls adjoint global or window TPCORE\n" . "! (9 ) DO_GLOBAL_TRANSPORT_ADJ: Calls either adjoint GEOS-1/S/3 or fvDAS TPCORE (global)\n"; $input = ; while( $input !~ m/PUBLIC :: SET_TRANSPORT/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " PUBLIC :: DO_TRANSPORT_ADJ\n"; $input = ; while( $input !~ m/INTEGER *:: JLAST, *NG, *MG, *N_ADJ/ ) { print FILE "$input"; $input = ; } print FILE " INTEGER :: JLAST, NG, MG, ADJN\n"; $input = ; while( $input !~ m/USE DAO_MOD/ ) { print FILE "$input"; $input = ; } print FILE " USE DAO_MOD, ONLY : PSC2, UWND, VWND, TMP_PRESS\n"; $input = ; while( $input !~ m/USE TIME_MOD/ ) { print FILE "$input"; $input = ; } print FILE " USE TIME_MOD\n"; $input = ; while( $input !~ m/USE TRACER_MOD/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " USE CHECKPOINT_MOD\n"; $input = ; while( $input !~ m/REAL\*8 *:: YMASS\(IIPAR,JJPAR,LLPAR\)/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " INTEGER :: NYMD, NHMS, IV\n" . " REAL*8 :: TAU\n"; $input = ; while( $input !~ m/D_DYN = DBLE\( N_DYN \)/ ) { print FILE "$input"; $input = ; } print FILE"$input" . " IV = 1\n"; $input = ; while( $input !~ m/IORD, *JORD, *KORD, *N_ADJ,/ ) { print FILE "$input"; $input = ; } print FILE " & IORD, JORD, KORD, ADJN, IV,\n"; $input = ; while( $input !~ m/CALL SET_FLOATING_PRESSURE\( P_TP2 \+ PTOP \)/ ) { print FILE "$input"; $input = ; } for($i=0; $i<4; $i++) { print FILE "$input"; $input = ; } print FILE " TMP_PRESS(:,:) = P_TP2(:,:)\n" . " NYMD = GET_NYMD()\n" . " NHMS = GET_NHMS()\n" . " TAU = GET_TAU()\n" . " CALL MAKE_PRESSURE_CHKFILE(NYMD, NHMS, TAU)\n" . "\n"; while( $input !~ m/N_ADJ = 0/ ) { print FILE "$input"; $input = ; } print FILE " ADJN = 0\n"; $input = ; while( $input !~ m/END SUBROUTINE CLEANUP_TRANSPORT/ ) { print FILE "$input"; $input = ; } for($i=0; $i<4; $i++) { print FILE "$input"; $input = ; } print FILE " SUBROUTINE DO_TRANSPORT_ADJ\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine DO_TRANSPORT is the driver routine for the proper TPCORE program\n" . "! for GEOS-3, GEOS-4, or window simulations. (bmy, 3/10/03, 7/20/04)\n" . "! \n" . "! NOTES:\n" . "! (1 ) Removed IORD, JORD, KORD from the arg list. Also now removed\n" . "! reference to CMN, it's not needed. (bmy, 7/20/04)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE GRID_MOD, ONLY : ITS_A_NESTED_GRID\n" . "\n" . " ! Local variables\n" . " LOGICAL, SAVE :: FIRST = .TRUE.\n" . "\n" . " !=================================================================\n" . " ! DO_TRANSPORT begins here!\n" . " !=================================================================\n" . "\n" . " ! Choose the proper version of TPCORE for the nested-grid window \n" . " ! region (usually 1x1 grids) or for the entire globe\n" . " IF ( ITS_A_NESTED_GRID() ) THEN\n" . " CALL DO_WINDOW_TRANSPORT_ADJ\n" . " ELSE\n" . " CALL DO_GLOBAL_TRANSPORT_ADJ\n" . " ENDIF\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE DO_TRANSPORT_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . " \n" . " SUBROUTINE DO_GLOBAL_TRANSPORT_ADJ\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine DO_TRANSPORT is the driver routine for the proper TPCORE \n" . "! program for GEOS-1, GEOS-STRAT, GEOS-3 or GEOS-4 global simulations. \n" . "! (bdf, bmy, 3/10/03, 7/12/06)\n" . "! \n" . "! NOTES:\n" . "! (1 ) Now references routine TPCORE_FVDAS from \"tpcore_fvdas_mod.f90\".\n" . "! Also now use logical flag USE_GEOS_4_TRANSPORT to decide which\n" . "! version of TPCORE is used. Now call routine DO_PJC_PFIX from\n" . "! \"pjc_pfix_mod.f\" which calls the Phil Cameron-Smith pressure fixer\n" . "! for the GEOS-4/fvDAS transport scheme. (bdf, bmy, 5/8/03)\n" . "! (2 ) Now call GET_AIR_MASS to compute air masses based on the input/output\n" . "! pressures of the GEOS-4 version of TPCORE (bmy, 6/24/03)\n" . "! (3 ) Now references DEBUG_MSG from \"error_mod.f\". (bmy, 8/7/03)\n" . "! (4 ) Bug fix: rewrote first parallel DO-loop to avoid NaN's. Now also make\n" . "! sure to pass surface pressures which are consistent with the Ap and\n" . "! Bp coordinates which define the vertical grid to both TPCORE and\n" . "! DO_PJC_PFIX. (bmy, 10/27/03)\n" . "! (5 ) Removed IORD, JORD, KORD from the arg list, since these are now\n" . "! module variables. Now get LFILL, LMFCT, LPRT, LEMBED, LWINDO from \n" . "! \"logical_mod.f\". Now references STT, N_TRACERS, TCVV from \n" . "! \"tracer_mod.f\". Now parallelized embedded chemistry BC's. \n" . "! (bmy, 7/20/04) \n" . "! (6 ) Now references MASSFLEW, MASSFLNS, MASSFLUP from \"diag_mod.f\".\n" . "! Also references ND24, ND25, ND26 from \"CMN_DIAG\". (bmy, 9/28/04)\n" . "! (7 ) For GEOS-3 transport, we don't have to flip the STT array before & \n" . "! after the call to TPCORE because we now call TPCORE with the array \n" . "! mask statement STT(:,:,LLPAR:1:-1,:). Also modified for GEOS-5 \n" . "! and GCAP met fields. (swu, bmy, 5/25/05)\n" . "! (8 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (9 ) Now do flipping of arrays in call to TPCORE_FVDAS (bmy, 6/16/06)\n" . "! (10) Rewrote some parallel loops for the SUN compiler (bmy, 7/14/06)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE DAO_MOD, ONLY : PSC2, UWND, VWND, TMP_PRESS\n" . " USE DIAG_MOD, ONLY : MASSFLEW, MASSFLNS, MASSFLUP\n" . " USE ERROR_MOD, ONLY : IT_IS_NAN, DEBUG_MSG\n" . " USE LOGICAL_MOD, ONLY : LEMBED, LFILL, LMFCT, LPRT, LWINDO\n" . " USE PJC_PFIX_MOD, ONLY : DO_PJC_PFIX\n" . " USE PRESSURE_MOD, ONLY : GET_PEDGE, SET_FLOATING_PRESSURE\n" . " USE TIME_MOD\n" . " USE TPCORE_BC_MOD, ONLY : SAVE_GLOBAL_TPCORE_BC\n" . " USE TPCORE_MOD, ONLY : TPCORE\n" . " USE TPCORE_FVDAS_MOD, ONLY : TPCORE_FVDAS\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT_ADJ, TCVV\n" . " USE CHECKPOINT_MOD\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"CMN\" ! IEBD1, IEBD2, JEBD1, JEBD2\n" . "# include \"CMN_GCTM\" ! Re, G0_100\n" . "# include \"CMN_DIAG\" ! ND24, ND25, ND26\n" . " \n" . " ! Local variables\n" . " INTEGER :: I, J, L, L2, N, N_DYN\n" . " REAL*8 :: A_DIFF, D_DYN, TR_DIFF\n" . " REAL*8 :: AD_A(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: AD_B(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: P_TP1(IIPAR,JJPAR)\n" . " REAL*8 :: P_TP2(IIPAR,JJPAR)\n" . " REAL*8 :: P_TEMP(IIPAR,JJPAR)\n" . " REAL*8 :: TR_A(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: TR_B(IIPAR,JJPAR,LLPAR,N_TRACERS)\n" . " REAL*8 :: UTMP(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: VTMP(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: WW(IIPAR,JJPAR,LLPAR) \n" . " REAL*8 :: XMASS(IIPAR,JJPAR,LLPAR) \n" . " REAL*8 :: YMASS(IIPAR,JJPAR,LLPAR) \n" . " INTEGER :: NYMD, NHMS, IV\n" . " REAL*8 :: TAU \n" . "\n" . " ! Parameters\n" . " INTEGER, PARAMETER :: IGD=0, J1=3\n" . " REAL*8, PARAMETER :: Umax=200d0\n" . "\n" . " !=================================================================\n" . " ! DO_GLOBAL_TRANSPORT begins here!\n" . " !=================================================================\n" . "\n" . " !=================================================================\n" . " ! Prepare variables for calls to PJC P-fixer and TPCORE\n" . " !\n" . " ! For GEOS-4 (hybrid grid), the pressure at the bottom edge \n" . " ! grid box (I,J,L) is given by:\n" . " !\n" . " ! P(I,J,L) = Ap(L) + Bp(L) * Psurf(I,J)\n" . " !\n" . " ! where:\n" . " !\n" . " ! Ap(L) and Bp(L) are defined in \"pressure_mod.f\"\n" . " ! Psurf(I,J) = \"true\" surface pressure at surface box (I,J)\n" . " !\n" . " ! However, for GEOS-1, GEOS-STRAT, and GEOS-3, these are pure\n" . " ! sigma grids, and the pressure at the bottom edge of level L\n" . " ! is given by:\n" . " !\n" . " ! P(I,J,L) = Ap(L) + Bp(L) * ( Psurf(I,J) - PTOP )\n" . " !\n" . " ! where:\n" . " !\n" . " ! Ap(L) = PTOP for all L\n" . " ! Bp(L) = bottom sigma edge of level L\n" . " ! Psurf(I,J) = \"true\" surface pressure at surface box (I,J)\n" . " ! PTOP = model top pressure\n" . " !\n" . " ! When passing pressures to TPCORE, we must make sure that they\n" . " ! are consistent with the definition of the corresponding Ap and\n" . " ! Bp vertical coordinates. This means:\n" . " !\n" . " ! GEOS-4 : pass Psurf(I,J) to TPCORE\n" . " ! GEOS-3 : pass ( Psurf(I,J) - PTOP ) to TPCORE\n" . " ! GEOS-STRAT: pass ( Psurf(I,J) - PTOP ) to TPCORE\n" . " ! GEOS-1 : pass ( Psurf(I,J) - PTOP ) to TPCORE\n" . " !\n" . " ! where Psurf(I,J) is the true surface pressure at box (I,J) \n" . " ! and PTOP the model top pressure. \n" . " !\n" . " ! Also, the PJC P-fixer driver routine, DO_PJC_PFIX, now accepts \n" . " ! the true surface pressure instead of Psurf-PTOP. This means:\n" . " !\n" . " ! GEOS-4 : pass P_TP1, P_TP2 to DO_PJC_PFIX\n" . " ! GEOS-3 : pass P_TP1+PTOP, P_TP2+PTOP to DO_PJC_PFIX\n" . " !=================================================================\n" . "\n" . " IV = -1\n" . "\n" . " ! Dynamic timestep [s]\n" . " N_DYN = GET_TS_DYN() * 60\n" . " D_DYN = DBLE( N_DYN )\n" . " \n" . " ! P_TP1 = PS - PTOP at the middle of the dynamic timestep\n" . " ! P_TP2 = PS - PTOP at the end of the dynamic timestep \n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . "\n" . "#if defined( GEOS_4 ) || defined( GEOS_5 )\n" . "\n" . " ! *** For GEOS-4, GEOS-5 winds ***\n" . " ! We need to have P_TP1 and P_TP2 as the true surface pressure, \n" . " ! in order to be consistent with the Ap and Bp coordinates which \n" . " ! define the GEOS-4 hybrid grid.\n" . " !P_TP1(I,J) = GET_PEDGE(I,J,1)\n" . " P_TP1(I,J) = GET_PEDGE(I,J,1)\n" . " P_TP2(I,J) = PSC2(I,J) \n" . "\n" . "#else \n" . "\n" . " ! *** For GCAP, GEOS-3, GEOS-STRAT, GEOS-1 winds *** \n" . " ! We need to have P_TP1 and P_TP2 to be ( true sfc pressure - PTOP )\n" . " ! in order to be consistent with the Ap and Bp coordinates which \n" . " ! define the pure-sigma grid. \n" . " P_TP1(I,J) = GET_PEDGE(I,J,1) - PTOP\n" . " P_TP2(I,J) = PSC2(I,J) - PTOP\n" . "\n" . "#endif\n" . "\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " ! Select proper version of TPCORE\n" . " IF ( USE_GEOS_4_TRANSPORT ) THEN\n" . "\n" . " !==============================================================\n" . " ! Use GEOS-4/fvDAS version of TPCORE\n" . " ! (compatible with GEOS-3, GEOS-4, or GCAP winds)\n" . " !==============================================================\n" . "\n" . " ! Adjust tracer to correct residual non-conservation of mass\n" . " DO N = 1, N_TRACERS\n" . " \n" . " TR_DIFF = SUM( STT_ADJ(:,:,:,N) )\n" . "\n" . " ! Air mass [kg] after transport\n" . " IF ( N == 1 ) THEN\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . "\n" . " AD_A(I,J,L) = GET_AIR_MASS( I, J, L, P_TP1(I,J) )\n" . "\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . " ENDIF\n" . "\n" . " ! Convert from [kg] to [v/v]\n" . " TR_DIFF = TR_DIFF / SUM( AD_A ) * TCVV(N)\n" . "\n" . " ! Residual mass difference [kg]: before - after\n" . " TR_B(:,:,:,N) = TR_DIFF\n" . " TR_A(:,:,:) = -TR_DIFF\n" . " \n" . " ! Add mass difference [v/v] back to STT\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " ! Tracer mass [kg] after transport\n" . " STT_ADJ(I,J,L,N) = STT_ADJ(I,J,L,N) + TR_A(I,J,L)\n" . " & * AD_A(I,J,L) / TCVV(N)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . " ENDDO\n" . "\n" . " !==============================================================\n" . " ! Use GEOS-4/fvDAS version of TPCORE\n" . " ! (compatible with GEOS-3, GEOS-4, or GCAP winds)\n" . " !==============================================================\n" . "\n" . " !----------------------------\n" . " ! Apply pressure fixer \n" . " !----------------------------\n" . "\n" . "#if defined( GEOS_4 ) || defined( GEOS_5 )\n" . "\n" . " ! *** For GEOS-4 and GEOS-5 winds ***\n" . " ! Call PJC P-fixer to get adjusted air masses (XMASS, YMASS)\n" . " ! Pass \"true\" surface pressures P_TP1 and P_TP2 to DO_PJC_PFIX.\n" . " CALL DO_PJC_PFIX( D_DYN, P_TP1, P_TP2, \n" . " & -UWND, -VWND, XMASS, YMASS )\n" . "\n" . "#else\n" . " ! *** For GCAP and GEOS-3 winds ***\n" . " ! Call PJC P-fixer to get adjusted air masses (XMASS, YMASS)\n" . " ! P_TP1 and P_TP2 are ( Psurface - PTOP ), so we must call \n" . " ! DO_PJC_PFIX with ( P_TP1 + PTOP ) and ( P_TP2 + PTOP ). \n" . " CALL DO_PJC_PFIX( D_DYN, P_TP1+PTOP, P_TP2+PTOP, \n" . " & -UWND, -VWND, XMASS, YMASS )\n" . "\n" . "#endif\n" . "\n" . " !----------------------------\n" . " ! Call transport code\n" . " !----------------------------\n" . "\n" . " ! Flip arrays in vertical dimension for TPCORE\n" . " ! Store winds in UTMP, VTMP to preserve UWND, VWND for diagnostics\n" . "\n" . " UTMP(:,:,1:LLPAR) = -UWND(:,:,LLPAR:1:-1)\n" . " VTMP(:,:,1:LLPAR) = -VWND(:,:,LLPAR:1:-1)\n" . "\n" . " ! GEOS-4/fvDAS transport (the output pressure is P_TEMP)\n" . " ! NOTE: P_TP1 and P_TP2 must be consistent with the definition\n" . " ! of Ap and Bp. For GEOS-4, P_TP1 and P_TP2 must be the \"true\"\n" . " ! surface pressure, but for GEOS-3, they must be ( Psurface -PTOP ). \n" . " CALL TPCORE_FVDAS( D_DYN, Re, IIPAR, JJPAR,\n" . " & LLPAR, JFIRST, JLAST, NG,\n" . " & MG, N_TRACERS, Ap, Bp,\n" . " & UTMP, VTMP, P_TP1, P_TP2,\n" . " & P_TEMP, STT_ADJ(:,:,LLPAR:1:-1,:), \n" . " & IORD, JORD, KORD, ADJN, IV, \n" . " & XMASS(:,:,LLPAR:1:-1), \n" . " & YMASS(:,:,LLPAR:1:-1),\n" . " & MASSFLEW(:,:,LLPAR:1:-1,:), \n" . " & MASSFLNS(:,:,LLPAR:1:-1,:), \n" . " & MASSFLUP(:,:,LLPAR:1:-1,:), A_M2,\n" . " & TCVV, ND24, ND25, ND26 )\n" . "\n" . " !----------------------------\n" . " ! Reset surface pressure\n" . " !----------------------------\n" . "\n" . "#if defined( GEOS_4 ) || defined( GEOS_5 )\n" . "\n" . " ! *** For GEOS-4 or GEOS-5 winds ***\n" . " ! P_TP2 is the \"true\" surface pressure at the end of the \n" . " ! dynamic timestep. Reset the pressure with P_TP2. This will \n" . " ! be the pressure at the start of the next dynamic timestep.\n" . " CALL SET_FLOATING_PRESSURE( P_TP2 )\n" . "#else\n" . "\n" . " ! *** For GCAP and GEOS-3 winds ***\n" . " ! P_TP2 is the \"true\" surface pressure at the end of the dynamic \n" . " ! timestep - PTOP. Reset the pressure with P_TP2+PTOP. This \n" . " ! will be the pressure at the start of the next dynamic timestep.\n" . " CALL SET_FLOATING_PRESSURE( P_TP2 + PTOP )\n" . "\n" . "#endif\n" . "\n" . " ELSE\n" . " \n" . " !==============================================================\n" . " ! Use TPCORE version 7.1.m\n" . " ! (compatible with GEOS-1, GEOS-STRAT, or GEOS-3)\n" . " !==============================================================\n" . "\n" . " ! Flip arrays in vertical dimension\n" . " ! Store winds in UTMP, VTMP to preserve UWND, VWND for diagnostics\n" . " UTMP(:,:,1:LLPAR ) = -UWND(:,:,LLPAR:1:-1 )\n" . " VTMP(:,:,1:LLPAR ) = -VWND(:,:,LLPAR:1:-1 )\n" . "\n" . " LFILL = .FALSE.\n" . "\n" . " ! TPCORE v7.1.m transport scheme (output pressure is P_TP2)\n" . " ! The pressures P_TP1 and P_TP2 are PS-PTOP, in order to\n" . " ! be consistent with the definition of Ap and Bp for GEOS-3\n" . " ! GEOS-STRAT, and GEOS-1 winds. (bmy, 10/27/03)\n" . " CALL TPCORE( IGD, STT_ADJ(:,:,LLPAR:1:-1,:),\n" . " & P_TP1, P_TP2, UTMP, VTMP, WW, \n" . " & N_DYN, IORD, JORD, KORD, N_TRACERS, \n" . " & IIPAR, JJPAR, J1, LLPAR, Ap, \n" . " & Bp, PTOP, Re, LFILL, LMFCT, Umax )\n" . "\n" . " ! Reset floating pressure w/ pressure adjusted by TPCORE. Here\n" . " ! P_TP2 is PS-PTOP, so reset the pressure with P_TP2+PTOP. This\n" . " ! will be the pressure at the start of the next dynamic timestep.\n" . " CALL SET_FLOATING_PRESSURE( P_TP2 + PTOP )\n" . " \n" . " ENDIF \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE DO_GLOBAL_TRANSPORT_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE DO_WINDOW_TRANSPORT_ADJ\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine DO_WINDOW_TRANSPORT is the driver program for the proper TPCORE\n" . "! program for nested-grid window simulations. (yxw, bmy, 8/7/03, 10/3/05)\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now references DEBUG_MSG from \"error_mod.f\" (bmy, 8/7/03)\n" . "! (2 ) Removed IORD, JORD, KORD from the arg list, since these are now\n" . "! module variables. Now reference LFILL, LMFCT, LPRT from \n" . "! \"logical_mod.f\". Now reference STT, N_TRACERS from \"tracer_mod.f\".\n" . "! (3 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE DAO_MOD, ONLY : PSC2, UWND, VWND\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LFILL, LMFCT, LPRT\n" . " USE PRESSURE_MOD, ONLY : GET_PEDGE, SET_FLOATING_PRESSURE\n" . " USE TIME_MOD, ONLY : GET_TS_DYN\n" . " USE TPCORE_BC_MOD, ONLY : I0_W, J0_W, I1_W, J1_W\n" . " USE TPCORE_BC_MOD, ONLY : I2_W, J2_W, IM_W, JM_W, IGZD \n" . " USE TPCORE_BC_MOD, ONLY : DO_WINDOW_TPCORE_BC\n" . " USE TPCORE_WINDOW_MOD, ONLY : TPCORE_WINDOW\n" . " USE TRACER_MOD, ONLY : STT_ADJ, N_TRACERS\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"CMN_GCTM\" ! Re\n" . "\n" . " ! Local variables\n" . " INTEGER :: I, I0, J, J0, N_DYN\n" . " REAL*8 :: P_TP1(IIPAR,JJPAR)\n" . " REAL*8 :: P_TP2(IIPAR,JJPAR)\n" . " REAL*8 :: UTMP(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: VTMP(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: WW(IIPAR,JJPAR,LLPAR) \n" . "\n" . " ! Parameters\n" . " INTEGER, PARAMETER :: IGD=0, J1=3\n" . " REAL*8, PARAMETER :: Umax=150d0\n" . "\n" . " !=================================================================\n" . " ! DO_WINDOW_TRANSPORT begins here!\n" . " !=================================================================\n" . "\n" . " ! Get nested-grid lon/lat offsets [# boxes]\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " ! Dynamic timestep [s]\n" . " N_DYN = GET_TS_DYN() * 60\n" . " \n" . " ! Impose TPCORE boundary conditions \@ edges of 1x1 grid\n" . " CALL DO_WINDOW_TPCORE_BC\n" . "\n" . " ! Flip UWND, VWND, STT in vertical dimension\n" . " ! Now store into temp arrays to preserve UWND, VWND for diags\n" . " UTMP(:,:,1:LLPAR) = -UWND(:,:,LLPAR:1:-1)\n" . " VTMP(:,:,1:LLPAR) = -VWND(:,:,LLPAR:1:-1)\n" . " STT_ADJ (:,:,1:LLPAR,:) = STT_ADJ(:,:,LLPAR:1:-1,:)\n" . "\n" . " ! Set temp arrays for passing pressures to TPCORE\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " P_TP2(I,J) = GET_PEDGE(I,J,1) - PTOP\n" . " P_TP1(I,J) = PSC2(I,J) - PTOP\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " LFILL = .FALSE.\n" . "\n" . " ! Call the nested-grid window version of TPCORE (v.7.1)\n" . " ! Use the pressures at the middle and the end of the \n" . " ! dynamic timestep (P = PS-PTOP; P_TEMP = PSC2-PTOP).\n" . " CALL TPCORE_WINDOW( IGD, STT_ADJ, P_TP1, P_TP2, UTMP, \n" . " & VTMP, WW, N_DYN, IORD, JORD, \n" . " & KORD, N_TRACERS, IIPAR, JJPAR, J1, \n" . " & I0, J0, I0_W, J0_W, I1_W, \n" . " & J1_W, I2_W, J2_W, IM_W, JM_W, \n" . " & IGZD, LLPAR, AP, BP, PTOP, \n" . " & Re, LFILL, LMFCT, Umax )\n" . "\n" . " ! Reset floating pressure w/ output of TPCORE\n" . " CALL SET_FLOATING_PRESSURE( P_TP1 + PTOP )\n" . "\n" . " ! Re-Flip STT in the vertical dimension\n" . " STT_ADJ(:,:,1:LLPAR,:) = STT_ADJ(:,:,LLPAR:1:-1,:)\n" . " \n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a TPCORE_WINDOW' )\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE DO_WINDOW_TRANSPORT_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE INIT_TRANSPORT_ADJ\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine INIT_TRANSPORT initializes all module variables and arrays. \n" . "! (bmy, 3/10/03, 5/25/05)\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now references GET_TS_DYN from \"time_mod.f\", INIT_TPCORE_FVDAS from\n" . "! \"tpcore_fvdas_mod.f90\", and GET_YMID_R from \"grid_mod.f\". Now also\n" . "! include \"CMN_SETUP\". (bdf, bmy, 4/28/03)\n" . "! (2 ) Remove reference to DSIG, it's obsolete. (bmy, 6/24/03)\n" . "! (3 ) Now references LEMBED & LTPFV from \"logical_mod.f\". Now references\n" . "! N_TRACERS from \"tracer_mod.f\". (bmy, 7/20/04)\n" . "! (4 ) Now modified for GEOS-5 and GCAP met fields (swu, bmy, 5/25/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE GRID_MOD, ONLY : GET_AREA_M2, GET_YMID_R\n" . " USE LOGICAL_MOD, ONLY : LEMBED, LTPFV, LTRAN\n" . " USE PRESSURE_MOD, ONLY : GET_AP, GET_BP\n" . " USE TIME_MOD, ONLY : GET_TS_DYN\n" . " USE TPCORE_FVDAS_MOD, ONLY : INIT_TPCORE\n" . " USE TRACER_MOD, ONLY : N_TRACERS\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"CMN\" ! IEBD1, JEBD1, IEBD2, JEBD2\n" . "# include \"CMN_GCTM\" ! Re\n" . "\n" . " ! Local variables\n" . " INTEGER :: AS, J, K, L, N_DYN\n" . " REAL*8 :: YMID_R(JJPAR)\n" . "\n" . " IF ( USE_GEOS_4_TRANSPORT ) THEN\n" . " ELSE\n" . " ! Flip Ap and Bp for TPCORE\n" . " DO L = 1, LLPAR+1 \n" . "\n" . " ! As L runs from the surface up, \n" . " ! K runs from the top down\n" . " K = ( LLPAR + 1 ) - L + 1\n" . " Ap(L) = GET_AP(K) / PTOP ! \n" . " Bp(L) = GET_BP(K)\n" . " ENDDO\n" . " ENDIF\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE INIT_TRANSPORT_ADJ\n" . "\n" . "!-----------------------------------------------------------\n" . "\n"; while( !eof(TEMP) ) { print FILE "$input"; $input = ; } print FILE "$input"; close(FILE); close(TEMP); } #============================================= # Modify pbl_mix_mod.f #============================================= sub modPblMixMod { printf "Modifying pbl_mix_mod.f\n"; $input = ; while( $input !~ m/PUBLIC :: DO_PBL_MIX/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " PUBLIC :: DO_PBL_MIX_ADJ\n"; $input = ; while( $input !~ m/USE TRACER_MOD/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " USE TIME_MOD\n" . " USE CHECKPOINT_MOD\n" . " USE TRACER_MOD, ONLY : FP, IM\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n"; $input = ; while( $input !~ m/LOGICAL, SAVE *:: FIRST/ ) { print FILE "$input"; $input = ; } print FILE "$input" . "\n" . " INTEGER :: NYMD, NHMS, I, J\n" . " REAL*8 :: TAU\n" . "\n" . " !=================================================================\n" . " ! DO_PBL_MIX begins here!\n" . " !=================================================================\n" . "\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . "\n" . " ! First-time initialization\n" . " IF ( FIRST ) THEN\n" . " CALL INIT_PBL_MIX\n" . " FIRST = .FALSE.\n" . " ENDIF\n" . " \n" . " ! Compute PBL height and related quantities\n" . " CALL COMPUTE_PBL_HEIGHT\n" . "\n" . " ! Do complete mixing of tracers in the PBL (if necessary)\n" . " IF ( DO_TURBDAY ) THEN\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J )\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " ! Compute tracer concentration [molec/cm3/box] by\n" . " ! looping over all species belonging to this tracer\n" . " FP(I,J) = FPBL(I,J)\n" . " IM(I,J) = IMIX(I,J)\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " CALL MAKE_FPBL_CHKFILE( NYMD, NHMS, TAU )\n" . " CALL MAKE_IMIX_CHKFILE( NYMD, NHMS, TAU )\n" . "\n" . " CALL TURBDAY( N_TRACERS, STT, TCVV )\n" . "\n" . " ENDIF\n" . "\n"; $input = ; while( $input !~ m/Return to calling program/ ) { $input = ; } for($i=0; $i<5; $i++) { print FILE "$input"; $input = ; } print FILE " SUBROUTINE DO_PBL_MIX_ADJ( DO_TURBDAY )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine DO_PBL_MIX is the driver routine for planetary boundary layer\n" . "! mixing. The PBL layer height and related quantities are always computed.\n" . "! Complete mixing of tracers underneath the PBL top is toggled by the \n" . "! DO_TURBDAY switch. (bmy, 2/11/05)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) DO_TURBDAY (LOGICAL) : Switch which turns on PBL mixing of tracers\n" . "!\n" . "! NOTES:\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE LOGICAL_MOD, ONLY : LTURB\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT_ADJ, TCVV \n" . " USE TIME_MOD\n" . " USE CHECKPOINT_MOD\n" . " USE TRACER_MOD, ONLY : FP, IM\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " LOGICAL, INTENT(IN) :: DO_TURBDAY\n" . "\n" . " ! Local variables\n" . " LOGICAL, SAVE :: FIRST = .TRUE.\n" . " \n" . " INTEGER :: NYMD, NHMS, I, J\n" . "\n" . " !=================================================================\n" . " ! DO_PBL_MIX begins here!\n" . " !=================================================================\n" . "\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . "\n" . " ! Do complete mixing of tracers in the PBL (if necessary)\n" . " IF ( DO_TURBDAY ) THEN\n" . "\n" . " CALL READ_FPBL_CHKFILE( NYMD, NHMS )\n" . " CALL READ_IMIX_CHKFILE( NYMD, NHMS )\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J )\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " ! Compute tracer concentration [molec/cm3/box] by\n" . " ! looping over all species belonging to this tracer\n" . " FPBL(I,J) = FP(I,J)\n" . " IMIX(I,J) = IM(I,J)\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . " CALL ADTURBDAY( N_TRACERS, STT_ADJ, TCVV )\n" . " ENDIF\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE DO_PBL_MIX_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n"; while( $input !~ m/END SUBROUTINE TURBDAY/ ) { print FILE "$input"; $input = ; } for($i=0; $i<4; $i++) { print FILE "$input"; $input = ; } print FILE " subroutine adturbday( ntrc, adtc, TCVV )\n" . "C***************************************************************\n" . "C***************************************************************\n" . "C** This routine was generated by the **\n" . "C** Tangent linear and Adjoint Model Compiler, TAMC 5.3.2 **\n" . "C***************************************************************\n" . "C***************************************************************\n" . "\n" . "C==============================================\n" . "C define arguments\n" . "C==============================================\n" . "\n" . " ! References to F90 modules \n" . " USE DAO_MOD, ONLY : AD\n" . " USE DIAG_MOD, ONLY : TURBFLUP\n" . " USE GRID_MOD, ONLY : GET_AREA_M2\n" . " USE TIME_MOD, ONLY : GET_TS_CONV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters \n" . "# include \"CMN_DIAG\" ! ND15\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NTRC\n" . " REAL*8, INTENT(INOUT) :: ADTC(IIPAR,JJPAR,LLPAR,NTRC)\n" . " REAL*8, INTENT(IN) :: TCVV(NTRC)\n" . " \n" . " ! Local variables\n" . " LOGICAL, SAVE :: FIRST = .TRUE.\n" . " INTEGER :: I, J, L, LTOP, N\n" . " REAL*8 :: AA, CC, CC_AA, AREA_M2, DTCONV\n" . " REAL*8 :: A(IIPAR,JJPAR)\n" . " REAL*8 :: DTC(IIPAR,JJPAR,LLPAR,NTRC) \n" . "\n" . "C==============================================\n" . "C define local variables\n" . "C==============================================\n" . " real*8 adcc\n" . " real*8 adcc_aa\n" . " real*8 addtc(iipar,jjpar,llpar,ntrc)\n" . " integer ip1\n" . " integer ip2\n" . " integer ip3\n" . " integer ip4\n" . "\n" . "C----------------------------------------------\n" . "C RESET LOCAL ADJOINT VARIABLES\n" . "C----------------------------------------------\n" . " adcc = 0.\n" . " adcc_aa = 0.\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( ip1,ip2,ip3,ip4 )\n" . " do ip4 = 1, ntrc\n" . " do ip3 = 1, llpar\n" . " do ip2 = 1, jjpar\n" . " do ip1 = 1, iipar\n" . " addtc(ip1,ip2,ip3,ip4) = 0.\n" . " end do\n" . " end do\n" . " end do\n" . " end do\n" . "!\$OMP END PARALLEL DO\n" . "\n" . "C----------------------------------------------\n" . "C ROUTINE BODY\n" . "C----------------------------------------------\n" . " DTCONV = GET_TS_CONV() * 60d0\n" . "\n" . "C----------------------------------------------\n" . "C ADJOINT COMPUTATIONS\n" . "C----------------------------------------------\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L, N, AA, adCC, adCC_AA )\n" . " do j = jjpar, 1, -1\n" . " do i = iipar, 1, -1\n" . " a(i,j) = 1.d0\n" . " aa = 0.d0\n" . " do l = 1, imix(i,j)-1\n" . " aa = aa+ad(i,j,l)\n" . " end do\n" . " l = imix(i,j)\n" . " aa = aa+ad(i,j,l)*fpbl(i,j)\n" . " do n = ntrc, 1, -1\n" . " l = imix(i,j)\n" . " addtc(i,j,l,n) = addtc(i,j,l,n)+adtc(i,j,l,n)/ad(i,j,l)\n" . " adcc_aa = adcc_aa+addtc(i,j,l,n)*a(i,j)*fpbl(i,j)*ad(i,j,l)\n" . " adtc(i,j,l,n) = adtc(i,j,l,n)-addtc(i,j,l,n)*a(i,j)*fpbl(i,\n" . " \$ j)*ad(i,j,l)\n" . " addtc(i,j,l,n) = 0.\n" . " do l = 1, imix(i,j)-1\n" . " addtc(i,j,l,n) = addtc(i,j,l,n)+adtc(i,j,l,n)/ad(i,j,l)\n" . " adcc_aa = adcc_aa+addtc(i,j,l,n)*a(i,j)*ad(i,j,l)\n" . " adtc(i,j,l,n) = adtc(i,j,l,n)-addtc(i,j,l,n)*a(i,j)*ad(i,\n" . " \$ j,l)\n" . " addtc(i,j,l,n) = 0.\n" . " end do\n" . " adcc = adcc+adcc_aa/aa\n" . " adcc_aa = 0.\n" . " l = imix(i,j)\n" . " adtc(i,j,l,n) = adtc(i,j,l,n)+adcc*ad(i,j,l)*fpbl(i,j)\n" . " do l = 1, imix(i,j)-1\n" . " adtc(i,j,l,n) = adtc(i,j,l,n)+adcc*ad(i,j,l)\n" . " end do\n" . " adcc = 0.\n" . " end do\n" . " end do\n" . " end do\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " end subroutine adturbday\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n"; while( $input !~ m/END SUBROUTINE INIT_PBL_MIX/ ) { print FILE "$input"; $input = ; } for($i=0; $i<4; $i++) { print FILE "$input"; $input = ; } print FILE " SUBROUTINE INIT_PBL_MIX_ADJ \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine INIT_PBL_MIX allocates and zeroes module arrays (bmy, 2/10/05)\n" . "!\n" . "! NOTES:\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE ERROR_MOD, ONLY : ALLOC_ERR\n" . "\n" . "# include \"CMN_SIZE\"\n" . "\n" . " ! Local variables\n" . " INTEGER :: AS\n" . "\n" . " !=================================================================\n" . " ! INIT_PBL_MIX begins here!\n" . " !=================================================================\n" . "\n" . " ! Scalars\n" . " PBL_MAX_L = 0\n" . " IMIX = 0\n" . " FPBL = 0d0\n" . " F_OF_PBL = 0d0\n" . " F_UNDER_TOP = 0d0\n" . " PBL_TOP_hPa = 0d0\n" . " PBL_TOP_L = 0d0\n" . " PBL_TOP_m = 0d0\n" . " PBL_THICK = 0d0\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE INIT_PBL_MIX_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n"; while( !eof(TEMP) ) { print FILE "$input"; $input = ; } print FILE "$input"; close(FILE); close(TEMP); } #============================================= # Modify i6_read_mod.f #============================================= sub modI6ReadMod { printf "Modifying i6_read_mod.f\n"; $input = ; while( $input !~ m/PUBLIC :: UNZIP_I6_FIELDS/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " PUBLIC :: OPEN_I6_FIELDS_ADJ\n"; $input = ; while( $input !~ m/END SUBROUTINE OPEN_I6_FIELDS/ ) { print FILE "$input"; $input = ; } for($i=0; $i<4; $i++) { print FILE "$input"; $input = ; } print FILE " SUBROUTINE OPEN_I6_FIELDS_ADJ( NYMD, NHMS )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine OPEN_I6_FIELDS_ADJ opens the I-6 met fields file for date NYMD and \n" . "! time NHMS. (bmy, bdf, 6/15/98, 9/14/06)\n" . "!\n" . "! Modified for adjoint calculations. (Kumaresh, 01/24/08)\n" . "! \n" . "! Arguments as input:\n" . "! ===========================================================================\n" . "! (1 ) NYMD (INTEGER) : Current value of YYYYMMDD\n" . "! (2 ) NHMS (INTEGER) : Current value of HHMMSS\n" . "!\n" . "! NOTES:\n" . "! (1 ) Adapted from OPEN_MET_FIELDS of \"dao_read_mod.f\" (bmy, 6/13/03)\n" . "! (2 ) Now opens either zipped or unzipped files (bmy, 12/11/03)\n" . "! (3 ) Now skips past the GEOS-4 ident string (bmy, 12/12/03)\n" . "! (4 ) Now references \"directory_mod.f\" instead of CMN_SETUP. Also now\n" . "! references LUNZIP from \"logical_mod.f\". Also now prevents EXPAND_DATE\n" . "! from overwriting Y/M/D tokens in directory paths. (bmy, 7/20/04)\n" . "! (5 ) Now use FILE_EXISTS from \"file_mod.f\" to determine if file unit IU_I6\n" . "! refers to a valid file on disk (bmy, 3/23/05\n" . "! (6 ) Now modified for GEOS-5 and GCAP met fields (swu, bmy, 5/25/05)\n" . "! (7 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (8 ) Remove support for GEOS-1 and GEOS-STRAT met fields (bmy, 8/4/06)\n" . "! (9 ) Updated for variable tropopause (phs, bmy, 9/14/06)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : GET_RES_EXT\n" . " USE DIRECTORY_MOD, ONLY : DATA_DIR, GCAP_DIR, GEOS_3_DIR \n" . " USE DIRECTORY_MOD, ONLY : GEOS_4_DIR, GEOS_5_DIR, TEMP_DIR \n" . " USE ERROR_MOD, ONLY : ERROR_STOP\n" . " USE LOGICAL_MOD, ONLY : LUNZIP, LVARTROP\n" . " USE FILE_MOD, ONLY : IU_I6, IOERROR, FILE_EXISTS, IU_TP\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NYMD, NHMS\n" . "\n" . " ! Local variables\n" . " LOGICAL, SAVE :: FIRST = .TRUE.\n" . " LOGICAL :: IT_EXISTS\n" . " INTEGER :: IOS, IUNIT\n" . " CHARACTER(LEN=8) :: IDENT\n" . " CHARACTER(LEN=255) :: GEOS_DIR\n" . " CHARACTER(LEN=255) :: I6_FILE, TP_FILE\n" . " CHARACTER(LEN=255) :: PATH\n" . "\n" . " !=================================================================\n" . " ! OPEN_I6_FIELDS begins here!\n" . " !=================================================================\n" . "\n" . "#if defined( GEOS_3 )\n" . "\n" . " ! Strings for directory & filename\n" . " GEOS_DIR = TRIM( GEOS_3_DIR )\n" . " I6_FILE = 'YYYYMMDD.i6.' // GET_RES_EXT()\n" . "\n" . "#elif defined( GEOS_4 )\n" . "\n" . " ! Strings for directory & filename\n" . " GEOS_DIR = TRIM( GEOS_4_DIR )\n" . " I6_FILE = 'YYYYMMDD.i6.' // GET_RES_EXT()\n" . " TP_FILE = 'YYYYMMDD.tropp.' // GET_RES_EXT()\n" . "\n" . "#elif defined( GEOS_5 )\n" . "\n" . " ! Strings for directory & filename\n" . " GEOS_DIR = TRIM( GEOS_5_DIR )\n" . " I6_FILE = 'YYYYMMDD.i6.' // GET_RES_EXT()\n" . "\n" . "#elif defined( GCAP )\n" . "\n" . " ! Strings for directory & filename\n" . " GEOS_DIR = TRIM( GCAP_DIR )\n" . " I6_FILE = 'YYYYMMDD.i6.' // GET_RES_EXT()\n" . "\n" . "#endif\n" . "\n" . " ! Replace date tokens\n" . " CALL EXPAND_DATE( GEOS_DIR, NYMD, NHMS )\n" . " CALL EXPAND_DATE( I6_FILE, NYMD, NHMS )\n" . "\n" . " ! If unzipping, open GEOS-1 file in TEMP dir\n" . " ! If not unzipping, open GEOS-1 file in DATA dir\n" . " IF ( LUNZIP ) THEN\n" . " PATH = TRIM( TEMP_DIR ) // TRIM( I6_FILE )\n" . " ELSE\n" . " PATH = TRIM( DATA_DIR ) // \n" . " & TRIM( GEOS_DIR ) // TRIM( I6_FILE )\n" . " ENDIF\n" . "\n" . " ! Close previously opened A-3 file\n" . " CLOSE( IU_I6 )\n" . "\n" . " ! Make sure the file unit is valid before we open it \n" . " IF ( .not. FILE_EXISTS( IU_I6 ) ) THEN \n" . " CALL ERROR_STOP( 'Could not find file!', \n" . " & 'OPEN_I6_FIELDS (i6_read_mod.f)' )\n" . " ENDIF\n" . "\n" . " ! Open the file\n" . " OPEN( UNIT = IU_I6, FILE = TRIM( PATH ),\n" . " & STATUS = 'OLD', ACCESS = 'SEQUENTIAL', \n" . " & FORM = 'UNFORMATTED', IOSTAT = IOS )\n" . " \n" . " IF ( IOS /= 0 ) THEN\n" . " CALL IOERROR( IOS, IU_I6, 'open_i6_fields:1' )\n" . " ENDIF\n" . "\n" . " ! Echo info\n" . " WRITE( 6, 100 ) TRIM( PATH )\n" . " 100 FORMAT( ' - Opening: ', a )\n" . " \n" . " ! Set the proper first-time-flag false\n" . " FIRST = .FALSE.\n" . "\n" . "#if defined( GEOS_4 ) || defined( GEOS_5 ) || defined( GCAP )\n" . "\n" . " ! Skip past the ident string\n" . " READ( IU_I6, IOSTAT=IOS ) IDENT\n" . "\n" . " IF ( IOS /= 0 ) THEN\n" . " CALL IOERROR( IOS, IU_I6, 'open_i6_fields:2' )\n" . " ENDIF\n" . "\n" . "#endif\n" . "\n" . "#if defined( GEOS_4 ) \n" . "\n" . " ! Test if variable tropopause is turned on\n" . " IF ( LVARTROP ) THEN\n" . "\n" . " !===========================================================\n" . " ! ALSO NEED TO OPEN THE TROPOPAUSE PRESSURE FILE\n" . " !===========================================================\n" . "\n" . " ! Replace date tokens\n" . " CALL EXPAND_DATE( TP_FILE, NYMD, NHMS )\n" . "\n" . " ! If unzipping, open GEOS-1 file in TEMP dir\n" . " ! If not unzipping, open GEOS-1 file in DATA dir\n" . " IF ( LUNZIP ) THEN\n" . " PATH = TRIM( TEMP_DIR ) // TRIM( TP_FILE )\n" . " ELSE\n" . " PATH = TRIM( DATA_DIR ) // \n" . " & TRIM( GEOS_DIR ) // TRIM( TP_FILE )\n" . " ENDIF\n" . "\n" . " ! Close previously opened A-3 file\n" . " CLOSE( IU_TP )\n" . "\n" . " ! Make sure the file unit is valid before we open it \n" . " IF ( .not. FILE_EXISTS( IU_TP ) ) THEN \n" . " CALL ERROR_STOP( 'Could not find TROPP file!', \n" . " & 'OPEN_I6_FIELDS (i6_read_mod.f)' )\n" . " ENDIF\n" . "\n" . " ! Open the file\n" . " OPEN( UNIT = IU_TP, FILE = TRIM( PATH ),\n" . " & STATUS = 'OLD', ACCESS = 'SEQUENTIAL', \n" . " & FORM = 'UNFORMATTED', IOSTAT = IOS )\n" . " \n" . " IF ( IOS /= 0 ) THEN\n" . " CALL IOERROR( IOS, IU_TP, 'open_i6_fields:3' )\n" . " ENDIF\n" . "\n" . " ! Echo info\n" . " WRITE( 6, 100 ) TRIM( PATH )\n" . " \n" . " ! Set the proper first-time-flag false\n" . " FIRST = .FALSE.\n" . "\n" . " ! Skip past the ident string\n" . " READ( IU_TP, IOSTAT=IOS ) IDENT\n" . "\n" . " IF ( IOS /= 0 ) THEN\n" . " CALL IOERROR( IOS, IU_I6, 'open_i6_fields:4' )\n" . " ENDIF\n" . " ENDIF\n" . "#endif\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE OPEN_I6_FIELDS_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n"; while( !eof(TEMP) ) { print FILE "$input"; $input = ; } print FILE "$input"; close(FILE); close(TEMP); } #============================================= # Create fvdas_convect_mod.f #============================================= sub createFvdasConvectMod { printf "Creating fvdas_convect_mod.f\n"; open(FILE, ">fvdas_convect_mod.f") || die "Unable to open fvdas_convect_mod.f"; print FILE "! \$Id: fvdas_convect_mod.f,v 1.2 2005/11/29 15:46:55 monika Exp \$\n" . " MODULE FVDAS_CONVECT_MOD\n" . "!\n" . "!******************************************************************************\n" . "! Module FVDAS_CONVECT_MOD contains routines (originally from NCAR) which \n" . "! perform shallow and deep convection for the GEOS-4/fvDAS met fields. \n" . "! These routines account for shallow and deep convection, plus updrafts \n" . "! and downdrafts. (pjr, dsa, bmy, 6/26/03, 1/21/04)\n" . "! \n" . "! Module Variables:\n" . "! ============================================================================\n" . "! (1 ) RLXCLM (LOGICAL) : Logical to relax column versus cloud triplet\n" . "! (2 ) LIMCNV (INTEGER) : Maximum CTM level for HACK convection\n" . "! (3 ) CMFTAU (REAL*8 ) : Characteristic adjustment time scale for HACK [s]\n" . "! (4 ) EPS (REAL*8 ) : A very small number [unitless]\n" . "! (5 ) GRAV (REAL*8 ) : Gravitational constant [m/s2]\n" . "! (6 ) SMALLEST (REAL*8 ) : The smallest double-precision number \n" . "! (7 ) TINYNUM (REAL*8 ) : 2 times the machine epsilon for dble-precision\n" . "! (8 ) TINYALT (REAL*8 ) : arbitrary small num used in transport estimates\n" . "!\n" . "! Module Routines:\n" . "! ============================================================================\n" . "! (1 ) INIT_FVDAS_CONVECT : Initializes fvDAS convection scheme\n" . "! (2 ) FVDAS_CONVECT : fvDAS convection routine, called from MAIN \n" . "! (3 ) HACK_CONV : HACK convection scheme routine\n" . "! (4 ) ARCCONVTRAN : Sets up fields for ZHANG/MCFARLANE convection\n" . "! (5 ) CONVTRAN : ZHANG/MCFARLANE convection scheme routine\n" . "! (6 ) WHENFGT : Test function -- not sure what this does?\n" . "!\n" . "! GEOS-CHEM modules referenced by fvdas_convect_mod.f:\n" . "! ============================================================================\n" . "! (1 ) pressure_mod.f : Module containing routines to compute P(I,J,L)\n" . "!\n" . "! NOTES: \n" . "! (1 ) Contains new updates for GEOS-4/fvDAS convection. Also added OpenMP\n" . "! parallel loop over latitudes in FVDAS_CONVECT. (swu, bmy, 1/21/04)\n" . "!******************************************************************************\n" . "!\n" . " IMPLICIT NONE\n" . " \n" . " !=================================================================\n" . " ! MODULE PRIVATE DECLARATIONS -- keep certain internal variables \n" . " ! and routines from being seen outside \"fvdas_convect_mod.f\"\n" . " !=================================================================\n" . "\n" . " ! Declare everything PRIVATE ...\n" . " PRIVATE\n" . " \n" . " ! ... except routines INIT_FVDAS_CONVECT and FVDAS_CONVECT\n" . " PUBLIC :: INIT_FVDAS_CONVECT, FVDAS_CONVECT, FVDAS_CONVECT_ADJ\n" . "\n" . " !=================================================================\n" . " ! MODULE VARIABLES\n" . " !=================================================================\n" . "\n" . " ! Variables\n" . " INTEGER :: LIMCNV \n" . " \n" . " ! Constants\n" . " LOGICAL, PARAMETER :: RLXCLM = .TRUE.\n" . " REAL*8, PARAMETER :: CMFTAU = 3600.d0\n" . " REAL*8, PARAMETER :: EPS = 1.0d-13 \n" . " REAL*8, PARAMETER :: GRAV = 9.8d0\n" . " REAL*8, PARAMETER :: SMALLEST = TINY(1D0)\n" . " REAL*8, PARAMETER :: TINYALT = 1.0d-36 \n" . " REAL*8, PARAMETER :: TINYNUM = 2*EPSILON(1D0)\n" . "\n" . " !=================================================================\n" . " ! MODULE ROUTINES -- follow below the \"CONTAINS\" statement \n" . " !=================================================================\n" . " CONTAINS\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE INIT_FVDAS_CONVECT\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine INIT_FVDAS_CONVECT initializes the HACK and \n" . "! ZHANG/MCFARLANE convection schemes for GEOS-4/fvDAS met fields. \n" . "! (dsa, swu, bmy, 6/26/03, 12/17/03)\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now compute HYPI in a more efficient way (bmy, 12/17/03)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE PRESSURE_MOD, ONLY : GET_PEDGE\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . " \n" . " ! Local variables\n" . " INTEGER :: I, J, L, L2\n" . " REAL*8 :: HYPI(LLPAR+1)\n" . "\n" . " !=================================================================\n" . " ! INIT_FVDAS_CONVECT begins here!\n" . " !\n" . " ! Find the model level that roughly corresponds to 40 hPa and\n" . " ! only let convection take place below that level (LIMCNV)\n" . " !=================================================================\n" . " \n" . " ! Take I, J at midpt of region \n" . " ! (For global grids, this should be the equatorial box)\n" . " I = IIPAR / 2\n" . " J = JJPAR / 2\n" . "\n" . " ! Construct array of pressure edges [hPa] for column (I,J) \n" . " DO L = 1, LLPAR+1\n" . " L2 = (LLPAR+1) - L + 1\n" . " HYPI(L2) = GET_PEDGE(I,J,L)\n" . " ENDDO\n" . "\n" . " ! Limit convection to regions below 40 hPa\n" . " IF ( HYPI(1) >= 40d0 ) THEN\n" . " LIMCNV = 1\n" . " ELSE\n" . " DO L = 1, LLPAR\n" . " IF ( HYPI(L) < 40d0 .AND. HYPI(L+1) >= 40d0 ) THEN\n" . " LIMCNV = L\n" . " GOTO 10\n" . " ENDIF\n" . " ENDDO\n" . " LIMCNV = LLPAR + 1\n" . " ENDIF\n" . "\n" . " ! Exit loop\n" . " 10 CONTINUE\n" . "\n" . " !=================================================================\n" . " ! Echo output\n" . " !=================================================================\n" . "\n" . " WRITE( 6, 100 ) LIMCNV, HYPI(LIMCNV) \n" . " 100 FORMAT( ' - GEOS-4 convection is capped at L = ', i3, \n" . " & ', or approx ', f6.1, ' hPa' )\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE INIT_FVDAS_CONVECT\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE FVDAS_CONVECT( TDT, NTRACE, Q, RPDEL, ETA, \n" . " & BETA, MU, MD, EU, DP, \n" . " & NSTEP, FRACIS, TCVV, INDEXSOL )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine FVDAS_CONVECT is the convection driver routine for GEOS-4/fvDAS\n" . "! met fields. It calls both HACK and ZHANG/MCFARLANE convection schemes.\n" . "! (pjr, dsa, bmy, 6/26/03, 1/21/04)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) TDT (REAL*8 ) : 2 * delta-T [s]\n" . "! (2 ) NTRACE (INTEGER) : Number of tracers to transport [unitless]\n" . "! (3 ) Q (REAL*8 ) : Array of transported tracers [v/v]\n" . "! (4 ) RPDEL (REAL*8 ) : 1 / DP [1/hPa]\n" . "! (5 ) ETA (REAL*8 ) : GMAO Hack convective mass flux [kg/m2/s]\n" . "! (6 ) BETA (REAL*8 ) : GMAO Hack overshoot parameter [unitless]\n" . "! (7 ) MU (REAL*8 ) : GMAO updraft mass flux (ZMMU) [Pa/s]\n" . "! (8 ) MD (REAL*8 ) : GMAO downdraft mass flux (ZMMD) [Pa/s]\n" . "! (9 ) EU (REAL*8 ) : GMAO updraft entrainment (ZMEU) [Pa/s]\n" . "! (10) DP (REAL*8 ) : Delta-pressure between level edges [Pa]\n" . "! (11) NSTEP (INTEGER) : Time step index [unitless]\n" . "! (12) FRACIS (REAL*8 ) : Fraction of tracer that is insoluble [unitless]\n" . "! (13) TCVV (REAL*8 ) : Array of Molwt(AIR)/molwt(Tracer) [unitless]\n" . "! (14) INDEXSOL(INTEGER) : Index array of soluble tracers [unitless]\n" . "!\n" . "! Arguments as Output:\n" . "! ============================================================================\n" . "! (3 ) Q (REAL*8 ) : Modified tracer array [v/v]\n" . "! \n" . "! Important Local Variables:\n" . "! ============================================================================\n" . "! (1 ) LENGATH(INTEGER) : Number of lons where deep conv. happens at lat=J\n" . "! (2 ) IDEEP (INTEGER) : Lon indices where deep convection happens at lat=J\n" . "! (3 ) JT (INTEGER) : Cloud top layer for columns undergoing conv.\n" . "! (4 ) MX (INTEGER) : Cloud bottom layer for columns undergoing conv.\n" . "! (5 ) DSUBCLD(REAL*8 ) : Delta pressure from cloud base to sfc\n" . "! (6 ) DU (REAL*8 ) : Mass detraining from updraft (lon-alt array)\n" . "! (7 ) ED (REAL*8 ) : Mass entraining from downdraft (lon-alt array)\n" . "! (8 ) DPG (REAL*8 ) : gathered .01*dp (lon-alt array)\n" . "! (8 ) EUG (REAL*8 ) : gathered eu (lon-alt array) \n" . "! (9 ) MUG (REAL*8 ) : gathered mu (lon-alt array) \n" . "! (10) MDG (REAL*8 ) : gathered md (lon-alt array)\n" . "!\n" . "! NOTES:\n" . "! (1 ) Added TCVV and INDEXSOL to the arg list and in the call to CONVTRAN. \n" . "! Now perform convection in a loop over NSTEP iterations. Added\n" . "! an OpenMP parallel loop over latitude. Removed IL1G and IL2G,\n" . "! since these are no longer needed in this routine. Now put NTRACE \n" . "! before Q on the arg list. (bmy, 1/21/04)\n" . "!******************************************************************************\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NSTEP, NTRACE \n" . " INTEGER, INTENT(IN) :: INDEXSOL(NTRACE) \n" . " REAL*8, INTENT(IN) :: TDT \n" . " REAL*8, INTENT(INOUT) :: Q(IIPAR,JJPAR,LLPAR,NTRACE)\n" . " REAL*8, INTENT(IN) :: RPDEL(IIPAR,JJPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: ETA(IIPAR,JJPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: BETA(IIPAR,JJPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: MU(IIPAR,JJPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: MD(IIPAR,JJPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: EU(IIPAR,JJPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: DP(IIPAR,JJPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: FRACIS(IIPAR,JJPAR,LLPAR,NTRACE) \n" . " REAL*8, INTENT(IN) :: TCVV(NTRACE)\n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, L, N\n" . " INTEGER :: LENGATH, ISTEP\n" . " INTEGER :: JT(IIPAR)\n" . " INTEGER :: MX(IIPAR)\n" . " INTEGER :: IDEEP(IIPAR)\n" . " REAL*8 :: DSUBCLD(IIPAR)\n" . " REAL*8 :: DPG(IIPAR,LLPAR)\n" . " REAL*8 :: DUG(IIPAR,LLPAR)\n" . " REAL*8 :: EDG(IIPAR,LLPAR)\n" . " REAL*8 :: EUG(IIPAR,LLPAR)\n" . " REAL*8 :: MDG(IIPAR,LLPAR)\n" . " REAL*8 :: MUG(IIPAR,LLPAR)\n" . " REAL*8 :: QTMP(IIPAR,LLPAR,NTRACE)\n" . " REAL*8 :: FTMP(IIPAR,LLPAR,NTRACE)\n" . "\n" . " !=================================================================\n" . " ! FVDAS_CONVECT begins here!\n" . " !=================================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L, N, ISTEP, QTMP, FTMP, MUG, MDG )\n" . "!\$OMP+PRIVATE( DUG, EUG, EDG, DPG, DSUBCLD, JT, MX, IDEEP, LENGATH )\n" . "!\$OMP+SCHEDULE( DYNAMIC )\n" . "\n" . " ! Loop over latitudes\n" . " DO J = 1, JJPAR\n" . "\n" . " ! Save lat slices of Q & FRACIS into QTMP & FTMP\n" . " DO N = 1, NTRACE\n" . " DO L = 1, LLPAR\n" . " DO I = 1, IIPAR\n" . " QTMP(I,L,N) = Q(I,J,L,N)\n" . " FTMP(I,L,N) = FRACIS(I,J,L,N)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " ! Gather mass flux arrays, compute mass fluxes, and determine top\n" . " ! and bottom of Z&M convection. LENGATH = # of longitudes in the\n" . " ! band I=1,IIPAR where deep convection happens at latitude J.\n" . " CALL ARCONVTRAN( DP(:,J,:), MU(:,J,:), MD(:,J,:), \n" . " & EU(:,J,:), MUG, MDG, \n" . " & DUG, EUG, EDG, \n" . " & DPG, DSUBCLD, JT, \n" . " & MX, IDEEP, LENGATH )\n" . "\n" . " ! Loop over internal convection timestep\n" . " DO ISTEP = 1, NSTEP \n" . " \n" . " !-----------------------------------\n" . " ! ZHANG/MCFARLANE (deep) convection \n" . " !-----------------------------------\n" . " IF ( LENGATH > 0 ) THEN\n" . "\n" . " ! Only call CONVTRAN where convection happens\n" . " ! (i.e. at latitudes where LENGATH > 0)\n" . " CALL CONVTRAN( NTRACE, QTMP, MUG, MDG, \n" . " & DUG, EUG, EDG, DPG, \n" . " & DSUBCLD, JT, MX, IDEEP, \n" . " & 1, LENGATH, NSTEP, 0.5D0*TDT, \n" . " & FTMP, TCVV, INDEXSOL, J )\n" . " ENDIF\n" . " \n" . " CALL HACK_CONV( TDT, RPDEL(:,J,:), ETA(:,J,:), \n" . " & BETA(:,J,:), NTRACE, QTMP )\n" . "\n" . " ENDDO \n" . "\n" . " ! Save latitude slice QTMP back into global Q array\n" . " DO N = 1, NTRACE\n" . " DO L = 1, LLPAR\n" . " DO I = 1, IIPAR\n" . " Q(I,J,L,N) = QTMP(I,L,N)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE FVDAS_CONVECT\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE HACK_CONV( TDT, RPDEL, ETA, BETA, NTRACE, Q )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine HACK_CONV computes the convective mass flux adjustment to all \n" . "! tracers using the convective mass fluxes and overshoot parameters for the \n" . "! Hack scheme. (pjr, dsa, bmy, 6/26/03)\n" . "! \n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) TDT (REAL*8) : 2 delta-t [s)\n" . "! (2 ) RPDEL (REAL*8) : Reciprocal of pressure-thickness array [1/hPa]\n" . "! (3 ) ETA (REAL*8) : GMAO Hack convective mass flux (HKETA) [kg/m2/s]\n" . "! (4 ) BETA (REAL*8) : GMAO Hack overshoot parameter (HKBETA) [unitless]\n" . "! (5 ) NTRACE (INTEGER) : Number of tracers in the Q array [unitless]\n" . "! (6 ) Q (REAL*8) : Tracer concentrations [v/v] \n" . "! \n" . "! Arguments as Output:\n" . "! ============================================================================\n" . "! (6 ) Q (REAL*8) : Modified tracer concentrations [v/v] \n" . "!\n" . "! Important Local Variables:\n" . "! ============================================================================\n" . "! (1 ) INDX1 (INTEGER) : Longitude indices for condition true\n" . "! (2 ) ADJFAC (REAL*8 ) : Adjustment factor (relaxation related)\n" . "! (3 ) BOTFLX (REAL*8 ) : Bottom constituent mixing ratio flux\n" . "! (4 ) CMRC (REAL*8 ) : constituent mix rat (\"in-cloud\")\n" . "! (5 ) CMRH (REAL*8 ) : interface constituent mixing ratio \n" . "! (6 ) DCMR1 (REAL*8 ) : Q convective change (lower lvl)\n" . "! (7 ) DCMR2 (REAL*8 ) : Q convective change (mid level)\n" . "! (8 ) DCMR3 (REAL*8 ) : Q convective change (upper lvl)\n" . "! (9 ) EFAC1 (REAL*8 ) : Ratio q to convectively induced chg (btm lvl)\n" . "! (10) EFAC2 (REAL*8 ) : Ratio q to convectively induced chg (mid lvl)\n" . "! (11) EFAC3 (REAL*8 ) : Ratio q to convectively induced chg (top lvl)\n" . "! (12) ETAGDT (REAL*8 ) : ETA * GRAV * DT\n" . "! (13) TOPFLX (REAL*8 ) : Top constituent mixing ratio flux\n" . "!\n" . "! NOTES:\n" . "! (1 ) Updated comments. Added NTRACE as an argument. Now also force \n" . "! double-precision with the \"D\" exponents. (bmy, 6/26/03)\n" . "!******************************************************************************\n" . "!\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NTRACE\n" . " REAL*8, INTENT(IN) :: TDT\n" . " REAL*8, INTENT(IN) :: RPDEL(IIPAR,LLPAR)\n" . " REAL*8, INTENT(IN) :: ETA(IIPAR,LLPAR)\n" . " REAL*8, INTENT(IN) :: BETA(IIPAR,LLPAR)\n" . " REAL*8, INTENT(INOUT) :: Q(IIPAR,LLPAR,NTRACE)\n" . "\n" . " ! Local variables\n" . " INTEGER :: I, II, K, LEN1, M\n" . " INTEGER :: INDX1(IIPAR)\n" . " REAL*8 :: ADJFAC, BOTFLX, TOPFLX \n" . " REAL*8 :: EFAC1, EFAC2, EFAC3\n" . " REAL*8 :: CMRC(IIPAR) \n" . " REAL*8 :: CMRH(IIPAR,LLPAR+1) \n" . " REAL*8 :: DCMR1(IIPAR) \n" . " REAL*8 :: DCMR2(IIPAR) \n" . " REAL*8 :: DCMR3(IIPAR) \n" . " REAL*8 :: ETAGDT(IIPAR) \n" . "\n" . " !=================================================================\n" . " ! HACK_CONV begins here!\n" . " !\n" . " ! Ensure that characteristic adjustment time scale (cmftau) \n" . " ! assumed in estimate of eta isn't smaller than model time scale \n" . " ! (tdt). The time over which the convection is assumed to act \n" . " ! (the adjustment time scale) can be applied with each application \n" . " ! of the three-level cloud model, or applied to the column \n" . " ! tendencies after a \"hard\" adjustment (i.e., on a 2-delta t \n" . " ! time scale) is evaluated\n" . " !=================================================================\n" . " IF ( RLXCLM ) THEN\n" . " ADJFAC = TDT / ( MAX( TDT, CMFTAU ) )\n" . " ELSE\n" . " ADJFAC = 1.0D0\n" . " ENDIF\n" . "\n" . " !=================================================================\n" . " ! Begin moist convective mass flux adjustment procedure. \n" . " ! The formalism ensures that negative cloud liquid water can \n" . " ! never occur.\n" . " !=================================================================\n" . " DO 70 K = LLPAR-1, LIMCNV+1, -1\n" . " LEN1 = 0\n" . " DO I = 1, IIPAR\n" . " IF ( ETA(I,K) /= 0.0 ) THEN\n" . " ETAGDT(I) = ETA(I,K) * GRAV * TDT *0.01d0 ![hPa]\n" . " LEN1 = LEN1 + 1\n" . " INDX1(LEN1) = I\n" . " ELSE\n" . " ETAGDT(I) = 0.0d0\n" . " ENDIF\n" . " ENDDO\n" . " \n" . " ! Skip to next level\n" . " IF ( LEN1 <= 0 ) GOTO 70\n" . "\n" . " !==============================================================\n" . " ! Next, convectively modify passive constituents. For now, \n" . " ! when applying relaxation time scale to thermal fields after \n" . " ! entire column has undergone convective overturning, \n" . " ! constituents will be mixed using a \"relaxed\" value of the mass\n" . " ! flux determined above. Although this will be inconsistent \n" . " ! with the treatment of the thermal fields, it's computationally \n" . " ! much cheaper, no more-or-less justifiable, and consistent with \n" . " ! how the history tape mass fluxes would be used in an off-line \n" . " ! mode (i.e., using an off-line transport model)\n" . " !==============================================================\n" . " DO 50 M = 1, NTRACE\n" . " DO 40 II = 1, LEN1\n" . " I = INDX1(II)\n" . "\n" . " ! If any of the reported values of the constituent is \n" . " ! negative in the three adjacent levels, nothing will \n" . " ! be done to the profile. Skip to next longitude.\n" . " IF ( ( Q(I,K+1,M) < 0.0 ) .OR. \n" . " & ( Q(I,K,M) < 0.0 ) .OR.\n" . " & ( Q(I,K-1,M) < 0.0 ) ) GOTO 40\n" . "\n" . " ! Specify constituent interface values (linear interpolation)\n" . " CMRH(I,K ) = 0.5d0 *( Q(I,K-1,M) + Q(I,K ,M) )\n" . " CMRH(I,K+1) = 0.5d0 *( Q(I,K ,M) + Q(I,K+1,M) )\n" . " \n" . " CMRC(I) = Q(I,K+1,M)\n" . "\n" . " ! Determine fluxes, flux divergence => changes due to \n" . " ! convection. Logic must be included to avoid producing \n" . " ! negative values. A bit messy since there are no a priori \n" . " ! assumptions about profiles. Tendency is modified (reduced) \n" . " ! when pending disaster detected.\n" . " BOTFLX = ETAGDT(I)*(CMRC(I) - CMRH(I,K+1))*ADJFAC\n" . " TOPFLX = BETA(I,K)*ETAGDT(I)*(CMRC(I)-CMRH(I,K))*ADJFAC\n" . " DCMR1(I) = -BOTFLX*RPDEL(I,K+1)\n" . " EFAC1 = 1.0d0\n" . " EFAC2 = 1.0d0\n" . " EFAC3 = 1.0d0\n" . " \n" . " IF ( Q(I,K+1,M)+DCMR1(I) < 0.0 ) THEN\n" . " EFAC1 = MAX(TINYALT,ABS(Q(I,K+1,M)/DCMR1(I)) - EPS)\n" . " ENDIF\n" . "\n" . " IF ( EFAC1 == TINYALT .OR. EFAC1 > 1.0 ) EFAC1 = 0.0D0\n" . " DCMR1(I) = -EFAC1*BOTFLX*RPDEL(I,K+1)\n" . " DCMR2(I) = (EFAC1*BOTFLX - TOPFLX)*RPDEL(I,K)\n" . " \n" . " IF ( Q(I,K,M)+DCMR2(I) < 0.0 ) THEN\n" . " EFAC2 = MAX(TINYALT,ABS(Q(I,K ,M)/DCMR2(I)) - EPS)\n" . " ENDIF\n" . " \n" . " IF ( EFAC2 == TINYALT .OR. EFAC2 > 1.0 ) EFAC2 = 0.0D0\n" . " DCMR2(I) = (EFAC1*BOTFLX - EFAC2*TOPFLX)*RPDEL(I,K)\n" . " DCMR3(I) = EFAC2*TOPFLX*RPDEL(I,K-1)\n" . "\n" . " IF ( Q(I,K-1,M)+DCMR3(I) < 0.0 ) THEN\n" . " EFAC3 = MAX(TINYALT,ABS(Q(I,K-1,M)/DCMR3(I)) - EPS)\n" . " ENDIF\n" . "\n" . " IF ( EFAC3 == TINYALT .OR. EFAC3 > 1.0 ) EFAC3 = 0.0D0\n" . " EFAC3 = MIN(EFAC2,EFAC3)\n" . " DCMR2(I) = (EFAC1*BOTFLX - EFAC3*TOPFLX)*RPDEL(I,K)\n" . " DCMR3(I) = EFAC3*TOPFLX*RPDEL(I,K-1)\n" . " \n" . " Q(I,K+1,M) = Q(I,K+1,M) + DCMR1(I)\n" . " Q(I,K ,M) = Q(I,K ,M) + DCMR2(I)\n" . " Q(I,K-1,M) = Q(I,K-1,M) + DCMR3(I)\n" . " 40 CONTINUE\n" . " 50 CONTINUE\n" . " 70 CONTINUE\n" . " \n" . " ! Return to calling program\n" . " END SUBROUTINE HACK_CONV\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE ARCONVTRAN( DP, MU, MD, EU, MUG, \n" . " & MDG, DUG, EUG, EDG, DPG, \n" . " & DSUBCLD, JTG, JBG, IDEEP, LENGATH )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine ARCONVTRAN sets up the convective transport using archived mass\n" . "! fluxes from the ZHANG/MCFARLANE convection scheme. The setup involves:\n" . "! (1) Gather mass flux arrays.\n" . "! (2) Calc the mass fluxes that are determined by mass balance.\n" . "! (3) Determine top and bottom of convection.\n" . "! (pjr, dsa, swu, bmy, 6/26/03, 1/21/04)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) DP (REAL*8 ) : Delta pressure between interfaces [Pa] Pa\n" . "! (2 ) MU (REAL*8 ) : Mass flux up [kg/m2/s]Pa/s\n" . "! (3 ) MD (REAL*8 ) : Mass flux down [kg/m2/s]Pa/s\n" . "! (4 ) EU (REAL*8 ) : Mass entraining from updraft [1/s] Pa/s\n" . "!\n" . "! Arguments as Output:\n" . "! ============================================================================\n" . "! (5 ) MUG (REAL*8 ) : Gathered mu (lon-alt array)\n" . "! (6 ) MDG (REAL*8 ) : Gathered md (lon-alt array)\n" . "! (7 ) DUG (REAL*8 ) : Mass detraining from updraft (lon-alt array)\n" . "! (8 ) EUG (REAL*8 ) : Gathered eu (lon-alt array)\n" . "! (9 ) EDG (REAL*8 ) : Mass entraining from downdraft (lon-alt array)\n" . "! (10) DPG (REAL*8 ) : Gathered .01*dp (lon-alt array)\n" . "! (11) DSUBCLD (REAL*8 ) : Delta pressure from cloud base to sfc (lon-alt arr)\n" . "! (12) JTG (INTEGER) : Cloud top layer for columns undergoing conv.\n" . "! (13) JBG (INTEGER) : Cloud bottom layer for columns undergoing conv.\n" . "! (14) IDEEP (INTEGER) : Index of longitudes where deep conv. happens\n" . "! (15) LENGATH (INTEGER) : Length of gathered arrays\n" . "! \n" . "! NOTES:\n" . "! (1 ) Removed NSTEP from arg list; it's not used. Also zero arrays in order\n" . "! to prevent them from being filled with compiler junk for latitudes\n" . "! where no convection occurs at all. (bmy, 1/21/04)\n" . "!******************************************************************************\n" . "!\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . " \n" . " ! Arguments\n" . " INTEGER, INTENT(OUT) :: JTG(IIPAR)\n" . " INTEGER, INTENT(OUT) :: JBG(IIPAR)\n" . " INTEGER, INTENT(OUT) :: IDEEP(IIPAR)\n" . " INTEGER, INTENT(OUT) :: LENGATH\n" . " REAL*8, INTENT(IN) :: DP(IIPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: MU(IIPAR,LLPAR)\n" . " REAL*8, INTENT(IN) :: MD(IIPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: EU(IIPAR,LLPAR) \n" . " REAL*8, INTENT(OUT) :: MUG(IIPAR,LLPAR)\n" . " REAL*8, INTENT(OUT) :: MDG(IIPAR,LLPAR)\n" . " REAL*8, INTENT(OUT) :: DUG(IIPAR,LLPAR) \n" . " REAL*8, INTENT(OUT) :: EUG(IIPAR,LLPAR)\n" . " REAL*8, INTENT(OUT) :: EDG(IIPAR,LLPAR)\n" . " REAL*8, INTENT(OUT) :: DPG(IIPAR,LLPAR)\n" . " REAL*8, INTENT(OUT) :: DSUBCLD(IIPAR) \n" . "\n" . " ! Local variables\n" . " INTEGER :: I, K, LENPOS \n" . " INTEGER :: INDEX(IIPAR)\n" . " REAL*8 :: SUM(IIPAR)\n" . " REAL*8 :: RDPG(IIPAR,LLPAR) \n" . "\n" . " !=================================================================\n" . " ! ARCONVTRAN begins here!\n" . " !=================================================================\n" . "\n" . " ! Initialize arrays\n" . " DPG = 0d0\n" . " DSUBCLD = 0d0\n" . " DUG = 0d0\n" . " EDG = 0d0\n" . " EUG = 0d0\n" . " JTG = LLPAR\n" . " JBG = 1\n" . " MDG = 0d0\n" . " MUG = 0d0\n" . " RDPG = 0d0\n" . " SUM = 0d0\n" . " \n" . " !=================================================================\n" . " ! First test if convection exists in the lon band I=1,IIPAR\n" . " !================================================================= \n" . "\n" . " ! Sum all upward mass fluxes in the longitude band I=1,IIPAR\n" . " DO K = 1, LLPAR\n" . " DO I = 1, IIPAR\n" . " SUM(I) = SUM(I) + MU(I,K)\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " ! IDEEP is the index of longitudes where SUM( up mass flux ) > 0\n" . " ! LENGATH is the # of values where SUM( up mass flux ) > 0\n" . " CALL WHENFGT( IIPAR, SUM, 1, 0d0, IDEEP, LENGATH )\n" . " \n" . " ! Return if there is no convection the longitude band\n" . " IF ( LENGATH == 0 ) RETURN\n" . "\n" . " !=================================================================\n" . " ! Gather input mass fluxes in places where there is convection\n" . " !=================================================================\n" . " DO K = 1, LLPAR\n" . " DO I = 1, LENGATH\n" . " DPG(I,K) = 0.01d0 * DP(IDEEP(I),K) !convert Pa->hPa\n" . " RDPG(I,K) = 1.d0 / DPG(I,K)\n" . " MUG(I,K) = MU(IDEEP(I),K) * 0.01d0 !convert Pa/s->hPa/s\n" . " MDG(I,K) = MD(IDEEP(I),K) * 0.01d0\n" . " EUG(I,K) = EU(IDEEP(I),K) * 0.01d0 * RDPG(I,K) !convert Pa/s->1/s\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " !=================================================================\n" . " ! Calc DU and ED in places where there is convection\n" . " !=================================================================\n" . " DO K = 1, LLPAR-1\n" . " DO I = 1, LENGATH\n" . " DUG(I,K) = EUG(I,K) - ( MUG(I,K) - MUG(I,K+1) ) * RDPG(I,K)\n" . " EDG(I,K) = ( MDG(I,K) - MDG(I,K+1) ) * RDPG(I,K)\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " DO I = 1, LENGATH\n" . " DUG(I,LLPAR) = EUG(I,LLPAR) - MUG(I,LLPAR) * RDPG(I,LLPAR)\n" . " EDG(I,LLPAR) = 0.0d0\n" . " ENDDO\n" . "\n" . " DO K = 1, LLPAR\n" . " DO I = 1, LENGATH\n" . " IF ( DUG(I,K) < 1.d-7*EUG(I,K) ) DUG(I,K) = 0.0d0\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " !=================================================================\n" . " ! Find top and bottom layers with updrafts.\n" . " !=================================================================\n" . " DO I = 1, LENGATH\n" . " JTG(I) = LLPAR\n" . " JBG(I) = 1\n" . " ENDDO\n" . "\n" . " ! Loop over altitudes\n" . " DO K = 2, LLPAR\n" . " \n" . " ! Find places in the gathered array where MUG > 0\n" . " CALL WHENFGT( LENGATH, MUG(:,K), 1, 0D0, INDEX, LENPOS )\n" . " \n" . " ! Compute top & bottom layers\n" . " DO I = 1, LENPOS \n" . " JTG(INDEX(I)) = MIN( K-1, JTG(INDEX(I)) )\n" . " JBG(INDEX(I)) = MAX( K, JBG(INDEX(I)) )\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " !=================================================================\n" . " ! Calc delta p between srfc and cloud base.\n" . " !=================================================================\n" . " DO I = 1, LENGATH\n" . " DSUBCLD(I) = DPG(I,LLPAR)\n" . " ENDDO\n" . "\n" . " DO K = LLPAR-1, 2, -1\n" . " DO I = 1, LENGATH\n" . " IF ( JBG(I) <= K ) THEN\n" . " DSUBCLD(I) = DSUBCLD(I) + DPG(I,K)\n" . " ENDIF\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE ARCONVTRAN\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE CONVTRAN( NTRACE, Q, MU, MD, DU,\n" . " & EU, ED, DP, DSUBCLD, JT, \n" . " & MX, IDEEP, IL1G, IL2G, NSTEP, \n" . " & DELT, FRACIS, TCVV, INDEXSOL, LATI_INDEX)\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine CONVTRAN applies the convective transport of trace species\n" . "! (assuming moist mixing ratio) using the ZHANG/MCFARLANE convection scheme. \n" . "! (pjr, dsa, bmy, 6/26/03, 1/21/04)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) NTRACE (INTEGER) : Number of tracers to transport [unitless]\n" . "! (2 ) Q (REAL*8 ) : Tracer concentrations including moisture [v/v]\n" . "! (3 ) MU (REAL*8 ) : Mass flux up hPa/s\n" . "! (4 ) MD (REAL*8 ) : Mass flux down hPa/s\n" . "! (5 ) DU (REAL*8 ) : Mass detraining from updraft 1/s\n" . "! (6 ) EU (REAL*8 ) : Mass entraining from updraft 1/s\n" . "! (7 ) ED (REAL*8 ) : Mass entraining from downdraft 1/s\n" . "! (8 ) DP (REAL*8 ) : Delta pressure between interfaces\n" . "! (9 ) DSUBCLD (REAL*8 ) : Delta pressure from cloud base to sfc\n" . "! (10) JT (INTEGER) : Index of cloud top for each column\n" . "! (11) MX (INTEGER) : Index of cloud top for each column\n" . "! (12) IDEEP (INTEGER) : Gathering array\n" . "! (13) IL1G (INTEGER) : Gathered min lon indices over which to operate\n" . "! (14) IL2G (INTEGER) : Gathered max lon indices over which to operate\n" . "! (15) NSTEP (INTEGER) : Time step index\n" . "! (16) DELT (REAL*8 ) : Time step\n" . "! (17) FRACIS (REAL*8 ) : Fraction of tracer that is insoluble\n" . "!\n" . "! Arguments as Output:\n" . "! ============================================================================\n" . "! (2 ) Q (REAL*8 ) : Contains modified tracer mixing ratios [v/v]\n" . "!\n" . "! Important Local Variables:\n" . "! ============================================================================\n" . "! (1 ) CABV (REAL*8 ) : Mixing ratio of constituent above\n" . "! (2 ) CBEL (REAL*8 ) : Mix ratio of constituent beloqw\n" . "! (3 ) CDIFR (REAL*8 ) : Normalized diff between cabv and cbel\n" . "! (4 ) CHAT (REAL*8 ) : Mix ratio in env at interfaces\n" . "! (5 ) CMIX (REAL*8 ) : Gathered tracer array \n" . "! (6 ) COND (REAL*8 ) : Mix ratio in downdraft at interfaces\n" . "! (7 ) CONU (REAL*8 ) : Mix ratio in updraft at interfaces\n" . "! (8 ) DCONDT (REAL*8 ) : Gathered tend array \n" . "! (9 ) FISG (REAL*8 ) : gathered insoluble fraction of tracer\n" . "! (10) KBM (INTEGER) : Highest altitude index of cloud base [unitless]\n" . "! (11) KTM (INTEGER) : Hightet altitude index of cloud top [unitless]\n" . "! (12) MBSTH (REAL*8 ) : Threshold for mass fluxes\n" . "! (13) SMALL (REAL*8 ) : A small number\n" . "!\n" . "! NOTES:\n" . "! (1 ) Added references to \"diag_mod.f\", \"grid_mod.f\", and \"CMN_DIAG\". \n" . "! Also added TCVV and INDEXSOL as arguments. Now only save LD38\n" . "! levels of the ND38 diagnostic. Now place NTRACE before Q in the\n" . "! arg list. (swu, bmy, 1/21/04)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE DIAG_MOD, ONLY : AD38 \n" . " USE GRID_MOD, ONLY : GET_AREA_M2\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"CMN_DIAG\" ! ND38, LD38\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NTRACE \n" . " INTEGER, INTENT(IN) :: JT(IIPAR) \n" . " INTEGER, INTENT(IN) :: MX(IIPAR) \n" . " INTEGER, INTENT(IN) :: IDEEP(IIPAR) \n" . " INTEGER, INTENT(IN) :: IL1G \n" . " INTEGER, INTENT(IN) :: IL2G \n" . " INTEGER, INTENT(IN) :: NSTEP \n" . " REAL*8, INTENT(INOUT) :: Q(IIPAR,LLPAR,NTRACE) \n" . " REAL*8, INTENT(IN) :: MU(IIPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: MD(IIPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: DU(IIPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: EU(IIPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: ED(IIPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: DP(IIPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: DSUBCLD(IIPAR) \n" . " REAL*8, INTENT(IN) :: DELT \n" . " REAL*8, INTENT(IN) :: FRACIS(IIPAR,LLPAR,NTRACE) \n" . " REAL*8, INTENT(IN) :: TCVV(NTRACE)\n" . " INTEGER, INTENT(IN) :: INDEXSOL(NTRACE)\n" . " INTEGER, INTENT(IN) :: LATI_INDEX\n" . "\n" . " ! Local variables\n" . " INTEGER :: I, K, KBM, KK, KKP1\n" . " INTEGER :: KM1, KP1, KTM, M, ISTEP\n" . " INTEGER :: II, JJ, LL, NN\n" . " REAL*8 :: CABV, CBEL, CDIFR, CD2, DENOM\n" . " REAL*8 :: SMALL, MBSTH, MUPDUDP, MINC, MAXC\n" . " REAL*8 :: QN, FLUXIN, FLUXOUT, NETFLUX \n" . " REAL*8 :: CHAT(IIPAR,LLPAR) \n" . " REAL*8 :: COND(IIPAR,LLPAR) \n" . " REAL*8 :: CMIX(IIPAR,LLPAR) \n" . " REAL*8 :: FISG(IIPAR,LLPAR) \n" . " REAL*8 :: CONU(IIPAR,LLPAR) \n" . " REAL*8 :: DCONDT(IIPAR,LLPAR) \n" . " REAL*8 :: AREA_M2\n" . "\n" . " !=================================================================\n" . " ! CONVTRAN begins here!\n" . " !=================================================================\n" . "\n" . " ! A small number\n" . " SMALL = 1.d-36\n" . "\n" . " ! Threshold below which we treat the mass fluxes as zero (in mb/s)\n" . " MBSTH = 1.d-15\n" . "\n" . " !=================================================================\n" . " ! Find the highest level top and bottom levels of convection\n" . " !=================================================================\n" . " KTM = LLPAR\n" . " KBM = LLPAR\n" . " DO I = IL1G, IL2G\n" . " KTM = MIN( KTM, JT(I) )\n" . " KBM = MIN( KBM, MX(I) )\n" . " ENDDO\n" . "\n" . " ! Loop ever each tracer\n" . " DO M = 1, NTRACE\n" . "\n" . " ! Gather up the tracer and set tend to zero\n" . " DO K = 1, LLPAR\n" . " DO I = IL1G, IL2G\n" . " CMIX(I,K) = Q(IDEEP(I),K,M)\n" . " IF ( CMIX(I,K) < 4.d0*SMALLEST ) CMIX(I,K) = 0D0\n" . " FISG(I,K) = FRACIS(IDEEP(I),K,M)\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " !==============================================================\n" . " ! From now on work only with gathered data\n" . " ! Interpolate environment tracer values to interfaces\n" . " !==============================================================\n" . " DO K = 1, LLPAR\n" . " KM1 = MAX( 1, K-1 )\n" . "\n" . " DO I = IL1G, IL2G\n" . " MINC = MIN( CMIX(I,KM1), CMIX(I,K) )\n" . " MAXC = MAX( CMIX(I,KM1), CMIX(I,K) )\n" . "\n" . " IF ( MINC < 0d0 ) THEN \n" . " CDIFR = 0.d0\n" . " ELSE\n" . " CDIFR = ABS( CMIX(I,K)-CMIX(I,KM1) ) / MAX(MAXC,SMALL)\n" . " ENDIF\n" . " \n" . " !------------------------------------------------------------\n" . " ! The following 2 variables are actually NOT used\n" . " ! (swu, 12/17/03)\n" . " !DENOM = MAX( MAXC, SMALL ) \n" . " !CD2 = ABS( CMIX(I,K) - CMIX(I,KM1) ) / DENOM\n" . " !------------------------------------------------------------\n" . "\n" . " IF ( CDIFR > 1.d-6 ) THEN\n" . "\n" . " ! If the two layers differ significantly.\n" . " ! use a geometric averaging procedure\n" . " CABV = MAX( CMIX(I,KM1), MAXC*TINYNUM, SMALLEST )\n" . " CBEL = MAX( CMIX(I,K), MAXC*TINYNUM, SMALLEST )\n" . "\n" . " CHAT(I,K) = LOG( CABV / CBEL)\n" . " & / ( CABV - CBEL)\n" . " & * CABV * CBEL\n" . "\n" . " ELSE \n" . "\n" . " ! Small diff, so just arithmetic mean\n" . " CHAT(I,K) = 0.5d0 * ( CMIX(I,K) + CMIX(I,KM1) )\n" . " ENDIF\n" . "\n" . " ! Provisional up and down draft values\n" . " CONU(I,K) = CHAT(I,K)\n" . " COND(I,K) = CHAT(I,K)\n" . "\n" . " ! Provisional tends\n" . " DCONDT(I,K) = 0.d0\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " !==============================================================\n" . " ! Do levels adjacent to top and bottom\n" . " !==============================================================\n" . " K = 2\n" . " KM1 = 1\n" . " KK = LLPAR \n" . "\n" . " DO I = IL1G, IL2G\n" . " MUPDUDP = MU(I,KK) + DU(I,KK) * DP(I,KK)\n" . "\n" . " IF ( MUPDUDP > MBSTH ) THEN\n" . " CONU(I,KK) = ( EU(I,KK)*CMIX(I,KK)*DP(I,KK) ) \n" . " & /MUPDUDP \n" . " ENDIF\n" . "\n" . " IF ( MD(I,K) < -MBSTH ) THEN\n" . " COND(I,K) = (-ED(I,KM1)*CMIX(I,KM1)*DP(I,KM1))\n" . " & /MD(I,K) \n" . " ENDIF\n" . " ENDDO\n" . "\n" . " !==============================================================\n" . " ! Updraft from bottom to top\n" . " !==============================================================\n" . " DO KK = LLPAR-1,1,-1\n" . " KKP1 = MIN( LLPAR, KK+1 )\n" . "\n" . " DO I = IL1G,IL2G\n" . " MUPDUDP = MU(I,KK) + DU(I,KK) * DP(I,KK)\n" . " IF ( MUPDUDP > MBSTH ) THEN\n" . " CONU(I,KK) = (MU(I,KKP1)*CONU(I,KKP1) *FISG(I,KK)\n" . " & +EU(I,KK)*CMIX(I,KK)*DP(I,KK)\n" . " & )/MUPDUDP \n" . " ENDIF\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " !==============================================================\n" . " ! Downdraft from top to bottom\n" . " !==============================================================\n" . " DO K = 3, LLPAR\n" . " KM1 = MAX( 1, K-1 )\n" . "\n" . " DO I = IL1G, IL2G\n" . " IF ( MD(I,K) < -MBSTH ) THEN\n" . " COND(I,K) = ( MD(I,KM1)*COND(I,KM1) \n" . " \$ -ED(I,KM1)*CMIX(I,KM1)\n" . " \$ *DP(I,KM1))/MD(I,K)\n" . " ENDIF\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " DO K = KTM, LLPAR\n" . " KM1 = MAX( 1, K-1 )\n" . " KP1 = MIN( LLPAR, K+1 )\n" . "\n" . " DO I = IL1G, IL2G\n" . "\n" . " ! Version 3 limit fluxes outside convection to mass in \n" . " ! appropriate layer. These limiters are probably only safe\n" . " ! for positive definite quantitities. It assumes that mu \n" . " ! and md already satify a courant number limit of 1\n" . "\n" . " FLUXIN = MU(I,KP1)* CONU(I,KP1) * FISG(I,K)\n" . " \$ + (MU(I,K)+MD(I,K)) * CMIX(I,KM1) \n" . " \$ - MD(I,K) * COND(I,K)\n" . " \n" . " FLUXOUT = MU(I,K) * CONU(I,K) \n" . " \$ +(MU(I,KP1)+MD(I,KP1)) * CMIX(I,K)\n" . " \$ - MD(I,KP1) * COND(I,KP1) \n" . "\n" . "!------------------------------------------------------------------------------\n" . "! !!!!!!! backup: also works OK !!!!!!!!! (swu, 12/17/03)\n" . "! FLUXIN = MU(I,KP1)* CONU(I,KP1) \n" . "! \$ + MU(I,K) * 0.5d0*(CHAT(I,K)+CMIX(I,KM1)) \n" . "! \$ - MD(I,K) * COND(I,K) \n" . "! \$ - MD(I,KP1)* 0.5d0*(CHAT(I,KP1)+CMIX(I,KP1))\n" . "!\n" . "! FLUXOUT = MU(I,K) * CONU(I,K) \n" . "! \$ + MU(I,KP1) * 0.5d0*(CHAT(I,KP1)+CMIX(I,K))\n" . "! \$ - MD(I,KP1) * COND(I,KP1) \n" . "! \$ - MD(I,K) * 0.5d0*(CHAT(I,K)+CMIX(I,K))\n" . "!\n" . "! FLUXIN = MU(I,KP1)* CONU(I,KP1) \n" . "! \$ + MU(I,K) * CHAT(I,K)\n" . "! \$ - MD(I,K) * COND(I,K) \n" . "! \$ - MD(I,KP1)* CHAT(I,KP1)\n" . "!\n" . "! FLUXOUT = MU(I,K) * CONU(I,K) \n" . "! \$ + MU(I,KP1) * CHAT(I,KP1)\n" . "! \$ - MD(I,KP1) * COND(I,KP1) \n" . "! \$ - MD(I,K) * CHAT(I,K)\n" . "!------------------------------------------------------------------------------\n" . "\n" . " !========================================================\n" . " ! ND38 Diagnostic: loss of soluble tracer [kg/s] to\n" . " ! convective rainout (\"WETDCV-\$\") (swu, bmy, 12/17/03) \n" . " !========================================================\n" . "\n" . " ! Soluble tracer index\n" . " NN = INDEXSOL(M)\n" . "\n" . " ! Only save to ND38 if it's turned on, if there are soluble \n" . " ! tracers, and if we are below the LD38 level limit\n" . " IF ( ND38 > 0 .and. NN > 0 ) THEN\n" . " II = IDEEP(I)\n" . " JJ = LATI_INDEX\n" . " LL = LLPAR - K + 1\n" . " \n" . " ! Only save up to LD38 vertical levels\n" . " IF ( LL <= LD38 ) THEN\n" . " \n" . " ! Grid box surface area [m2] \n" . " AREA_M2 = GET_AREA_M2( JJ ) \n" . "\n" . " ! Save loss in [kg/s]\n" . " AD38(II,JJ,LL,NN) = AD38(II,JJ,LL,NN) +\n" . " & MU(I,KP1) * AREA_M2 * 100d0 / GRAV * \n" . " & CONU(I,KP1) * (1-FISG(I,K)) / TCVV(M) / \n" . " & FLOAT(NSTEP)\n" . " ENDIF\n" . " ENDIF\n" . "\n" . " NETFLUX = FLUXIN - FLUXOUT\n" . " \n" . " IF ( ABS(NETFLUX) < MAX(FLUXIN,FLUXOUT)*TINYNUM) THEN\n" . " NETFLUX = 0.D0\n" . " ENDIF\n" . "\n" . " DCONDT(I,K) = NETFLUX / DP(I,K)\n" . " ENDDO \n" . " ENDDO \n" . "\n" . " DO K = KBM, LLPAR \n" . " KM1 = MAX( 1, K-1 )\n" . "\n" . " DO I = IL1G, IL2G\n" . "\n" . " IF ( K == MX(I) ) THEN\n" . "\n" . " FLUXIN =(MU(I,K)+MD(I,K))* CMIX(I,KM1) \n" . " \$ - MD(I,K)*COND(I,K)\n" . "\n" . " FLUXOUT = MU(I,K)*CONU(I,K) \n" . "\n" . "!----------------------------------------------------------------------------\n" . "! !!!!!! BACK UP; also works well !!!!!!!! (swu, 12/17/03)\n" . "! FLUXIN = MU(I,K)*0.5d0*(CHAT(I,K)+CMIX(I,KM1))\n" . "! \$ - MD(I,K)*COND(I,K)\n" . "!\n" . "! FLUXOUT = MU(I,K)*CONU(I,K) \n" . "! \$ - MD(I,K)*0.5d0*(CHAT(I,K)+CMIX(I,K))\n" . "!----------------------------------------------------------------------------\n" . "\n" . " NETFLUX = FLUXIN - FLUXOUT\n" . "\n" . " IF (ABS(NETFLUX).LT.MAX(FLUXIN,FLUXOUT)*TINYNUM) THEN\n" . " NETFLUX = 0.d0\n" . " ENDIF\n" . "\n" . " DCONDT(I,K) = NETFLUX / DP(I,K)\n" . "\n" . " ELSE IF ( K > MX(I) ) THEN\n" . "\n" . " DCONDT(I,K) = 0.D0\n" . "\n" . " ENDIF\n" . "\n" . " ENDDO \n" . " ENDDO \n" . "\n" . " !==============================================================\n" . " ! Update and scatter data back to full arrays\n" . " !==============================================================\n" . " DO K = 1, LLPAR\n" . " KP1 = MIN( LLPAR, K+1 )\n" . " DO I = IL1G, IL2G \n" . " \n" . " QN = CMIX(I,K) + DCONDT(I,K) * DELT \n" . "\n" . " ! Do not make Q negative!!! (swu, 12/17/03)\n" . " IF ( QN < 0d0 ) THEN\n" . " QN = 0d0\n" . " ENDIF \n" . "\n" . " Q(IDEEP(I),K,M) = QN\n" . " ENDDO \n" . " ENDDO \n" . "\n" . " ENDDO !M ; End of tracer loop\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE CONVTRAN\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE WHENFGT( N, ARRAY, INC, TARGET, INDEX, NVAL )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine WHENFGT examines a 1-D vector and returns both an index array\n" . "! of elements and the number of elements which are greater than a certain \n" . "! target value. This routine came with the fvDAS convection code, we just\n" . "! cleaned it up and added comments. (swu, bmy, 1/21/04)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) N (INTEGER) : Number of elements in ARRAY\n" . "! (2 ) ARRAY (REAL*8 ) : 1-D vector to be examined\n" . "! (3 ) INC (INTEGER) : Increment for stepping thru ARRAY\n" . "! (4 ) TARGET (REAL*8 ) : Value that ARRAY will be tested against\n" . "!\n" . "! Arguments as Output:\n" . "! ============================================================================\n" . "! (5 ) INDEX (INTEGER) : Array of places where ARRAY(I) > TARGET\n" . "! (6 ) NVAL (INTEGER) : Number of places where ARRAY(I) > TARGET\n" . "!\n" . "! NOTES:\n" . "! (1 ) Updated comments. Now use F90 style declarations. (bmy, 1/21/04)\n" . "!******************************************************************************\n" . "!\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: N, INC\n" . " REAL*8, INTENT(IN) :: ARRAY(N), TARGET\n" . " INTEGER, INTENT(OUT) :: INDEX(N), NVAL\n" . "\n" . " ! Local variables\n" . " INTEGER :: I, INA\n" . "\n" . " !=================================================================\n" . " ! WHENFGT begins here!\n" . " !=================================================================\n" . "\n" . " ! Initialize\n" . " INA = 1\n" . " NVAL = 0\n" . " INDEX(:) = 0\n" . "\n" . " ! Loop thru the array\n" . " DO I = 1, N\n" . "\n" . " ! If the current element of ARRAY is greater than TARGET,\n" . " ! then increment NVAL and save the element # in INDEX\n" . " IF ( ARRAY(INA) > TARGET ) THEN\n" . " NVAL = NVAL + 1\n" . " INDEX(NVAL) = I\n" . " ENDIF\n" . "\n" . " ! Skip ahead by INC elements\n" . " INA = INA + INC\n" . " ENDDO\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE WHENFGT\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE FVDAS_CONVECT_ADJ( TDT, NTRACE, Q, RPDEL, ETA, \n" . " & BETA, MU, MD, EU, DP, \n" . " & NSTEP, FRACIS, TCVV, INDEXSOL, ADQ )\n" . "!\n" . "!******************************************************************************\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NSTEP, NTRACE \n" . " INTEGER, INTENT(IN) :: INDEXSOL(NTRACE) \n" . " REAL*8, INTENT(IN) :: TDT \n" . " REAL*8, INTENT(INOUT) :: Q(IIPAR,JJPAR,LLPAR,NTRACE) \n" . " REAL*8, INTENT(INOUT) :: ADQ(IIPAR,JJPAR,LLPAR,NTRACE)\n" . " REAL*8, INTENT(IN) :: RPDEL(IIPAR,JJPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: ETA(IIPAR,JJPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: BETA(IIPAR,JJPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: MU(IIPAR,JJPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: MD(IIPAR,JJPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: EU(IIPAR,JJPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: DP(IIPAR,JJPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: FRACIS(IIPAR,JJPAR,LLPAR,NTRACE) \n" . " REAL*8, INTENT(IN) :: TCVV(NTRACE)\n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, L, N\n" . " INTEGER :: LENGATH, ISTEP\n" . " INTEGER :: JT(IIPAR)\n" . " INTEGER :: MX(IIPAR)\n" . " INTEGER :: IDEEP(IIPAR) \n" . " REAL*8 :: DSUBCLD(IIPAR)\n" . " REAL*8 :: DPG(IIPAR,LLPAR)\n" . " REAL*8 :: DUG(IIPAR,LLPAR)\n" . " REAL*8 :: EDG(IIPAR,LLPAR)\n" . " REAL*8 :: EUG(IIPAR,LLPAR)\n" . " REAL*8 :: MDG(IIPAR,LLPAR)\n" . " REAL*8 :: MUG(IIPAR,LLPAR)\n" . " REAL*8 :: QTMP(IIPAR,LLPAR,NTRACE)\n" . " REAL*8 :: FTMP(IIPAR,LLPAR,NTRACE)\n" . " REAL*8 :: omp_get_thread_num\n" . " INTEGER :: itest\n" . " INTEGER :: ip1,ip2,ip3\n" . " REAL*8 :: ADQTMP(IIPAR,LLPAR,NTRACE)\n" . "\n" . "c!==========================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L, N, ISTEP, ADQTMP, QTMP, FTMP, MUG, MDG )\n" . "!\$OMP+PRIVATE( DUG, EUG, EDG, DPG, DSUBCLD, JT, MX, IDEEP, LENGATH )\n" . "!\$OMP+SCHEDULE( DYNAMIC )\n" . "\n" . " ! Loop over latitudes\n" . " DO J = JJPAR,1,-1\n" . " ! Save lat slices of Q & FRACIS into QTMP & FTMP\n" . " DO N = 1, NTRACE\n" . " DO L = 1, LLPAR\n" . " DO I = 1, IIPAR\n" . " ADQTMP(I,L,N) = ADQ(I,J,L,N)\n" . " QTMP(I,L,N) = Q(I,J,L,N)\n" . " FTMP(I,L,N) = FRACIS(I,J,L,N)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " !print *,'at 1 for J=',J,' thread=',omp_get_thread_num()\n" . " ! Gather mass flux arrays, compute mass fluxes, and determine top\n" . " ! and bottom of Z&M convection. LENGATH = # of longitudes in the\n" . " ! band I=1,IIPAR where deep convection happens at latitude J.\n" . " CALL ARCONVTRAN( DP(:,J,:), MU(:,J,:), MD(:,J,:), \n" . " & EU(:,J,:), MUG, MDG, \n" . " & DUG, EUG, EDG, \n" . " & DPG, DSUBCLD, JT, \n" . " & MX, IDEEP, LENGATH )\n" . "\n" . " ! Loop over internal convection timestep\n" . " !print *,'at 2 for J=',J,' thread=',omp_get_thread_num()\n" . " DO ISTEP = NSTEP, 1, -1\n" . " \n" . " CALL ADHACK_CONV( TDT, RPDEL(:,J,:), ETA(:,J,:), \n" . " & BETA(:,J,:), NTRACE, QTMP, ADQTMP )\n" . " \n" . "\n" . " IF ( LENGATH > 0 ) THEN\n" . "\n" . " ! Only call CONVTRAN where convection happens\n" . " ! (i.e. at latitudes where LENGATH > 0)\n" . " CALL CONVTRAN_ADJ( NTRACE, QTMP, MUG, MDG, \n" . " & DUG, EUG, EDG, DPG, \n" . " & DSUBCLD, JT, MX, IDEEP, \n" . " & 1, LENGATH, NSTEP, 0.5D0*TDT, \n" . " & FTMP, TCVV, INDEXSOL, J,\n" . " & ADQTMP )\n" . " ENDIF\n" . " \n" . " ENDDO\n" . " !print *,'at 3 for J=',J,' thread=',omp_get_thread_num()\n" . " ! Save latitude slice QTMP back into global Q array\n" . " DO N = 1, NTRACE\n" . " DO L = 1, LLPAR\n" . " DO I = 1, IIPAR\n" . " ADQ(I,J,L,N) = ADQTMP(I,L,N)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . "c!==========================================================\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE FVDAS_CONVECT_ADJ\n" . "\n" . "!-----------------------------------------------------------------------\n" . "C\n" . " subroutine adhack_conv( tdt, rpdel, eta, beta, ntrace, q, adq )\n" . "C***************************************************************\n" . "C***************************************************************\n" . "C** This routine was generated by the **\n" . "C** Tangent linear and Adjoint Model Compiler, TAMC 5.3.2 **\n" . "C***************************************************************\n" . "C***************************************************************\n" . "C==============================================\n" . "C all entries are defined explicitly\n" . "C==============================================\n" . " implicit none\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NTRACE\n" . " REAL*8, INTENT(IN) :: TDT\n" . " REAL*8, INTENT(IN) :: RPDEL(IIPAR,LLPAR)\n" . " REAL*8, INTENT(IN) :: ETA(IIPAR,LLPAR)\n" . " REAL*8, INTENT(IN) :: BETA(IIPAR,LLPAR)\n" . " REAL*8, INTENT(INOUT) :: Q(IIPAR,LLPAR,NTRACE)\n" . " REAL*8, INTENT(INOUT) :: ADQ(IIPAR,LLPAR,NTRACE)\n" . "\n" . "C==============================================\n" . "C define local variables\n" . "C==============================================\n" . " double precision tmp(iipar,llpar,ntrace)\n" . " double precision adbotflx\n" . " double precision adcmrc(iipar)\n" . " double precision adcmrh(iipar,llpar+1)\n" . " double precision addcmr1(iipar)\n" . " double precision addcmr2(iipar)\n" . " double precision addcmr3(iipar)\n" . " double precision adefac1\n" . " double precision adefac2\n" . " double precision adefac3\n" . " double precision adjfac\n" . " double precision adt1\n" . " double precision adtopflx\n" . " double precision botflx\n" . " double precision cmrc(iipar)\n" . " double precision cmrh(iipar,llpar+1)\n" . " double precision dcmr1(iipar)\n" . " double precision dcmr2(iipar)\n" . " double precision dcmr3(iipar)\n" . " double precision efac1\n" . " double precision efac2\n" . " double precision efac3\n" . " double precision etagdt(iipar)\n" . " integer i\n" . " integer ii\n" . " integer ii2\n" . " integer indx1(iipar)\n" . " integer indx1h(iipar)\n" . " integer ip1\n" . " integer ip2\n" . " integer k\n" . " integer k2\n" . " integer len1\n" . " integer m\n" . " double precision t1\n" . " double precision temp\n" . " double precision topflx\n" . "\n" . "C----------------------------------------------\n" . "C RESET LOCAL ADJOINT VARIABLES\n" . "C----------------------------------------------\n" . " adbotflx = 0.d0\n" . " do ip1 = 1, iipar\n" . " adcmrc(ip1) = 0.d0\n" . " end do\n" . " do ip2 = 1, llpar+1\n" . " do ip1 = 1, iipar\n" . " adcmrh(ip1,ip2) = 0.d0\n" . " end do\n" . " end do\n" . " do ip1 = 1, iipar\n" . " addcmr1(ip1) = 0.d0\n" . " end do\n" . " do ip1 = 1, iipar\n" . " addcmr2(ip1) = 0.d0\n" . " end do\n" . " do ip1 = 1, iipar\n" . " addcmr3(ip1) = 0.d0\n" . " end do\n" . " adefac1 = 0.d0\n" . " adefac2 = 0.d0\n" . " adefac3 = 0.d0\n" . " adt1 = 0.d0\n" . " adtopflx = 0.d0\n" . "\n" . "C----------------------------------------------\n" . "C ROUTINE BODY\n" . "C----------------------------------------------\n" . "C----------------------------------------------\n" . "C FUNCTION AND TAPE COMPUTATIONS\n" . "C----------------------------------------------\n" . " if (tdt .gt. cmftau) then\n" . " temp = tdt\n" . " else\n" . " temp = cmftau\n" . " endif\n" . " if (rlxclm) then\n" . " adjfac = tdt/temp\n" . " else\n" . " adjfac = 1.d0\n" . " endif\n" . "\n" . "C----------------------------------------------\n" . "C ADJOINT COMPUTATIONS\n" . "C----------------------------------------------\n" . " do k = limcnv+1, llpar-1\n" . " len1 = 0\n" . " do i = 1, iipar\n" . " if (eta(i,k) .ne. 0.) then\n" . " etagdt(i) = eta(i,k)*grav*tdt*0.01d0\n" . " len1 = len1+1\n" . " indx1(len1) = i\n" . " else\n" . " etagdt(i) = 0.d0\n" . " endif\n" . " end do\n" . "\n" . " if (len1 .le. 0) then\n" . " else\n" . " do m = ntrace, 1, -1\n" . " do ii = len1, 1, -1\n" . " i = indx1(ii)\n" . " IF(i>72)THEN\n" . " PRINT*,len1,ii,i,indx1(1:10)\n" . " stop\n" . " ENDIF\n" . " if (q(i,k+1,m) .lt. 0. .or. q(i,k,m) .lt. 0. .or. q(i,k-1,\n" . " \$m) .lt. 0.) then\n" . " else\n" . " cmrh(i,k) = 0.5d0*(q(i,k-1,m)+q(i,k,m))\n" . " cmrh(i,k+1) = 0.5d0*(q(i,k,m)+q(i,k+1,m))\n" . " cmrc(i) = q(i,k+1,m)\n" . " botflx = etagdt(i)*(cmrc(i)-cmrh(i,k+1))*adjfac\n" . " topflx = beta(i,k)*etagdt(i)*(cmrc(i)-cmrh(i,k))*adjfac\n" . " dcmr1(i) = -(botflx*rpdel(i,k+1))\n" . " efac1 = 1.d0\n" . " efac2 = 1.d0\n" . " efac3 = 1.d0\n" . " if (q(i,k+1,m)+dcmr1(i) .lt. 0.) then\n" . " t1 = q(i,k+1,m)/dcmr1(i)\n" . " if (t1 .lt. 0.) then\n" . " t1 = -t1\n" . " endif\n" . " t1 = t1-eps\n" . " if (tinyalt .gt. t1) then\n" . " efac1 = tinyalt\n" . " else\n" . " efac1 = t1\n" . " endif\n" . " endif\n" . " if (efac1 .eq. tinyalt .or. efac1 .gt. 1.) then\n" . " efac1 = 0.d0\n" . " endif\n" . " dcmr2(i) = (efac1*botflx-topflx)*rpdel(i,k)\n" . " if (q(i,k,m)+dcmr2(i) .lt. 0.) then\n" . " t1 = q(i,k,m)/dcmr2(i)\n" . " if (t1 .lt. 0.) then\n" . " t1 = -t1\n" . " endif\n" . " t1 = t1-eps\n" . " if (tinyalt .gt. t1) then\n" . " efac2 = tinyalt\n" . " else\n" . " efac2 = t1\n" . " endif\n" . " endif\n" . " if (efac2 .eq. tinyalt .or. efac2 .gt. 1.) then\n" . " efac2 = 0.d0\n" . " endif\n" . " dcmr3(i) = efac2*topflx*rpdel(i,k-1)\n" . " if (q(i,k-1,m)+dcmr3(i) .lt. 0.) then\n" . " t1 = q(i,k-1,m)/dcmr3(i)\n" . " if (t1 .lt. 0.) then\n" . " t1 = -t1\n" . " endif\n" . " t1 = t1-eps\n" . " if (tinyalt .gt. t1) then\n" . " efac3 = tinyalt\n" . " else\n" . " efac3 = t1\n" . " endif\n" . " endif\n" . " if (efac3 .eq. tinyalt .or. efac3 .gt. 1.) then\n" . " efac3 = 0.d0\n" . " endif\n" . " if (efac2 .gt. efac3) then\n" . " efac3 = efac2\n" . " endif\n" . " addcmr3(i) = addcmr3(i)+adq(i,k-1,m)\n" . " addcmr2(i) = addcmr2(i)+adq(i,k,m)\n" . " addcmr1(i) = addcmr1(i)+adq(i,k+1,m)\n" . " adefac3 = adefac3+addcmr3(i)*topflx*rpdel(i,k-1)\n" . " adtopflx = adtopflx+addcmr3(i)*efac3*rpdel(i,k-1)\n" . " addcmr3(i) = 0.d0\n" . " adbotflx = adbotflx+addcmr2(i)*efac1*rpdel(i,k)\n" . " adefac1 = adefac1+addcmr2(i)*botflx*rpdel(i,k)\n" . " adefac3 = adefac3-addcmr2(i)*topflx*rpdel(i,k)\n" . " adtopflx = adtopflx-addcmr2(i)*efac3*rpdel(i,k)\n" . " addcmr2(i) = 0.d0\n" . " efac3 = 1.d0\n" . " if (q(i,k-1,m)+dcmr3(i) .lt. 0.) then\n" . " t1 = q(i,k-1,m)/dcmr3(i)\n" . " if (t1 .lt. 0.) then\n" . " t1 = -t1\n" . " endif\n" . " t1 = t1-eps\n" . " if (tinyalt .gt. t1) then\n" . " efac3 = tinyalt\n" . " else\n" . " efac3 = t1\n" . " endif\n" . " endif\n" . " if (efac3 .eq. tinyalt .or. efac3 .gt. 1.) then\n" . " efac3 = 0.d0\n" . " endif\n" . " if (efac2 .gt. efac3) then\n" . " adefac2 = adefac2+adefac3\n" . " adefac3 = 0.d0\n" . " endif\n" . " efac3 = 1.d0\n" . " if (q(i,k-1,m)+dcmr3(i) .lt. 0.) then\n" . " t1 = q(i,k-1,m)/dcmr3(i)\n" . " if (t1 .lt. 0.) then\n" . " t1 = -t1\n" . " endif\n" . " t1 = t1-eps\n" . " if (tinyalt .gt. t1) then\n" . " efac3 = tinyalt\n" . " else\n" . " efac3 = t1\n" . " endif\n" . " endif\n" . " if (efac3 .eq. tinyalt .or. efac3 .gt. 1.) then\n" . " adefac3 = 0.d0\n" . " endif\n" . " if (q(i,k-1,m)+dcmr3(i) .lt. 0.) then\n" . " if (tinyalt .gt. t1) then\n" . " adefac3 = 0.d0\n" . " else\n" . " adt1 = adt1+adefac3\n" . " adefac3 = 0.d0\n" . " endif\n" . " t1 = q(i,k-1,m)/dcmr3(i)\n" . " if (t1 .lt. 0.) then\n" . " adt1 = -adt1\n" . " endif\n" . " addcmr3(i) = addcmr3(i)-adt1*(q(i,k-1,m)/(dcmr3(i)*\n" . " \$dcmr3(i)))\n" . " adq(i,k-1,m) = adq(i,k-1,m)+adt1/dcmr3(i)\n" . " adt1 = 0.d0\n" . " endif\n" . " adefac2 = adefac2+addcmr3(i)*topflx*rpdel(i,k-1)\n" . " adtopflx = adtopflx+addcmr3(i)*efac2*rpdel(i,k-1)\n" . " addcmr3(i) = 0.d0\n" . " adbotflx = adbotflx+addcmr2(i)*efac1*rpdel(i,k)\n" . " adefac1 = adefac1+addcmr2(i)*botflx*rpdel(i,k)\n" . " adefac2 = adefac2-addcmr2(i)*topflx*rpdel(i,k)\n" . " adtopflx = adtopflx-addcmr2(i)*efac2*rpdel(i,k)\n" . " addcmr2(i) = 0.d0\n" . " efac2 = 1.d0\n" . " if (q(i,k,m)+dcmr2(i) .lt. 0.) then\n" . " t1 = q(i,k,m)/dcmr2(i)\n" . " if (t1 .lt. 0.) then\n" . " t1 = -t1\n" . " endif\n" . " t1 = t1-eps\n" . " if (tinyalt .gt. t1) then\n" . " efac2 = tinyalt\n" . " else\n" . " efac2 = t1\n" . " endif\n" . " endif\n" . " if (efac2 .eq. tinyalt .or. efac2 .gt. 1.) then\n" . " adefac2 = 0.d0\n" . " endif\n" . " if (q(i,k,m)+dcmr2(i) .lt. 0.) then\n" . " if (tinyalt .gt. t1) then\n" . " adefac2 = 0.d0\n" . " else\n" . " adt1 = adt1+adefac2\n" . " adefac2 = 0.d0\n" . " endif\n" . " t1 = q(i,k,m)/dcmr2(i)\n" . " if (t1 .lt. 0.) then\n" . " adt1 = -adt1\n" . " endif\n" . " addcmr2(i) = addcmr2(i)-adt1*(q(i,k,m)/(dcmr2(i)*\n" . " \$dcmr2(i)))\n" . " adq(i,k,m) = adq(i,k,m)+adt1/dcmr2(i)\n" . " adt1 = 0.d0\n" . " endif\n" . " adbotflx = adbotflx+addcmr2(i)*efac1*rpdel(i,k)\n" . " adefac1 = adefac1+addcmr2(i)*botflx*rpdel(i,k)\n" . " adtopflx = adtopflx-addcmr2(i)*rpdel(i,k)\n" . " addcmr2(i) = 0.d0\n" . " adbotflx = adbotflx-addcmr1(i)*efac1*rpdel(i,k+1)\n" . " adefac1 = adefac1-addcmr1(i)*botflx*rpdel(i,k+1)\n" . " addcmr1(i) = 0.d0\n" . " efac1 = 1.d0\n" . " if (q(i,k+1,m)+dcmr1(i) .lt. 0.) then\n" . " t1 = q(i,k+1,m)/dcmr1(i)\n" . " if (t1 .lt. 0.) then\n" . " t1 = -t1\n" . " endif\n" . " t1 = t1-eps\n" . " if (tinyalt .gt. t1) then\n" . " efac1 = tinyalt\n" . " else\n" . " efac1 = t1\n" . " endif\n" . " endif\n" . " if (efac1 .eq. tinyalt .or. efac1 .gt. 1.) then\n" . " adefac1 = 0.d0\n" . " endif\n" . " if (q(i,k+1,m)+dcmr1(i) .lt. 0.) then\n" . " if (tinyalt .gt. t1) then\n" . " adefac1 = 0.d0\n" . " else\n" . " adt1 = adt1+adefac1\n" . " adefac1 = 0.d0\n" . " endif\n" . " t1 = q(i,k+1,m)/dcmr1(i)\n" . " if (t1 .lt. 0.) then\n" . " adt1 = -adt1\n" . " endif\n" . " addcmr1(i) = addcmr1(i)-adt1*(q(i,k+1,m)/(dcmr1(i)*\n" . " \$dcmr1(i)))\n" . " adq(i,k+1,m) = adq(i,k+1,m)+adt1/dcmr1(i)\n" . " adt1 = 0.d0\n" . " endif\n" . " adefac3 = 0.d0\n" . " adefac2 = 0.d0\n" . " adefac1 = 0.d0\n" . " adbotflx = adbotflx-addcmr1(i)*rpdel(i,k+1)\n" . " addcmr1(i) = 0.d0\n" . " adcmrc(i) = adcmrc(i)+adtopflx*beta(i,k)*etagdt(i)*\n" . " \$adjfac\n" . " adcmrh(i,k) = adcmrh(i,k)-adtopflx*beta(i,k)*etagdt(i)*\n" . " \$adjfac\n" . " adtopflx = 0.d0\n" . " adcmrc(i) = adcmrc(i)+adbotflx*etagdt(i)*adjfac\n" . " adcmrh(i,k+1) = adcmrh(i,k+1)-adbotflx*etagdt(i)*adjfac\n" . " adbotflx = 0.d0\n" . " adq(i,k+1,m) = adq(i,k+1,m)+adcmrc(i)\n" . " adcmrc(i) = 0.d0\n" . " adq(i,k+1,m) = adq(i,k+1,m)+0.5d0*adcmrh(i,k+1)\n" . " adq(i,k,m) = adq(i,k,m)+0.5d0*adcmrh(i,k+1)\n" . " adcmrh(i,k+1) = 0.d0\n" . " adq(i,k-1,m) = adq(i,k-1,m)+0.5d0*adcmrh(i,k)\n" . " adq(i,k,m) = adq(i,k,m)+0.5d0*adcmrh(i,k)\n" . " adcmrh(i,k) = 0.d0\n" . " endif\n" . " end do\n" . " end do\n" . " endif\n" . " end do\n" . "\n" . " end subroutine adhack_conv\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " subroutine hack_conv_adj( tdt, rpdel, eta, beta, ntrace, q, adq )\n" . "\n" . "C***************************************************************\n" . "C***************************************************************\n" . "C** This routine was generated by the **\n" . "C** Tangent linear and Adjoint Model Compiler, TAMC 5.3.2 **\n" . "C***************************************************************\n" . "C***************************************************************\n" . "!\n" . "C==============================================\n" . "C all entries are defined explicitly\n" . "C==============================================\n" . " implicit none\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NTRACE\n" . " REAL*8, INTENT(IN) :: TDT\n" . " REAL*8, INTENT(IN) :: RPDEL(IIPAR,LLPAR)\n" . " REAL*8, INTENT(IN) :: ETA(IIPAR,LLPAR)\n" . " REAL*8, INTENT(IN) :: BETA(IIPAR,LLPAR)\n" . " REAL*8, INTENT(IN) :: Q(IIPAR,LLPAR,NTRACE)\n" . " REAL*8, INTENT(INOUT) :: ADQ(IIPAR,LLPAR,NTRACE)\n" . "\n" . " ! Local variables\n" . " INTEGER :: I, K, M\n" . " REAL*8 :: ADJFAC, BOTFLX, TOPFLX \n" . " REAL*8 :: EFAC1, EFAC2, EFAC3\n" . " REAL*8 :: TMP(IIPAR,LLPAR,NTRACE)\n" . "\n" . "\n" . "\n" . "C==============================================\n" . "C define local variables\n" . "C==============================================\n" . " real*8 adbotflx\n" . " real*8 adcmrc\n" . " real*8 adcmrh(iipar,llpar+1)\n" . " real*8 addcmr1\n" . " real*8 addcmr2\n" . " real*8 addcmr3\n" . " real*8 adefac1\n" . " real*8 adefac2\n" . " real*8 adefac3\n" . " real*8 adt1\n" . " real*8 adtopflx\n" . " real*8 cmrc\n" . " real*8 cmrh(iipar,llpar+1)\n" . " real*8 dcmr1\n" . " real*8 dcmr2\n" . " real*8 dcmr3\n" . " real eps\n" . " real*8 etagdt\n" . " real grav\n" . " integer ii,ii2\n" . " integer indx1(iipar)\n" . " integer indx1h(iipar)\n" . " integer ip1\n" . " integer ip2\n" . " integer k2\n" . " integer len1\n" . " real*8 t1\n" . " real*8 temp\n" . "\n" . "C----------------------------------------------\n" . "C RESET LOCAL ADJOINT VARIABLES\n" . "C----------------------------------------------\n" . " adbotflx = 0.d0\n" . " adcmrc = 0.d0\n" . " do ip2 = 1, llpar+1\n" . " do ip1 = 1, iipar\n" . " adcmrh(ip1,ip2) = 0.d0\n" . " end do\n" . " end do\n" . " addcmr1 = 0.d0\n" . " addcmr2 = 0.d0\n" . " addcmr3 = 0.d0\n" . " adefac1 = 0.d0\n" . " adefac2 = 0.d0\n" . " adefac3 = 0.d0\n" . " adt1 = 0.d0\n" . " adtopflx = 0.d0\n" . "\n" . "C----------------------------------------------\n" . "C ROUTINE BODY\n" . "C----------------------------------------------\n" . " IF ( RLXCLM ) THEN\n" . " ADJFAC = TDT / ( MAX( TDT, CMFTAU ) )\n" . " ELSE\n" . " ADJFAC = 1d0\n" . " ENDIF\n" . " do m = ntrace, 1, -1\n" . " do k = limcnv+1, llpar-1\n" . " do i = iipar, 1, -1\n" . " etagdt = 0.d0\n" . " if (eta(i,k) .gt. 0.d0) then\n" . " etagdt = eta(i,k)*grav*tdt*0.01d0\n" . " endif\n" . " cmrh(i,k) = 0.5d0*(q(i,k-1,m)+q(i,k,m))\n" . " cmrh(i,k+1) = 0.5d0*(q(i,k,m)+q(i,k+1,m))\n" . " cmrc = q(i,k+1,m)\n" . " botflx = etagdt*(cmrc-cmrh(i,k+1))*adjfac\n" . " topflx = beta(i,k)*etagdt*(cmrc-cmrh(i,k))*adjfac\n" . " dcmr1 = -(botflx*rpdel(i,k+1))\n" . " efac1 = 1.d0\n" . " efac2 = 1.d0\n" . " efac3 = 1.d0\n" . " \n" . " ! K+1th level\n" . " IF ( Q(I,K+1,M) + DCMR1 < 0d0 ) THEN\n" . " EFAC1 = MAX( TINYALT, ABS( Q(I,K+1,M)/DCMR1 ) - EPS)\n" . " ENDIF\n" . "\n" . " IF ( EFAC1 == TINYALT .or. EFAC1 > 1d0 ) EFAC1 = 0d0\n" . "\n" . " dcmr2 = (efac1*botflx-topflx)*rpdel(i,k)\n" . " ! Kth level\n" . " IF ( Q(I,K,M) + DCMR2 < 0d0 ) THEN\n" . " EFAC2 = MAX( TINYALT, ABS( Q(I,K,M)/DCMR2 ) - EPS )\n" . " ENDIF\n" . " \n" . " IF ( EFAC2 == TINYALT .or. EFAC2 > 1d0 ) EFAC2 = 0d0\n" . "\n" . " dcmr3 = efac2*topflx*rpdel(i,k-1)\n" . " ! K-1th level\n" . " IF ( Q(I,K-1,M) + DCMR3 < 0d0 ) THEN\n" . " EFAC3 = MAX( TINYALT, ABS( Q(I,K-1,M)/DCMR3 ) - EPS)\n" . " ENDIF\n" . " \n" . " IF ( EFAC3 == TINYALT .or. EFAC3 > 1d0 ) EFAC3 = 0d0\n" . " EFAC3 = MIN( EFAC2, EFAC3 )\n" . "\n" . " addcmr3 = addcmr3+adq(i,k-1,m)\n" . " addcmr2 = addcmr2+adq(i,k,m)\n" . " addcmr1 = addcmr1+adq(i,k+1,m)\n" . " adefac3 = adefac3+addcmr3*topflx*rpdel(i,k-1)\n" . " adtopflx = adtopflx+addcmr3*efac3*rpdel(i,k-1)\n" . " addcmr3 = 0.d0\n" . " adbotflx = adbotflx+addcmr2*efac1*rpdel(i,k)\n" . " adefac1 = adefac1+addcmr2*botflx*rpdel(i,k)\n" . " adefac3 = adefac3-addcmr2*topflx*rpdel(i,k)\n" . " adtopflx = adtopflx-addcmr2*efac3*rpdel(i,k)\n" . " addcmr2 = 0.d0\n" . " efac3 = 1.d0\n" . " ! K-1th level\n" . " IF ( Q(I,K-1,M) + DCMR3 < 0d0 ) THEN\n" . " EFAC3 = MAX( TINYALT, ABS( Q(I,K-1,M)/DCMR3 ) - EPS)\n" . " ENDIF\n" . " \n" . " IF ( EFAC3 == TINYALT .or. EFAC3 > 1d0 ) EFAC3 = 0d0\n" . "\n" . " if (efac2 .gt. efac3) then\n" . " adefac2 = adefac2+adefac3\n" . " adefac3 = 0.d0\n" . " endif\n" . " efac3 = 1.d0\n" . " ! K-1th level\n" . " IF ( Q(I,K-1,M) + DCMR3 < 0d0 ) THEN\n" . " EFAC3 = MAX( TINYALT, ABS( Q(I,K-1,M)/DCMR3 ) - EPS)\n" . " ENDIF\n" . " \n" . " if (efac3 .eq. tinyalt .or. efac3 .gt. 1.d0) then\n" . " adefac3 = 0.d0\n" . " endif\n" . " if (q(i,k-1,m)+dcmr3 .lt. 0.) then\n" . " if (tinyalt .gt. t1) then\n" . " adefac3 = 0.d0\n" . " else\n" . " adt1 = adt1+adefac3\n" . " adefac3 = 0.d0\n" . " endif\n" . " t1 = q(i,k-1,m)/dcmr3\n" . " if (t1 .lt. 0.) then\n" . " adt1 = -adt1\n" . " endif\n" . " addcmr3 = addcmr3-adt1*(q(i,k-1,m)/(dcmr3*dcmr3))\n" . " adq(i,k-1,m) = adq(i,k-1,m)+adt1/dcmr3\n" . " adt1 = 0.d0\n" . " endif\n" . " adefac2 = adefac2+addcmr3*topflx*rpdel(i,k-1)\n" . " adtopflx = adtopflx+addcmr3*efac2*rpdel(i,k-1)\n" . " addcmr3 = 0.d0\n" . " efac2 = 1.d0\n" . " ! Kth level\n" . " IF ( Q(I,K,M) + DCMR2 < 0d0 ) THEN\n" . " EFAC2 = MAX( TINYALT, ABS( Q(I,K,M)/DCMR2 ) - EPS )\n" . " ENDIF\n" . "\n" . " if (efac2 .eq. tinyalt .or. efac2 .gt. 1.d0) then\n" . " adefac2 = 0.d0\n" . " endif\n" . " if (q(i,k,m)+dcmr2 .lt. 0.) then\n" . " if (tinyalt .gt. t1) then\n" . " adefac2 = 0.d0\n" . " else\n" . " adt1 = adt1+adefac2\n" . " adefac2 = 0.d0\n" . " endif\n" . " t1 = q(i,k,m)/dcmr2\n" . " if (t1 .lt. 0.) then\n" . " adt1 = -adt1\n" . " endif\n" . " addcmr2 = addcmr2-adt1*(q(i,k,m)/(dcmr2*dcmr2))\n" . " adq(i,k,m) = adq(i,k,m)+adt1/dcmr2\n" . " adt1 = 0.d0\n" . " endif\n" . " adbotflx = adbotflx+addcmr2*efac1*rpdel(i,k)\n" . " adefac1 = adefac1+addcmr2*botflx*rpdel(i,k)\n" . " adtopflx = adtopflx-addcmr2*rpdel(i,k)\n" . " addcmr2 = 0.d0\n" . " adbotflx = adbotflx-addcmr1*efac1*rpdel(i,k+1)\n" . " adefac1 = adefac1-addcmr1*botflx*rpdel(i,k+1)\n" . " addcmr1 = 0.d0\n" . " efac1 = 1.d0\n" . "\n" . " ! K+1th level\n" . " IF ( Q(I,K+1,M) + DCMR1 < 0d0 ) THEN\n" . " EFAC1 = MAX( TINYALT, ABS( Q(I,K+1,M)/DCMR1 ) - EPS)\n" . " ENDIF\n" . "\n" . " if (efac1 .eq. tinyalt .or. efac1 .gt. 1.d0) then\n" . " adefac1 = 0.d0\n" . " endif\n" . " if (q(i,k+1,m)+dcmr1 .lt. 0.) then\n" . " if (tinyalt .gt. t1) then\n" . " adefac1 = 0.d0\n" . " else\n" . " adt1 = adt1+adefac1\n" . " adefac1 = 0.d0\n" . " endif\n" . " t1 = q(i,k+1,m)/dcmr1\n" . " if (t1 .lt. 0.) then\n" . " adt1 = -adt1\n" . " endif\n" . " addcmr1 = addcmr1-adt1*(q(i,k+1,m)/(dcmr1*dcmr1))\n" . " adq(i,k+1,m) = adq(i,k+1,m)+adt1/dcmr1\n" . " adt1 = 0.d0\n" . " endif\n" . " adefac3 = 0.d0\n" . " adefac2 = 0.d0\n" . " adefac1 = 0.d0\n" . " adbotflx = adbotflx-addcmr1*rpdel(i,k+1)\n" . " addcmr1 = 0.d0\n" . " adcmrc = adcmrc+adtopflx*beta(i,k)*etagdt*adjfac\n" . " adcmrh(i,k) = adcmrh(i,k)-adtopflx*beta(i,k)*etagdt*\n" . " & adjfac\n" . " adtopflx = 0.d0\n" . " adcmrc = adcmrc+adbotflx*etagdt*adjfac\n" . " adcmrh(i,k+1) = adcmrh(i,k+1)-adbotflx*etagdt*adjfac\n" . " adbotflx = 0.d0\n" . " adq(i,k+1,m) = adq(i,k+1,m)+adcmrc\n" . " adcmrc = 0.d0\n" . " adq(i,k+1,m) = adq(i,k+1,m)+0.5d0*adcmrh(i,k+1)\n" . " adq(i,k,m) = adq(i,k,m)+0.5d0*adcmrh(i,k+1)\n" . " adcmrh(i,k+1) = 0.d0\n" . " adq(i,k-1,m) = adq(i,k-1,m)+0.5d0*adcmrh(i,k)\n" . " adq(i,k,m) = adq(i,k,m)+0.5d0*adcmrh(i,k)\n" . " adcmrh(i,k) = 0.d0\n" . " end do\n" . " end do\n" . " adcmrh(:,:) = 0.d0\n" . " end do\n" . "\n" . " end subroutine hack_conv_adj\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE CONVTRAN_ADJ( NTRACE, Q, MU, MD, DU,\n" . " & EU, ED, DP, DSUBCLD, JT, \n" . " & MX, IDEEP, IL1G, IL2G, NSTEP, \n" . " & DELT, FRACIS, TCVV, INDEXSOL, LATI_INDEX,\n" . " & ADQ)\n" . "! \n" . "!******************************************************************************\n" . "!\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"CMN_DIAG\" ! ND38, LD38\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NTRACE \n" . " INTEGER, INTENT(IN) :: JT(IIPAR) \n" . " INTEGER, INTENT(IN) :: MX(IIPAR) \n" . " INTEGER, INTENT(IN) :: IDEEP(IIPAR) \n" . " INTEGER, INTENT(IN) :: IL1G \n" . " INTEGER, INTENT(IN) :: IL2G \n" . " INTEGER, INTENT(IN) :: NSTEP \n" . " REAL*8, INTENT(INOUT) :: Q(IIPAR,LLPAR,NTRACE) \n" . " REAL*8, INTENT(INOUT) :: ADQ(IIPAR,LLPAR,NTRACE) \n" . " REAL*8, INTENT(IN) :: MU(IIPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: MD(IIPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: DU(IIPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: EU(IIPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: ED(IIPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: DP(IIPAR,LLPAR) \n" . " REAL*8, INTENT(IN) :: DSUBCLD(IIPAR) \n" . " REAL*8, INTENT(IN) :: DELT \n" . " REAL*8, INTENT(IN) :: FRACIS(IIPAR,LLPAR,NTRACE) \n" . " REAL*8, INTENT(IN) :: TCVV(NTRACE)\n" . " INTEGER, INTENT(IN) :: INDEXSOL(NTRACE)\n" . " INTEGER, INTENT(IN) :: LATI_INDEX\n" . "\n" . " ! Local variables\n" . " INTEGER :: I, K, KBM, KK, KKP1\n" . " INTEGER :: KM1, KP1, KTM, M, ISTEP\n" . " INTEGER :: II, JJ, LL, NN\n" . " REAL*8 :: CABV, CBEL, CDIFR, CD2, DENOM\n" . " REAL*8 :: SMALL, MBSTH, MUPDUDP, MINC, MAXC\n" . " REAL*8 :: QN, FLUXIN, FLUXOUT, NETFLUX \n" . " REAL*8 :: CHAT(IIPAR,LLPAR) \n" . " REAL*8 :: COND(IIPAR,LLPAR) \n" . " REAL*8 :: CMIX(IIPAR,LLPAR) \n" . " REAL*8 :: FISG(IIPAR,LLPAR) \n" . " REAL*8 :: CONU(IIPAR,LLPAR) \n" . " REAL*8 :: DCONDT(IIPAR,LLPAR) \n" . "\n" . " integer ip1,ip2,m1\n" . " real*8 adcabv\n" . " real*8 adcbel\n" . " real*8 adcdifr\n" . " real*8 adchat(iipar,llpar)\n" . " real*8 adcmix(iipar,llpar)\n" . " real*8 adcond(iipar,llpar)\n" . " real*8 adconu(iipar,llpar)\n" . " real*8 addcondt(iipar,llpar)\n" . " real*8 adfluxin\n" . " real*8 adfluxout\n" . " real*8 admaxc\n" . " real*8 adminc\n" . " real*8 adnetflux\n" . " real*8 adqn\n" . " real*8 adtmp\n" . " real*8 tmp\n" . " double precision adconuh\n" . " double precision adcondh\n" . " double precision qtmp(iipar,llpar,ntrace)\n" . "\n" . "C----------------------------------------------\n" . "C RESET LOCAL ADJOINT VARIABLES\n" . "C----------------------------------------------\n" . " adcabv = 0.\n" . " adcbel = 0.\n" . " adcdifr = 0.\n" . " do ip2 = 1, llpar\n" . " do ip1 = 1, iipar\n" . " adchat(ip1,ip2) = 0.\n" . " end do\n" . " end do\n" . " do ip2 = 1, llpar\n" . " do ip1 = 1, iipar\n" . " adcmix(ip1,ip2) = 0.\n" . " end do\n" . " end do\n" . " do ip2 = 1, llpar\n" . " do ip1 = 1, iipar\n" . " adcond(ip1,ip2) = 0.\n" . " end do\n" . " end do\n" . " do ip2 = 1, llpar\n" . " do ip1 = 1, iipar\n" . " adconu(ip1,ip2) = 0.\n" . " end do\n" . " end do\n" . " do ip2 = 1, llpar\n" . " do ip1 = 1, iipar\n" . " addcondt(ip1,ip2) = 0.\n" . " end do\n" . " end do\n" . " adfluxin = 0.\n" . " adfluxout = 0.\n" . " admaxc = 0.\n" . " adminc = 0.\n" . " adnetflux = 0.\n" . " adqn = 0.\n" . " adtmp = 0.\n" . "\n" . " !=================================================================\n" . " ! CONVTRAN begins here!\n" . " !=================================================================\n" . "\n" . " ! A small number\n" . " SMALL = 1.d-36\n" . "\n" . " ! Threshold below which we treat the mass fluxes as zero (in mb/s)\n" . " MBSTH = 1.d-15\n" . "\n" . " !=================================================================\n" . " ! Find the highest level top and bottom levels of convection\n" . " !=================================================================\n" . " KTM = LLPAR\n" . " KBM = LLPAR\n" . " DO I = IL1G, IL2G\n" . " KTM = MIN( KTM, JT(I) )\n" . " KBM = MIN( KBM, MX(I) )\n" . " ENDDO\n" . "\n" . " ! Loop ever each tracer\n" . " DO M = NTRACE,1,-1\n" . " do k = 1, llpar\n" . " do i = il1g, il2g\n" . " cmix(i,k) = q(ideep(i),k,m)\n" . " if (cmix(i,k) .lt. 4.d0*smallest) then\n" . " cmix(i,k) = 0.d0\n" . " endif\n" . " fisg(i,k) = fracis(ideep(i),k,m)\n" . " end do\n" . " end do\n" . " do k = 1, llpar \n" . " KM1 = MAX( 1, K-1 )\n" . " do i = il1g, il2g\n" . " MINC = MIN( CMIX(I,KM1), CMIX(I,K) )\n" . " MAXC = MAX( CMIX(I,KM1), CMIX(I,K) )\n" . " \n" . " IF ( MINC < 0d0 ) THEN \n" . " CDIFR = 0.d0\n" . " ELSE\n" . " CDIFR = ABS( CMIX(I,K)-CMIX(I,KM1) ) / MAX(MAXC,SMALL)\n" . " ENDIF\n" . " \n" . " IF ( CDIFR > 1.d-6 ) THEN\n" . " \n" . " ! If the two layers differ significantly.\n" . " ! use a geometric averaging procedure\n" . " CABV = MAX( CMIX(I,KM1), MAXC*TINYNUM, SMALLEST )\n" . " CBEL = MAX( CMIX(I,K), MAXC*TINYNUM, SMALLEST )\n" . " \n" . " CHAT(I,K) = LOG( CABV / CBEL)\n" . " & / ( CABV - CBEL)\n" . " & * CABV * CBEL\n" . " \n" . " ELSE \n" . " \n" . " ! Small diff, so just arithmetic mean\n" . " CHAT(I,K) = 0.5d0 * ( CMIX(I,K) + CMIX(I,KM1) )\n" . " ENDIF\n" . "\n" . " conu(i,k) = chat(i,k)\n" . " cond(i,k) = chat(i,k)\n" . " dcondt(i,k) = 0.d0\n" . " end do\n" . " end do\n" . " k = 2\n" . " km1 = 1\n" . " kk = llpar\n" . " do i = il1g, il2g\n" . " mupdudp = mu(i,kk)+du(i,kk)*dp(i,kk)\n" . " if (mupdudp .gt. mbsth) then\n" . " conu(i,kk) = eu(i,kk)*cmix(i,kk)*dp(i,kk)/mupdudp\n" . " endif\n" . " if (md(i,k) .lt. (-mbsth)) then\n" . " cond(i,k) = (-(ed(i,km1)*cmix(i,km1)*dp(i,km1)))/md(i,k)\n" . " endif\n" . " end do\n" . " do kk = llpar-1, 1, -1\n" . " if (llpar .gt. kk+1) then\n" . " kkp1 = kk+1\n" . " else\n" . " kkp1 = llpar\n" . " endif\n" . " do i = il1g, il2g\n" . " mupdudp = mu(i,kk)+du(i,kk)*dp(i,kk)\n" . " if (mupdudp .gt. mbsth) then\n" . " conu(i,kk) = (mu(i,kkp1)*conu(i,kkp1)*fisg(i,kk)+eu(i,kk)*\n" . " \$cmix(i,kk)*dp(i,kk))/mupdudp\n" . " endif\n" . " end do\n" . " end do\n" . " do k = 3, llpar\n" . " KM1 = MAX( 1, K-1 )\n" . " do i = il1g, il2g\n" . " if (md(i,k) .lt. (-mbsth)) then\n" . " cond(i,k) = (md(i,km1)*cond(i,km1)-ed(i,km1)*cmix(i,km1)*\n" . " \$dp(i,km1))/md(i,k)\n" . " endif\n" . " end do\n" . " end do\n" . " do k = ktm, llpar\n" . " KM1 = MAX( 1, K-1 )\n" . " KP1 = MIN( LLPAR, K+1 )\n" . " do i = il1g, il2g\n" . " fluxin = mu(i,kp1)*conu(i,kp1)*fisg(i,k)+(mu(i,k)+md(i,k))*\n" . " \$cmix(i,km1)-md(i,k)*cond(i,k)\n" . " fluxout = mu(i,k)*conu(i,k)+(mu(i,kp1)+md(i,kp1))*cmix(i,k)-\n" . " \$md(i,kp1)*cond(i,kp1)\n" . " netflux = fluxin-fluxout\n" . "\n" . " IF ( ABS(NETFLUX) < MAX(FLUXIN,FLUXOUT)*TINYNUM) THEN\n" . " NETFLUX = 0.D0\n" . " ENDIF\n" . "\n" . " dcondt(i,k) = netflux/dp(i,k)\n" . " end do\n" . " end do\n" . " do k = kbm, llpar\n" . " if (k-1 .gt. 1) then\n" . " km1 = k-1\n" . " else\n" . " km1 = 1\n" . " endif\n" . " do i = il1g, il2g\n" . " if (k .eq. mx(i)) then\n" . " fluxin = (mu(i,k)+md(i,k))*cmix(i,km1)-md(i,k)*cond(i,k)\n" . " fluxout = mu(i,k)*conu(i,k)\n" . " netflux = fluxin-fluxout\n" . "\n" . " IF ( ABS(NETFLUX) < MAX(FLUXIN,FLUXOUT)*TINYNUM) THEN\n" . " NETFLUX = 0.D0\n" . " ENDIF\n" . " dcondt(i,k) = netflux/dp(i,k)\n" . " else if (k .gt. mx(i)) then\n" . " dcondt(i,k) = 0.d0\n" . " endif\n" . " end do\n" . " end do\n" . " do k = 1, llpar\n" . " adqn = 0.\n" . " do i = il1g, il2g\n" . " adqn = 0.\n" . " qn = cmix(i,k)+dcondt(i,k)*delt\n" . " adqn = adqn+adq(ideep(i),k,m)\n" . " adq(ideep(i),k,m) = 0.d0\n" . " if (qn .lt. 0.d0) then\n" . " adqn = 0.\n" . " endif\n" . " adcmix(i,k) = adcmix(i,k)+adqn\n" . " addcondt(i,k) = addcondt(i,k)+adqn*delt\n" . " adqn = 0.\n" . " end do\n" . " end do\n" . " do k = llpar, kbm, -1 \n" . " KM1 = MAX( 1, K-1 )\n" . " do i = il2g, il1g, -1\n" . " if (k .eq. mx(i)) then\n" . " fluxin = (mu(i,k)+md(i,k))*cmix(i,km1)-md(i,k)*cond(i,k)\n" . " fluxout = mu(i,k)*conu(i,k)\n" . " netflux = fluxin-fluxout\n" . " adnetflux = adnetflux+addcondt(i,k)/dp(i,k)\n" . " addcondt(i,k) = 0.\n" . " if (fluxin .gt. fluxout) then\n" . " if (netflux .lt. fluxin*tinynum) then\n" . " adnetflux = 0.\n" . " endif\n" . " else\n" . " if ((-netflux) .lt. fluxout*tinynum) then\n" . " adnetflux = 0.\n" . " endif\n" . " endif\n" . " adfluxin = adfluxin+adnetflux\n" . " adfluxout = adfluxout-adnetflux\n" . " adnetflux = 0.\n" . " adconu(i,k) = adconu(i,k)+adfluxout*mu(i,k)\n" . " adfluxout = 0.\n" . " adcmix(i,km1) = adcmix(i,km1)+adfluxin*(mu(i,k)+md(i,k))\n" . " adcond(i,k) = adcond(i,k)-adfluxin*md(i,k)\n" . " adfluxin = 0.\n" . " else if (k .gt. mx(i)) then\n" . " addcondt(i,k) = 0.\n" . " endif\n" . " end do\n" . " end do\n" . " do k = ktm, llpar\n" . " adfluxin = 0.\n" . " adfluxout = 0.\n" . " adnetflux = 0.\n" . " KM1 = MAX( 1, K-1 )\n" . " KP1 = MIN( LLPAR, K+1 )\n" . " do i = il1g, il2g\n" . " adfluxin = 0.\n" . " adfluxout = 0.\n" . " adnetflux = 0.\n" . " fluxin = mu(i,kp1)*conu(i,kp1)*fisg(i,k)+(mu(i,k)+md(i,k))*\n" . " \$cmix(i,km1)-md(i,k)*cond(i,k)\n" . " fluxout = mu(i,k)*conu(i,k)+(mu(i,kp1)+md(i,kp1))*cmix(i,k)-\n" . " \$md(i,kp1)*cond(i,kp1)\n" . " netflux = fluxin-fluxout\n" . " adnetflux = adnetflux+addcondt(i,k)/dp(i,k)\n" . " addcondt(i,k) = 0.\n" . " if (fluxin .gt. fluxout) then\n" . " if (netflux .lt. fluxin*tinynum) then\n" . " adnetflux = 0.\n" . " endif\n" . " else\n" . " if ((-netflux) .lt. fluxout*tinynum) then\n" . " adnetflux = 0.\n" . " endif\n" . " endif\n" . " adfluxin = adfluxin+adnetflux\n" . " adfluxout = adfluxout-adnetflux\n" . " adnetflux = 0.\n" . " adcmix(i,k) = adcmix(i,k)+adfluxout*(mu(i,kp1)+md(i,kp1))\n" . " adcond(i,kp1) = adcond(i,kp1)-adfluxout*md(i,kp1)\n" . " adconu(i,k) = adconu(i,k)+adfluxout*mu(i,k)\n" . " adfluxout = 0.\n" . " adcmix(i,km1) = adcmix(i,km1)+adfluxin*(mu(i,k)+md(i,k))\n" . " adcond(i,k) = adcond(i,k)-adfluxin*md(i,k)\n" . " adconu(i,kp1) = adconu(i,kp1)+adfluxin*mu(i,kp1)*fisg(i,k)\n" . " adfluxin = 0.\n" . " end do\n" . " end do\n" . " do k = llpar, 3, -1\n" . " KM1 = MAX( 1, K-1 )\n" . " do i = il1g, il2g\n" . " if (md(i,k) .lt. (-mbsth)) then\n" . " adcondh = adcond(i,k)\n" . " adcond(i,k) = 0.\n" . " adcmix(i,km1) = adcmix(i,km1)-adcondh*(ed(i,km1)*dp(i,km1)\n" . " \$/md(i,k))\n" . " adcond(i,km1) = adcond(i,km1)+adcondh*(md(i,km1)/md(i,k))\n" . " endif\n" . " end do\n" . " end do\n" . " do kk = 1, llpar-1\n" . " if (llpar .gt. kk+1) then\n" . " kkp1 = kk+1\n" . " else\n" . " kkp1 = llpar\n" . " endif\n" . " do i = il1g, il2g\n" . " mupdudp = mu(i,kk)+du(i,kk)*dp(i,kk)\n" . " if (mupdudp .gt. mbsth) then\n" . " adconuh = adconu(i,kk)\n" . " adconu(i,kk) = 0.\n" . " adcmix(i,kk) = adcmix(i,kk)+adconuh*(eu(i,kk)*dp(i,kk)/\n" . " \$mupdudp)\n" . " adconu(i,kkp1) = adconu(i,kkp1)+adconuh*(mu(i,kkp1)*\n" . " \$fisg(i,kk)/mupdudp)\n" . " endif\n" . " end do\n" . " end do\n" . " k = 2\n" . " km1 = 1\n" . " kk = llpar\n" . " do i = il1g, il2g\n" . " mupdudp = mu(i,kk)+du(i,kk)*dp(i,kk)\n" . " if (md(i,k) .lt. (-mbsth)) then\n" . " adcmix(i,km1) = adcmix(i,km1)-adcond(i,k)*(ed(i,km1)*dp(i,\n" . " \$km1)/md(i,k))\n" . " adcond(i,k) = 0.\n" . " endif\n" . " if (mupdudp .gt. mbsth) then\n" . " adcmix(i,kk) = adcmix(i,kk)+adconu(i,kk)*(eu(i,kk)*dp(i,kk)/\n" . " \$mupdudp)\n" . " adconu(i,kk) = 0.\n" . " endif\n" . " end do\n" . " do k = llpar, 1, -1\n" . " if (k-1 .gt. 1) then\n" . " km1 = k-1\n" . " else\n" . " km1 = 1\n" . " endif\n" . " do i = il2g, il1g, -1\n" . " if (cmix(i,km1) .gt. cmix(i,k)) then\n" . " minc = cmix(i,k)\n" . " maxc = cmix(i,km1)\n" . " else\n" . " minc = cmix(i,km1)\n" . " maxc = cmix(i,k)\n" . " endif\n" . " if (minc .lt. 0.d0) then\n" . " cdifr = 0.d0\n" . " else\n" . " if (maxc .gt. small) then\n" . " tmp = maxc\n" . " else\n" . " tmp = small\n" . " endif\n" . " if (cmix(i,k) .gt. cmix(i,km1)) then\n" . " cdifr = cmix(i,k)-cmix(i,km1)/tmp\n" . " else\n" . " cdifr = cmix(i,km1)-cmix(i,k)/tmp\n" . " endif\n" . " endif\n" . " addcondt(i,k) = 0.\n" . " adchat(i,k) = adchat(i,k)+adcond(i,k)\n" . " adcond(i,k) = 0.\n" . " adchat(i,k) = adchat(i,k)+adconu(i,k)\n" . " adconu(i,k) = 0.\n" . " if (cdifr .gt. 1.d-6) then\n" . " if (maxc*tinynum .gt. smallest) then\n" . " if (cmix(i,km1) .gt. maxc*tinynum) then\n" . " cabv = cmix(i,km1)\n" . " else\n" . " cabv = maxc*tinynum\n" . " endif\n" . " if (cmix(i,k) .gt. maxc*tinynum) then\n" . " cbel = cmix(i,k)\n" . " else\n" . " cbel = maxc*tinynum\n" . " endif\n" . " else\n" . " if (cmix(i,km1) .gt. smallest) then\n" . " cabv = cmix(i,km1)\n" . " else\n" . " cabv = smallest\n" . " endif\n" . " if (cmix(i,k) .gt. smallest) then\n" . " cbel = cmix(i,k)\n" . " else\n" . " cbel = smallest\n" . " endif\n" . " endif\n" . " adcabv = adcabv+adchat(i,k)*(log(cabv/cbel)/(cabv-cbel)+\n" . " \$(1./(cabv/cbel)/cbel/(cabv-cbel)-log(cabv/cbel)/((cabv-cbel)*\n" . " \$(cabv-cbel)))*cabv)*cbel\n" . " adcbel = adcbel+adchat(i,k)*(log(cabv/cbel)/(cabv-cbel)*\n" . " \$cabv+((-(1./(cabv/cbel)*(cabv/(cbel*cbel))/(cabv-cbel)))+log(cabv/\n" . " \$cbel)/((cabv-cbel)*(cabv-cbel)))*cabv*cbel)\n" . " adchat(i,k) = 0.\n" . " if (maxc*tinynum .gt. smallest) then\n" . " if (cmix(i,k) .gt. maxc*tinynum) then\n" . " adcmix(i,k) = adcmix(i,k)+adcbel\n" . " adcbel = 0.\n" . " else\n" . " admaxc = admaxc+adcbel*tinynum\n" . " adcbel = 0.\n" . " endif\n" . " if (cmix(i,km1) .gt. maxc*tinynum) then\n" . " adcmix(i,km1) = adcmix(i,km1)+adcabv\n" . " adcabv = 0.\n" . " else\n" . " admaxc = admaxc+adcabv*tinynum\n" . " adcabv = 0.\n" . " endif\n" . " else\n" . " if (cmix(i,k) .gt. smallest) then\n" . " adcmix(i,k) = adcmix(i,k)+adcbel\n" . " adcbel = 0.\n" . " else\n" . " adcbel = 0.\n" . " endif\n" . " if (cmix(i,km1) .gt. smallest) then\n" . " adcmix(i,km1) = adcmix(i,km1)+adcabv\n" . " adcabv = 0.\n" . " else\n" . " adcabv = 0.\n" . " endif\n" . " endif\n" . " else\n" . " adcmix(i,k) = adcmix(i,k)+0.5d0*adchat(i,k)\n" . " adcmix(i,km1) = adcmix(i,km1)+0.5d0*adchat(i,k)\n" . " adchat(i,k) = 0.\n" . " endif\n" . " if (minc .lt. 0.d0) then\n" . " adcdifr = 0.\n" . " else\n" . " if (cmix(i,k) .gt. cmix(i,km1)) then\n" . " adcmix(i,k) = adcmix(i,k)+adcdifr\n" . " adcmix(i,km1) = adcmix(i,km1)-adcdifr/tmp\n" . " adtmp = adtmp+adcdifr*(cmix(i,km1)/(tmp*tmp))\n" . " adcdifr = 0.\n" . " else\n" . " adcmix(i,k) = adcmix(i,k)-adcdifr/tmp\n" . " adcmix(i,km1) = adcmix(i,km1)+adcdifr\n" . " adtmp = adtmp+adcdifr*(cmix(i,k)/(tmp*tmp))\n" . " adcdifr = 0.\n" . " endif\n" . " if (maxc .gt. small) then\n" . " admaxc = admaxc+adtmp\n" . " adtmp = 0.\n" . " else\n" . " adtmp = 0.\n" . " endif\n" . " endif\n" . " if (cmix(i,km1) .gt. cmix(i,k)) then\n" . " adcmix(i,km1) = adcmix(i,km1)+admaxc\n" . " admaxc = 0.\n" . " adcmix(i,k) = adcmix(i,k)+adminc\n" . " adminc = 0.\n" . " else\n" . " adcmix(i,k) = adcmix(i,k)+admaxc\n" . " admaxc = 0.\n" . " adcmix(i,km1) = adcmix(i,km1)+adminc\n" . " adminc = 0.\n" . " endif\n" . " end do\n" . " end do\n" . " do k = 1, llpar\n" . " do i = il1g, il2g\n" . " cmix(i,k) = q(ideep(i),k,m)\n" . " if (cmix(i,k) .lt. 4.d0*smallest) then\n" . " adcmix(i,k) = 0.\n" . " endif\n" . " adq(ideep(i),k,m) = adq(ideep(i),k,m)+adcmix(i,k)\n" . " adcmix(i,k) = 0.\n" . " end do\n" . " end do\n" . "\n" . " ENDDO !M ; End of tracer loop\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE CONVTRAN_ADJ\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " END MODULE FVDAS_CONVECT_MOD\n" . "\n"; close(FILE); } #============================================= # Modify convection_mod.f #============================================= sub modConvectionMod { printf "Modifying convection_mod.f\n"; $input = ; while( $input !~ m/PUBLIC :: DO_CONVECTION/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " PUBLIC :: DO_CONVECTION_ADJ\n"; $input = ; while( $input !~ m/END SUBROUTINE NFCLDMX/ ) { print FILE "$input"; $input = ; } for($i=0; $i<4; $i++) { print FILE "$input"; $input = ; } print FILE " SUBROUTINE DO_CONVECTION_ADJ\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine DO_CONVECTION_ADJ calls the appropriate convection adjoint driver \n" . "! program for different met field data sets. (Kumaresh, 01/24/08)\n" . "!\n" . "! NOTES:\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE TRACER_MOD, ONLY : N_TRACERS, TCVV, STT, STT_ADJ\n" . "\n" . "# include \"define.h\" ! C-preprocessor switches \n" . "\n" . "#if defined( GEOS_4 )\n" . "\n" . " !-------------------------\n" . " ! GEOS-4 met fields\n" . " !-------------------------\n" . "\n" . " ! Call GEOS-4 convection adjoint driver routine\n" . " CALL DO_GEOS4_CONVECT_ADJ\n" . "\n" . "#else\n" . " !-------------------------\n" . " ! GEOS-1, GEOS-S, GEOS-3\n" . " !-------------------------\n" . "\n" . " ! Call the adjoint of S-J Lin convection routine for GEOS-1, GEOS-S, GEOS-3\n" . " !CALL NFCLDMX_ADJ( N_TRACERS, STT, STT_ADJ )\n" . " CALL ADJ_NFCLDMX( N_TRACERS, STT_ADJ )\n" . "\n" . "#endif\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE DO_CONVECTION_ADJ\n" . " \n" . "!------------------------------------------------------------------------------\n" . "\n" . " subroutine adj_nfcldmx ( nc, q )\n" . "C***************************************************************\n" . "C***************************************************************\n" . "C** This routine was generated by the **\n" . "C** Tangent linear and Adjoint Model Compiler, TAMC 5.3.2 **\n" . "C***************************************************************\n" . "C***************************************************************\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine NFCLDMX is S-J Lin's cumulus transport module for 3D GSFC-CTM,\n" . "! modified for the GEOS-CHEM model. The \"NF\" stands for \"no flipping\", and\n" . "! denotes that you don't have to flip the tracer array Q in the main\n" . "! program before passing it to NFCLDMX. (bmy, 2/12/97, 1/19/05)\n" . "!\n" . "! NOTE: NFCLDMX can be used with GEOS-1, GEOS-STRAT, and GEOS-3 met fields.\n" . "! For GEOS-4/fVDAS, you must use the routines in \"fvdas_convect_mod.f\"\n" . "! (bmy, 6/26/03)\n" . "!\n" . "! Arguments as input:\n" . "! ==========================================================================\n" . "! (1 ) NC : TOTAL number of tracers (soluble + insoluble) [unitless]\n" . "!\n" . "! Arguments as Input/Output:\n" . "! ============================================================================\n" . "! (2 ) Q : Tracer concentration [v/v]\n" . "! (3 ) ADQ : Adjoint tracer concentration [kg]\n" . "! ============================================================================\n" . "\n" . " ! References to F90 modules\n" . " USE DAO_MOD, ONLY : AD, CLDMAS, DTRN=>DTRAIN\n" . " USE DIAG_MOD, ONLY : AD37, AD38, CONVFLUP\n" . " USE GRID_MOD, ONLY : GET_AREA_M2\n" . " USE OCEAN_MERCURY_MOD, ONLY : ADD_Hg2_WD\n" . " USE PRESSURE_MOD, ONLY : GET_BP\n" . " USE TIME_MOD, ONLY : GET_TS_CONV\n" . " USE TRACER_MOD, ONLY : ITS_A_MERCURY_SIM\n" . " USE TRACERID_MOD, ONLY : IS_Hg2\n" . " USE WETSCAV_MOD, ONLY : COMPUTE_F\n" . "\n" . "C==============================================\n" . "C all entries are defined explicitly\n" . "C==============================================\n" . " implicit none\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"CMN_DIAG\" ! Diagnostic switches & arrays\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NC \n" . " REAL*8, INTENT(INOUT) :: Q(IIPAR,JJPAR,LLPAR,NC)\n" . "\n" . " ! Local variables\n" . " LOGICAL, SAVE :: FIRST = .TRUE.\n" . " INTEGER :: I, J, K, KTOP, L, N, NDT\n" . " INTEGER :: IC, ISTEP, JUMP, JS, JN, NS\n" . " INTEGER :: IMR, JNP, NLAY\n" . " REAL*8, SAVE :: DSIG(LLPAR)\n" . " REAL*8 :: SDT, CMOUT, ENTRN, DQ, AREA_M2\n" . " REAL*8 :: T0, T1, T2, T3, T4, TSUM, DELQ\n" . " REAL*8 :: DTCSUM(IIPAR,JJPAR,LLPAR,NNPAR)\n" . "\n" . " ! F is the fraction of tracer lost to wet scavenging in updrafts\n" . " REAL*8 :: F(IIPAR,JJPAR,LLPAR,NC)\n" . "\n" . " ! Local Work arrays\n" . " REAL*8 :: BMASS(IIPAR,JJPAR,LLPAR)\n" . " !REAL*8 :: QB(IIPAR,JJPAR)\n" . " !REAL*8 :: MB(IIPAR,JJPAR)\n" . " !REAL*8 :: QC(IIPAR,JJPAR) \n" . "\n" . " ! TINY = a very small number\n" . " REAL*8, PARAMETER :: TINY = 1d-14 \n" . "\n" . " ! ISOL is an index for the diagnostic arrays\n" . " INTEGER :: ISOL\n" . "\n" . " ! QC_PRES and QC_SCAV are the amounts of tracer \n" . " ! preserved against and lost to wet scavenging\n" . " !REAL*8 :: QC_PRES, QC_SCAV \n" . "\n" . " ! DNS is the double precision value for NS\n" . " REAL*8 :: DNS\n" . "\n" . "C==============================================\n" . "C define arguments (comment out those already defined)\n" . "C==============================================\n" . " real*8 adq_in(llpar)\n" . " real*8 adq_out(llpar)\n" . " real*8 vbmass(llpar)\n" . " real*8 vcldmas(llpar)\n" . " !real*8 dsig(llpar)\n" . " real*8 vdtrn(llpar)\n" . " real*8 vf(llpar)\n" . " !integer ktop\n" . " !integer ns\n" . " !real*8 sdt\n" . "\n" . "C==============================================\n" . "C define local variables (comment out those already defined)\n" . "C==============================================\n" . " real*8 addelq\n" . " real*8 adq(llpar)\n" . " real*8 adqb\n" . " real*8 adqc\n" . " real*8 adqc_pres\n" . " real*8 adt1\n" . " real*8 adt2\n" . " real*8 adt3\n" . " real*8 adt4\n" . " real*8 adtsum\n" . " !real*8 cmout\n" . " !real*8 entrn\n" . " integer ip1\n" . " !integer istep\n" . " !integer k\n" . " real*8 mb\n" . "\n" . "C----------------------------------------------\n" . "C ROUTINE BODY\n" . "C----------------------------------------------\n" . "C----------------------------------------------\n" . "C FUNCTION AND TAPE COMPUTATIONS\n" . "C----------------------------------------------\n" . " \n" . " IF ( FIRST ) THEN\n" . "\n" . " DO L = 1, LLPAR \n" . " DSIG(L) = GET_BP(L) - GET_BP(L+1)\n" . " ENDDO\n" . "\n" . " ! Reset first time flag\n" . " FIRST = .FALSE.\n" . " ENDIF\n" . " \n" . " imr = iipar\n" . " jnp = jjpar\n" . " nlay = llpar\n" . "\n" . " ! Convection timestep [s]\n" . " NDT = GET_TS_CONV() * 60d0\n" . " \n" . " ktop = nlay-1\n" . " jump = (jnp-1)/20\n" . " js = 1+jump\n" . " jn = jnp-js+1\n" . " ns = ndt/300\n" . " ns = max(ns,1)\n" . " sdt = float(ndt)/float(ns)\n" . "\n" . " do k = 1, nlay\n" . " do j = 1, jjpar\n" . " area_m2 = get_area_m2(j)\n" . " do i = 1, imr\n" . " bmass(i,j,k) = ad(i,j,k)/area_m2\n" . " end do\n" . " end do\n" . " end do\n" . " \n" . " do ic = 1, nc\n" . " CALL COMPUTE_F( IC, F(:,:,:,IC), ISOL ) \n" . " end do\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( CMOUT, DELQ, ENTRN, I, IC, ISOL, ISTEP, J, K )\n" . "!\$OMP+PRIVATE( MB, T0, T1, T2, T3, T4, TSUM )\n" . "!\$OMP+PRIVATE( addelq, adqb, adqc, adqc_pres, adt1, adt2, adt3, adt4 )\n" . "!\$OMP+PRIVATE( adtsum, ip1, adq_out, vdtrn, vbmass, vcldmas, vf )\n" . "!\$OMP+PRIVATE( adq_in, adq )\n" . "!\$OMP+SCHEDULE( DYNAMIC )\n" . " DO IC = 1, NC\n" . " DO J = JS, JN\n" . " DO I = 1, IMR\n" . "\n" . " adq_out(:) = Q (I,J,:,IC)\n" . " vdtrn (:) = DTRN (I,J,:)\n" . " vbmass (:) = BMASS (I,J,:)\n" . " vcldmas(:) = CLDMAS(I,J,:)\n" . " vf (:) = F (I,J,:,IC) \n" . "\n" . "C----------------------------------------------\n" . "C RESET LOCAL ADJOINT VARIABLES\n" . "C----------------------------------------------\n" . " addelq = 0.\n" . " do ip1 = 1, llpar\n" . " adq(ip1) = 0.\n" . " end do\n" . " adqb = 0.\n" . " adqc = 0.\n" . " adqc_pres = 0.\n" . " adt1 = 0.\n" . " adt2 = 0.\n" . " adt3 = 0.\n" . " adt4 = 0.\n" . " adtsum = 0.\n" . "\n" . "C----------------------------------------------\n" . "C ROUTINE BODY\n" . "C----------------------------------------------\n" . " adq(:) = adq(:)+adq_out(:)\n" . " adq_in(:) = 0d0\n" . "\n" . " adq_out(:) = 0.\n" . " \n" . " ! IF ( L_PRINTFD .and. i == IFD .and. j == JFD .and.\n" . " !& ic == STT2ADJ(NFD) ) THEN\n" . " ! print*, 'adq = ', adq\n" . " ! ENDIF\n" . "\n" . " do istep = ns, 1, -1\n" . " do k = ktop, 3, -1\n" . " if (vcldmas(k-1) .gt. tiny) then\n" . " cmout = vcldmas(k)+vdtrn(k)\n" . " entrn = cmout-vcldmas(k-1)\n" . " addelq = addelq+adq(k)\n" . " adtsum = adtsum+addelq*(sdt/vbmass(k))\n" . " addelq = 0.\n" . " adt1 = adt1+adtsum\n" . " adt2 = adt2+adtsum\n" . " adt3 = adt3+adtsum\n" . " adt4 = adt4+adtsum\n" . " adtsum = 0.\n" . " adq(k) = adq(k)-adt4*vcldmas(k-1)\n" . " adt4 = 0.\n" . " adq(k+1) = adq(k+1)+adt3*vcldmas(k)\n" . " adt3 = 0.\n" . " adqc = adqc-adt2*vcldmas(k)\n" . " adt2 = 0.\n" . " adqc_pres = adqc_pres+adt1*vcldmas(k-1)\n" . " adt1 = 0.\n" . " if (entrn .ge. 0) then\n" . " adq(k) = adq(k)+adqc*(entrn/cmout)\n" . " adqc_pres = adqc_pres+adqc*(vcldmas(k-1)/cmout)\n" . " adqc = 0.\n" . " endif\n" . " adqc = adqc+adqc_pres*(1.d0-vf(k))\n" . " adqc_pres = 0.\n" . " else\n" . " adq(k) = adq(k)+adqc\n" . " adqc = 0.\n" . " endif\n" . " end do\n" . "\n" . " ! IF ( L_PRINTFD .and. i == IFD .and. j == JFD .and.\n" . " !& ic == STT2ADJ(NFD) ) THEN\n" . " ! print*, 'adq = ', adq\n" . " ! ENDIF\n" . "\n" . " if (vcldmas(2) .gt. tiny) then\n" . " mb = vbmass(1)+vbmass(2)\n" . " adqc = adqc+adq(1)\n" . " adq(1) = 0.\n" . " adqc = adqc+adq(2)\n" . " adq(2) = 0.\n" . " adq(3) = adq(3)+adqc*(vcldmas(2)*sdt/(mb+vcldmas(2)*sdt))\n" . " adqb = adqb+adqc*(mb/(mb+vcldmas(2)*sdt))\n" . " adqc = 0.\n" . " adq(2) = adq(2)+adqb*(dsig(2)/(dsig(1)+dsig(2)))\n" . " adq(1) = adq(1)+adqb*(dsig(1)/(dsig(1)+dsig(2)))\n" . " adqb = 0.\n" . " else\n" . " adq(3) = adq(3)+adqc\n" . " adqc = 0.\n" . " endif\n" . " end do\n" . " adq_in(:) = adq_in(:)+adq(:)\n" . " adq(:) = 0.\n" . "\n" . " Q(I,J,:,IC) = adq_in(:)\n" . "\n" . "\n" . " ENDDO !I\n" . " ENDDO !J\n" . " ENDDO !IC\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " end subroutine adj_nfcldmx\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE DO_GEOS4_CONVECT_ADJ\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine DO_GEOS4_CONVECT_ADJ is a wrapper for the GEOS-4/fvDAS adjoint \n" . "! convection code. This was generated using TAMC and interfaced with the \n" . "! forward DO_GEOS4_CONVECT subroutine. (Kumaresh, 01/24/08)\n" . "!*****************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE DAO_MOD, ONLY : HKETA, HKBETA, ZMEU, ZMMU, ZMMD\n" . " USE DIAG_MOD, ONLY : AD37\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FVDAS_CONVECT_MOD, ONLY : INIT_FVDAS_CONVECT,FVDAS_CONVECT_ADJ\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : GET_TS_CONV\n" . " USE TRACER_MOD, ONLY : N_TRACERS, TCVV, STT, STT_ADJ\n" . " USE PRESSURE_MOD, ONLY : GET_PEDGE\n" . " USE WETSCAV_MOD, ONLY : COMPUTE_F\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"CMN_DIAG\" ! ND37, LD37 \n" . "\n" . " ! Local variables \n" . " LOGICAL, SAVE :: FIRST = .TRUE.\n" . " INTEGER :: I, ISOL, J, L, L2, N, NSTEP \n" . " INTEGER :: INDEXSOL(N_TRACERS) \n" . " INTEGER :: CONVDT \n" . " REAL*8 :: F(IIPAR,JJPAR,LLPAR,N_TRACERS)\n" . " REAL*8 :: RPDEL(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: DP(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: P1, P2, TDT \n" . "\n" . " !=================================================================\n" . " ! DO_GEOS4_CONVECT begins here!\n" . " !=================================================================\n" . " \n" . " ! Convection timestep [s]\n" . " CONVDT = GET_TS_CONV() * 60d0 \n" . " \n" . " ! NSTEP is the # of internal convection timesteps. According to\n" . " ! notes in the old convection code, 300s works well. (swu, 12/12/03)\n" . " NSTEP = CONVDT / 300 \n" . " NSTEP = MAX( NSTEP, 1 ) \n" . "\n" . " ! TIMESTEP*2; will be divided by 2 before passing to CONVTRAN \n" . " TDT = DBLE( CONVDT ) * 2.0D0 / DBLE( NSTEP )\n" . " \n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### DO_G4_CONV: a INIT_FV' )\n" . "\n" . " !=================================================================\n" . " ! Before calling convection, compute the fraction of insoluble\n" . " ! tracer (Finsoluble) lost in updrafts. Finsoluble = 1-Fsoluble.\n" . " !=================================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L, N, ISOL )\n" . "!\$OMP+SCHEDULE( DYNAMIC )\n" . " DO N = 1, N_TRACERS\n" . "\n" . " ! Get fraction of tracer scavenged and the soluble tracer \n" . " ! index (ISOL). For non-soluble tracers, F=0 and ISOL=0.\n" . " CALL COMPUTE_F( N, F(:,:,:,N), ISOL ) \n" . " \n" . " ! Store ISOL in an array for later use\n" . " INDEXSOL(N) = ISOL\n" . "\n" . " ! Loop over grid boxes\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " ! GEOS-4 convection routines need the insoluble fraction\n" . " F(I,J,L,N) = 1d0 - F(I,J,L,N)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . " \n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### DO_G4_CONV: a COMPUTE_F' )\n" . "\n" . " !=================================================================\n" . " ! Compute pressure thickness arrays DP and RPDEL\n" . " ! These arrays are indexed from atm top --> surface\n" . " !=================================================================\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L, L2, P1, P2 )\n" . " DO L = 1, LLPAR\n" . "\n" . " ! L2 runs from the atm top down to the surface\n" . " L2 = LLPAR - L + 1\n" . "\n" . " ! Loop over surface grid boxes\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " \n" . " ! Pressure at bottom and top edges of grid box [hPa]\n" . " P1 = GET_PEDGE(I,J,L)\n" . " P2 = GET_PEDGE(I,J,L+1)\n" . "\n" . " ! DP = Pressure difference between top & bottom edges [Pa]\n" . " DP(I,J,L2) = ( P1 - P2 ) * 100.0d0\n" . "\n" . " ! RPDEL = reciprocal of DP [1/hPa]\n" . " RPDEL(I,J,L2) = 100.0d0 / DP(I,J,L2) \n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### DO_G4_CONV: a DP, RPDEL' )\n" . " \n" . " !=================================================================\n" . " ! Flip arrays in the vertical and call FVDAS_CONVECT\n" . " !=================================================================\n" . "\n" . " ! Call the fvDAS convection routines (originally from NCAR!)\n" . " CALL FVDAS_CONVECT_ADJ( TDT, \n" . " & N_TRACERS, \n" . " & STT (:,:,LLPAR:1:-1,:), \n" . " & RPDEL, \n" . " & HKETA (:,:,LLPAR:1:-1 ),\n" . " & HKBETA(:,:,LLPAR:1:-1 ), \n" . " & ZMMU (:,:,LLPAR:1:-1 ), \n" . " & ZMMD (:,:,LLPAR:1:-1 ), \n" . " & ZMEU (:,:,LLPAR:1:-1 ), \n" . " & DP, \n" . " & NSTEP, \n" . " & F (:,:,LLPAR:1:-1,:), \n" . " & TCVV, \n" . " & INDEXSOL,STT_ADJ(:,:,LLPAR:1:-1,:) )\n" . "\n" . " !### Debug! \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### DO_G4_CONV: a FVDAS_CONVECT' )\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE DO_GEOS4_CONVECT_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n"; while( !eof(TEMP) ) { print FILE "$input"; $input = ; } print FILE "$input"; close(FILE); close(TEMP); } #============================================= # Modify a6_read_mod.f #============================================= sub modA6ReadMod { printf "Modifying a6_read_mod.f\n"; $input = ; while( $input !~ m/PUBLIC :: UNZIP_A6_FIELDS/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " PUBLIC :: DO_OPEN_A6_ADJ\n" . " PUBLIC :: OPEN_A6_FIELDS_ADJ\n"; $input = ; while( $input !~ m/END SUBROUTINE OPEN_A6_FIELDS/ ) { print FILE "$input"; $input = ; } for($i=0; $i<4; $i++) { print FILE "$input"; $input = ; } print FILE " FUNCTION DO_OPEN_A6_ADJ( NYMD, NHMS ) RESULT( DO_OPEN )\n" . "!\n" . "!******************************************************************************\n" . "! Function DO_OPEN_A6_ADJ returns TRUE if is time to open the A-6 met field file\n" . "! or FALSE otherwise. This prevents us from opening a file which has already\n" . "! been opened. Based on DO_OPEN_A6, the difference is that in adjoint mode\n" . "! we only open if we're reading the last block of the file, rather than the first.\n" . "! (dkh, 03/05/05)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) NYMD (INTEGER) : YYYYMMDD\n" . "! (2 ) NHMS (INTEGER) : and HHMMSS to be tested for A-3 file open\n" . "!\n" . "! NOTES:\n" . "! (1 ) Always return TRUE, as the blocks need to be read in reverse order, so have\n" . "! to start from the top of the file each time. (dkh, 03/07/09)\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NYMD, NHMS\n" . "\n" . " ! Local variables\n" . " LOGICAL :: DO_OPEN\n" . " LOGICAL, SAVE :: FIRST = .TRUE.\n" . " INTEGER, SAVE :: LASTNYMD = -1\n" . " INTEGER, SAVE :: LASTNHMS = -1\n" . "\n" . " !=================================================================\n" . " ! DO_OPEN_A6 begins here!\n" . " !=================================================================\n" . "\n" . " ! Always open anew for backwd integration\n" . " DO_OPEN = .TRUE.\n" . " RETURN\n" . "\n" . " ! Return if we have already opened the file\n" . " IF ( NYMD == LASTNYMD .and. NHMS == LASTNHMS ) THEN\n" . " DO_OPEN = .FALSE.\n" . " GOTO 999\n" . " ENDIF\n" . "\n" . "#if defined( GEOS_4 )\n" . "\n" . " ! Open file if it's 21 GMT or first call\n" . " ! (GEOS-4 \"a_llk_03\" only)\n" . " IF ( NHMS == 210000 .or. FIRST ) THEN\n" . " DO_OPEN = .TRUE.\n" . " GOTO 999\n" . " ENDIF\n" . "\n" . "#else\n" . "\n" . " ! Open file if it's 18:00 GMT or first call\n" . " ! (GEOS-1, GEOS-S, GEOS-3, GEOS-4 \"a_llk_04\")\n" . " IF ( NHMS == 180000 .or. FIRST ) THEN\n" . " DO_OPEN = .TRUE.\n" . " GOTO 999\n" . " ENDIF\n" . "\n" . "#endif\n" . "\n" . " !=================================================================\n" . " ! Reset quantities for next call\n" . " !=================================================================\n" . " 999 CONTINUE\n" . " LASTNYMD = NYMD\n" . " LASTNHMS = NHMS\n" . " FIRST = .FALSE.\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION DO_OPEN_A6_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE OPEN_A6_FIELDS_ADJ( NYMD, NHMS )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine OPEN_A6_FIELDS_ADJ opens the A-6 met fields file for date NYMD and\n" . "! time NHMS. (bmy, bdf, 6/15/98, 12/12/03). Calls DO_OPEN_A6_ADJ (dkh, 03/05/05)\n" . "!\n" . "! Arguments as input:\n" . "! ===========================================================================\n" . "! (1 ) NYMD (INTEGER) : Current value of YYYYMMDD\n" . "! (2 ) NHMS (INTEGER) : Current value of HHMMSS\n" . "!\n" . "! NOTES:\n" . "! (1 ) Adapted from OPEN_MET_FIELDS of \"dao_read_mod.f\" (bmy, 6/19/03)\n" . "! (2 ) Now opens either zipped or unzipped files (bmy, 12/11/03)\n" . "! (3 ) Now skips past the GEOS-4 ident string (bmy, 12/12/03)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : GET_RES_EXT\n" . " USE DIRECTORY_MOD, ONLY : DATA_DIR, GCAP_DIR, GEOS_3_DIR \n" . " USE DIRECTORY_MOD, ONLY : GEOS_4_DIR, GEOS_5_DIR, TEMP_DIR \n" . " USE ERROR_MOD, ONLY : ERROR_STOP\n" . " USE LOGICAL_MOD, ONLY : LUNZIP\n" . " USE FILE_MOD, ONLY : IU_A6, IOERROR, FILE_EXISTS\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NYMD, NHMS\n" . "\n" . " ! Local variables\n" . " LOGICAL, SAVE :: FIRST = .TRUE.\n" . " LOGICAL :: IT_EXISTS\n" . " INTEGER :: IOS, IUNIT\n" . " CHARACTER(LEN=8) :: IDENT\n" . " CHARACTER(LEN=255) :: A6_FILE\n" . " CHARACTER(LEN=255) :: GEOS_DIR\n" . " CHARACTER(LEN=255) :: PATH\n" . "\n" . " !=================================================================\n" . " ! OPEN_A6_FIELDS_ADJ begins here!\n" . " !=================================================================\n" . "\n" . " ! Open A-6 file at the proper time, or on the first call\n" . " IF ( DO_OPEN_A6_ADJ( NYMD, NHMS ) ) THEN\n" . "\n" . "#if defined( GEOS_3 )\n" . "\n" . " ! Strings for directory & filename\n" . " GEOS_DIR = TRIM( GEOS_3_DIR )\n" . " A6_FILE = 'YYYYMMDD.a6.' // GET_RES_EXT()\n" . "\n" . "#elif defined( GEOS_4 )\n" . "\n" . " ! Strings for directory & filename\n" . " GEOS_DIR = TRIM( GEOS_4_DIR )\n" . " A6_FILE = 'YYYYMMDD.a6.' // GET_RES_EXT()\n" . "\n" . "#elif defined( GEOS_5 )\n" . "\n" . " ! Strings for directory & filename\n" . " GEOS_DIR = TRIM( GEOS_5_DIR )\n" . " A6_FILE = 'YYYYMMDD.a6.' // GET_RES_EXT()\n" . "\n" . "#elif defined( GCAP )\n" . "\n" . " ! Strings for directory & filename\n" . " GEOS_DIR = TRIM( GCAP_DIR )\n" . " A6_FILE = 'YYYYMMDD.a6.' // GET_RES_EXT()\n" . "\n" . "#endif\n" . "\n" . " ! Replace date tokens\n" . " CALL EXPAND_DATE( GEOS_DIR, NYMD, NHMS )\n" . " CALL EXPAND_DATE( A6_FILE, NYMD, NHMS )\n" . "\n" . " ! If unzipping, open GEOS-1 file in TEMP dir\n" . " ! If not unzipping, open GEOS-1 file in DATA dir\n" . " IF ( LUNZIP ) THEN\n" . " PATH = TRIM( TEMP_DIR ) // TRIM( A6_FILE )\n" . " ELSE\n" . " PATH = TRIM( DATA_DIR ) // \n" . " & TRIM( GEOS_DIR ) // TRIM( A6_FILE )\n" . " ENDIF\n" . "\n" . " ! Close previously opened A-3 file\n" . " CLOSE( IU_A6 )\n" . "\n" . " ! Make sure the file unit is valid before we open the file\n" . " IF ( .not. FILE_EXISTS( IU_A6 ) ) THEN\n" . " CALL ERROR_STOP( 'Could not find file!', \n" . " & 'OPEN_A6_FIELDS (a6_read_mod.f)' )\n" . " ENDIF\n" . "\n" . "c\$\$\$ PRINT*,'-------------------------'\n" . "c\$\$\$ PRINT*,'*************************'\n" . "c\$\$\$ PRINT*,'PASSED UPTO THIS',PATH\n" . "c\$\$\$ PRINT*,'*************************'\n" . "c\$\$\$ PRINT*,'-------------------------'\n" . "\n" . " ! Open the file\n" . " OPEN( UNIT = IU_A6, FILE = TRIM( PATH ),\n" . " & STATUS = 'OLD', ACCESS = 'SEQUENTIAL', \n" . " & FORM = 'UNFORMATTED', IOSTAT = IOS )\n" . " \n" . " IF ( IOS /= 0 ) THEN\n" . " CALL IOERROR( IOS, IU_A6, 'open_a6_fields:1' )\n" . " ENDIF\n" . "\n" . " ! Echo info\n" . " WRITE( 6, 100 ) TRIM( PATH )\n" . " 100 FORMAT( ' - Opening: ', a ) \n" . "\n" . "#if defined( GEOS_4 ) || defined( GEOS_5 ) || defined( GCAP )\n" . "\n" . " ! Skip past the ident string\n" . " READ( IU_A6, IOSTAT=IOS ) IDENT\n" . "\n" . " IF ( IOS /= 0 ) THEN\n" . " CALL IOERROR( IOS, IU_A6, 'open_a6_fields:2' )\n" . " ENDIF\n" . "\n" . "#endif\n" . "\n" . " ENDIF\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE OPEN_A6_FIELDS_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n"; while( !eof(TEMP) ) { print FILE "$input"; $input = ; } print FILE "$input"; close(FILE); close(TEMP); } #============================================= # Modify a3_read_mod.f #============================================= sub modA3ReadMod { printf "Modifying a3_read_mod.f\n"; $input = ; while( $input !~ m/PUBLIC :: UNZIP_A3_FIELDS/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " PUBLIC :: DO_OPEN_A3_ADJ\n" . " PUBLIC :: OPEN_A3_FIELDS_ADJ\n"; $input = ; while( $input !~ m/END SUBROUTINE OPEN_A3_FIELDS/ ) { print FILE "$input"; $input = ; } for($i=0; $i<4; $i++) { print FILE "$input"; $input = ; } print FILE " FUNCTION DO_OPEN_A3_ADJ( NYMD, NHMS ) RESULT( DO_OPEN )\n" . "! \n" . "!******************************************************************************\n" . "! Function DO_OPEN_A3_ADJ returns TRUE if is time to open the A-3 met field file\n" . "! or FALSE otherwise. This prevents us from opening a file which has already\n" . "! been opened. (bmy, 6/23/03)\n" . "! \n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) NYMD (INTEGER) : YYYYMMDD \n" . "! (2 ) NHMS (INTEGER) : and HHMMSS to be tested for A-3 file open\n" . "! \n" . "! NOTES:\n" . "! (1 ) Always open, as the blocks need to be read in reverse order, so have\n" . "! to start from the top of the file each time. (dkh, 03/07/09)\n" . "! \n" . "!******************************************************************************\n" . "!\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NYMD, NHMS\n" . "\n" . " ! Local variables\n" . " LOGICAL :: DO_OPEN\n" . " LOGICAL, SAVE :: FIRST = .TRUE.\n" . " INTEGER, SAVE :: LASTNYMD = -1\n" . " INTEGER, SAVE :: LASTNHMS = -1\n" . "\n" . " !=================================================================\n" . " ! DO_OPEN_A3_ADJ begins here!\n" . " !=================================================================\n" . "\n" . " ! Always open the file anew during backwd integration.\n" . " DO_OPEN = .TRUE.\n" . " RETURN\n" . "\n" . " ! Return if we have already opened the file\n" . " IF ( NYMD == LASTNYMD .and. NHMS == LASTNHMS ) THEN\n" . " DO_OPEN = .FALSE.\n" . " GOTO 999\n" . " ENDIF\n" . "\n" . "#if defined( GEOS_4 )\n" . "\n" . " ! Open A-3 file if it's 22:30 GMT, or on the first call\n" . " IF ( NHMS == 223000 .or. FIRST ) THEN\n" . " DO_OPEN = .TRUE.\n" . " GOTO 999\n" . " ENDIF\n" . "\n" . "#else\n" . "\n" . " ! Open A-3 file if it's 21:00 GMT, or on the first call\n" . " IF ( NHMS == 210000 .or. FIRST ) THEN\n" . " DO_OPEN = .TRUE.\n" . " GOTO 999\n" . " ENDIF\n" . "\n" . "#endif\n" . "\n" . " !=================================================================\n" . " ! Reset quantities for next call\n" . " !=================================================================\n" . " 999 CONTINUE\n" . " LASTNYMD = NYMD\n" . " LASTNHMS = NHMS\n" . " FIRST = .FALSE.\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION DO_OPEN_A3_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE OPEN_A3_FIELDS_ADJ( NYMD, NHMS )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine OPEN_A3_FIELDS_ADJ opens the A-3 met fields file for date NYMD and\n" . "! time NHMS. (bmy, bdf, 6/15/98, 12/12/03)\n" . "! Calls DO_OPEN_A3_ADJ. (dkh, 03/05/05)\n" . "!\n" . "! Arguments as input:\n" . "! ===========================================================================\n" . "! (1 ) NYMD (INTEGER) : YYYYMMDD\n" . "! (2 ) NHMS (INTEGER) : and HHMMSS timestamps for A-3 file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Adapted from OPEN_MET_FIELDS of \"dao_read_mod.f\" (bmy, 6/13/03)\n" . "! (2 ) Now opens either zipped or unzipped files (bmy, 12/11/03)\n" . "! (3 ) Now skips past the GEOS-4 ident string (bmy, 12/12/03)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : GET_RES_EXT\n" . " USE DIRECTORY_MOD, ONLY : DATA_DIR, GCAP_DIR, GEOS_3_DIR \n" . " USE DIRECTORY_MOD, ONLY : GEOS_4_DIR, GEOS_5_DIR, TEMP_DIR \n" . " USE LOGICAL_MOD, ONLY : LUNZIP\n" . " USE ERROR_MOD, ONLY : ERROR_STOP\n" . " USE FILE_MOD, ONLY : IU_A3, IOERROR, FILE_EXISTS\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NYMD, NHMS\n" . "\n" . " ! Local variables\n" . " LOGICAL :: IT_EXISTS\n" . " INTEGER :: IOS\n" . " CHARACTER(LEN=8) :: IDENT\n" . " CHARACTER(LEN=255) :: A3_FILE\n" . " CHARACTER(LEN=255) :: GEOS_DIR\n" . " CHARACTER(LEN=255) :: PATH\n" . "\n" . " !=================================================================\n" . " ! OPEN_A3_FIELDS_ADJ begins here!\n" . " !=================================================================\n" . "\n" . " ! Open A-3 fields at the proper time, or on the first call\n" . " IF ( DO_OPEN_A3_ADJ( NYMD, NHMS ) ) THEN\n" . "\n" . "#if defined( GEOS_3 )\n" . "\n" . " ! Strings for directory & filename\n" . " GEOS_DIR = TRIM( GEOS_3_DIR )\n" . " A3_FILE = 'YYYYMMDD.a3.' // GET_RES_EXT()\n" . "\n" . "#elif defined( GEOS_4 )\n" . "\n" . " ! Strings for directory & filename\n" . " GEOS_DIR = TRIM( GEOS_4_DIR )\n" . " A3_FILE = 'YYYYMMDD.a3.' // GET_RES_EXT()\n" . "\n" . "#elif defined( GEOS_5 )\n" . "\n" . " ! Strings for directory & filename\n" . " GEOS_DIR = TRIM( GEOS_5_DIR )\n" . " A3_FILE = 'YYYYMMDD.a3.' // GET_RES_EXT()\n" . "\n" . "#elif defined( GCAP )\n" . "\n" . " ! Strings for directory & filename\n" . " GEOS_DIR = TRIM( GCAP_DIR )\n" . " A3_FILE = 'YYYYMMDD.a3.' // GET_RES_EXT()\n" . "\n" . "#endif\n" . "\n" . " ! Replace date tokens\n" . " CALL EXPAND_DATE( A3_FILE, NYMD, NHMS )\n" . " CALL EXPAND_DATE( GEOS_DIR, NYMD, NHMS )\n" . "\n" . " ! If unzipping, open GEOS-4 file in TEMP dir\n" . " ! If not unzipping, open GEOS-4 file in DATA dir\n" . " IF ( LUNZIP ) THEN\n" . " PATH = TRIM( TEMP_DIR ) // TRIM( A3_FILE )\n" . " ELSE\n" . " PATH = TRIM( DATA_DIR ) // \n" . " & TRIM( GEOS_DIR ) // TRIM( A3_FILE )\n" . " ENDIF\n" . "\n" . " ! Close previously opened A-3 file\n" . " CLOSE( IU_A3 )\n" . "\n" . " ! Make sure the file unit is valid before we open the file\n" . " IF ( .not. FILE_EXISTS( IU_A3 ) ) THEN\n" . " CALL ERROR_STOP( 'Could not find file!', \n" . " & 'OPEN_A3_FIELDS (a3_read_mod.f)' )\n" . " ENDIF\n" . "\n" . " ! Open the file\n" . " OPEN( UNIT = IU_A3, FILE = TRIM( PATH ),\n" . " & STATUS = 'OLD', ACCESS = 'SEQUENTIAL', \n" . " & FORM = 'UNFORMATTED', IOSTAT = IOS )\n" . " \n" . " IF ( IOS /= 0 ) THEN\n" . " CALL IOERROR( IOS, IU_A3, 'open_a3_fields:1' )\n" . " ENDIF\n" . "\n" . " ! Echo info\n" . " WRITE( 6, 100 ) TRIM( PATH )\n" . " 100 FORMAT( ' - Opening: ', a )\n" . " \n" . "#if defined( GEOS_4 ) || defined( GEOS_5 ) || defined( GCAP )\n" . "\n" . " ! Skip past the GEOS-4 ident string\n" . " READ( IU_A3, IOSTAT=IOS ) IDENT\n" . "\n" . " IF ( IOS /= 0 ) THEN\n" . " CALL IOERROR( IOS, IU_A3, 'open_a3_fields:2' )\n" . " ENDIF\n" . "\n" . "#endif\n" . "\n" . " ENDIF\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE OPEN_A3_FIELDS_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n"; while( !eof(TEMP) ) { print FILE "$input"; $input = ; } print FILE "$input"; close(FILE); close(TEMP); } #============================================= # Modify grid_mod.f #============================================= sub modGridMod { printf "Modifying grid_mod.f\n"; $input = ; while( $input !~ m/END SUBROUTINE COMPUTE_GRID/ ) { print FILE "$input"; $input = ; } for($i=0; $i<4; $i++) { print FILE "$input"; $input = ; } print FILE " FUNCTION GET_IJ( LON, LAT ) RESULT ( IIJJ )\n" . "\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine GET_IJ returns I and J index for a LON, LAT coord. (dkh, 11/16/06) \n" . "! \n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) LON (REAL*8) : Longitude [degrees]\n" . "! (2 ) LAT (REAL*8) : Latitude [degrees]\n" . "! \n" . "! Function result\n" . "! ============================================================================\n" . "! (1 ) IIJJ(1) (INTEGER) : Long index [none]\n" . "! (2 ) IIJJ(2) (INTEGER) : Lati index [none]\n" . "! \n" . "! NOTES:\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! Reference to f90 modules\n" . " USE ERROR_MOD, ONLY : ERROR_STOP\n" . "\n" . "\n" . "# include \"CMN_SIZE\" ! DISIZE, DJSIZE \n" . "\n" . " ! Arguments\n" . " REAL :: LAT, LON \n" . " \n" . " ! Return\n" . " INTEGER :: I, J, IIJJ(2)\n" . "\n" . " ! Local variables \n" . " REAL*8 :: TLON, TLAT, DLON, DLAT\n" . "\n" . " !=================================================================\n" . " ! GET_IJ begins here!\n" . " !=================================================================\n" . " \n" . " ! Does not yet support nested grid ...\n" . " IF ( IS_NESTED ) THEN \n" . " CALL ERROR_STOP( 'Nested not supported','GET_IJ in grid_mod.f')\n" . " ENDIF\n" . " ! ... or anything other than 4x5 \n" . "#if !defined( GRID4x5 ) && !defined( GRID2x25 )\n" . " CALL ERROR_STOP( 'Only tested 4x5 or 2x25','GET_IJ in grid_mod.f')\n" . "#endif \n" . " \n" . " !DLON = GET_XEDGE(3) - GET_XEDGE(2)\n" . " !DLAT = GET_YEDGE(3) - GET_YEDGE(2)\n" . " \n" . " TLON = 180d0 + LON + DISIZE\n" . " TLAT = 90d0 + LAT + DJSIZE\n" . "\n" . " I = TLON / DISIZE\n" . " J = TLAT / DJSIZE\n" . "\n" . "\n" . " IF ( TLON / DISIZE - REAL(I) >= 0.5d0 ) THEN \n" . " I = I + 1 \n" . " ENDIF \n" . " \n" . " IF ( TLAT / DJSIZE - REAL(J) >= 0.5d0 ) THEN \n" . " J = J + 1 \n" . " ENDIF \n" . " \n" . "\n" . " ! Longitude wraps around\n" . " !IF ( I == 73 ) I = 1\n" . " IF ( I == ( IIPAR + 1 ) ) I = 1\n" . "\n" . " ! Check for impossible values\n" . " IF ( I > IIPAR .or. J > JJPAR .or.\n" . " & I < 1 .or. J < 1 ) THEN\n" . " CALL ERROR_STOP('Error finding grid box', 'GET_IJ')\n" . " ENDIF\n" . "\n" . " IIJJ(1) = I\n" . " IIJJ(2) = J\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION GET_IJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n"; while( !eof(TEMP) ) { print FILE "$input"; $input = ; } print FILE "$input"; close(FILE); close(TEMP); } #============================================= # Modify dao_mod.f #============================================= sub modDaoMod { printf "Modifying dao_mod.f\n"; $input = ; while( $input !~ m/REAL\*8, ALLOCATABLE :: PSC2\(:,:\)/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " REAL*8, ALLOCATABLE :: TMP_PRESS(:,:)\n"; $input = ; while( $input !~ m/FUNCTION IS_LAND/ ) { print FILE "$input"; $input = ; } print FILE " SUBROUTINE INTERP_ADJ( NTIME0, NTIME1, NTDT )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine INTERP linearly interpolates GEOS-CHEM I-6 fields (winds, \n" . "! surface pressure, temperature, surface albedo, specific humidity) to the \n" . "! current dynamic timestep. (bdf, bmy, 1/30/98, 9/14/06)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) NTIME0 (INTEGER) : elapsed time [s] at the start of the 6-hr timestep. \n" . "! (2 ) NTIME1 (INTEGER) : elapsed time [s] at current time\n" . "! (3 ) NTDT (INTEGER) : length of dynamic timestep [s]\n" . "!\n" . "! NOTES:\n" . "! (1 ) INTERP is written in Fixed-Form Fortran 90.\n" . "! (2 ) Subtract PINT from PSC since the only subroutine that uses PSC\n" . "! is TPCORE. This prevents having to subtract and add PINT to PSC\n" . "! before and after each call of TPCORE.\n" . "! (3 ) Pass the Harvard CTM temperature variable T(IGCMPAR,JGCMPAR,LGCMPAR)\n" . "! to INTERP via the argument list (instead of including file CMN).\n" . "! It is computationally inefficient to keep two large arrays for\n" . "! the same quantity. Use the proper window offsets with T.\n" . "! (4 ) Added to \"dao_mod.f\" (bmy, 6/26/00)\n" . "! (5 ) Updated comments (bmy, 4/4/01)\n" . "! (6 ) Replaced {IJL}GCMPAR w/ IIPAR,JJPAR,LLPAR. Also now use parallel\n" . "! DO-loop for interpolation. Updated comments. (bmy, 9/26/01)\n" . "! (7 ) Removed obsolete code from 9/01 (bmy, 10/23/01)\n" . "! (8 ) Add PSC2 as the surface pressure at the end of the dynamic timestep.\n" . "! This needs to be passed to TPCORE and AIRQNT so that the mixing ratio\n" . "! can be converted to mass properly. Removed PINT from the arg list,\n" . "! since we don't need it anymore. Also updated comments and made\n" . "! some cosmetic changes. (bmy, 3/27/02)\n" . "! (9 ) Removed obsolete, commented-out code (bmy, 6/25/02)\n" . "! (10) Eliminated PS, PSC from the arg list, for floating-pressure fix.\n" . "! (dsa, bdf, bmy, 8/27/02)\n" . "! (11) Met field arrays are module variables, so we don't need to pass them\n" . "! as arguments. (bmy, 11/20/02)\n" . "! (12) Removed NDT from the arg list since that is always 21600. For GEOS-4\n" . "! met fields, only interpolate PSC2; the other fields are 6-h averages.\n" . "! Eliminate TC variable, it's obsolete. Now use double precision to\n" . "! compute TM and TC2 values. Renamed NTIME to NTIME1 and NTIME1 to\n" . "! NTIME0. Updated comments. (bmy, 6/19/03)\n" . "! (13) Now modified for GEOS-5 and GCAP met fields. (swu, bmy, 5/25/05)\n" . "! (14) Remove support for GEOS-1 and GEOS-STRAT met fields (bmy, 8/4/06)\n" . "! (15) Now interpolate TROPP, only if variable tropopause is used \n" . "! (phs, 9/12/06)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE LOGICAL_MOD, ONLY : LVARTROP\n" . " \n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NTIME0, NTIME1, NTDT \n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, L\n" . " REAL*8 :: D_NTIME0, D_NTIME1, D_NDT, D_NTDT, TM, TC2\n" . "\n" . " !=================================================================\n" . " ! INTERP begins here! \n" . " !=================================================================\n" . "\n" . " ! Convert time variables from FLOAT to DBLE\n" . " D_NTIME0 = DBLE( NTIME0 )\n" . " D_NTIME1 = DBLE( NTIME1 )\n" . " D_NTDT = DBLE( NTDT )\n" . " D_NDT = 21600d0\n" . "\n" . " ! Fraction of 6h timestep elapsed at mid point of this dyn timestep\n" . " TM = ( D_NTIME1 + D_NTDT/2d0 - D_NTIME0 ) / D_NDT\n" . " \n" . " ! Fraction of 6h timestep elapsed at the end of this dyn timestep\n" . " TC2 = ( D_NTIME1 + - D_NTIME0 ) / D_NDT \n" . "\n" . "#if defined( GEOS_3 )\n" . "\n" . " !=================================================================\n" . " ! For GEOS-1, GEOS-S, GEOS-3 met fields:\n" . " ! Interpolate PSC2, UWND, VWND, ALBD, T, SPHU\n" . " !=================================================================\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " \n" . " ! 2D variables\n" . " IF ( L == 1 ) THEN\n" . " \n" . " ! Pressures: at start, midpt, and end of dyn timestep\n" . " PSC2(I,J) = PS1(I,J) + ( PS2(I,J) - PS1(I,J) ) * TC2 \n" . " \n" . " ! Albedo: at midpt of dyn timestep\n" . " ALBD(I,J) = ALBD1(I,J) + ( ALBD2(I,J) - ALBD1(I,J) ) * TM\n" . "\n" . " ! Tropopause pressure at midpt\n" . " IF ( LVARTROP ) TROPP(I,J) = TROPP1(I,J) \n" . " & + ( TROPP2(I,J) - TROPP1(I,J) ) * TM\n" . "\n" . " ENDIF\n" . " \n" . " ! 3D Variables: at midpt of dyn timestep\n" . " UWND(I,J,L) = UWND1(I,J,L) + (UWND2(I,J,L) - UWND1(I,J,L)) * TM\n" . " VWND(I,J,L) = VWND1(I,J,L) + (VWND2(I,J,L) - VWND1(I,J,L)) * TM\n" . " SPHU(I,J,L) = SPHU1(I,J,L) + (SPHU2(I,J,L) - SPHU1(I,J,L)) * TM\n" . " T(I,J,L) = TMPU1(I,J,L) + (TMPU2(I,J,L) - TMPU1(I,J,L)) * TM\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . "#else\n" . "\n" . " !=================================================================\n" . " ! For GEOS-4, GEOS-5, GCAP met fields:\n" . " ! Interpolate PSC2 only (pressure at end of dyn timestep)\n" . " ! and TROPP (10/11/06 phs)\n" . " !=================================================================\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . "\n" . " PSC2(I,J) = PS1(I,J) + ( PS2(I,J) - PS1(I,J) ) * TC2 \n" . "\n" . " ! Tropopause pressure at midpt\n" . " IF ( LVARTROP ) TROPP(I,J) = TROPP1(I,J) \n" . " & + ( TROPP2(I,J) - TROPP1(I,J) ) * TM\n" . "\n" . " ENDDO\n" . " ENDDO\n" . "\n" . "#endif\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE INTERP_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n"; while( $input !~ m/PSC2 = 0d0/ ) { print FILE "$input"; $input = ; } print FILE "$input" . "\n" . " ALLOCATE( TMP_PRESS( IIPAR, JJPAR ), STAT=AS )\n" . " IF ( AS /= 0 ) CALL ALLOC_ERR( 'TMP_PRESS' )\n" . " TMP_PRESS = 0d0\n"; $input = ; while( $input !~ m/IF \( ALLOCATED\( PSC2 * \) \) DEALLOCATE\( PSC2 * \)/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " IF ( ALLOCATED( TMP_PRESS ) ) DEALLOCATE( TMP_PRESS )\n"; while( !eof(TEMP) ) { $input = ; print FILE "$input"; } close(FILE); close(TEMP); } #============================================= # Modify tracer_mod.f #============================================= sub modTracerMod { printf "Modifying tracer_mod.f\n"; $input = ; while( $input !~ m/Module Variables/ ) { print FILE "$input"; $input = ; } print FILE "! Added two new variables STT_ADJ and PERT for adjoint calculations.\n" . "! (Kumaresh. 01/24/08)\n" . "!\n"; while( $input !~ m/\(6 \) STT/ ) { print FILE "$input"; $input = ; } print FILE "$input" . "! (6 ) STT_ADJ : GEOS-CHEM Adjoint tracer array [kg]\n" . "! (6 ) PERT : GEOS-CHEM perturbed Tracer array [kg]\n"; $input = ; while( $input !~ m/ALLOCATABLE \:\: TRACER_N_CONST\(\:\)/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " REAL*8, ALLOCATABLE :: PERT(:,:,:,:)\n" . " REAL*8, ALLOCATABLE :: STT_ADJ(:,:,:,:)\n" . " REAL*8, ALLOCATABLE :: EMIS_ADJ(:,:,:,:)\n" . " REAL*8, ALLOCATABLE :: DDEP_ADJ(:,:,:,:)\n" . " REAL*8, ALLOCATABLE :: EMIS_I_ADJ(:,:,:,:)\n" . " REAL*8, ALLOCATABLE :: F(:,:,:,:)\n" . " REAL*8, ALLOCATABLE :: FP(:,:)\n" . " INTEGER, ALLOCATABLE :: IM(:,:)\n"; $input = ; while( $input !~ m/SALC_REDGE_um\(2\)/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " INTEGER :: NHMSb, NYMDb\n" . " REAL*8 :: TAUb\n"; $input = ; while( $input !~ m/USE ERROR_MOD, ONLY \: ALLOC_ERR/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " USE gckpp_Global\n"; $input = ; while( $input !~ m/STT = 0d0/ ) { print FILE "$input"; $input = ; } for($i=0; $i<2; $i++) { print FILE "$input"; $input = ; } print FILE " ALLOCATE( PERT( IIPAR, JJPAR, LLPAR, N_TRACERS ), STAT=AS )\n" . " IF ( AS /= 0 ) CALL ALLOC_ERR( 'STT' )\n" . " PERT = 0d0\n" . "\n" . " ALLOCATE( STT_ADJ( IIPAR, JJPAR, LLPAR, N_TRACERS ), STAT=AS )\n" . " IF ( AS /= 0 ) CALL ALLOC_ERR( 'STT' )\n" . " STT = 0d0\n" . "\n"; for($i=0; $i<4; $i++) { print FILE "$input"; $input = ; } print FILE " ALLOCATE( EMIS_ADJ( IIPAR, JJPAR, LLPAR, NCOEFF ), STAT=AS )\n" . " IF ( AS /= 0 ) CALL ALLOC_ERR( 'EMIS_ADJ' )\n" . " EMIS_ADJ = 0d0\n" . "\n" . " ALLOCATE( DDEP_ADJ( IIPAR, JJPAR, LLPAR, NCOEFF ), STAT=AS )\n" . " IF ( AS /= 0 ) CALL ALLOC_ERR( 'DDEP_ADJ' )\n" . " DDEP_ADJ = 0d0\n" . "\n" . " ALLOCATE( EMIS_I_ADJ( IIPAR, JJPAR, LLPAR, 40 ), STAT=AS )\n" . " IF ( AS /= 0 ) CALL ALLOC_ERR( 'EMIS_I_ADJ' )\n" . " EMIS_I_ADJ = 0d0\n" . "\n" . " ALLOCATE( F( IIPAR, JJPAR, LLPAR, N_TRACERS ), STAT=AS )\n" . " IF ( AS /= 0 ) CALL ALLOC_ERR( 'F' )\n" . " F = 0d0\n" . "\n" . " ALLOCATE( FP( IIPAR, JJPAR ), STAT=AS )\n" . " IF ( AS /= 0 ) CALL ALLOC_ERR( 'FP' )\n" . " FP = 0d0\n" . "\n" . " ALLOCATE( IM( IIPAR, JJPAR ), STAT=AS )\n" . " IF ( AS /= 0 ) CALL ALLOC_ERR( 'IM' )\n" . " IM = 0\n"; $input = ; while( $input !~ m/IF \( ALLOCATED\( STT *\) \) DEALLOCATE\( STT *\)/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " IF ( ALLOCATED( STT_ADJ ) ) DEALLOCATE( STT_ADJ )\n" . " IF ( ALLOCATED( PERT ) ) DEALLOCATE( PERT )\n" . " IF ( ALLOCATED( F ) ) DEALLOCATE( F )\n"; $input = ; print FILE "$input" . " IF ( ALLOCATED( EMIS_ADJ ) ) DEALLOCATE( EMIS_ADJ )\n" . " IF ( ALLOCATED( EMIS_I_ADJ ) ) DEALLOCATE( EMIS_I_ADJ )\n" . " IF ( ALLOCATED( DDEP_ADJ ) ) DEALLOCATE( DDEP_ADJ )\n" . " IF ( ALLOCATED( FP ) ) DEALLOCATE( FP )\n" . " IF ( ALLOCATED( IM ) ) DEALLOCATE( IM )\n"; while( !eof(TEMP) ) { $input = ; print FILE "$input"; } close(FILE); close(TEMP); } #============================================= # Modify bpch2_mod.f #============================================= sub modBpch2Mod { printf "Modifying bpch2_mod.f\n"; $input = ; while( $input !~ m/END SUBROUTINE BPCH2$/ ) { print FILE "$input"; $input = ; } for($i=0; $i<4; $i++) { print FILE "$input"; $input = ; } print FILE " SUBROUTINE BPCH2_CSP( IUNIT, NI, NJ, ARRAY )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine BPCH2 writes binary punch file (version 2.0) to disk.\n" . "! Information about the model grid is also stored with each data block.\n" . "! (bmy, 5/27/99, 7/30/02)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) IUNIT : INTEGER - logical unit number of the file \n" . "! (2 ) MODELNAME : CHAR*40 - Name of model used to create output\n" . "! (3 ) LONRES : REAL*4 - Longitude resolution of grid, in degrees\n" . "! (4 ) LATRES : REAL*4 - Latitude resolution of grid, in degrees\n" . "! (4 ) HALFPOLAR : INTEGER - flag, =1 if model has half-polar boxes\n" . "! (5 ) CENTER180 : INTEGER - flag, =1 if model has lon center on 180 deg\n" . "! (6 ) CATEGORY : CHAR*40 - diagnostic category name\n" . "! (7 ) NTRACER : INTEGER - number of tracer\n" . "! (8 ) UNIT : CHAR*40 - units of data\n" . "! (9 ) TAU0 : REAL*8 - TAU at start of diagnostic interval\n" . "! (10 ) TAU1 : REAL*8 - TAU at end of diagnostic interval\n" . "! (11 ) RESERVED : CHAR*40 - Reserved for future use\n" . "! (12-14) NI,NJ,NL : INTEGER - dimensions of ARRAY\n" . "! (15 ) IFIRST : INTEGER - I-index of the first grid box\n" . "! (16 ) JFIRST : INTEGER - J-index of the first grid box\n" . "! (17 ) LFIRST : INTEGER - L-index of the first grid box\n" . "! (18 ) ARRAY : REAL*4 - data block to be written to the file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Added indices to IOERROR calls (e.g. \"bpch2:1\", \"bpch2:2\", etc.) \n" . "! (bmy, 10/4/99)\n" . "! (2 ) Added this routine to \"bpch_mod.f\" (bmy, 6/28/00)\n" . "! (3 ) Use IOS /= 0 criterion to also check for EOF condition (bmy, 9/12/00)\n" . "! (4 ) Now reference IOERROR from \"file_mod.f\". (bmy, 6/26/02)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE FILE_MOD, ONLY : IOERROR\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: IUNIT\n" . " INTEGER, INTENT(IN) :: NI, NJ\n" . " REAL*8, INTENT(IN) :: ARRAY( NI, NJ )\n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, IOS\n" . "\n" . " ! For computing NSKIP\n" . " INTEGER, PARAMETER :: BYTES_PER_NUMBER = 4\n" . " INTEGER, PARAMETER :: END_OF_RECORD = 8\n" . "\n" . " !=================================================================\n" . " ! BPCH2 begins here!! \n" . "\n" . " WRITE( IUNIT, IOSTAT = IOS ) \n" . " & NI, NJ\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'bpch2:2' )\n" . "\n" . " WRITE( IUNIT, IOSTAT=IOS ) \n" . " & ( ( ARRAY(I,J ),I=1,NI ),J=1,NJ )\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'bpch2:3' )\n" . "\n" . " !=================================================================\n" . " ! Return to calling program \n" . " !=================================================================\n" . " END SUBROUTINE BPCH2_CSP\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE BPCH2_INT( IUNIT, NI, NJ, ARRAY )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine BPCH2 writes binary punch file (version 2.0) to disk.\n" . "! Information about the model grid is also stored with each data block.\n" . "! (bmy, 5/27/99, 7/30/02)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) IUNIT : INTEGER - logical unit number of the file \n" . "! (2 ) MODELNAME : CHAR*40 - Name of model used to create output\n" . "! (3 ) LONRES : REAL*4 - Longitude resolution of grid, in degrees\n" . "! (4 ) LATRES : REAL*4 - Latitude resolution of grid, in degrees\n" . "! (4 ) HALFPOLAR : INTEGER - flag, =1 if model has half-polar boxes\n" . "! (5 ) CENTER180 : INTEGER - flag, =1 if model has lon center on 180 deg\n" . "! (6 ) CATEGORY : CHAR*40 - diagnostic category name\n" . "! (7 ) NTRACER : INTEGER - number of tracer\n" . "! (8 ) UNIT : CHAR*40 - units of data\n" . "! (9 ) TAU0 : REAL*8 - TAU at start of diagnostic interval\n" . "! (10 ) TAU1 : REAL*8 - TAU at end of diagnostic interval\n" . "! (11 ) RESERVED : CHAR*40 - Reserved for future use\n" . "! (12-14) NI,NJ,NL : INTEGER - dimensions of ARRAY\n" . "! (15 ) IFIRST : INTEGER - I-index of the first grid box\n" . "! (16 ) JFIRST : INTEGER - J-index of the first grid box\n" . "! (17 ) LFIRST : INTEGER - L-index of the first grid box\n" . "! (18 ) ARRAY : REAL*4 - data block to be written to the file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Added indices to IOERROR calls (e.g. \"bpch2:1\", \"bpch2:2\", etc.) \n" . "! (bmy, 10/4/99)\n" . "! (2 ) Added this routine to \"bpch_mod.f\" (bmy, 6/28/00)\n" . "! (3 ) Use IOS /= 0 criterion to also check for EOF condition (bmy, 9/12/00)\n" . "! (4 ) Now reference IOERROR from \"file_mod.f\". (bmy, 6/26/02)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE FILE_MOD, ONLY : IOERROR\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: IUNIT\n" . " INTEGER, INTENT(IN) :: NI, NJ\n" . " INTEGER, INTENT(IN) :: ARRAY( NI, NJ )\n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, IOS\n" . "\n" . " ! For computing NSKIP\n" . " INTEGER, PARAMETER :: BYTES_PER_NUMBER = 4\n" . " INTEGER, PARAMETER :: END_OF_RECORD = 8\n" . "\n" . " !=================================================================\n" . " ! BPCH2 begins here!! \n" . "\n" . " WRITE( IUNIT, IOSTAT = IOS ) \n" . " & NI, NJ\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'bpch2:2' )\n" . "\n" . " WRITE( IUNIT, IOSTAT=IOS ) \n" . " & ( ( ARRAY(I,J ),I=1,NI ),J=1,NJ )\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'bpch2:3' )\n" . "\n" . " !=================================================================\n" . " ! Return to calling program \n" . " !=================================================================\n" . " END SUBROUTINE BPCH2_INT\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE BPCH2_2D( IUNIT, NI, NJ, ARRAY )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine BPCH2 writes binary punch file (version 2.0) to disk.\n" . "! Information about the model grid is also stored with each data block.\n" . "! (bmy, 5/27/99, 7/30/02)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) IUNIT : INTEGER - logical unit number of the file \n" . "! (2 ) MODELNAME : CHAR*40 - Name of model used to create output\n" . "! (3 ) LONRES : REAL*4 - Longitude resolution of grid, in degrees\n" . "! (4 ) LATRES : REAL*4 - Latitude resolution of grid, in degrees\n" . "! (4 ) HALFPOLAR : INTEGER - flag, =1 if model has half-polar boxes\n" . "! (5 ) CENTER180 : INTEGER - flag, =1 if model has lon center on 180 deg\n" . "! (6 ) CATEGORY : CHAR*40 - diagnostic category name\n" . "! (7 ) NTRACER : INTEGER - number of tracer\n" . "! (8 ) UNIT : CHAR*40 - units of data\n" . "! (9 ) TAU0 : REAL*8 - TAU at start of diagnostic interval\n" . "! (10 ) TAU1 : REAL*8 - TAU at end of diagnostic interval\n" . "! (11 ) RESERVED : CHAR*40 - Reserved for future use\n" . "! (12-14) NI,NJ,NL : INTEGER - dimensions of ARRAY\n" . "! (15 ) IFIRST : INTEGER - I-index of the first grid box\n" . "! (16 ) JFIRST : INTEGER - J-index of the first grid box\n" . "! (17 ) LFIRST : INTEGER - L-index of the first grid box\n" . "! (18 ) ARRAY : REAL*4 - data block to be written to the file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Added indices to IOERROR calls (e.g. \"bpch2:1\", \"bpch2:2\", etc.) \n" . "! (bmy, 10/4/99)\n" . "! (2 ) Added this routine to \"bpch_mod.f\" (bmy, 6/28/00)\n" . "! (3 ) Use IOS /= 0 criterion to also check for EOF condition (bmy, 9/12/00)\n" . "! (4 ) Now reference IOERROR from \"file_mod.f\". (bmy, 6/26/02)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE FILE_MOD, ONLY : IOERROR\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: IUNIT\n" . " INTEGER, INTENT(IN) :: NI, NJ\n" . " REAL*4, INTENT(IN) :: ARRAY( NI, NJ )\n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, IOS\n" . "\n" . " ! For computing NSKIP\n" . " INTEGER, PARAMETER :: BYTES_PER_NUMBER = 4\n" . " INTEGER, PARAMETER :: END_OF_RECORD = 8\n" . "\n" . " !=================================================================\n" . " ! BPCH2 begins here!! \n" . "\n" . " WRITE( IUNIT, IOSTAT = IOS ) \n" . " & NI, NJ\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'bpch2:2' )\n" . "\n" . " WRITE( IUNIT, IOSTAT=IOS ) \n" . " & ( ( ARRAY(I,J ),I=1,NI ),J=1,NJ )\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'bpch2:3' )\n" . "\n" . " !=================================================================\n" . " ! Return to calling program \n" . " !=================================================================\n" . " END SUBROUTINE BPCH2_2D\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE BPCH2_CHK( IUNIT, MODELNAME, LONRES, LATRES,\n" . " & HALFPOLAR, CENTER180, CATEGORY, NTRACER, \n" . " & UNIT, TAU0, TAU1, RESERVED, \n" . " & NI, NJ, NL, IFIRST, \n" . " & JFIRST, LFIRST, ARRAY )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine BPCH2 writes binary punch file (version 2.0) to disk.\n" . "! Information about the model grid is also stored with each data block.\n" . "! (bmy, 5/27/99, 7/30/02)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) IUNIT : INTEGER - logical unit number of the file \n" . "! (2 ) MODELNAME : CHAR*40 - Name of model used to create output\n" . "! (3 ) LONRES : REAL*4 - Longitude resolution of grid, in degrees\n" . "! (4 ) LATRES : REAL*4 - Latitude resolution of grid, in degrees\n" . "! (4 ) HALFPOLAR : INTEGER - flag, =1 if model has half-polar boxes\n" . "! (5 ) CENTER180 : INTEGER - flag, =1 if model has lon center on 180 deg\n" . "! (6 ) CATEGORY : CHAR*40 - diagnostic category name\n" . "! (7 ) NTRACER : INTEGER - number of tracer\n" . "! (8 ) UNIT : CHAR*40 - units of data\n" . "! (9 ) TAU0 : REAL*8 - TAU at start of diagnostic interval\n" . "! (10 ) TAU1 : REAL*8 - TAU at end of diagnostic interval\n" . "! (11 ) RESERVED : CHAR*40 - Reserved for future use\n" . "! (12-14) NI,NJ,NL : INTEGER - dimensions of ARRAY\n" . "! (15 ) IFIRST : INTEGER - I-index of the first grid box\n" . "! (16 ) JFIRST : INTEGER - J-index of the first grid box\n" . "! (17 ) LFIRST : INTEGER - L-index of the first grid box\n" . "! (18 ) ARRAY : REAL*4 - data block to be written to the file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Added indices to IOERROR calls (e.g. \"bpch2:1\", \"bpch2:2\", etc.) \n" . "! (bmy, 10/4/99)\n" . "! (2 ) Added this routine to \"bpch_mod.f\" (bmy, 6/28/00)\n" . "! (3 ) Use IOS /= 0 criterion to also check for EOF condition (bmy, 9/12/00)\n" . "! (4 ) Now reference IOERROR from \"file_mod.f\". (bmy, 6/26/02)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE FILE_MOD, ONLY : IOERROR\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: IUNIT\n" . " INTEGER, INTENT(IN) :: NTRACER \n" . " INTEGER, INTENT(IN) :: NI, NJ, NL \n" . " INTEGER, INTENT(IN) :: IFIRST, JFIRST, LFIRST\n" . " INTEGER, INTENT(IN) :: HALFPOLAR, CENTER180\n" . " REAL*8, INTENT(IN) :: ARRAY( NI, NJ, NL )\n" . " REAL*4, INTENT(IN) :: LONRES, LATRES\n" . " REAL*8, INTENT(IN) :: TAU0, TAU1\n" . " CHARACTER(LEN=20), INTENT(IN) :: MODELNAME\n" . " CHARACTER(LEN=40), INTENT(IN) :: CATEGORY\n" . " CHARACTER(LEN=40), INTENT(IN) :: RESERVED\n" . " CHARACTER(LEN=40), INTENT(IN) :: UNIT\n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, L, NSKIP, IOS\n" . "\n" . " ! For computing NSKIP\n" . " INTEGER, PARAMETER :: BYTES_PER_NUMBER = 4\n" . " INTEGER, PARAMETER :: END_OF_RECORD = 8\n" . "\n" . " !=================================================================\n" . " ! BPCH2 begins here!! \n" . " !\n" . " ! Compute the number of bytes to skip between the end of one \n" . " ! data block and the beginning of the next data header line\n" . " !=================================================================\n" . " NSKIP = ( BYTES_PER_NUMBER * ( NI * NJ * NL ) ) + END_OF_RECORD\n" . "\n" . " !=================================================================\n" . " ! Write data block to binary punch file\n" . " ! Check for I/O errors\n" . " !=================================================================\n" . " WRITE( IUNIT, IOSTAT=IOS ) \n" . " & MODELNAME, LONRES, LATRES, HALFPOLAR, CENTER180\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'bpch2:1' )\n" . "\n" . " WRITE( IUNIT, IOSTAT = IOS ) \n" . " & CATEGORY, NTRACER, UNIT, TAU0, TAU1, RESERVED,\n" . " & NI, NJ, NL, IFIRST, JFIRST, LFIRST,\n" . " & NSKIP\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'bpch2:2' )\n" . "\n" . " WRITE( IUNIT, IOSTAT=IOS ) \n" . " & ( ( ( ARRAY(I,J,L), I=1,NI ), J=1,NJ ), L=1,NL )\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS, IUNIT, 'bpch2:3' )\n" . "\n" . " !=================================================================\n" . " ! Return to calling program \n" . " !=================================================================\n" . " END SUBROUTINE BPCH2_CHK\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n"; while( !eof(TEMP) ) { print FILE "$input"; $input = ; } print FILE "$input"; close(FILE); close(TEMP); } #============================================= # Modify Physproc #============================================= sub modPhysproc { printf "Modifying physproc.f\n"; $input = ; while( $input !~ m/NOTES/ ) { print FILE "$input"; $input = ; } print FILE "! Modified to copy reaction rates calculated by CALCRATE subroutine to KPP\n" . "! reaction rate variable. This is done to replace SMVGEAR chemistry with KPP\n" . "! chemistry, however a call to SMVGEAR is still performed for a time interval\n" . "! of 1e-6 to initialize things.\n" . "! (Kumaresh, Asandu, 01/24/2008)\n" . "!\n" . "$input"; $input = ; print FILE "$input"; while( $input !~ m/USE COMODE_MOD/ ) { $input = ; print FILE "$input"; } $input = ; chomp($input); $input = $input . ", R_KPP\n"; print FILE "$input"; while( $input !~ m/INTEGER IREMAIN,IUSESIZE,NREBLOCK,L/ ) { $input = ; print FILE "$input"; } $input = ; chomp($input); $input = $input . ",NK\n"; print FILE "$input"; while( $input !~ m/CALL CALCRATE/ ) { $input = ; print FILE "$input"; } print FILE "\n" . " DO KLOOP = 1, KTLOOP\n" . " JLOOP = JREORDER(JLOOPLO+KLOOP)\n" . " DO NK = 1, NTRATES(NCS)\n" . " R_KPP(JLOOP,NK) = RRATE_FOR_KPP(KLOOP,NK)\n" . " ENDDO\n" . " ENDDO\n" . "\n"; $input = ; while( $input !~ m/CALL SMVGEAR/ ) { print FILE "$input"; $input = ; } print FILE " !CALL SMVGEAR\n"; $input = ; while( $input !~ m/CSPEC\(JLOOP,JOLD\)/ ) { print FILE "$input"; $input = ; } print FILE " CSPEC(JLOOP,JOLD) = MAX(CORIG(KLOOP,JNEW),SMAL2)\n"; $input = ; while( !eof(TEMP) ) { print FILE "$input"; $input = ; } print FILE "$input"; close(FILE); close(TEMP); } #============================================= # Modify Physproc #============================================= sub modPhysprocFwdKpp { printf "Modifying physproc.f\n"; $input = ; while( $input !~ m/USE COMODE_MOD/ ) { print FILE "$input"; $input = ; } $input = ; print FILE " USE COMODE_MOD, ONLY : ABSHUM, AIRDENS, CSPEC, CSUMA,\n" . " & R_KPP, CSUMC, ERRMX2, IXSAVE,\n" . " & IYSAVE, T3\n"; while( $input !~ m/INTEGER IREMAIN,IUSESIZE,NREBLOCK,L/ ) { $input = ; print FILE "$input"; } $input = ; chomp($input); print FILE "$input,NK\n"; while( $input !~ m/CALL CALCRATE/ ) { $input = ; print FILE "$input"; } print FILE "\n" . " !***************KPP_INTERFACE****************\n" . " DO KLOOP = 1, KTLOOP\n" . " JLOOP = JREORDER(JLOOPLO+KLOOP)\n" . " DO NK = 1, NTRATES(NCS)\n" . " R_KPP(JLOOP,NK) = RRATE_FOR_KPP(KLOOP,NK)\n" . " ENDDO\n" . " ENDDO\n" . " !********************************************\n" . "\n"; $input = ; while( $input !~ m/CALL SMVGEAR/ ) { print FILE "$input"; $input = ; } print FILE " !***************KPP_INTERFACE****************\n" . " ! CALL SMVGEAR\n" . " !********************************************\n"; $input = ; while( !eof(TEMP) ) { print FILE "$input"; $input = ; } print FILE "$input"; close(FILE); close(TEMP); } #============================================= # Modify Calcrate #============================================= sub modCalcrate { printf "Modifying calcrate.f\n"; $input = ; print FILE "$input"; while( $input !~ m/USE PLANEFLIGHT_MOD/ ) { $input = ; print FILE "$input"; } print FILE " USE gckpp_Global, ONLY : IND\n"; while( $input !~ m/CALL ARCHIVE_RXNS_FOR_PF/ ) { $input = ; print FILE "$input"; } $input = ; print FILE "$input"; print FILE " !----------------------------------------------------------------\n" . " ! **** SAVE RATES FOR KPP ****\n" . " !----------------------------------------------------------------\n" . "\n" . " I = 1\n" . " DO NK = 1, NTRATES(NCS)\n" . " DO KLOOP = 1, KTLOOP\n" . " IF ( NEWFOLD(NK,NCS) > 0 ) THEN\n" . " IF(KLOOP.eq.1)THEN\n" . " IND(I) = NK\n" . " I = I +1\n" . " ENDIF\n" . " RRATE_FOR_KPP(KLOOP,NK) = RRATE(KLOOP,NEWFOLD(NK,NCS))\n" . " ENDIF\n" . " ENDDO\n" . " ENDDO\n"; while( !eof(TEMP) ) { $input = ; print FILE "$input"; } close(FILE); close(TEMP); } #============================================= # Modify Chemdr #============================================= sub modChemdr { printf "Modifying chemdr.f\n"; $input = ; while( $input !~ m/Important input variables/ ) { print FILE "$input"; $input = ; } print FILE "! Modified to interface it with KPP Chemistry replacing the SMVGEAR II\n" . "! mechanism. Insertion of Checkpointing subroutines, KPP variables and slight\n" . "! modifications are performed for this interfacing. (Kumaresh, A Sandu, 01/24/08)\n" . "!\n" . "$input"; $input = ; while( $input !~ m/USE COMODE_MOD/ ) { print FILE "$input"; $input = ; } chomp($input); $input = $input . ",\n" . " & CSPEC_FOR_KPP, JLOP, R_KPP, EMIS_RATE\n"; print FILE "$input"; $input = ; while( $input !~ m/USE LOGICAL_MOD, *ONLY : LSOA/ ) { print FILE "$input"; $input = ; } print FILE " USE LOGICAL_MOD, ONLY : LSOA, LVARTROP, LEMIS\n"; $input = ; while( $input !~ m/USE TIME_MOD/ ) { print FILE "$input"; $input = ; } print FILE " USE TIME_MOD\n"; while( $input !~ m/USE UVALBEDO_MOD/ ) { $input = ; print FILE "$input"; } print FILE " USE CHEMISTRY_MOD, ONLY : gckpp_Driver\n" . " USE gckpp_Global, ONLY : NTT\n" . " USE CHECKPOINT_MOD\n"; $input = ; while( $input !~ m/I, J, JLOOP, L, NPTS, N, MONTH, YEAR/ ) { print FILE "$input"; $input = ; } print FILE " INTEGER :: I, J, L, NPTS, N, MONTH, YEAR\n" . " INTEGER :: NYMD, NHMS, IT_NUM\n" . " REAL*8 :: TAU\n" . " REAL*8 :: CSP_O3( ITLOOP,1 ),fd\n" . " CHARACTER(LEN=50) :: chfile\n" . " CHARACTER(LEN=8) :: chtime\n"; for( $i=0; $i<4; $i++ ) { $input = ; print FILE "$input"; } print FILE " LSULF = .FALSE.\n" . " LCARB = .FALSE.\n" . " LSSALT = .FALSE.\n" . " LDUST = .FALSE.\n"; $input = ; while( $input !~ m/Call GASCONC/ ) { print FILE "$input"; $input = ; } print FILE "$input"; for( $i=0; $i<4; $i++ ) { $input = ; print FILE "$input"; } print FILE "\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . "\n" . " ! Checkpoint STT before partition\n" . " ! Note: checkpoint for CSPEC inside GASCONC\n"; $input = ; while( $input !~ m/CALL SETEMIS/ ) { print FILE "$input"; $input = ; } print FILE "$input"; print FILE "\n IF ( LEMIS ) CALL MAKE_EMISRATE_CHKFILE( NYMD, NHMS, TAU )\n"; $input = ; while( $input !~ m/Call chemistry routines/ ) { print FILE "$input"; $input = ; } for ($i=0; $i<5; $i++) { print FILE "$input"; $input = ; } print FILE " CSPEC_FOR_KPP(:,:) = CSPEC(:,:)\n\n" . "$input\n" . " CALL MAKE_CHEMISTRY_CHKFILE_CSP2( NYMD, NHMS, TAU )\n\n" . " NTT = NTTLOOP\n\n" . " CALL MAKE_RRATE_CHKFILE( NYMD, NHMS, TAU )\n" . "\n" . " !----------------------------------------------------------------\n" . " ! **** KPP CHEMISTRY ****\n" . " !----------------------------------------------------------------\n\n" . " CALL gckpp_Driver\n\n" . " CALL MAKE_HSAVE_CHKFILE( NYMD, NHMS, TAU )\n"; while( !eof(TEMP) ) { $input = ; print FILE "$input"; } close(FILE); close(TEMP); } #============================================= # Modify Chemdr #============================================= sub modChemdrFwdKpp { printf "Modifying chemdr.f\n"; $input = ; while( $input !~ m/USE COMODE_MOD/ ) { print FILE "$input"; $input = ; } chomp($input); print FILE "$input,\n" . " & CSPEC_FOR_KPP\n" . " USE DAO_MOD, ONLY : AD, AIRVOL, ALBD, AVGW \n"; $input = ; while( $input !~ m/USE UVALBEDO_MOD/ ) { $input = ; print FILE "$input"; } print FILE " !***************KPP_INTERFACE****************\n" . " USE gckpp_Global, ONLY : NTT\n" . " USE CHEMISTRY_MOD, ONLY : gckpp_Driver\n" . " !********************************************\n"; $input = ; while( $input !~ m/Call chemistry routines/ ) { print FILE "$input"; $input = ; } for ($i=0; $i<7; $i++) { print FILE "$input"; $input = ; } print FILE " !***************KPP_INTERFACE****************\n" . " NTT = NTTLOOP\n" . " CSPEC_FOR_KPP = CSPEC\n" . " CALL gckpp_Driver\n" . " !********************************************\n" . "\n" . "$input"; while( !eof(TEMP) ) { $input = ; print FILE "$input"; } close(FILE); close(TEMP); } #============================================= # Modify Comode #============================================= sub modComode { printf "Modifying comode.h\n"; $input = ; while( $input !~ m/REAL\*8 RRATE,URATE,TRATE,CORIG/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " !***************KPP_INTERFACE****************\n" . " REAL*8 RRATE_FOR_KPP\n" . " !********************************************\n"; $input = ; while( $input !~ m/RRATE\( KBLOOP, NMTRATE\)/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " !***************KPP_INTERFACE****************\n" . " 2 RRATE_FOR_KPP( KBLOOP, NMTRATE),\n" . " !********************************************\n"; while( !eof(TEMP) ) { $input = ; print FILE "$input"; } close(FILE); close(TEMP); } #============================================= # Modify Chemistry_Mod #============================================= sub modChemistryMod() { printf "Modifying chemistry_mod.f\n"; $input = ; while( $input !~ m/Module Routines/ ) { print FILE "$input"; $input = ; } print FILE "! Module modified to insert KPP chemistry drivers for forward and adjoint runs.\n" . "! (Kumaresh, 01/24/08)\n" . "!\n"; while( $input !~ m/\(1 \) DO_CHEMISTRY/ ) { print FILE "$input"; $input = ; } print FILE "! (1 ) DO_CHEMISTRY : Driver which calls chemistry routine\n" . "! (2 ) DO_CHEMISTRY_ADJ : Driver which calls adjoint chemistry routine\n" . "! (3 ) GCKPP_DRIVER : KPP chemistry driver subroutine\n" . "! (4 ) GCKPP_DRIVER_ADJ : KPP adjoint chemistry driver subroutine\n"; $input = ; while( $input !~ m/Call SMVGEAR routines/ ) { print FILE "$input"; $input = ; } print FILE " ! Call SMVGEAR/KPP routines\n"; $input = ; for($i=0; $i<2; $i++) { print FILE "$input"; $input = ; } while( $input !~ m/IF \( LPRT \)/ ) { $input = ; } print FILE " ENDIF\n" . "\n" . " !### Debug\n"; while( $input !~ m/END SUBROUTINE DO_CHEMISTRY/ ) { print FILE "$input"; $input = ; } print FILE "$input"; $input = ; print FILE "$input"; $input = ; print FILE "$input"; print FILE "\n SUBROUTINE DO_CHEMISTRY_ADJ\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine DO_CHEMISTRY is the driver routine which calls the appropriate\n" . "! chemistry subroutine for the various GEOS-CHEM simulations. \n" . "! (bmy, 2/11/03, 8/4/06)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE ACETONE_MOD, ONLY : OCEAN_SINK_ACET\n" . " USE AEROSOL_MOD, ONLY : AEROSOL_CONC, AEROSOL_RURALBOX\n" . " USE AEROSOL_MOD, ONLY : RDAER, SOILDUST\n" . " USE C2H6_MOD, ONLY : CHEMC2H6\n" . " USE CARBON_MOD, ONLY : CHEMCARBON\n" . " USE CH3I_MOD, ONLY : CHEMCH3I\n" . " USE DAO_MOD, ONLY : CLDF, DELP\n" . " USE DAO_MOD, ONLY : OPTDEP, OPTD, T\n" . " USE DRYDEP_MOD, ONLY : DRYFLX, DRYFLXRnPbBe\n" . " USE DUST_MOD, ONLY : CHEMDUST, RDUST_ONLINE\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE GLOBAL_CH4_MOD, ONLY : CHEMCH4\n" . " USE HCN_CH3CN_MOD, ONLY : CHEM_HCN_CH3CN\n" . " USE ISOROPIA_MOD, ONLY : DO_ISOROPIA\n" . " USE Kr85_MOD, ONLY : CHEMKr85\n" . " USE LOGICAL_MOD, ONLY : LCARB, LCHEM, LCRYST, LDUST\n" . " USE LOGICAL_MOD, ONLY : LPRT, LSSALT, LSULF, LSOA\n" . " USE MERCURY_MOD, ONLY : CHEMMERCURY\n" . " USE OPTDEPTH_MOD, ONLY : OPTDEPTH\n" . " USE RnPbBe_MOD, ONLY : CHEMRnPbBe\n" . " USE RPMARES_MOD, ONLY : DO_RPMARES\n" . " USE SEASALT_MOD, ONLY : CHEMSEASALT\n" . " USE SULFATE_MOD, ONLY : CHEMSULFATE\n" . " USE TAGGED_CO_MOD, ONLY : CHEM_TAGGED_CO\n" . " USE TAGGED_OX_MOD, ONLY : CHEM_TAGGED_OX\n" . " USE TIME_MOD, ONLY : GET_ELAPSED_MIN, GET_TS_CHEM\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT \n" . " USE TRACER_MOD, ONLY : ITS_A_C2H6_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_CH3I_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_CH4_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_FULLCHEM_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_HCN_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_MERCURY_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_RnPbBe_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_TAGCO_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_TAGOX_SIM\n" . " USE TRACER_MOD, ONLY : ITS_AN_AEROSOL_SIM\n" . " USE TRACER_MOD, ONLY : ITS_NOT_COPARAM_OR_CH4\n" . " USE TRACERID_MOD, ONLY : IDTACET, IDTISOP\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"CMN_DIAG\" ! NDxx flags\n" . "# include \"comode.h\" ! NPHOT\n" . "\n" . " ! Local variables\n" . " LOGICAL, SAVE :: FIRST = .TRUE.\n" . " INTEGER :: N_TROP\n" . "\n" . " !=================================================================\n" . " ! DO_CHEMISTRY begins here!\n" . " !=================================================================\n" . "\n" . " ! Compute optical depths (except for CH4 simulation)\n" . " IF ( .not. ITS_A_CH4_SIM() ) THEN\n" . " CALL OPTDEPTH( LLPAR, CLDF, OPTDEP, OPTD )\n" . " ENDIF\n" . "\n" . " !=================================================================\n" . " ! If LCHEM=T then call the chemistry subroutines\n" . " !=================================================================\n" . " IF ( LCHEM ) THEN \n" . "\n" . " !---------------------------------\n" . " ! NOx-Ox-HC (w/ or w/o aerosols) \n" . " !---------------------------------\n" . " IF ( ITS_A_FULLCHEM_SIM() ) THEN \n" . "\n" . " ! Call SMVGEAR/KPP routines\n" . " CALL CHEMDR_ADJ\n" . "\n" . " ENDIF\n" . " \n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CHEMISTRY' )\n" . " ENDIF\n" . " \n" . " ! Return to calling program\n" . " END SUBROUTINE DO_CHEMISTRY_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE GCKPP_DRIVER( ) \n" . "!\n" . "!******************************************************************************\n" . "! Driver routine to perform integration of the full KPP chemistry mechanism.\n" . "! Based on Daven Henze's GCKPP_DRIVER. (Kumaresh, 01/24/2008)\n" . "!******************************************************************************\n" . "!\n" . " ! Reference to f90 modules\n" . " USE COMODE_MOD, ONLY : JLOP, CSPEC, IXSAVE, CSPEC_FOR_KPP,\n" . " & IYSAVE, IZSAVE, R_KPP, HSAVE_KPP\n" . " USE TIME_MOD, ONLY : GET_TS_CHEM, GET_LOCALTIME, GET_NHMS\n" . " USE GCKPP_UTIL, ONLY : Shuffle_kpp2user,INIT_KPP\n" . " USE GCKPP_Initialize, ONLY : Initialize\n" . " USE gckpp_Model\n" . " USE GCKPP_Global \n" . " USE GCKPP_Integrator, ONLY : INTEGRATE, NIERR,\n" . " & Nhnew, Nhexit\n" . " USE GCKPP_adj_Integrator, ONLY : INTEGRATE_ADJ\n" . " USE GCKPP_Rates, ONLY : UPDATE_RCONST\n" . " USE GCKPP_Monitor, ONLY : SPC_NAMES\n" . " USE gckpp_Function\n" . " USE ERROR_MOD, ONLY : ERROR_STOP\n" . "\n" . " ! Local variables\n" . " REAL*8 :: T, TIN, TOUT\n" . " INTEGER :: ICNTRL(20)\n" . " REAL(kind=dp) :: RCNTRL(20)\n" . " INTEGER :: ISTATUS(20)\n" . " INTEGER :: I, J, L, N, JJLOOP\n" . " INTEGER :: IH, JH, LH\n" . " INTEGER :: TID\n" . " REAL(kind=dp) :: RSTATE(20)\n" . " LOGICAL, SAVE :: FIRST = .TRUE. \n" . " INTEGER :: NHMS, vl\n" . " character(len=8) :: d1\n" . "\n" . "!~~~ > Output variables \n" . " REAL(kind=dp) :: Vdot(NVAR)\n" . "\n" . " !=================================================================\n" . "\n" . " STEPMIN = 0.0d0\n" . " STEPMAX = 0.0d0\n" . " \n" . " DO i=1,NVAR\n" . " RTOL(i) = 1.0d-3\n" . " ATOL(i) = 1.0d-2\n" . " END DO\n" . "\n" . " ! Set parameters to default. See comments in RosenbrockADJ for\n" . " ! a list of the defaults.\n" . " ICNTRL(:) = 0\n" . " RCNTRL(:) = 0.d0\n" . "\n" . " ! Change some parameters from the default to new values\n" . " ICNTRL(1) = 1 ! Autonomous\n" . " ICNTRL(2) = 0 ! Nonautonomous\n" . "\n" . " ! Select Integrator\n" . " ! ICNTRL(3) -> selection of a particular Rosenbrock method\n" . " ! = 0 : default method is Rodas3\n" . " ! = 1 : method is Ros2\n" . " ! = 2 : method is Ros3 \n" . " ! = 3 : method is Ros4 \n" . " ! = 4 : method is Rodas3\n" . " ! = 5: method is Rodas4\n" . " ICNTRL(3) = 4 \n" . "\n" . " ICNTRL(7) = 1 ! No adjoint\n" . " \n" . " IF(FIRST)THEN\n" . " \n" . " RSTATE(Nhexit) = 0d0\n" . " \n" . " FIRST = .FALSE. \n" . "\n" . " ENDIF\n" . "\n" . " ! GET TS_CHEM and convert it to seconds. \n" . " DT = GET_TS_CHEM() * 60d0\n" . "\n" . " ! Set time parameters. \n" . " T = 0d0\n" . " TIN = T\n" . " TOUT = T + DT\n" . " \n" . " !=================================================================\n" . " ! Solve Chemistry\n" . " !=================================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( JJLOOP, I, J, L, N, RSTATE, ISTATUS )\n" . "!\$OMP+FIRSTPRIVATE( RCNTRL, ICNTRL )\n" . "!\$OMP+COPYIN( TIME )\n" . "!\$OMP+SCHEDULE( DYNAMIC )\n" . " DO JJLOOP = 1,NTT\n" . " \n" . " JLOOP = JJLOOP\n" . " ! Get 3D coords from SMVGEAR's 1D coords\n" . " I = IXSAVE(JJLOOP)\n" . " J = IYSAVE(JJLOOP)\n" . " L = IZSAVE(JJLOOP)\n" . "\n" . " DO N =1, NVAR\n" . " V_CSPEC(N) = CSPEC_FOR_KPP(JLOOP,N)\n" . " END DO\n" . "\n" . " ! Pass tracer concentrations from CSPEC_FOR_KPP to KPP working vectors VAR, FIX.\n" . " ! This also initializes the constant rate constants.\n" . " CALL Initialize()\n" . "\n" . " ! Recalculate rate constants\n" . " CALL Update_RCONST()\n" . "\n" . " CALL INTEGRATE_ADJ( 1, VAR, VAR_ADJ, TIN, TOUT,ATOL, \n" . " & RTOL, ICNTRL, RCNTRL, ISTATUS, RSTATE)\n" . "\n" . " IF ( ISTATUS(NIERR) < 0 ) THEN\n" . " rcntrl(3) = 0d0\n" . " CALL Initialize( ) ! v2.1 \n" . " CALL Update_RCONST()\n" . " CALL INTEGRATE_ADJ( 1, VAR, VAR_ADJ, TIN, TOUT,ATOL, \n" . " & RTOL, ICNTRL, RCNTRL, ISTATUS, RSTATE)\n" . " IF ( ISTATUS(NIERR) < 0 ) THEN \n" . " print*, 'failed twice !!! '\n" . " CALL ERROR_STOP('IERR < 0 ', 'INTEGRATE_ADJ')\n" . " ENDIF\n" . " ENDIF \n" . "\n" . " ! Set negative values to SMAL2\n" . " DO N = 1, NVAR\n" . " VAR(N) = MAX(VAR(N),SMAL2)\n" . " ENDDO\n" . "\n" . " HSAVE_KPP(I,J,L) = RSTATE(3)\n" . "\n" . " CALL Shuffle_kpp2user(VAR,V_CSPEC) \n" . "\n" . " DO N =1, NVAR\n" . " CSPEC(JLOOP,N) = V_CSPEC(N)\n" . " END DO\n" . "\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE GCKPP_DRIVER\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE GCKPP_DRIVER_ADJ( ) \n" . "!\n" . "!******************************************************************************\n" . "! Driver routine to perform adjoint integration of the full KPP chemistry \n" . "! mechanism. Based on Daven Henze's GCKPP_DRIVER. (Kumaresh, 01/24/2008)\n" . "!******************************************************************************\n" . "!\n" . " ! Reference to f90 modules\n" . " USE COMODE_MOD, ONLY : JLOP, CSPEC, IXSAVE, CSPEC_FOR_KPP,\n" . " & IYSAVE, IZSAVE, R_KPP, HSAVE_KPP,\n" . " & CSPEC_ADJ, CSPEC_ADJ_FOR_KPP, \n" . " & EMIS_RATE\n" . " USE TRACER_MOD, ONLY : DDEP_ADJ, EMIS_ADJ, EMIS_I_ADJ\n" . " USE TIME_MOD, ONLY : GET_TS_CHEM, GET_LOCALTIME\n" . " USE GCKPP_UTIL, ONLY : Shuffle_kpp2user,INIT_KPP\n" . " USE GCKPP_Initialize, ONLY : Initialize\n" . " USE GCKPP_Rates, ONLY : UPDATE_RCONST\n" . " USE GCKPP_Monitor, ONLY : SPC_NAMES\n" . " USE ERROR_MOD, ONLY : ERROR_STOP\n" . " USE LOGICAL_MOD, ONLY : LEMIS, LDRYD\n" . " USE GCKPP_Global, ONLY : SMAL2, VAR, VAR_ADJ, V_CSPEC,\n" . " & V_CSPEC_ADJ, VAR_R_ADJ, RCONST\n" . " USE gckpp_Function\n" . " USE gckpp_Model\n" . "\n" . " USE GCKPP_adj_Initialize, ONLY : Initialize_adj\n"; if($skipadjem == 0) { print FILE " USE GCKPP_adj_Integrator_em, ONLY : INTEGRATE_em_adj, NIERR,\n" . " & Nhnew, Nhexit\n"; } print FILE " USE GCKPP_adj_Integrator, ONLY : INTEGRATE_adj\n" . " \n" . " ! Local variables\n" . " REAL*8 :: T, TIN, TOUT\n" . " INTEGER :: ICNTRL(20)\n" . " REAL(kind=dp) :: RCNTRL(20)\n" . " INTEGER :: ISTATUS(20)\n" . " INTEGER :: I, J, L, N, JJLOOP\n" . " INTEGER :: IH, JH, LH\n" . " INTEGER :: TID\n" . " REAL(kind=dp) :: RSTATE(20)\n" . " LOGICAL, SAVE :: FIRST = .TRUE. \n" . "\n" . " INTEGER, PARAMETER :: NADJ = NVAR\n" . " REAL(kind=dp), DIMENSION(NVAR,NADJ) :: ATOL_adj, RTOL_adj\n" . "\n" . "!~~~> Tests\n" . " REAL(kind=dp) :: VAR0(NVAR), VAR1(NVAR), VAR2(NVAR),fd,ad\n" . "\n" . "!~~~ > Output variables \n" . " REAL(kind=dp) :: Vdot(NVAR)\n" . "\n" . " !=================================================================\n" . "\n" . " STEPMIN = 0.0d0\n" . " STEPMAX = 0.0d0\n" . " \n" . " DO i=1,NVAR\n" . " RTOL(i) = 1.0d-3\n" . " ATOL(i) = 1.0d-2\n" . " END DO \n" . "\n" . " DO j=1,NADJ\n" . " DO i=1,NVAR\n" . " RTOL_adj(i,j) = 0!1.0d-4\n" . " ATOL_adj(i,j) = 0!1.0d-10\n" . " END DO\n" . " END DO\n" . " \n" . " !-------------\n" . " CALL INIT_KPP\n" . " !-------------\n" . " \n" . " ! Set parameters to default. See comments in RosenbrockADJ for\n" . " ! a list of the defaults.\n" . " ICNTRL(:) = 0\n" . " RCNTRL(:) = 0.d0\n" . "\n" . " ! Change some parameters from the default to new values\n" . " ICNTRL(1) = 1 ! Autonomous\n" . " ICNTRL(2) = 0 ! Nonautonomous\n" . "\n" . " ! Select Integrator\n" . " ! ICNTRL(3) -> selection of a particular Rosenbrock method\n" . " ! = 0 : default method is Rodas3\n" . " ! = 1 : method is Ros2\n" . " ! = 2 : method is Ros3 \n" . " ! = 3 : method is Ros4 \n" . " ! = 4 : method is Rodas3\n" . " ! = 5: method is Rodas4\n" . " ICNTRL(3) = 4 \n" . "\n" . " ICNTRL(7) = 2 ! 1 = No adjoint, 2 = discrete adjoint\n" . " \n" . " IF(FIRST)THEN\n" . "\n" . " \n" . " RSTATE(2) = 0d0\n" . " ! reset FIRST flag \n" . " FIRST = .FALSE. \n" . "\n" . " ENDIF\n" . "\n" . " ! GET TS_CHEM and convert it to seconds. \n" . " DT = GET_TS_CHEM() * 60d0\n" . "\n" . " ! Set time parameters. \n" . " T = 0d0\n" . " TIN = T\n" . " TOUT = T + DT \n" . "\n" . " !=================================================================\n" . " ! Solve Chemistry\n" . " !=================================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( JJLOOP, I, J, L, N, RSTATE, ISTATUS )\n" . "!\$OMP+FIRSTPRIVATE( RCNTRL, ICNTRL )\n" . "!\$OMP+COPYIN( TIME )\n" . "!\$OMP+SCHEDULE( DYNAMIC )\n" . " DO JJLOOP = 1,NTT\n" . " \n" . " JLOOP = JJLOOP\n" . " ! Get 3D coords from SMVGEAR's 1D coords\n" . " I = IXSAVE(JJLOOP)\n" . " J = IYSAVE(JJLOOP)\n" . " L = IZSAVE(JJLOOP)\n" . " \n" . " DO N =1, NVAR\n" . " V_CSPEC(N) = CSPEC_FOR_KPP(JLOOP,N)\n" . " V_CSPEC_ADJ(N) = CSPEC_ADJ_FOR_KPP(JLOOP,N)\n" . " END DO\n" . "\n" . " ! Pass tracer concentrations from CSPEC_FOR_KPP to KPP working vectors VAR, FIX.\n" . " ! This also initializes the constant rate constants.\n" . " CALL Initialize()\n" . " \n" . " CALL Initialize_adj()\n" . "\n" . " RCNTRL(3) = HSAVE_KPP(I,J,L)\n" . "\n" . " ! Recalculate rate constants\n" . " CALL Update_RCONST()\n" . " \n"; if($skipadjem == 0) { print FILE " !------switch---------\n" . " IF(LEMIS.or.LDRYD)THEN\n" . " CALL INTEGRATE_EM_ADJ(1, VAR, VAR_ADJ, VAR_R_ADJ, TIN, TOUT,\n" . " & ATOL_adj, RTOL_adj, ICNTRL, RCNTRL, ISTATUS, RSTATE)\n" . " ELSE\n"; } print FILE " CALL INTEGRATE_ADJ(1, VAR, VAR_ADJ, TIN, TOUT,ATOL_adj, \n" . " & RTOL_adj, ICNTRL, RCNTRL, ISTATUS, RSTATE)\n"; if($skipadjem == 0) { print FILE " ENDIF\n" . " !--------------------\n"; } print FILE "\n" . " IF ( ISTATUS(20) < 0 ) THEN\n" . " rcntrl(3) = 0d0\n" . " CALL Initialize( ) ! v2.1 \n" . " CALL Initialize_adj( ) \n" . " CALL Update_RCONST()\n"; if($skipadjem == 0) { print FILE " !------switch---------\n" . " IF(LEMIS.or.LDRYD)THEN\n" . " CALL INTEGRATE_EM_ADJ(1, VAR, VAR_ADJ, VAR_R_ADJ, TIN, \n" . " & TOUT, ATOL_adj, RTOL_adj, ICNTRL, RCNTRL, ISTATUS, \n" . " & RSTATE)\n" . " ELSE\n"; } print FILE " CALL INTEGRATE_ADJ(1, VAR, VAR_ADJ, TIN, TOUT,ATOL_adj, \n" . " & RTOL_adj, ICNTRL, RCNTRL, ISTATUS, RSTATE)\n"; if($skipadjem == 0) { print FILE " ENDIF\n" . " !---------------------\n"; } print FILE " IF ( ISTATUS(20) < 0 ) THEN \n" . " print*, 'failed twice !!! '\n" . " CALL ERROR_STOP('IERR < 0 ', 'INTEGRATE_ADJ')\n" . " ENDIF\n" . " ENDIF \n" . "\n" . " ! Set negative values to SMAL2\n" . " DO N = 1, NVAR\n" . " VAR(N) = MAX(VAR(N),SMAL2)\n" . " ENDDO\n" . "\n" . " CALL Shuffle_kpp2user(VAR_ADJ,V_CSPEC_ADJ)\n" . " CALL Shuffle_kpp2user(VAR,V_CSPEC)\n" . "\n" . " DO N =1, NVAR\n" . " CSPEC(JLOOP,N) = V_CSPEC(N)\n" . " CSPEC_ADJ(JLOOP,N) = V_CSPEC_ADJ(N)\n" . " END DO\n" . "\n" . " !------switch---------\n" . " IF(LEMIS.or.LDRYD)THEN\n" . " !==================================\n" . " ! Scaled Emission Adjoints for NO, NO2, CO, ALK4\n" . " ! ISOP, ACET, PRPE, C3H8, C2H6, MEK, ALD2, CH2O\n" . " !----------------------------------\n" . " DO N =1, 12 !232-243 emission variables\n" . " EMIS_ADJ(I,J,L,N) = EMIS_ADJ(I,J,L,N) \n" . " & + VAR_R_ADJ(N)*RCONST(N+231)\n" . " END DO\n" . " !----------------------------------\n" . "\n" . " !==================================\n" . " ! Drydeposition Rate Adjoints\n" . " !----------------------------------\n" . " DO N =13, NCOEFF !244-253 drydep variables\n" . " DDEP_ADJ(I,J,L,N) = DDEP_ADJ(I,J,L,N) \n" . " & + VAR_R_ADJ(N)*RCONST(N+231)\n" . " END DO\n" . " !----------------------------------\n" . " \n" . " !==================================\n" . " ! Scaled Individual Source Emissions\n" . " !----------------------------------\n" . " DO N =1, 3 !1-3 NOx (1-Anthro, 2-Soil, 3-Aircraft/Lightning)\n" . " EMIS_I_ADJ(I,J,L,N) = EMIS_I_ADJ(I,J,L,N) \n" . " & + VAR_R_ADJ(1)*EMIS_RATE(JLOOP,N)\n" . " END DO\n" . " DO N=4, 13 !4-13 Anthropogenic (except NOx)\n" . " EMIS_I_ADJ(I,J,L,N) = EMIS_I_ADJ(I,J,L,N) \n" . " & + VAR_R_ADJ(N-2)*EMIS_RATE(JLOOP,N)\n" . " END DO\n" . " DO N=14, 24 !14-24 Biomass Burning\n" . " EMIS_I_ADJ(I,J,L,N) = EMIS_I_ADJ(I,J,L,N) \n" . " & + VAR_R_ADJ(N-13)*EMIS_RATE(JLOOP,N)\n" . " END DO\n" . " DO N=25, 35 !25-35 Biofuel Burning\n" . " EMIS_I_ADJ(I,J,L,N) = EMIS_I_ADJ(I,J,L,N) \n" . " & + VAR_R_ADJ(N-24)*EMIS_RATE(JLOOP,N)\n" . " END DO\n" . " !----------------------------------\n" . " ENDIF\n" . "\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE GCKPP_DRIVER_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n"; while( !eof(TEMP) ) { $input = ; print FILE "$input"; } close(FILE); } #============================================= # Modify Chemistry_Mod #============================================= sub modChemistryModFwdKpp() { printf "Modifying chemistry_mod.f\n"; $input = ; while( $input !~ m/Module Routines/ ) { print FILE "$input"; $input = ; } print FILE "! Module modified to insert KPP chemistry drivers for forward and adjoint runs.\n" . "! (Kumaresh, 01/24/08)\n" . "!\n"; while( $input !~ m/\(1 \) DO_CHEMISTRY/ ) { print FILE "$input"; $input = ; } print FILE "! (1 ) DO_CHEMISTRY : Driver which calls various chemistry routines\n" . "! (2 ) DO_CHEMISTRY_ADJ : Driver which calls adjoint chemistry routine\n" . "! (3 ) GCKPP_DRIVER : KPP chemistry driver subroutine\n" . "! (4 ) GCKPP_DRIVER_ADJ : KPP adjoint chemistry driver subroutine\n"; $input = ; while( $input !~ m/Call SMVGEAR routines/ ) { print FILE "$input"; $input = ; } print FILE " ! Call SMVGEAR/KPP routines\n"; $input = ; for($i=0; $i<2; $i++) { print FILE "$input"; $input = ; } while( $input !~ m/IF \( LPRT \)/ ) { $input = ; } print FILE " ENDIF\n" . "\n" . " !### Debug\n"; while( $input !~ m/END SUBROUTINE DO_CHEMISTRY/ ) { print FILE "$input"; $input = ; } print FILE "$input" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE GCKPP_DRIVER( ) \n" . "!\n" . "!******************************************************************************\n" . "! Driver routine to perform integration of the full KPP chemistry mechanism.\n" . "! Based on Daven Henze's GCKPP_DRIVER. (Kumaresh, 01/24/2008)\n" . "!******************************************************************************\n" . "!\n" . " ! Reference to f90 modules\n" . " USE COMODE_MOD, ONLY : JLOP, CSPEC, IXSAVE, CSPEC_FOR_KPP,\n" . " & IYSAVE, IZSAVE, R_KPP, HSAVE_KPP\n" . " USE TIME_MOD, ONLY : GET_TS_CHEM, GET_LOCALTIME\n" . " USE GCKPP_UTIL, ONLY : Shuffle_kpp2user,INIT_KPP\n" . " USE GCKPP_Initialize, ONLY : Initialize\n" . " USE gckpp_Model\n" . " USE GCKPP_Global \n" . " USE GCKPP_Integrator, ONLY : NIERR, Nhnew, Nhexit, INTEGRATE\n" . " USE GCKPP_adj_Integrator, ONLY : INTEGRATE_ADJ\n" . " USE GCKPP_Rates, ONLY : UPDATE_RCONST\n" . " USE GCKPP_Monitor, ONLY : SPC_NAMES\n" . " USE gckpp_Function\n" . " USE ERROR_MOD, ONLY : ERROR_STOP\n" . "\n" . " ! Local variables\n" . " REAL*8 :: T, TIN, TOUT\n" . " INTEGER :: ICNTRL(20)\n" . " REAL(kind=dp) :: RCNTRL(20)\n" . " INTEGER :: ISTATUS(20)\n" . " INTEGER :: I, J, L, N, JJLOOP\n" . " REAL(kind=dp) :: RSTATE(20)\n" . " LOGICAL, SAVE :: FIRST = .TRUE. \n" . "\n" . "!~~~ > Output variables \n" . " REAL(kind=dp) :: Vdot(NVAR)\n" . "\n" . " !=================================================================\n" . "\n" . " STEPMIN = 0.0d0\n" . " STEPMAX = 0.0d0\n" . " \n" . " DO i=1,NVAR\n" . " RTOL(i) = 1.0d-3\n" . " ATOL(i) = 1.0d-2\n" . " END DO\n" . "\n" . " ! Set parameters to default. See comments in RosenbrockADJ for\n" . " ! a list of the defaults.\n" . " ICNTRL(:) = 0\n" . " RCNTRL(:) = 0.d0\n" . "\n" . " ! Change some parameters from the default to new values\n" . " ICNTRL(1) = 1 ! Autonomous\n" . " ICNTRL(2) = 0 ! Nonautonomous\n" . "\n" . " ! Select Integrator\n" . " ! ICNTRL(3) -> selection of a particular Rosenbrock method\n" . " ! = 0 : default method is Rodas3\n" . " ! = 1 : method is Ros2\n" . " ! = 2 : method is Ros3 \n" . " ! = 3 : method is Ros4 \n" . " ! = 4 : method is Rodas3\n" . " ! = 5: method is Rodas4\n" . " ICNTRL(3) = 4 \n" . "\n" . " ICNTRL(7) = 1 ! No adjoint\n" . " \n" . " IF(FIRST)THEN\n" . " \n" . " RSTATE(Nhexit) = 0d0\n" . " \n" . " FIRST = .FALSE. \n" . "\n" . " ENDIF\n" . "\n" . " ! GET TS_CHEM and convert it to seconds. \n" . " DT = GET_TS_CHEM() * 60d0\n" . "\n" . " ! Set time parameters. \n" . " T = 0d0\n" . " TIN = T\n" . " TOUT = T + DT\n" . " \n" . " !=================================================================\n" . " ! Solve Chemistry\n" . " !=================================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( JJLOOP, I, J, L, N, RSTATE, ISTATUS )\n" . "!\$OMP+FIRSTPRIVATE( RCNTRL, ICNTRL )\n" . "!\$OMP+COPYIN( TIME )\n" . "!\$OMP+SCHEDULE( DYNAMIC )\n" . " DO JJLOOP = 1,NTT\n" . " \n" . " JLOOP = JJLOOP\n" . " ! Get 3D coords from SMVGEAR's 1D coords\n" . " I = IXSAVE(JJLOOP)\n" . " J = IYSAVE(JJLOOP)\n" . " L = IZSAVE(JJLOOP)\n" . "\n" . " DO N =1, NVAR\n" . " V_CSPEC(N) = CSPEC_FOR_KPP(JLOOP,N)\n" . " END DO\n" . "\n" . " ! Pass tracer concentrations from CSPEC_FOR_KPP to KPP working vectors VAR, FIX.\n" . " ! This also initializes the constant rate constants.\n" . " CALL Initialize()\n" . "\n" . " RCNTRL(Nhnew) = HSAVE_KPP(I,J,L)\n" . "\n" . " ! Recalculate rate constants\n" . " CALL Update_RCONST()\n" . "\n" . " CALL INTEGRATE_ADJ( 1, VAR, VAR_ADJ, TIN, TOUT,ATOL, \n" . " & RTOL, ICNTRL, RCNTRL, ISTATUS, RSTATE)\n" . "\n" . " IF ( ISTATUS(NIERR) < 0 ) THEN\n" . " rcntrl(3) = 0d0\n" . " CALL Initialize( ) ! v2.1 \n" . " CALL Update_RCONST()\n" . " CALL INTEGRATE_ADJ( 1, VAR, VAR_ADJ, TIN, TOUT,ATOL, \n" . " & RTOL, ICNTRL, RCNTRL, ISTATUS, RSTATE)\n" . " IF ( ISTATUS(NIERR) < 0 ) THEN \n" . " print*, 'failed twice !!! '\n" . " CALL ERROR_STOP('IERR < 0 ', 'INTEGRATE_ADJ')\n" . " ENDIF\n" . " ENDIF \n" . "\n" . " ! Set negative values to SMAL2\n" . " DO N = 1, NVAR\n" . " VAR(N) = MAX(VAR(N),SMAL2)\n" . " ENDDO\n" . "\n" . " HSAVE_KPP(I,J,L) = RSTATE(3)\n" . "\n" . " CALL Shuffle_kpp2user(VAR,V_CSPEC) \n" . "\n" . " DO N =1, NVAR\n" . " CSPEC(JLOOP,N) = V_CSPEC(N)\n" . " END DO\n" . "\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE GCKPP_DRIVER\n"; while( !eof(TEMP) ) { $input = ; print FILE "$input"; } close(FILE); } #============================================= # Modify Comode_Mod #============================================= sub modComodeMod { printf "Modifying comode_mod.f\n"; # Add Comments $input = ; while( $input !~ m/\(16\) VOLUME/ ) { print FILE "$input"; $input = ; } print FILE "$input" . "! (17) HSAVE_KPP : array for storing KPP chemistry integration step size\n" . "! (18) R_KPP : array for storing KPP chemistry reaction rates\n" . "! (19) CSPEC_ADJ : individual SMVGEAR II chemistry adjoint species array\n" . "! (20) CSPEC_FOR_KPP : individual KPP chemistry species array\n" . "! (21) CSPEC_ADJ_FOR_KPP : individual KPP chemistry adjoint species array\n"; # Add Module Variables $input = ; while( $input !~ m/REAL\*8, ALLOCATABLE :: VOLUME\(:\)/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " REAL*4, ALLOCATABLE :: HSAVE_KPP(:,:,:)\n" . " REAL*8, ALLOCATABLE :: R_KPP(:,:)\n" . " REAL*8, ALLOCATABLE :: CSPEC_ADJ(:,:)\n" . " REAL*8, ALLOCATABLE :: CSPEC_FOR_KPP(:,:)\n" . " REAL*8, ALLOCATABLE :: CSPEC_ADJ_FOR_KPP(:,:)\n" . " REAL*8, ALLOCATABLE :: EMIS_RATE(:,:)\n" . " REAL*4, ALLOCATABLE :: PART_CASE(:)\n"; # Add INIT_COMODE code $input = ; while( $input !~ m/CSPEC = 0d0/ ) { print FILE "$input"; $input = ; } print FILE "$input" . "\n" . " ALLOCATE( CSPEC_ADJ( ITLOOP, IGAS ), STAT=AS )\n" . " IF ( AS /= 0 ) CALL ALLOC_ERR( 'CSPEC_ADJ' )\n" . " CSPEC_ADJ = 0d0\n" . "\n" . " ALLOCATE( CSPEC_ADJ_FOR_KPP( ITLOOP, IGAS ), STAT=AS )\n" . " IF ( AS /= 0 ) CALL ALLOC_ERR( 'CSPEC_ADJ_FOR_KPP' )\n" . " CSPEC_ADJ_FOR_KPP = 0d0\n" . "\n" . " ALLOCATE( CSPEC_FOR_KPP( ITLOOP, IGAS ), STAT=AS )\n" . " IF ( AS /= 0 ) CALL ALLOC_ERR( 'CSPEC_FOR_KPP' )\n" . " CSPEC_FOR_KPP = 0d0\n"; $input = ; while( $input !~ m/CSPEC_FULL = 0d0/ ) { print FILE "$input"; $input = ; } print FILE "$input" . "\n" . " ALLOCATE( R_KPP( ITLOOP, NMTRATE ), STAT=AS )\n" . " IF ( AS /= 0 ) CALL ALLOC_ERR( 'R_KPP' )\n" . " R_KPP = 0d0\n"; $input = ; while( $input !~ m/VOLUME = 0d0/ ) { print FILE "$input"; $input = ; } print FILE "$input" . "\n" . " ALLOCATE( EMIS_RATE( ITLOOP, 40 ), STAT=AS )\n" . " IF ( AS /= 0 ) CALL ALLOC_ERR( 'EMIS_RATE' )\n" . " EMIS_RATE = 0d0\n" . "\n" . " ALLOCATE( PART_CASE( ITLOOP ), STAT=AS )\n" . " IF ( AS /= 0 ) CALL ALLOC_ERR( 'CSPEC' )\n" . " PART_CASE = 0d0\n"; $input = ; while( $input !~ m/OFFLINE AEROSOL SIMULATION/ ) { print FILE "$input"; $input = ; } while( $input !~ m/TAREA = 0d0/ ) { print FILE "$input"; $input = ; } for( $i=0; $i<3; $i++ ) { print FILE "$input"; $input = ; } print FILE "$input" . " ALLOCATE( HSAVE_KPP( IIPAR, JJPAR, LLTROP ), STAT=AS )\n" . " IF ( AS /= 0 ) CALL ALLOC_ERR( 'HSAVE_KPP' )\n" . " HSAVE_KPP = 0.d0\n"; #Add CLEANUP_COMODE code $input = ; while( $input !~ m/IF \( ALLOCATED\( CSPEC \) \) DEALLOCATE\( CSPEC \)/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " IF ( ALLOCATED( CSPEC_ADJ ) ) DEALLOCATE( CSPEC_ADJ )\n" . " IF ( ALLOCATED( CSPEC_FOR_KPP ) ) DEALLOCATE( CSPEC_FOR_KPP )\n" . " IF ( ALLOCATED( CSPEC_ADJ_FOR_KPP ) )\n" . " & DEALLOCATE( CSPEC_ADJ_FOR_KPP )\n"; $input = ; while( $input !~ m/IF \( ALLOCATED\( CSUMA \) \) DEALLOCATE\( CSUMA \)/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " IF ( ALLOCATED( R_KPP ) ) DEALLOCATE( R_KPP )\n" . " IF ( ALLOCATED( HSAVE_KPP ) ) DEALLOCATE( HSAVE_KPP )\n"; $input = ; while( $input !~ m/IF \( ALLOCATED\( REMIS \) \) DEALLOCATE\( REMIS \)/ ) { print FILE "$input"; $input = ; } print FILE "$input" . " IF ( ALLOCATED( EMIS_RATE ) ) DEALLOCATE( EMIS_RATE )\n" . " IF ( ALLOCATED( PART_CASE ) ) DEALLOCATE( PART_CASE )\n"; while( !eof(TEMP) ) { $input = ; print FILE "$input"; } close(FILE); close(TEMP); } #============================================= # Modify Comode_Mod #============================================= sub modComodeModFwdKpp { printf "Modifying comode_mod.f\n"; $input = ; while( $input !~ m/REAL\*8, ALLOCATABLE :: VOLUME\(:\)/ ) { print FILE "$input"; $input = ; } print FILE "$input" . "\n" . " !***************KPP_INTERFACE****************\n" . " REAL*8, ALLOCATABLE :: R_KPP(:,:)\n" . " REAL*8, ALLOCATABLE :: HSAVE_KPP(:,:,:)\n" . " REAL*8, ALLOCATABLE :: CSPEC_FOR_KPP(:,:)\n" . " !********************************************\n"; $input = ; while( $input !~ m/VOLUME = 0d0/ ) { print FILE "$input"; $input = ; } print FILE "$input" . "\n" . " !***************KPP_INTERFACE****************\n" . "\n" . " ALLOCATE( R_KPP( ITLOOP, NMTRATE ), STAT=AS )\n" . " IF ( AS /= 0 ) CALL ALLOC_ERR( 'R_KPP' )\n" . " R_KPP = 0d0\n" . "\n" . " ALLOCATE( HSAVE_KPP( IIPAR, JJPAR, LLTROP ), STAT=AS )\n" . " IF ( AS /= 0 ) CALL ALLOC_ERR( 'HSAVE_KPP' )\n" . " HSAVE_KPP = 0d0\n" . "\n" . " ALLOCATE( CSPEC_FOR_KPP( ITLOOP, IGAS ), STAT=AS )\n" . " IF ( AS /= 0 ) CALL ALLOC_ERR( 'CSPEC_FOR_KPP' )\n" . " CSPEC_FOR_KPP = 0d0\n" . "\n" . " !********************************************\n"; while( !eof(TEMP) ) { $input = ; print FILE "$input"; } close(FILE); close(TEMP); } #============================================= # Create Makefile.ifort for ADJ_4D_TRAC #============================================= sub createMakeIfortAdj4dTrac { printf "Creating Makefile.ifort\n"; open(FILE, ">Makefile.ifort") || die "Unable to open Makefile.ifort"; print FILE "#=============================================================================\n" . "# \$Id: Makefile.ifort,v 1.18 2006/10/17 17:51:06 bmy Exp \$\n" . "#\n" . "# GEOS-Chem Makefile for LINUX/IFORT compiler (bmy, Thu Aug 17 12:30:28 2006)\n" . "#=============================================================================\n" . "SHELL = /bin/sh\n" . "\n" . "# IFORT compilation options\n" . "FFLAGS = -cpp -w -O2 -auto -noalign -convert big_endian\n" . "\n" . "# Compile command -- multiprocessor\n" . "F90 = ifort \$(FFLAGS) -openmp -Dmultitask -mp\n" . "#F90 = ifort \$(FFLAGS) -openmp -Dmultitask\n" . "\n" . "# Compile command -- single processor\n" . "#F90 = ifort \$(FFLAGS)\n" . "\n" . "# C compiler\n" . "CC = gcc\n" . "\n" . "OBJSe = \\\n" . "linux_err.o \\\n" . "ifort_errmsg.o\n" . "\n" . "OBJS = \\\n" . "CO_strat_pl.o \\\n" . "airmas.o \\\n" . "anthroems.o \\\n" . "arsl1k.o \\\n" . "backsub.o \\\n" . "biofit.o \\\n" . "boxvl.o \\\n" . "calcrate.o \\\n" . "chemdr.o \\\n" . "calc_obsgrad.o \\\n" . "calc_bggrad.o \\\n" . "chemdr_adj.o \\\n" . "cleanup.o \\\n" . "decomp.o \\\n" . "diag1.o \\\n" . "diag3.o \\\n" . "diag_2pm.o \\\n" . "diagoh.o \\\n" . "emf_scale.o \\\n" . "emfossil.o \\\n" . "emisop.o \\\n" . "emisop_grass.o \\\n" . "emisop_mb.o \\\n" . "emissdr.o \\\n" . "emmonot.o \\\n" . "fertadd.o \\\n" . "findmon.o \\\n" . "fyrno3.o \\\n" . "gasconc.o \\\n" . "get_global_ch4.o \\\n" . "getifsun.o \\\n" . "initialize.o \\\n" . "jsparse.o \\\n" . "ksparse.o \\\n" . "lump.o \\\n" . "lump_adj.o \\\n" . "subdriver_fwd_4d.o \\\n" . "subdriver_bwd_4d.o \\\n" . "4dvar_driver.o \\\n" . "ndxx_setup.o \\\n" . "ohsave.o \\\n" . "partition.o \\\n" . "partition_adj.o \\\n" . "pderiv.o \\\n" . "physproc.o \\\n" . "precipfrac.o \\\n" . "pulsing.o \\\n" . "rdisopt.o \\\n" . "rdlai.o \\\n" . "rdland.o \\\n" . "rdlight.o \\\n" . "rdmonot.o \\\n" . "rdsoil.o \\\n" . "readchem.o \\\n" . "reader.o \\\n" . "readlai.o \\\n" . "ruralbox.o \\\n" . "routines.f \\\n" . "schem.o \\\n" . "schem_adj.o \\\n" . "setbase.o \\\n" . "setemdep.o \\\n" . "setemis.o \\\n" . "setmodel.o \\\n" . "sfcwindsqr.o \\\n" . "smvgear.o \\\n" . "soilbase.o \\\n" . "soilcrf.o \\\n" . "soilnoxems.o \\\n" . "soiltemp.o \\\n" . "soiltype.o \\\n" . "subfun.o \\\n" . "sunparam.o \\\n" . "tcorr.o \\\n" . "tropopause.o \\\n" . "update.o \\\n" . "xltmmp.o \n" . "\n" . "FJ = \\\n" . "BLKSLV.o \\\n" . "CLDSRF.o \\\n" . "EFOLD.o \\\n" . "FLINT.o \\\n" . "GAUSSP.o \\\n" . "GEN.o \\\n" . "JRATET.o \\\n" . "JVALUE.o \\\n" . "LEGND0.o \\\n" . "MATIN4.o \\\n" . "MIESCT.o \\\n" . "NOABS.o \\\n" . "OPMIE.o \\\n" . "RD_TJPL.o \\\n" . "SPHERE.o \\\n" . "XSEC1D.o \\\n" . "XSECO2.o \\\n" . "XSECO3.o \\\n" . "fast_j.o \\\n" . "fjfunc.o \\\n" . "inphot.o \\\n" . "jv_index.o \\\n" . "photoj.o \\\n" . "rd_js.o \\\n" . "rd_prof.o \\\n" . "set_aer.o \\\n" . "set_prof.o \n" . "\n" . "MODS = \\\n" . "gckpp_Precision.o \\\n" . "gckpp_Parameters.o \\\n" . "gckpp_Global.o \\\n" . "gckpp_JacobianSP.o \\\n" . "gckpp_Jacobian.o \\\n" . "gckpp_LinearAlgebra.o \\\n" . "gckpp_Monitor.o \\\n" . "gckpp_Function.o \\\n" . "gckpp_StoichiomSP.o \\\n" . "gckpp_Stoichiom.o \\\n" . "gckpp_HessianSP.o \\\n" . "gckpp_Hessian.o \\\n" . "gckpp_Util.o \\\n" . "gckpp_adj_Initialize.o \\\n" . "charpak_mod.o \\\n" . "error_mod.o \\\n" . "logical_mod.o \\\n" . "directory_mod.o \\\n" . "unix_cmds_mod.o \\\n" . "tracer_mod.o \\\n" . "julday_mod.o \\\n" . "file_mod.o \\\n" . "grid_mod.o \\\n" . "time_mod.o \\\n" . "bpch2_mod.o \\\n" . "regrid_1x1_mod.o \\\n" . "pressure_mod.o \\\n" . "transfer_mod.o \\\n" . "future_emissions_mod.o \\\n" . "lai_mod.o \\\n" . "tracerid_mod.o \\\n" . "benchmark_mod.o \\\n" . "comode_mod.o \\\n" . "gckpp_Rates.o \\\n" . "gckpp_Initialize.o \\\n" . "gckpp_adj_Initialize.o \\\n" . "gckpp_Integrator.o \\\n" . "gckpp_Model.o \\\n" . "gckpp_adj_Integrator.o \\\n" . "gckpp_adj_Integrator_em.o \\\n" . "diag_mod.o \\\n" . "dao_mod.o \\\n" . "checkpoint_mod.o \\\n" . "pbl_mix_mod.o \\\n" . "tropopause_mod.o \\\n" . "diag03_mod.o \\\n" . "diag04_mod.o \\\n" . "diag41_mod.o \\\n" . "diag42_mod.o \\\n" . "diag48_mod.o \\\n" . "diag49_mod.o \\\n" . "diag50_mod.o \\\n" . "diag51_mod.o \\\n" . "diag56_mod.o \\\n" . "diag_oh_mod.o \\\n" . "diag_pl_mod.o \\\n" . "ocean_mercury_mod.o \\\n" . "drydep_mod.o \\\n" . "bravo_mod.o \\\n" . "edgar_mod.o \\\n" . "emep_mod.o \\\n" . "epa_nei_mod.o \\\n" . "streets_anthro_mod.o \\\n" . "geia_mod.o \\\n" . "global_ch4_mod.o \\\n" . "global_hno3_mod.o \\\n" . "global_no3_mod.o \\\n" . "global_nox_mod.o \\\n" . "global_oh_mod.o \\\n" . "global_o3_mod.o \\\n" . "uvalbedo_mod.o \\\n" . "RnPbBe_mod.o \\\n" . "Kr85_mod.o \\\n" . "acetone_mod.o \\\n" . "aerosol_mod.o \\\n" . "aircraft_nox_mod.o \\\n" . "biofuel_mod.o \\\n" . "gc_biomass_mod.o \\\n" . "gfed2_biomass_mod.o \\\n" . "biomass_mod.o \\\n" . "c2h6_mod.o \\\n" . "ch3i_mod.o \\\n" . "a3_read_mod.o \\\n" . "a6_read_mod.o \\\n" . "i6_read_mod.o \\\n" . "gcap_read_mod.o \\\n" . "gwet_read_mod.o \\\n" . "xtra_read_mod.o \\\n" . "megan_mod.o \\\n" . "carbon_mod.o \\\n" . "lightning_nox_mod.o \\\n" . "lightning_nox_nl_mod.o \\\n" . "optdepth_mod.o \\\n" . "planeflight_mod.o \\\n" . "restart_mod.o \\\n" . "rpmares_mod.o \\\n" . "isoropia_mod.o \\\n" . "wetscav_mod.o \\\n" . "seasalt_mod.o \\\n" . "sulfate_mod.o \\\n" . "hcn_ch3cn_mod.o \\\n" . "tagged_co_mod.o \\\n" . "tagged_ox_mod.o \\\n" . "gcap_convect_mod.o \\\n" . "fvdas_convect_mod.o \\\n" . "convection_mod.o \\\n" . "pjc_pfix_mod.o \\\n" . "dust_dead_mod.o \\\n" . "dust_mod.o \\\n" . "co2_mod.o \\\n" . "read_teso3_mod.o \\\n" . "mercury_mod.o \\\n" . "toms_mod.o \\\n" . "tpcore_bc_mod.o \\\n" . "tpcore_fvdas_mod.o \\\n" . "tpcore_mod.o \\\n" . "tpcore_window_mod.o \\\n" . "transport_mod.o \\\n" . "linoz_mod.o \\\n" . "upbdflx_mod.o \\\n" . "chemistry_mod.o \\\n" . "emissions_mod.o \\\n" . "gamap_mod.o \\\n" . "input_mod.o\n" . "\n" . "#=============================================================================\n" . "# Executable with FAST-J (default)\n" . "#=============================================================================\n" . "geos : \$(MODS) \$(OBJS) \$(OBJSe) \$(FJ) \n" . " \$(F90) \$(MODS) \$(OBJS) \$(OBJSe) \$(FJ) -o geos\n" . "\n" . "#==============================================================================\n" . "# Dependencies Listing\n" . "#==============================================================================\n" . "BLKSLV.o : BLKSLV.f jv_mie.h \n" . "CLDSRF.o : CLDSRF.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "CO_strat_pl.o : CO_strat_pl.f CMN_SIZE define.h \n" . "EFOLD.o : EFOLD.f \n" . "FLINT.o : FLINT.f \n" . "GAUSSP.o : GAUSSP.f \n" . "GEN.o : GEN.f jv_mie.h \n" . "JRATET.o : JRATET.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "JVALUE.o : JVALUE.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "Kr85_mod.o : Kr85_mod.f CMN_DIAG CMN_O3 CMN_SIZE define.h define.h \n" . "LEGND0.o : LEGND0.f \n" . "MATIN4.o : MATIN4.f \n" . "MIESCT.o : MIESCT.f jv_mie.h \n" . "NOABS.o : NOABS.f \n" . "OPMIE.o : OPMIE.f cmn_fj.h CMN_SIZE define.h jv_cmn.h jv_mie.h \n" . "RD_TJPL.o : RD_TJPL.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "RnPbBe_mod.o : RnPbBe_mod.f CMN_DEP CMN_DIAG CMN_SIZE define.h define.h \n" . "SPHERE.o : SPHERE.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "XSEC1D.o : XSEC1D.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "XSECO2.o : XSECO2.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "XSECO3.o : XSECO3.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "a3_read_mod.o : a3_read_mod.f CMN_DIAG CMN_SIZE define.h \n" . "a6_read_mod.o : a6_read_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "acetone_mod.o : acetone_mod.f CMN_DEP CMN_DIAG CMN_MONOT CMN_SIZE define.h \n" . "aerosol_mod.o : aerosol_mod.f CMN_DIAG CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h comode.h jv_cmn.h \n" . "aircraft_nox_mod.o : aircraft_nox_mod.f CMN CMN_DIAG CMN_NOX CMN_SIZE define.h \n" . "airmas.o : airmas.f \n" . "anthroems.o : anthroems.f CMN_O3 CMN_SIZE define.h comode.h \n" . "arsl1k.o : arsl1k.f \n" . "backsub.o : backsub.f CMN_SIZE define.h comode.h \n" . "benchmark_mod.o : benchmark_mod.f CMN_SIZE define.h \n" . "biofit.o : biofit.f CMN_DEP CMN_SIZE define.h \n" . "biofuel_mod.o : biofuel_mod.f CMN_DIAG CMN_SIZE define.h \n" . "biomass_mod.o : biomass_mod.f CMN_DIAG CMN_SIZE define.h \n" . " \$(F90) -c -CB \$*.f\n" . "boxvl.o : boxvl.f \n" . "bpch2_mod.o : bpch2_mod.f CMN_SIZE define.h define.h \n" . "bravo_mod.o : bravo_mod.f CMN_SIZE define.h \n" . "c2h6_mod.o : c2h6_mod.f CMN CMN_DIAG CMN_O3 CMN_SIZE define.h \n" . "calcrate.o : calcrate.f CMN CMN_DIAG CMN_SIZE define.h comode.h \n" . "carbon_mod.o : carbon_mod.f CMN CMN_DIAG CMN_GCTM CMN_O3 CMN_SIZE define.h comode.h \n" . " \$(F90) -c -CB \$*.f\n" . "ch3i_mod.o : ch3i_mod.f CMN_DEP CMN_DIAG CMN_SIZE define.h comode.h \n" . "charpak_mod.o : charpak_mod.f \n" . "chemdr.o : chemdr.f CMN CMN_DEP CMN_DIAG CMN_NOX CMN_O3 CMN_SIZE define.h comode.h \n" . "chemdr_adj.o : chemdr_adj.f CMN CMN_DEP CMN_DIAG CMN_NOX CMN_O3 CMN_SIZE define.h comode.h \n" . "chemistry_mod.o : chemistry_mod.f CMN_DIAG CMN_SIZE define.h comode.h \n" . "cleanup.o : cleanup.f \n" . "co2_mod.o : co2_mod.f CMN_SIZE define.h \n" . "comode_mod.o : comode_mod.f CMN_SIZE define.h comode.h \n" . "convection_mod.o : convection_mod.f CMN_DIAG CMN_SIZE define.h define.h \n" . "dao_mod.o : dao_mod.f CMN_GCTM CMN_SIZE define.h \n" . "decomp.o : decomp.f CMN_SIZE define.h comode.h \n" . "diag03_mod.o : diag03_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag04_mod.o : diag04_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag1.o : diag1.f CMN_DIAG CMN_GCTM CMN_O3 CMN_SIZE define.h \n" . "diag3.o : diag3.f CMN CMN_DIAG CMN_O3 CMN_SIZE define.h comode.h \n" . "diag41_mod.o : diag41_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag42_mod.o : diag42_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag48_mod.o : diag48_mod.f CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "diag49_mod.o : diag49_mod.f CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "diag50_mod.o : diag50_mod.f CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "diag51_mod.o : diag51_mod.f CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "diag56_mod.o : diag56_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag_2pm.o : diag_2pm.f CMN_DIAG CMN_SIZE define.h \n" . "diag_mod.o : diag_mod.f \n" . "diag_oh_mod.o : diag_oh_mod.f CMN_SIZE define.h comode.h \n" . "diag_pl_mod.o : diag_pl_mod.f CMN_DIAG CMN_SIZE define.h comode.h \n" . "diagoh.o : diagoh.f CMN_DIAG CMN_O3 CMN_SIZE define.h \n" . "directory_mod.o : directory_mod.f \n" . "drydep_mod.o : drydep_mod.f CMN_DEP CMN_DIAG CMN_GCTM CMN_SIZE define.h CMN_VEL commsoil.h comode.h \n" . "dust_dead_mod.o : dust_dead_mod.f CMN_GCTM CMN_SIZE define.h \n" . "dust_mod.o : dust_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h comode.h jv_cmn.h \n" . "edgar_mod.o : edgar_mod.f CMN_SIZE define.h \n" . "emep_mod.o : emep_mod.f CMN_SIZE define.h \n" . "emf_scale.o : emf_scale.f CMN_O3 CMN_SIZE define.h comode.h \n" . "emfossil.o : emfossil.f CMN_DIAG CMN_O3 CMN_SIZE define.h comode.h \n" . "emisop.o : emisop.f CMN_ISOP CMN_SIZE define.h CMN_VEL \n" . "emisop_grass.o : emisop_grass.f CMN_ISOP CMN_SIZE define.h CMN_VEL \n" . "emisop_mb.o : emisop_mb.f CMN_ISOP CMN_SIZE define.h CMN_VEL \n" . "emissdr.o : emissdr.f CMN CMN_DIAG CMN_MONOT CMN_NOX CMN_O3 CMN_SIZE define.h comode.h \n" . "emissions_mod.o : emissions_mod.f CMN_SIZE define.h \n" . "emmonot.o : emmonot.f CMN_MONOT CMN_SIZE define.h CMN_VEL \n" . "epa_nei_mod.o : epa_nei_mod.f CMN_SIZE define.h \n" . "error_mod.o : error_mod.f define.h \n" . "fast_j.o : fast_j.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "fertadd.o : fertadd.f CMN_SIZE define.h commsoil.h \n" . "file_mod.o : file_mod.f define.h \n" . "findmon.o : findmon.f \n" . "fjfunc.o : fjfunc.f cmn_fj.h CMN_SIZE define.h \n" . "future_emissions_mod.o : future_emissions_mod.f CMN_SIZE define.h \n" . "fvdas_convect_mod.o : fvdas_convect_mod.f CMN_DIAG CMN_SIZE define.h \n" . "fyrno3.o : fyrno3.f \n" . "gamap_mod.o : gamap_mod.f CMN_DIAG CMN_SIZE define.h \n" . "gasconc.o : gasconc.f CMN_SIZE define.h comode.h \n" . "gc_biomass_mod.o : gc_biomass_mod.f CMN_SIZE define.h \n" . "gcap_convect_mod.o : gcap_convect_mod.f CMN_DIAG CMN_SIZE define.h \n" . "gcap_read_mod.o : gcap_read_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "geia_mod.o : geia_mod.f CMN_SIZE define.h \n" . "get_global_ch4.o : get_global_ch4.f \n" . "getifsun.o : getifsun.f CMN_SIZE define.h comode.h \n" . "gfed2_biomass_mod.o : gfed2_biomass_mod.f CMN_SIZE define.h \n" . "global_ch4_mod.o : global_ch4_mod.f CMN CMN_DIAG CMN_SIZE define.h \n" . "global_hno3_mod.o : global_hno3_mod.f CMN_SIZE define.h \n" . "global_no3_mod.o : global_no3_mod.f CMN_SIZE define.h \n" . "global_nox_mod.o : global_nox_mod.f CMN_SIZE define.h \n" . "global_o3_mod.o : global_o3_mod.f CMN_SIZE define.h \n" . "global_oh_mod.o : global_oh_mod.f CMN_SIZE define.h \n" . "grid_mod.o : grid_mod.f CMN_GCTM CMN_SIZE define.h \n" . "gwet_read_mod.o : gwet_read_mod.f CMN_DIAG CMN_SIZE define.h \n" . "hcn_ch3cn_mod.o : hcn_ch3cn_mod.f CMN_DEP CMN_DIAG CMN_SIZE define.h \n" . "i6_read_mod.o : i6_read_mod.f CMN_DIAG CMN_SIZE define.h \n" . "ifort_errmsg.o : ifort_errmsg.f \n" . "initialize.o : initialize.f CMN_DIAG CMN_SIZE define.h \n" . "inphot.o : inphot.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "input_mod.o : input_mod.f CMN CMN_DIAG CMN_O3 CMN_SIZE define.h define.h \n" . "isoropia_mod.o : isoropia_mod.f CMN_SIZE define.h isoropia.h \n" . "jsparse.o : jsparse.f CMN_SIZE define.h comode.h \n" . "julday_mod.o : julday_mod.f \n" . "jv_index.o : jv_index.f cmn_fj.h CMN_SIZE define.h comode.h \n" . "ksparse.o : ksparse.f CMN_SIZE define.h comode.h \n" . "lai_mod.o : lai_mod.f CMN_SIZE define.h \n" . "lightning_nox_mod.o : lightning_nox_mod.f CMN_DIAG CMN_GCTM CMN_NOX CMN_SIZE define.h define.h \n" . "lightning_nox_nl_mod.o : lightning_nox_nl_mod.f CMN_DIAG CMN_GCTM CMN_NOX CMN_SIZE define.h \n" . "logical_mod.o : logical_mod.f \n" . "lump.o : lump.f CMN_SIZE define.h comode.h \n" . "main.o : main.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "megan_mod.o : megan_mod.f CMN_GCTM CMN_SIZE define.h \n" . "mercury_mod.o : mercury_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "ndxx_setup.o : ndxx_setup.f CMN_DIAG CMN_SIZE define.h \n" . "ocean_mercury_mod.o : ocean_mercury_mod.f CMN_DEP CMN_SIZE define.h \n" . "ohsave.o : ohsave.f CMN_SIZE define.h comode.h \n" . "optdepth_mod.o : optdepth_mod.f CMN_DIAG CMN_SIZE define.h \n" . "partition.o : partition.f CMN_SIZE define.h comode.h \n" . "pbl_mix_mod.o : pbl_mix_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "pderiv.o : pderiv.f CMN_SIZE define.h comode.h \n" . "photoj.o : photoj.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "physproc.o : physproc.f CMN_SIZE define.h comode.h \n" . "pjc_pfix_mod.o : pjc_pfix_mod.f CMN CMN_GCTM CMN_SIZE define.h \n" . "planeflight_mod.o : planeflight_mod.f CMN_DIAG CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h comode.h jv_cmn.h \n" . "precipfrac.o : precipfrac.f CMN_SIZE define.h \n" . "pressure_mod.o : pressure_mod.f CMN_SIZE define.h \n" . "pulsing.o : pulsing.f CMN_SIZE define.h commsoil.h \n" . "rd_js.o : rd_js.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "rd_prof.o : rd_prof.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "rdisopt.o : rdisopt.f CMN_SIZE define.h \n" . "rdlai.o : rdlai.f CMN_DEP CMN_SIZE define.h CMN_VEL \n" . "rdland.o : rdland.f CMN_DEP CMN_SIZE define.h CMN_VEL \n" . "rdlight.o : rdlight.f CMN_ISOP CMN_SIZE define.h \n" . "rdmonot.o : rdmonot.f CMN_SIZE define.h \n" . "rdsoil.o : rdsoil.f CMN_SIZE define.h commsoil.h \n" . "readchem.o : readchem.f CMN_SIZE define.h comode.h \n" . "reader.o : reader.f CMN_GCTM CMN_SIZE define.h comode.h \n" . "readlai.o : readlai.f CMN_DEP CMN_SIZE define.h CMN_VEL \n" . "regrid_1x1_mod.o : regrid_1x1_mod.f CMN_GCTM CMN_SIZE define.h \n" . "restart_mod.o : restart_mod.f CMN_SIZE define.h \n" . "rpmares_mod.o : rpmares_mod.f CMN_SIZE define.h \n" . "ruralbox.o : ruralbox.f CMN_SIZE define.h comode.h \n" . "schem.o : schem.f CMN_SIZE define.h \n" . "schem_adj.o : schem_adj.f CMN_SIZE define.h \n" . "seasalt_mod.o : seasalt_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "set_aer.o : set_aer.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "set_prof.o : set_prof.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "setbase.o : setbase.f CMN CMN_ISOP CMN_MONOT CMN_SIZE define.h CMN_VEL \n" . "setemdep.o : setemdep.f CMN_SIZE define.h comode.h \n" . "setemis.o : setemis.f CMN_DIAG CMN_NOX CMN_SIZE define.h comode.h \n" . " \$(F90) -c -CB \$*.f\n" . "setmodel.o : setmodel.f CMN_SIZE define.h comode.h \n" . "sfcwindsqr.o : sfcwindsqr.f CMN_SIZE define.h \n" . "smvgear.o : smvgear.f CMN_SIZE define.h comode.h \n" . "soilbase.o : soilbase.f CMN_SIZE define.h commsoil.h \n" . "soilcrf.o : soilcrf.f CMN_DEP CMN_SIZE define.h commsoil.h \n" . "soilnoxems.o : soilnoxems.f CMN_DEP CMN_DIAG CMN_NOX CMN_SIZE define.h commsoil.h \n" . "soiltemp.o : soiltemp.f CMN_SIZE define.h commsoil.h \n" . "soiltype.o : soiltype.f CMN_SIZE define.h commsoil.h \n" . "streets_anthro_mod.o : streets_anthro_mod.f CMN_SIZE define.h \n" . "subfun.o : subfun.f CMN_SIZE define.h comode.h \n" . "sulfate_mod.o : sulfate_mod.f CMN_DIAG CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h \n" . " \$(F90) -c -CB \$*.f\n" . "sunparam.o : sunparam.f \n" . "tagged_co_mod.o : tagged_co_mod.f CMN_DIAG CMN_O3 CMN_SIZE define.h\n" . "linoz_mod.o : linoz_mod.f CMN CMN_DIAG CMN_O3 CMN_SIZE define.h linoz.com \n" . "tagged_ox_mod.o : tagged_ox_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "tcorr.o : tcorr.f \n" . "time_mod.o : time_mod.f define.h \n" . "toms_mod.o : toms_mod.f CMN_SIZE define.h \n" . "tpcore_bc_mod.o : tpcore_bc_mod.f CMN CMN_SIZE define.h \n" . "tpcore_fvdas_mod.o : tpcore_fvdas_mod.f90 \n" . " \$(F90) -c -r8 \$*.f90\n" . "tpcore_mod.o : tpcore_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h define.h \n" . " \$(F90) -c -r8 \$*.f\n" . "tpcore_window_mod.o : tpcore_window_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h define.h \n" . " \$(F90) -c -r8 \$*.f\n" . "tracer_mod.o : tracer_mod.f CMN_SIZE define.h \n" . "tracerid_mod.o : tracerid_mod.f CMN_SIZE define.h comode.h \n" . "transfer_mod.o : transfer_mod.f CMN_SIZE define.h \n" . "transport_mod.o : transport_mod.f CMN CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "tropopause.o : tropopause.f CMN CMN_DIAG CMN_SIZE define.h \n" . "tropopause_mod.o : tropopause_mod.f CMN CMN_SIZE comode.h define.h \n" . "unix_cmds_mod.o : unix_cmds_mod.f \n" . "upbdflx_mod.o : upbdflx_mod.f CMN_GCTM CMN_SIZE define.h \n" . "update.o : update.f CMN_SIZE define.h comode.h \n" . "uvalbedo_mod.o : uvalbedo_mod.f CMN_SIZE define.h \n" . "wetscav_mod.o : wetscav_mod.f CMN_DIAG CMN_SIZE define.h \n" . "xltmmp.o : xltmmp.f CMN_SIZE define.h \n" . "xtra_read_mod.o : xtra_read_mod.f CMN_DIAG CMN_SIZE define.h \n" . "\n" . "#==============================================================================\n" . "# Other compilation commands\n" . "#==============================================================================\n" . "ifort_errmsg.o : ifort_errmsg.f \n" . "linux_err.o : linux_err.c \n" . " \$(CC) -c linux_err.c\n" . "\n" . "#=============================================================================\n" . "# Other Makefile Commands\n" . "#=============================================================================\n" . "clean:\n" . " rm -rf *.o *.mod ifc* geos rii_files\n" . "\n" . ".SUFFIXES: .f .F .f90 .F90\n" . ".f.o: ; \$(F90) -c \$*.f\n" . ".F.o: ; \$(F90) -c \$*.F\n" . ".f90.o: ; \$(F90) -c -free \$*.f90 \n"; close(FILE); } #============================================= # Create Makefile.ifort for ADJ_FD #============================================= sub createMakeIfortAdjFd { printf "Creating Makefile.ifort\n"; open(FILE, ">Makefile.ifort") || die "Unable to open Makefile.ifort"; print FILE "#=============================================================================\n" . "# \$Id: Makefile.ifort,v 1.18 2006/10/17 17:51:06 bmy Exp \$\n" . "#\n" . "# GEOS-Chem Makefile for LINUX/IFORT compiler (bmy, Thu Aug 17 12:30:28 2006)\n" . "#=============================================================================\n" . "SHELL = /bin/sh\n" . "\n" . "# IFORT compilation options\n" . "FFLAGS = -cpp -w -O2 -auto -noalign -convert big_endian\n" . "\n" . "# Compile command -- multiprocessor\n" . "F90 = ifort \$(FFLAGS) -openmp -Dmultitask -mp\n" . "#F90 = ifort \$(FFLAGS) -openmp -Dmultitask\n" . "\n" . "# Compile command -- single processor\n" . "#F90 = ifort \$(FFLAGS)\n" . "\n" . "# C compiler\n" . "CC = gcc\n" . "\n" . "OBJSe = \\\n" . "linux_err.o \\\n" . "ifort_errmsg.o\n" . "\n" . "OBJS = \\\n" . "CO_strat_pl.o \\\n" . "airmas.o \\\n" . "anthroems.o \\\n" . "arsl1k.o \\\n" . "backsub.o \\\n" . "biofit.o \\\n" . "boxvl.o \\\n" . "calcrate.o \\\n" . "chemdr.o \\\n" . "chemdr_adj.o \\\n" . "cleanup.o \\\n" . "decomp.o \\\n" . "diag1.o \\\n" . "diag3.o \\\n" . "diag_2pm.o \\\n" . "diagoh.o \\\n" . "emf_scale.o \\\n" . "emfossil.o \\\n" . "emisop.o \\\n" . "emisop_grass.o \\\n" . "emisop_mb.o \\\n" . "emissdr.o \\\n" . "emmonot.o \\\n" . "fertadd.o \\\n" . "findmon.o \\\n" . "fyrno3.o \\\n" . "gasconc.o \\\n" . "get_global_ch4.o \\\n" . "getifsun.o \\\n" . "initialize.o \\\n" . "jsparse.o \\\n" . "ksparse.o \\\n" . "lump.o \\\n" . "lump_adj.o \\\n" . "subdriver_fwd_fd.o \\\n" . "subdriver_bwd_fd.o \\\n" . "fd_driver.o \\\n" . "ndxx_setup.o \\\n" . "ohsave.o \\\n" . "partition.o \\\n" . "partition_adj.o \\\n" . "pderiv.o \\\n" . "physproc.o \\\n" . "precipfrac.o \\\n" . "pulsing.o \\\n" . "rdisopt.o \\\n" . "rdlai.o \\\n" . "rdland.o \\\n" . "rdlight.o \\\n" . "rdmonot.o \\\n" . "rdsoil.o \\\n" . "readchem.o \\\n" . "reader.o \\\n" . "readlai.o \\\n" . "ruralbox.o \\\n" . "schem.o \\\n" . "schem_adj.o \\\n" . "setbase.o \\\n" . "setemdep.o \\\n" . "setemis.o \\\n" . "setmodel.o \\\n" . "sfcwindsqr.o \\\n" . "smvgear.o \\\n" . "soilbase.o \\\n" . "soilcrf.o \\\n" . "soilnoxems.o \\\n" . "soiltemp.o \\\n" . "soiltype.o \\\n" . "subfun.o \\\n" . "sunparam.o \\\n" . "tcorr.o \\\n" . "tropopause.o \\\n" . "update.o \\\n" . "xltmmp.o \n" . "\n" . "FJ = \\\n" . "BLKSLV.o \\\n" . "CLDSRF.o \\\n" . "EFOLD.o \\\n" . "FLINT.o \\\n" . "GAUSSP.o \\\n" . "GEN.o \\\n" . "JRATET.o \\\n" . "JVALUE.o \\\n" . "LEGND0.o \\\n" . "MATIN4.o \\\n" . "MIESCT.o \\\n" . "NOABS.o \\\n" . "OPMIE.o \\\n" . "RD_TJPL.o \\\n" . "SPHERE.o \\\n" . "XSEC1D.o \\\n" . "XSECO2.o \\\n" . "XSECO3.o \\\n" . "fast_j.o \\\n" . "fjfunc.o \\\n" . "inphot.o \\\n" . "jv_index.o \\\n" . "photoj.o \\\n" . "rd_js.o \\\n" . "rd_prof.o \\\n" . "set_aer.o \\\n" . "set_prof.o \n" . "\n" . "MODS = \\\n" . "gckpp_Precision.o \\\n" . "gckpp_Parameters.o \\\n" . "gckpp_Global.o \\\n" . "gckpp_JacobianSP.o \\\n" . "gckpp_Jacobian.o \\\n" . "gckpp_LinearAlgebra.o \\\n" . "gckpp_Monitor.o \\\n" . "gckpp_Function.o \\\n" . "gckpp_StoichiomSP.o \\\n" . "gckpp_Stoichiom.o \\\n" . "gckpp_HessianSP.o \\\n" . "gckpp_Hessian.o \\\n" . "gckpp_Util.o \\\n" . "gckpp_adj_Initialize.o \\\n" . "charpak_mod.o \\\n" . "error_mod.o \\\n" . "logical_mod.o \\\n" . "directory_mod.o \\\n" . "unix_cmds_mod.o \\\n" . "tracer_mod.o \\\n" . "julday_mod.o \\\n" . "file_mod.o \\\n" . "grid_mod.o \\\n" . "time_mod.o \\\n" . "bpch2_mod.o \\\n" . "regrid_1x1_mod.o \\\n" . "pressure_mod.o \\\n" . "transfer_mod.o \\\n" . "future_emissions_mod.o \\\n" . "lai_mod.o \\\n" . "tracerid_mod.o \\\n" . "benchmark_mod.o \\\n" . "comode_mod.o \\\n" . "gckpp_Rates.o \\\n" . "gckpp_Initialize.o \\\n" . "gckpp_adj_Initialize.o \\\n" . "gckpp_Integrator.o \\\n" . "gckpp_Model.o \\\n" . "gckpp_adj_Integrator.o \\\n" . "gckpp_adj_Integrator_em.o \\\n" . "diag_mod.o \\\n" . "dao_mod.o \\\n" . "tropopause_mod.o \\\n" . "checkpoint_mod.o \\\n" . "pbl_mix_mod.o \\\n" . "diag03_mod.o \\\n" . "diag04_mod.o \\\n" . "diag41_mod.o \\\n" . "diag42_mod.o \\\n" . "diag48_mod.o \\\n" . "diag49_mod.o \\\n" . "diag50_mod.o \\\n" . "diag51_mod.o \\\n" . "diag56_mod.o \\\n" . "diag_oh_mod.o \\\n" . "diag_pl_mod.o \\\n" . "ocean_mercury_mod.o \\\n" . "drydep_mod.o \\\n" . "bravo_mod.o \\\n" . "edgar_mod.o \\\n" . "emep_mod.o \\\n" . "epa_nei_mod.o \\\n" . "streets_anthro_mod.o \\\n" . "geia_mod.o \\\n" . "global_ch4_mod.o \\\n" . "global_hno3_mod.o \\\n" . "global_no3_mod.o \\\n" . "global_nox_mod.o \\\n" . "global_oh_mod.o \\\n" . "global_o3_mod.o \\\n" . "uvalbedo_mod.o \\\n" . "RnPbBe_mod.o \\\n" . "Kr85_mod.o \\\n" . "acetone_mod.o \\\n" . "aerosol_mod.o \\\n" . "aircraft_nox_mod.o \\\n" . "biofuel_mod.o \\\n" . "gc_biomass_mod.o \\\n" . "gfed2_biomass_mod.o \\\n" . "biomass_mod.o \\\n" . "c2h6_mod.o \\\n" . "ch3i_mod.o \\\n" . "a3_read_mod.o \\\n" . "a6_read_mod.o \\\n" . "i6_read_mod.o \\\n" . "gcap_read_mod.o \\\n" . "gwet_read_mod.o \\\n" . "xtra_read_mod.o \\\n" . "megan_mod.o \\\n" . "carbon_mod.o \\\n" . "lightning_nox_mod.o \\\n" . "lightning_nox_nl_mod.o \\\n" . "optdepth_mod.o \\\n" . "planeflight_mod.o \\\n" . "restart_mod.o \\\n" . "rpmares_mod.o \\\n" . "isoropia_mod.o \\\n" . "wetscav_mod.o \\\n" . "seasalt_mod.o \\\n" . "sulfate_mod.o \\\n" . "hcn_ch3cn_mod.o \\\n" . "tagged_co_mod.o \\\n" . "tagged_ox_mod.o \\\n" . "gcap_convect_mod.o \\\n" . "fvdas_convect_mod.o \\\n" . "convection_mod.o \\\n" . "pjc_pfix_mod.o \\\n" . "dust_dead_mod.o \\\n" . "dust_mod.o \\\n" . "co2_mod.o \\\n" . "read_sciao3_mod.o \\\n" . "mercury_mod.o \\\n" . "toms_mod.o \\\n" . "tpcore_bc_mod.o \\\n" . "tpcore_fvdas_mod.o \\\n" . "tpcore_mod.o \\\n" . "tpcore_window_mod.o \\\n" . "transport_mod.o \\\n" . "linoz_mod.o \\\n" . "upbdflx_mod.o \\\n" . "chemistry_mod.o \\\n" . "emissions_mod.o \\\n" . "gamap_mod.o \\\n" . "input_mod.o\n" . "\n" . "#=============================================================================\n" . "# Executable with FAST-J (default)\n" . "#=============================================================================\n" . "geos : \$(MODS) \$(OBJS) \$(OBJSe) \$(FJ) \n" . " \$(F90) \$(MODS) \$(OBJS) \$(OBJSe) \$(FJ) -o geos\n" . "\n" . "#==============================================================================\n" . "# Dependencies Listing\n" . "#==============================================================================\n" . "BLKSLV.o : BLKSLV.f jv_mie.h \n" . "CLDSRF.o : CLDSRF.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "CO_strat_pl.o : CO_strat_pl.f CMN_SIZE define.h \n" . "EFOLD.o : EFOLD.f \n" . "FLINT.o : FLINT.f \n" . "GAUSSP.o : GAUSSP.f \n" . "GEN.o : GEN.f jv_mie.h \n" . "JRATET.o : JRATET.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "JVALUE.o : JVALUE.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "Kr85_mod.o : Kr85_mod.f CMN_DIAG CMN_O3 CMN_SIZE define.h define.h \n" . "LEGND0.o : LEGND0.f \n" . "MATIN4.o : MATIN4.f \n" . "MIESCT.o : MIESCT.f jv_mie.h \n" . "NOABS.o : NOABS.f \n" . "OPMIE.o : OPMIE.f cmn_fj.h CMN_SIZE define.h jv_cmn.h jv_mie.h \n" . "RD_TJPL.o : RD_TJPL.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "RnPbBe_mod.o : RnPbBe_mod.f CMN_DEP CMN_DIAG CMN_SIZE define.h define.h \n" . "SPHERE.o : SPHERE.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "XSEC1D.o : XSEC1D.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "XSECO2.o : XSECO2.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "XSECO3.o : XSECO3.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "a3_read_mod.o : a3_read_mod.f CMN_DIAG CMN_SIZE define.h \n" . "a6_read_mod.o : a6_read_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "acetone_mod.o : acetone_mod.f CMN_DEP CMN_DIAG CMN_MONOT CMN_SIZE define.h \n" . "aerosol_mod.o : aerosol_mod.f CMN_DIAG CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h comode.h jv_cmn.h \n" . "aircraft_nox_mod.o : aircraft_nox_mod.f CMN CMN_DIAG CMN_NOX CMN_SIZE define.h \n" . "airmas.o : airmas.f \n" . "anthroems.o : anthroems.f CMN_O3 CMN_SIZE define.h comode.h \n" . "arsl1k.o : arsl1k.f \n" . "backsub.o : backsub.f CMN_SIZE define.h comode.h \n" . "benchmark_mod.o : benchmark_mod.f CMN_SIZE define.h \n" . "biofit.o : biofit.f CMN_DEP CMN_SIZE define.h \n" . "biofuel_mod.o : biofuel_mod.f CMN_DIAG CMN_SIZE define.h \n" . "biomass_mod.o : biomass_mod.f CMN_DIAG CMN_SIZE define.h \n" . " \$(F90) -c -CB \$*.f\n" . "boxvl.o : boxvl.f \n" . "bpch2_mod.o : bpch2_mod.f CMN_SIZE define.h define.h \n" . "bravo_mod.o : bravo_mod.f CMN_SIZE define.h \n" . "c2h6_mod.o : c2h6_mod.f CMN CMN_DIAG CMN_O3 CMN_SIZE define.h \n" . "calcrate.o : calcrate.f CMN CMN_DIAG CMN_SIZE define.h comode.h \n" . "carbon_mod.o : carbon_mod.f CMN CMN_DIAG CMN_GCTM CMN_O3 CMN_SIZE define.h comode.h \n" . " \$(F90) -c -CB \$*.f\n" . "ch3i_mod.o : ch3i_mod.f CMN_DEP CMN_DIAG CMN_SIZE define.h comode.h \n" . "charpak_mod.o : charpak_mod.f \n" . "chemdr.o : chemdr.f CMN CMN_DEP CMN_DIAG CMN_NOX CMN_O3 CMN_SIZE define.h comode.h \n" . "chemdr_adj.o : chemdr_adj.f CMN CMN_DEP CMN_DIAG CMN_NOX CMN_O3 CMN_SIZE define.h comode.h \n" . "chemistry_mod.o : chemistry_mod.f CMN_DIAG CMN_SIZE define.h comode.h \n" . "cleanup.o : cleanup.f \n" . "co2_mod.o : co2_mod.f CMN_SIZE define.h \n" . "comode_mod.o : comode_mod.f CMN_SIZE define.h comode.h \n" . "convection_mod.o : convection_mod.f CMN_DIAG CMN_SIZE define.h define.h \n" . "dao_mod.o : dao_mod.f CMN_GCTM CMN_SIZE define.h \n" . "decomp.o : decomp.f CMN_SIZE define.h comode.h \n" . "diag03_mod.o : diag03_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag04_mod.o : diag04_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag1.o : diag1.f CMN_DIAG CMN_GCTM CMN_O3 CMN_SIZE define.h \n" . "diag3.o : diag3.f CMN CMN_DIAG CMN_O3 CMN_SIZE define.h comode.h \n" . "diag41_mod.o : diag41_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag42_mod.o : diag42_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag48_mod.o : diag48_mod.f CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "diag49_mod.o : diag49_mod.f CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "diag50_mod.o : diag50_mod.f CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "diag51_mod.o : diag51_mod.f CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "diag56_mod.o : diag56_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag_2pm.o : diag_2pm.f CMN_DIAG CMN_SIZE define.h \n" . "diag_mod.o : diag_mod.f \n" . "diag_oh_mod.o : diag_oh_mod.f CMN_SIZE define.h comode.h \n" . "diag_pl_mod.o : diag_pl_mod.f CMN_DIAG CMN_SIZE define.h comode.h \n" . "diagoh.o : diagoh.f CMN_DIAG CMN_O3 CMN_SIZE define.h \n" . "directory_mod.o : directory_mod.f \n" . "drydep_mod.o : drydep_mod.f CMN_DEP CMN_DIAG CMN_GCTM CMN_SIZE define.h CMN_VEL commsoil.h comode.h \n" . "dust_dead_mod.o : dust_dead_mod.f CMN_GCTM CMN_SIZE define.h \n" . "dust_mod.o : dust_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h comode.h jv_cmn.h \n" . "edgar_mod.o : edgar_mod.f CMN_SIZE define.h \n" . "emep_mod.o : emep_mod.f CMN_SIZE define.h \n" . "emf_scale.o : emf_scale.f CMN_O3 CMN_SIZE define.h comode.h \n" . "emfossil.o : emfossil.f CMN_DIAG CMN_O3 CMN_SIZE define.h comode.h \n" . "emisop.o : emisop.f CMN_ISOP CMN_SIZE define.h CMN_VEL \n" . "emisop_grass.o : emisop_grass.f CMN_ISOP CMN_SIZE define.h CMN_VEL \n" . "emisop_mb.o : emisop_mb.f CMN_ISOP CMN_SIZE define.h CMN_VEL \n" . "emissdr.o : emissdr.f CMN CMN_DIAG CMN_MONOT CMN_NOX CMN_O3 CMN_SIZE define.h comode.h \n" . "emissions_mod.o : emissions_mod.f CMN_SIZE define.h \n" . "emmonot.o : emmonot.f CMN_MONOT CMN_SIZE define.h CMN_VEL \n" . "epa_nei_mod.o : epa_nei_mod.f CMN_SIZE define.h \n" . "error_mod.o : error_mod.f define.h \n" . "fast_j.o : fast_j.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "fertadd.o : fertadd.f CMN_SIZE define.h commsoil.h \n" . "file_mod.o : file_mod.f define.h \n" . "findmon.o : findmon.f \n" . "fjfunc.o : fjfunc.f cmn_fj.h CMN_SIZE define.h \n" . "future_emissions_mod.o : future_emissions_mod.f CMN_SIZE define.h \n" . "fvdas_convect_mod.o : fvdas_convect_mod.f CMN_DIAG CMN_SIZE define.h \n" . "fyrno3.o : fyrno3.f \n" . "gamap_mod.o : gamap_mod.f CMN_DIAG CMN_SIZE define.h \n" . "gasconc.o : gasconc.f CMN_SIZE define.h comode.h \n" . "gc_biomass_mod.o : gc_biomass_mod.f CMN_SIZE define.h \n" . "gcap_convect_mod.o : gcap_convect_mod.f CMN_DIAG CMN_SIZE define.h \n" . "gcap_read_mod.o : gcap_read_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "geia_mod.o : geia_mod.f CMN_SIZE define.h \n" . "get_global_ch4.o : get_global_ch4.f \n" . "getifsun.o : getifsun.f CMN_SIZE define.h comode.h \n" . "gfed2_biomass_mod.o : gfed2_biomass_mod.f CMN_SIZE define.h \n" . "global_ch4_mod.o : global_ch4_mod.f CMN CMN_DIAG CMN_SIZE define.h \n" . "global_hno3_mod.o : global_hno3_mod.f CMN_SIZE define.h \n" . "global_no3_mod.o : global_no3_mod.f CMN_SIZE define.h \n" . "global_nox_mod.o : global_nox_mod.f CMN_SIZE define.h \n" . "global_o3_mod.o : global_o3_mod.f CMN_SIZE define.h \n" . "global_oh_mod.o : global_oh_mod.f CMN_SIZE define.h \n" . "grid_mod.o : grid_mod.f CMN_GCTM CMN_SIZE define.h \n" . "gwet_read_mod.o : gwet_read_mod.f CMN_DIAG CMN_SIZE define.h \n" . "hcn_ch3cn_mod.o : hcn_ch3cn_mod.f CMN_DEP CMN_DIAG CMN_SIZE define.h \n" . "i6_read_mod.o : i6_read_mod.f CMN_DIAG CMN_SIZE define.h \n" . "ifort_errmsg.o : ifort_errmsg.f \n" . "initialize.o : initialize.f CMN_DIAG CMN_SIZE define.h \n" . "inphot.o : inphot.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "input_mod.o : input_mod.f CMN CMN_DIAG CMN_O3 CMN_SIZE define.h define.h \n" . "isoropia_mod.o : isoropia_mod.f CMN_SIZE define.h isoropia.h \n" . "jsparse.o : jsparse.f CMN_SIZE define.h comode.h \n" . "julday_mod.o : julday_mod.f \n" . "jv_index.o : jv_index.f cmn_fj.h CMN_SIZE define.h comode.h \n" . "ksparse.o : ksparse.f CMN_SIZE define.h comode.h \n" . "lai_mod.o : lai_mod.f CMN_SIZE define.h \n" . "lightning_nox_mod.o : lightning_nox_mod.f CMN_DIAG CMN_GCTM CMN_NOX CMN_SIZE define.h define.h \n" . "lightning_nox_nl_mod.o : lightning_nox_nl_mod.f CMN_DIAG CMN_GCTM CMN_NOX CMN_SIZE define.h \n" . "logical_mod.o : logical_mod.f \n" . "lump.o : lump.f CMN_SIZE define.h comode.h \n" . "main.o : main.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "megan_mod.o : megan_mod.f CMN_GCTM CMN_SIZE define.h \n" . "mercury_mod.o : mercury_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "ndxx_setup.o : ndxx_setup.f CMN_DIAG CMN_SIZE define.h \n" . "ocean_mercury_mod.o : ocean_mercury_mod.f CMN_DEP CMN_SIZE define.h \n" . "ohsave.o : ohsave.f CMN_SIZE define.h comode.h \n" . "optdepth_mod.o : optdepth_mod.f CMN_DIAG CMN_SIZE define.h \n" . "partition.o : partition.f CMN_SIZE define.h comode.h \n" . "pbl_mix_mod.o : pbl_mix_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "pderiv.o : pderiv.f CMN_SIZE define.h comode.h \n" . "photoj.o : photoj.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "physproc.o : physproc.f CMN_SIZE define.h comode.h \n" . "pjc_pfix_mod.o : pjc_pfix_mod.f CMN CMN_GCTM CMN_SIZE define.h \n" . "planeflight_mod.o : planeflight_mod.f CMN_DIAG CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h comode.h jv_cmn.h \n" . "precipfrac.o : precipfrac.f CMN_SIZE define.h \n" . "pressure_mod.o : pressure_mod.f CMN_SIZE define.h \n" . "pulsing.o : pulsing.f CMN_SIZE define.h commsoil.h \n" . "rd_js.o : rd_js.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "rd_prof.o : rd_prof.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "rdisopt.o : rdisopt.f CMN_SIZE define.h \n" . "rdlai.o : rdlai.f CMN_DEP CMN_SIZE define.h CMN_VEL \n" . "rdland.o : rdland.f CMN_DEP CMN_SIZE define.h CMN_VEL \n" . "rdlight.o : rdlight.f CMN_ISOP CMN_SIZE define.h \n" . "rdmonot.o : rdmonot.f CMN_SIZE define.h \n" . "rdsoil.o : rdsoil.f CMN_SIZE define.h commsoil.h \n" . "readchem.o : readchem.f CMN_SIZE define.h comode.h \n" . "reader.o : reader.f CMN_GCTM CMN_SIZE define.h comode.h \n" . "readlai.o : readlai.f CMN_DEP CMN_SIZE define.h CMN_VEL \n" . "regrid_1x1_mod.o : regrid_1x1_mod.f CMN_GCTM CMN_SIZE define.h \n" . "restart_mod.o : restart_mod.f CMN_SIZE define.h \n" . "rpmares_mod.o : rpmares_mod.f CMN_SIZE define.h \n" . "ruralbox.o : ruralbox.f CMN_SIZE define.h comode.h \n" . "schem.o : schem.f CMN_SIZE define.h \n" . "schem_adj.o : schem_adj.f CMN_SIZE define.h \n" . "seasalt_mod.o : seasalt_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "set_aer.o : set_aer.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "set_prof.o : set_prof.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "setbase.o : setbase.f CMN CMN_ISOP CMN_MONOT CMN_SIZE define.h CMN_VEL \n" . "setemdep.o : setemdep.f CMN_SIZE define.h comode.h \n" . "setemis.o : setemis.f CMN_DIAG CMN_NOX CMN_SIZE define.h comode.h \n" . " \$(F90) -c -CB \$*.f\n" . "setmodel.o : setmodel.f CMN_SIZE define.h comode.h \n" . "sfcwindsqr.o : sfcwindsqr.f CMN_SIZE define.h \n" . "smvgear.o : smvgear.f CMN_SIZE define.h comode.h \n" . "soilbase.o : soilbase.f CMN_SIZE define.h commsoil.h \n" . "soilcrf.o : soilcrf.f CMN_DEP CMN_SIZE define.h commsoil.h \n" . "soilnoxems.o : soilnoxems.f CMN_DEP CMN_DIAG CMN_NOX CMN_SIZE define.h commsoil.h \n" . "soiltemp.o : soiltemp.f CMN_SIZE define.h commsoil.h \n" . "soiltype.o : soiltype.f CMN_SIZE define.h commsoil.h \n" . "streets_anthro_mod.o : streets_anthro_mod.f CMN_SIZE define.h \n" . "subfun.o : subfun.f CMN_SIZE define.h comode.h \n" . "sulfate_mod.o : sulfate_mod.f CMN_DIAG CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h \n" . " \$(F90) -c -CB \$*.f\n" . "sunparam.o : sunparam.f \n" . "tagged_co_mod.o : tagged_co_mod.f CMN_DIAG CMN_O3 CMN_SIZE define.h\n" . "linoz_mod.o : linoz_mod.f CMN CMN_DIAG CMN_O3 CMN_SIZE define.h linoz.com \n" . "tagged_ox_mod.o : tagged_ox_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "tcorr.o : tcorr.f \n" . "time_mod.o : time_mod.f define.h \n" . "toms_mod.o : toms_mod.f CMN_SIZE define.h \n" . "tpcore_bc_mod.o : tpcore_bc_mod.f CMN CMN_SIZE define.h \n" . "tpcore_fvdas_mod.o : tpcore_fvdas_mod.f90 \n" . " \$(F90) -c -r8 \$*.f90\n" . "tpcore_mod.o : tpcore_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h define.h \n" . " \$(F90) -c -r8 \$*.f\n" . "tpcore_window_mod.o : tpcore_window_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h define.h \n" . " \$(F90) -c -r8 \$*.f\n" . "tracer_mod.o : tracer_mod.f CMN_SIZE define.h \n" . "tracerid_mod.o : tracerid_mod.f CMN_SIZE define.h comode.h \n" . "transfer_mod.o : transfer_mod.f CMN_SIZE define.h \n" . "transport_mod.o : transport_mod.f CMN CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "tropopause.o : tropopause.f CMN CMN_DIAG CMN_SIZE define.h \n" . "tropopause_mod.o : tropopause_mod.f CMN CMN_SIZE comode.h define.h \n" . "unix_cmds_mod.o : unix_cmds_mod.f \n" . "upbdflx_mod.o : upbdflx_mod.f CMN_GCTM CMN_SIZE define.h \n" . "update.o : update.f CMN_SIZE define.h comode.h \n" . "uvalbedo_mod.o : uvalbedo_mod.f CMN_SIZE define.h \n" . "wetscav_mod.o : wetscav_mod.f CMN_DIAG CMN_SIZE define.h \n" . "xltmmp.o : xltmmp.f CMN_SIZE define.h \n" . "xtra_read_mod.o : xtra_read_mod.f CMN_DIAG CMN_SIZE define.h \n" . "\n" . "#==============================================================================\n" . "# Other compilation commands\n" . "#==============================================================================\n" . "ifort_errmsg.o : ifort_errmsg.f \n" . "linux_err.o : linux_err.c \n" . " \$(CC) -c linux_err.c\n" . "\n" . "#=============================================================================\n" . "# Other Makefile Commands\n" . "#=============================================================================\n" . "clean:\n" . " rm -rf *.o *.mod ifc* geos rii_files\n" . "\n" . ".SUFFIXES: .f .F .f90 .F90\n" . ".f.o: ; \$(F90) -c \$*.f\n" . ".F.o: ; \$(F90) -c \$*.F\n" . ".f90.o: ; \$(F90) -c -free \$*.f90 \n" . ".F90.o: ; \$(F90) -c -free \$*.f90 \n"; close(FILE); } #============================================= # Create Makefile.ifort.senst #============================================= sub createMakeIfortSenst { printf "Creating Makefile.ifort\n"; open(FILE, ">Makefile.ifort") || die "Unable to open Makefile.ifort"; print FILE "#=============================================================================\n" . "# \$Id: Makefile.ifort,v 1.18 2006/10/17 17:51:06 bmy Exp \$\n" . "#\n" . "# GEOS-Chem Makefile for LINUX/IFORT compiler (bmy, Thu Aug 17 12:30:28 2006)\n" . "#=============================================================================\n" . "SHELL = /bin/sh\n" . "\n" . "# IFORT compilation options\n" . "FFLAGS = -cpp -w -O2 -auto -noalign -convert big_endian\n" . "\n" . "# Compile command -- multiprocessor\n" . "F90 = ifort \$(FFLAGS) -openmp -Dmultitask -mp\n" . "#F90 = ifort \$(FFLAGS) -openmp -Dmultitask\n" . "\n" . "# Compile command -- single processor\n" . "#F90 = ifort \$(FFLAGS)\n" . "\n" . "# C compiler\n" . "CC = gcc\n" . "\n" . "OBJSe = \\\n" . "linux_err.o \\\n" . "ifort_errmsg.o\n" . "\n" . "OBJS = \\\n" . "CO_strat_pl.o \\\n" . "airmas.o \\\n" . "anthroems.o \\\n" . "arsl1k.o \\\n" . "backsub.o \\\n" . "biofit.o \\\n" . "boxvl.o \\\n" . "calcrate.o \\\n" . "chemdr.o \\\n" . "calc_obsgrad.o \\\n" . "chemdr_adj.o \\\n" . "cleanup.o \\\n" . "decomp.o \\\n" . "diag1.o \\\n" . "diag3.o \\\n" . "diag_2pm.o \\\n" . "diagoh.o \\\n" . "emf_scale.o \\\n" . "emfossil.o \\\n" . "emisop.o \\\n" . "emisop_grass.o \\\n" . "emisop_mb.o \\\n" . "emissdr.o \\\n" . "emmonot.o \\\n" . "fertadd.o \\\n" . "findmon.o \\\n" . "fyrno3.o \\\n" . "gasconc.o \\\n" . "get_global_ch4.o \\\n" . "getifsun.o \\\n" . "initialize.o \\\n" . "jsparse.o \\\n" . "ksparse.o \\\n" . "lump.o \\\n" . "lump_adj.o \\\n" . "subdriver_fwd_senst.o \\\n" . "subdriver_bwd_senst.o \\\n" . "senst_driver.o \\\n" . "ndxx_setup.o \\\n" . "ohsave.o \\\n" . "partition.o \\\n" . "partition_adj.o \\\n" . "pderiv.o \\\n" . "physproc.o \\\n" . "precipfrac.o \\\n" . "pulsing.o \\\n" . "rdisopt.o \\\n" . "rdlai.o \\\n" . "rdland.o \\\n" . "rdlight.o \\\n" . "rdmonot.o \\\n" . "rdsoil.o \\\n" . "readchem.o \\\n" . "reader.o \\\n" . "readlai.o \\\n" . "ruralbox.o \\\n" . "schem.o \\\n" . "schem_adj.o \\\n" . "setbase.o \\\n" . "setemdep.o \\\n" . "setemis.o \\\n" . "setmodel.o \\\n" . "sfcwindsqr.o \\\n" . "smvgear.o \\\n" . "soilbase.o \\\n" . "soilcrf.o \\\n" . "soilnoxems.o \\\n" . "soiltemp.o \\\n" . "soiltype.o \\\n" . "subfun.o \\\n" . "sunparam.o \\\n" . "tcorr.o \\\n" . "tropopause.o \\\n" . "update.o \\\n" . "xltmmp.o \n" . "\n" . "FJ = \\\n" . "BLKSLV.o \\\n" . "CLDSRF.o \\\n" . "EFOLD.o \\\n" . "FLINT.o \\\n" . "GAUSSP.o \\\n" . "GEN.o \\\n" . "JRATET.o \\\n" . "JVALUE.o \\\n" . "LEGND0.o \\\n" . "MATIN4.o \\\n" . "MIESCT.o \\\n" . "NOABS.o \\\n" . "OPMIE.o \\\n" . "RD_TJPL.o \\\n" . "SPHERE.o \\\n" . "XSEC1D.o \\\n" . "XSECO2.o \\\n" . "XSECO3.o \\\n" . "fast_j.o \\\n" . "fjfunc.o \\\n" . "inphot.o \\\n" . "jv_index.o \\\n" . "photoj.o \\\n" . "rd_js.o \\\n" . "rd_prof.o \\\n" . "set_aer.o \\\n" . "set_prof.o \n" . "\n" . "MODS = \\\n" . "gckpp_Precision.o \\\n" . "gckpp_Parameters.o \\\n" . "gckpp_Global.o \\\n" . "gckpp_JacobianSP.o \\\n" . "gckpp_Jacobian.o \\\n" . "gckpp_LinearAlgebra.o \\\n" . "gckpp_Monitor.o \\\n" . "gckpp_Function.o \\\n" . "gckpp_StoichiomSP.o \\\n" . "gckpp_Stoichiom.o \\\n" . "gckpp_HessianSP.o \\\n" . "gckpp_Hessian.o \\\n" . "gckpp_Util.o \\\n" . "charpak_mod.o \\\n" . "error_mod.o \\\n" . "logical_mod.o \\\n" . "directory_mod.o \\\n" . "unix_cmds_mod.o \\\n" . "tracer_mod.o \\\n" . "julday_mod.o \\\n" . "file_mod.o \\\n" . "grid_mod.o \\\n" . "time_mod.o \\\n" . "bpch2_mod.o \\\n" . "regrid_1x1_mod.o \\\n" . "pressure_mod.o \\\n" . "transfer_mod.o \\\n" . "future_emissions_mod.o \\\n" . "lai_mod.o \\\n" . "tracerid_mod.o \\\n" . "benchmark_mod.o \\\n" . "comode_mod.o \\\n" . "gckpp_Rates.o \\\n" . "gckpp_Initialize.o \\\n" . "gckpp_adj_Initialize.o \\\n" . "gckpp_Integrator.o \\\n" . "gckpp_Model.o \\\n" . "gckpp_adj_Integrator.o \\\n" . "gckpp_adj_Integrator_em.o \\\n" . "diag_mod.o \\\n" . "dao_mod.o \\\n" . "checkpoint_mod.o \\\n" . "pbl_mix_mod.o \\\n" . "tropopause_mod.o \\\n" . "diag03_mod.o \\\n" . "diag04_mod.o \\\n" . "diag41_mod.o \\\n" . "diag42_mod.o \\\n" . "diag48_mod.o \\\n" . "diag49_mod.o \\\n" . "diag50_mod.o \\\n" . "diag51_mod.o \\\n" . "diag56_mod.o \\\n" . "diag_oh_mod.o \\\n" . "diag_pl_mod.o \\\n" . "ocean_mercury_mod.o \\\n" . "drydep_mod.o \\\n" . "bravo_mod.o \\\n" . "edgar_mod.o \\\n" . "emep_mod.o \\\n" . "epa_nei_mod.o \\\n" . "streets_anthro_mod.o \\\n" . "geia_mod.o \\\n" . "global_ch4_mod.o \\\n" . "global_hno3_mod.o \\\n" . "global_no3_mod.o \\\n" . "global_nox_mod.o \\\n" . "global_oh_mod.o \\\n" . "global_o3_mod.o \\\n" . "uvalbedo_mod.o \\\n" . "RnPbBe_mod.o \\\n" . "Kr85_mod.o \\\n" . "acetone_mod.o \\\n" . "aerosol_mod.o \\\n" . "aircraft_nox_mod.o \\\n" . "biofuel_mod.o \\\n" . "gc_biomass_mod.o \\\n" . "gfed2_biomass_mod.o \\\n" . "biomass_mod.o \\\n" . "c2h6_mod.o \\\n" . "ch3i_mod.o \\\n" . "a3_read_mod.o \\\n" . "a6_read_mod.o \\\n" . "i6_read_mod.o \\\n" . "gcap_read_mod.o \\\n" . "gwet_read_mod.o \\\n" . "xtra_read_mod.o \\\n" . "megan_mod.o \\\n" . "carbon_mod.o \\\n" . "lightning_nox_mod.o \\\n" . "lightning_nox_nl_mod.o \\\n" . "optdepth_mod.o \\\n" . "planeflight_mod.o \\\n" . "restart_mod.o \\\n" . "rpmares_mod.o \\\n" . "isoropia_mod.o \\\n" . "wetscav_mod.o \\\n" . "seasalt_mod.o \\\n" . "sulfate_mod.o \\\n" . "hcn_ch3cn_mod.o \\\n" . "tagged_co_mod.o \\\n" . "tagged_ox_mod.o \\\n" . "gcap_convect_mod.o \\\n" . "fvdas_convect_mod.o \\\n" . "convection_mod.o \\\n" . "pjc_pfix_mod.o \\\n" . "dust_dead_mod.o \\\n" . "dust_mod.o \\\n" . "co2_mod.o \\\n" . "read_teso3_mod.o \\\n" . "mercury_mod.o \\\n" . "toms_mod.o \\\n" . "tpcore_bc_mod.o \\\n" . "tpcore_fvdas_mod.o \\\n" . "tpcore_mod.o \\\n" . "tpcore_window_mod.o \\\n" . "transport_mod.o \\\n" . "linoz_mod.o \\\n" . "upbdflx_mod.o \\\n" . "chemistry_mod.o \\\n" . "emissions_mod.o \\\n" . "gamap_mod.o \\\n" . "input_mod.o\n" . "\n" . "#=============================================================================\n" . "# Executable with FAST-J (default)\n" . "#=============================================================================\n" . "geos : \$(MODS) \$(OBJS) \$(OBJSe) \$(FJ) \n" . " \$(F90) \$(MODS) \$(OBJS) \$(OBJSe) \$(FJ) -o geos\n" . "\n" . "#==============================================================================\n" . "# Dependencies Listing\n" . "#==============================================================================\n" . "BLKSLV.o : BLKSLV.f jv_mie.h \n" . "CLDSRF.o : CLDSRF.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "CO_strat_pl.o : CO_strat_pl.f CMN_SIZE define.h \n" . "EFOLD.o : EFOLD.f \n" . "FLINT.o : FLINT.f \n" . "GAUSSP.o : GAUSSP.f \n" . "GEN.o : GEN.f jv_mie.h \n" . "JRATET.o : JRATET.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "JVALUE.o : JVALUE.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "Kr85_mod.o : Kr85_mod.f CMN_DIAG CMN_O3 CMN_SIZE define.h define.h \n" . "LEGND0.o : LEGND0.f \n" . "MATIN4.o : MATIN4.f \n" . "MIESCT.o : MIESCT.f jv_mie.h \n" . "NOABS.o : NOABS.f \n" . "OPMIE.o : OPMIE.f cmn_fj.h CMN_SIZE define.h jv_cmn.h jv_mie.h \n" . "RD_TJPL.o : RD_TJPL.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "RnPbBe_mod.o : RnPbBe_mod.f CMN_DEP CMN_DIAG CMN_SIZE define.h define.h \n" . "SPHERE.o : SPHERE.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "XSEC1D.o : XSEC1D.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "XSECO2.o : XSECO2.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "XSECO3.o : XSECO3.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "a3_read_mod.o : a3_read_mod.f CMN_DIAG CMN_SIZE define.h \n" . "a6_read_mod.o : a6_read_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "acetone_mod.o : acetone_mod.f CMN_DEP CMN_DIAG CMN_MONOT CMN_SIZE define.h \n" . "aerosol_mod.o : aerosol_mod.f CMN_DIAG CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h comode.h jv_cmn.h \n" . "aircraft_nox_mod.o : aircraft_nox_mod.f CMN CMN_DIAG CMN_NOX CMN_SIZE define.h \n" . "airmas.o : airmas.f \n" . "anthroems.o : anthroems.f CMN_O3 CMN_SIZE define.h comode.h \n" . "arsl1k.o : arsl1k.f \n" . "backsub.o : backsub.f CMN_SIZE define.h comode.h \n" . "benchmark_mod.o : benchmark_mod.f CMN_SIZE define.h \n" . "biofit.o : biofit.f CMN_DEP CMN_SIZE define.h \n" . "biofuel_mod.o : biofuel_mod.f CMN_DIAG CMN_SIZE define.h \n" . "biomass_mod.o : biomass_mod.f CMN_DIAG CMN_SIZE define.h \n" . " \$(F90) -c -CB \$*.f\n" . "boxvl.o : boxvl.f \n" . "bpch2_mod.o : bpch2_mod.f CMN_SIZE define.h define.h \n" . "bravo_mod.o : bravo_mod.f CMN_SIZE define.h \n" . "c2h6_mod.o : c2h6_mod.f CMN CMN_DIAG CMN_O3 CMN_SIZE define.h \n" . "calcrate.o : calcrate.f CMN CMN_DIAG CMN_SIZE define.h comode.h \n" . "carbon_mod.o : carbon_mod.f CMN CMN_DIAG CMN_GCTM CMN_O3 CMN_SIZE define.h comode.h \n" . " \$(F90) -c -CB \$*.f\n" . "ch3i_mod.o : ch3i_mod.f CMN_DEP CMN_DIAG CMN_SIZE define.h comode.h \n" . "charpak_mod.o : charpak_mod.f \n" . "chemdr.o : chemdr.f CMN CMN_DEP CMN_DIAG CMN_NOX CMN_O3 CMN_SIZE define.h comode.h \n" . "chemdr_adj.o : chemdr_adj.f CMN CMN_DEP CMN_DIAG CMN_NOX CMN_O3 CMN_SIZE define.h comode.h \n" . "chemistry_mod.o : chemistry_mod.f CMN_DIAG CMN_SIZE define.h comode.h \n" . "cleanup.o : cleanup.f \n" . "co2_mod.o : co2_mod.f CMN_SIZE define.h \n" . "comode_mod.o : comode_mod.f CMN_SIZE define.h comode.h \n" . "convection_mod.o : convection_mod.f CMN_DIAG CMN_SIZE define.h define.h \n" . "dao_mod.o : dao_mod.f CMN_GCTM CMN_SIZE define.h \n" . "decomp.o : decomp.f CMN_SIZE define.h comode.h \n" . "diag03_mod.o : diag03_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag04_mod.o : diag04_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag1.o : diag1.f CMN_DIAG CMN_GCTM CMN_O3 CMN_SIZE define.h \n" . "diag3.o : diag3.f CMN CMN_DIAG CMN_O3 CMN_SIZE define.h comode.h \n" . "diag41_mod.o : diag41_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag42_mod.o : diag42_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag48_mod.o : diag48_mod.f CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "diag49_mod.o : diag49_mod.f CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "diag50_mod.o : diag50_mod.f CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "diag51_mod.o : diag51_mod.f CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "diag56_mod.o : diag56_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag_2pm.o : diag_2pm.f CMN_DIAG CMN_SIZE define.h \n" . "diag_mod.o : diag_mod.f \n" . "diag_oh_mod.o : diag_oh_mod.f CMN_SIZE define.h comode.h \n" . "diag_pl_mod.o : diag_pl_mod.f CMN_DIAG CMN_SIZE define.h comode.h \n" . "diagoh.o : diagoh.f CMN_DIAG CMN_O3 CMN_SIZE define.h \n" . "directory_mod.o : directory_mod.f \n" . "drydep_mod.o : drydep_mod.f CMN_DEP CMN_DIAG CMN_GCTM CMN_SIZE define.h CMN_VEL commsoil.h comode.h \n" . "dust_dead_mod.o : dust_dead_mod.f CMN_GCTM CMN_SIZE define.h \n" . "dust_mod.o : dust_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h comode.h jv_cmn.h \n" . "edgar_mod.o : edgar_mod.f CMN_SIZE define.h \n" . "emep_mod.o : emep_mod.f CMN_SIZE define.h \n" . "emf_scale.o : emf_scale.f CMN_O3 CMN_SIZE define.h comode.h \n" . "emfossil.o : emfossil.f CMN_DIAG CMN_O3 CMN_SIZE define.h comode.h \n" . "emisop.o : emisop.f CMN_ISOP CMN_SIZE define.h CMN_VEL \n" . "emisop_grass.o : emisop_grass.f CMN_ISOP CMN_SIZE define.h CMN_VEL \n" . "emisop_mb.o : emisop_mb.f CMN_ISOP CMN_SIZE define.h CMN_VEL \n" . "emissdr.o : emissdr.f CMN CMN_DIAG CMN_MONOT CMN_NOX CMN_O3 CMN_SIZE define.h comode.h \n" . "emissions_mod.o : emissions_mod.f CMN_SIZE define.h \n" . "emmonot.o : emmonot.f CMN_MONOT CMN_SIZE define.h CMN_VEL \n" . "epa_nei_mod.o : epa_nei_mod.f CMN_SIZE define.h \n" . "error_mod.o : error_mod.f define.h \n" . "fast_j.o : fast_j.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "fertadd.o : fertadd.f CMN_SIZE define.h commsoil.h \n" . "file_mod.o : file_mod.f define.h \n" . "findmon.o : findmon.f \n" . "fjfunc.o : fjfunc.f cmn_fj.h CMN_SIZE define.h \n" . "future_emissions_mod.o : future_emissions_mod.f CMN_SIZE define.h \n" . "fvdas_convect_mod.o : fvdas_convect_mod.f CMN_DIAG CMN_SIZE define.h \n" . "fyrno3.o : fyrno3.f \n" . "gamap_mod.o : gamap_mod.f CMN_DIAG CMN_SIZE define.h \n" . "gasconc.o : gasconc.f CMN_SIZE define.h comode.h \n" . "gc_biomass_mod.o : gc_biomass_mod.f CMN_SIZE define.h \n" . "gcap_convect_mod.o : gcap_convect_mod.f CMN_DIAG CMN_SIZE define.h \n" . "gcap_read_mod.o : gcap_read_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "geia_mod.o : geia_mod.f CMN_SIZE define.h \n" . "get_global_ch4.o : get_global_ch4.f \n" . "getifsun.o : getifsun.f CMN_SIZE define.h comode.h \n" . "gfed2_biomass_mod.o : gfed2_biomass_mod.f CMN_SIZE define.h \n" . "global_ch4_mod.o : global_ch4_mod.f CMN CMN_DIAG CMN_SIZE define.h \n" . "global_hno3_mod.o : global_hno3_mod.f CMN_SIZE define.h \n" . "global_no3_mod.o : global_no3_mod.f CMN_SIZE define.h \n" . "global_nox_mod.o : global_nox_mod.f CMN_SIZE define.h \n" . "global_o3_mod.o : global_o3_mod.f CMN_SIZE define.h \n" . "global_oh_mod.o : global_oh_mod.f CMN_SIZE define.h \n" . "grid_mod.o : grid_mod.f CMN_GCTM CMN_SIZE define.h \n" . "gwet_read_mod.o : gwet_read_mod.f CMN_DIAG CMN_SIZE define.h \n" . "hcn_ch3cn_mod.o : hcn_ch3cn_mod.f CMN_DEP CMN_DIAG CMN_SIZE define.h \n" . "i6_read_mod.o : i6_read_mod.f CMN_DIAG CMN_SIZE define.h \n" . "ifort_errmsg.o : ifort_errmsg.f \n" . "initialize.o : initialize.f CMN_DIAG CMN_SIZE define.h \n" . "inphot.o : inphot.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "input_mod.o : input_mod.f CMN CMN_DIAG CMN_O3 CMN_SIZE define.h define.h \n" . "isoropia_mod.o : isoropia_mod.f CMN_SIZE define.h isoropia.h \n" . "jsparse.o : jsparse.f CMN_SIZE define.h comode.h \n" . "julday_mod.o : julday_mod.f \n" . "jv_index.o : jv_index.f cmn_fj.h CMN_SIZE define.h comode.h \n" . "ksparse.o : ksparse.f CMN_SIZE define.h comode.h \n" . "lai_mod.o : lai_mod.f CMN_SIZE define.h \n" . "lightning_nox_mod.o : lightning_nox_mod.f CMN_DIAG CMN_GCTM CMN_NOX CMN_SIZE define.h define.h \n" . "lightning_nox_nl_mod.o : lightning_nox_nl_mod.f CMN_DIAG CMN_GCTM CMN_NOX CMN_SIZE define.h \n" . "logical_mod.o : logical_mod.f \n" . "lump.o : lump.f CMN_SIZE define.h comode.h \n" . "main.o : main.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "megan_mod.o : megan_mod.f CMN_GCTM CMN_SIZE define.h \n" . "mercury_mod.o : mercury_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "ndxx_setup.o : ndxx_setup.f CMN_DIAG CMN_SIZE define.h \n" . "ocean_mercury_mod.o : ocean_mercury_mod.f CMN_DEP CMN_SIZE define.h \n" . "ohsave.o : ohsave.f CMN_SIZE define.h comode.h \n" . "optdepth_mod.o : optdepth_mod.f CMN_DIAG CMN_SIZE define.h \n" . "partition.o : partition.f CMN_SIZE define.h comode.h \n" . "pbl_mix_mod.o : pbl_mix_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "pderiv.o : pderiv.f CMN_SIZE define.h comode.h \n" . "photoj.o : photoj.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "physproc.o : physproc.f CMN_SIZE define.h comode.h \n" . "pjc_pfix_mod.o : pjc_pfix_mod.f CMN CMN_GCTM CMN_SIZE define.h \n" . "planeflight_mod.o : planeflight_mod.f CMN_DIAG CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h comode.h jv_cmn.h \n" . "precipfrac.o : precipfrac.f CMN_SIZE define.h \n" . "pressure_mod.o : pressure_mod.f CMN_SIZE define.h \n" . "pulsing.o : pulsing.f CMN_SIZE define.h commsoil.h \n" . "rd_js.o : rd_js.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "rd_prof.o : rd_prof.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "rdisopt.o : rdisopt.f CMN_SIZE define.h \n" . "rdlai.o : rdlai.f CMN_DEP CMN_SIZE define.h CMN_VEL \n" . "rdland.o : rdland.f CMN_DEP CMN_SIZE define.h CMN_VEL \n" . "rdlight.o : rdlight.f CMN_ISOP CMN_SIZE define.h \n" . "rdmonot.o : rdmonot.f CMN_SIZE define.h \n" . "rdsoil.o : rdsoil.f CMN_SIZE define.h commsoil.h \n" . "readchem.o : readchem.f CMN_SIZE define.h comode.h \n" . "reader.o : reader.f CMN_GCTM CMN_SIZE define.h comode.h \n" . "readlai.o : readlai.f CMN_DEP CMN_SIZE define.h CMN_VEL \n" . "regrid_1x1_mod.o : regrid_1x1_mod.f CMN_GCTM CMN_SIZE define.h \n" . "restart_mod.o : restart_mod.f CMN_SIZE define.h \n" . "rpmares_mod.o : rpmares_mod.f CMN_SIZE define.h \n" . "ruralbox.o : ruralbox.f CMN_SIZE define.h comode.h \n" . "schem.o : schem.f CMN_SIZE define.h \n" . "schem_adj.o : schem_adj.f CMN_SIZE define.h \n" . "seasalt_mod.o : seasalt_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "set_aer.o : set_aer.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "set_prof.o : set_prof.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "setbase.o : setbase.f CMN CMN_ISOP CMN_MONOT CMN_SIZE define.h CMN_VEL \n" . "setemdep.o : setemdep.f CMN_SIZE define.h comode.h \n" . "setemis.o : setemis.f CMN_DIAG CMN_NOX CMN_SIZE define.h comode.h \n" . " \$(F90) -c -CB \$*.f\n" . "setmodel.o : setmodel.f CMN_SIZE define.h comode.h \n" . "sfcwindsqr.o : sfcwindsqr.f CMN_SIZE define.h \n" . "smvgear.o : smvgear.f CMN_SIZE define.h comode.h \n" . "soilbase.o : soilbase.f CMN_SIZE define.h commsoil.h \n" . "soilcrf.o : soilcrf.f CMN_DEP CMN_SIZE define.h commsoil.h \n" . "soilnoxems.o : soilnoxems.f CMN_DEP CMN_DIAG CMN_NOX CMN_SIZE define.h commsoil.h \n" . "soiltemp.o : soiltemp.f CMN_SIZE define.h commsoil.h \n" . "soiltype.o : soiltype.f CMN_SIZE define.h commsoil.h \n" . "streets_anthro_mod.o : streets_anthro_mod.f CMN_SIZE define.h \n" . "subfun.o : subfun.f CMN_SIZE define.h comode.h \n" . "sulfate_mod.o : sulfate_mod.f CMN_DIAG CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h \n" . " \$(F90) -c -CB \$*.f\n" . "sunparam.o : sunparam.f \n" . "tagged_co_mod.o : tagged_co_mod.f CMN_DIAG CMN_O3 CMN_SIZE define.h\n" . "linoz_mod.o : linoz_mod.f CMN CMN_DIAG CMN_O3 CMN_SIZE define.h linoz.com \n" . "tagged_ox_mod.o : tagged_ox_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "tcorr.o : tcorr.f \n" . "time_mod.o : time_mod.f define.h \n" . "toms_mod.o : toms_mod.f CMN_SIZE define.h \n" . "tpcore_bc_mod.o : tpcore_bc_mod.f CMN CMN_SIZE define.h \n" . "tpcore_fvdas_mod.o : tpcore_fvdas_mod.f90 \n" . " \$(F90) -c -r8 \$*.f90\n" . "tpcore_mod.o : tpcore_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h define.h \n" . " \$(F90) -c -r8 \$*.f\n" . "tpcore_window_mod.o : tpcore_window_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h define.h \n" . " \$(F90) -c -r8 \$*.f\n" . "tracer_mod.o : tracer_mod.f CMN_SIZE define.h \n" . "tracerid_mod.o : tracerid_mod.f CMN_SIZE define.h comode.h \n" . "transfer_mod.o : transfer_mod.f CMN_SIZE define.h \n" . "transport_mod.o : transport_mod.f CMN CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "tropopause.o : tropopause.f CMN CMN_DIAG CMN_SIZE define.h \n" . "tropopause_mod.o : tropopause_mod.f CMN CMN_SIZE comode.h define.h \n" . "unix_cmds_mod.o : unix_cmds_mod.f \n" . "upbdflx_mod.o : upbdflx_mod.f CMN_GCTM CMN_SIZE define.h \n" . "update.o : update.f CMN_SIZE define.h comode.h \n" . "uvalbedo_mod.o : uvalbedo_mod.f CMN_SIZE define.h \n" . "wetscav_mod.o : wetscav_mod.f CMN_DIAG CMN_SIZE define.h \n" . "xltmmp.o : xltmmp.f CMN_SIZE define.h \n" . "xtra_read_mod.o : xtra_read_mod.f CMN_DIAG CMN_SIZE define.h \n" . "\n" . "#==============================================================================\n" . "# Other compilation commands\n" . "#==============================================================================\n" . "ifort_errmsg.o : ifort_errmsg.f \n" . "linux_err.o : linux_err.c \n" . " \$(CC) -c linux_err.c\n" . "\n" . "#=============================================================================\n" . "# Other Makefile Commands\n" . "#=============================================================================\n" . "clean:\n" . " rm -rf *.o *.mod ifc* geos rii_files\n" . "\n" . ".SUFFIXES: .f .F .f90 .F90\n" . ".f.o: ; \$(F90) -c \$*.f\n" . ".F.o: ; \$(F90) -c \$*.F\n" . ".f90.o: ; \$(F90) -c -free \$*.f90 \n" . ".F90.o: ; \$(F90) -c -free \$*.f90 \n"; close(FILE); } #============================================= # Create Makefile.ifort for FWD_KPP #============================================= sub createMakeIfortFwd { printf "Creating Makefile.ifort\n"; open(FILE, ">Makefile.ifort") || die "Unable to open Makefile.ifort"; print FILE "#=============================================================================\n" . "# \$Id: Makefile.ifort,v 1.18 2006/10/17 17:51:06 bmy Exp \$\n" . "#\n" . "# GEOS-Chem Makefile for LINUX/IFORT compiler (bmy, Thu Aug 17 12:30:28 2006)\n" . "#=============================================================================\n" . "SHELL = /bin/sh\n" . "\n" . "# IFORT compilation options\n" . "FFLAGS = -cpp -w -O2 -auto -noalign -convert big_endian\n" . "\n" . "# Compile command -- multiprocessor\n" . "F90 = ifort \$(FFLAGS) -openmp -Dmultitask\n" . "\n" . "# Compile command -- single processor\n" . "#F90 = ifort \$(FFLAGS)\n" . "\n" . "# C compiler\n" . "CC = gcc\n" . "\n" . "OBJSe = \\\n" . "linux_err.o \\\n" . "ifort_errmsg.o\n" . "\n" . "OBJS = \\\n" . "CO_strat_pl.o \\\n" . "airmas.o \\\n" . "anthroems.o \\\n" . "arsl1k.o \\\n" . "backsub.o \\\n" . "biofit.o \\\n" . "boxvl.o \\\n" . "calcrate.o \\\n" . "chemdr.o \\\n" . "cleanup.o \\\n" . "decomp.o \\\n" . "diag1.o \\\n" . "diag3.o \\\n" . "diag_2pm.o \\\n" . "diagoh.o \\\n" . "emf_scale.o \\\n" . "emfossil.o \\\n" . "emisop.o \\\n" . "emisop_grass.o \\\n" . "emisop_mb.o \\\n" . "emissdr.o \\\n" . "emmonot.o \\\n" . "fertadd.o \\\n" . "findmon.o \\\n" . "fyrno3.o \\\n" . "gasconc.o \\\n" . "get_global_ch4.o \\\n" . "getifsun.o \\\n" . "initialize.o \\\n" . "jsparse.o \\\n" . "ksparse.o \\\n" . "lump.o \\\n" . "main.o \\\n" . "ndxx_setup.o \\\n" . "ohsave.o \\\n" . "partition.o \\\n" . "pderiv.o \\\n" . "physproc.o \\\n" . "precipfrac.o \\\n" . "pulsing.o \\\n" . "rdisopt.o \\\n" . "rdlai.o \\\n" . "rdland.o \\\n" . "rdlight.o \\\n" . "rdmonot.o \\\n" . "rdsoil.o \\\n" . "readchem.o \\\n" . "reader.o \\\n" . "readlai.o \\\n" . "ruralbox.o \\\n" . "schem.o \\\n" . "setbase.o \\\n" . "setemdep.o \\\n" . "setemis.o \\\n" . "setmodel.o \\\n" . "sfcwindsqr.o \\\n" . "smvgear.o \\\n" . "soilbase.o \\\n" . "soilcrf.o \\\n" . "soilnoxems.o \\\n" . "soiltemp.o \\\n" . "soiltype.o \\\n" . "subfun.o \\\n" . "sunparam.o \\\n" . "tcorr.o \\\n" . "tropopause.o \\\n" . "update.o \\\n" . "xltmmp.o \n" . "\n" . "FJ = \\\n" . "BLKSLV.o \\\n" . "CLDSRF.o \\\n" . "EFOLD.o \\\n" . "FLINT.o \\\n" . "GAUSSP.o \\\n" . "GEN.o \\\n" . "JRATET.o \\\n" . "JVALUE.o \\\n" . "LEGND0.o \\\n" . "MATIN4.o \\\n" . "MIESCT.o \\\n" . "NOABS.o \\\n" . "OPMIE.o \\\n" . "RD_TJPL.o \\\n" . "SPHERE.o \\\n" . "XSEC1D.o \\\n" . "XSECO2.o \\\n" . "XSECO3.o \\\n" . "fast_j.o \\\n" . "fjfunc.o \\\n" . "inphot.o \\\n" . "jv_index.o \\\n" . "photoj.o \\\n" . "rd_js.o \\\n" . "rd_prof.o \\\n" . "set_aer.o \\\n" . "set_prof.o \n" . "\n" . "MODS = \\\n" . "gckpp_Precision.o \\\n" . "gckpp_Parameters.o \\\n" . "gckpp_Global.o \\\n" . "gckpp_JacobianSP.o \\\n" . "gckpp_Jacobian.o \\\n" . "gckpp_LinearAlgebra.o \\\n" . "gckpp_Monitor.o \\\n" . "gckpp_Function.o \\\n" . "gckpp_StoichiomSP.o \\\n" . "gckpp_Stoichiom.o \\\n" . "gckpp_HessianSP.o \\\n" . "gckpp_Hessian.o \\\n" . "gckpp_Util.o \\\n" . "charpak_mod.o \\\n" . "error_mod.o \\\n" . "logical_mod.o \\\n" . "directory_mod.o \\\n" . "unix_cmds_mod.o \\\n" . "tracer_mod.o \\\n" . "julday_mod.o \\\n" . "file_mod.o \\\n" . "grid_mod.o \\\n" . "time_mod.o \\\n" . "bpch2_mod.o \\\n" . "regrid_1x1_mod.o \\\n" . "pressure_mod.o \\\n" . "transfer_mod.o \\\n" . "future_emissions_mod.o \\\n" . "lai_mod.o \\\n" . "tracerid_mod.o \\\n" . "benchmark_mod.o \\\n" . "comode_mod.o \\\n" . "gckpp_Rates.o \\\n" . "gckpp_Initialize.o \\\n" . "gckpp_Integrator.o \\\n" . "gckpp_adj_Integrator.o \\\n" . "gckpp_Model.o \\\n" . "diag_mod.o \\\n" . "dao_mod.o \\\n" . "tropopause_mod.o \\\n" . "pbl_mix_mod.o \\\n" . "diag03_mod.o \\\n" . "diag04_mod.o \\\n" . "diag41_mod.o \\\n" . "diag42_mod.o \\\n" . "diag48_mod.o \\\n" . "diag49_mod.o \\\n" . "diag50_mod.o \\\n" . "diag51_mod.o \\\n" . "diag56_mod.o \\\n" . "diag_oh_mod.o \\\n" . "diag_pl_mod.o \\\n" . "ocean_mercury_mod.o \\\n" . "drydep_mod.o \\\n" . "bravo_mod.o \\\n" . "edgar_mod.o \\\n" . "emep_mod.o \\\n" . "epa_nei_mod.o \\\n" . "streets_anthro_mod.o \\\n" . "geia_mod.o \\\n" . "global_ch4_mod.o \\\n" . "global_hno3_mod.o \\\n" . "global_no3_mod.o \\\n" . "global_nox_mod.o \\\n" . "global_oh_mod.o \\\n" . "global_o3_mod.o \\\n" . "uvalbedo_mod.o \\\n" . "RnPbBe_mod.o \\\n" . "Kr85_mod.o \\\n" . "acetone_mod.o \\\n" . "aerosol_mod.o \\\n" . "aircraft_nox_mod.o \\\n" . "biofuel_mod.o \\\n" . "gc_biomass_mod.o \\\n" . "gfed2_biomass_mod.o \\\n" . "biomass_mod.o \\\n" . "c2h6_mod.o \\\n" . "ch3i_mod.o \\\n" . "a3_read_mod.o \\\n" . "a6_read_mod.o \\\n" . "i6_read_mod.o \\\n" . "gcap_read_mod.o \\\n" . "gwet_read_mod.o \\\n" . "xtra_read_mod.o \\\n" . "megan_mod.o \\\n" . "carbon_mod.o \\\n" . "lightning_nox_mod.o \\\n" . "lightning_nox_nl_mod.o \\\n" . "optdepth_mod.o \\\n" . "planeflight_mod.o \\\n" . "restart_mod.o \\\n" . "rpmares_mod.o \\\n" . "isoropia_mod.o \\\n" . "wetscav_mod.o \\\n" . "seasalt_mod.o \\\n" . "sulfate_mod.o \\\n" . "hcn_ch3cn_mod.o \\\n" . "tagged_co_mod.o \\\n" . "tagged_ox_mod.o \\\n" . "gcap_convect_mod.o \\\n" . "fvdas_convect_mod.o \\\n" . "convection_mod.o \\\n" . "pjc_pfix_mod.o \\\n" . "dust_dead_mod.o \\\n" . "dust_mod.o \\\n" . "co2_mod.o \\\n" . "mercury_mod.o \\\n" . "toms_mod.o \\\n" . "tpcore_bc_mod.o \\\n" . "tpcore_fvdas_mod.o \\\n" . "tpcore_mod.o \\\n" . "tpcore_window_mod.o \\\n" . "transport_mod.o \\\n" . "upbdflx_mod.o \\\n" . "chemistry_mod.o \\\n" . "emissions_mod.o \\\n" . "gamap_mod.o \\\n" . "input_mod.o\n" . "\n" . "#=============================================================================\n" . "# Executable with FAST-J (default)\n" . "#=============================================================================\n" . "geos : \$(MODS) \$(OBJS) \$(OBJSe) \$(FJ) \n" . " \$(F90) \$(MODS) \$(OBJS) \$(OBJSe) \$(FJ) -o geos\n" . "\n" . "#==============================================================================\n" . "# Dependencies Listing\n" . "#==============================================================================\n" . "BLKSLV.o : BLKSLV.f jv_mie.h \n" . "CLDSRF.o : CLDSRF.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "CO_strat_pl.o : CO_strat_pl.f CMN_SIZE define.h \n" . "EFOLD.o : EFOLD.f \n" . "FLINT.o : FLINT.f \n" . "GAUSSP.o : GAUSSP.f \n" . "GEN.o : GEN.f jv_mie.h \n" . "JRATET.o : JRATET.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "JVALUE.o : JVALUE.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "Kr85_mod.o : Kr85_mod.f CMN_DIAG CMN_O3 CMN_SIZE define.h define.h \n" . "LEGND0.o : LEGND0.f \n" . "MATIN4.o : MATIN4.f \n" . "MIESCT.o : MIESCT.f jv_mie.h \n" . "NOABS.o : NOABS.f \n" . "OPMIE.o : OPMIE.f cmn_fj.h CMN_SIZE define.h jv_cmn.h jv_mie.h \n" . "RD_TJPL.o : RD_TJPL.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "RnPbBe_mod.o : RnPbBe_mod.f CMN_DEP CMN_DIAG CMN_SIZE define.h define.h \n" . "SPHERE.o : SPHERE.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "XSEC1D.o : XSEC1D.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "XSECO2.o : XSECO2.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "XSECO3.o : XSECO3.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "a3_read_mod.o : a3_read_mod.f CMN_DIAG CMN_SIZE define.h \n" . "a6_read_mod.o : a6_read_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "acetone_mod.o : acetone_mod.f CMN_DEP CMN_DIAG CMN_MONOT CMN_SIZE define.h \n" . "aerosol_mod.o : aerosol_mod.f CMN_DIAG CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h comode.h jv_cmn.h \n" . "aircraft_nox_mod.o : aircraft_nox_mod.f CMN CMN_DIAG CMN_NOX CMN_SIZE define.h \n" . "airmas.o : airmas.f \n" . "anthroems.o : anthroems.f CMN_O3 CMN_SIZE define.h comode.h \n" . "arsl1k.o : arsl1k.f \n" . "backsub.o : backsub.f CMN_SIZE define.h comode.h \n" . "benchmark_mod.o : benchmark_mod.f CMN_SIZE define.h \n" . "biofit.o : biofit.f CMN_DEP CMN_SIZE define.h \n" . "biofuel_mod.o : biofuel_mod.f CMN_DIAG CMN_SIZE define.h \n" . "biomass_mod.o : biomass_mod.f CMN_DIAG CMN_SIZE define.h \n" . " \$(F90) -c -CB \$*.f\n" . "boxvl.o : boxvl.f \n" . "bpch2_mod.o : bpch2_mod.f CMN_SIZE define.h define.h \n" . "bravo_mod.o : bravo_mod.f CMN_SIZE define.h \n" . "c2h6_mod.o : c2h6_mod.f CMN CMN_DIAG CMN_O3 CMN_SIZE define.h \n" . "calcrate.o : calcrate.f CMN CMN_DIAG CMN_SIZE define.h comode.h \n" . "carbon_mod.o : carbon_mod.f CMN CMN_DIAG CMN_GCTM CMN_O3 CMN_SIZE define.h comode.h \n" . " \$(F90) -c -CB \$*.f\n" . "ch3i_mod.o : ch3i_mod.f CMN_DEP CMN_DIAG CMN_SIZE define.h comode.h \n" . "charpak_mod.o : charpak_mod.f \n" . "chemdr.o : chemdr.f CMN CMN_DEP CMN_DIAG CMN_NOX CMN_O3 CMN_SIZE define.h comode.h \n" . "chemistry_mod.o : chemistry_mod.f CMN_DIAG CMN_SIZE define.h comode.h \n" . "cleanup.o : cleanup.f \n" . "co2_mod.o : co2_mod.f CMN_SIZE define.h \n" . "comode_mod.o : comode_mod.f CMN_SIZE define.h comode.h \n" . "convection_mod.o : convection_mod.f CMN_DIAG CMN_SIZE define.h define.h \n" . "dao_mod.o : dao_mod.f CMN_GCTM CMN_SIZE define.h \n" . "decomp.o : decomp.f CMN_SIZE define.h comode.h \n" . "diag03_mod.o : diag03_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag04_mod.o : diag04_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag1.o : diag1.f CMN_DIAG CMN_GCTM CMN_O3 CMN_SIZE define.h \n" . "diag3.o : diag3.f CMN CMN_DIAG CMN_O3 CMN_SIZE define.h comode.h \n" . "diag41_mod.o : diag41_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag42_mod.o : diag42_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag48_mod.o : diag48_mod.f CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "diag49_mod.o : diag49_mod.f CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "diag50_mod.o : diag50_mod.f CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "diag51_mod.o : diag51_mod.f CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "diag56_mod.o : diag56_mod.f CMN_DIAG CMN_SIZE define.h \n" . "diag_2pm.o : diag_2pm.f CMN_DIAG CMN_SIZE define.h \n" . "diag_mod.o : diag_mod.f \n" . "diag_oh_mod.o : diag_oh_mod.f CMN_SIZE define.h comode.h \n" . "diag_pl_mod.o : diag_pl_mod.f CMN_DIAG CMN_SIZE define.h comode.h \n" . "diagoh.o : diagoh.f CMN_DIAG CMN_O3 CMN_SIZE define.h \n" . "directory_mod.o : directory_mod.f \n" . "drydep_mod.o : drydep_mod.f CMN_DEP CMN_DIAG CMN_GCTM CMN_SIZE define.h CMN_VEL commsoil.h comode.h \n" . "dust_dead_mod.o : dust_dead_mod.f CMN_GCTM CMN_SIZE define.h \n" . "dust_mod.o : dust_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h comode.h jv_cmn.h \n" . "edgar_mod.o : edgar_mod.f CMN_SIZE define.h \n" . "emep_mod.o : emep_mod.f CMN_SIZE define.h \n" . "emf_scale.o : emf_scale.f CMN_O3 CMN_SIZE define.h comode.h \n" . "emfossil.o : emfossil.f CMN_DIAG CMN_O3 CMN_SIZE define.h comode.h \n" . "emisop.o : emisop.f CMN_ISOP CMN_SIZE define.h CMN_VEL \n" . "emisop_grass.o : emisop_grass.f CMN_ISOP CMN_SIZE define.h CMN_VEL \n" . "emisop_mb.o : emisop_mb.f CMN_ISOP CMN_SIZE define.h CMN_VEL \n" . "emissdr.o : emissdr.f CMN CMN_DIAG CMN_MONOT CMN_NOX CMN_O3 CMN_SIZE define.h comode.h \n" . "emissions_mod.o : emissions_mod.f CMN_SIZE define.h \n" . "emmonot.o : emmonot.f CMN_MONOT CMN_SIZE define.h CMN_VEL \n" . "epa_nei_mod.o : epa_nei_mod.f CMN_SIZE define.h \n" . "error_mod.o : error_mod.f define.h \n" . "fast_j.o : fast_j.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "fertadd.o : fertadd.f CMN_SIZE define.h commsoil.h \n" . "file_mod.o : file_mod.f define.h \n" . "findmon.o : findmon.f \n" . "fjfunc.o : fjfunc.f cmn_fj.h CMN_SIZE define.h \n" . "future_emissions_mod.o : future_emissions_mod.f CMN_SIZE define.h \n" . "fvdas_convect_mod.o : fvdas_convect_mod.f CMN_DIAG CMN_SIZE define.h \n" . "fyrno3.o : fyrno3.f \n" . "gamap_mod.o : gamap_mod.f CMN_DIAG CMN_SIZE define.h \n" . "gasconc.o : gasconc.f CMN_SIZE define.h comode.h \n" . "gc_biomass_mod.o : gc_biomass_mod.f CMN_SIZE define.h \n" . "gcap_convect_mod.o : gcap_convect_mod.f CMN_DIAG CMN_SIZE define.h \n" . "gcap_read_mod.o : gcap_read_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "geia_mod.o : geia_mod.f CMN_SIZE define.h \n" . "get_global_ch4.o : get_global_ch4.f \n" . "getifsun.o : getifsun.f CMN_SIZE define.h comode.h \n" . "gfed2_biomass_mod.o : gfed2_biomass_mod.f CMN_SIZE define.h \n" . "global_ch4_mod.o : global_ch4_mod.f CMN CMN_DIAG CMN_SIZE define.h \n" . "global_hno3_mod.o : global_hno3_mod.f CMN_SIZE define.h \n" . "global_no3_mod.o : global_no3_mod.f CMN_SIZE define.h \n" . "global_nox_mod.o : global_nox_mod.f CMN_SIZE define.h \n" . "global_o3_mod.o : global_o3_mod.f CMN_SIZE define.h \n" . "global_oh_mod.o : global_oh_mod.f CMN_SIZE define.h \n" . "grid_mod.o : grid_mod.f CMN_GCTM CMN_SIZE define.h \n" . "gwet_read_mod.o : gwet_read_mod.f CMN_DIAG CMN_SIZE define.h \n" . "hcn_ch3cn_mod.o : hcn_ch3cn_mod.f CMN_DEP CMN_DIAG CMN_SIZE define.h \n" . "i6_read_mod.o : i6_read_mod.f CMN_DIAG CMN_SIZE define.h \n" . "ifort_errmsg.o : ifort_errmsg.f \n" . "initialize.o : initialize.f CMN_DIAG CMN_SIZE define.h \n" . "inphot.o : inphot.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "input_mod.o : input_mod.f CMN CMN_DIAG CMN_O3 CMN_SIZE define.h define.h \n" . "isoropia_mod.o : isoropia_mod.f CMN_SIZE define.h isoropia.h \n" . "jsparse.o : jsparse.f CMN_SIZE define.h comode.h \n" . "julday_mod.o : julday_mod.f \n" . "jv_index.o : jv_index.f cmn_fj.h CMN_SIZE define.h comode.h \n" . "ksparse.o : ksparse.f CMN_SIZE define.h comode.h \n" . "lai_mod.o : lai_mod.f CMN_SIZE define.h \n" . "lightning_nox_mod.o : lightning_nox_mod.f CMN_DIAG CMN_GCTM CMN_NOX CMN_SIZE define.h define.h \n" . "lightning_nox_nl_mod.o : lightning_nox_nl_mod.f CMN_DIAG CMN_GCTM CMN_NOX CMN_SIZE define.h \n" . "logical_mod.o : logical_mod.f \n" . "lump.o : lump.f CMN_SIZE define.h comode.h \n" . "main.o : main.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "megan_mod.o : megan_mod.f CMN_GCTM CMN_SIZE define.h \n" . "mercury_mod.o : mercury_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "ndxx_setup.o : ndxx_setup.f CMN_DIAG CMN_SIZE define.h \n" . "ocean_mercury_mod.o : ocean_mercury_mod.f CMN_DEP CMN_SIZE define.h \n" . "ohsave.o : ohsave.f CMN_SIZE define.h comode.h \n" . "optdepth_mod.o : optdepth_mod.f CMN_DIAG CMN_SIZE define.h \n" . "partition.o : partition.f CMN_SIZE define.h comode.h \n" . "pbl_mix_mod.o : pbl_mix_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "pderiv.o : pderiv.f CMN_SIZE define.h comode.h \n" . "photoj.o : photoj.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "physproc.o : physproc.f CMN_SIZE define.h comode.h \n" . "pjc_pfix_mod.o : pjc_pfix_mod.f CMN CMN_GCTM CMN_SIZE define.h \n" . "planeflight_mod.o : planeflight_mod.f CMN_DIAG CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h comode.h jv_cmn.h \n" . "precipfrac.o : precipfrac.f CMN_SIZE define.h \n" . "pressure_mod.o : pressure_mod.f CMN_SIZE define.h \n" . "pulsing.o : pulsing.f CMN_SIZE define.h commsoil.h \n" . "rd_js.o : rd_js.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "rd_prof.o : rd_prof.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "rdisopt.o : rdisopt.f CMN_SIZE define.h \n" . "rdlai.o : rdlai.f CMN_DEP CMN_SIZE define.h CMN_VEL \n" . "rdland.o : rdland.f CMN_DEP CMN_SIZE define.h CMN_VEL \n" . "rdlight.o : rdlight.f CMN_ISOP CMN_SIZE define.h \n" . "rdmonot.o : rdmonot.f CMN_SIZE define.h \n" . "rdsoil.o : rdsoil.f CMN_SIZE define.h commsoil.h \n" . "readchem.o : readchem.f CMN_SIZE define.h comode.h \n" . "reader.o : reader.f CMN_GCTM CMN_SIZE define.h comode.h \n" . "readlai.o : readlai.f CMN_DEP CMN_SIZE define.h CMN_VEL \n" . "regrid_1x1_mod.o : regrid_1x1_mod.f CMN_GCTM CMN_SIZE define.h \n" . "restart_mod.o : restart_mod.f CMN_SIZE define.h \n" . "rpmares_mod.o : rpmares_mod.f CMN_SIZE define.h \n" . "ruralbox.o : ruralbox.f CMN_SIZE define.h comode.h \n" . "schem.o : schem.f CMN_SIZE define.h \n" . "seasalt_mod.o : seasalt_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "set_aer.o : set_aer.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "set_prof.o : set_prof.f cmn_fj.h CMN_SIZE define.h jv_cmn.h \n" . "setbase.o : setbase.f CMN CMN_ISOP CMN_MONOT CMN_SIZE define.h CMN_VEL \n" . "setemdep.o : setemdep.f CMN_SIZE define.h comode.h \n" . "setemis.o : setemis.f CMN_DIAG CMN_NOX CMN_SIZE define.h comode.h \n" . " \$(F90) -c -CB \$*.f\n" . "setmodel.o : setmodel.f CMN_SIZE define.h comode.h \n" . "sfcwindsqr.o : sfcwindsqr.f CMN_SIZE define.h \n" . "smvgear.o : smvgear.f CMN_SIZE define.h comode.h \n" . "soilbase.o : soilbase.f CMN_SIZE define.h commsoil.h \n" . "soilcrf.o : soilcrf.f CMN_DEP CMN_SIZE define.h commsoil.h \n" . "soilnoxems.o : soilnoxems.f CMN_DEP CMN_DIAG CMN_NOX CMN_SIZE define.h commsoil.h \n" . "soiltemp.o : soiltemp.f CMN_SIZE define.h commsoil.h \n" . "soiltype.o : soiltype.f CMN_SIZE define.h commsoil.h \n" . "streets_anthro_mod.o : streets_anthro_mod.f CMN_SIZE define.h \n" . "subfun.o : subfun.f CMN_SIZE define.h comode.h \n" . "sulfate_mod.o : sulfate_mod.f CMN_DIAG CMN_GCTM CMN_O3 CMN_SIZE define.h cmn_fj.h CMN_SIZE define.h \n" . " \$(F90) -c -CB \$*.f\n" . "sunparam.o : sunparam.f \n" . "tagged_co_mod.o : tagged_co_mod.f CMN_DIAG CMN_O3 CMN_SIZE define.h \n" . "tagged_ox_mod.o : tagged_ox_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "tcorr.o : tcorr.f \n" . "time_mod.o : time_mod.f define.h \n" . "toms_mod.o : toms_mod.f CMN_SIZE define.h \n" . "tpcore_bc_mod.o : tpcore_bc_mod.f CMN CMN_SIZE define.h \n" . "tpcore_fvdas_mod.o : tpcore_fvdas_mod.f90 \n" . " \$(F90) -c -r8 \$*.f90\n" . "tpcore_mod.o : tpcore_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h define.h \n" . " \$(F90) -c -r8 \$*.f\n" . "tpcore_window_mod.o : tpcore_window_mod.f CMN_DIAG CMN_GCTM CMN_SIZE define.h define.h \n" . " \$(F90) -c -r8 \$*.f\n" . "tracer_mod.o : tracer_mod.f CMN_SIZE define.h \n" . "tracerid_mod.o : tracerid_mod.f CMN_SIZE define.h comode.h \n" . "transfer_mod.o : transfer_mod.f CMN_SIZE define.h \n" . "transport_mod.o : transport_mod.f CMN CMN_DIAG CMN_GCTM CMN_SIZE define.h \n" . "tropopause.o : tropopause.f CMN CMN_DIAG CMN_SIZE define.h \n" . "tropopause_mod.o : tropopause_mod.f CMN CMN_SIZE comode.h define.h \n" . "unix_cmds_mod.o : unix_cmds_mod.f \n" . "upbdflx_mod.o : upbdflx_mod.f CMN_GCTM CMN_SIZE define.h \n" . "update.o : update.f CMN_SIZE define.h comode.h \n" . "uvalbedo_mod.o : uvalbedo_mod.f CMN_SIZE define.h \n" . "wetscav_mod.o : wetscav_mod.f CMN_DIAG CMN_SIZE define.h \n" . "xltmmp.o : xltmmp.f CMN_SIZE define.h \n" . "xtra_read_mod.o : xtra_read_mod.f CMN_DIAG CMN_SIZE define.h \n" . "\n" . "#==============================================================================\n" . "# Other compilation commands\n" . "#==============================================================================\n" . "ifort_errmsg.o : ifort_errmsg.f \n" . "linux_err.o : linux_err.c \n" . " \$(CC) -c linux_err.c\n" . "\n" . "#=============================================================================\n" . "# Other Makefile Commands\n" . "#=============================================================================\n" . "clean:\n" . " rm -rf *.o *.mod ifc* geos rii_files\n" . "\n" . ".SUFFIXES: .f .F .f90 .F90\n" . ".f.o: ; \$(F90) -c \$*.f\n" . ".F.o: ; \$(F90) -c \$*.F\n" . ".f90.o: ; \$(F90) -c -free \$*.f90 \n" . ".F90.o: ; \$(F90) -c -free \$*.F90 \n"; close(FILE); } #============================================= # Create 4dvar_driver.f #============================================= sub create4dvarDriver { printf "Creating 4dvar_driver.f\n"; open(FILE, ">4dvar_driver.f") || die "Unable to open 4dvar_driver.f"; print FILE "! =============================================================\n" . "! subdriver_fwd_fd.f, 2008/24/01 Kumaresh \$\n" . "! Forward finite-difference driver is a modified version of\n" . "! main driver for GEOS-Chem to carryout finite difference tests\n" . "! =============================================================\n" . "\n" . " PROGRAM DRIVER_4DVAR\n" . "! \n" . "!******************************************************************************\n" . "! \n" . "! \n" . "! GGGGGG EEEEEEE OOOOO SSSSSSS CCCCCC H H EEEEEEE M M \n" . "! G E O O S C H H E M M M M \n" . "! G GGG EEEEEE O O SSSSSSS C HHHHHHH EEEEEE M M M \n" . "! G G E O O S C H H E M M \n" . "! GGGGGG EEEEEEE OOOOO SSSSSSS CCCCCC H H EEEEEEE M M \n" . "! \n" . "! \n" . "! (formerly known as the Harvard-GEOS model)\n" . "! for 4 x 5, 2 x 2.5 global grids and 1 x 1 nested grids\n" . "!\n" . "! Contact: Bob Yantosca, Harvard University (bmy\@io.as.harvard.edu)\n" . "! \n" . "!******************************************************************************\n" . "C\n" . "C Log Files to save cost function and rms values each model run\n" . "C \n" . "C model_runs.m -> number of model runs performed by L-BFGS routine\n" . "C cost_fun.m -> cost function values(f) for each (m)\n" . "C rms_value.m -> rms_i=norm(Ci-C0)/norm(C0), i = 1,2,...,m.\n" . "C \n" . "C ---------Contribution to cost function--------------\n" . "C\n" . "C obs_cost.dat -> due to observation misfit\n" . "C bg_cost.dat -> due to background\n" . "C\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules \n" . " USE SUBDRIVER_FWD, ONLY:DO_GC_FWD\n" . " USE SUBDRIVER_BWD, ONLY:DO_GC_BWD\n" . " USE TRACER_MOD, ONLY:STT, STT_ADJ, N_TRACERS\n" . " USE TRACER_MOD, ONLY:NHMSb, NYMDb, TAUb \n" . " USE FILE_MOD, ONLY:CLOSE_FILES\n" . " USE CHECKPOINT_MOD\n" . " USE TIME_MOD\n" . " USE COMODE_MOD, ONLY:IXSAVE, IYSAVE, IZSAVE\n" . "\n" . " ! Force all variables to be declared explicitly\n" . " IMPLICIT NONE\n" . "\n" . " ! Header files \n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " !Local Variables\n" . " INTEGER :: NYMD, NHMS\n" . " INTEGER :: I, J, L, K, IT_NUM\n" . " REAL*8 :: TAU\n" . " REAL*8 :: f1, f2\n" . "\n" . " DOUBLE PRECISION :: f,rms,diff_norm,ref_norm,t1,t2\n" . " DOUBLE PRECISION, ALLOCATABLE :: g(:),x(:)\n" . "\n" . " REAL*8, PARAMETER :: EPS = 0.1\n" . " INTEGER, PARAMETER :: TRAC = 2\n" . "\n" . " REAL*8 :: STT_ORIG(IIPAR,JJPAR,LLPAR,50)\n" . " REAL*8 :: STT_OPTZ(IIPAR,JJPAR,LLPAR,50)\n" . " REAL*8 :: STT_PERT(IIPAR,JJPAR,LLPAR,50)\n" . "\n" . " CHARACTER*8 :: a\n" . "\n" . " !-----------------LBFGS Parameters----------------\n" . "\n" . " INTEGER, PARAMETER :: nmax=IIPAR*JJPAR*LLPAR, mmax = 17\n" . " character*60 task,csave\n" . " logical lsave(4)\n" . " integer n,m,iprint,nbd(nmax),iwa(3*nmax),isave(44)\n" . " double precision factr,pgtol,lb(nmax),ub(nmax)\n" . " double precision dsave(29)\n" . " double precision wa(2*mmax*nmax+4*nmax+12*mmax*mmax+12*mmax)\n" . " INTEGER :: N_GC_RUNS = 0\n" . " LOGICAL :: EXP_PRECOND = .FALSE. ! Do exponential preconditioning or not\n" . " INTEGER NTOT,NST,NEND\n" . "\n" . " !=================================================================\n" . " ! 4DVAR_DRIVER starts here! \n" . " !=================================================================\n" . "\n" . " ! Number of species to optimize\n" . "\n" . " NST = TRAC\n" . " NEND = TRAC\n" . " NTOT = NEND-NST+1\n" . " \n" . " !--------------------------------------------------------\n" . " ! LBFGS Optimization Steps\n" . " ! We wish to have output at every iteration.\n" . "\n" . " iprint = 1\n" . " \n" . " factr=1.0d+7\n" . " pgtol=1.0d-5\n" . "\n" . " n = IIPAR*JJPAR*LLPAR*NTOT !25\n" . " m = 5\n" . "\n" . " open(20,file='ITER')\n" . " read(20,*) IT_NUM\n" . " close(20)\n" . "\n" . " IF(IT_NUM<10)THEN\n" . " WRITE(a,1000)IT_NUM\n" . " 1000 FORMAT(I1)\n" . " ELSE\n" . " WRITE(a,1001)IT_NUM\n" . " 1001 FORMAT(I2)\n" . " ENDIF\n" . "\n" . " OPEN(unit=124,file='cost_fun'//TRIM(a)//'.m') \n" . " OPEN(unit=125,file='rms_value'//TRIM(a)//'.m') \n" . " OPEN(unit=126,file='model_runs'//TRIM(a)//'.m') \n" . " OPEN(unit=141,file='obs_cost'//TRIM(a)//'.dat')\n" . " OPEN(unit=142,file='bg_cost'//TRIM(a)//'.dat') \n" . " \n" . " !----------------------------------\n" . " ! Allocate g and x arrays\n" . " !----------------------------------\n" . " ALLOCATE( g( n ) )\n" . " g = 0d0\n" . " ALLOCATE( x( n ) )\n" . " x = 0d0\n" . "\n" . " IF(IT_NUM.eq.0)THEN ! Reference: just lay synthetic observations\n" . " \n" . " PRINT*,'ENTERING FWD FOR REFERENCE'\n" . " call do_gc_fwd(EPS, TRAC, x, NTOT, NST, EXP_PRECOND)\n" . " \n" . " open(20,file='ITER')\n" . " write(20,*) 1\n" . " close(20)\n" . "\n" . " CALL READ_OBS_CHKFILE(NYMDb, NHMSb)\n" . " STT_ORIG(:,:,:,1:N_TRACERS) = STT(:,:,:,1:N_TRACERS)\n" . "\n" . " CALL READ_BG_CHKFILE(NYMDb, NHMSb)\n" . " STT_PERT(:,:,:,1:N_TRACERS) = STT(:,:,:,1:N_TRACERS)\n" . "\n" . " DO K = NST, NEND \n" . " DO L=1,LLPAR\n" . " DO J=1,JJPAR\n" . " DO I=1,IIPAR\n" . " IF (EXP_PRECOND) THEN\n" . " x((((I-1)*JJPAR+J-1)*LLPAR+L-1)*NTOT+K-NST+1)\n" . " & = LOG( MAX( STT(I,J,L,K), 1.0d-16 ) )\n" . " ELSE\n" . " x((((I-1)*JJPAR+J-1)*LLPAR+L-1)*NTOT+K-NST+1)\n" . " & = STT(I,J,L,K)\n" . " END IF\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " open(26,file='opt/x')\n" . " write(26,*) x\n" . " close(26)\n" . "\n" . " !============================================================\n" . " ! DUMP THE DIFFERENCE BETWEEN CURRENT CONC AND REFERENCE CONC\n" . " !============================================================\n" . " \n" . " STT(:,:,:,1:N_TRACERS) = STT_PERT(:,:,:,1:N_TRACERS) \n" . " & - STT_ORIG(:,:,:,1:N_TRACERS)\n" . " \n" . " CALL MAKE_DIFFPERT_CHKFILE(NYMDb, NHMSb, TAUb)\n" . " !============================================================\n" . "\n" . " GOTO 10000\n" . " \n" . " ELSE IF(IT_NUM.eq.1)THEN !Just initialize x, perturbed\n" . " \n" . " open(26,file='opt/x')\n" . " read(26,*) x\n" . " close(26)\n" . " \n" . " task = 'START'\n" . "\n" . " ELSE ! Start of the optimization\n" . "\n" . " PRINT*,'NEXT START OPTIMIZATION'\n" . "\n" . " ! We now define the starting point.\n" . " WRITE(143,*) IT_NUM,' READ FILES'\n" . "\n" . " ! Read lbfgs arguments from checkpoint file csave \n" . " open(19,file='opt/csave')\n" . " \n" . " read(19,*) csave\n" . " read(19,*) dsave\n" . " read(19,*) isave\n" . " read(19,*) lsave\n" . " read(19,*) f\n" . " read(19,*) g\n" . " read(19,*) task\n" . " read(19,*) x\n" . " read(19,*) wa\n" . " read(19,*) iwa\n" . " read(19,*) lb\n" . " read(19,*) ub\n" . " read(19,*) nbd\n" . " \n" . " close(19)\n" . "\n" . " ENDIF\n" . " \n" . " ! We now provide nbd which defines the bounds on the variables:\n" . " ! lb specifies the lower bounds,\n" . " ! ub specifies the upper bounds. \n" . " \n" . " ! First set bounds on variables.\n" . " \n" . " IF (IT_NUM==1)THEN\n" . " IF (EXP_PRECOND) THEN\n" . " do i=1,n\n" . " nbd(i)=0 \n" . " end do\n" . " ELSE\n" . " do i=1,n\n" . " nbd(i)= 2 \n" . " lb(i) = 0.1*x(i)\n" . " ub(i) = 3*x(i)\n" . " end do\n" . " END IF\n" . " END IF \n" . " \n" . " ! This is the call to the L-BFGS-B code.\n" . " \n" . " call setulb(n,m,x,lb,ub,nbd,f,g,factr,pgtol,wa,iwa,task,iprint,\n" . " + csave,lsave,isave,dsave)\n" . " \n" . " if (task(1:2) .eq. 'FG') then\n" . "\n" . " ! calculate cost function(f) value and update LGRID\n" . " call do_gc_fwd(EPS, TRAC, x, NTOT, NST, EXP_PRECOND)\n" . "\n" . " call do_gc_bwd(f, TRAC)\n" . " !----------------------\n" . " \n" . " CALL READ_CURR_CHKFILE(NYMDb, NHMSb)\n" . "\n" . " ! Building g from STT_ADJ variable\n" . " DO K = NST, NEND \n" . " DO L=1,LLPAR\n" . " DO J=1,JJPAR\n" . " DO I=1,IIPAR\n" . " IF (EXP_PRECOND) THEN\n" . " ! Convert adjoint to gradient w.r.t. log-concentrations\n" . " g((((I-1)*JJPAR+J-1)*LLPAR+L-1)*NTOT+K-NST+1)\n" . " & = STT_ADJ(I,J,L,K)*STT(I,J,L,K)\n" . " ELSE\n" . " g((((I-1)*JJPAR+J-1)*LLPAR+L-1)*NTOT+K-NST+1)\n" . " & = STT_ADJ(I,J,L,K)\n" . " END IF\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . " \n" . " !-------------reference norm calculations-----------------\n" . " STT_OPTZ(:,:,:,1:N_TRACERS) = STT(:,:,:,1:N_TRACERS)\n" . "\n" . " CALL READ_OBS_CHKFILE( NYMDb, NHMSb )\n" . " STT_ORIG(:,:,:,1:N_TRACERS) = STT(:,:,:,1:N_TRACERS)\n" . " \n" . " ref_norm = 0.d0\n" . " \n" . " DO K = NST, NEND \n" . " DO L=1,LLPAR\n" . " DO J=1,JJPAR\n" . " DO I=1,IIPAR\n" . " ref_norm = ref_norm+STT_ORIG(I,J,L,K)*STT_ORIG(I,J,L,K)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " ref_norm = dsqrt(ref_norm)\n" . " \n" . " !---------------------------------------------------------\n" . " \n" . " !--------------------------------------------\n" . " ! RMS calculations\n" . " !--------------------------------------------\n" . "\n" . " diff_norm = 0.d0\n" . " \n" . " DO K = NST, NEND \n" . " DO L=1,LLPAR\n" . " DO J=1,JJPAR\n" . " DO I=1,IIPAR\n" . " diff_norm = diff_norm\n" . " & +(STT_ORIG(I,J,L,K)-STT_OPTZ(I,J,L,K))\n" . " & *(STT_ORIG(I,J,L,K)-STT_OPTZ(I,J,L,K))\n" . "\n" . " STT(I,J,L,K) = STT_OPTZ(I,J,L,K) - STT_ORIG(I,J,L,K) \n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO \n" . "\n" . " diff_norm = dsqrt(diff_norm)\n" . " \n" . " rms = diff_norm/ref_norm\n" . "\n" . " !--------------------------------------------\n" . " ! checkpointing f, rms and model_runs\n" . " !--------------------------------------------\n" . " \n" . " write(124,*) f\n" . " write(125,*) rms\n" . " write(126,*) N_GC_RUNS\n" . "\n" . " !============================================================\n" . " ! DUMP THE DIFFERENCE BETWEEN CURRENT CONC AND REFERENCE CONC\n" . " !============================================================\n" . " CALL MAKE_DIFFOPTZ_CHKFILE(NYMDb, NHMSb, TAUb)\n" . " !============================================================\n" . " \n" . " elseif (task(1:5) .eq. 'NEW_X') then\n" . " ! the minimization routine has returned with a new iterate,\n" . " ! and we have opted to continue the iteration.\n" . " \n" . " WRITE(143,*) IT_NUM,' ENTER NEW_X, X=',x(1),x(100)\n" . "\n" . " else\n" . "\n" . "c We terminate execution when task is neither FG nor NEW_X.\n" . "c We print the information contained in the string task\n" . "c if the default output is not used and the execution is\n" . "c not stopped intentionally by the user. \n" . "\n" . " if (iprint.le.-1.and.task(1:4).ne.'STOP')write(6,*)task\n" . "\n" . " endif\n" . "\n" . " !---------- the end of the loop -------------\n" . "\n" . " ! Save lbfgs arguments to checkpoint file csave for next iteration\n" . " open(19,file='opt/csave')\n" . " \n" . " write(19,*) csave \n" . " write(19,*) dsave\n" . " write(19,*) isave\n" . " write(19,*) lsave\n" . " write(19,*) f\n" . " write(19,*) g\n" . " write(19,*) task\n" . " write(19,*) x\n" . " write(19,*) wa\n" . " write(19,*) iwa\n" . " write(19,*) lb\n" . " write(19,*) ub\n" . " write(19,*) nbd\n" . "\n" . " close(19)\n" . " \n" . " ! If task is neither FG nor NEW_X we terminate execution.\n" . " \n" . "10000 CONTINUE\n" . "\n" . " open(20,file='ITER')\n" . " write(20,*) IT_NUM+1\n" . " close(20)\n" . " \n" . " IF ( ALLOCATED( g ) ) DEALLOCATE( g ) \n" . " IF ( ALLOCATED( x ) ) DEALLOCATE( x ) \n" . "\n" . " CLOSE(124)\n" . " CLOSE(125) \n" . " CLOSE(126) \n" . " CLOSE(141)\n" . " CLOSE(142)\n" . " CLOSE(143)\n" . "\n" . " ! Close all files\n" . " CALL CLOSE_FILES\n" . "\n" . " ! Deallocate dynamic module arrays\n" . " CALL CLEANUP\n" . "\n" . " END PROGRAM\n"; close(FILE); } #============================================= # Create #============================================= sub createCalcBggrad { printf "Creating calc_bggrad.f \n"; open(FILE, ">calc_bggrad.f") || die "Unable to open calc_bggrad.f"; print FILE "\n" . "!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n" . " SUBROUTINE BG_GRAD_UPDATE ( CF, TRAC )\n" . "\n" . "!-----------------------------------------------------------------------\n" . "! Function:\n" . "! Calculates the background cost-function value and updates\n" . "! adjoint variable for initial time \n" . "\n" . "! CAUTION: \n" . "! ->This subroutine is being constructed for current test problem. \n" . "! ->One needs to modify the formulas according to his/her needs.\n" . " \n" . "! INPUT:\n" . "! CF - Cost Function variable\n" . "! TRAC - tracer number\n" . "\n" . "! DATA READ FROM FILES:\n" . "! STT_PERT - background(perturbed) conc from file: CHEM_CHK_P1.**\n" . "! STT - optimized conc from file : CHEM_CHK_P3.**\n" . "\n" . "! OUTPUT:\n" . "! CF - Updated Cost Function Value\n" . " \n" . "! Revision History:\n" . "! Kumaresh Singh & Sandu,A. May 08 - Added to calculate background \n" . "! cost-function and update adjoint variable for model-observations\n" . "C-----------------------------------------------------------------------\n" . "\n" . "!\n" . " ! References to F90 modules \n" . " USE TRACER_MOD, ONLY:STT, STT_ADJ, N_TRACERS\n" . " USE CHECKPOINT_MOD\n" . " USE TIME_MOD\n" . " USE COMODE_MOD, ONLY:IXSAVE, IYSAVE, IZSAVE\n" . "\n" . " ! Force all variables to be declared explicitly\n" . " IMPLICIT NONE\n" . "\n" . " ! Header files \n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " !Arguments:\n" . " REAL*8 :: CF\n" . " INTEGER :: TRAC\n" . "\n" . " !Local Variables\n" . " INTEGER :: NYMD, NHMS\n" . " INTEGER :: I, J, L, K\n" . "\n" . " REAL*8 :: D\n" . " REAL*8 :: STT_PERT(IIPAR,JJPAR,LLPAR,N_TRACERS)\n" . " \n" . " CHARACTER( 16 ) :: PNAME = 'BG_GRAD_UPDATE'\n" . " CHARACTER( 96 ) :: XMSG = ' '\n" . " INTEGER :: istatus, LFLAG ! loop counters\n" . " REAL*8, PARAMETER :: UNC_OBS = 0.08\n" . " REAL*8 :: SIGMA( LLPAR, N_TRACERS )\n" . "\n" . "!-----------------------------------------------------------------------\n" . "\n" . " !-----------------\n" . " ! Initialization\n" . " !-----------------\n" . "\n" . " CF = 0d0\n" . " \n" . " !======================================================\n" . " ! Reading background and optimized concentration fields\n" . " !======================================================\n" . "\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " CALL READ_BG_CHKFILE( NYMD, NHMS )\n" . " STT_PERT = STT\n" . " CALL READ_CURR_CHKFILE( NYMD, NHMS )\n" . " \n" . " !=========================================================================\n" . " ! Compute the background std of each species K at each level L as the \n" . " ! mean background concentration in the entire horizontal layer\n" . " ! std = weight*ave_{ncols,nrows}(STT())\n" . " !=========================================================================\n" . " DO K=TRAC,TRAC\n" . " DO L=1,LLPAR\n" . " SIGMA(L,K) = 0d0\n" . " DO J=1,JJPAR\n" . " DO I=1,IIPAR\n" . " SIGMA(L,K) = SIGMA(L,K) + STT_PERT(I,J,L,K)\n" . " END DO\n" . " END DO\n" . " SIGMA(L,K) = 12*SIGMA(L,K)/(IIPAR*JJPAR)\n" . " END DO\n" . " END DO\n" . "\n" . " !=========================================================================\n" . " ! Calculate the cost function and update adjoint variable as:\n" . " ! -> Variance = std**2 \n" . " ! -> costfunc = sum_{ncols,nrows,nlays,nspec}(C-Cb)**2/(2*Variance)\n" . " ! -> lambda(i,j,l,k) = lambda(i,j,l,k) + (C-Cb)/Variance\n" . " !=========================================================================\n" . " DO K=TRAC,TRAC\n" . " DO L=1,LLPAR\n" . " DO J=1,JJPAR\n" . " DO I=1,IIPAR\n" . " SIGMA(L,K) = 1d2\n" . " D = (STT(I,J,L,K)-STT_PERT(I,J,L,K))/SIGMA(L,K)\n" . " CF = CF + D*D/2\n" . " STT_ADJ(I,J,L,K) = STT_ADJ(I,J,L,K) + D/SIGMA(L,K)\n" . " END DO\n" . " END DO\n" . " END DO\n" . " END DO\n" . "\n" . " END SUBROUTINE\n"; close(FILE); } #============================================= # Create calc_obsgrad.f #============================================= sub createCalcObsgrad { printf "Creating calc_obsgrad.f\n"; open(FILE, ">calc_obsgrad.f") || die "Unable to open calc_obsgrad.f"; print FILE " \n" . "!:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::\n" . " SUBROUTINE OBS_GRAD_UPDATE ( CF )\n" . "\n" . "!-----------------------------------------------------------------------\n" . "! Function:\n" . "! Calculates the observation cost-function update value and updates\n" . "! adjoint variable for the current dynamic time-step\n" . "\n" . "! CAUTION: \n" . "! This subroutine uses model-observations to calculate cost function\n" . "! and its gradient. One needs to modify the formulaes and I/O procedures\n" . "! to incorporate real-observations.\n" . " \n" . "! INPUT:\n" . "! CF - Cost Function variable\n" . "\n" . "! DATA READ FROM FILES:\n" . "! STT_ORIG - observed(reference) conc from file: CHEM_CHK_P.***\n" . "! STT - optimized conc from file : CHEM_CHK_P3.**\n" . "\n" . "! OUTPUT:\n" . "! CF - Updated Cost Function Value\n" . " \n" . "! Revision History:\n" . "! Kumaresh Singh & Sandu,A., May 08 - Added to calculate observation \n" . "! cost-function and update adjoint variable for model-observations\n" . "C-----------------------------------------------------------------------\n" . "\n" . "!\n" . " ! References to F90 modules \n" . " USE TRACER_MOD, ONLY:STT, STT_ADJ, N_TRACERS\n" . " USE CHECKPOINT_MOD\n" . " USE TIME_MOD\n" . " USE COMODE_MOD, ONLY:IXSAVE, IYSAVE, IZSAVE\n" . "\n" . " ! Force all variables to be declared explicitly\n" . " IMPLICIT NONE\n" . "\n" . " ! Header files \n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " !Arguments:\n" . " REAL*8, INTENT(INOUT) :: CF\n" . "\n" . " !Local Variables\n" . " INTEGER :: NYMD, NHMS\n" . " INTEGER :: I, J, L, K\n" . "\n" . " REAL*8 :: D\n" . " REAL*8 :: STT_ORIG(IIPAR,JJPAR,LLPAR,N_TRACERS)\n" . " \n" . " CHARACTER( 16 ) :: PNAME = 'OBS_GRAD_UPDATE'\n" . " CHARACTER( 96 ) :: XMSG = ' '\n" . " INTEGER :: istatus, LFLAG ! loop counters\n" . " REAL*8, PARAMETER :: UNC_OBS = 0.01\n" . " \n" . " REAL*8 :: AVE ( LLPAR, N_TRACERS )\n" . " REAL*8 :: NOBS( LLPAR, N_TRACERS )\n" . "\n" . "!-----------------------------------------------------------------------\n" . "\n" . " !-----------------\n" . " ! Initializations\n" . " !-----------------\n" . "\n" . " CF = 0d0 \n" . " NOBS = 0d0\n" . " AVE = 0d0\n" . "\n" . " !====================================================\n" . " ! Read observation and optimized concentration fields\n" . " !====================================================\n" . "\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " CALL READ_OBS_CHKFILE( NYMD, NHMS )\n" . " STT_ORIG = STT\n" . " CALL READ_CURR_CHKFILE( NYMD, NHMS )\n" . "\n" . " !=========================================================================\n" . " ! Compute the observation std of each species K at each level L as 8% of the \n" . " ! mean observation concentration in the observational horizontal layer\n" . " ! std = 0.08*ave_{obscols,obsrows}\n" . " !=========================================================================\n" . "\n" . " !----------------------------\n" . " ! observation grid read from\n" . " ! file 'mask.dat'\n" . " !----------------------------\n" . "\n" . " OPEN(UNIT=20,FILE='mask.dat')\n" . " \n" . " !--------------------------------\n" . " ! Calculating \n" . " ! sum_{obscols,obsrows}(STT_ORIG())\n" . " !--------------------------------\n" . "\n" . " DO \n" . " READ(UNIT=20,FMT=*,IOSTAT=istatus) I,J,L,K\n" . " IF (istatus<0) EXIT ! end of file\n" . " AVE(L,K) = AVE(L,K) + STT_ORIG(I,J,L,K)\n" . " NOBS(L,K) = NOBS(L,K) + 1\n" . " END DO \n" . " REWIND(20)\n" . "\n" . " !-----------------------------------------------------------\n" . " ! Calculating \n" . " ! -> ave_{obscols,obsrows} = sum_{obscols,obsrows}(STT_ORIG())\n" . " ! -> std = 0.08*ave_{obscols,obsrows}\n" . " !-----------------------------------------------------------\n" . " LFLAG = 0\n" . " DO \n" . " READ(UNIT=20,FMT=*,IOSTAT=istatus) I,J,L,K\n" . " IF (istatus<0) EXIT ! end of file \n" . " IF(LFLAG.ne.L) THEN ! check if current layer number is different than prev\n" . " AVE(L,K) = AVE(L,K)*UNC_OBS/NOBS(L,K)\n" . " END IF\n" . " IF(AVE(L,K).eq.0)THEN ! conc on a certain layer might be zero on the obs grid\n" . " AVE(L,K) = 1d0 \n" . " END IF\n" . " LFLAG = L\n" . " END DO \n" . " REWIND(20)\n" . "\n" . " !=========================================================================\n" . " ! Calculate cost function and update the adjoint variable as:\n" . " ! -> Variance = std**2 \n" . " ! -> costfunc = sum_{obscols,obsrows,obslays,obsspec}(C-Cobs)**2/2*Variance\n" . " ! -> lambda(c,r,l,s) = lambda(c,r,l,s) + (C-Cobs)/Variance\n" . " !=========================================================================\n" . "\n" . " DO \n" . " READ(UNIT=20,FMT=*,IOSTAT=istatus) I,J,L,K\n" . " IF (istatus<0) EXIT ! end of file\n" . " AVE(L,K) = 1d0\n" . " D = (STT(I,J,L,K) - STT_ORIG(I,J,L,K))/AVE(L,K)\n" . " CF = CF + D*D/2\n" . " STT_ADJ(I,J,L,K) = STT_ADJ(I,J,L,K) + D/AVE(L,K)\n" . " END DO \n" . "\n" . " CLOSE(20)\n" . "\n" . " END SUBROUTINE\n"; close(FILE); } #============================================= # Create chemdr_adj.f #============================================= sub createChemDrAdj { printf "Creating chemdr_adj.f\n"; open(FILE, ">chemdr_adj.f") || die "Unable to open chemdr_adj.f"; print FILE "\n" . " SUBROUTINE CHEMDR_ADJ\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine CHEMDR_ADJ is the driver subroutine for full adjoint chemistry \n" . "! w/KPP Chemistry. (Kumaresh, 01/24/08)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE AEROSOL_MOD, ONLY : AEROSOL_CONC, RDAER, SOILDUST\n" . " USE COMODE_MOD, ONLY : ABSHUM, CSPEC, ERADIUS, TAREA, \n" . " & CSPEC_ADJ_FOR_KPP,CSPEC_FOR_KPP,\n" . " & CSPEC_ADJ, JLOP, R_KPP, IXSAVE,\n" . " & IYSAVE, IZSAVE, EMIS_RATE\n" . " USE DAO_MOD, ONLY : AD, AIRVOL, ALBD, AVGW \n" . " USE DAO_MOD, ONLY : BXHEIGHT, MAKE_AVGW, OPTD, SUNCOS \n" . " USE DAO_MOD, ONLY : SUNCOSB, T\n" . " USE DIAG_OH_MOD, ONLY : DO_DIAG_OH\n" . " USE DIAG_PL_MOD, ONLY : DO_DIAG_PL\n" . " USE DUST_MOD, ONLY : RDUST_ONLINE, RDUST_OFFLINE\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG, ERROR_STOP\n" . " USE LOGICAL_MOD, ONLY : LCARB, LDUST, LEMBED\n" . " USE LOGICAL_MOD, ONLY : LPRT, LSSALT, LSULF \n" . " USE LOGICAL_MOD, ONLY : LSOA, LVARTROP, LEMIS\n" . " USE PLANEFLIGHT_MOD, ONLY : SETUP_PLANEFLIGHT\n" . " USE TIME_MOD\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, XNUMOL, STT_ADJ\n" . " USE TRACERID_MOD, ONLY : IDTNOX, IDTOX, SETTRACE\n" . " !USE TROPOPAUSE_MOD, ONLY : SAVE_FULL_TROP_ADJ\n" . " USE UVALBEDO_MOD, ONLY : UVALBEDO\n" . " USE CHEMISTRY_MOD, ONLY : gckpp_Driver_ADJ\n" . " USE gckpp_Global, ONLY : NTT\n" . " USE CHECKPOINT_MOD \n" . "\n" . " IMPLICIT NONE\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"CMN\" ! IEBD1, IEBD2, etc.\n" . "# include \"CMN_O3\" ! EMISRRN, EMISRR\n" . "# include \"CMN_NOX\" ! SLBASE\n" . "# include \"comode.h\" ! SMVGEAR variables\n" . "# include \"CMN_DEP\" ! FRCLND\n" . "# include \"CMN_DIAG\" ! ND40\n" . "\n" . " ! Local variables\n" . " LOGICAL, SAVE :: FIRSTCHEM = .TRUE.\n" . " INTEGER, SAVE :: CH4_YEAR = -1\n" . " INTEGER :: I, J, L, NPTS, N, MONTH, YEAR\n" . " INTEGER :: NYMD, NHMS\n" . " REAL*8 :: CSPEC_TMP( ITLOOP, IGAS )\n" . " REAL*8 :: STT_TMP(IIPAR,JJPAR,LLPAR,NNPAR)\n" . " CHARACTER(LEN=50) :: chfile\n" . " CHARACTER(LEN=8) :: chtime\n" . "\n" . " !=================================================================\n" . " ! CHEMDR begins here!\n" . " !=================================================================\n" . "\n" . " ! Set some size variables\n" . " NLAT = JJPAR\n" . " NLONG = IIPAR\n" . " NVERT = IVERT \n" . " NPVERT = NVERT\n" . " NPVERT = NVERT + IPLUME\n" . "\n" . " ! Get month and year\n" . " MONTH = GET_MONTH()\n" . " YEAR = GET_YEAR()\n" . "\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . "\n" . " !=================================================================\n" . " ! Call LUMP_ADJ which partitions the adjoint tracers into individual\n" . " ! adjiont species before chemistry\n" . " !=================================================================\n" . " CALL LUMP_ADJ( N_TRACERS, XNUMOL, STT_ADJ ) \n" . "\n" . " !================================================================\n" . " ! Call chemistry routines\n" . " !================================================================\n" . "\n" . " ! PHYSPROC calls both CALCRATE, which computes rxn rates \n" . " ! and SMVGEAR, which is the chemistry solver\n" . "\n" . " CALL READ_HSAVE_CHKFILE( NYMD, NHMS )\n" . "\n" . " CALL READ_CHEMISTRY_CHKFILE_CSP2( NYMD, NHMS )\n" . "\n" . " CALL READ_RRATE_CHKFILE( NYMD, NHMS )\n" . "\n" . " IF ( LEMIS ) CALL READ_EMISRATE_CHKFILE( NYMD, NHMS )\n" . "\n" . " CSPEC_FOR_KPP(:,:) = CSPEC(:,:)\n" . " CSPEC_ADJ_FOR_KPP(:,:) = CSPEC_ADJ(:,:)\n" . "\n" . " NTT = NTTLOOP\n" . " \n" . " !----------------------------------------------------------------\n" . " ! **** KPP CHEMISTRY ****\n" . " !----------------------------------------------------------------\n" . "\n" . " CALL gckpp_Driver_ADJ\n" . "\n" . " 102 FORMAT(A,'=[',3000(E24.14,1X),'];')\n" . "\n" . " CLOSE(1001)\n" . "\n" . " CALL READ_CHEMISTRY_CHKFILE_CSP1( NYMD, NHMS )\n" . "\n" . "! CALL READ_PART_CHKFILE( NYMD, NHMS )\n" . "\n" . " CALL PARTITION_ADJ( N_TRACERS, STT, STT_ADJ, XNUMOL )\n" . "\n" . " !=================================================================\n" . " ! Copy the chemical species from CSPEC (actual troposphere) to\n" . " ! CSPEC_FULL (potential troposphere) array. We only need to do \n" . " ! this if the variable troposphere is turned on. \n" . " ! (bdf, phs, bmy, 10/3/06)\n" . " !=================================================================\n" . "\n" . " ! SCHEM applies a simplified strat chemistry in order\n" . " ! to prevent stuff from building up in the stratosphere\n" . " !CALL SCHEM_ADJ\n" . "\n" . " IF ( LVARTROP ) THEN\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### CHEMDR: after SAVE_FULL_TROP')\n" . " ENDIF\n" . " \n" . " !=================================================================\n" . " ! Set FIRSTCHEM = .FALSE. -- we have gone thru one chem step\n" . " !=================================================================\n" . " FIRSTCHEM = .FALSE.\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### Now exiting CHEMDR!' )\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE CHEMDR_ADJ\n" . "\n" . "!-----------------------------------------------------------------------\n"; close(FILE); } #============================================= # Create fd_driver.f #============================================= sub createFdDriver { printf "Creating fd_driver.f\n"; open(FILE, ">fd_driver.f") || die "Unable to open fd_driver.f"; print FILE " program driver\n" . "\n" . " USE SUBDRIVER_FWD, ONLY:DO_GC_FWD\n" . " USE SUBDRIVER_BWD, ONLY:DO_GC_BWD\n" . " USE TRACER_MOD, ONLY:STT, STT_ADJ, N_TRACERS\n" . " USE FILE_MOD, ONLY:CLOSE_FILES\n" . " USE CHECKPOINT_MOD\n" . " USE TIME_MOD\n" . " USE COMODE_MOD, ONLY:IXSAVE, IYSAVE, IZSAVE\n" . "\n" . " implicit none\n" . "\n" . " ! Header files \n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " !Local Variables\n" . " REAL*8 :: f1, f2, Sum,EPS\n" . "\n" . " INTEGER I,J,L,T,flag,K,DUM\n" . "\n" . " INTEGER, PARAMETER :: TRAC = 1\n" . " REAL*8, PARAMETER :: FEPS = 0.01\n" . " REAL*8, PARAMETER :: SMALLOX = 1d-5\n" . " REAL*8, PARAMETER :: SMALLNOX = 1d-8\n" . " REAL*8, PARAMETER :: SMALLCO = 1d-10\n" . "\n" . " INTEGER :: NYMD, NHMS\n" . " REAL*8 :: TAU, fd1, fd2, adj\n" . " REAL*8 :: er1(IIPAR,JJPAR,LLPAR,1)\n" . " REAL*8 :: ab1(IIPAR,JJPAR,LLPAR,1)\n" . " REAL*8 :: er2(IIPAR,JJPAR,LLPAR,1)\n" . " REAL*8 :: ab2(IIPAR,JJPAR,LLPAR,1)\n" . " REAL*8 :: er3(IIPAR,JJPAR,LLPAR,1)\n" . " REAL*8 :: ab3(IIPAR,JJPAR,LLPAR,1)\n" . "\n" . "\n" . " open(20,file='ITER')\n" . " read(20,*) flag\n" . " close(20)\n" . "\n" . " er1 = 0d0\n" . " er2 = 0d0\n" . "\n" . "C ---------------------------------\n" . "C PERTURBED RUN\n" . "C ---------------------------------\n" . "\n" . " IF(flag.eq.0)THEN\n" . "\n" . " EPS = FEPS\n" . " \n" . " PRINT*,'ENTERING FWD FOR PERT 1'\n" . " call do_gc_fwd(EPS, TRAC, FEPS)\n" . "\n" . " open(20,file='ITER')\n" . " write(20,*) 1\n" . " close(20)\n" . " \n" . " ELSE IF(flag.eq.1)THEN\n" . "\n" . " EPS = FEPS\n" . " \n" . " PRINT*,'ENTERING FWD FOR PERT 2'\n" . " call do_gc_fwd(EPS, TRAC, FEPS) \n" . "\n" . " open(20,file='ITER')\n" . " write(20,*) 2\n" . " close(20)\n" . "\n" . " ELSE\n" . " \n" . " EPS = 0\n" . " \n" . " PRINT*,'ENTERING FWD FOR ORIG'\n" . " call do_gc_fwd(EPS, TRAC, FEPS)\n" . "\n" . " PRINT*,'ENTERING BWD FOR PERT 2'\n" . " call do_gc_bwd(EPS)\n" . " \n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . " \n" . " CALL READ_CHEMISTRY_CHKFILE_P( NYMD, NHMS )\n" . " \n" . " DO L=1,LLPAR\n" . " DO J=1,JJPAR\n" . " DO I=1,IIPAR\n" . " fd1 = STT(I,J,L,1)\n" . " fd2 = STT(I,J,L,2)\n" . " adj = STT_ADJ(I,J,L,1) !NOx\n" . " er1(I,J,L,1) = abs(fd2-adj)/max(abs(fd2),abs(adj),1d-6)*100\n" . " er2(I,J,L,1) = abs(fd2-fd1)/max(abs(fd2),abs(fd1),1d-6)*100\n" . " er3(I,J,L,1) = abs(fd1-adj)/max(abs(adj),abs(fd1),1d-6)*100\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " STT = 0d0\n" . " STT(:,:,:,1) = er1(:,:,:,1)\n" . " STT(:,:,:,2) = er2(:,:,:,1)\n" . " STT(:,:,:,3) = er3(:,:,:,1)\n" . " CALL MAKE_CHEMISTRY_CHKFILE_P3( NYMD, NHMS, TAU )\n" . "\n" . " open(20,file='ITER')\n" . " write(20,*) 0\n" . " close(20)\n" . " \n" . " END IF\n" . " ! Close all files\n" . " CALL CLOSE_FILES\n" . "\n" . " ! Deallocate dynamic module arrays\n" . " CALL CLEANUP\n" . "\n" . " end program\n"; close(FILE); } #============================================= # Create lump_adj.f #============================================= sub createLumpAdj() { printf "Creating lump_adj.f\n"; open(FILE, ">lump_adj.f") || die "Unable to open lump_adj.f"; print FILE "\n" . " SUBROUTINE LUMP_ADJ( NTRACER, XNUMOL, STT_ADJ )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine LUMP_ADJ takes GEOS-Chem tracers and partitions them into individual \n" . "! chemistry species before each KPP chemistry timestep. LUMP adjoint code \n" . "! developed using TAMC. (Kumaresh, 01/24/08)\n" . "! \n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) NTRACER (INTEGER) : Number of tracers\n" . "! (2 ) XNUMOL (REAL*8 ) : Array of molecules tracer / kg tracer \n" . "! (3 ) STT_ADJ (REAL*8 ) : Adjoint tracer concentrations [molec/cm3/box]\n" . "!\n" . "! Arguments as Output:\n" . "! ============================================================================\n" . "! (3 ) STT_ADJ (REAL*8 ) : Adjoint tracer concentrations [v/v/box]\n" . "\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE COMODE_MOD, ONLY : CSPEC_ADJ, JLOP, VOLUME\n" . " USE TRACERID_MOD, ONLY : IDTRMB, NMEMBER, CTRMB\n" . "\n" . " IMPLICIT NONE\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"comode.h\" ! SMVGEAR II arrays\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NTRACER\n" . " REAL*8, INTENT(IN) :: XNUMOL(NTRACER)\n" . " REAL*8, INTENT(INOUT) :: STT_ADJ(IIPAR,JJPAR,LLPAR,NTRACER) \n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, L, N, JLOOP, KK, JJ\n" . " REAL*8 :: ADCONCTMP \n" . "\n" . " !=================================================================\n" . " ! LUMP begins here!\n" . " !=================================================================\n" . " DO N = 1, NTRACER\n" . " \n" . " ! Skip if not a valid tracer\n" . " IF ( IDTRMB(N,1) == 0 ) CYCLE\n" . " \n" . " ! Loop over grid boxes\n" . " DO L = 1, NPVERT\n" . " DO J = 1, NLAT\n" . " DO I = 1, NLONG\n" . " ADCONCTMP = 0.d0\n" . "\n" . " ! 1-D SMVGEAR grid box index \n" . " JLOOP = JLOP(I,J,L)\n" . " IF ( JLOOP == 0 ) CYCLE\n" . "\n" . " STT_ADJ(I,J,L,N) = STT_ADJ(I,J,L,N)*\n" . " \$ (VOLUME(JLOOP)/XNUMOL(N))\n" . " ADCONCTMP = ADCONCTMP+STT_ADJ(I,J,L,N)\n" . " STT_ADJ(I,J,L,N) = 0.d0\n" . "\n" . " DO KK = 1, NMEMBER(N)\n" . " JJ = IDTRMB(N, KK)\n" . " CSPEC_ADJ(JLOOP,JJ) = CSPEC_ADJ(JLOOP,JJ)+\n" . " \$ ADCONCTMP*(1+CTRMB(N,KK))\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . " \n" . " ! Return to calling program\n" . " END SUBROUTINE LUMP_ADJ\n" . "\n"; close(FILE); } #============================================= # Create partition_adj.f #============================================= sub createPartitionAdj() { printf "Creating partition_adj.f\n"; open(FILE, ">partition_adj.f") || die "Unable to open partition_adj.f"; print FILE "! \$Id: partition.f,v 1.8 2006/08/14 17:58:12 bmy Exp \$\n" . " SUBROUTINE PARTITION_ADJ( NTRACER, STT, STT_ADJ, XNUMOL ) \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine PARTITION separates GEOS-CHEM tracers into its individual\n" . "! constituent chemistry species before each SMVGEAR chemistry timestep.\n" . "! (bdf, bmy, 4/1/03, 7/14/06)\n" . "! \n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) NTRACER (INTEGER) : Number of tracers\n" . "! (2 ) STT (REAL*8 ) : Tracer concentrations [kg/box]\n" . "! (3 ) XNUMOL (REAL*8 ) : Array of molecules tracer / kg tracer \n" . "!\n" . "! Arguments as Output:\n" . "! ============================================================================\n" . "! (1 ) STT (REAL*8 ) : Updated tracer concentrations [molec/cm3/box]\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now make CSAVE a local dynamic array. Updated comments, cosmetic \n" . "! changes (bmy, 4/24/03)\n" . "! (2 ) Add OpenMP parallelization commands (bmy, 8/1/03)\n" . "! (3 ) Now dimension args XNUMOL, STT w/ NTRACER and not NNPAR (bmy, 7/20/04)\n" . "! (4 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (5 ) Resize CSAVE to save local memory, for SUN compiler. (bmy, 7/14/06)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules \n" . " USE COMODE_MOD, ONLY : CSPEC, JLOP, VOLUME, PART_CASE, CSPEC_ADJ\n" . " USE ERROR_MOD, ONLY : ALLOC_ERR, ERROR_STOP\n" . " USE TRACERID_MOD, ONLY : IDTOX, IDTNOX, IDTRMB\n" . " USE TRACERID_MOD, ONLY : IDO3, IDNO, IDHNO2\n" . " USE TRACERID_MOD, ONLY : CTRMB, NMEMBER\n" . "\n" . " IMPLICIT NONE\n" . "\n" . "# include \"CMN_SIZE\"\n" . "# include \"comode.h\"\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NTRACER\n" . " REAL*8, INTENT(INOUT) :: STT(IIPAR,JJPAR,LLPAR,NTRACER)\n" . " REAL*8, INTENT(INOUT) :: STT_ADJ(IIPAR,JJPAR,LLPAR,NTRACER)\n" . " REAL*8, INTENT(IN) :: XNUMOL(NTRACER)\n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, L, N, JLOOP, IPL, JJ, KK\n" . " INTEGER :: CSAVEID(IGAS)\n" . " INTEGER :: CSAVEID_JJ(IGAS)\n" . " INTEGER :: CS, IDNUM, AS \n" . " REAL*8 :: CONCTMP, CONCNOX, SUM, SUM1\n" . " REAL*8 :: CSAVE( ITLOOP, NTRACER )\n" . " real*8 cspeci(itloop,igas)\n" . " real*8 cspecj(itloop,igas)\n" . " integer ip1\n" . " integer ip2\n" . " real*8 sumj\n" . " real*8 adconcnox\n" . " real*8 adconctmp\n" . " real*8 adcsave(itloop,ntracer)\n" . " real*8 adsum\n" . " real*8 adsum1\n" . " real*8 stt_tmp(iipar,jjpar,llpar,ntracer)\n" . " \n" . " !=================================================================\n" . " ! PARTITION begins here!\n" . " !\n" . " ! Copy values of CSPEC that need to be saved (bdf, 3/30/99)\n" . " !=================================================================\n" . "\n" . " ! Initialize\n" . " IDNUM = 0\n" . " CSAVEID(:) = 0\n" . " CSAVEID_JJ(:) = 0\n" . "\n" . " ! Loop over tracers\n" . " DO N = 1, NTRACER\n" . "\n" . " ! Skip if this is not a valid tracer\n" . " IF ( IDTRMB(N,1) == 0 ) CYCLE\n" . "\n" . " ! Handle all other tracers except Ox \n" . " IF ( N /= IDTOX ) THEN\n" . " DO KK = 1, NMEMBER(N)\n" . " IDNUM = IDNUM + 1\n" . " JJ = IDTRMB(N,KK)\n" . " CSAVEID(JJ) = IDNUM\n" . " CSAVEID_JJ(IDNUM) = JJ\n" . " ENDDO\n" . "\n" . " ! Handle Ox\n" . " ELSE IF ( IDTOX /= 0 ) THEN\n" . " JJ = IDTRMB(N,1)\n" . " IDNUM = IDNUM + 1\n" . " CSAVEID(JJ) = IDNUM\n" . " CSAVEID_JJ(IDNUM) = JJ\n" . " ENDIF\n" . " ENDDO\n" . "\n" . " ! Loop over tracer members and boxes\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L, N, JLOOP )\n" . "!\$OMP+SCHEDULE( DYNAMIC )\n" . " DO N = 1, IDNUM\n" . " DO L = 1, NPVERT\n" . " DO J = 1, NLAT\n" . " DO I = 1, NLONG\n" . "\n" . " ! 1-D SMVGEAR grid box index\n" . " JLOOP = JLOP(I,J,L)\n" . " IF ( JLOOP == 0 ) CYCLE\n" . "\n" . " ! Store into CSAVE\n" . " CSAVE(JLOOP,N) = CSPEC(JLOOP,CSAVEID_JJ(N))\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " !=================================================================\n" . " ! Split each tracer up into its components (if any)\n" . " ! Family tracers are partitioned among members according to \n" . " ! initial ratios. In tracer sequence, OX must be after NOX, \n" . " ! otherwise, adjust the code\n" . " !=================================================================\n" . "\n" . "C----------------------------------------------\n" . "C RESET LOCAL ADJOINT VARIABLES\n" . "C----------------------------------------------\n" . " adconcnox = 0.\n" . " adconctmp = 0.\n" . " do ip2 = 1, ntracer\n" . " do ip1 = 1, itloop\n" . " adcsave(ip1,ip2) = 0.\n" . " end do\n" . " end do\n" . " adsum = 0.\n" . " adsum1 = 0.\n" . "\n" . "C----------------------------------------------\n" . "C ADJOINT COMPUTATIONS\n" . "C----------------------------------------------\n" . " do n = ntracer, 1, -1\n" . " if (idtrmb(n,1) .ne. 0) then\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L, JLOOP, CONCTMP, SUM, KK, JJ, SUM1, CONCNOX )\n" . "!\$OMP+PRIVATE( ADCONCTMP, ADSUM, ADSUM1, ADCONCNOX )\n" . "!\$OMP+SCHEDULE( DYNAMIC )\n" . " do l = npvert, 1, -1\n" . " do j = nlat, 1, -1\n" . " do i = nlong, 1, -1\n" . " sumj = sum\n" . " jloop = jlop(i,j,l)\n" . " if (jloop .ne. 0) then\n" . " stt(i,j,l,n) = stt(i,j,l,n)/volume(jloop)*xnumol(n)\n" . " conctmp = stt(i,j,l,n)\n" . " if (n .ne. idtox) then\n" . " sum = 0.d0\n" . " do kk = 1, nmember(n)\n" . " jj = idtrmb(n,kk)\n" . " sum = sum+csave(jloop,csaveid(jj))*\n" . " & (ctrmb(n,kk)+1)\n" . " end do\n" . " else if (idtox .ne. 0) then\n" . " jj = idtrmb(n,1)\n" . " sum = csave(jloop,csaveid(jj))*(ctrmb(n,1)+1)\n" . " sum1 = 0.d0\n" . " do kk = 2, nmember(n)\n" . " jj = idtrmb(n,kk)\n" . " sum = sum+csave(jloop,csaveid(jj))*\n" . " & (ctrmb(n,kk)+1)\n" . " sum1 = sum1+cspec(jloop,jj)*(ctrmb(n,kk)+1)\n" . " end do\n" . " endif\n" . " if (n .ne. idtox) then\n" . " do kk = 1, nmember(n)\n" . " jj = idtrmb(n,kk)\n" . " adconctmp = adconctmp+CSPEC_ADJ(jloop,jj)*\n" . " & (csave(jloop,csaveid(jj))/sum)\n" . " adcsave(jloop,csaveid(jj)) = \n" . " & adcsave(jloop,csaveid(jj))+\n" . " \$ CSPEC_ADJ(jloop,jj)/sum*conctmp\n" . " adsum = adsum-CSPEC_ADJ(jloop,jj)*\n" . " & csave(jloop,csaveid(jj))/(sum*sum)*conctmp\n" . " CSPEC_ADJ(jloop,jj) = 0.\n" . " end do\n" . " else if (idtox .ne. 0 .and. idtnox .ne. 0) then\n" . " jj = ido3\n" . " cspec(jloop,jj) = conctmp-sum1\n" . " if (cspec(jloop,jj) .le. 0.d0) then\n" . " do kk = 1, nmember(n)\n" . " jj = idtrmb(n,kk)\n" . " cspec(jloop,jj) = csave(jloop,csaveid(jj))/\n" . " & sum*conctmp\n" . " end do\n" . " sum = 0.d0\n" . " sum1 = 0.d0\n" . " do kk = 1, nmember(idtnox)\n" . " jj = idtrmb(idtnox,kk)\n" . " if (jj .eq. idno .or. jj .eq. idhno2) then\n" . " sum = sum+csave(jloop,csaveid(jj))*\n" . " & (ctrmb(idtnox,kk)+1)\n" . " else\n" . " sum1 = sum1+cspec(jloop,jj)*\n" . " & (ctrmb(idtnox,kk)+1)\n" . " endif\n" . " end do\n" . " concnox = stt(i,j,l,idtnox)\n" . " do kk = 1, nmember(idtnox)\n" . " jj = idtrmb(idtnox,kk)\n" . " if (jj .eq. idno .or. jj .eq. idhno2) then\n" . " adconcnox = adconcnox+CSPEC_ADJ(jloop,jj)\n" . " & *(csave(jloop,csaveid(jj))/sum)\n" . " adcsave(jloop,csaveid(jj)) = \n" . " & adcsave(jloop,csaveid(jj))+\n" . " \$ CSPEC_ADJ(jloop,jj)/sum*(concnox-sum1)\n" . " adsum = adsum-CSPEC_ADJ(jloop,jj)*\n" . " & csave(jloop,csaveid(jj))/(sum*sum)\n" . " & *(concnox-sum1)\n" . " adsum1 = adsum1-CSPEC_ADJ(jloop,jj)\n" . " & *(csave(jloop,csaveid(jj))/sum)\n" . " CSPEC_ADJ(jloop,jj) = 0.\n" . " endif\n" . " end do\n" . " STT_ADJ(i,j,l,idtnox) = STT_ADJ(i,j,l,idtnox)+\n" . " & adconcnox\n" . " adconcnox = 0.\n" . " do kk = 1, nmember(idtnox)\n" . " jj = idtrmb(idtnox,kk)\n" . " if (jj .eq. idno .or. jj .eq. idhno2) then\n" . " adcsave(jloop,csaveid(jj)) = \n" . " & adcsave(jloop,csaveid(jj))+adsum*\n" . " \$ (1+ctrmb(idtnox,kk))\n" . " else\n" . " CSPEC_ADJ(jloop,jj) = CSPEC_ADJ(jloop,jj)\n" . " & +adsum1*(1+ctrmb(idtnox,kk))\n" . " endif\n" . " end do\n" . " adsum1 = 0.\n" . " adsum = 0.\n" . " sum = sumj\n" . " if (n .ne. idtox) then\n" . " sum = 0.d0\n" . " do kk = 1, nmember(n)\n" . " jj = idtrmb(n,kk)\n" . " sum = sum+csave(jloop,csaveid(jj))*\n" . " & (ctrmb(n,kk)+1)\n" . " end do\n" . " else if (idtox .ne. 0) then\n" . " jj = idtrmb(n,1)\n" . " sum = csave(jloop,csaveid(jj))*\n" . " & (ctrmb(n,1)+1)\n" . " do kk = 2, nmember(n)\n" . " jj = idtrmb(n,kk)\n" . " sum = sum+csave(jloop,csaveid(jj))*\n" . " & (ctrmb(n,kk)+1)\n" . " end do\n" . " endif\n" . " do kk = 1, nmember(n)\n" . " jj = idtrmb(n,kk)\n" . " adconctmp = adconctmp+CSPEC_ADJ(jloop,jj)*\n" . " & (csave(jloop,csaveid(jj))/sum)\n" . " adcsave(jloop,csaveid(jj)) = \n" . " & adcsave(jloop,csaveid(jj))+\n" . " \$ CSPEC_ADJ(jloop,jj)/sum*conctmp\n" . " adsum = adsum-CSPEC_ADJ(jloop,jj)*\n" . " & csave(jloop,csaveid(jj))/(sum*sum)\n" . " & *conctmp\n" . " CSPEC_ADJ(jloop,jj) = 0.\n" . " end do\n" . " endif\n" . " jj = ido3\n" . " adconctmp = adconctmp+CSPEC_ADJ(jloop,jj)\n" . " adsum1 = adsum1-CSPEC_ADJ(jloop,jj)\n" . " CSPEC_ADJ(jloop,jj) = 0.\n" . " endif\n" . " if (n .ne. idtox) then\n" . " do kk = 1, nmember(n)\n" . " jj = idtrmb(n,kk)\n" . " adcsave(jloop,csaveid(jj)) = \n" . " & adcsave(jloop,csaveid(jj))+\n" . " & adsum*(1+ctrmb(n,kk))\n" . " end do\n" . " adsum = 0.\n" . " else if (idtox .ne. 0) then\n" . " do kk = 2, nmember(n)\n" . " jj = idtrmb(n,kk)\n" . " CSPEC_ADJ(jloop,jj) = CSPEC_ADJ(jloop,jj)+\n" . " & adsum1*(1+ctrmb(n,kk))\n" . " adcsave(jloop,csaveid(jj)) = \n" . " & adcsave(jloop,csaveid(jj))+adsum*(1+\n" . " \$ ctrmb(n,kk))\n" . " end do\n" . " adsum1 = 0.\n" . " jj = idtrmb(n,1)\n" . " adcsave(jloop,csaveid(jj)) = adcsave(jloop,\n" . " \$ csaveid(jj))+adsum*(1+ctrmb(n,1))\n" . " adsum = 0.\n" . " endif\n" . " STT_ADJ(i,j,l,n) = STT_ADJ(i,j,l,n)+adconctmp\n" . " adconctmp = 0.\n" . " STT_ADJ(i,j,l,n) = STT_ADJ(i,j,l,n)/volume(jloop)*\n" . " \$ xnumol(n)\n" . " endif\n" . " end do\n" . " end do\n" . " end do\n" . "!\$OMP END PARALLEL DO\n" . " endif\n" . " end do\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE PARTITION_ADJ\n"; close(FILE); } #============================================= # Create read_sciao3_mod.f #============================================= sub createReadScaio3Mod() { printf "Creating read_sciao3_mod.f\n"; open(FILE, ">read_sciao3_mod.f") || die "Unable to open read_sciao3_mod.f"; print FILE "!\$ read_sciao3_mod.f, Kumaresh 2008/24/01; based on read_sciano2_mod.f \n" . "!\$ designed by Daven Henze for geos-3 Adjoint v6 \n" . " \n" . " MODULE READ_SCIAO3_MOD \n" . "\n" . "!---------------------------------------------------------------------\n" . " \n" . " implicit none\n" . " \n" . " CHARACTER(LEN=140) :: SCIA_FILE\n" . "\n" . " ! Location of scia data \n" . " CHARACTER(LEN=140), PARAMETER :: SCIA_DATA_DIR = \n" . " & '/home/kumaresh/GEOS/data/SCIA_DATA/'\n" . " \n" . " CONTAINS \n" . " \n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE CALC_TESO3_FORCE( STT_ADJ )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine CALC_TESO3_FORCE calculates adjoint forcing and cost function\n" . "! contribution from observations of O3 tropospheric column\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) STT_ADJ (REAL*8) : Adjoint Variable\n" . "! (2 ) COST_FUNC (REAL*8) : Cost function \n" . "! \n" . "! Arguments as Output:\n" . "! ============================================================================\n" . "! (1 ) STT_ADJ (REAL*8) : Adjoint Variable\n" . "! (2 ) COST_FUNC (REAL*8) : Cost function \n" . "! \n" . "! NOTES:\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! Reference to f90 modules\n" . " USE COMODE_MOD, ONLY : JLOP\n" . " USE TRACERID_MOD, ONLY : IDO3\n" . " USE ERROR_MOD, ONLY : ERROR_STOP\n" . " USE GRID_MOD, ONLY : GET_IJ\n" . " USE TIME_MOD, ONLY : GET_TS_CHEM, GET_NYMD, GET_NHMS, \n" . " & GET_NHMSb, GET_NYMDb\n" . " USE TRACER_MOD, ONLY : N_TRACERS\n" . "\n" . "\n" . "# include \"CMN_SIZE\" ! Size params, PTOP\n" . "\n" . " ! Arguments\n" . " REAL*8, INTENT(INOUT) :: STT_ADJ(IIPAR,JJPAR,LLPAR,N_TRACERS)\n" . " \n" . " ! Local variables \n" . " INTEGER, PARAMETER :: MLGC_TOP = LLTROP\n" . " INTEGER :: TIMESPAN, NP_START, NP_STOP\n" . " REAL :: ALON, ALAT\n" . " INTEGER :: I, J, L, JLOOP, LTM, LGC, NP, IIJJ(2)\n" . " INTEGER :: II,JJ,LL\n" . " INTEGER :: NP_SPAN\n" . " LOGICAL, SAVE :: FIRST = .TRUE. \n" . "\n" . " !=================================================================\n" . " ! CALC_SCIAO3_FORCE begins here!\n" . " !=================================================================\n" . "\n" . " STT_ADJ = 0d0\n" . "\n" . " SCIA_FILE = TRIM( SCIA_DATA_DIR )//'o3lonlat.dat'\n" . "\n" . " open(UNIT=20,file=TRIM(SCIA_FILE))\n" . "\n" . " II = 1\n" . " JJ = 1\n" . " LL = 1\n" . "\n" . " ! Loop over number of pixels in current timespan\n" . " DO NP_SPAN = 1, 125\n" . "\n" . " read(20,*) ALON,ALAT\n" . "\n" . " DO L = 1,LLTROP\n" . "\n" . " ! Get GEOS grid cell of current pixel\n" . " IIJJ = GET_IJ(ALON,ALAT)\n" . " I = IIJJ(1)\n" . " J = IIJJ(2)\n" . "\n" . " \n" . " ! Get JLOOP 1-D coord from I,J,L 3-D coord\n" . " !JLOOP = JLOP(I,J,L) \n" . "\n" . " ! Add this in case I,J,L is not in current trop (dkh)\n" . " !IF ( JLOOP == 0 ) CYCLE\n" . "\n" . " IF( II==I.AND.JJ==J.AND.LL==L) CYCLE\n" . "\n" . " II = I\n" . " JJ = J\n" . " LL = L\n" . "\n" . " ! Calc cost function contribution\n" . "\n" . " STT_ADJ(I,J,L,2) = 1d0\n" . "\n" . " !COST_FUNC = COST_FUNC + STT(I,J,L,2)*STT(I,J,L,2)/2\n" . " \n" . " END DO\n" . " \n" . " ENDDO ! NP\n" . "\n" . " close(20)\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE CALC_TESO3_FORCE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . "\n" . " END MODULE READ_SCIAO3_MOD\n"; close(FILE); } #============================================= # Create senst_driver.f #============================================= sub createSenstDriver() { printf "Creating senst_driver.f\n"; open(FILE, ">senst_driver.f") || die "Unable to open senst_driver.f"; print FILE " program driver\n" . "\n" . " USE SUBDRIVER_FWD, ONLY:DO_GC_FWD\n" . " USE SUBDRIVER_BWD, ONLY:DO_GC_BWD\n" . " USE FILE_MOD, ONLY:CLOSE_FILES\n" . "\n" . " implicit none\n" . "\n" . " ! Header files \n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " INTEGER I,J,L,T,flag,K,DUM\n" . "\n" . "C ---------------------------------\n" . " PRINT*,'ENTERING FWD'\n" . " call do_gc_fwd()\n" . " \n" . " PRINT*,'ENTERING BWD'\n" . " call do_gc_bwd()\n" . " \n" . " ! Close all files\n" . " CALL CLOSE_FILES\n" . " \n" . " ! Deallocate dynamic module arrays\n" . " CALL CLEANUP\n" . "\n" . " end program\n"; close(FILE); } #============================================= # Create subdriver_bwd_4d.f #============================================= sub createSubdriverBwd4d() { printf "Creating subdriver_bwd_4d.f\n"; open(FILE, ">subdriver_bwd_4d.f") || die "Unable to open subdriver_bwd_4d.f"; print FILE "! =============================================================\n" . "! subdriver_bwd_fd.f, 2008/24/01 Kumaresh \$\n" . "! Adjoint finite-difference driver is a modified version of main \n" . "! driver for GEOS-Chem to carryout finite difference tests.\n" . "! =============================================================\n" . "!\n" . " MODULE SUBDRIVER_BWD\n" . "! \n" . "!******************************************************************************\n" . "! \n" . "! \n" . "! GGGGGG CCCCCC A DDDDD J OOO I N N TTTTTTT \n" . "! G C A A D D J O O I NN N T\n" . "! G GGG C == AAAAA D D J 0 O I N N N T\n" . "! G G C A A D D J J 0 O I N NN T\n" . "! GGGGGG CCCCCC A A DDDDD JJJ OOO I N N T\n" . "! \n" . "! \n" . "! for 4 x 5, 2 x 2.5 global grids and 1 x 1 nested grids\n" . "!\n" . "! Contact: Bob Yantosca, Harvard University (bmy.as.harvard.edu)\n" . "! \n" . "!******************************************************************************\n" . "!\n" . "! See the GEOS-Chem-Adj Web Site:\n" . "!\n" . "! http://people.cs.vt.edu/~asandu/Software/GC_ADJ/GC_ADJ.html\n" . "!\n" . "! and the GEOS-CHEM User's Guide:\n" . "!\n" . "! http://www.cs.vt.edu/~asandu/Software/GC_ADJ/GC_ADJ_Users_Manual.pdf\n" . "!\n" . "! for the most up-to-date GEOS-CHEM documentation on the following topics:\n" . "!\n" . "! - installation, compilation, and execution\n" . "! - coding practice and style\n" . "! - input files and met field data files\n" . "! - horizontal and vertical resolution\n" . "! - modification history\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules \n" . " USE A3_READ_MOD, ONLY : GET_A3_FIELDS\n" . " USE A3_READ_MOD, ONLY : OPEN_A3_FIELDS\n" . " USE A3_READ_MOD, ONLY : UNZIP_A3_FIELDS\n" . " USE A3_READ_MOD, ONLY : OPEN_A3_FIELDS_ADJ\n" . " USE A6_READ_MOD, ONLY : GET_A6_FIELDS\n" . " USE A6_READ_MOD, ONLY : OPEN_A6_FIELDS\n" . " USE A6_READ_MOD, ONLY : UNZIP_A6_FIELDS\n" . " USE A6_READ_MOD, ONLY : OPEN_A6_FIELDS_ADJ\n" . " USE CHECKPOINT_MOD \n" . " USE CHEMISTRY_MOD, ONLY : DO_CHEMISTRY_ADJ\n" . " USE BENCHMARK_MOD, ONLY : STDRUN\n" . " USE CONVECTION_MOD, ONLY : DO_CONVECTION_ADJ\n" . " USE COMODE_MOD, ONLY : INIT_COMODE, CSPEC, CSPEC_ADJ, JLOP, \n" . " & IXSAVE,IYSAVE,IZSAVE\n" . " USE DIAG_MOD, ONLY : DIAGCHLORO\n" . " USE DIAG41_MOD, ONLY : DIAG41, ND41\n" . " USE DIAG42_MOD, ONLY : DIAG42, ND42\n" . " USE DIAG48_MOD, ONLY : DIAG48, ITS_TIME_FOR_DIAG48\n" . " USE DIAG49_MOD, ONLY : DIAG49, ITS_TIME_FOR_DIAG49\n" . " USE DIAG50_MOD, ONLY : DIAG50, DO_SAVE_DIAG50\n" . " USE DIAG51_MOD, ONLY : DIAG51, DO_SAVE_DIAG51\n" . " USE DIAG_OH_MOD, ONLY : PRINT_DIAG_OH\n" . " USE DAO_MOD, ONLY : AD, AIRQNT \n" . " USE DAO_MOD, ONLY : AVGPOLE, CLDTOPS\n" . " USE DAO_MOD, ONLY : CONVERT_UNITS, COPY_I6_FIELDS\n" . " USE DAO_MOD, ONLY : COSSZA, INIT_DAO\n" . " USE DAO_MOD, ONLY : INTERP_ADJ, PS1\n" . " USE DAO_MOD, ONLY : PS2, PSC2 \n" . " USE DAO_MOD, ONLY : T, TS \n" . " USE DAO_MOD, ONLY : SUNCOS, SUNCOSB\n" . " USE DAO_MOD, ONLY : MAKE_RH, TMP_PRESS\n" . " USE DRYDEP_MOD, ONLY : DO_DRYDEP\n" . " USE EMISSIONS_MOD, ONLY : DO_EMISSIONS\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_BPCH, IU_DEBUG\n" . " USE FILE_MOD, ONLY : IU_ND48, IU_SMV2LOG \n" . " USE FILE_MOD, ONLY : CLOSE_FILES\n" . " USE GLOBAL_CH4_MOD, ONLY : INIT_GLOBAL_CH4, CH4_AVGTP\n" . " USE GCAP_READ_MOD, ONLY : GET_GCAP_FIELDS\n" . " USE GCAP_READ_MOD, ONLY : OPEN_GCAP_FIELDS\n" . " USE GCAP_READ_MOD, ONLY : UNZIP_GCAP_FIELDS\n" . " USE GWET_READ_MOD, ONLY : GET_GWET_FIELDS\n" . " USE GWET_READ_MOD, ONLY : OPEN_GWET_FIELDS\n" . " USE GWET_READ_MOD, ONLY : UNZIP_GWET_FIELDS\n" . " USE I6_READ_MOD, ONLY : GET_I6_FIELDS_1\n" . " USE I6_READ_MOD, ONLY : GET_I6_FIELDS_2\n" . " USE I6_READ_MOD, ONLY : OPEN_I6_FIELDS_ADJ\n" . " USE I6_READ_MOD, ONLY : UNZIP_I6_FIELDS\n" . " USE INPUT_MOD, ONLY : READ_INPUT_FILE\n" . " USE LAI_MOD, ONLY : RDISOLAI\n" . " USE LIGHTNING_NOX_MOD, ONLY : LIGHTNING\n" . " !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " !%%% NOTE: Temporary kludge: For GEOS-4 we want to use the new near-land\n" . " !%%% lightning formulation. But for the time being, we must keep the \n" . " !%%% existing lightning for other met field types. (ltm, bmy, 5/10/06)\n" . " USE LIGHTNING_NOX_NL_MOD, ONLY : LIGHTNING_NL\n" . " !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " USE LOGICAL_MOD, ONLY : LEMIS, LCHEM, LUNZIP, LDUST\n" . " USE LOGICAL_MOD, ONLY : LLIGHTNOX, LPRT, LSTDRUN, LSVGLB\n" . " USE LOGICAL_MOD, ONLY : LWAIT, LTRAN, LUPBD, LCONV\n" . " USE LOGICAL_MOD, ONLY : LWETD, LTURB, LDRYD, LMEGAN \n" . " USE LOGICAL_MOD, ONLY : LDYNOCEAN, LSOA, LVARTROP\n" . " USE MEGAN_MOD, ONLY : INIT_MEGAN\n" . " USE MEGAN_MOD, ONLY : UPDATE_T_15_AVG\n" . " USE MEGAN_MOD, ONLY : UPDATE_T_DAY\n" . " USE PBL_MIX_MOD, ONLY : DO_PBL_MIX_ADJ\n" . " USE OCEAN_MERCURY_MOD, ONLY : MAKE_OCEAN_Hg_RESTART\n" . " USE OCEAN_MERCURY_MOD, ONLY : READ_OCEAN_Hg_RESTART\n" . " USE PLANEFLIGHT_MOD, ONLY : PLANEFLIGHT\n" . " USE PLANEFLIGHT_MOD, ONLY : SETUP_PLANEFLIGHT \n" . " USE PRESSURE_MOD, ONLY : INIT_PRESSURE\n" . " USE PRESSURE_MOD, ONLY : SET_FLOATING_PRESSURE\n" . " USE READ_TESO3_MOD \n" . " USE TIME_MOD\n" . " USE TRACER_MOD, ONLY : CHECK_STT, N_TRACERS, STT, TCVV,\n" . " & STT_ADJ, PERT, NHMSb, NYMDb, TAUb\n" . " USE TRACER_MOD, ONLY : DDEP_ADJ, EMIS_ADJ, EMIS_I_ADJ\n" . " USE TRACER_MOD, ONLY : ITS_AN_AEROSOL_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_CH4_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_FULLCHEM_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_MERCURY_SIM\n" . " USE TRACERID_MOD, ONLY : IDO3\n" . " USE TRANSPORT_MOD, ONLY : DO_TRANSPORT_ADJ\n" . " USE TROPOPAUSE_MOD, ONLY : READ_TROPOPAUSE, CHECK_VAR_TROP\n" . " USE RESTART_MOD, ONLY : MAKE_RESTART_FILE, READ_RESTART_FILE\n" . " USE UPBDFLX_MOD, ONLY : DO_UPBDFLX, UPBDFLX_NOY\n" . " USE UVALBEDO_MOD, ONLY : READ_UVALBEDO\n" . " USE WETSCAV_MOD, ONLY : INIT_WETSCAV_ADJ, DO_WETDEP_ADJ\n" . " USE XTRA_READ_MOD, ONLY : GET_XTRA_FIELDS, OPEN_XTRA_FIELDS\n" . " USE XTRA_READ_MOD, ONLY : UNZIP_XTRA_FIELDS\n" . " USE gckpp_Global, ONLY : NCOEFF\n" . "\n" . " ! Force all variables to be declared explicitly\n" . " IMPLICIT NONE\n" . " \n" . " ! Header files \n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"CMN_DIAG\" ! Diagnostic switches, NJDAY\n" . "# include \"CMN_GCTM\" ! Physical constants\n" . "# include \"CMN\"\n" . "\n" . " ! PRIVATE module variables \n" . " PRIVATE :: TS_DYN \n" . "\n" . " !================================================================= \n" . " ! MODULE VARIABLES \n" . " !================================================================= \n" . " INTEGER :: MIN_ADJ\n" . " INTEGER :: TS_DYN\n" . " INTEGER :: FINAL_ELAPSED_MIN \n" . "\n" . " ! Local variables\n" . " LOGICAL :: FIRST = .TRUE.\n" . " LOGICAL :: LXTRA \n" . " INTEGER :: I, IOS, J, K, L\n" . " INTEGER :: N, JDAY, NDIAGTIME, N_DYN\n" . " INTEGER :: N_DYN_STEPS, NSECb, N_STEP, DATE(2)\n" . " INTEGER :: YEAR, MONTH, DAY, DAY_OF_YEAR\n" . " INTEGER :: SEASON, NYMD, NHMS\n" . " INTEGER :: ELAPSED_SEC\n" . " REAL*8 :: TAU \n" . " CHARACTER(LEN=255) :: ZTYPE\n" . "\n" . " INTEGER, SAVE :: NSECb_ADJ\n" . " INTEGER :: BEHIND_DATE(2)\n" . " INTEGER :: I62_DATE(2)\n" . "\n" . " CONTAINS\n" . "\n" . " SUBROUTINE DO_GC_BWD(f, TRAC)\n" . " \n" . " DOUBLE PRECISION :: f\n" . " INTEGER :: TRAC\n" . " REAL*8 :: CF\n" . "\n" . "\n" . " !=================================================================\n" . " ! GEOS-CHEM-ADJ starts here! \n" . " !=================================================================\n" . "\n" . " !=================================================================\n" . " ! ***** I N I T I A L I Z A T I O N *****\n" . " !=================================================================\n" . "\n" . " ! Define time variables for use below\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . " \n" . " CF = 0d0\n" . " STT_ADJ = 0d0\n" . " IF(LCHEM)THEN\n" . " CSPEC_ADJ = 0d0\n" . " CSPEC = 0d0\n" . " ENDIF\n" . " f = 0d0\n" . "\n" . " !============================================\n" . " ! OBSERVATION FORCING UPDATE\n" . " !============================================\n" . " CALL OBS_GRAD_UPDATE( CF )\n" . " f = f + CF\n" . "\n" . " !=================================================================\n" . " ! ***** 6 - H O U R T I M E S T E P L O O P *****\n" . " !================================================================= \n" . "\n" . " ! Echo message before first timestep\n" . " WRITE( 6, '(a)' )\n" . " WRITE( 6, '(a)' ) REPEAT( '*', 44 )\n" . " WRITE( 6, '(a)' ) '* B e g i n T i m e S t e p p i n g !! *'\n" . " WRITE( 6, '(a)' ) REPEAT( '*', 44 )\n" . " WRITE( 6, '(a)' ) \n" . "\n" . " ! NSTEP is the number of dynamic timesteps w/in a 6-h interval\n" . " N_DYN_STEPS = 360 / GET_TS_DYN()\n" . "\n" . " TS_DYN = GET_TS_DYN() \n" . "\n" . " FINAL_ELAPSED_MIN = ELAPSED_MIN\n" . "\n" . " ! Start a new 6-h loop\n" . " DO \n" . "\n" . " ! Get dynamic timestep in seconds\n" . " N_DYN = 60d0 * GET_TS_DYN()\n" . "\n" . " ! Compute time parameters at start of 6-h loop\n" . " CALL SET_CURRENT_TIME\n" . "\n" . " !=================================================================\n" . " ! ***** D Y N A M I C T I M E S T E P L O O P *****\n" . " !=================================================================\n" . " DO MIN_ADJ = FINAL_ELAPSED_MIN - TS_DYN, 0, -TS_DYN\n" . " \n" . " ! Compute & print time quantities at start of dyn step\n" . " CALL SET_CURRENT_TIME\n" . "\n" . " ! Set time variables for dynamic loop\n" . " !DAY = GET_DAY()\n" . " DAY_OF_YEAR = GET_DAY_OF_YEAR()\n" . " ELAPSED_SEC = GET_ELAPSED_SEC()\n" . " MONTH = GET_MONTH()\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . " YEAR = GET_YEAR()\n" . " SEASON = GET_SEASON()\n" . " \n" . " CALL MAKE_ADJOINT_CHKFILE( NYMD, NHMS, TAU )\n" . "\n" . " !============================================================\n" . " ! ***** R E A D M E T F I E L D S *****\n" . " !============================================================\n" . " ! If it is the first time through, we will use i6 field from the\n" . " ! forward calculation, and all we need to do is set NSECb_ADJ\n" . " IF ( FIRST ) THEN\n" . " \n" . " ! This only happens if stop time is a 6h interval, in which\n" . " ! case NSECb gets advanced 6hrs beyond what it actually was\n" . " ! last used as, so set it back here.\n" . " IF ( NSECb > GET_ELAPSED_SEC() ) THEN\n" . " NSECb = NSECb - 6 * 3600\n" . " WRITE(6,*) ' -- Pushing NSECb back by 6h '\n" . " ENDIF\n" . " \n" . " NSECb_ADJ = NSECb\n" . "\n" . " ! GET SLP1 and TROPP1 at the beginning of the last I-6 interval\n" . " I62_DATE = GET_TIME_BEHIND_ADJ(\n" . " & ( GET_ELAPSED_SEC() - NSECb ) / 60 )\n" . " \n" . " CALL OPEN_I6_FIELDS_ADJ( I62_DATE(1), I62_DATE(2) )\n" . " CALL GET_I6_FIELDS_2( I62_DATE(1), I62_DATE(2) )\n" . " \n" . " ! Now we don't reset this until after reading daily data\n" . " !FIRST = .FALSE.\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** R E A D I - 6 F I E L D S *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_I6_ADJ() ) THEN\n" . " \n" . " WRITE(6,*) ' ADJ: TIME FOR I-6 '\n" . " \n" . " !=================================================================\n" . " ! ***** C O P Y I - 6 F I E L D S *****\n" . " !\n" . " ! The I-6 fields at the beginning of the next ( forward )\n" . " ! timestep become the fields at the end of this timestep\n" . " !=================================================================\n" . " CALL COPY_I6_FIELDS\n" . " \n" . " ! Get the date/time for the previous I-6 data block\n" . " BEHIND_DATE = GET_I6_TIME_ADJ()\n" . "\n" . " ! Open and read files\n" . " CALL OPEN_I6_FIELDS_ADJ( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " CALL GET_I6_FIELDS_1( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " PRINT*,'I6 DATE = ',BEHIND_DATE(1),BEHIND_DATE(2)\n" . " \n" . " ! Compute avg pressure at polar caps (for ADJ argument is PS1, not PS2)\n" . " CALL AVGPOLE( PS1 )\n" . " \n" . " ! Set NSECb_ADJ to be used for the interpolation\n" . " ! where NSECb_ADJ is the total elapsed time in seconds at the\n" . " ! beginning of the current 6h time step which contains ELAPSED_MIN\n" . " NSECb_ADJ = ( MIN_ADJ + TS_DYN ) * 60 - 6 * 3600\n" . " \n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** R E A D A - 6 F I E L D S *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_A6_ADJ() ) THEN\n" . " \n" . " WRITE(6,*) ' ADJ: TIME FOR A-6 '\n" . " \n" . " ! Get the date/time for the previous A-6 data block\n" . " BEHIND_DATE = GET_A6_TIME_ADJ()\n" . " \n" . " ! Open and read files\n" . " CALL OPEN_A6_FIELDS_ADJ( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " CALL GET_A6_FIELDS( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " \n" . " ENDIF\n" . " \n" . " !==============================================================\n" . " ! ***** R E A D A - 3 F I E L D S *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_A3_ADJ() ) THEN\n" . " \n" . " WRITE(6,*) ' ADJ: TIME FOR A-3 '\n" . " \n" . " ! Get the date/time for the previous A-3 data block\n" . " BEHIND_DATE = GET_A3_TIME_ADJ()\n" . " \n" . " ! Open & read A-3 fields\n" . " CALL OPEN_A3_FIELDS_ADJ( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " CALL GET_A3_FIELDS( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " \n" . "#if defined( GEOS_3 )\n" . " !\n" . " IF ( LDUST ) THEN\n" . " CALL OPEN_GWET_FIELDS_ADJ( BEHIND_DATE(1), \n" . " & BEHIND_DATE(2) )\n" . " CALL GET_GWET_FIELDS( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " ENDIF\n" . "#endif\n" . " \n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** M O N T H L Y O R S E A S O N A L D A T A *****\n" . " !==============================================================\n" . "\n" . " ! UV albedoes\n" . " IF ( LCHEM .and. ITS_A_NEW_MONTH() ) THEN\n" . " CALL READ_UVALBEDO( MONTH )\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** D A I L Y D A T A *****\n" . " !\n" . " ! RDLAI returns today's leaf-area index\n" . " ! RDSOIL returns today's soil type information\n" . " !==============================================================\n" . " ! Read daily data at 11:30 p.m. on any new day, not counting the \n" . " ! \"first\" day of the adjoint integration, during which we can\n" . " ! still use values from the forward integration. \n" . " IF ( GET_NHMS() == 233000 .AND. ( .not. FIRST ) ) THEN\n" . "\n" . " ! Read leaf-area index (needed for drydep)\n" . " CALL RDLAI( DAY_OF_YEAR, MONTH )\n" . "\n" . " ! For MEGAN biogenics ...\n" . " IF ( LMEGAN ) THEN\n" . "\n" . " ! Read AVHRR daily leaf-area-index\n" . " CALL RDISOLAI( GET_DAY_OF_YEAR(), GET_MONTH() )\n" . "\n" . " ! Compute 15-day average temperature for MEGAN\n" . " CALL UPDATE_T_15_AVG\n" . " ENDIF\n" . " \n" . " ! Also read soil-type info for fullchem simulation\n" . " IF ( ITS_A_FULLCHEM_SIM() ) CALL RDSOIL \n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG ( '### MAIN: a DAILY DATA' )\n" . " ENDIF\n" . " \n" . " ! Reset first-time flag\n" . " IF ( FIRST ) FIRST = .FALSE.\n" . "\n" . " !==============================================================\n" . " ! ***** I N T E R P O L A T E Q U A N T I T I E S *****\n" . " !\n" . " ! Interpolate I-6 fields to current dynamic timestep,\n" . " ! based on their values at NSEC and NSEC+NTDT\n" . " !==============================================================\n" . " CALL INTERP_ADJ( NSECb_ADJ, GET_ELAPSED_SEC(), N_DYN )\n" . " \n" . " ! If we are not doing transport, then make sure that\n" . " ! the floating pressure is set to PSC2 (bdf, bmy, 8/22/02)\n" . " IF ( .not. LTRAN ) CALL SET_FLOATING_PRESSURE( PSC2 )\n" . " \n" . " ! Compute airmass quantities at each grid box\n" . " CALL AIRQNT\n" . " \n" . " ! (dkh, 11/07/05) \n" . " ! Compute the cosine of the solar zenith angle at each grid box\n" . " CALL COSSZA( GET_DAY_OF_YEAR(), GET_NHMSb(),\n" . " & GET_ELAPSED_SEC(), SUNCOS )\n" . " \n" . " ! For SMVGEAR II, we also need to compute SUNCOS at\n" . " ! the end of this chemistry timestep (bdf, bmy, 4/1/03)\n" . " IF ( LCHEM .and. ITS_A_FULLCHEM_SIM() ) THEN\n" . " CALL COSSZA( GET_DAY_OF_YEAR(), GET_NHMSb(),\n" . " & GET_ELAPSED_SEC()+GET_TS_CHEM()*60, SUNCOSB )\n" . " ENDIF \n" . "\n" . "#if defined( GEOS_3 )\n" . "\n" . " ! 1998 GEOS-3 carries the ground temperature and not the air\n" . " ! temperature -- thus TS will be 2-3 K too high. As a quick fix, \n" . " ! copy the temperature at the first sigma level into TS. \n" . " ! (mje, bnd, bmy, 7/3/01)\n" . " IF ( YEAR == 1998 ) STOP\n" . "#endif \n" . " \n" . " ! decrement elapsed time\n" . " CALL SET_ELAPSED_MIN_ADJ\n" . "\n" . " CALL SET_CURRENT_TIME\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . "\n" . " ! Initialize wet scavenging and wetdep fields after\n" . " ! the airmass quantities are reset after transport\n" . " IF ( LCONV .or. LWETD ) CALL INIT_WETSCAV_ADJ\n" . " \n" . " !==============================================================\n" . " ! ***** W E T D E P O S I T I O N (rainout + washout) *****\n" . " !==============================================================\n" . " IF ( LWETD .and. ITS_TIME_FOR_DYN() ) CALL DO_WETDEP_ADJ\n" . "\n" . " IF(LTRAN)THEN\n" . " CALL READ_PRESSURE_CHKFILE(NYMD, NHMS)\n" . " CALL SET_FLOATING_PRESSURE(TMP_PRESS(:,:))\n" . " ENDIF\n" . " \n" . " !===========================================================\n" . " ! ***** C H E M I S T R Y *****\n" . " !=========================================================== \n" . "\n" . " ! Every chemistry timestep...\n" . " IF ( ITS_TIME_FOR_CHEM() ) THEN \n" . "\n" . " CALL READ_CHEMISTRY_CHKFILE( NYMD, NHMS )\n" . "\n" . " ! Call the appropriate chemistry routine\n" . " CALL DO_CHEMISTRY_ADJ\n" . "\n" . " ENDIF \n" . "\n" . " !==============================================================\n" . " ! ***** U N I T C O N V E R S I O N ( v/v -> kg ) *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_UNIT() ) THEN\n" . " CALL CONVERT_UNITS( 2, N_TRACERS, TCVV, AD, STT_ADJ )\n" . " \n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CONVERT_UNITS:2' )\n" . " ENDIF\n" . "\n" . " !=====================================================\n" . " ! ***** CONVECTION ADJOINT *****\n" . " !=====================================================\n" . " IF ( ITS_TIME_FOR_CONV() ) THEN\n" . "\n" . " !===========================================================\n" . " ! ***** C L O U D C O N V E C T I O N *****\n" . " !===========================================================\n" . " IF ( LCONV ) THEN\n" . " \n" . " !--------------------------------------------------------------\n" . " ! ***** CHECKPOINTING EVERY DYNAMIC TIME STEP ***** \n" . " !--------------------------------------------------------------\n" . "\n" . " CALL READ_CONVECTION_CHKFILE( NYMD, NHMS )\n" . "\n" . " CALL DO_CONVECTION_ADJ\n" . "\n" . " ENDIF\n" . " \n" . " !===========================================================\n" . " ! ***** M I X E D L A Y E R M I X I N G *****\n" . " !===========================================================\n" . " CALL DO_PBL_MIX_ADJ( LTURB ) \n" . "\n" . " ENDIF \n" . "\n" . " !=====================================================\n" . " ! ***** TRANSPORT ADJOINT *****\n" . " !===================================================== \n" . "\n" . " !IF ( LUPBD ) CALL DO_UPBDFLX\n" . "\n" . " IF ( ITS_TIME_FOR_DYN() ) THEN\n" . "\n" . " ! Call the appropritate version of TPCORE\n" . " IF ( LTRAN ) CALL DO_TRANSPORT_ADJ\n" . " \n" . " ! Reset air mass quantities\n" . " CALL AIRQNT\n" . "\n" . " ! Repartition [NOy] species after transport\n" . " IF ( LUPBD .and. ITS_A_FULLCHEM_SIM() ) THEN\n" . " !CALL UPBDFLX_NOY_ADJ( 1 )\n" . " ENDIF\n" . "\n" . " ! Get relative humidity \n" . " ! (after recomputing pressure quantities)\n" . " CALL MAKE_RH \n" . "\n" . " ENDIF \n" . "\n" . " !==============================================================\n" . " ! ***** U N I T C O N V E R S I O N ( kg -> v/v ) *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_UNIT() ) THEN\n" . " CALL CONVERT_UNITS( 1, N_TRACERS, TCVV, AD, STT_ADJ )\n" . " \n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CONVERT_UNITS:1' )\n" . " ENDIF \n" . "\n" . " !==============================================================\n" . " ! ***** T E S T F O R E N D O F R U N *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_EXIT_ADJ() ) GOTO 9999\n" . "\n" . " !============================================\n" . " ! OBSERVATION FORCING UPDATE\n" . " !============================================\n" . " CALL OBS_GRAD_UPDATE( CF )\n" . " f = f + CF\n" . "\n" . " ENDDO\n" . " \n" . " ENDDO \n" . "\n" . " !=================================================================\n" . " ! ***** C L E A N U P A N D Q U I T *****\n" . " !=================================================================\n" . " 9999 CONTINUE\n" . "\n" . " WRITE(141,*) f\n" . "\n" . " !============================================\n" . " ! BACKGROUND COST AND GRADIENT UPDATE\n" . " !============================================\n" . " CALL BG_GRAD_UPDATE( CF, TRAC )\n" . " f = f + CF\n" . "\n" . " if(maxval(abs(STT_ADJ)).eq.0)THEN\n" . " PRINT*,'----------------'\n" . " PRINT*,'maxval(g)',maxval(abs(STT_ADJ))\n" . " PRINT*,'----------------'\n" . " STOP\n" . " endif\n" . "\n" . " WRITE(142,*) CF\n" . "\n" . " ! Print ending time of simulation\n" . " CALL DISPLAY_END_TIME\n" . "!\n" . "!******************************************************************************\n" . "! Internal procedures -- Use the F90 CONTAINS command to inline \n" . "! subroutines that only can be called from this main program. \n" . "!\n" . "! All variables referenced in the main program (local variables, F90 \n" . "! module variables, or common block variables) also have scope within \n" . "! internal subroutines. \n" . "!\n" . "! List of Internal Procedures:\n" . "! ============================================================================\n" . "! (1 ) DISPLAY_GRID_AND_MODEL : Displays resolution, data set, & start time\n" . "! (2 ) GET_NYMD_PHIS : Gets YYYYMMDD for the PHIS data field\n" . "! (3 ) DISPLAY_SIGMA_LAT_LON : Displays sigma, lat, and lon information\n" . "! (4 ) GET_WIND10M : Wrapper for MAKE_WIND10M (from \"dao_mod.f\")\n" . "! (5 ) CTM_FLUSH : Flushes diagnostic files to disk\n" . "! (6 ) DISPLAY_END_TIME : Displays ending time of simulation\n" . "! (7 ) MET_FIELD_DEBUG : Prints min and max of met fields for debug\n" . "!******************************************************************************\n" . "!\n" . " END SUBROUTINE DO_GC_BWD\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION ITS_TIME_FOR_I6_ADJ() RESULT( FLAG )\n" . "!\n" . "!******************************************************************************\n" . "! Function ITS_TIME_FOR_I6_ADJ returns TRUE if it is time to read in I-6\n" . "! (instantaneous 6-h fields) and FALSE otherwise. This happens when TIME_ADJ is\n" . "! at a 6h interval, which is equivalent to when ELAPSED_TIME+TS_DYN is at a \n" . "! 6h interval. (dkh, 8/25/04)\n" . "!\n" . "! NOTES:\n" . "! (1 ) Don't read in i6 fields when we are still within the last 6 h interval\n" . "! from the forward simulation, in which case just use the i6 fields that \n" . "! are already loaded. (dkh, 9/30/04)\n" . "! (2 ) FIXED BUG: Use EXTRA so that NHMS + (TS_DYN) is divisible by 6 h \n" . "!******************************************************************************\n" . "!\n" . " ! Reference to f90 modules\n" . " USE TIME_MOD, ONLY : GET_NHMS, GET_ELAPSED_SEC\n" . " USE ERROR_MOD, ONLY : ERROR_STOP\n" . " USE SUBDRIVER_FWD, ONLY : NSECb\n" . "\n" . " ! Function value\n" . " LOGICAL :: FLAG\n" . "\n" . " ! Local variable\n" . " INTEGER :: EXTRA \n" . "\n" . " !=================================================================\n" . " ! ITS_TIME_FOR_I6_ADJ begins here!\n" . " !=================================================================\n" . " IF ( GET_ELAPSED_SEC() >= NSECb ) THEN\n" . "\n" . " ! We can use I6 fields still loaded from forward run\n" . " FLAG = .FALSE.\n" . " \n" . " ! Echo this fact to the screen\n" . " WRITE(6,*) ' -- USE I6 FIELDS FROM FORWARD RUN '\n" . " \n" . " ELSE\n" . "\n" . " ! EXTRA set so that current NHMS + 1 dynamic time step is\n" . " ! divisible by 060000\n" . " ! Original, hardwired to 30 min dynamic time step\n" . " !EXTRA = 7000 \n" . " ! Qinbin's formula, assumes TS_DYN <= 60 min\n" . " EXTRA = 4000 + TS_DYN*100\n" . "\n" . " IF ( TS_DYN > 60 ) CALL ERROR_STOP( 'Invalid EXTRA!', \n" . " & 'ITS_TIME_FOR_I6_ADJ (adjoint.f)' ) \n" . "\n" . " ! We read in I-6 fields at 00, 06, 12, 18 GMT\n" . " FLAG = ( MOD( GET_NHMS() + EXTRA, 060000 ) == 0 )\n" . "\n" . " ENDIF \n" . "\n" . " ! Return to calling program\n" . " END FUNCTION ITS_TIME_FOR_I6_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION GET_I6_TIME_ADJ( ) RESULT( BEHIND_DATE )\n" . "!\n" . "!******************************************************************************\n" . "! Function GET_I6_TIME_ADJ returns the correct YYYYMMDD and HHMMSS values\n" . "! that are needed to read in the previous instantaneous 6-hour (I-6) fields.\n" . "! (dkh, 8/25/04)\n" . "!\n" . "! NOTES:\n" . "! This is only called if ITS_TIME_FOR_I6_ADJ is true\n" . "!******************************************************************************\n" . "!\n" . " ! Arguments\n" . " INTEGER :: BEHIND_DATE(2)\n" . "\n" . " !=================================================================\n" . " ! GET_I6_TIME_ADJ begins here!\n" . " !=================================================================\n" . "\n" . " ! We need to read in the I-6 fields 6h (360 mins) behind of TIME_ADJ\n" . " ! which is the same as 360 - TS_DYN behind ELAPSED_TIME \n" . " BEHIND_DATE = GET_TIME_BEHIND_ADJ( 360 - TS_DYN )\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION GET_I6_TIME_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION ITS_TIME_FOR_A6_ADJ() RESULT( FLAG )\n" . "!\n" . "!******************************************************************************\n" . "! Function ITS_TIME_FOR_A6_ADJ returns TRUE if it is time to read in I-A\n" . "! (average 6-h fields) and FALSE otherwise. This happens when TIME_ADJ is\n" . "! at a 6h interval (03, 09, 15,21), which is equivalent to when\n" . "! ELAPSED_TIME+TS_DYN is at a 6h interval. (dkh, 03/04/05) \n" . "!\n" . "! NOTES:\n" . "! (1 ) Don't read in A6 fields when we are still within the last 6 h interval\n" . "! from the forward simulation, in which case just use the A6 fields that\n" . "! are already loaded. NSECb is the total elapsed seconds at the last fwd\n" . "! I6 interval, so if we are more than 3 hr past this, can use A6 fields\n" . "! from forward run. (dkh, 03/04/05)\n" . "! \n" . "!******************************************************************************\n" . "!\n" . " ! Reference to f90 modules\n" . " USE TIME_MOD, ONLY : GET_NHMS, GET_ELAPSED_SEC\n" . " USE ERROR_MOD, ONLY : ERROR_STOP\n" . " USE SUBDRIVER_FWD, ONLY : NSECb\n" . "\n" . " ! Function value\n" . " LOGICAL :: FLAG\n" . "\n" . " ! Local variable\n" . " INTEGER :: EXTRA\n" . " INTEGER :: DATE(2)\n" . "\n" . " !=================================================================\n" . " ! ITS_TIME_FOR_A6_ADJ begins here!\n" . " !=================================================================\n" . "\n" . " IF ( GET_ELAPSED_SEC() >= NSECb + 3 * 3600 ) THEN\n" . "\n" . " ! We can use A6 fields still loaded from forward run\n" . " FLAG = .FALSE.\n" . "\n" . " ! Echo this fact to the screen\n" . " WRITE(6,*) ' -- USE A6 FIELDS FROM FORWARD RUN '\n" . "\n" . " ELSE\n" . "\n" . "#if defined( GEOS_4 ) && defined( A_LLK_03 )\n" . "\n" . " ! For GEOS-4 \"a_llk_03\" data, we need to read A-6 fields when it\n" . " ! is 00, 06, 12, 18 GMT. DATE is the current time -- test below.\n" . " DATE = GET_TIME_AHEAD( 0 )\n" . "\n" . "#else\n" . "\n" . " ! For GEOS-1, GEOS-S, GEOS-3, and GEOS-4 \"a_llk_04\" data,\n" . " ! we need to read A-6 fields when it is 03, 09, 15, 21 GMT.\n" . " ! DATE is the time 3 before now -- test below.\n" . " DATE = GET_TIME_BEHIND_ADJ( 180 )\n" . "\n" . "#endif\n" . " ! EXTRA set so that current NHMS + 1 dynamic time step is\n" . " ! divisible by 060000\n" . " ! Original formula, assumes dynamic time step is 30 min\n" . " ! EXTRA = 7000\n" . " ! Qinbin's formula, assumes dynamic time step <= 60\n" . " EXTRA = 4000 + TS_DYN * 100\n" . "\n" . " IF ( TS_DYN > 60 ) CALL ERROR_STOP( 'Invalid EXTRA!',\n" . " & 'ITS_TIME_FOR_A6_ADJ (adjoint.f)' )\n" . "\n" . " ! We read in A-6 fields at 03, 09, 15, 21 GMT\n" . " FLAG = ( MOD( DATE(2) + EXTRA, 060000 ) == 0 )\n" . "\n" . " ENDIF\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION ITS_TIME_FOR_A6_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION GET_A6_TIME_ADJ( ) RESULT( BEHIND_DATE )\n" . "!\n" . "!******************************************************************************\n" . "! Function GET_A6_TIME_ADJ returns the correct YYYYMMDD and HHMMSS values\n" . "! that are needed to read in the previous average 6-hour (A-6) fields.\n" . "! (dkh, 03/04/05)\n" . "!\n" . "! NOTES:\n" . "! (1 ) This is only called if ITS_TIME_FOR_A6_ADJ is true\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! Arguments\n" . " INTEGER :: BEHIND_DATE(2)\n" . "\n" . " !=================================================================\n" . " ! GET_A6_TIME_ADJ begins here!\n" . " !=================================================================\n" . "\n" . " ! Return the time 3h (180m) before now, since there is a 3-hour\n" . " ! offset between the actual time when the A-6 fields are read\n" . " ! and the time that the A-6 fields are stamped with. Also apply\n" . " ! offset of TS_DYN. \n" . " BEHIND_DATE = GET_TIME_BEHIND_ADJ( 180 - TS_DYN )\n" . " !BEHIND_DATE = GET_TIME_BEHIND_ADJ( - TS_DYN )\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION GET_A6_TIME_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION ITS_TIME_FOR_A3_ADJ() RESULT( FLAG )\n" . "!\n" . "!******************************************************************************\n" . "! Function ITS_TIME_FOR_A3_ADJ returns TRUE if it is time to read in A-3\n" . "! (average 3-h fields) and FALSE otherwise. This happens when TIME_ADJ is\n" . "! at a 3h interval, which is equivalent to when\n" . "! ELAPSED_TIME+TS_DYN is at a 3h interval. (dkh, 03/04/05)\n" . "!\n" . "! NOTES:\n" . "! (1 ) Don't read in 3 fields when we are still within the last 3 h interval\n" . "! from the forward simulation, in which case just use the A3 fields that\n" . "! are already loaded. NSECb is the total elapsed seconds at the last fwd\n" . "! I6 interval, so if we are more than 3 hr past this, can use A3 fields\n" . "! from forward run. (dkh, 03/04/05)\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! Reference to f90 modules\n" . " USE TIME_MOD, ONLY : GET_NHMS, GET_ELAPSED_SEC\n" . " USE ERROR_MOD, ONLY : ERROR_STOP\n" . " USE SUBDRIVER_FWD, ONLY : NSECb\n" . "\n" . " ! Function value\n" . " LOGICAL :: FLAG\n" . "\n" . " ! Local variable\n" . " INTEGER :: EXTRA\n" . "\n" . " !=================================================================\n" . " ! ITS_TIME_FOR_A3_ADJ begins here!\n" . " !=================================================================\n" . "\n" . " IF ( GET_ELAPSED_SEC() >= NSECb + 3 * 3600 ) THEN\n" . " !IF ( GET_ELAPSED_SEC() >= NSECb + 3 * 3600 + 30*60 ) THEN\n" . "\n" . " ! We can use A3 fields still loaded from forward run\n" . " FLAG = .FALSE.\n" . "\n" . " ! Echo this fact to the screen\n" . " WRITE(6,*) ' -- USE A3 FIELDS FROM FORWARD RUN '\n" . "\n" . " ELSE\n" . " ! EXTRA set so that current NHMS + 1 dynamic time step is\n" . " ! divisible by 030000\n" . " ! Original formula, assumes dynamic time step is 30 min\n" . " !EXTRA = 7000\n" . " ! Qinbin's formula, assumes dynamic time step <= 60 min\n" . " EXTRA = 4000 + TS_DYN * 100\n" . "\n" . " IF ( TS_DYN > 30 ) CALL ERROR_STOP( 'Invalid EXTRA!',\n" . " & 'ITS_TIME_FOR_A3_ADJ (adjoint.f)' )\n" . "\n" . " ! We read in A-3 every 3 hours\n" . " FLAG = ( MOD( GET_NHMS() + EXTRA, 030000 ) == 0 )\n" . "\n" . " ENDIF\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION ITS_TIME_FOR_A3_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION GET_A3_TIME_ADJ( ) RESULT( BEHIND_DATE )\n" . "!\n" . "!******************************************************************************\n" . "! Function GET_A3_TIME_ADJ returns the correct YYYYMMDD and HHMMSS values\n" . "! that are needed to read in the previous average 3-hour (A-3) fields.\n" . "! (dkh, 03/04/05)\n" . "!\n" . "! NOTES:\n" . "! (1 ) This is only called if ITS_TIME_FOR_A3_ADJ is true\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! Arguments\n" . " INTEGER :: BEHIND_DATE(2)\n" . "\n" . " !=================================================================\n" . " ! GET_A3_TIME_ADJ begins here!\n" . " !=================================================================\n" . "\n" . "#if defined( GEOS_4 )\n" . "\n" . " ! For GEOS-4/fvDAS, the A-3 fields are timestamped by center time.\n" . " ! Therefore, the difference between the actual time when the fields\n" . " ! are read and the A-3 timestamp time is 90 minutes.\n" . " BEHIND_DATE = GET_TIME_BEHIND_ADJ( 90 - TS_DYN )\n" . "\n" . "#else\n" . "\n" . " ! For GEOS-1, GEOS-STRAT, GEOS-3, the A-3 fields are timestamped\n" . " ! by ending time. Therefore, the difference between the actual time\n" . " ! when the fields are read and the A-3 timestamp time is 180 minutes.\n" . " !BEHIND_DATE = GET_TIME_BEHIND_ADJ( 180 - TS_DYN )\n" . " BEHIND_DATE = GET_TIME_BEHIND_ADJ( - TS_DYN )\n" . "\n" . "#endif\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION GET_A3_TIME_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION GET_TIME_BEHIND_ADJ( N_MINS ) RESULT( DATE )\n" . "!\n" . "!******************************************************************************\n" . "! Function GET_TIME_BEHIND_ADJ returns to the calling program a 2-element vector\n" . "! containing the YYYYMMDD and HHMMSS values at the current time minus N_MINS\n" . "! minutes. (dkh, 8/25/04)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) N_MINS (INTEGER) : Minutes ahead of time to compute YYYYMMDD,HHMMSS\n" . "!\n" . "! NOTES:\n" . "! \n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE TIME_MOD, ONLY : GET_JD, GET_NYMD, GET_NHMS\n" . " USE JULDAY_MOD, ONLY : CALDATE\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: N_MINS\n" . "\n" . " ! Local variables\n" . " INTEGER :: DATE(2)\n" . " REAL*8 :: JD\n" . "\n" . " !=================================================================\n" . " ! GET_TIME_BEHIND_ADJ begins here!\n" . " !=================================================================\n" . "\n" . " ! Astronomical Julian Date at current time - N_MINS\n" . " JD = GET_JD( GET_NYMD(), GET_NHMS() ) - ( N_MINS / 1440d0 )\n" . "\n" . " ! Call CALDATE to compute the current YYYYMMDD and HHMMSS\n" . " CALL CALDATE( JD, DATE(1), DATE(2) )\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION GET_TIME_BEHIND_ADJ\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE DISPLAY_GRID_AND_MODEL\n" . "\n" . " !=================================================================\n" . " ! Internal Subroutine DISPLAY_GRID_AND_MODEL displays the \n" . " ! appropriate messages for the given model grid and machine type.\n" . " ! It also prints the starting time and date (local time) of the\n" . " ! GEOS-CHEM simulation. (bmy, 12/2/03, 10/18/05)\n" . " !=================================================================\n" . "\n" . " ! For system time stamp\n" . " CHARACTER(LEN=16) :: STAMP\n" . "\n" . " !-----------------------\n" . " ! Print resolution info\n" . " !-----------------------\n" . "#if defined( GRID4x5 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) //\n" . " & ' S T A R T I N G 4 x 5 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID2x25 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 2 x 2.5 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID1x125 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 1 x 1.25 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID1x1 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 1 x 1 G E O S -- C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! Print machine info\n" . " !-----------------------\n" . "\n" . " ! Get the proper FORMAT statement for the model being used\n" . "#if defined( COMPAQ )\n" . " WRITE( 6, '(a)' ) 'Created w/ HP/COMPAQ Alpha compiler'\n" . "#elif defined( IBM_AIX )\n" . " WRITE( 6, '(a)' ) 'Created w/ IBM-AIX compiler'\n" . "#elif defined( LINUX_PGI )\n" . " WRITE( 6, '(a)' ) 'Created w/ LINUX/PGI compiler'\n" . "#elif defined( LINUX_IFORT )\n" . " WRITE( 6, '(a)' ) 'Created w/ LINUX/IFORT (64-bit) compiler'\n" . "#elif defined( SGI_MIPS )\n" . " WRITE( 6, '(a)' ) 'Created w/ SGI MIPSpro compiler'\n" . "#elif defined( SPARC )\n" . " WRITE( 6, '(a)' ) 'Created w/ Sun/SPARC compiler'\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! Print met field info\n" . " !-----------------------\n" . "#if defined( GEOS_3 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-3 met fields'\n" . "#elif defined( GEOS_4 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-4/fvDAS met fields'\n" . "#elif defined( GEOS_5 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-5/fvDAS met fields'\n" . "#elif defined( GCAP )\n" . " WRITE( 6, '(a)' ) 'Using GCAP/GISS met fields'\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! System time stamp\n" . " !-----------------------\n" . " STAMP = SYSTEM_TIMESTAMP()\n" . " WRITE( 6, 100 ) STAMP\n" . " 100 FORMAT( /, '===> SIMULATION START TIME: ', a, ' <===', / )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE DISPLAY_GRID_AND_MODEL\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " FUNCTION ITS_TIME_FOR_BPCH() RESULT( DO_BPCH )\n" . "\n" . " !=================================================================\n" . " ! Internal function ITS_TIME_FOR_BPCH returns TRUE if it is time\n" . " ! to write to the binary punch file and FALSE otherwise.\n" . " !=================================================================\n" . "\n" . " ! Local variables\n" . " INTEGER :: TODAY, THIS_NJDAY, NHMS, NDIAGTIME\n" . " \n" . " ! Function value\n" . " LOGICAL :: DO_BPCH\n" . "\n" . " !=================================================================\n" . " ! ITS_TIME_FOR_BPCH begins here!\n" . " !================================================================= \n" . " \n" . " ! Return FALSE if it's the first timestep\n" . " IF ( GET_TAU() == GET_TAUb() ) THEN\n" . " DO_BPCH = .FALSE.\n" . " RETURN\n" . " ENDIF\n" . "\n" . " ! Current day of year\n" . " TODAY = GET_DAY_OF_YEAR()\n" . "\n" . " ! Current time of day\n" . " NHMS = GET_NHMS()\n" . "\n" . " ! Time of day to write bpch files to disk\n" . " NDIAGTIME = GET_NDIAGTIME()\n" . "\n" . " ! Look up appropriate value of NJDAY array. We may need to add a\n" . " ! day to skip past the Feb 29 element of NJDAY for non-leap-years.\n" . " IF ( .not. ITS_A_LEAPYEAR( FORCE=.TRUE. ) .and. TODAY > 59 ) THEN\n" . " THIS_NJDAY = NJDAY( TODAY + 1 ) \n" . " ELSE\n" . " THIS_NJDAY = NJDAY( TODAY )\n" . " ENDIF\n" . "\n" . " ! Test if this is the day & time to write to the BPCH file!\n" . " IF ( ( THIS_NJDAY > 0 ) .and. NHMS == NDIAGTIME ) THEN\n" . " DO_BPCH = .TRUE.\n" . " ELSE\n" . " DO_BPCH = .FALSE.\n" . " ENDIF\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION ITS_TIME_FOR_BPCH\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE CTM_FLUSH\n" . "\n" . " !================================================================\n" . " ! Internal subroutine CTM_FLUSH flushes certain diagnostic\n" . " ! file buffers to disk. (bmy, 8/31/00, 7/1/02)\n" . " !\n" . " ! CTM_FLUSH should normally be called after each diagnostic \n" . " ! output, so that in case the run dies, the output files from \n" . " ! the last diagnostic timestep will not be lost. \n" . " !\n" . " ! FLUSH is an intrinsic FORTRAN subroutine and takes as input \n" . " ! the unit number of the file to be flushed to disk.\n" . " !================================================================\n" . " CALL FLUSH( IU_ND48 ) \n" . " CALL FLUSH( IU_BPCH ) \n" . " CALL FLUSH( IU_SMV2LOG ) \n" . " CALL FLUSH( IU_DEBUG ) \n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE CTM_FLUSH\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE DISPLAY_END_TIME\n" . "\n" . " !=================================================================\n" . " ! Internal subroutine DISPLAY_END_TIME prints the ending time of\n" . " ! the GEOS-CHEM simulation (bmy, 5/3/05)\n" . " !=================================================================\n" . "\n" . " ! Local variables\n" . " CHARACTER(LEN=16) :: STAMP\n" . "\n" . " ! Print system time stamp\n" . " STAMP = SYSTEM_TIMESTAMP()\n" . " WRITE( 6, 100 ) STAMP\n" . " 100 FORMAT( /, '===> SIMULATION END TIME: ', a, ' <===', / )\n" . "\n" . " ! Echo info\n" . " WRITE ( 6, 3000 ) \n" . " 3000 FORMAT\n" . " & ( /, '************** E N D O F G E O S -- C H E M ',\n" . " & '**************' )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE DISPLAY_END_TIME\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MET_FIELD_DEBUG\n" . "\n" . " !=================================================================\n" . " ! Internal subroutine MET_FIELD_DEBUG prints out the maximum\n" . " ! and minimum, and sum of DAO met fields for debugging \n" . " !=================================================================\n" . "\n" . " ! References to F90 modules\n" . " USE DAO_MOD, ONLY : AD, AIRDEN, AIRVOL, ALBD1, ALBD2\n" . " USE DAO_MOD, ONLY : ALBD, AVGW, BXHEIGHT, CLDFRC, CLDF \n" . " USE DAO_MOD, ONLY : CLDMAS, CLDTOPS, DELP \n" . " USE DAO_MOD, ONLY : DTRAIN, GWETTOP, HFLUX, HKBETA, HKETA \n" . " USE DAO_MOD, ONLY : LWI, MOISTQ, OPTD, OPTDEP, PBL \n" . " USE DAO_MOD, ONLY : PREACC, PRECON, PS1, PS2, PSC2 \n" . " USE DAO_MOD, ONLY : RADLWG, RADSWG, RH, SLP, SNOW \n" . " USE DAO_MOD, ONLY : SPHU1, SPHU2, SPHU, SUNCOS, SUNCOSB \n" . " USE DAO_MOD, ONLY : TMPU1, TMPU2, T, TROPP, TS \n" . " USE DAO_MOD, ONLY : TSKIN, U10M, USTAR, UWND1, UWND2 \n" . " USE DAO_MOD, ONLY : UWND, V10M, VWND1, VWND2, VWND \n" . " USE DAO_MOD, ONLY : Z0, ZMEU, ZMMD, ZMMU \n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, L, IJ\n" . "\n" . " !=================================================================\n" . " ! MET_FIELD_DEBUG begins here!\n" . " !=================================================================\n" . "\n" . " ! Define box to print out\n" . " I = 23\n" . " J = 34\n" . " L = 1\n" . " IJ = ( ( J-1 ) * IIPAR ) + I\n" . "\n" . " !=================================================================\n" . " ! Print out met fields at (I,J,L)\n" . " !=================================================================\n" . " IF ( ALLOCATED( AD ) ) PRINT*, 'AD : ', AD(I,J,L) \n" . " IF ( ALLOCATED( AIRDEN ) ) PRINT*, 'AIRDEN : ', AIRDEN(L,I,J) \n" . " IF ( ALLOCATED( AIRVOL ) ) PRINT*, 'AIRVOL : ', AIRVOL(I,J,L) \n" . " IF ( ALLOCATED( ALBD1 ) ) PRINT*, 'ALBD1 : ', ALBD1(I,J) \n" . " IF ( ALLOCATED( ALBD2 ) ) PRINT*, 'ALBD2 : ', ALBD2(I,J) \n" . " IF ( ALLOCATED( ALBD ) ) PRINT*, 'ALBD : ', ALBD(I,J) \n" . " IF ( ALLOCATED( AVGW ) ) PRINT*, 'AVGW : ', AVGW(I,J,L) \n" . " IF ( ALLOCATED( BXHEIGHT ) ) PRINT*, 'BXHEIGHT: ', BXHEIGHT(I,J,L) \n" . " IF ( ALLOCATED( CLDFRC ) ) PRINT*, 'CLDFRC : ', CLDFRC(I,J)\n" . " IF ( ALLOCATED( CLDF ) ) PRINT*, 'CLDF : ', CLDF(L,I,J) \n" . " IF ( ALLOCATED( CLDMAS ) ) PRINT*, 'CLDMAS : ', CLDMAS(I,J,L) \n" . " IF ( ALLOCATED( CLDTOPS ) ) PRINT*, 'CLDTOPS : ', CLDTOPS(I,J) \n" . " IF ( ALLOCATED( DELP ) ) PRINT*, 'DELP : ', DELP(L,I,J) \n" . " IF ( ALLOCATED( DTRAIN ) ) PRINT*, 'DTRAIN : ', DTRAIN(I,J,L) \n" . " IF ( ALLOCATED( GWETTOP ) ) PRINT*, 'GWETTOP : ', GWETTOP(I,J) \n" . " IF ( ALLOCATED( HFLUX ) ) PRINT*, 'HFLUX : ', HFLUX(I,J) \n" . " IF ( ALLOCATED( HKBETA ) ) PRINT*, 'HKBETA : ', HKBETA(I,J,L) \n" . " IF ( ALLOCATED( HKETA ) ) PRINT*, 'HKETA : ', HKETA(I,J,L) \n" . " IF ( ALLOCATED( LWI ) ) PRINT*, 'LWI : ', LWI(I,J) \n" . " IF ( ALLOCATED( MOISTQ ) ) PRINT*, 'MOISTQ : ', MOISTQ(L,I,J) \n" . " IF ( ALLOCATED( OPTD ) ) PRINT*, 'OPTD : ', OPTD(L,I,J) \n" . " IF ( ALLOCATED( OPTDEP ) ) PRINT*, 'OPTDEP : ', OPTDEP(L,I,J) \n" . " IF ( ALLOCATED( PBL ) ) PRINT*, 'PBL : ', PBL(I,J) \n" . " IF ( ALLOCATED( PREACC ) ) PRINT*, 'PREACC : ', PREACC(I,J) \n" . " IF ( ALLOCATED( PRECON ) ) PRINT*, 'PRECON : ', PRECON(I,J) \n" . " IF ( ALLOCATED( PS1 ) ) PRINT*, 'PS1 : ', PS1(I,J) \n" . " IF ( ALLOCATED( PS2 ) ) PRINT*, 'PS2 : ', PS2(I,J) \n" . " IF ( ALLOCATED( PSC2 ) ) PRINT*, 'PSC2 : ', PSC2(I,J)\n" . " IF ( ALLOCATED( RADLWG ) ) PRINT*, 'RADLWG : ', RADLWG(I,J)\n" . " IF ( ALLOCATED( RADSWG ) ) PRINT*, 'RADSWG : ', RADSWG(I,J)\n" . " IF ( ALLOCATED( RH ) ) PRINT*, 'RH : ', RH(I,J,L) \n" . " IF ( ALLOCATED( SLP ) ) PRINT*, 'SLP : ', SLP(I,J) \n" . " IF ( ALLOCATED( SNOW ) ) PRINT*, 'SNOW : ', SNOW(I,J) \n" . " IF ( ALLOCATED( SPHU1 ) ) PRINT*, 'SPHU1 : ', SPHU1(I,J,L) \n" . " IF ( ALLOCATED( SPHU2 ) ) PRINT*, 'SPHU2 : ', SPHU2(I,J,L) \n" . " IF ( ALLOCATED( SPHU ) ) PRINT*, 'SPHU : ', SPHU(I,J,L) \n" . " IF ( ALLOCATED( SUNCOS ) ) PRINT*, 'SUNCOS : ', SUNCOS(IJ) \n" . " IF ( ALLOCATED( SUNCOSB ) ) PRINT*, 'SUNCOSB : ', SUNCOSB(IJ) \n" . " IF ( ALLOCATED( TMPU1 ) ) PRINT*, 'TMPU1 : ', TMPU1(I,J,L) \n" . " IF ( ALLOCATED( TMPU2 ) ) PRINT*, 'TMPU2 : ', TMPU2(I,J,L) \n" . " IF ( ALLOCATED( T ) ) PRINT*, 'TMPU : ', T(I,J,L)\n" . " IF ( ALLOCATED( TROPP ) ) PRINT*, 'TROPP : ', TROPP(I,J) \n" . " IF ( ALLOCATED( TS ) ) PRINT*, 'TS : ', TS(I,J) \n" . " IF ( ALLOCATED( TSKIN ) ) PRINT*, 'TSKIN : ', TSKIN(I,J) \n" . " IF ( ALLOCATED( U10M ) ) PRINT*, 'U10M : ', U10M(I,J) \n" . " IF ( ALLOCATED( USTAR ) ) PRINT*, 'USTAR : ', USTAR(I,J) \n" . " IF ( ALLOCATED( UWND1 ) ) PRINT*, 'UWND1 : ', UWND1(I,J,L) \n" . " IF ( ALLOCATED( UWND2 ) ) PRINT*, 'UWND2 : ', UWND2(I,J,L) \n" . " IF ( ALLOCATED( UWND ) ) PRINT*, 'UWND : ', UWND(I,J,L) \n" . " IF ( ALLOCATED( V10M ) ) PRINT*, 'V10M : ', V10M(I,J) \n" . " IF ( ALLOCATED( VWND1 ) ) PRINT*, 'VWND1 : ', VWND1(I,J,L) \n" . " IF ( ALLOCATED( VWND2 ) ) PRINT*, 'VWND2 : ', VWND2(I,J,L) \n" . " IF ( ALLOCATED( VWND ) ) PRINT*, 'VWND : ', VWND(I,J,L) \n" . " IF ( ALLOCATED( Z0 ) ) PRINT*, 'Z0 : ', Z0(I,J) \n" . " IF ( ALLOCATED( ZMEU ) ) PRINT*, 'ZMEU : ', ZMEU(I,J,L) \n" . " IF ( ALLOCATED( ZMMD ) ) PRINT*, 'ZMMD : ', ZMMD(I,J,L) \n" . " IF ( ALLOCATED( ZMMU ) ) PRINT*, 'ZMMU : ', ZMMU(I,J,L) \n" . "\n" . " ! Flush the output buffer\n" . " CALL FLUSH( 6 )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE MET_FIELD_DEBUG\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " ! End of program\n" . " END MODULE SUBDRIVER_BWD\n"; close(FILE); } #============================================= # Create subdriver_bwd_fd.f #============================================= sub createSubdriverBwdFd() { printf "Creating subdriver_bwd_fd.f\n"; open(FILE, ">subdriver_bwd_fd.f") || die "Unable to open subdriver_bwd_fd.f"; print FILE "! =============================================================\n" . "! subdriver_bwd_fd.f, 2008/24/01 Kumaresh \$\n" . "! Adjoint finite-difference driver is a modified version of main \n" . "! driver for GEOS-Chem to carryout finite difference tests.\n" . "! =============================================================\n" . "!\n" . " MODULE SUBDRIVER_BWD\n" . "! \n" . "!******************************************************************************\n" . "! \n" . "! \n" . "! GGGGGG CCCCCC A DDDDD J OOO I N N TTTTTTT \n" . "! G C A A D D J O O I NN N T\n" . "! G GGG C == AAAAA D D J 0 O I N N N T\n" . "! G G C A A D D J J 0 O I N NN T\n" . "! GGGGGG CCCCCC A A DDDDD JJJ OOO I N N T\n" . "! \n" . "! \n" . "! for 4 x 5, 2 x 2.5 global grids and 1 x 1 nested grids\n" . "!\n" . "! Contact: Bob Yantosca, Harvard University (bmy.as.harvard.edu)\n" . "! \n" . "!******************************************************************************\n" . "!\n" . "! See the GEOS-Chem-Adj Web Site:\n" . "!\n" . "! http://people.cs.vt.edu/~asandu/Software/GC_ADJ/GC_ADJ.html\n" . "!\n" . "! and the GEOS-CHEM User's Guide:\n" . "!\n" . "! http://www.cs.vt.edu/~asandu/Software/GC_ADJ/GC_ADJ_Users_Manual.pdf\n" . "!\n" . "! for the most up-to-date GEOS-CHEM documentation on the following topics:\n" . "!\n" . "! - installation, compilation, and execution\n" . "! - coding practice and style\n" . "! - input files and met field data files\n" . "! - horizontal and vertical resolution\n" . "! - modification history\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules \n" . " USE A3_READ_MOD, ONLY : GET_A3_FIELDS\n" . " USE A3_READ_MOD, ONLY : OPEN_A3_FIELDS\n" . " USE A3_READ_MOD, ONLY : UNZIP_A3_FIELDS\n" . " USE A3_READ_MOD, ONLY : OPEN_A3_FIELDS_ADJ\n" . " USE A6_READ_MOD, ONLY : GET_A6_FIELDS\n" . " USE A6_READ_MOD, ONLY : OPEN_A6_FIELDS\n" . " USE A6_READ_MOD, ONLY : UNZIP_A6_FIELDS\n" . " USE A6_READ_MOD, ONLY : OPEN_A6_FIELDS_ADJ\n" . " USE CHECKPOINT_MOD \n" . " USE CHEMISTRY_MOD, ONLY : DO_CHEMISTRY_ADJ\n" . " USE BENCHMARK_MOD, ONLY : STDRUN\n" . " USE CONVECTION_MOD, ONLY : DO_CONVECTION_ADJ\n" . " USE COMODE_MOD, ONLY : INIT_COMODE, CSPEC, CSPEC_ADJ, JLOP, \n" . " & IXSAVE,IYSAVE,IZSAVE\n" . " USE DIAG_MOD, ONLY : DIAGCHLORO\n" . " USE DIAG41_MOD, ONLY : DIAG41, ND41\n" . " USE DIAG42_MOD, ONLY : DIAG42, ND42\n" . " USE DIAG48_MOD, ONLY : DIAG48, ITS_TIME_FOR_DIAG48\n" . " USE DIAG49_MOD, ONLY : DIAG49, ITS_TIME_FOR_DIAG49\n" . " USE DIAG50_MOD, ONLY : DIAG50, DO_SAVE_DIAG50\n" . " USE DIAG51_MOD, ONLY : DIAG51, DO_SAVE_DIAG51\n" . " USE DIAG_OH_MOD, ONLY : PRINT_DIAG_OH\n" . " USE DAO_MOD, ONLY : AD, AIRQNT \n" . " USE DAO_MOD, ONLY : AVGPOLE, CLDTOPS\n" . " USE DAO_MOD, ONLY : CONVERT_UNITS, COPY_I6_FIELDS\n" . " USE DAO_MOD, ONLY : COSSZA, INIT_DAO\n" . " USE DAO_MOD, ONLY : INTERP_ADJ, PS1\n" . " USE DAO_MOD, ONLY : PS2, PSC2 \n" . " USE DAO_MOD, ONLY : T, TS \n" . " USE DAO_MOD, ONLY : SUNCOS, SUNCOSB\n" . " USE DAO_MOD, ONLY : MAKE_RH, TMP_PRESS\n" . " USE DRYDEP_MOD, ONLY : DO_DRYDEP\n" . " USE EMISSIONS_MOD, ONLY : DO_EMISSIONS\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_BPCH, IU_DEBUG\n" . " USE FILE_MOD, ONLY : IU_ND48, IU_SMV2LOG \n" . " USE FILE_MOD, ONLY : CLOSE_FILES\n" . " USE GLOBAL_CH4_MOD, ONLY : INIT_GLOBAL_CH4, CH4_AVGTP\n" . " USE GCAP_READ_MOD, ONLY : GET_GCAP_FIELDS\n" . " USE GCAP_READ_MOD, ONLY : OPEN_GCAP_FIELDS\n" . " USE GCAP_READ_MOD, ONLY : UNZIP_GCAP_FIELDS\n" . " USE GWET_READ_MOD, ONLY : GET_GWET_FIELDS\n" . " USE GWET_READ_MOD, ONLY : OPEN_GWET_FIELDS\n" . " USE GWET_READ_MOD, ONLY : UNZIP_GWET_FIELDS\n" . " USE I6_READ_MOD, ONLY : GET_I6_FIELDS_1\n" . " USE I6_READ_MOD, ONLY : GET_I6_FIELDS_2\n" . " USE I6_READ_MOD, ONLY : OPEN_I6_FIELDS_ADJ\n" . " USE I6_READ_MOD, ONLY : UNZIP_I6_FIELDS\n" . " USE INPUT_MOD, ONLY : READ_INPUT_FILE\n" . " USE LAI_MOD, ONLY : RDISOLAI\n" . " USE LIGHTNING_NOX_MOD, ONLY : LIGHTNING\n" . " !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " !%%% NOTE: Temporary kludge: For GEOS-4 we want to use the new near-land\n" . " !%%% lightning formulation. But for the time being, we must keep the \n" . " !%%% existing lightning for other met field types. (ltm, bmy, 5/10/06)\n" . " USE LIGHTNING_NOX_NL_MOD, ONLY : LIGHTNING_NL\n" . " !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " USE LOGICAL_MOD, ONLY : LEMIS, LCHEM, LUNZIP, LDUST\n" . " USE LOGICAL_MOD, ONLY : LLIGHTNOX, LPRT, LSTDRUN, LSVGLB\n" . " USE LOGICAL_MOD, ONLY : LWAIT, LTRAN, LUPBD, LCONV\n" . " USE LOGICAL_MOD, ONLY : LWETD, LTURB, LDRYD, LMEGAN \n" . " USE LOGICAL_MOD, ONLY : LDYNOCEAN, LSOA, LVARTROP\n" . " USE MEGAN_MOD, ONLY : INIT_MEGAN\n" . " USE MEGAN_MOD, ONLY : UPDATE_T_15_AVG\n" . " USE MEGAN_MOD, ONLY : UPDATE_T_DAY\n" . " USE PBL_MIX_MOD, ONLY : DO_PBL_MIX_ADJ\n" . " USE OCEAN_MERCURY_MOD, ONLY : MAKE_OCEAN_Hg_RESTART\n" . " USE OCEAN_MERCURY_MOD, ONLY : READ_OCEAN_Hg_RESTART\n" . " USE PLANEFLIGHT_MOD, ONLY : PLANEFLIGHT\n" . " USE PLANEFLIGHT_MOD, ONLY : SETUP_PLANEFLIGHT \n" . " USE PRESSURE_MOD, ONLY : INIT_PRESSURE\n" . " USE PRESSURE_MOD, ONLY : SET_FLOATING_PRESSURE\n" . " USE READ_SCIAO3_MOD \n" . " USE TIME_MOD\n" . " USE TRACER_MOD, ONLY : CHECK_STT, N_TRACERS, STT, TCVV,\n" . " & STT_ADJ, PERT\n" . " USE TRACER_MOD, ONLY : DDEP_ADJ, EMIS_ADJ, EMIS_I_ADJ\n" . " USE TRACER_MOD, ONLY : ITS_AN_AEROSOL_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_CH4_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_FULLCHEM_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_MERCURY_SIM\n" . " USE TRACERID_MOD, ONLY : IDO3\n" . " USE TRANSPORT_MOD, ONLY : DO_TRANSPORT_ADJ\n" . " USE TROPOPAUSE_MOD, ONLY : READ_TROPOPAUSE, CHECK_VAR_TROP\n" . " USE RESTART_MOD, ONLY : MAKE_RESTART_FILE, READ_RESTART_FILE\n" . " USE UPBDFLX_MOD, ONLY : DO_UPBDFLX, UPBDFLX_NOY\n" . " USE UVALBEDO_MOD, ONLY : READ_UVALBEDO\n" . " USE WETSCAV_MOD, ONLY : INIT_WETSCAV_ADJ, DO_WETDEP_ADJ\n" . " USE XTRA_READ_MOD, ONLY : GET_XTRA_FIELDS, OPEN_XTRA_FIELDS\n" . " USE XTRA_READ_MOD, ONLY : UNZIP_XTRA_FIELDS\n" . " USE gckpp_Global, ONLY : NCOEFF\n" . "\n" . " ! Force all variables to be declared explicitly\n" . " IMPLICIT NONE\n" . " \n" . " ! Header files \n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"CMN_DIAG\" ! Diagnostic switches, NJDAY\n" . "# include \"CMN_GCTM\" ! Physical constants\n" . "# include \"CMN\"\n" . "\n" . " ! PRIVATE module variables \n" . " PRIVATE :: TS_DYN \n" . "\n" . " !================================================================= \n" . " ! MODULE VARIABLES \n" . " !================================================================= \n" . " INTEGER :: MIN_ADJ\n" . " INTEGER :: TS_DYN\n" . " INTEGER :: FINAL_ELAPSED_MIN \n" . "\n" . " ! Local variables\n" . " LOGICAL :: FIRST = .TRUE.\n" . " LOGICAL :: LXTRA \n" . " INTEGER :: I, IOS, J, K, L\n" . " INTEGER :: N, JDAY, NDIAGTIME, N_DYN\n" . " INTEGER :: N_DYN_STEPS, NSECb, N_STEP, DATE(2)\n" . " INTEGER :: YEAR, MONTH, DAY, DAY_OF_YEAR\n" . " INTEGER :: SEASON, NYMD, NYMDb, NHMS\n" . " INTEGER :: ELAPSED_SEC, NHMSb\n" . " REAL*8 :: TAU, TAUb \n" . " CHARACTER(LEN=255) :: ZTYPE\n" . "\n" . " INTEGER, SAVE :: NSECb_ADJ\n" . " INTEGER :: BEHIND_DATE(2)\n" . " INTEGER :: I62_DATE(2)\n" . "\n" . " CONTAINS\n" . "\n" . " SUBROUTINE DO_GC_BWD(EPS)\n" . " \n" . " REAL*8 EPS, SUM\n" . "\n" . " !=================================================================\n" . " ! GEOS-CHEM-ADJ starts here! \n" . " !=================================================================\n" . "\n" . " !=================================================================\n" . " ! ***** I N I T I A L I Z A T I O N *****\n" . " !=================================================================\n" . "\n" . " ! Define time variables for use below\n" . " NHMS = GET_NHMS()\n" . " NHMSb = GET_NHMSb()\n" . " NYMD = GET_NYMD()\n" . " NYMDb = GET_NYMDb()\n" . " TAU = GET_TAU()\n" . " TAUb = GET_TAUb()\n" . " \n" . " !CF = 0d0\n" . " STT_ADJ = 0d0\n" . " CSPEC_ADJ = 0d0\n" . " CSPEC = 0d0\n" . "\n" . " DO L=1,LLPAR\n" . " DO J=1,JJPAR\n" . " DO I=1,IIPAR\n" . " !IF(L/=1.and.L/=10.and.L/=15)CYCLE\n" . " !IF(L/=10) CYCLE\n" . " STT_ADJ(I,J,L,2) = 1d0\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " !=================================================================\n" . " ! ***** 6 - H O U R T I M E S T E P L O O P *****\n" . " !================================================================= \n" . "\n" . " ! Echo message before first timestep\n" . " WRITE( 6, '(a)' )\n" . " WRITE( 6, '(a)' ) REPEAT( '*', 44 )\n" . " WRITE( 6, '(a)' ) '* B e g i n T i m e S t e p p i n g !! *'\n" . " WRITE( 6, '(a)' ) REPEAT( '*', 44 )\n" . " WRITE( 6, '(a)' ) \n" . "\n" . " ! NSTEP is the number of dynamic timesteps w/in a 6-h interval\n" . " N_DYN_STEPS = 360 / GET_TS_DYN()\n" . "\n" . " TS_DYN = GET_TS_DYN() \n" . "\n" . " FINAL_ELAPSED_MIN = ELAPSED_MIN\n" . "\n" . " ! Start a new 6-h loop\n" . " DO \n" . "\n" . " ! Get dynamic timestep in seconds\n" . " N_DYN = 60d0 * GET_TS_DYN()\n" . "\n" . " ! Compute time parameters at start of 6-h loop\n" . " CALL SET_CURRENT_TIME\n" . "\n" . " !=================================================================\n" . " ! ***** D Y N A M I C T I M E S T E P L O O P *****\n" . " !=================================================================\n" . " DO MIN_ADJ = FINAL_ELAPSED_MIN - TS_DYN, 0, -TS_DYN\n" . " \n" . " ! Compute & print time quantities at start of dyn step\n" . " CALL SET_CURRENT_TIME\n" . "\n" . " ! Set time variables for dynamic loop\n" . " !DAY = GET_DAY()\n" . " DAY_OF_YEAR = GET_DAY_OF_YEAR()\n" . " ELAPSED_SEC = GET_ELAPSED_SEC()\n" . " MONTH = GET_MONTH()\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . " YEAR = GET_YEAR()\n" . " SEASON = GET_SEASON()\n" . " \n" . " CALL MAKE_ADJOINT_CHKFILE( NYMD, NHMS, TAU )\n" . "\n" . " !============================================================\n" . " ! ***** R E A D M E T F I E L D S *****\n" . " !============================================================\n" . " ! If it is the first time through, we will use i6 field from the\n" . " ! forward calculation, and all we need to do is set NSECb_ADJ\n" . " IF ( FIRST ) THEN\n" . " \n" . " ! This only happens if stop time is a 6h interval, in which\n" . " ! case NSECb gets advanced 6hrs beyond what it actually was\n" . " ! last used as, so set it back here.\n" . " IF ( NSECb > GET_ELAPSED_SEC() ) THEN\n" . " NSECb = NSECb - 6 * 3600\n" . " WRITE(6,*) ' -- Pushing NSECb back by 6h '\n" . " ENDIF\n" . " \n" . " NSECb_ADJ = NSECb\n" . "\n" . " ! GET SLP1 and TROPP1 at the beginning of the last I-6 interval\n" . " I62_DATE = GET_TIME_BEHIND_ADJ(\n" . " & ( GET_ELAPSED_SEC() - NSECb ) / 60 )\n" . " \n" . " CALL OPEN_I6_FIELDS_ADJ( I62_DATE(1), I62_DATE(2) )\n" . " CALL GET_I6_FIELDS_2( I62_DATE(1), I62_DATE(2) )\n" . " \n" . " ! Now we don't reset this until after reading daily data\n" . " !FIRST = .FALSE.\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** R E A D I - 6 F I E L D S *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_I6_ADJ() ) THEN\n" . " \n" . " WRITE(6,*) ' ADJ: TIME FOR I-6 '\n" . " \n" . " !=================================================================\n" . " ! ***** C O P Y I - 6 F I E L D S *****\n" . " !\n" . " ! The I-6 fields at the beginning of the next ( forward )\n" . " ! timestep become the fields at the end of this timestep\n" . " !=================================================================\n" . " CALL COPY_I6_FIELDS\n" . " \n" . " ! Get the date/time for the previous I-6 data block\n" . " BEHIND_DATE = GET_I6_TIME_ADJ()\n" . "\n" . " ! Open and read files\n" . " CALL OPEN_I6_FIELDS_ADJ( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " CALL GET_I6_FIELDS_1( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " PRINT*,'I6 DATE = ',BEHIND_DATE(1),BEHIND_DATE(2)\n" . " \n" . " ! Compute avg pressure at polar caps (for ADJ argument is PS1, not PS2)\n" . " CALL AVGPOLE( PS1 )\n" . " \n" . " ! Set NSECb_ADJ to be used for the interpolation\n" . " ! where NSECb_ADJ is the total elapsed time in seconds at the\n" . " ! beginning of the current 6h time step which contains ELAPSED_MIN\n" . " NSECb_ADJ = ( MIN_ADJ + TS_DYN ) * 60 - 6 * 3600\n" . " \n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** R E A D A - 6 F I E L D S *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_A6_ADJ() ) THEN\n" . " \n" . " WRITE(6,*) ' ADJ: TIME FOR A-6 '\n" . " \n" . " ! Get the date/time for the previous A-6 data block\n" . " BEHIND_DATE = GET_A6_TIME_ADJ()\n" . " \n" . " ! Open and read files\n" . " CALL OPEN_A6_FIELDS_ADJ( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " CALL GET_A6_FIELDS( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " \n" . " ENDIF\n" . " \n" . " !==============================================================\n" . " ! ***** R E A D A - 3 F I E L D S *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_A3_ADJ() ) THEN\n" . " \n" . " WRITE(6,*) ' ADJ: TIME FOR A-3 '\n" . " \n" . " ! Get the date/time for the previous A-3 data block\n" . " BEHIND_DATE = GET_A3_TIME_ADJ()\n" . " \n" . " ! Open & read A-3 fields\n" . " CALL OPEN_A3_FIELDS_ADJ( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " CALL GET_A3_FIELDS( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " \n" . "#if defined( GEOS_3 )\n" . " !\n" . " IF ( LDUST ) THEN\n" . " CALL OPEN_GWET_FIELDS_ADJ( BEHIND_DATE(1), \n" . " & BEHIND_DATE(2) )\n" . " CALL GET_GWET_FIELDS( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " ENDIF\n" . "#endif\n" . " \n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** M O N T H L Y O R S E A S O N A L D A T A *****\n" . " !==============================================================\n" . "\n" . " ! UV albedoes\n" . " IF ( LCHEM .and. ITS_A_NEW_MONTH() ) THEN\n" . " CALL READ_UVALBEDO( MONTH )\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** D A I L Y D A T A *****\n" . " !\n" . " ! RDLAI returns today's leaf-area index\n" . " ! RDSOIL returns today's soil type information\n" . " !==============================================================\n" . " ! Read daily data at 11:30 p.m. on any new day, not counting the \n" . " ! \"first\" day of the adjoint integration, during which we can\n" . " ! still use values from the forward integration. \n" . " IF ( GET_NHMS() == 233000 .AND. ( .not. FIRST ) ) THEN\n" . "\n" . " ! Read leaf-area index (needed for drydep)\n" . " CALL RDLAI( DAY_OF_YEAR, MONTH )\n" . "\n" . " ! For MEGAN biogenics ...\n" . " IF ( LMEGAN ) THEN\n" . "\n" . " ! Read AVHRR daily leaf-area-index\n" . " CALL RDISOLAI( GET_DAY_OF_YEAR(), GET_MONTH() )\n" . "\n" . " ! Compute 15-day average temperature for MEGAN\n" . " CALL UPDATE_T_15_AVG\n" . " ENDIF\n" . " \n" . " ! Also read soil-type info for fullchem simulation\n" . " IF ( ITS_A_FULLCHEM_SIM() ) CALL RDSOIL \n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG ( '### MAIN: a DAILY DATA' )\n" . " ENDIF\n" . " \n" . " ! Reset first-time flag\n" . " IF ( FIRST ) FIRST = .FALSE.\n" . "\n" . " !==============================================================\n" . " ! ***** I N T E R P O L A T E Q U A N T I T I E S *****\n" . " !\n" . " ! Interpolate I-6 fields to current dynamic timestep,\n" . " ! based on their values at NSEC and NSEC+NTDT\n" . " !==============================================================\n" . " CALL INTERP_ADJ( NSECb_ADJ, GET_ELAPSED_SEC(), N_DYN )\n" . " \n" . " ! If we are not doing transport, then make sure that\n" . " ! the floating pressure is set to PSC2 (bdf, bmy, 8/22/02)\n" . " IF ( .not. LTRAN ) CALL SET_FLOATING_PRESSURE( PSC2 )\n" . " \n" . " ! Compute airmass quantities at each grid box\n" . " CALL AIRQNT\n" . " \n" . " ! (dkh, 11/07/05) \n" . " ! Compute the cosine of the solar zenith angle at each grid box\n" . " CALL COSSZA( GET_DAY_OF_YEAR(), GET_NHMSb(),\n" . " & GET_ELAPSED_SEC(), SUNCOS )\n" . " \n" . " ! For SMVGEAR II, we also need to compute SUNCOS at\n" . " ! the end of this chemistry timestep (bdf, bmy, 4/1/03)\n" . " IF ( LCHEM .and. ITS_A_FULLCHEM_SIM() ) THEN\n" . " CALL COSSZA( GET_DAY_OF_YEAR(), GET_NHMSb(),\n" . " & GET_ELAPSED_SEC()+GET_TS_CHEM()*60, SUNCOSB )\n" . " ENDIF \n" . "\n" . "#if defined( GEOS_3 )\n" . "\n" . " ! 1998 GEOS-3 carries the ground temperature and not the air\n" . " ! temperature -- thus TS will be 2-3 K too high. As a quick fix, \n" . " ! copy the temperature at the first sigma level into TS. \n" . " ! (mje, bnd, bmy, 7/3/01)\n" . " IF ( YEAR == 1998 ) STOP\n" . "#endif \n" . " \n" . " ! decrement elapsed time\n" . " CALL SET_ELAPSED_MIN_ADJ\n" . "\n" . " CALL SET_CURRENT_TIME\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . "\n" . " ! Initialize wet scavenging and wetdep fields after\n" . " ! the airmass quantities are reset after transport\n" . " IF ( LCONV .or. LWETD ) CALL INIT_WETSCAV_ADJ\n" . "\n" . " !==============================================================\n" . " ! ***** W E T D E P O S I T I O N (rainout + washout) *****\n" . " !==============================================================\n" . " IF ( LWETD .and. ITS_TIME_FOR_DYN() ) CALL DO_WETDEP_ADJ\n" . "\n" . " IF(LTRAN)THEN\n" . " CALL READ_PRESSURE_CHKFILE(NYMD, NHMS)\n" . " CALL SET_FLOATING_PRESSURE(TMP_PRESS(:,:))\n" . " ENDIF\n" . " \n" . " !===========================================================\n" . " ! ***** C H E M I S T R Y *****\n" . " !=========================================================== \n" . "\n" . " ! Every chemistry timestep...\n" . " IF ( ITS_TIME_FOR_CHEM() ) THEN \n" . "\n" . " CALL READ_CHEMISTRY_CHKFILE( NYMD, NHMS )\n" . "\n" . " ! Call the appropriate chemistry routine\n" . " CALL DO_CHEMISTRY_ADJ\n" . "\n" . " ENDIF \n" . "\n" . " !==============================================================\n" . " ! ***** U N I T C O N V E R S I O N ( v/v -> kg ) *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_UNIT() ) THEN\n" . " CALL CONVERT_UNITS( 2, N_TRACERS, TCVV, AD, STT_ADJ )\n" . " \n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CONVERT_UNITS:2' )\n" . " ENDIF\n" . "\n" . " !=====================================================\n" . " ! ***** CONVECTION ADJOINT *****\n" . " !=====================================================\n" . " IF ( ITS_TIME_FOR_CONV() ) THEN\n" . "\n" . " !===========================================================\n" . " ! ***** C L O U D C O N V E C T I O N *****\n" . " !===========================================================\n" . " IF ( LCONV ) THEN\n" . " \n" . " !--------------------------------------------------------------\n" . " ! ***** CHECKPOINTING EVERY DYNAMIC TIME STEP ***** \n" . " !--------------------------------------------------------------\n" . "\n" . " CALL READ_CONVECTION_CHKFILE( NYMD, NHMS )\n" . "\n" . " ! Increment elapsed time\n" . " ! Update dynamic timestep\n" . " CALL DO_CONVECTION_ADJ\n" . "\n" . " ENDIF\n" . " \n" . " !===========================================================\n" . " ! ***** M I X E D L A Y E R M I X I N G *****\n" . " !===========================================================\n" . " CALL DO_PBL_MIX_ADJ( LTURB )\n" . "\n" . " ENDIF \n" . "\n" . " !=====================================================\n" . " ! ***** TRANSPORT ADJOINT *****\n" . " !===================================================== \n" . "\n" . " !IF ( LUPBD ) CALL DO_UPBDFLX\n" . "\n" . " IF ( ITS_TIME_FOR_DYN() ) THEN\n" . "\n" . " ! Call the appropritate version of TPCORE\n" . " IF ( LTRAN ) CALL DO_TRANSPORT_ADJ\n" . "\n" . " ! Reset air mass quantities\n" . " CALL AIRQNT\n" . "\n" . " ! Repartition [NOy] species after transport\n" . " IF ( LUPBD .and. ITS_A_FULLCHEM_SIM() ) THEN\n" . " !CALL UPBDFLX_NOY_ADJ( 1 )\n" . " ENDIF\n" . "\n" . " ! Get relative humidity \n" . " ! (after recomputing pressure quantities)\n" . " CALL MAKE_RH \n" . "\n" . " ENDIF \n" . "\n" . " !==============================================================\n" . " ! ***** U N I T C O N V E R S I O N ( kg -> v/v ) *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_UNIT() ) THEN\n" . " CALL CONVERT_UNITS( 1, N_TRACERS, TCVV, AD, STT_ADJ )\n" . " \n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CONVERT_UNITS:1' )\n" . " ENDIF \n" . " \n" . " !==============================================================\n" . " ! ***** T E S T F O R E N D O F R U N *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_EXIT_ADJ() ) GOTO 9999\n" . "\n" . " ENDDO\n" . " \n" . " ENDDO \n" . "\n" . " !=================================================================\n" . " ! ***** C L E A N U P A N D Q U I T *****\n" . " !=================================================================\n" . " 9999 CONTINUE\n" . " \n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . "\n" . " !=================================================================\n" . "\n" . " CALL MAKE_ADJOINT_CHKFILE( NYMD, NHMS, TAU )\n" . " \n" . "c\$\$\$ OPEN(31,FILE='adj_NOx')\n" . "c\$\$\$ DO L = 1, LLPAR\n" . "c\$\$\$ DO J = 1, JJPAR\n" . "c\$\$\$ DO I = 1, IIPAR\n" . "c\$\$\$ !IF(I/=46.or.J/=30.or.L/=1)CYCLE\n" . "c\$\$\$ !IF(L/=1.and.L/=10.and.L/=15)CYCLE\n" . "c\$\$\$ WRITE(31,*) EMIS_I_ADJ(I,J,L,1) \n" . "c\$\$\$ END DO\n" . "c\$\$\$ END DO\n" . "c\$\$\$ END DO\n" . "c\$\$\$ CLOSE(31)\n" . "\n" . " !=================================================================\n" . " \n" . " OPEN(31,FILE='adj_NOx')\n" . " DO L=1,LLPAR\n" . " DO J=1,JJPAR\n" . " DO I=1,IIPAR\n" . " !IF(L/=1.and.L/=10.and.L/=15)CYCLE\n" . " !IF(L/=10) CYCLE\n" . " WRITE(31,*)STT_ADJ(I,J,L,1)\n" . " END DO\n" . " END DO\n" . " END DO\n" . " CLOSE(31)\n" . "\n" . " ! Print ending time of simulation\n" . " CALL DISPLAY_END_TIME\n" . "!\n" . "!******************************************************************************\n" . "! Internal procedures -- Use the F90 CONTAINS command to inline \n" . "! subroutines that only can be called from this main program. \n" . "!\n" . "! All variables referenced in the main program (local variables, F90 \n" . "! module variables, or common block variables) also have scope within \n" . "! internal subroutines. \n" . "!\n" . "! List of Internal Procedures:\n" . "! ============================================================================\n" . "! (1 ) DISPLAY_GRID_AND_MODEL : Displays resolution, data set, & start time\n" . "! (2 ) GET_NYMD_PHIS : Gets YYYYMMDD for the PHIS data field\n" . "! (3 ) DISPLAY_SIGMA_LAT_LON : Displays sigma, lat, and lon information\n" . "! (4 ) GET_WIND10M : Wrapper for MAKE_WIND10M (from \"dao_mod.f\")\n" . "! (5 ) CTM_FLUSH : Flushes diagnostic files to disk\n" . "! (6 ) DISPLAY_END_TIME : Displays ending time of simulation\n" . "! (7 ) MET_FIELD_DEBUG : Prints min and max of met fields for debug\n" . "!******************************************************************************\n" . "!\n" . " END SUBROUTINE DO_GC_BWD\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION ITS_TIME_FOR_I6_ADJ() RESULT( FLAG )\n" . "!\n" . "!******************************************************************************\n" . "! Function ITS_TIME_FOR_I6_ADJ returns TRUE if it is time to read in I-6\n" . "! (instantaneous 6-h fields) and FALSE otherwise. This happens when TIME_ADJ is\n" . "! at a 6h interval, which is equivalent to when ELAPSED_TIME+TS_DYN is at a \n" . "! 6h interval. (dkh, 8/25/04)\n" . "!\n" . "! NOTES:\n" . "! (1 ) Don't read in i6 fields when we are still within the last 6 h interval\n" . "! from the forward simulation, in which case just use the i6 fields that \n" . "! are already loaded. (dkh, 9/30/04)\n" . "! (2 ) FIXED BUG: Use EXTRA so that NHMS + (TS_DYN) is divisible by 6 h \n" . "!******************************************************************************\n" . "!\n" . " ! Reference to f90 modules\n" . " USE TIME_MOD, ONLY : GET_NHMS, GET_ELAPSED_SEC\n" . " USE ERROR_MOD, ONLY : ERROR_STOP\n" . " USE SUBDRIVER_FWD, ONLY : NSECb\n" . "\n" . " ! Function value\n" . " LOGICAL :: FLAG\n" . "\n" . " ! Local variable\n" . " INTEGER :: EXTRA \n" . "\n" . " !=================================================================\n" . " ! ITS_TIME_FOR_I6_ADJ begins here!\n" . " !=================================================================\n" . " IF ( GET_ELAPSED_SEC() >= NSECb ) THEN\n" . "\n" . " ! We can use I6 fields still loaded from forward run\n" . " FLAG = .FALSE.\n" . " \n" . " ! Echo this fact to the screen\n" . " WRITE(6,*) ' -- USE I6 FIELDS FROM FORWARD RUN '\n" . " \n" . " ELSE\n" . "\n" . " ! EXTRA set so that current NHMS + 1 dynamic time step is\n" . " ! divisible by 060000\n" . " ! Original, hardwired to 30 min dynamic time step\n" . " !EXTRA = 7000 \n" . " ! Qinbin's formula, assumes TS_DYN <= 60 min\n" . " EXTRA = 4000 + TS_DYN*100\n" . "\n" . " IF ( TS_DYN > 60 ) CALL ERROR_STOP( 'Invalid EXTRA!', \n" . " & 'ITS_TIME_FOR_I6_ADJ (adjoint.f)' ) \n" . "\n" . " ! We read in I-6 fields at 00, 06, 12, 18 GMT\n" . " FLAG = ( MOD( GET_NHMS() + EXTRA, 060000 ) == 0 )\n" . "\n" . " ENDIF \n" . "\n" . " ! Return to calling program\n" . " END FUNCTION ITS_TIME_FOR_I6_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION GET_I6_TIME_ADJ( ) RESULT( BEHIND_DATE )\n" . "!\n" . "!******************************************************************************\n" . "! Function GET_I6_TIME_ADJ returns the correct YYYYMMDD and HHMMSS values\n" . "! that are needed to read in the previous instantaneous 6-hour (I-6) fields.\n" . "! (dkh, 8/25/04)\n" . "!\n" . "! NOTES:\n" . "! This is only called if ITS_TIME_FOR_I6_ADJ is true\n" . "!******************************************************************************\n" . "!\n" . " ! Arguments\n" . " INTEGER :: BEHIND_DATE(2)\n" . "\n" . " !=================================================================\n" . " ! GET_I6_TIME_ADJ begins here!\n" . " !=================================================================\n" . "\n" . " ! We need to read in the I-6 fields 6h (360 mins) behind of TIME_ADJ\n" . " ! which is the same as 360 - TS_DYN behind ELAPSED_TIME \n" . " BEHIND_DATE = GET_TIME_BEHIND_ADJ( 360 - TS_DYN )\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION GET_I6_TIME_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION ITS_TIME_FOR_A6_ADJ() RESULT( FLAG )\n" . "!\n" . "!******************************************************************************\n" . "! Function ITS_TIME_FOR_A6_ADJ returns TRUE if it is time to read in I-A\n" . "! (average 6-h fields) and FALSE otherwise. This happens when TIME_ADJ is\n" . "! at a 6h interval (03, 09, 15,21), which is equivalent to when\n" . "! ELAPSED_TIME+TS_DYN is at a 6h interval. (dkh, 03/04/05) \n" . "!\n" . "! NOTES:\n" . "! (1 ) Don't read in A6 fields when we are still within the last 6 h interval\n" . "! from the forward simulation, in which case just use the A6 fields that\n" . "! are already loaded. NSECb is the total elapsed seconds at the last fwd\n" . "! I6 interval, so if we are more than 3 hr past this, can use A6 fields\n" . "! from forward run. (dkh, 03/04/05)\n" . "! \n" . "!******************************************************************************\n" . "!\n" . " ! Reference to f90 modules\n" . " USE TIME_MOD, ONLY : GET_NHMS, GET_ELAPSED_SEC\n" . " USE ERROR_MOD, ONLY : ERROR_STOP\n" . " USE SUBDRIVER_FWD, ONLY : NSECb\n" . "\n" . " ! Function value\n" . " LOGICAL :: FLAG\n" . "\n" . " ! Local variable\n" . " INTEGER :: EXTRA\n" . " INTEGER :: DATE(2)\n" . "\n" . " !=================================================================\n" . " ! ITS_TIME_FOR_A6_ADJ begins here!\n" . " !=================================================================\n" . "\n" . " IF ( GET_ELAPSED_SEC() >= NSECb + 3 * 3600 ) THEN\n" . "\n" . " ! We can use A6 fields still loaded from forward run\n" . " FLAG = .FALSE.\n" . "\n" . " ! Echo this fact to the screen\n" . " WRITE(6,*) ' -- USE A6 FIELDS FROM FORWARD RUN '\n" . "\n" . " ELSE\n" . "\n" . "#if defined( GEOS_4 ) && defined( A_LLK_03 )\n" . "\n" . " ! For GEOS-4 \"a_llk_03\" data, we need to read A-6 fields when it\n" . " ! is 00, 06, 12, 18 GMT. DATE is the current time -- test below.\n" . " DATE = GET_TIME_AHEAD( 0 )\n" . "\n" . "#else\n" . "\n" . " ! For GEOS-1, GEOS-S, GEOS-3, and GEOS-4 \"a_llk_04\" data,\n" . " ! we need to read A-6 fields when it is 03, 09, 15, 21 GMT.\n" . " ! DATE is the time 3 before now -- test below.\n" . " DATE = GET_TIME_BEHIND_ADJ( 180 )\n" . "\n" . "#endif\n" . " ! EXTRA set so that current NHMS + 1 dynamic time step is\n" . " ! divisible by 060000\n" . " ! Original formula, assumes dynamic time step is 30 min\n" . " ! EXTRA = 7000\n" . " ! Qinbin's formula, assumes dynamic time step <= 60\n" . " EXTRA = 4000 + TS_DYN * 100\n" . "\n" . " IF ( TS_DYN > 60 ) CALL ERROR_STOP( 'Invalid EXTRA!',\n" . " & 'ITS_TIME_FOR_A6_ADJ (adjoint.f)' )\n" . "\n" . " ! We read in A-6 fields at 03, 09, 15, 21 GMT\n" . " FLAG = ( MOD( DATE(2) + EXTRA, 060000 ) == 0 )\n" . "\n" . " ENDIF\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION ITS_TIME_FOR_A6_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION GET_A6_TIME_ADJ( ) RESULT( BEHIND_DATE )\n" . "!\n" . "!******************************************************************************\n" . "! Function GET_A6_TIME_ADJ returns the correct YYYYMMDD and HHMMSS values\n" . "! that are needed to read in the previous average 6-hour (A-6) fields.\n" . "! (dkh, 03/04/05)\n" . "!\n" . "! NOTES:\n" . "! (1 ) This is only called if ITS_TIME_FOR_A6_ADJ is true\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! Arguments\n" . " INTEGER :: BEHIND_DATE(2)\n" . "\n" . " !=================================================================\n" . " ! GET_A6_TIME_ADJ begins here!\n" . " !=================================================================\n" . "\n" . " ! Return the time 3h (180m) before now, since there is a 3-hour\n" . " ! offset between the actual time when the A-6 fields are read\n" . " ! and the time that the A-6 fields are stamped with. Also apply\n" . " ! offset of TS_DYN. \n" . " BEHIND_DATE = GET_TIME_BEHIND_ADJ( 180 - TS_DYN )\n" . " !BEHIND_DATE = GET_TIME_BEHIND_ADJ( - TS_DYN )\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION GET_A6_TIME_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION ITS_TIME_FOR_A3_ADJ() RESULT( FLAG )\n" . "!\n" . "!******************************************************************************\n" . "! Function ITS_TIME_FOR_A3_ADJ returns TRUE if it is time to read in A-3\n" . "! (average 3-h fields) and FALSE otherwise. This happens when TIME_ADJ is\n" . "! at a 3h interval, which is equivalent to when\n" . "! ELAPSED_TIME+TS_DYN is at a 3h interval. (dkh, 03/04/05)\n" . "!\n" . "! NOTES:\n" . "! (1 ) Don't read in 3 fields when we are still within the last 3 h interval\n" . "! from the forward simulation, in which case just use the A3 fields that\n" . "! are already loaded. NSECb is the total elapsed seconds at the last fwd\n" . "! I6 interval, so if we are more than 3 hr past this, can use A3 fields\n" . "! from forward run. (dkh, 03/04/05)\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! Reference to f90 modules\n" . " USE TIME_MOD, ONLY : GET_NHMS, GET_ELAPSED_SEC\n" . " USE ERROR_MOD, ONLY : ERROR_STOP\n" . " USE SUBDRIVER_FWD, ONLY : NSECb\n" . "\n" . " ! Function value\n" . " LOGICAL :: FLAG\n" . "\n" . " ! Local variable\n" . " INTEGER :: EXTRA\n" . "\n" . " !=================================================================\n" . " ! ITS_TIME_FOR_A3_ADJ begins here!\n" . " !=================================================================\n" . "\n" . " IF ( GET_ELAPSED_SEC() >= NSECb + 3 * 3600 ) THEN\n" . " !IF ( GET_ELAPSED_SEC() >= NSECb + 3 * 3600 + 30*60 ) THEN\n" . "\n" . " ! We can use A3 fields still loaded from forward run\n" . " FLAG = .FALSE.\n" . "\n" . " ! Echo this fact to the screen\n" . " WRITE(6,*) ' -- USE A3 FIELDS FROM FORWARD RUN '\n" . "\n" . " ELSE\n" . " ! EXTRA set so that current NHMS + 1 dynamic time step is\n" . " ! divisible by 030000\n" . " ! Original formula, assumes dynamic time step is 30 min\n" . " !EXTRA = 7000\n" . " ! Qinbin's formula, assumes dynamic time step <= 60 min\n" . " EXTRA = 4000 + TS_DYN * 100\n" . "\n" . " IF ( TS_DYN > 30 ) CALL ERROR_STOP( 'Invalid EXTRA!',\n" . " & 'ITS_TIME_FOR_A3_ADJ (adjoint.f)' )\n" . "\n" . " ! We read in A-3 every 3 hours\n" . " FLAG = ( MOD( GET_NHMS() + EXTRA, 030000 ) == 0 )\n" . "\n" . " ENDIF\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION ITS_TIME_FOR_A3_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION GET_A3_TIME_ADJ( ) RESULT( BEHIND_DATE )\n" . "!\n" . "!******************************************************************************\n" . "! Function GET_A3_TIME_ADJ returns the correct YYYYMMDD and HHMMSS values\n" . "! that are needed to read in the previous average 3-hour (A-3) fields.\n" . "! (dkh, 03/04/05)\n" . "!\n" . "! NOTES:\n" . "! (1 ) This is only called if ITS_TIME_FOR_A3_ADJ is true\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! Arguments\n" . " INTEGER :: BEHIND_DATE(2)\n" . "\n" . " !=================================================================\n" . " ! GET_A3_TIME_ADJ begins here!\n" . " !=================================================================\n" . "\n" . "#if defined( GEOS_4 )\n" . "\n" . " ! For GEOS-4/fvDAS, the A-3 fields are timestamped by center time.\n" . " ! Therefore, the difference between the actual time when the fields\n" . " ! are read and the A-3 timestamp time is 90 minutes.\n" . " BEHIND_DATE = GET_TIME_BEHIND_ADJ( 90 - TS_DYN )\n" . "\n" . "#else\n" . "\n" . " ! For GEOS-1, GEOS-STRAT, GEOS-3, the A-3 fields are timestamped\n" . " ! by ending time. Therefore, the difference between the actual time\n" . " ! when the fields are read and the A-3 timestamp time is 180 minutes.\n" . " !BEHIND_DATE = GET_TIME_BEHIND_ADJ( 180 - TS_DYN )\n" . " BEHIND_DATE = GET_TIME_BEHIND_ADJ( - TS_DYN )\n" . "\n" . "#endif\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION GET_A3_TIME_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION GET_TIME_BEHIND_ADJ( N_MINS ) RESULT( DATE )\n" . "!\n" . "!******************************************************************************\n" . "! Function GET_TIME_BEHIND_ADJ returns to the calling program a 2-element vector\n" . "! containing the YYYYMMDD and HHMMSS values at the current time minus N_MINS\n" . "! minutes. (dkh, 8/25/04)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) N_MINS (INTEGER) : Minutes ahead of time to compute YYYYMMDD,HHMMSS\n" . "!\n" . "! NOTES:\n" . "! \n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE TIME_MOD, ONLY : GET_JD, GET_NYMD, GET_NHMS\n" . " USE JULDAY_MOD, ONLY : CALDATE\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: N_MINS\n" . "\n" . " ! Local variables\n" . " INTEGER :: DATE(2)\n" . " REAL*8 :: JD\n" . "\n" . " !=================================================================\n" . " ! GET_TIME_BEHIND_ADJ begins here!\n" . " !=================================================================\n" . "\n" . " ! Astronomical Julian Date at current time - N_MINS\n" . " JD = GET_JD( GET_NYMD(), GET_NHMS() ) - ( N_MINS / 1440d0 )\n" . "\n" . " ! Call CALDATE to compute the current YYYYMMDD and HHMMSS\n" . " CALL CALDATE( JD, DATE(1), DATE(2) )\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION GET_TIME_BEHIND_ADJ\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE DISPLAY_GRID_AND_MODEL\n" . "\n" . " !=================================================================\n" . " ! Internal Subroutine DISPLAY_GRID_AND_MODEL displays the \n" . " ! appropriate messages for the given model grid and machine type.\n" . " ! It also prints the starting time and date (local time) of the\n" . " ! GEOS-CHEM simulation. (bmy, 12/2/03, 10/18/05)\n" . " !=================================================================\n" . "\n" . " ! For system time stamp\n" . " CHARACTER(LEN=16) :: STAMP\n" . "\n" . " !-----------------------\n" . " ! Print resolution info\n" . " !-----------------------\n" . "#if defined( GRID4x5 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) //\n" . " & ' S T A R T I N G 4 x 5 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID2x25 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 2 x 2.5 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID1x125 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 1 x 1.25 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID1x1 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 1 x 1 G E O S -- C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! Print machine info\n" . " !-----------------------\n" . "\n" . " ! Get the proper FORMAT statement for the model being used\n" . "#if defined( COMPAQ )\n" . " WRITE( 6, '(a)' ) 'Created w/ HP/COMPAQ Alpha compiler'\n" . "#elif defined( IBM_AIX )\n" . " WRITE( 6, '(a)' ) 'Created w/ IBM-AIX compiler'\n" . "#elif defined( LINUX_PGI )\n" . " WRITE( 6, '(a)' ) 'Created w/ LINUX/PGI compiler'\n" . "#elif defined( LINUX_IFORT )\n" . " WRITE( 6, '(a)' ) 'Created w/ LINUX/IFORT (64-bit) compiler'\n" . "#elif defined( SGI_MIPS )\n" . " WRITE( 6, '(a)' ) 'Created w/ SGI MIPSpro compiler'\n" . "#elif defined( SPARC )\n" . " WRITE( 6, '(a)' ) 'Created w/ Sun/SPARC compiler'\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! Print met field info\n" . " !-----------------------\n" . "#if defined( GEOS_3 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-3 met fields'\n" . "#elif defined( GEOS_4 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-4/fvDAS met fields'\n" . "#elif defined( GEOS_5 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-5/fvDAS met fields'\n" . "#elif defined( GCAP )\n" . " WRITE( 6, '(a)' ) 'Using GCAP/GISS met fields'\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! System time stamp\n" . " !-----------------------\n" . " STAMP = SYSTEM_TIMESTAMP()\n" . " WRITE( 6, 100 ) STAMP\n" . " 100 FORMAT( /, '===> SIMULATION START TIME: ', a, ' <===', / )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE DISPLAY_GRID_AND_MODEL\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " FUNCTION ITS_TIME_FOR_BPCH() RESULT( DO_BPCH )\n" . "\n" . " !=================================================================\n" . " ! Internal function ITS_TIME_FOR_BPCH returns TRUE if it is time\n" . " ! to write to the binary punch file and FALSE otherwise.\n" . " !=================================================================\n" . "\n" . " ! Local variables\n" . " INTEGER :: TODAY, THIS_NJDAY, NHMS, NDIAGTIME\n" . " \n" . " ! Function value\n" . " LOGICAL :: DO_BPCH\n" . "\n" . " !=================================================================\n" . " ! ITS_TIME_FOR_BPCH begins here!\n" . " !================================================================= \n" . " \n" . " ! Return FALSE if it's the first timestep\n" . " IF ( GET_TAU() == GET_TAUb() ) THEN\n" . " DO_BPCH = .FALSE.\n" . " RETURN\n" . " ENDIF\n" . "\n" . " ! Current day of year\n" . " TODAY = GET_DAY_OF_YEAR()\n" . "\n" . " ! Current time of day\n" . " NHMS = GET_NHMS()\n" . "\n" . " ! Time of day to write bpch files to disk\n" . " NDIAGTIME = GET_NDIAGTIME()\n" . "\n" . " ! Look up appropriate value of NJDAY array. We may need to add a\n" . " ! day to skip past the Feb 29 element of NJDAY for non-leap-years.\n" . " IF ( .not. ITS_A_LEAPYEAR( FORCE=.TRUE. ) .and. TODAY > 59 ) THEN\n" . " THIS_NJDAY = NJDAY( TODAY + 1 ) \n" . " ELSE\n" . " THIS_NJDAY = NJDAY( TODAY )\n" . " ENDIF\n" . "\n" . " ! Test if this is the day & time to write to the BPCH file!\n" . " IF ( ( THIS_NJDAY > 0 ) .and. NHMS == NDIAGTIME ) THEN\n" . " DO_BPCH = .TRUE.\n" . " ELSE\n" . " DO_BPCH = .FALSE.\n" . " ENDIF\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION ITS_TIME_FOR_BPCH\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE CTM_FLUSH\n" . "\n" . " !================================================================\n" . " ! Internal subroutine CTM_FLUSH flushes certain diagnostic\n" . " ! file buffers to disk. (bmy, 8/31/00, 7/1/02)\n" . " !\n" . " ! CTM_FLUSH should normally be called after each diagnostic \n" . " ! output, so that in case the run dies, the output files from \n" . " ! the last diagnostic timestep will not be lost. \n" . " !\n" . " ! FLUSH is an intrinsic FORTRAN subroutine and takes as input \n" . " ! the unit number of the file to be flushed to disk.\n" . " !================================================================\n" . " CALL FLUSH( IU_ND48 ) \n" . " CALL FLUSH( IU_BPCH ) \n" . " CALL FLUSH( IU_SMV2LOG ) \n" . " CALL FLUSH( IU_DEBUG ) \n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE CTM_FLUSH\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE DISPLAY_END_TIME\n" . "\n" . " !=================================================================\n" . " ! Internal subroutine DISPLAY_END_TIME prints the ending time of\n" . " ! the GEOS-CHEM simulation (bmy, 5/3/05)\n" . " !=================================================================\n" . "\n" . " ! Local variables\n" . " CHARACTER(LEN=16) :: STAMP\n" . "\n" . " ! Print system time stamp\n" . " STAMP = SYSTEM_TIMESTAMP()\n" . " WRITE( 6, 100 ) STAMP\n" . " 100 FORMAT( /, '===> SIMULATION END TIME: ', a, ' <===', / )\n" . "\n" . " ! Echo info\n" . " WRITE ( 6, 3000 ) \n" . " 3000 FORMAT\n" . " & ( /, '************** E N D O F G E O S -- C H E M ',\n" . " & '**************' )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE DISPLAY_END_TIME\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MET_FIELD_DEBUG\n" . "\n" . " !=================================================================\n" . " ! Internal subroutine MET_FIELD_DEBUG prints out the maximum\n" . " ! and minimum, and sum of DAO met fields for debugging \n" . " !=================================================================\n" . "\n" . " ! References to F90 modules\n" . " USE DAO_MOD, ONLY : AD, AIRDEN, AIRVOL, ALBD1, ALBD2\n" . " USE DAO_MOD, ONLY : ALBD, AVGW, BXHEIGHT, CLDFRC, CLDF \n" . " USE DAO_MOD, ONLY : CLDMAS, CLDTOPS, DELP \n" . " USE DAO_MOD, ONLY : DTRAIN, GWETTOP, HFLUX, HKBETA, HKETA \n" . " USE DAO_MOD, ONLY : LWI, MOISTQ, OPTD, OPTDEP, PBL \n" . " USE DAO_MOD, ONLY : PREACC, PRECON, PS1, PS2, PSC2 \n" . " USE DAO_MOD, ONLY : RADLWG, RADSWG, RH, SLP, SNOW \n" . " USE DAO_MOD, ONLY : SPHU1, SPHU2, SPHU, SUNCOS, SUNCOSB \n" . " USE DAO_MOD, ONLY : TMPU1, TMPU2, T, TROPP, TS \n" . " USE DAO_MOD, ONLY : TSKIN, U10M, USTAR, UWND1, UWND2 \n" . " USE DAO_MOD, ONLY : UWND, V10M, VWND1, VWND2, VWND \n" . " USE DAO_MOD, ONLY : Z0, ZMEU, ZMMD, ZMMU \n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, L, IJ\n" . "\n" . " !=================================================================\n" . " ! MET_FIELD_DEBUG begins here!\n" . " !=================================================================\n" . "\n" . " ! Define box to print out\n" . " I = 23\n" . " J = 34\n" . " L = 1\n" . " IJ = ( ( J-1 ) * IIPAR ) + I\n" . "\n" . " !=================================================================\n" . " ! Print out met fields at (I,J,L)\n" . " !=================================================================\n" . " IF ( ALLOCATED( AD ) ) PRINT*, 'AD : ', AD(I,J,L) \n" . " IF ( ALLOCATED( AIRDEN ) ) PRINT*, 'AIRDEN : ', AIRDEN(L,I,J) \n" . " IF ( ALLOCATED( AIRVOL ) ) PRINT*, 'AIRVOL : ', AIRVOL(I,J,L) \n" . " IF ( ALLOCATED( ALBD1 ) ) PRINT*, 'ALBD1 : ', ALBD1(I,J) \n" . " IF ( ALLOCATED( ALBD2 ) ) PRINT*, 'ALBD2 : ', ALBD2(I,J) \n" . " IF ( ALLOCATED( ALBD ) ) PRINT*, 'ALBD : ', ALBD(I,J) \n" . " IF ( ALLOCATED( AVGW ) ) PRINT*, 'AVGW : ', AVGW(I,J,L) \n" . " IF ( ALLOCATED( BXHEIGHT ) ) PRINT*, 'BXHEIGHT: ', BXHEIGHT(I,J,L) \n" . " IF ( ALLOCATED( CLDFRC ) ) PRINT*, 'CLDFRC : ', CLDFRC(I,J)\n" . " IF ( ALLOCATED( CLDF ) ) PRINT*, 'CLDF : ', CLDF(L,I,J) \n" . " IF ( ALLOCATED( CLDMAS ) ) PRINT*, 'CLDMAS : ', CLDMAS(I,J,L) \n" . " IF ( ALLOCATED( CLDTOPS ) ) PRINT*, 'CLDTOPS : ', CLDTOPS(I,J) \n" . " IF ( ALLOCATED( DELP ) ) PRINT*, 'DELP : ', DELP(L,I,J) \n" . " IF ( ALLOCATED( DTRAIN ) ) PRINT*, 'DTRAIN : ', DTRAIN(I,J,L) \n" . " IF ( ALLOCATED( GWETTOP ) ) PRINT*, 'GWETTOP : ', GWETTOP(I,J) \n" . " IF ( ALLOCATED( HFLUX ) ) PRINT*, 'HFLUX : ', HFLUX(I,J) \n" . " IF ( ALLOCATED( HKBETA ) ) PRINT*, 'HKBETA : ', HKBETA(I,J,L) \n" . " IF ( ALLOCATED( HKETA ) ) PRINT*, 'HKETA : ', HKETA(I,J,L) \n" . " IF ( ALLOCATED( LWI ) ) PRINT*, 'LWI : ', LWI(I,J) \n" . " IF ( ALLOCATED( MOISTQ ) ) PRINT*, 'MOISTQ : ', MOISTQ(L,I,J) \n" . " IF ( ALLOCATED( OPTD ) ) PRINT*, 'OPTD : ', OPTD(L,I,J) \n" . " IF ( ALLOCATED( OPTDEP ) ) PRINT*, 'OPTDEP : ', OPTDEP(L,I,J) \n" . " IF ( ALLOCATED( PBL ) ) PRINT*, 'PBL : ', PBL(I,J) \n" . " IF ( ALLOCATED( PREACC ) ) PRINT*, 'PREACC : ', PREACC(I,J) \n" . " IF ( ALLOCATED( PRECON ) ) PRINT*, 'PRECON : ', PRECON(I,J) \n" . " IF ( ALLOCATED( PS1 ) ) PRINT*, 'PS1 : ', PS1(I,J) \n" . " IF ( ALLOCATED( PS2 ) ) PRINT*, 'PS2 : ', PS2(I,J) \n" . " IF ( ALLOCATED( PSC2 ) ) PRINT*, 'PSC2 : ', PSC2(I,J)\n" . " IF ( ALLOCATED( RADLWG ) ) PRINT*, 'RADLWG : ', RADLWG(I,J)\n" . " IF ( ALLOCATED( RADSWG ) ) PRINT*, 'RADSWG : ', RADSWG(I,J)\n" . " IF ( ALLOCATED( RH ) ) PRINT*, 'RH : ', RH(I,J,L) \n" . " IF ( ALLOCATED( SLP ) ) PRINT*, 'SLP : ', SLP(I,J) \n" . " IF ( ALLOCATED( SNOW ) ) PRINT*, 'SNOW : ', SNOW(I,J) \n" . " IF ( ALLOCATED( SPHU1 ) ) PRINT*, 'SPHU1 : ', SPHU1(I,J,L) \n" . " IF ( ALLOCATED( SPHU2 ) ) PRINT*, 'SPHU2 : ', SPHU2(I,J,L) \n" . " IF ( ALLOCATED( SPHU ) ) PRINT*, 'SPHU : ', SPHU(I,J,L) \n" . " IF ( ALLOCATED( SUNCOS ) ) PRINT*, 'SUNCOS : ', SUNCOS(IJ) \n" . " IF ( ALLOCATED( SUNCOSB ) ) PRINT*, 'SUNCOSB : ', SUNCOSB(IJ) \n" . " IF ( ALLOCATED( TMPU1 ) ) PRINT*, 'TMPU1 : ', TMPU1(I,J,L) \n" . " IF ( ALLOCATED( TMPU2 ) ) PRINT*, 'TMPU2 : ', TMPU2(I,J,L) \n" . " IF ( ALLOCATED( T ) ) PRINT*, 'TMPU : ', T(I,J,L)\n" . " IF ( ALLOCATED( TROPP ) ) PRINT*, 'TROPP : ', TROPP(I,J) \n" . " IF ( ALLOCATED( TS ) ) PRINT*, 'TS : ', TS(I,J) \n" . " IF ( ALLOCATED( TSKIN ) ) PRINT*, 'TSKIN : ', TSKIN(I,J) \n" . " IF ( ALLOCATED( U10M ) ) PRINT*, 'U10M : ', U10M(I,J) \n" . " IF ( ALLOCATED( USTAR ) ) PRINT*, 'USTAR : ', USTAR(I,J) \n" . " IF ( ALLOCATED( UWND1 ) ) PRINT*, 'UWND1 : ', UWND1(I,J,L) \n" . " IF ( ALLOCATED( UWND2 ) ) PRINT*, 'UWND2 : ', UWND2(I,J,L) \n" . " IF ( ALLOCATED( UWND ) ) PRINT*, 'UWND : ', UWND(I,J,L) \n" . " IF ( ALLOCATED( V10M ) ) PRINT*, 'V10M : ', V10M(I,J) \n" . " IF ( ALLOCATED( VWND1 ) ) PRINT*, 'VWND1 : ', VWND1(I,J,L) \n" . " IF ( ALLOCATED( VWND2 ) ) PRINT*, 'VWND2 : ', VWND2(I,J,L) \n" . " IF ( ALLOCATED( VWND ) ) PRINT*, 'VWND : ', VWND(I,J,L) \n" . " IF ( ALLOCATED( Z0 ) ) PRINT*, 'Z0 : ', Z0(I,J) \n" . " IF ( ALLOCATED( ZMEU ) ) PRINT*, 'ZMEU : ', ZMEU(I,J,L) \n" . " IF ( ALLOCATED( ZMMD ) ) PRINT*, 'ZMMD : ', ZMMD(I,J,L) \n" . " IF ( ALLOCATED( ZMMU ) ) PRINT*, 'ZMMU : ', ZMMU(I,J,L) \n" . "\n" . " ! Flush the output buffer\n" . " CALL FLUSH( 6 )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE MET_FIELD_DEBUG\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " ! End of program\n" . " END MODULE SUBDRIVER_BWD\n"; close(FILE); } #============================================= # Create subdriver_bwd_senst.f #============================================= sub createSubdriverBwdSenst() { printf "Creating subdriver_bwd_senst.f\n"; open(FILE, ">subdriver_bwd_senst.f") || die "Unable to open subdriver_bwd_senst.f"; print FILE "! =============================================================\n" . "! subdriver_bwd_fd.f, 2008/24/01 Kumaresh \$\n" . "! Adjoint finite-difference driver is a modified version of main \n" . "! driver for GEOS-Chem to carryout finite difference tests.\n" . "! =============================================================\n" . "!\n" . " MODULE SUBDRIVER_BWD\n" . "! \n" . "!******************************************************************************\n" . "! \n" . "! \n" . "! GGGGGG CCCCCC A DDDDD J OOO I N N TTTTTTT \n" . "! G C A A D D J O O I NN N T\n" . "! G GGG C == AAAAA D D J 0 O I N N N T\n" . "! G G C A A D D J J 0 O I N NN T\n" . "! GGGGGG CCCCCC A A DDDDD JJJ OOO I N N T\n" . "! \n" . "! \n" . "! for 4 x 5, 2 x 2.5 global grids and 1 x 1 nested grids\n" . "!\n" . "! Contact: Bob Yantosca, Harvard University (bmy.as.harvard.edu)\n" . "! \n" . "!******************************************************************************\n" . "!\n" . "! See the GEOS-Chem-Adj Web Site:\n" . "!\n" . "! http://people.cs.vt.edu/~asandu/Software/GC_ADJ/GC_ADJ.html\n" . "!\n" . "! and the GEOS-CHEM User's Guide:\n" . "!\n" . "! http://www.cs.vt.edu/~asandu/Software/GC_ADJ/GC_ADJ_Users_Manual.pdf\n" . "!\n" . "! for the most up-to-date GEOS-CHEM documentation on the following topics:\n" . "!\n" . "! - installation, compilation, and execution\n" . "! - coding practice and style\n" . "! - input files and met field data files\n" . "! - horizontal and vertical resolution\n" . "! - modification history\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules \n" . " USE A3_READ_MOD, ONLY : GET_A3_FIELDS\n" . " USE A3_READ_MOD, ONLY : OPEN_A3_FIELDS\n" . " USE A3_READ_MOD, ONLY : UNZIP_A3_FIELDS\n" . " USE A3_READ_MOD, ONLY : OPEN_A3_FIELDS_ADJ\n" . " USE A6_READ_MOD, ONLY : GET_A6_FIELDS\n" . " USE A6_READ_MOD, ONLY : OPEN_A6_FIELDS\n" . " USE A6_READ_MOD, ONLY : UNZIP_A6_FIELDS\n" . " USE A6_READ_MOD, ONLY : OPEN_A6_FIELDS_ADJ\n" . " USE CHECKPOINT_MOD \n" . " USE CHEMISTRY_MOD, ONLY : DO_CHEMISTRY_ADJ\n" . " USE BENCHMARK_MOD, ONLY : STDRUN\n" . " USE CONVECTION_MOD, ONLY : DO_CONVECTION_ADJ\n" . " USE COMODE_MOD, ONLY : INIT_COMODE, CSPEC, CSPEC_ADJ, JLOP, \n" . " & IXSAVE,IYSAVE,IZSAVE\n" . " USE DIAG_MOD, ONLY : DIAGCHLORO\n" . " USE DIAG41_MOD, ONLY : DIAG41, ND41\n" . " USE DIAG42_MOD, ONLY : DIAG42, ND42\n" . " USE DIAG48_MOD, ONLY : DIAG48, ITS_TIME_FOR_DIAG48\n" . " USE DIAG49_MOD, ONLY : DIAG49, ITS_TIME_FOR_DIAG49\n" . " USE DIAG50_MOD, ONLY : DIAG50, DO_SAVE_DIAG50\n" . " USE DIAG51_MOD, ONLY : DIAG51, DO_SAVE_DIAG51\n" . " USE DIAG_OH_MOD, ONLY : PRINT_DIAG_OH\n" . " USE DAO_MOD, ONLY : AD, AIRQNT \n" . " USE DAO_MOD, ONLY : AVGPOLE, CLDTOPS\n" . " USE DAO_MOD, ONLY : CONVERT_UNITS, COPY_I6_FIELDS\n" . " USE DAO_MOD, ONLY : COSSZA, INIT_DAO\n" . " USE DAO_MOD, ONLY : INTERP_ADJ, PS1\n" . " USE DAO_MOD, ONLY : PS2, PSC2 \n" . " USE DAO_MOD, ONLY : T, TS \n" . " USE DAO_MOD, ONLY : SUNCOS, SUNCOSB\n" . " USE DAO_MOD, ONLY : MAKE_RH, TMP_PRESS\n" . " USE DRYDEP_MOD, ONLY : DO_DRYDEP\n" . " USE EMISSIONS_MOD, ONLY : DO_EMISSIONS\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_BPCH, IU_DEBUG\n" . " USE FILE_MOD, ONLY : IU_ND48, IU_SMV2LOG \n" . " USE FILE_MOD, ONLY : CLOSE_FILES\n" . " USE GLOBAL_CH4_MOD, ONLY : INIT_GLOBAL_CH4, CH4_AVGTP\n" . " USE GCAP_READ_MOD, ONLY : GET_GCAP_FIELDS\n" . " USE GCAP_READ_MOD, ONLY : OPEN_GCAP_FIELDS\n" . " USE GCAP_READ_MOD, ONLY : UNZIP_GCAP_FIELDS\n" . " USE GWET_READ_MOD, ONLY : GET_GWET_FIELDS\n" . " USE GWET_READ_MOD, ONLY : OPEN_GWET_FIELDS\n" . " USE GWET_READ_MOD, ONLY : UNZIP_GWET_FIELDS\n" . " USE I6_READ_MOD, ONLY : GET_I6_FIELDS_1\n" . " USE I6_READ_MOD, ONLY : GET_I6_FIELDS_2\n" . " USE I6_READ_MOD, ONLY : OPEN_I6_FIELDS_ADJ\n" . " USE I6_READ_MOD, ONLY : UNZIP_I6_FIELDS\n" . " USE INPUT_MOD, ONLY : READ_INPUT_FILE\n" . " USE LAI_MOD, ONLY : RDISOLAI\n" . " USE LIGHTNING_NOX_MOD, ONLY : LIGHTNING\n" . " !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " !%%% NOTE: Temporary kludge: For GEOS-4 we want to use the new near-land\n" . " !%%% lightning formulation. But for the time being, we must keep the \n" . " !%%% existing lightning for other met field types. (ltm, bmy, 5/10/06)\n" . " USE LIGHTNING_NOX_NL_MOD, ONLY : LIGHTNING_NL\n" . " !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " USE LOGICAL_MOD, ONLY : LEMIS, LCHEM, LUNZIP, LDUST\n" . " USE LOGICAL_MOD, ONLY : LLIGHTNOX, LPRT, LSTDRUN, LSVGLB\n" . " USE LOGICAL_MOD, ONLY : LWAIT, LTRAN, LUPBD, LCONV\n" . " USE LOGICAL_MOD, ONLY : LWETD, LTURB, LDRYD, LMEGAN \n" . " USE LOGICAL_MOD, ONLY : LDYNOCEAN, LSOA, LVARTROP\n" . " USE MEGAN_MOD, ONLY : INIT_MEGAN\n" . " USE MEGAN_MOD, ONLY : UPDATE_T_15_AVG\n" . " USE MEGAN_MOD, ONLY : UPDATE_T_DAY\n" . " USE PBL_MIX_MOD, ONLY : DO_PBL_MIX_ADJ\n" . " USE OCEAN_MERCURY_MOD, ONLY : MAKE_OCEAN_Hg_RESTART\n" . " USE OCEAN_MERCURY_MOD, ONLY : READ_OCEAN_Hg_RESTART\n" . " USE PLANEFLIGHT_MOD, ONLY : PLANEFLIGHT\n" . " USE PLANEFLIGHT_MOD, ONLY : SETUP_PLANEFLIGHT \n" . " USE PRESSURE_MOD, ONLY : INIT_PRESSURE\n" . " USE PRESSURE_MOD, ONLY : SET_FLOATING_PRESSURE\n" . " USE READ_TESO3_MOD \n" . " USE TIME_MOD\n" . " USE TRACER_MOD, ONLY : CHECK_STT, N_TRACERS, STT, TCVV,\n" . " & STT_ADJ, PERT\n" . " USE TRACER_MOD, ONLY : DDEP_ADJ, EMIS_ADJ, EMIS_I_ADJ\n" . " USE TRACER_MOD, ONLY : ITS_AN_AEROSOL_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_CH4_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_FULLCHEM_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_MERCURY_SIM\n" . " USE TRACERID_MOD, ONLY : IDO3\n" . " USE TRANSPORT_MOD, ONLY : DO_TRANSPORT_ADJ\n" . " USE TROPOPAUSE_MOD, ONLY : READ_TROPOPAUSE, CHECK_VAR_TROP\n" . " USE RESTART_MOD, ONLY : MAKE_RESTART_FILE, READ_RESTART_FILE\n" . " USE UPBDFLX_MOD, ONLY : DO_UPBDFLX, UPBDFLX_NOY\n" . " USE UVALBEDO_MOD, ONLY : READ_UVALBEDO\n" . " USE WETSCAV_MOD, ONLY : INIT_WETSCAV_ADJ, DO_WETDEP_ADJ\n" . " USE XTRA_READ_MOD, ONLY : GET_XTRA_FIELDS, OPEN_XTRA_FIELDS\n" . " USE XTRA_READ_MOD, ONLY : UNZIP_XTRA_FIELDS\n" . " USE gckpp_Global, ONLY : NCOEFF\n" . " USE READ_TESO3_MOD \n" . "\n" . " ! Force all variables to be declared explicitly\n" . " IMPLICIT NONE\n" . " \n" . " ! Header files \n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"CMN_DIAG\" ! Diagnostic switches, NJDAY\n" . "# include \"CMN_GCTM\" ! Physical constants\n" . "# include \"CMN\"\n" . "\n" . " ! PRIVATE module variables \n" . " PRIVATE :: TS_DYN \n" . "\n" . " !================================================================= \n" . " ! MODULE VARIABLES \n" . " !================================================================= \n" . " INTEGER :: MIN_ADJ\n" . " INTEGER :: TS_DYN\n" . " INTEGER :: FINAL_ELAPSED_MIN \n" . "\n" . " ! Local variables\n" . " LOGICAL :: FIRST = .TRUE.\n" . " LOGICAL :: LXTRA \n" . " INTEGER :: I, IOS, J, K, L\n" . " INTEGER :: N, JDAY, NDIAGTIME, N_DYN\n" . " INTEGER :: N_DYN_STEPS, NSECb, N_STEP, DATE(2)\n" . " INTEGER :: YEAR, MONTH, DAY, DAY_OF_YEAR\n" . " INTEGER :: SEASON, NYMD, NYMDb, NHMS\n" . " INTEGER :: ELAPSED_SEC, NHMSb\n" . " REAL*8 :: TAU, TAUb \n" . " CHARACTER(LEN=255) :: ZTYPE\n" . "\n" . " INTEGER, SAVE :: NSECb_ADJ\n" . " INTEGER :: BEHIND_DATE(2)\n" . " INTEGER :: I62_DATE(2)\n" . "\n" . " CONTAINS\n" . "\n" . " SUBROUTINE DO_GC_BWD()\n" . " \n" . " REAL*8 CF\n" . "\n" . "\n" . " !=================================================================\n" . " ! GEOS-CHEM-ADJ starts here! \n" . " !=================================================================\n" . "\n" . " !=================================================================\n" . " ! ***** I N I T I A L I Z A T I O N *****\n" . " !=================================================================\n" . "\n" . " ! Define time variables for use below\n" . " NHMS = GET_NHMS()\n" . " NHMSb = GET_NHMSb()\n" . " NYMD = GET_NYMD()\n" . " NYMDb = GET_NYMDb()\n" . " TAU = GET_TAU()\n" . " TAUb = GET_TAUb()\n" . " \n" . " CF = 0d0\n" . " STT_ADJ = 0d0\n" . " IF(LCHEM)THEN\n" . " CSPEC_ADJ = 0d0\n" . " CSPEC = 0d0\n" . " ENDIF\n" . " \n" . " CALL CALC_TESO3_FORCE( STT_ADJ )\n" . " !CALL OBS_GRAD_UPDATE( CF )\n" . "\n" . " !=================================================================\n" . " ! ***** 6 - H O U R T I M E S T E P L O O P *****\n" . " !================================================================= \n" . "\n" . " ! Echo message before first timestep\n" . " WRITE( 6, '(a)' )\n" . " WRITE( 6, '(a)' ) REPEAT( '*', 44 )\n" . " WRITE( 6, '(a)' ) '* B e g i n T i m e S t e p p i n g !! *'\n" . " WRITE( 6, '(a)' ) REPEAT( '*', 44 )\n" . " WRITE( 6, '(a)' ) \n" . "\n" . " ! NSTEP is the number of dynamic timesteps w/in a 6-h interval\n" . " N_DYN_STEPS = 360 / GET_TS_DYN()\n" . "\n" . " TS_DYN = GET_TS_DYN() \n" . "\n" . " FINAL_ELAPSED_MIN = ELAPSED_MIN\n" . "\n" . " ! Start a new 6-h loop\n" . " DO \n" . "\n" . " ! Get dynamic timestep in seconds\n" . " N_DYN = 60d0 * GET_TS_DYN()\n" . "\n" . " ! Compute time parameters at start of 6-h loop\n" . " CALL SET_CURRENT_TIME\n" . "\n" . " !=================================================================\n" . " ! ***** D Y N A M I C T I M E S T E P L O O P *****\n" . " !=================================================================\n" . " DO MIN_ADJ = FINAL_ELAPSED_MIN - TS_DYN, 0, -TS_DYN\n" . " \n" . " ! Compute & print time quantities at start of dyn step\n" . " CALL SET_CURRENT_TIME\n" . "\n" . " ! Set time variables for dynamic loop\n" . " !DAY = GET_DAY()\n" . " DAY_OF_YEAR = GET_DAY_OF_YEAR()\n" . " ELAPSED_SEC = GET_ELAPSED_SEC()\n" . " MONTH = GET_MONTH()\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . " YEAR = GET_YEAR()\n" . " SEASON = GET_SEASON()\n" . " \n" . " CALL MAKE_ADJOINT_CHKFILE( NYMD, NHMS, TAU )\n" . "\n" . " !============================================================\n" . " ! ***** R E A D M E T F I E L D S *****\n" . " !============================================================\n" . " ! If it is the first time through, we will use i6 field from the\n" . " ! forward calculation, and all we need to do is set NSECb_ADJ\n" . " IF ( FIRST ) THEN\n" . " \n" . " ! This only happens if stop time is a 6h interval, in which\n" . " ! case NSECb gets advanced 6hrs beyond what it actually was\n" . " ! last used as, so set it back here.\n" . " IF ( NSECb > GET_ELAPSED_SEC() ) THEN\n" . " NSECb = NSECb - 6 * 3600\n" . " WRITE(6,*) ' -- Pushing NSECb back by 6h '\n" . " ENDIF\n" . " \n" . " NSECb_ADJ = NSECb\n" . "\n" . " ! GET SLP1 and TROPP1 at the beginning of the last I-6 interval\n" . " I62_DATE = GET_TIME_BEHIND_ADJ(\n" . " & ( GET_ELAPSED_SEC() - NSECb ) / 60 )\n" . " \n" . " CALL OPEN_I6_FIELDS_ADJ( I62_DATE(1), I62_DATE(2) )\n" . " CALL GET_I6_FIELDS_2( I62_DATE(1), I62_DATE(2) )\n" . " \n" . " ! Now we don't reset this until after reading daily data\n" . " !FIRST = .FALSE.\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** R E A D I - 6 F I E L D S *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_I6_ADJ() ) THEN\n" . " \n" . " WRITE(6,*) ' ADJ: TIME FOR I-6 '\n" . " \n" . " !=================================================================\n" . " ! ***** C O P Y I - 6 F I E L D S *****\n" . " !\n" . " ! The I-6 fields at the beginning of the next ( forward )\n" . " ! timestep become the fields at the end of this timestep\n" . " !=================================================================\n" . " CALL COPY_I6_FIELDS\n" . " \n" . " ! Get the date/time for the previous I-6 data block\n" . " BEHIND_DATE = GET_I6_TIME_ADJ()\n" . "\n" . " ! Open and read files\n" . " CALL OPEN_I6_FIELDS_ADJ( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " CALL GET_I6_FIELDS_1( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " PRINT*,'I6 DATE = ',BEHIND_DATE(1),BEHIND_DATE(2)\n" . " \n" . " ! Compute avg pressure at polar caps (for ADJ argument is PS1, not PS2)\n" . " CALL AVGPOLE( PS1 )\n" . " \n" . " ! Set NSECb_ADJ to be used for the interpolation\n" . " ! where NSECb_ADJ is the total elapsed time in seconds at the\n" . " ! beginning of the current 6h time step which contains ELAPSED_MIN\n" . " NSECb_ADJ = ( MIN_ADJ + TS_DYN ) * 60 - 6 * 3600\n" . " \n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** R E A D A - 6 F I E L D S *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_A6_ADJ() ) THEN\n" . " \n" . " WRITE(6,*) ' ADJ: TIME FOR A-6 '\n" . " \n" . " ! Get the date/time for the previous A-6 data block\n" . " BEHIND_DATE = GET_A6_TIME_ADJ()\n" . " \n" . " ! Open and read files\n" . " CALL OPEN_A6_FIELDS_ADJ( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " CALL GET_A6_FIELDS( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " \n" . " ENDIF\n" . " \n" . " !==============================================================\n" . " ! ***** R E A D A - 3 F I E L D S *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_A3_ADJ() ) THEN\n" . " \n" . " WRITE(6,*) ' ADJ: TIME FOR A-3 '\n" . " \n" . " ! Get the date/time for the previous A-3 data block\n" . " BEHIND_DATE = GET_A3_TIME_ADJ()\n" . " \n" . " ! Open & read A-3 fields\n" . " CALL OPEN_A3_FIELDS_ADJ( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " CALL GET_A3_FIELDS( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " \n" . "#if defined( GEOS_3 )\n" . " !\n" . " IF ( LDUST ) THEN\n" . " CALL OPEN_GWET_FIELDS_ADJ( BEHIND_DATE(1), \n" . " & BEHIND_DATE(2) )\n" . " CALL GET_GWET_FIELDS( BEHIND_DATE(1), BEHIND_DATE(2) )\n" . " ENDIF\n" . "#endif\n" . " \n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** M O N T H L Y O R S E A S O N A L D A T A *****\n" . " !==============================================================\n" . "\n" . " ! UV albedoes\n" . " IF ( LCHEM .and. ITS_A_NEW_MONTH() ) THEN\n" . " CALL READ_UVALBEDO( MONTH )\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** D A I L Y D A T A *****\n" . " !\n" . " ! RDLAI returns today's leaf-area index\n" . " ! RDSOIL returns today's soil type information\n" . " !==============================================================\n" . " ! Read daily data at 11:30 p.m. on any new day, not counting the \n" . " ! \"first\" day of the adjoint integration, during which we can\n" . " ! still use values from the forward integration. \n" . " IF ( GET_NHMS() == 233000 .AND. ( .not. FIRST ) ) THEN\n" . "\n" . " ! Read leaf-area index (needed for drydep)\n" . " CALL RDLAI( DAY_OF_YEAR, MONTH )\n" . "\n" . " ! For MEGAN biogenics ...\n" . " IF ( LMEGAN ) THEN\n" . "\n" . " ! Read AVHRR daily leaf-area-index\n" . " CALL RDISOLAI( GET_DAY_OF_YEAR(), GET_MONTH() )\n" . "\n" . " ! Compute 15-day average temperature for MEGAN\n" . " CALL UPDATE_T_15_AVG\n" . " ENDIF\n" . " \n" . " ! Also read soil-type info for fullchem simulation\n" . " IF ( ITS_A_FULLCHEM_SIM() ) CALL RDSOIL \n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG ( '### MAIN: a DAILY DATA' )\n" . " ENDIF\n" . " \n" . " ! Reset first-time flag\n" . " IF ( FIRST ) FIRST = .FALSE.\n" . "\n" . " !==============================================================\n" . " ! ***** I N T E R P O L A T E Q U A N T I T I E S *****\n" . " !\n" . " ! Interpolate I-6 fields to current dynamic timestep,\n" . " ! based on their values at NSEC and NSEC+NTDT\n" . " !==============================================================\n" . " CALL INTERP_ADJ( NSECb_ADJ, GET_ELAPSED_SEC(), N_DYN )\n" . " \n" . " ! If we are not doing transport, then make sure that\n" . " ! the floating pressure is set to PSC2 (bdf, bmy, 8/22/02)\n" . " IF ( .not. LTRAN ) CALL SET_FLOATING_PRESSURE( PSC2 )\n" . " \n" . " ! Compute airmass quantities at each grid box\n" . " CALL AIRQNT\n" . " \n" . " ! (dkh, 11/07/05) \n" . " ! Compute the cosine of the solar zenith angle at each grid box\n" . " CALL COSSZA( GET_DAY_OF_YEAR(), GET_NHMSb(),\n" . " & GET_ELAPSED_SEC(), SUNCOS )\n" . " \n" . " ! For SMVGEAR II, we also need to compute SUNCOS at\n" . " ! the end of this chemistry timestep (bdf, bmy, 4/1/03)\n" . " IF ( LCHEM .and. ITS_A_FULLCHEM_SIM() ) THEN\n" . " CALL COSSZA( GET_DAY_OF_YEAR(), GET_NHMSb(),\n" . " & GET_ELAPSED_SEC()+GET_TS_CHEM()*60, SUNCOSB )\n" . " ENDIF \n" . "\n" . "#if defined( GEOS_3 )\n" . "\n" . " ! 1998 GEOS-3 carries the ground temperature and not the air\n" . " ! temperature -- thus TS will be 2-3 K too high. As a quick fix, \n" . " ! copy the temperature at the first sigma level into TS. \n" . " ! (mje, bnd, bmy, 7/3/01)\n" . " IF ( YEAR == 1998 ) STOP\n" . "#endif \n" . " \n" . " ! decrement elapsed time\n" . " CALL SET_ELAPSED_MIN_ADJ\n" . "\n" . " CALL SET_CURRENT_TIME\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . "\n" . " ! Initialize wet scavenging and wetdep fields after\n" . " ! the airmass quantities are reset after transport\n" . " IF ( LCONV .or. LWETD ) CALL INIT_WETSCAV_ADJ\n" . " \n" . " !==============================================================\n" . " ! ***** W E T D E P O S I T I O N (rainout + washout) *****\n" . " !==============================================================\n" . " IF ( LWETD .and. ITS_TIME_FOR_DYN() ) CALL DO_WETDEP_ADJ\n" . "\n" . " IF(LTRAN)THEN\n" . " CALL READ_PRESSURE_CHKFILE(NYMD, NHMS)\n" . " CALL SET_FLOATING_PRESSURE(TMP_PRESS(:,:))\n" . " ENDIF\n" . " \n" . " !===========================================================\n" . " ! ***** C H E M I S T R Y *****\n" . " !=========================================================== \n" . "\n" . " ! Every chemistry timestep...\n" . " IF ( ITS_TIME_FOR_CHEM() ) THEN \n" . "\n" . " CALL READ_CHEMISTRY_CHKFILE( NYMD, NHMS )\n" . "\n" . " ! Call the appropriate chemistry routine\n" . " CALL DO_CHEMISTRY_ADJ\n" . "\n" . " ENDIF \n" . "\n" . " !==============================================================\n" . " ! ***** U N I T C O N V E R S I O N ( v/v -> kg ) *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_UNIT() ) THEN\n" . " CALL CONVERT_UNITS( 2, N_TRACERS, TCVV, AD, STT_ADJ )\n" . " \n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CONVERT_UNITS:2' )\n" . " ENDIF\n" . "\n" . " !=====================================================\n" . " ! ***** CONVECTION ADJOINT *****\n" . " !=====================================================\n" . " IF ( ITS_TIME_FOR_CONV() ) THEN\n" . "\n" . " !===========================================================\n" . " ! ***** C L O U D C O N V E C T I O N *****\n" . " !===========================================================\n" . " IF ( LCONV ) THEN\n" . " \n" . " !--------------------------------------------------------------\n" . " ! ***** CHECKPOINTING EVERY DYNAMIC TIME STEP ***** \n" . " !--------------------------------------------------------------\n" . "\n" . " CALL READ_CONVECTION_CHKFILE( NYMD, NHMS )\n" . "\n" . " CALL DO_CONVECTION_ADJ\n" . "\n" . " ENDIF\n" . " \n" . " !===========================================================\n" . " ! ***** M I X E D L A Y E R M I X I N G *****\n" . " !===========================================================\n" . " CALL DO_PBL_MIX_ADJ( LTURB ) \n" . "\n" . " ENDIF \n" . "\n" . " !=====================================================\n" . " ! ***** TRANSPORT ADJOINT *****\n" . " !===================================================== \n" . "\n" . " !IF ( LUPBD ) CALL DO_UPBDFLX\n" . "\n" . " IF ( ITS_TIME_FOR_DYN() ) THEN\n" . "\n" . " ! Call the appropritate version of TPCORE\n" . " IF ( LTRAN ) CALL DO_TRANSPORT_ADJ\n" . " \n" . " ! Reset air mass quantities\n" . " CALL AIRQNT\n" . "\n" . " ! Repartition [NOy] species after transport\n" . " IF ( LUPBD .and. ITS_A_FULLCHEM_SIM() ) THEN\n" . " !CALL UPBDFLX_NOY_ADJ( 1 )\n" . " ENDIF\n" . "\n" . " ! Get relative humidity \n" . " ! (after recomputing pressure quantities)\n" . " CALL MAKE_RH \n" . "\n" . " ENDIF \n" . "\n" . " !==============================================================\n" . " ! ***** U N I T C O N V E R S I O N ( kg -> v/v ) *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_UNIT() ) THEN\n" . " CALL CONVERT_UNITS( 1, N_TRACERS, TCVV, AD, STT_ADJ )\n" . " \n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CONVERT_UNITS:1' )\n" . " ENDIF \n" . "\n" . " !==============================================================\n" . " ! ***** T E S T F O R E N D O F R U N *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_EXIT_ADJ() ) GOTO 9999\n" . "\n" . " ENDDO\n" . " \n" . " ENDDO \n" . "\n" . " !=================================================================\n" . " ! ***** C L E A N U P A N D Q U I T *****\n" . " !=================================================================\n" . " 9999 CONTINUE\n" . " \n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . "\n" . " !=================================================================\n" . "\n" . " CALL MAKE_ADJOINT_CHKFILE( NYMD, NHMS, TAU )\n" . " \n" . " STT = 0\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I,J,L,N )\n" . " \n" . " DO N = 1, 12\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " STT(I,J,L,N) = EMIS_ADJ(I,J,L,N)\n" . " END DO\n" . " END DO\n" . " END DO\n" . " END DO\n" . "!\$OMP END PARALLEL DO \n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I,J,L,N )\n" . " \n" . " DO N = 13, NCOEFF\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " STT(I,J,L,N) = DDEP_ADJ(I,J,L,N)\n" . " END DO\n" . " END DO\n" . " END DO\n" . " END DO\n" . "!\$OMP END PARALLEL DO \n" . "\n" . " CALL MAKE_CHEMISTRY_CHKFILE_P2( NYMD, NHMS, TAU )\n" . "\n" . " STT = 0\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I,J,L,N )\n" . " \n" . " DO N = 1, 35\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " STT(I,J,L,N) = EMIS_I_ADJ(I,J,L,N)\n" . " END DO\n" . " END DO\n" . " END DO\n" . " END DO\n" . "!\$OMP END PARALLEL DO \n" . "\n" . " CALL MAKE_CHEMISTRY_CHKFILE_P3( NYMD, NHMS, TAU )\n" . "\n" . " ! Print ending time of simulation\n" . " CALL DISPLAY_END_TIME\n" . "!\n" . "!******************************************************************************\n" . "! Internal procedures -- Use the F90 CONTAINS command to inline \n" . "! subroutines that only can be called from this main program. \n" . "!\n" . "! All variables referenced in the main program (local variables, F90 \n" . "! module variables, or common block variables) also have scope within \n" . "! internal subroutines. \n" . "!\n" . "! List of Internal Procedures:\n" . "! ============================================================================\n" . "! (1 ) DISPLAY_GRID_AND_MODEL : Displays resolution, data set, & start time\n" . "! (2 ) GET_NYMD_PHIS : Gets YYYYMMDD for the PHIS data field\n" . "! (3 ) DISPLAY_SIGMA_LAT_LON : Displays sigma, lat, and lon information\n" . "! (4 ) GET_WIND10M : Wrapper for MAKE_WIND10M (from \"dao_mod.f\")\n" . "! (5 ) CTM_FLUSH : Flushes diagnostic files to disk\n" . "! (6 ) DISPLAY_END_TIME : Displays ending time of simulation\n" . "! (7 ) MET_FIELD_DEBUG : Prints min and max of met fields for debug\n" . "!******************************************************************************\n" . "!\n" . " END SUBROUTINE DO_GC_BWD\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION ITS_TIME_FOR_I6_ADJ() RESULT( FLAG )\n" . "!\n" . "!******************************************************************************\n" . "! Function ITS_TIME_FOR_I6_ADJ returns TRUE if it is time to read in I-6\n" . "! (instantaneous 6-h fields) and FALSE otherwise. This happens when TIME_ADJ is\n" . "! at a 6h interval, which is equivalent to when ELAPSED_TIME+TS_DYN is at a \n" . "! 6h interval. (dkh, 8/25/04)\n" . "!\n" . "! NOTES:\n" . "! (1 ) Don't read in i6 fields when we are still within the last 6 h interval\n" . "! from the forward simulation, in which case just use the i6 fields that \n" . "! are already loaded. (dkh, 9/30/04)\n" . "! (2 ) FIXED BUG: Use EXTRA so that NHMS + (TS_DYN) is divisible by 6 h \n" . "!******************************************************************************\n" . "!\n" . " ! Reference to f90 modules\n" . " USE TIME_MOD, ONLY : GET_NHMS, GET_ELAPSED_SEC\n" . " USE ERROR_MOD, ONLY : ERROR_STOP\n" . " USE SUBDRIVER_FWD, ONLY : NSECb\n" . "\n" . " ! Function value\n" . " LOGICAL :: FLAG\n" . "\n" . " ! Local variable\n" . " INTEGER :: EXTRA \n" . "\n" . " !=================================================================\n" . " ! ITS_TIME_FOR_I6_ADJ begins here!\n" . " !=================================================================\n" . " IF ( GET_ELAPSED_SEC() >= NSECb ) THEN\n" . "\n" . " ! We can use I6 fields still loaded from forward run\n" . " FLAG = .FALSE.\n" . " \n" . " ! Echo this fact to the screen\n" . " WRITE(6,*) ' -- USE I6 FIELDS FROM FORWARD RUN '\n" . " \n" . " ELSE\n" . "\n" . " ! EXTRA set so that current NHMS + 1 dynamic time step is\n" . " ! divisible by 060000\n" . " ! Original, hardwired to 30 min dynamic time step\n" . " !EXTRA = 7000 \n" . " ! Qinbin's formula, assumes TS_DYN <= 60 min\n" . " EXTRA = 4000 + TS_DYN*100\n" . "\n" . " IF ( TS_DYN > 60 ) CALL ERROR_STOP( 'Invalid EXTRA!', \n" . " & 'ITS_TIME_FOR_I6_ADJ (adjoint.f)' ) \n" . "\n" . " ! We read in I-6 fields at 00, 06, 12, 18 GMT\n" . " FLAG = ( MOD( GET_NHMS() + EXTRA, 060000 ) == 0 )\n" . "\n" . " ENDIF \n" . "\n" . " ! Return to calling program\n" . " END FUNCTION ITS_TIME_FOR_I6_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION GET_I6_TIME_ADJ( ) RESULT( BEHIND_DATE )\n" . "!\n" . "!******************************************************************************\n" . "! Function GET_I6_TIME_ADJ returns the correct YYYYMMDD and HHMMSS values\n" . "! that are needed to read in the previous instantaneous 6-hour (I-6) fields.\n" . "! (dkh, 8/25/04)\n" . "!\n" . "! NOTES:\n" . "! This is only called if ITS_TIME_FOR_I6_ADJ is true\n" . "!******************************************************************************\n" . "!\n" . " ! Arguments\n" . " INTEGER :: BEHIND_DATE(2)\n" . "\n" . " !=================================================================\n" . " ! GET_I6_TIME_ADJ begins here!\n" . " !=================================================================\n" . "\n" . " ! We need to read in the I-6 fields 6h (360 mins) behind of TIME_ADJ\n" . " ! which is the same as 360 - TS_DYN behind ELAPSED_TIME \n" . " BEHIND_DATE = GET_TIME_BEHIND_ADJ( 360 - TS_DYN )\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION GET_I6_TIME_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION ITS_TIME_FOR_A6_ADJ() RESULT( FLAG )\n" . "!\n" . "!******************************************************************************\n" . "! Function ITS_TIME_FOR_A6_ADJ returns TRUE if it is time to read in I-A\n" . "! (average 6-h fields) and FALSE otherwise. This happens when TIME_ADJ is\n" . "! at a 6h interval (03, 09, 15,21), which is equivalent to when\n" . "! ELAPSED_TIME+TS_DYN is at a 6h interval. (dkh, 03/04/05) \n" . "!\n" . "! NOTES:\n" . "! (1 ) Don't read in A6 fields when we are still within the last 6 h interval\n" . "! from the forward simulation, in which case just use the A6 fields that\n" . "! are already loaded. NSECb is the total elapsed seconds at the last fwd\n" . "! I6 interval, so if we are more than 3 hr past this, can use A6 fields\n" . "! from forward run. (dkh, 03/04/05)\n" . "! \n" . "!******************************************************************************\n" . "!\n" . " ! Reference to f90 modules\n" . " USE TIME_MOD, ONLY : GET_NHMS, GET_ELAPSED_SEC\n" . " USE ERROR_MOD, ONLY : ERROR_STOP\n" . " USE SUBDRIVER_FWD, ONLY : NSECb\n" . "\n" . " ! Function value\n" . " LOGICAL :: FLAG\n" . "\n" . " ! Local variable\n" . " INTEGER :: EXTRA\n" . " INTEGER :: DATE(2)\n" . "\n" . " !=================================================================\n" . " ! ITS_TIME_FOR_A6_ADJ begins here!\n" . " !=================================================================\n" . "\n" . " IF ( GET_ELAPSED_SEC() >= NSECb + 3 * 3600 ) THEN\n" . "\n" . " ! We can use A6 fields still loaded from forward run\n" . " FLAG = .FALSE.\n" . "\n" . " ! Echo this fact to the screen\n" . " WRITE(6,*) ' -- USE A6 FIELDS FROM FORWARD RUN '\n" . "\n" . " ELSE\n" . "\n" . "#if defined( GEOS_4 ) && defined( A_LLK_03 )\n" . "\n" . " ! For GEOS-4 \"a_llk_03\" data, we need to read A-6 fields when it\n" . " ! is 00, 06, 12, 18 GMT. DATE is the current time -- test below.\n" . " DATE = GET_TIME_AHEAD( 0 )\n" . "\n" . "#else\n" . "\n" . " ! For GEOS-1, GEOS-S, GEOS-3, and GEOS-4 \"a_llk_04\" data,\n" . " ! we need to read A-6 fields when it is 03, 09, 15, 21 GMT.\n" . " ! DATE is the time 3 before now -- test below.\n" . " DATE = GET_TIME_BEHIND_ADJ( 180 )\n" . "\n" . "#endif\n" . " ! EXTRA set so that current NHMS + 1 dynamic time step is\n" . " ! divisible by 060000\n" . " ! Original formula, assumes dynamic time step is 30 min\n" . " ! EXTRA = 7000\n" . " ! Qinbin's formula, assumes dynamic time step <= 60\n" . " EXTRA = 4000 + TS_DYN * 100\n" . "\n" . " IF ( TS_DYN > 60 ) CALL ERROR_STOP( 'Invalid EXTRA!',\n" . " & 'ITS_TIME_FOR_A6_ADJ (adjoint.f)' )\n" . "\n" . " ! We read in A-6 fields at 03, 09, 15, 21 GMT\n" . " FLAG = ( MOD( DATE(2) + EXTRA, 060000 ) == 0 )\n" . "\n" . " ENDIF\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION ITS_TIME_FOR_A6_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION GET_A6_TIME_ADJ( ) RESULT( BEHIND_DATE )\n" . "!\n" . "!******************************************************************************\n" . "! Function GET_A6_TIME_ADJ returns the correct YYYYMMDD and HHMMSS values\n" . "! that are needed to read in the previous average 6-hour (A-6) fields.\n" . "! (dkh, 03/04/05)\n" . "!\n" . "! NOTES:\n" . "! (1 ) This is only called if ITS_TIME_FOR_A6_ADJ is true\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! Arguments\n" . " INTEGER :: BEHIND_DATE(2)\n" . "\n" . " !=================================================================\n" . " ! GET_A6_TIME_ADJ begins here!\n" . " !=================================================================\n" . "\n" . " ! Return the time 3h (180m) before now, since there is a 3-hour\n" . " ! offset between the actual time when the A-6 fields are read\n" . " ! and the time that the A-6 fields are stamped with. Also apply\n" . " ! offset of TS_DYN. \n" . " BEHIND_DATE = GET_TIME_BEHIND_ADJ( 180 - TS_DYN )\n" . " !BEHIND_DATE = GET_TIME_BEHIND_ADJ( - TS_DYN )\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION GET_A6_TIME_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION ITS_TIME_FOR_A3_ADJ() RESULT( FLAG )\n" . "!\n" . "!******************************************************************************\n" . "! Function ITS_TIME_FOR_A3_ADJ returns TRUE if it is time to read in A-3\n" . "! (average 3-h fields) and FALSE otherwise. This happens when TIME_ADJ is\n" . "! at a 3h interval, which is equivalent to when\n" . "! ELAPSED_TIME+TS_DYN is at a 3h interval. (dkh, 03/04/05)\n" . "!\n" . "! NOTES:\n" . "! (1 ) Don't read in 3 fields when we are still within the last 3 h interval\n" . "! from the forward simulation, in which case just use the A3 fields that\n" . "! are already loaded. NSECb is the total elapsed seconds at the last fwd\n" . "! I6 interval, so if we are more than 3 hr past this, can use A3 fields\n" . "! from forward run. (dkh, 03/04/05)\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! Reference to f90 modules\n" . " USE TIME_MOD, ONLY : GET_NHMS, GET_ELAPSED_SEC\n" . " USE ERROR_MOD, ONLY : ERROR_STOP\n" . " USE SUBDRIVER_FWD, ONLY : NSECb\n" . "\n" . " ! Function value\n" . " LOGICAL :: FLAG\n" . "\n" . " ! Local variable\n" . " INTEGER :: EXTRA\n" . "\n" . " !=================================================================\n" . " ! ITS_TIME_FOR_A3_ADJ begins here!\n" . " !=================================================================\n" . "\n" . " IF ( GET_ELAPSED_SEC() >= NSECb + 3 * 3600 ) THEN\n" . " !IF ( GET_ELAPSED_SEC() >= NSECb + 3 * 3600 + 30*60 ) THEN\n" . "\n" . " ! We can use A3 fields still loaded from forward run\n" . " FLAG = .FALSE.\n" . "\n" . " ! Echo this fact to the screen\n" . " WRITE(6,*) ' -- USE A3 FIELDS FROM FORWARD RUN '\n" . "\n" . " ELSE\n" . " ! EXTRA set so that current NHMS + 1 dynamic time step is\n" . " ! divisible by 030000\n" . " ! Original formula, assumes dynamic time step is 30 min\n" . " !EXTRA = 7000\n" . " ! Qinbin's formula, assumes dynamic time step <= 60 min\n" . " EXTRA = 4000 + TS_DYN * 100\n" . "\n" . " IF ( TS_DYN > 30 ) CALL ERROR_STOP( 'Invalid EXTRA!',\n" . " & 'ITS_TIME_FOR_A3_ADJ (adjoint.f)' )\n" . "\n" . " ! We read in A-3 every 3 hours\n" . " FLAG = ( MOD( GET_NHMS() + EXTRA, 030000 ) == 0 )\n" . "\n" . " ENDIF\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION ITS_TIME_FOR_A3_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION GET_A3_TIME_ADJ( ) RESULT( BEHIND_DATE )\n" . "!\n" . "!******************************************************************************\n" . "! Function GET_A3_TIME_ADJ returns the correct YYYYMMDD and HHMMSS values\n" . "! that are needed to read in the previous average 3-hour (A-3) fields.\n" . "! (dkh, 03/04/05)\n" . "!\n" . "! NOTES:\n" . "! (1 ) This is only called if ITS_TIME_FOR_A3_ADJ is true\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! Arguments\n" . " INTEGER :: BEHIND_DATE(2)\n" . "\n" . " !=================================================================\n" . " ! GET_A3_TIME_ADJ begins here!\n" . " !=================================================================\n" . "\n" . "#if defined( GEOS_4 )\n" . "\n" . " ! For GEOS-4/fvDAS, the A-3 fields are timestamped by center time.\n" . " ! Therefore, the difference between the actual time when the fields\n" . " ! are read and the A-3 timestamp time is 90 minutes.\n" . " BEHIND_DATE = GET_TIME_BEHIND_ADJ( 90 - TS_DYN )\n" . "\n" . "#else\n" . "\n" . " ! For GEOS-1, GEOS-STRAT, GEOS-3, the A-3 fields are timestamped\n" . " ! by ending time. Therefore, the difference between the actual time\n" . " ! when the fields are read and the A-3 timestamp time is 180 minutes.\n" . " !BEHIND_DATE = GET_TIME_BEHIND_ADJ( 180 - TS_DYN )\n" . " BEHIND_DATE = GET_TIME_BEHIND_ADJ( - TS_DYN )\n" . "\n" . "#endif\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION GET_A3_TIME_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " FUNCTION GET_TIME_BEHIND_ADJ( N_MINS ) RESULT( DATE )\n" . "!\n" . "!******************************************************************************\n" . "! Function GET_TIME_BEHIND_ADJ returns to the calling program a 2-element vector\n" . "! containing the YYYYMMDD and HHMMSS values at the current time minus N_MINS\n" . "! minutes. (dkh, 8/25/04)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) N_MINS (INTEGER) : Minutes ahead of time to compute YYYYMMDD,HHMMSS\n" . "!\n" . "! NOTES:\n" . "! \n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE TIME_MOD, ONLY : GET_JD, GET_NYMD, GET_NHMS\n" . " USE JULDAY_MOD, ONLY : CALDATE\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: N_MINS\n" . "\n" . " ! Local variables\n" . " INTEGER :: DATE(2)\n" . " REAL*8 :: JD\n" . "\n" . " !=================================================================\n" . " ! GET_TIME_BEHIND_ADJ begins here!\n" . " !=================================================================\n" . "\n" . " ! Astronomical Julian Date at current time - N_MINS\n" . " JD = GET_JD( GET_NYMD(), GET_NHMS() ) - ( N_MINS / 1440d0 )\n" . "\n" . " ! Call CALDATE to compute the current YYYYMMDD and HHMMSS\n" . " CALL CALDATE( JD, DATE(1), DATE(2) )\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION GET_TIME_BEHIND_ADJ\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE DISPLAY_GRID_AND_MODEL\n" . "\n" . " !=================================================================\n" . " ! Internal Subroutine DISPLAY_GRID_AND_MODEL displays the \n" . " ! appropriate messages for the given model grid and machine type.\n" . " ! It also prints the starting time and date (local time) of the\n" . " ! GEOS-CHEM simulation. (bmy, 12/2/03, 10/18/05)\n" . " !=================================================================\n" . "\n" . " ! For system time stamp\n" . " CHARACTER(LEN=16) :: STAMP\n" . "\n" . " !-----------------------\n" . " ! Print resolution info\n" . " !-----------------------\n" . "#if defined( GRID4x5 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) //\n" . " & ' S T A R T I N G 4 x 5 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID2x25 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 2 x 2.5 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID1x125 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 1 x 1.25 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID1x1 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 1 x 1 G E O S -- C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! Print machine info\n" . " !-----------------------\n" . "\n" . " ! Get the proper FORMAT statement for the model being used\n" . "#if defined( COMPAQ )\n" . " WRITE( 6, '(a)' ) 'Created w/ HP/COMPAQ Alpha compiler'\n" . "#elif defined( IBM_AIX )\n" . " WRITE( 6, '(a)' ) 'Created w/ IBM-AIX compiler'\n" . "#elif defined( LINUX_PGI )\n" . " WRITE( 6, '(a)' ) 'Created w/ LINUX/PGI compiler'\n" . "#elif defined( LINUX_IFORT )\n" . " WRITE( 6, '(a)' ) 'Created w/ LINUX/IFORT (64-bit) compiler'\n" . "#elif defined( SGI_MIPS )\n" . " WRITE( 6, '(a)' ) 'Created w/ SGI MIPSpro compiler'\n" . "#elif defined( SPARC )\n" . " WRITE( 6, '(a)' ) 'Created w/ Sun/SPARC compiler'\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! Print met field info\n" . " !-----------------------\n" . "#if defined( GEOS_3 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-3 met fields'\n" . "#elif defined( GEOS_4 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-4/fvDAS met fields'\n" . "#elif defined( GEOS_5 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-5/fvDAS met fields'\n" . "#elif defined( GCAP )\n" . " WRITE( 6, '(a)' ) 'Using GCAP/GISS met fields'\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! System time stamp\n" . " !-----------------------\n" . " STAMP = SYSTEM_TIMESTAMP()\n" . " WRITE( 6, 100 ) STAMP\n" . " 100 FORMAT( /, '===> SIMULATION START TIME: ', a, ' <===', / )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE DISPLAY_GRID_AND_MODEL\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " FUNCTION ITS_TIME_FOR_BPCH() RESULT( DO_BPCH )\n" . "\n" . " !=================================================================\n" . " ! Internal function ITS_TIME_FOR_BPCH returns TRUE if it is time\n" . " ! to write to the binary punch file and FALSE otherwise.\n" . " !=================================================================\n" . "\n" . " ! Local variables\n" . " INTEGER :: TODAY, THIS_NJDAY, NHMS, NDIAGTIME\n" . " \n" . " ! Function value\n" . " LOGICAL :: DO_BPCH\n" . "\n" . " !=================================================================\n" . " ! ITS_TIME_FOR_BPCH begins here!\n" . " !================================================================= \n" . " \n" . " ! Return FALSE if it's the first timestep\n" . " IF ( GET_TAU() == GET_TAUb() ) THEN\n" . " DO_BPCH = .FALSE.\n" . " RETURN\n" . " ENDIF\n" . "\n" . " ! Current day of year\n" . " TODAY = GET_DAY_OF_YEAR()\n" . "\n" . " ! Current time of day\n" . " NHMS = GET_NHMS()\n" . "\n" . " ! Time of day to write bpch files to disk\n" . " NDIAGTIME = GET_NDIAGTIME()\n" . "\n" . " ! Look up appropriate value of NJDAY array. We may need to add a\n" . " ! day to skip past the Feb 29 element of NJDAY for non-leap-years.\n" . " IF ( .not. ITS_A_LEAPYEAR( FORCE=.TRUE. ) .and. TODAY > 59 ) THEN\n" . " THIS_NJDAY = NJDAY( TODAY + 1 ) \n" . " ELSE\n" . " THIS_NJDAY = NJDAY( TODAY )\n" . " ENDIF\n" . "\n" . " ! Test if this is the day & time to write to the BPCH file!\n" . " IF ( ( THIS_NJDAY > 0 ) .and. NHMS == NDIAGTIME ) THEN\n" . " DO_BPCH = .TRUE.\n" . " ELSE\n" . " DO_BPCH = .FALSE.\n" . " ENDIF\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION ITS_TIME_FOR_BPCH\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE CTM_FLUSH\n" . "\n" . " !================================================================\n" . " ! Internal subroutine CTM_FLUSH flushes certain diagnostic\n" . " ! file buffers to disk. (bmy, 8/31/00, 7/1/02)\n" . " !\n" . " ! CTM_FLUSH should normally be called after each diagnostic \n" . " ! output, so that in case the run dies, the output files from \n" . " ! the last diagnostic timestep will not be lost. \n" . " !\n" . " ! FLUSH is an intrinsic FORTRAN subroutine and takes as input \n" . " ! the unit number of the file to be flushed to disk.\n" . " !================================================================\n" . " CALL FLUSH( IU_ND48 ) \n" . " CALL FLUSH( IU_BPCH ) \n" . " CALL FLUSH( IU_SMV2LOG ) \n" . " CALL FLUSH( IU_DEBUG ) \n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE CTM_FLUSH\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE DISPLAY_END_TIME\n" . "\n" . " !=================================================================\n" . " ! Internal subroutine DISPLAY_END_TIME prints the ending time of\n" . " ! the GEOS-CHEM simulation (bmy, 5/3/05)\n" . " !=================================================================\n" . "\n" . " ! Local variables\n" . " CHARACTER(LEN=16) :: STAMP\n" . "\n" . " ! Print system time stamp\n" . " STAMP = SYSTEM_TIMESTAMP()\n" . " WRITE( 6, 100 ) STAMP\n" . " 100 FORMAT( /, '===> SIMULATION END TIME: ', a, ' <===', / )\n" . "\n" . " ! Echo info\n" . " WRITE ( 6, 3000 ) \n" . " 3000 FORMAT\n" . " & ( /, '************** E N D O F G E O S -- C H E M ',\n" . " & '**************' )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE DISPLAY_END_TIME\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MET_FIELD_DEBUG\n" . "\n" . " !=================================================================\n" . " ! Internal subroutine MET_FIELD_DEBUG prints out the maximum\n" . " ! and minimum, and sum of DAO met fields for debugging \n" . " !=================================================================\n" . "\n" . " ! References to F90 modules\n" . " USE DAO_MOD, ONLY : AD, AIRDEN, AIRVOL, ALBD1, ALBD2\n" . " USE DAO_MOD, ONLY : ALBD, AVGW, BXHEIGHT, CLDFRC, CLDF \n" . " USE DAO_MOD, ONLY : CLDMAS, CLDTOPS, DELP \n" . " USE DAO_MOD, ONLY : DTRAIN, GWETTOP, HFLUX, HKBETA, HKETA \n" . " USE DAO_MOD, ONLY : LWI, MOISTQ, OPTD, OPTDEP, PBL \n" . " USE DAO_MOD, ONLY : PREACC, PRECON, PS1, PS2, PSC2 \n" . " USE DAO_MOD, ONLY : RADLWG, RADSWG, RH, SLP, SNOW \n" . " USE DAO_MOD, ONLY : SPHU1, SPHU2, SPHU, SUNCOS, SUNCOSB \n" . " USE DAO_MOD, ONLY : TMPU1, TMPU2, T, TROPP, TS \n" . " USE DAO_MOD, ONLY : TSKIN, U10M, USTAR, UWND1, UWND2 \n" . " USE DAO_MOD, ONLY : UWND, V10M, VWND1, VWND2, VWND \n" . " USE DAO_MOD, ONLY : Z0, ZMEU, ZMMD, ZMMU \n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, L, IJ\n" . "\n" . " !=================================================================\n" . " ! MET_FIELD_DEBUG begins here!\n" . " !=================================================================\n" . "\n" . " ! Define box to print out\n" . " I = 23\n" . " J = 34\n" . " L = 1\n" . " IJ = ( ( J-1 ) * IIPAR ) + I\n" . "\n" . " !=================================================================\n" . " ! Print out met fields at (I,J,L)\n" . " !=================================================================\n" . " IF ( ALLOCATED( AD ) ) PRINT*, 'AD : ', AD(I,J,L) \n" . " IF ( ALLOCATED( AIRDEN ) ) PRINT*, 'AIRDEN : ', AIRDEN(L,I,J) \n" . " IF ( ALLOCATED( AIRVOL ) ) PRINT*, 'AIRVOL : ', AIRVOL(I,J,L) \n" . " IF ( ALLOCATED( ALBD1 ) ) PRINT*, 'ALBD1 : ', ALBD1(I,J) \n" . " IF ( ALLOCATED( ALBD2 ) ) PRINT*, 'ALBD2 : ', ALBD2(I,J) \n" . " IF ( ALLOCATED( ALBD ) ) PRINT*, 'ALBD : ', ALBD(I,J) \n" . " IF ( ALLOCATED( AVGW ) ) PRINT*, 'AVGW : ', AVGW(I,J,L) \n" . " IF ( ALLOCATED( BXHEIGHT ) ) PRINT*, 'BXHEIGHT: ', BXHEIGHT(I,J,L) \n" . " IF ( ALLOCATED( CLDFRC ) ) PRINT*, 'CLDFRC : ', CLDFRC(I,J)\n" . " IF ( ALLOCATED( CLDF ) ) PRINT*, 'CLDF : ', CLDF(L,I,J) \n" . " IF ( ALLOCATED( CLDMAS ) ) PRINT*, 'CLDMAS : ', CLDMAS(I,J,L) \n" . " IF ( ALLOCATED( CLDTOPS ) ) PRINT*, 'CLDTOPS : ', CLDTOPS(I,J) \n" . " IF ( ALLOCATED( DELP ) ) PRINT*, 'DELP : ', DELP(L,I,J) \n" . " IF ( ALLOCATED( DTRAIN ) ) PRINT*, 'DTRAIN : ', DTRAIN(I,J,L) \n" . " IF ( ALLOCATED( GWETTOP ) ) PRINT*, 'GWETTOP : ', GWETTOP(I,J) \n" . " IF ( ALLOCATED( HFLUX ) ) PRINT*, 'HFLUX : ', HFLUX(I,J) \n" . " IF ( ALLOCATED( HKBETA ) ) PRINT*, 'HKBETA : ', HKBETA(I,J,L) \n" . " IF ( ALLOCATED( HKETA ) ) PRINT*, 'HKETA : ', HKETA(I,J,L) \n" . " IF ( ALLOCATED( LWI ) ) PRINT*, 'LWI : ', LWI(I,J) \n" . " IF ( ALLOCATED( MOISTQ ) ) PRINT*, 'MOISTQ : ', MOISTQ(L,I,J) \n" . " IF ( ALLOCATED( OPTD ) ) PRINT*, 'OPTD : ', OPTD(L,I,J) \n" . " IF ( ALLOCATED( OPTDEP ) ) PRINT*, 'OPTDEP : ', OPTDEP(L,I,J) \n" . " IF ( ALLOCATED( PBL ) ) PRINT*, 'PBL : ', PBL(I,J) \n" . " IF ( ALLOCATED( PREACC ) ) PRINT*, 'PREACC : ', PREACC(I,J) \n" . " IF ( ALLOCATED( PRECON ) ) PRINT*, 'PRECON : ', PRECON(I,J) \n" . " IF ( ALLOCATED( PS1 ) ) PRINT*, 'PS1 : ', PS1(I,J) \n" . " IF ( ALLOCATED( PS2 ) ) PRINT*, 'PS2 : ', PS2(I,J) \n" . " IF ( ALLOCATED( PSC2 ) ) PRINT*, 'PSC2 : ', PSC2(I,J)\n" . " IF ( ALLOCATED( RADLWG ) ) PRINT*, 'RADLWG : ', RADLWG(I,J)\n" . " IF ( ALLOCATED( RADSWG ) ) PRINT*, 'RADSWG : ', RADSWG(I,J)\n" . " IF ( ALLOCATED( RH ) ) PRINT*, 'RH : ', RH(I,J,L) \n" . " IF ( ALLOCATED( SLP ) ) PRINT*, 'SLP : ', SLP(I,J) \n" . " IF ( ALLOCATED( SNOW ) ) PRINT*, 'SNOW : ', SNOW(I,J) \n" . " IF ( ALLOCATED( SPHU1 ) ) PRINT*, 'SPHU1 : ', SPHU1(I,J,L) \n" . " IF ( ALLOCATED( SPHU2 ) ) PRINT*, 'SPHU2 : ', SPHU2(I,J,L) \n" . " IF ( ALLOCATED( SPHU ) ) PRINT*, 'SPHU : ', SPHU(I,J,L) \n" . " IF ( ALLOCATED( SUNCOS ) ) PRINT*, 'SUNCOS : ', SUNCOS(IJ) \n" . " IF ( ALLOCATED( SUNCOSB ) ) PRINT*, 'SUNCOSB : ', SUNCOSB(IJ) \n" . " IF ( ALLOCATED( TMPU1 ) ) PRINT*, 'TMPU1 : ', TMPU1(I,J,L) \n" . " IF ( ALLOCATED( TMPU2 ) ) PRINT*, 'TMPU2 : ', TMPU2(I,J,L) \n" . " IF ( ALLOCATED( T ) ) PRINT*, 'TMPU : ', T(I,J,L)\n" . " IF ( ALLOCATED( TROPP ) ) PRINT*, 'TROPP : ', TROPP(I,J) \n" . " IF ( ALLOCATED( TS ) ) PRINT*, 'TS : ', TS(I,J) \n" . " IF ( ALLOCATED( TSKIN ) ) PRINT*, 'TSKIN : ', TSKIN(I,J) \n" . " IF ( ALLOCATED( U10M ) ) PRINT*, 'U10M : ', U10M(I,J) \n" . " IF ( ALLOCATED( USTAR ) ) PRINT*, 'USTAR : ', USTAR(I,J) \n" . " IF ( ALLOCATED( UWND1 ) ) PRINT*, 'UWND1 : ', UWND1(I,J,L) \n" . " IF ( ALLOCATED( UWND2 ) ) PRINT*, 'UWND2 : ', UWND2(I,J,L) \n" . " IF ( ALLOCATED( UWND ) ) PRINT*, 'UWND : ', UWND(I,J,L) \n" . " IF ( ALLOCATED( V10M ) ) PRINT*, 'V10M : ', V10M(I,J) \n" . " IF ( ALLOCATED( VWND1 ) ) PRINT*, 'VWND1 : ', VWND1(I,J,L) \n" . " IF ( ALLOCATED( VWND2 ) ) PRINT*, 'VWND2 : ', VWND2(I,J,L) \n" . " IF ( ALLOCATED( VWND ) ) PRINT*, 'VWND : ', VWND(I,J,L) \n" . " IF ( ALLOCATED( Z0 ) ) PRINT*, 'Z0 : ', Z0(I,J) \n" . " IF ( ALLOCATED( ZMEU ) ) PRINT*, 'ZMEU : ', ZMEU(I,J,L) \n" . " IF ( ALLOCATED( ZMMD ) ) PRINT*, 'ZMMD : ', ZMMD(I,J,L) \n" . " IF ( ALLOCATED( ZMMU ) ) PRINT*, 'ZMMU : ', ZMMU(I,J,L) \n" . "\n" . " ! Flush the output buffer\n" . " CALL FLUSH( 6 )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE MET_FIELD_DEBUG\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " ! End of program\n" . " END MODULE SUBDRIVER_BWD\n" . "\n"; close(FILE); } #============================================= # Create subdriver_fwd_4d.f #============================================= sub createSubdriverFwd4d() { printf "Creating subdriver_fwd_4d.f\n"; open(FILE, ">subdriver_fwd_4d.f") || die "Unable to open subdriver_fwd_4d.f"; print FILE "\n" . "! =============================================================\n" . "! subdriver_fwd_fd.f, 2008/24/01 Kumaresh \$\n" . "! Forward finite-difference driver is a modified version of\n" . "! main driver for GEOS-Chem to carryout finite difference tests\n" . "! =============================================================\n" . "!\n" . "! \$Id: main.f,v 1.42 2006/10/17 17:51:14 bmy Exp \$\n" . "! \$Log: main.f,v \$\n" . "! Revision 1.42 2006/10/17 17:51:14 bmy\n" . "! GEOS-Chem v7-04-10, includes the following modifications:\n" . "! - Includes variable tropopause with ND54 diagnostic\n" . "! - Added GFED2 biomass emissions for SO2, NH3, BC, OC, CO2\n" . "! - Rewrote default biomass emissions routines for clarity\n" . "! - Updates for GCAP: future emissions, met-field reading, TOMS-O3\n" . "! - Bug fix in planeflight_mod.f: set NCS variable correctly\n" . "! - Bug fix in SOA_LUMP; other minor bug fixes\n" . "!\n" . "! GEOS-Chem v7-04-09, includes the following modifications:\n" . "! - Updated CO for David Streets (2001 for China, 2000 elsewhere)\n" . "! - Now reset negative SPHU to a very small positive #\n" . "! - Remove use of TINY(1d0) to avoid NaN's on SUN platform\n" . "! - Minor bug fixes and deleted obsolete code\n" . "!\n" . "! Revision 1.38 2006/08/14 17:58:10 bmy\n" . "! GEOS-Chem v7-04-08, includes the following modifications:\n" . "! - Now add David Streets' emissions for China & SE Asia\n" . "! - Removed support for GEOS-1 and GEOS-STRAT met fields\n" . "! - Removed support for LINUX_IFC and LINUX_EFC compilers\n" . "!\n" . "! Revision 1.37 2006/06/28 17:26:52 bmy\n" . "! GEOS-Chem v7-04-06, includes the following modifications:\n" . "! - Now add BRAVO emissions (NOx, CO, SO2) over N. Mexico\n" . "! - Turn off HO2 uptake by aerosols in SMVGEAR mechanism\n" . "! - Bug fix: GEOS-4 convection now conserves mixing ratio\n" . "! - Other minor bug fixes & improvements\n" . "!\n" . "! Revision 1.36 2006/06/06 14:26:07 bmy\n" . "! GEOS-Chem v7-04-05, includes the following modifications:\n" . "! - Now gets ISOP that has reacted w/ OH from SMVGEAR (cf. D. Henze)\n" . "! - Incorporated IPCC future emission scale factors (cf. S. Wu)\n" . "! - Other minor bug fixes\n" . "!\n" . "! Revision 1.35 2006/05/26 17:45:24 bmy\n" . "! GEOS-Chem v7-04-04, includes the following modifications:\n" . "! - Now updated for SOA production from ISOP (cf D. Henze)\n" . "! - Now archive SOA concentrations in [ug/m3] (\"diag42_mod.f\")\n" . "! - Other minor bug fixes\n" . "!\n" . "! Revision 1.34 2006/05/15 17:52:52 bmy\n" . "! GEOS-Chem v7-04-03, includes the following modifications:\n" . "! - Added near-land formulation for lightning\n" . "! - Now can use CTH, MFLUX, PRECON params for lightning\n" . "! (NOTE: new lightning is only applied for GEOS-4 for time being)\n" . "! - Added ND56 diagnostic for lightning flash rates\n" . "! - Fixed Feb 28 -> Mar 1 transition for GCAP (i.e. no leap years)\n" . "! - Other minor bug fixes\n" . "!\n" . "! Revision 1.33 2006/03/24 20:22:53 bmy\n" . "! GEOS-CHEM v7-04-01, includes the following modifications:\n" . "! - Updates to new Hg simulation (eck, cdh, sas)\n" . "! - Changed Reynold's # criterion for aerodyn smooth surfaces in drydep\n" . "! - Standardized several bug fixes implemented in v7-03-06 patch\n" . "! - Bug fix: Now call MAKE_RH from \"main.f\" to avoid problems in drydep\n" . "! - Removed obsolete code\n" . "!\n" . " MODULE SUBDRIVER_FWD\n" . "! \n" . "!******************************************************************************\n" . "! \n" . "! \n" . "! GGGGGG EEEEEEE OOOOO SSSSSSS CCCCCC H H EEEEEEE M M \n" . "! G E O O S C H H E M M M M \n" . "! G GGG EEEEEE O O SSSSSSS C HHHHHHH EEEEEE M M M \n" . "! G G E O O S C H H E M M \n" . "! GGGGGG EEEEEEE OOOOO SSSSSSS CCCCCC H H EEEEEEE M M \n" . "! \n" . "! \n" . "! (formerly known as the Harvard-GEOS model)\n" . "! for 4 x 5, 2 x 2.5 global grids and 1 x 1 nested grids\n" . "!\n" . "! Contact: Bob Yantosca, Harvard University (bmy.as.harvard.edu)\n" . "! \n" . "!******************************************************************************\n" . "!\n" . "! See the GEOS-Chem Web Site:\n" . "!\n" . "! http://www.as.harvard.edu/chemistry/trop/geos/\n" . "!\n" . "! and the GEOS-CHEM User's Guide:\n" . "!\n" . "! http://www.as.harvard.edu/chemistry/trop/geos/doc/man/\n" . "!\n" . "! for the most up-to-date GEOS-CHEM documentation on the following topics:\n" . "!\n" . "! - installation, compilation, and execution\n" . "! - coding practice and style\n" . "! - input files and met field data files\n" . "! - horizontal and vertical resolution\n" . "! - modification history\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules \n" . " USE A3_READ_MOD, ONLY : GET_A3_FIELDS\n" . " USE A3_READ_MOD, ONLY : OPEN_A3_FIELDS\n" . " USE A3_READ_MOD, ONLY : UNZIP_A3_FIELDS\n" . " USE A6_READ_MOD, ONLY : GET_A6_FIELDS\n" . " USE A6_READ_MOD, ONLY : OPEN_A6_FIELDS\n" . " USE A6_READ_MOD, ONLY : UNZIP_A6_FIELDS\n" . " USE CHECKPOINT_MOD \n" . " USE CHEMISTRY_MOD, ONLY : DO_CHEMISTRY\n" . " USE BENCHMARK_MOD, ONLY : STDRUN\n" . " USE CONVECTION_MOD, ONLY : DO_CONVECTION\n" . " USE COMODE_MOD, ONLY : INIT_COMODE, CSPEC, IXSAVE, IYSAVE, \n" . " & IZSAVE\n" . " USE DIAG_MOD, ONLY : DIAGCHLORO\n" . " USE DIAG41_MOD, ONLY : DIAG41, ND41\n" . " USE DIAG42_MOD, ONLY : DIAG42, ND42\n" . " USE DIAG48_MOD, ONLY : DIAG48, ITS_TIME_FOR_DIAG48\n" . " USE DIAG49_MOD, ONLY : DIAG49, ITS_TIME_FOR_DIAG49\n" . " USE DIAG50_MOD, ONLY : DIAG50, DO_SAVE_DIAG50\n" . " USE DIAG51_MOD, ONLY : DIAG51, DO_SAVE_DIAG51\n" . " USE DIAG_OH_MOD, ONLY : PRINT_DIAG_OH\n" . " USE DAO_MOD, ONLY : AD, AIRQNT \n" . " USE DAO_MOD, ONLY : AVGPOLE, CLDTOPS\n" . " USE DAO_MOD, ONLY : CONVERT_UNITS, COPY_I6_FIELDS\n" . " USE DAO_MOD, ONLY : COSSZA, INIT_DAO\n" . " USE DAO_MOD, ONLY : INTERP, PS1\n" . " USE DAO_MOD, ONLY : PS2, PSC2 \n" . " USE DAO_MOD, ONLY : T, TS \n" . " USE DAO_MOD, ONLY : SUNCOS, SUNCOSB\n" . " USE DAO_MOD, ONLY : MAKE_RH\n" . " USE DRYDEP_MOD, ONLY : DO_DRYDEP\n" . " USE EMISSIONS_MOD, ONLY : DO_EMISSIONS\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_BPCH, IU_DEBUG\n" . " USE FILE_MOD, ONLY : IU_ND48, IU_SMV2LOG \n" . " USE FILE_MOD, ONLY : CLOSE_FILES\n" . " USE GLOBAL_CH4_MOD, ONLY : INIT_GLOBAL_CH4, CH4_AVGTP\n" . " USE GCAP_READ_MOD, ONLY : GET_GCAP_FIELDS\n" . " USE GCAP_READ_MOD, ONLY : OPEN_GCAP_FIELDS\n" . " USE GCAP_READ_MOD, ONLY : UNZIP_GCAP_FIELDS\n" . " USE GWET_READ_MOD, ONLY : GET_GWET_FIELDS\n" . " USE GWET_READ_MOD, ONLY : OPEN_GWET_FIELDS\n" . " USE GWET_READ_MOD, ONLY : UNZIP_GWET_FIELDS\n" . " USE I6_READ_MOD, ONLY : GET_I6_FIELDS_1\n" . " USE I6_READ_MOD, ONLY : GET_I6_FIELDS_2\n" . " USE I6_READ_MOD, ONLY : OPEN_I6_FIELDS\n" . " USE I6_READ_MOD, ONLY : UNZIP_I6_FIELDS\n" . " USE INPUT_MOD, ONLY : READ_INPUT_FILE\n" . " USE LAI_MOD, ONLY : RDISOLAI\n" . " USE LIGHTNING_NOX_MOD, ONLY : LIGHTNING\n" . " !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " !%%% NOTE: Temporary kludge: For GEOS-4 we want to use the new near-land\n" . " !%%% lightning formulation. But for the time being, we must keep the \n" . " !%%% existing lightning for other met field types. (ltm, bmy, 5/10/06)\n" . " USE LIGHTNING_NOX_NL_MOD, ONLY : LIGHTNING_NL\n" . " !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " USE LOGICAL_MOD, ONLY : LEMIS, LCHEM, LUNZIP, LDUST\n" . " USE LOGICAL_MOD, ONLY : LLIGHTNOX, LPRT, LSTDRUN, LSVGLB\n" . " USE LOGICAL_MOD, ONLY : LWAIT, LTRAN, LUPBD, LCONV\n" . " USE LOGICAL_MOD, ONLY : LWETD, LTURB, LDRYD, LMEGAN \n" . " USE LOGICAL_MOD, ONLY : LDYNOCEAN, LSOA, LVARTROP\n" . " USE LOGICAL_MOD, ONLY : LSULF, LCARB, LSSALT\n" . " USE MEGAN_MOD, ONLY : INIT_MEGAN\n" . " USE MEGAN_MOD, ONLY : UPDATE_T_15_AVG\n" . " USE MEGAN_MOD, ONLY : UPDATE_T_DAY\n" . " USE PBL_MIX_MOD, ONLY : DO_PBL_MIX\n" . " USE OCEAN_MERCURY_MOD, ONLY : MAKE_OCEAN_Hg_RESTART\n" . " USE OCEAN_MERCURY_MOD, ONLY : READ_OCEAN_Hg_RESTART\n" . " USE PLANEFLIGHT_MOD, ONLY : PLANEFLIGHT\n" . " USE PLANEFLIGHT_MOD, ONLY : SETUP_PLANEFLIGHT \n" . " USE PRESSURE_MOD, ONLY : INIT_PRESSURE\n" . " USE PRESSURE_MOD, ONLY : SET_FLOATING_PRESSURE\n" . " USE TIME_MOD, ONLY : GET_NYMDb, GET_NHMSb\n" . " USE TIME_MOD, ONLY : GET_NYMD, GET_NHMS\n" . " USE TIME_MOD, ONLY : GET_A3_TIME, GET_FIRST_A3_TIME\n" . " USE TIME_MOD, ONLY : GET_A6_TIME, GET_FIRST_A6_TIME\n" . " USE TIME_MOD, ONLY : GET_I6_TIME, GET_MONTH\n" . " USE TIME_MOD, ONLY : GET_TAU, GET_TAUb\n" . " USE TIME_MOD, ONLY : GET_TS_CHEM, GET_TS_DYN\n" . " USE TIME_MOD, ONLY : GET_ELAPSED_SEC, GET_TIME_AHEAD\n" . " USE TIME_MOD, ONLY : GET_DAY_OF_YEAR, ITS_A_NEW_DAY\n" . " USE TIME_MOD, ONLY : ITS_A_NEW_SEASON, GET_SEASON\n" . " USE TIME_MOD, ONLY : ITS_A_NEW_MONTH, GET_NDIAGTIME\n" . " USE TIME_MOD, ONLY : ITS_A_LEAPYEAR, GET_YEAR\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_A3, ITS_TIME_FOR_A6\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_I6, ITS_TIME_FOR_CHEM\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_CONV,ITS_TIME_FOR_DEL\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_DIAG,ITS_TIME_FOR_DYN\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_EMIS,ITS_TIME_FOR_EXIT\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_UNIT,ITS_TIME_FOR_UNZIP\n" . " USE TIME_MOD, ONLY : SET_CT_CONV, SET_CT_DYN\n" . " USE TIME_MOD, ONLY : SET_CT_EMIS, SET_CT_CHEM\n" . " USE TIME_MOD, ONLY : SET_DIAGb, SET_DIAGe\n" . " USE TIME_MOD, ONLY : SET_CURRENT_TIME, PRINT_CURRENT_TIME\n" . " USE TIME_MOD, ONLY : SET_ELAPSED_MIN, SYSTEM_TIMESTAMP\n" . " USE TRACER_MOD, ONLY : CHECK_STT,N_TRACERS,STT,TCVV,PERT\n" . " USE TRACER_MOD, ONLY : ITS_AN_AEROSOL_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_CH4_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_FULLCHEM_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_MERCURY_SIM, NHMSb,NYMDb,TAUb\n" . " USE TRACERID_MOD, ONLY : IDO3\n" . " USE TRANSPORT_MOD, ONLY : DO_TRANSPORT\n" . " USE TROPOPAUSE_MOD, ONLY : READ_TROPOPAUSE, CHECK_VAR_TROP\n" . " USE RESTART_MOD, ONLY : MAKE_RESTART_FILE, READ_RESTART_FILE\n" . " USE UPBDFLX_MOD, ONLY : DO_UPBDFLX, UPBDFLX_NOY\n" . " USE UVALBEDO_MOD, ONLY : READ_UVALBEDO\n" . " USE WETSCAV_MOD, ONLY : INIT_WETSCAV, DO_WETDEP\n" . " USE XTRA_READ_MOD, ONLY : GET_XTRA_FIELDS, OPEN_XTRA_FIELDS\n" . " USE XTRA_READ_MOD, ONLY : UNZIP_XTRA_FIELDS\n" . " USE GCKPP_Global \n" . "\n" . " ! Force all variables to be declared explicitly\n" . " IMPLICIT NONE\n" . " \n" . " ! Header files \n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"CMN_DIAG\" ! Diagnostic switches, NJDAY\n" . "# include \"CMN_GCTM\" ! Physical constants\n" . "# include \"CMN\"\n" . "\n" . " ! Local variables\n" . " LOGICAL :: FIRST = .TRUE.\n" . " LOGICAL :: LXTRA \n" . " INTEGER :: I, IOS, J, K, L\n" . " INTEGER :: N, JDAY, NDIAGTIME, N_DYN\n" . " INTEGER :: N_DYN_STEPS, NSECb, N_STEP, DATE(2)\n" . " INTEGER :: YEAR, MONTH, DAY, DAY_OF_YEAR\n" . " INTEGER :: SEASON, NYMD, NHMS\n" . " INTEGER :: ELAPSED_SEC, NH_TMP, NY_TMP\n" . " REAL*8 :: TAU \n" . " CHARACTER(LEN=255) :: ZTYPE \n" . "\n" . " CONTAINS\n" . "\n" . " SUBROUTINE DO_GC_FWD(EPS, TRAC, x, NTOT, NST, EXP_PRECOND)\n" . "\n" . " REAL*8 EPS\n" . " INTEGER TRAC, IT_NUM, JLOOP \n" . " DOUBLE PRECISION :: x( IIPAR*JJPAR*LLPAR*NTOT )\n" . " LOGICAL :: EXP_PRECOND\n" . " INTEGER :: NTOT,NST\n" . "\n" . " !=================================================================\n" . " ! GEOS-CHEM starts here! \n" . " !=================================================================\n" . "\n" . " ! Display current grid resolution and data set type\n" . " CALL DISPLAY_GRID_AND_MODEL\n" . "\n" . " !=================================================================\n" . " ! ***** I N I T I A L I Z A T I O N *****\n" . " !=================================================================\n" . "\n" . " ! Read input file and call init routines from other modules\n" . " CALL READ_INPUT_FILE \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a READ_INPUT_FILE' )\n" . "\n" . " ! Initialize met field arrays from \"dao_mod.f\"\n" . " CALL INIT_DAO\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INIT_DAO' )\n" . "\n" . " ! Initialize diagnostic arrays and counters\n" . " CALL INITIALIZE( 2 )\n" . " CALL INITIALIZE( 3 )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INITIALIZE' )\n" . "\n" . " ! Initialize the new hybrid pressure module. Define Ap and Bp.\n" . " CALL INIT_PRESSURE\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INIT_PRESSURE' )\n" . "\n" . " ! Read annual mean tropopause if not a variable tropopause\n" . " ! read_tropopause is obsolete with variable tropopause\n" . " IF ( .not. LVARTROP ) THEN\n" . " CALL READ_TROPOPAUSE\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a READ_TROPOPAUSE' )\n" . " ENDIF\n" . "\n" . " ! Initialize allocatable SMVGEAR arrays\n" . " IF ( LEMIS .or. LCHEM ) THEN\n" . " IF ( ITS_A_FULLCHEM_SIM() ) CALL INIT_COMODE\n" . " IF ( ITS_AN_AEROSOL_SIM() ) CALL INIT_COMODE\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INIT_COMODE' )\n" . " ENDIF\n" . " \n" . " ! Allocate arrays from \"global_ch4_mod.f\" for CH4 run \n" . " IF ( ITS_A_CH4_SIM() ) CALL INIT_GLOBAL_CH4\n" . "\n" . " ! Initialize MEGAN arrays, get 15-day avg temperatures\n" . " IF ( LMEGAN ) THEN\n" . " CALL INIT_MEGAN\n" . " CALL INITIALIZE( 2 )\n" . " CALL INITIALIZE( 3 )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INIT_MEGAN' )\n" . " ENDIF\n" . "\n" . " ! Local flag for reading XTRA fields for GEOS-3\n" . " !LXTRA = ( LDUST .or. LMEGAN )\n" . " LXTRA = LMEGAN\n" . "\n" . " ! Define time variables for use below\n" . " NHMS = GET_NHMS()\n" . " NHMSb = GET_NHMSb()\n" . " NYMD = GET_NYMD()\n" . " NYMDb = GET_NYMDb()\n" . " TAU = GET_TAU()\n" . " TAUb = GET_TAUb()\n" . "\n" . " !=================================================================\n" . " ! ***** U N Z I P M E T F I E L D S \@ start of run *****\n" . " !=================================================================\n" . " IF ( LUNZIP ) THEN\n" . "\n" . " !---------------------\n" . " ! Remove all files\n" . " !---------------------\n" . "\n" . " ! Type of unzip operation\n" . " ZTYPE = 'remove all'\n" . " \n" . " ! Remove any leftover A-3, A-6, I-6, in temp dir\n" . " CALL UNZIP_A3_FIELDS( ZTYPE )\n" . " CALL UNZIP_A6_FIELDS( ZTYPE )\n" . " CALL UNZIP_I6_FIELDS( ZTYPE )\n" . "\n" . "#if defined( GEOS_3 )\n" . " ! Remove GEOS-3 GWET and XTRA files \n" . " IF ( LDUST ) CALL UNZIP_GWET_FIELDS( ZTYPE )\n" . " IF ( LXTRA ) CALL UNZIP_XTRA_FIELDS( ZTYPE )\n" . "#endif\n" . "\n" . "#if defined( GCAP )\n" . " ! Unzip GCAP PHIS field (if necessary)\n" . " CALL UNZIP_GCAP_FIELDS( ZTYPE )\n" . "#endif\n" . "\n" . " !---------------------\n" . " ! Unzip in foreground\n" . " !---------------------\n" . "\n" . " ! Type of unzip operation\n" . " ZTYPE = 'unzip foreground'\n" . "\n" . " ! Unzip A-3, A-6, I-6 files for START of run\n" . " CALL UNZIP_A3_FIELDS( ZTYPE, NYMDb )\n" . " CALL UNZIP_A6_FIELDS( ZTYPE, NYMDb )\n" . " CALL UNZIP_I6_FIELDS( ZTYPE, NYMDb )\n" . "\n" . "#if defined( GEOS_3 )\n" . " ! Unzip GEOS-3 GWET and XTRA fields for START of run\n" . " IF ( LDUST ) CALL UNZIP_GWET_FIELDS( ZTYPE, NYMDb )\n" . " IF ( LXTRA ) CALL UNZIP_XTRA_FIELDS( ZTYPE, NYMDb )\n" . "#endif\n" . "\n" . "#if defined( GCAP )\n" . " ! Unzip GCAP PHIS field (if necessary)\n" . " CALL UNZIP_GCAP_FIELDS( ZTYPE )\n" . "#endif\n" . "\n" . " !### Debug output\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a UNZIP' )\n" . " ENDIF\n" . "\n" . " !=================================================================\n" . " ! ***** R E A D M E T F I E L D S \@ start of run *****\n" . " !=================================================================\n" . "\n" . " ! Open and read A-3 fields\n" . " DATE = GET_FIRST_A3_TIME()\n" . " CALL OPEN_A3_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_A3_FIELDS( DATE(1), DATE(2) )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st A3 TIME' )\n" . "\n" . " ! For MEGAN biogenics, update hourly temps w/in 15-day window\n" . " IF ( LMEGAN ) THEN\n" . " CALL UPDATE_T_DAY\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: UPDATE T_DAY' )\n" . " ENDIF\n" . "\n" . " ! Open & read A-6 fields\n" . " DATE = GET_FIRST_A6_TIME()\n" . " CALL OPEN_A6_FIELDS( DATE(1), DATE(2) ) \n" . " CALL GET_A6_FIELDS( DATE(1), DATE(2) ) \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st A6 TIME' )\n" . "\n" . " ! Open & read I-6 fields\n" . " DATE = (/ NYMD, NHMS /)\n" . " CALL OPEN_I6_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_I6_FIELDS_1( DATE(1), DATE(2) )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st I6 TIME' )\n" . " \n" . "#if defined( GEOS_3 )\n" . " ! Open & read GEOS-3 GWET fields\n" . " IF ( LDUST ) THEN\n" . " DATE = GET_FIRST_A3_TIME()\n" . " CALL OPEN_GWET_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_GWET_FIELDS( DATE(1), DATE(2) ) \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st GWET TIME' )\n" . " ENDIF\n" . "\n" . " ! Open & read GEOS-3 XTRA fields\n" . " IF ( LXTRA ) THEN\n" . " DATE = GET_FIRST_A3_TIME()\n" . " CALL OPEN_XTRA_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_XTRA_FIELDS( DATE(1), DATE(2) ) \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st XTRA TIME' )\n" . " ENDIF\n" . "#endif\n" . "\n" . "#if defined( GCAP )\n" . " ! Read GCAP PHIS and LWI fields (if necessary)\n" . " CALL OPEN_GCAP_FIELDS\n" . " CALL GET_GCAP_FIELDS\n" . "\n" . " ! Remove temporary file (if necessary)\n" . " IF ( LUNZIP ) THEN\n" . " CALL UNZIP_GCAP_FIELDS( 'remove date' )\n" . " ENDIF\n" . "#endif\n" . "\n" . "#if defined( GCAP )\n" . " ! Read GCAP PHIS and LWI fields (if necessary)\n" . " CALL OPEN_GCAP_FIELDS\n" . " CALL GET_GCAP_FIELDS\n" . "\n" . " ! Remove temporary file (if necessary)\n" . " IF ( LUNZIP ) THEN\n" . " CALL UNZIP_GCAP_FIELDS( 'remove date' )\n" . " ENDIF\n" . "#endif\n" . "\n" . " ! Compute avg surface pressure near polar caps\n" . " CALL AVGPOLE( PS1 )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a AVGPOLE' )\n" . "\n" . " ! Call AIRQNT to compute air mass quantities from PS1 \n" . " CALL SET_FLOATING_PRESSURE( PS1 ) \n" . " CALL AIRQNT\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a AIRQNT' )\n" . "\n" . " ! Compute lightning NOx emissions [molec/box/6h]\n" . " IF ( LLIGHTNOX ) THEN\n" . " !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " !%%% NOTE: Temporary kludge: For GEOS-4 we want to use the new near-land \n" . " !%%% lightning formulation. But for the time being, we must keep the existing\n" . " !%%% lightning for other met field types. (ltm, bmy, 5/10/06)\n" . "#if defined( GEOS_4 )\n" . " CALL LIGHTNING_NL\n" . "#else\n" . " CALL LIGHTNING( T, CLDTOPS )\n" . "#endif\n" . "!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . "\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a LIGHTNING' )\n" . " ENDIF\n" . "\n" . " ! Read land types and fractions from \"vegtype.global\"\n" . " CALL RDLAND \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a RDLAND' )\n" . "\n" . " ! Initialize PBL quantities but do not do mixing\n" . " CALL DO_PBL_MIX( .FALSE. )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a TURBDAY:1' )\n" . "\n" . " !=================================================================\n" . " ! ***** I N I T I A L C O N D I T I O N S *****\n" . " !=================================================================\n" . "\n" . " ! Read initial tracer conditions\n" . " CALL READ_RESTART_FILE( NYMDb, NHMSb )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a READ_RESTART_FILE' )\n" . "\n" . " ! Read ocean Hg initial conditions (if necessary)\n" . " IF ( ITS_A_MERCURY_SIM() .and. LDYNOCEAN ) THEN\n" . " CALL READ_OCEAN_Hg_RESTART( NYMDb, NHMSb )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a READ_OCEAN_RESTART' )\n" . " ENDIF\n" . "\n" . " ! Save initial tracer masses to disk for benchmark runs\n" . " IF ( LSTDRUN ) CALL STDRUN( LBEGIN=.TRUE. )\n" . "\n" . " !============================================================================\n" . " ! ***** PERTURB INITIAL CONCENTRATIONS *****\n" . " !============================================================================\n" . "\n" . " open(20,file='ITER')\n" . " read(20,*)IT_NUM\n" . " close(20)\n" . "\n" . " PERT = 0d0\n" . " PERT(:,:,:,1) = STT(:,:,:,TRAC)*EPS\n" . " \n" . " IF(IT_NUM.eq.0)THEN \n" . " CALL MAKE_OBS_CHKFILE( NYMD, NHMS, TAU )\n" . " CALL MAKE_ORIG_CHKFILE( NYMD, NHMS, TAU ) !for visualization purposes only\n" . " \n" . " STT(:,:,:,TRAC) = STT(:,:,:,TRAC) + PERT(:,:,:,1)\n" . " CALL MAKE_BG_CHKFILE( NYMD, NHMS, TAU )\n" . " CALL MAKE_PERT_CHKFILE( NYMD, NHMS, TAU ) !for visualization purposes only\n" . " \n" . " CALL READ_OBS_CHKFILE( NYMD, NHMS )\n" . "\n" . " ELSE\n" . " !Convert log-concentrations to concentrations\n" . " !--------------------------------------\n" . " DO K = NST, NTOT+NST-1\n" . " DO L=1,LLPAR\n" . " DO J=1,JJPAR\n" . " DO I=1,IIPAR\n" . " IF (EXP_PRECOND) THEN\n" . " STT(I,J,L,K) = EXP(x((((I-1)*JJPAR+J-1)*LLPAR+L-1)\n" . " & *NTOT+K-NST+1))\n" . " ELSE\n" . " STT(I,J,L,K) = x((((I-1)*JJPAR+J-1)*LLPAR+L-1)\n" . " & *NTOT+K-NST+1)\n" . " END IF\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " CALL MAKE_CURR_CHKFILE( NYMD, NHMS, TAU ) \n" . " CALL MAKE_OPTZ_CHKFILE( NYMD, NHMS, TAU ) !for visualization purposes only\n" . " ENDIF\n" . "\n" . " !=================================================================\n" . " ! ***** 6 - H O U R T I M E S T E P L O O P *****\n" . " !================================================================= \n" . "\n" . " ! Echo message before first timestep\n" . " WRITE( 6, '(a)' )\n" . " WRITE( 6, '(a)' ) REPEAT( '*', 44 )\n" . " WRITE( 6, '(a)' ) '* B e g i n T i m e S t e p p i n g !! *'\n" . " WRITE( 6, '(a)' ) REPEAT( '*', 44 )\n" . " WRITE( 6, '(a)' ) \n" . "\n" . " ! NSTEP is the number of dynamic timesteps w/in a 6-h interval\n" . " N_DYN_STEPS = 360 / GET_TS_DYN()\n" . "\n" . " ! Start a new 6-h loop\n" . " DO \n" . "\n" . " ! Compute time parameters at start of 6-h loop\n" . " CALL SET_CURRENT_TIME\n" . "\n" . " ! NSECb is # of seconds at the start of 6-h loop\n" . " NSECb = GET_ELAPSED_SEC()\n" . "\n" . " ! Get dynamic timestep in seconds\n" . " N_DYN = 60d0 * GET_TS_DYN()\n" . "\n" . " !=================================================================\n" . " ! ***** D Y N A M I C T I M E S T E P L O O P *****\n" . " !=================================================================\n" . " DO N_STEP = 1, N_DYN_STEPS\n" . " \n" . " ! Compute & print time quantities at start of dyn step\n" . " CALL SET_CURRENT_TIME\n" . " CALL PRINT_CURRENT_TIME\n" . "\n" . " ! Set time variables for dynamic loop\n" . " !DAY = GET_DAY()\n" . " DAY_OF_YEAR = GET_DAY_OF_YEAR()\n" . " ELAPSED_SEC = GET_ELAPSED_SEC()\n" . " MONTH = GET_MONTH()\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . " YEAR = GET_YEAR()\n" . " SEASON = GET_SEASON()\n" . "\n" . " !==============================================================\n" . " ! ***** W R I T E D I A G N O S T I C F I L E S *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_BPCH() ) THEN\n" . " \n" . " ! Set time at end of diagnostic timestep\n" . " CALL SET_DIAGe( TAU )\n" . "\n" . " ! Write bpch file\n" . " CALL DIAG3 \n" . "\n" . " ! Flush file units\n" . " CALL CTM_FLUSH\n" . "\n" . " !===========================================================\n" . " ! ***** W R I T E R E S T A R T F I L E *****\n" . " !===========================================================\n" . " IF ( LSVGLB ) THEN\n" . "\n" . " ! Make atmospheric restart file\n" . " CALL MAKE_RESTART_FILE( NYMD, NHMS, TAU )\n" . " \n" . " ! Make ocean mercury restart file\n" . " IF ( ITS_A_MERCURY_SIM() .and. LDYNOCEAN ) THEN\n" . " CALL MAKE_OCEAN_Hg_RESTART( NYMD, NHMS, TAU )\n" . " ENDIF\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) THEN\n" . " CALL DEBUG_MSG( '### MAIN: a MAKE_RESTART_FILE' )\n" . " ENDIF\n" . " ENDIF\n" . "\n" . " ! Set time at beginning of next diagnostic timestep\n" . " CALL SET_DIAGb( TAU )\n" . "\n" . " !===========================================================\n" . " ! ***** Z E R O D I A G N O S T I C S *****\n" . " !===========================================================\n" . " CALL INITIALIZE( 2 ) ! Zero arrays\n" . " CALL INITIALIZE( 3 ) ! Zero counters\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** T E S T F O R E N D O F R U N *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_EXIT() ) GOTO 9999\n" . "\n" . " !===============================================================\n" . " ! ***** U N Z I P M E T F I E L D S *****\n" . " !===============================================================\n" . " IF ( LUNZIP .and. ITS_TIME_FOR_UNZIP() ) THEN\n" . " \n" . " ! Get the date & time for 12h (720 mins) from now\n" . " DATE = GET_TIME_AHEAD( 720 )\n" . "\n" . " ! If LWAIT=T then wait for the met fields to be\n" . " ! fully unzipped before proceeding w/ the run.\n" . " ! Otherwise, unzip fields in the background\n" . " IF ( LWAIT ) THEN\n" . " ZTYPE = 'unzip foreground'\n" . " ELSE\n" . " ZTYPE = 'unzip background'\n" . " ENDIF\n" . " \n" . " ! Unzip A3, A6, I6 fields\n" . " CALL UNZIP_A3_FIELDS( ZTYPE, DATE(1) )\n" . " CALL UNZIP_A6_FIELDS( ZTYPE, DATE(1) )\n" . " CALL UNZIP_I6_FIELDS( ZTYPE, DATE(1) )\n" . "\n" . "#if defined( GEOS_3 )\n" . " ! Unzip GEOS-3 GWET & XTRA fields\n" . " IF ( LDUST ) CALL UNZIP_GWET_FIELDS( ZTYPE, DATE(1) )\n" . " IF ( LXTRA ) CALL UNZIP_XTRA_FIELDS( ZTYPE, DATE(1) )\n" . "#endif\n" . " ENDIF \n" . "\n" . " !==============================================================\n" . " ! ***** R E A D A - 3 F I E L D S *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_A3() ) THEN\n" . "\n" . " ! Get the date/time for the next A-3 data block\n" . " DATE = GET_A3_TIME()\n" . "\n" . " ! Open & read A-3 fields\n" . " CALL OPEN_A3_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_A3_FIELDS( DATE(1), DATE(2) )\n" . "\n" . " ! Update daily mean temperature archive for MEGAN biogenics\n" . " IF ( LMEGAN ) CALL UPDATE_T_DAY \n" . "\n" . "#if defined( GEOS_3 )\n" . " ! Read GEOS-3 GWET fields\n" . " IF ( LDUST ) THEN\n" . " CALL OPEN_GWET_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_GWET_FIELDS( DATE(1), DATE(2) ) \n" . " ENDIF\n" . " \n" . " ! Read GEOS-3 PARDF, PARDR, SNOW fields\n" . " IF ( LXTRA ) THEN\n" . " CALL OPEN_XTRA_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_XTRA_FIELDS( DATE(1), DATE(2) ) \n" . " ENDIF\n" . "#endif\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** R E A D A - 6 F I E L D S ***** \n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_A6() ) THEN\n" . " \n" . " ! Get the date/time for the next A-6 data block\n" . " DATE = GET_A6_TIME()\n" . "\n" . " ! Open and read A-6 fields\n" . " CALL OPEN_A6_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_A6_FIELDS( DATE(1), DATE(2) )\n" . "\n" . " ! Since CLDTOPS is an A-6 field, update the\n" . " ! lightning NOx emissions [molec/box/6h]\n" . "!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . "!%%% NOTE: Temporary kludge: For GEOS-4 we want to use the new near-land \n" . "!%%% lightning formulation. But for the time being, we must keep the \n" . "!%%% existing lightning for other met field types. (ltm, bmy, 5/10/06)\n" . " IF ( LLIGHTNOX ) THEN\n" . "#if defined( GEOS_4 )\n" . " CALL LIGHTNING_NL\n" . "#else \n" . " CALL LIGHTNING( T, CLDTOPS )\n" . "#endif\n" . " ENDIF\n" . "!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** R E A D I - 6 F I E L D S ***** \n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_I6() ) THEN\n" . "\n" . " ! Get the date/time for the next I-6 data block\n" . " DATE = GET_I6_TIME()\n" . "\n" . " ! Open and read files\n" . " CALL OPEN_I6_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_I6_FIELDS_2( DATE(1), DATE(2) )\n" . "\n" . " ! Compute avg pressure at polar caps \n" . " CALL AVGPOLE( PS2 )\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** M O N T H L Y O R S E A S O N A L D A T A *****\n" . " !==============================================================\n" . "\n" . " ! UV albedoes\n" . " IF ( LCHEM .and. ITS_A_NEW_MONTH() ) THEN\n" . " CALL READ_UVALBEDO( MONTH )\n" . " ENDIF\n" . "\n" . " ! Fossil fuel emissions (SMVGEAR)\n" . " IF ( ITS_A_FULLCHEM_SIM() ) THEN\n" . " IF ( LEMIS .and. ITS_A_NEW_SEASON() ) THEN\n" . " CALL ANTHROEMS( SEASON )\n" . " ENDIF\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** D A I L Y D A T A *****\n" . " !==============================================================\n" . " IF ( ITS_A_NEW_DAY() ) THEN \n" . "\n" . " ! Read leaf-area index (needed for drydep)\n" . " CALL RDLAI( DAY_OF_YEAR, MONTH )\n" . "\n" . " ! For MEGAN biogenics ...\n" . " IF ( LMEGAN ) THEN\n" . "\n" . " ! Read AVHRR daily leaf-area-index\n" . " CALL RDISOLAI( DAY_OF_YEAR, MONTH )\n" . "\n" . " ! Compute 15-day average temperature for MEGAN\n" . " CALL UPDATE_T_15_AVG\n" . " ENDIF\n" . " \n" . " ! Also read soil-type info for fullchem simulation\n" . " IF ( ITS_A_FULLCHEM_SIM() ) CALL RDSOIL \n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG ( '### MAIN: a DAILY DATA' )\n" . " ENDIF\n" . "\n" . " ! Get averaging intervals for local-time diagnostics\n" . " ! (NOTE: maybe improve this later on)\n" . " CALL DIAG_2PM\n" . " \n" . " !==============================================================\n" . " ! ***** I N T E R P O L A T E Q U A N T I T I E S ***** \n" . " !==============================================================\n" . " \n" . " !#################################################\n" . " !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" . " ! Interpolate I-6 fields to current dynamic timestep, \n" . " ! based on their values at NSEC and NSEC+N_DYN !--------------------------!\n" . " CALL INTERP( NSECb, ELAPSED_SEC, N_DYN ) ! CALL INTERP, sets psc2 !\n" . " !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ !--------------------------!\n" . " !#################################################\n" . "\n" . " ! Case of variable tropopause:\n" . " ! Check LLTROP and set LMIN, LMAX, and LPAUSE\n" . " ! since this is not done with READ_TROPOPAUSE anymore.\n" . " ! (Need to double-check that LMIN, Lmax are not used before-phs) \n" . " IF ( LVARTROP ) CALL CHECK_VAR_TROP\n" . " \n" . " !#################################################\n" . " !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" . " ! If we are not doing transport, then make sure that\n" . " ! the floating pressure is set to PSC2 (bdf, bmy, 8/22/02) !-----------------------------------------!\n" . " IF ( .not. LTRAN ) CALL SET_FLOATING_PRESSURE( PSC2 ) ! PSC2 = p2 = interpolated pres at t=T+ΔT !\n" . " !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ !-----------------------------------------!\n" . " !#################################################\n" . "\n" . " ! Compute airmass quantities at each grid box \n" . " CALL AIRQNT\n" . " \n" . " ! Compute the cosine of the solar zenith angle at each grid box\n" . " CALL COSSZA( DAY_OF_YEAR, NHMSb, ELAPSED_SEC, SUNCOS )\n" . " \n" . " ! For SMVGEAR II, we also need to compute SUNCOS at\n" . " ! the end of this chemistry timestep (bdf, bmy, 4/1/03)\n" . " IF ( LCHEM .and. ITS_A_FULLCHEM_SIM() ) THEN\n" . " CALL COSSZA( DAY_OF_YEAR, NHMSb, \n" . " & ELAPSED_SEC+GET_TS_CHEM()*60, SUNCOSB )\n" . " ENDIF\n" . "\n" . " ! Compute tropopause height for ND55 diagnostic\n" . " IF ( ND55 > 0 ) CALL TROPOPAUSE\n" . "\n" . "#if defined( GEOS_3 )\n" . "\n" . " ! 1998 GEOS-3 carries the ground temperature and not the air\n" . " ! temperature -- thus TS will be 2-3 K too high. As a quick fix, \n" . " ! copy the temperature at the first sigma level into TS. \n" . " ! (mje, bnd, bmy, 7/3/01)\n" . " IF ( YEAR == 1998 ) TS(:,:) = T(:,:,1)\n" . "#endif\n" . "\n" . " ! Update dynamic timestep\n" . " CALL SET_CT_DYN( INCREMENT=.TRUE. )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INTERP, etc' )\n" . "\n" . " !==============================================================\n" . " ! ***** U N I T C O N V E R S I O N ( kg -> v/v ) *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_UNIT() ) THEN\n" . " CALL CONVERT_UNITS( 1, N_TRACERS, TCVV, AD, STT )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CONVERT_UNITS:1' )\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** S T R A T O S P H E R I C F L U X E S *****\n" . " !==============================================================\n" . " IF ( LUPBD ) CALL DO_UPBDFLX\n" . "\n" . " !==============================================================\n" . " ! ***** T R A N S P O R T *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_DYN() ) THEN\n" . "\n" . " ! Call the appropritate version of TPCORE\n" . " IF ( LTRAN ) CALL DO_TRANSPORT \n" . "\n" . " ! Reset air mass quantities\n" . " CALL AIRQNT\n" . "\n" . " ! Repartition [NOy] species after transport\n" . " IF ( LUPBD .and. ITS_A_FULLCHEM_SIM() ) THEN\n" . " CALL UPBDFLX_NOY( 2 )\n" . " ENDIF\n" . "\n" . " ! Get relative humidity \n" . " ! (after recomputing pressure quantities)\n" . " CALL MAKE_RH\n" . "\n" . " ! Initialize wet scavenging and wetdep fields after\n" . " ! the airmass quantities are reset after transport\n" . " IF ( LCONV .or. LWETD ) CALL INIT_WETSCAV\n" . " ENDIF\n" . "\n" . " !-------------------------------\n" . " ! Test for convection timestep\n" . " !-------------------------------\n" . " IF ( ITS_TIME_FOR_CONV() ) THEN\n" . "\n" . " ! Increment the convection timestep\n" . " CALL SET_CT_CONV( INCREMENT=.TRUE. )\n" . "\n" . " !===========================================================\n" . " ! ***** M I X E D L A Y E R M I X I N G *****\n" . " !===========================================================\n" . " CALL DO_PBL_MIX( LTURB )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a TURBDAY:2' )\n" . "\n" . " !===========================================================\n" . " ! ***** C L O U D C O N V E C T I O N *****\n" . " !===========================================================\n" . " IF ( LCONV ) THEN\n" . " \n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . " CALL MAKE_CONVECTION_CHKFILE( NYMD, NHMS, TAU )\n" . "\n" . " CALL DO_CONVECTION\n" . " \n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CONVECTION' )\n" . " ENDIF \n" . " ENDIF \n" . "\n" . " !==============================================================\n" . " ! ***** U N I T C O N V E R S I O N ( v/v -> kg ) *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_UNIT() ) THEN \n" . " CALL CONVERT_UNITS( 2, N_TRACERS, TCVV, AD, STT )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CONVERT_UNITS:2' )\n" . " ENDIF\n" . "\n" . " !-------------------------------\n" . " ! Test for emission timestep\n" . " !-------------------------------\n" . " IF ( ITS_TIME_FOR_EMIS() ) THEN\n" . " \n" . " ! Increment emission counter\n" . " CALL SET_CT_EMIS( INCREMENT=.TRUE. )\n" . "\n" . " !========================================================\n" . " ! ***** D R Y D E P O S I T I O N *****\n" . " !========================================================\n" . " IF ( LDRYD ) CALL DO_DRYDEP\n" . "\n" . " !========================================================\n" . " ! ***** E M I S S I O N S *****\n" . " !========================================================\n" . " IF ( LEMIS ) CALL DO_EMISSIONS\n" . " ENDIF \n" . "\n" . " !===========================================================\n" . " ! ***** C H E M I S T R Y *****\n" . " !=========================================================== \n" . "\n" . " ! Every chemistry timestep...\n" . " IF ( ITS_TIME_FOR_CHEM() ) THEN\n" . "\n" . " ! Increment chemistry timestep counter\n" . " CALL SET_CT_CHEM( INCREMENT=.TRUE. )\n" . "\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . "\n" . " CALL MAKE_CHEMISTRY_CHKFILE(NYMD, NHMS, TAU)\n" . "\n" . " ! Call the appropriate chemistry routine\n" . " CALL DO_CHEMISTRY\n" . "\n" . " ENDIF \n" . " \n" . " !==============================================================\n" . " ! ***** W E T D E P O S I T I O N (rainout + washout) *****\n" . " !==============================================================\n" . " \n" . " IF ( LWETD .and. ITS_TIME_FOR_DYN() ) CALL DO_WETDEP\n" . "\n" . " !==============================================================\n" . " ! ***** E N D O F D Y N A M I C T I M E S T E P *****\n" . " !==============================================================\n" . "\n" . " ! Check for NaN, Negatives, Infinities in STT once per hour\n" . " IF ( ITS_TIME_FOR_DIAG() ) THEN\n" . " CALL CHECK_STT( 'End of Dynamic Loop' )\n" . " ENDIF\n" . "\n" . " ! Increment elapsed time\n" . " CALL SET_ELAPSED_MIN\n" . " CALL SET_CURRENT_TIME\n" . "\n" . " !--------------------------------------------------------------\n" . " ! ***** CHECKPOINTING EVERY DYNAMIC TIME STEP ***** \n" . " !--------------------------------------------------------------\n" . "\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . " IF(IT_NUM.eq.0)THEN \n" . " CALL MAKE_OBS_CHKFILE( NYMD, NHMS, TAU )\n" . " ELSE\n" . " CALL MAKE_CURR_CHKFILE( NYMD, NHMS, TAU ) \n" . " ENDIF \n" . " !--------------------------------------------------------------\n" . "\n" . " ENDDO\n" . "\n" . " !=================================================================\n" . " ! ***** C O P Y I - 6 F I E L D S *****\n" . " !\n" . " ! The I-6 fields at the end of this timestep become\n" . " ! the fields at the beginning of the next timestep\n" . " !=================================================================\n" . " CALL COPY_I6_FIELDS\n" . "\n" . " ENDDO \n" . "\n" . " !=================================================================\n" . " ! ***** C L E A N U P A N D Q U I T *****\n" . " !=================================================================\n" . " 9999 CONTINUE \n" . "\n" . " ! Print the mass-weighted mean OH concentration (if applicable)\n" . " CALL PRINT_DIAG_OH\n" . "\n" . " ! For model benchmarking, save final masses of \n" . " ! Rn,Pb,Be or Ox to a binary punch file \n" . " IF ( LSTDRUN ) CALL STDRUN( LBEGIN=.FALSE. )\n" . "\n" . " ! Print ending time of simulation\n" . " CALL DISPLAY_END_TIME\n" . "!\n" . "!******************************************************************************\n" . "! Internal procedures -- Use the F90 CONTAINS command to inline \n" . "! subroutines that only can be called from this main program. \n" . "!\n" . "! All variables referenced in the main program (local variables, F90 \n" . "! module variables, or common block variables) also have scope within \n" . "! internal subroutines. \n" . "!\n" . "! List of Internal Procedures:\n" . "! ============================================================================\n" . "! (1 ) DISPLAY_GRID_AND_MODEL : Displays resolution, data set, & start time\n" . "! (2 ) GET_NYMD_PHIS : Gets YYYYMMDD for the PHIS data field\n" . "! (3 ) DISPLAY_SIGMA_LAT_LON : Displays sigma, lat, and lon information\n" . "! (4 ) GET_WIND10M : Wrapper for MAKE_WIND10M (from \"dao_mod.f\")\n" . "! (5 ) CTM_FLUSH : Flushes diagnostic files to disk\n" . "! (6 ) DISPLAY_END_TIME : Displays ending time of simulation\n" . "! (7 ) MET_FIELD_DEBUG : Prints min and max of met fields for debug\n" . "!******************************************************************************\n" . "!\n" . " END SUBROUTINE DO_GC_FWD\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE DISPLAY_GRID_AND_MODEL\n" . "\n" . " !=================================================================\n" . " ! Internal Subroutine DISPLAY_GRID_AND_MODEL displays the \n" . " ! appropriate messages for the given model grid and machine type.\n" . " ! It also prints the starting time and date (local time) of the\n" . " ! GEOS-CHEM simulation. (bmy, 12/2/03, 10/18/05)\n" . " !=================================================================\n" . "\n" . " ! For system time stamp\n" . " CHARACTER(LEN=16) :: STAMP\n" . "\n" . " !-----------------------\n" . " ! Print resolution info\n" . " !-----------------------\n" . "#if defined( GRID4x5 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) //\n" . " & ' S T A R T I N G 4 x 5 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID2x25 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 2 x 2.5 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID1x125 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 1 x 1.25 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID1x1 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 1 x 1 G E O S -- C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! Print machine info\n" . " !-----------------------\n" . "\n" . " ! Get the proper FORMAT statement for the model being used\n" . "#if defined( COMPAQ )\n" . " WRITE( 6, '(a)' ) 'Created w/ HP/COMPAQ Alpha compiler'\n" . "#elif defined( IBM_AIX )\n" . " WRITE( 6, '(a)' ) 'Created w/ IBM-AIX compiler'\n" . "#elif defined( LINUX_PGI )\n" . " WRITE( 6, '(a)' ) 'Created w/ LINUX/PGI compiler'\n" . "#elif defined( LINUX_IFORT )\n" . " WRITE( 6, '(a)' ) 'Created w/ LINUX/IFORT (64-bit) compiler'\n" . "#elif defined( SGI_MIPS )\n" . " WRITE( 6, '(a)' ) 'Created w/ SGI MIPSpro compiler'\n" . "#elif defined( SPARC )\n" . " WRITE( 6, '(a)' ) 'Created w/ Sun/SPARC compiler'\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! Print met field info\n" . " !-----------------------\n" . "#if defined( GEOS_3 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-3 met fields'\n" . "#elif defined( GEOS_4 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-4/fvDAS met fields'\n" . "#elif defined( GEOS_5 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-5/fvDAS met fields'\n" . "#elif defined( GCAP )\n" . " WRITE( 6, '(a)' ) 'Using GCAP/GISS met fields'\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! System time stamp\n" . " !-----------------------\n" . " STAMP = SYSTEM_TIMESTAMP()\n" . " WRITE( 6, 100 ) STAMP\n" . " 100 FORMAT( /, '===> SIMULATION START TIME: ', a, ' <===', / )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE DISPLAY_GRID_AND_MODEL\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " FUNCTION ITS_TIME_FOR_BPCH() RESULT( DO_BPCH )\n" . "\n" . " !=================================================================\n" . " ! Internal function ITS_TIME_FOR_BPCH returns TRUE if it is time\n" . " ! to write to the binary punch file and FALSE otherwise.\n" . " !=================================================================\n" . "\n" . " ! Local variables\n" . " INTEGER :: TODAY, THIS_NJDAY, NHMS, NDIAGTIME\n" . " \n" . " ! Function value\n" . " LOGICAL :: DO_BPCH\n" . "\n" . " !=================================================================\n" . " ! ITS_TIME_FOR_BPCH begins here!\n" . " !================================================================= \n" . " \n" . " ! Return FALSE if it's the first timestep\n" . " IF ( GET_TAU() == GET_TAUb() ) THEN\n" . " DO_BPCH = .FALSE.\n" . " RETURN\n" . " ENDIF\n" . "\n" . " ! Current day of year\n" . " TODAY = GET_DAY_OF_YEAR()\n" . "\n" . " ! Current time of day\n" . " NHMS = GET_NHMS()\n" . "\n" . " ! Time of day to write bpch files to disk\n" . " NDIAGTIME = GET_NDIAGTIME()\n" . "\n" . " ! Look up appropriate value of NJDAY array. We may need to add a\n" . " ! day to skip past the Feb 29 element of NJDAY for non-leap-years.\n" . " IF ( .not. ITS_A_LEAPYEAR( FORCE=.TRUE. ) .and. TODAY > 59 ) THEN\n" . " THIS_NJDAY = NJDAY( TODAY + 1 ) \n" . " ELSE\n" . " THIS_NJDAY = NJDAY( TODAY )\n" . " ENDIF\n" . "\n" . " ! Test if this is the day & time to write to the BPCH file!\n" . " IF ( ( THIS_NJDAY > 0 ) .and. NHMS == NDIAGTIME ) THEN\n" . " DO_BPCH = .TRUE.\n" . " ELSE\n" . " DO_BPCH = .FALSE.\n" . " ENDIF\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION ITS_TIME_FOR_BPCH\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE CTM_FLUSH\n" . "\n" . " !================================================================\n" . " ! Internal subroutine CTM_FLUSH flushes certain diagnostic\n" . " ! file buffers to disk. (bmy, 8/31/00, 7/1/02)\n" . " !\n" . " ! CTM_FLUSH should normally be called after each diagnostic \n" . " ! output, so that in case the run dies, the output files from \n" . " ! the last diagnostic timestep will not be lost. \n" . " !\n" . " ! FLUSH is an intrinsic FORTRAN subroutine and takes as input \n" . " ! the unit number of the file to be flushed to disk.\n" . " !================================================================\n" . " CALL FLUSH( IU_ND48 ) \n" . " CALL FLUSH( IU_BPCH ) \n" . " CALL FLUSH( IU_SMV2LOG ) \n" . " CALL FLUSH( IU_DEBUG ) \n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE CTM_FLUSH\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE DISPLAY_END_TIME\n" . "\n" . " !=================================================================\n" . " ! Internal subroutine DISPLAY_END_TIME prints the ending time of\n" . " ! the GEOS-CHEM simulation (bmy, 5/3/05)\n" . " !=================================================================\n" . "\n" . " ! Local variables\n" . " CHARACTER(LEN=16) :: STAMP\n" . "\n" . " ! Print system time stamp\n" . " STAMP = SYSTEM_TIMESTAMP()\n" . " WRITE( 6, 100 ) STAMP\n" . " 100 FORMAT( /, '===> SIMULATION END TIME: ', a, ' <===', / )\n" . "\n" . " ! Echo info\n" . " WRITE ( 6, 3000 ) \n" . " 3000 FORMAT\n" . " & ( /, '************** E N D O F G E O S -- C H E M ',\n" . " & '**************' )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE DISPLAY_END_TIME\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MET_FIELD_DEBUG\n" . "\n" . " !=================================================================\n" . " ! Internal subroutine MET_FIELD_DEBUG prints out the maximum\n" . " ! and minimum, and sum of DAO met fields for debugging \n" . " !=================================================================\n" . "\n" . " ! References to F90 modules\n" . " USE DAO_MOD, ONLY : AD, AIRDEN, AIRVOL, ALBD1, ALBD2\n" . " USE DAO_MOD, ONLY : ALBD, AVGW, BXHEIGHT, CLDFRC, CLDF \n" . " USE DAO_MOD, ONLY : CLDMAS, CLDTOPS, DELP \n" . " USE DAO_MOD, ONLY : DTRAIN, GWETTOP, HFLUX, HKBETA, HKETA \n" . " USE DAO_MOD, ONLY : LWI, MOISTQ, OPTD, OPTDEP, PBL \n" . " USE DAO_MOD, ONLY : PREACC, PRECON, PS1, PS2, PSC2 \n" . " USE DAO_MOD, ONLY : RADLWG, RADSWG, RH, SLP, SNOW \n" . " USE DAO_MOD, ONLY : SPHU1, SPHU2, SPHU, SUNCOS, SUNCOSB \n" . " USE DAO_MOD, ONLY : TMPU1, TMPU2, T, TROPP, TS \n" . " USE DAO_MOD, ONLY : TSKIN, U10M, USTAR, UWND1, UWND2 \n" . " USE DAO_MOD, ONLY : UWND, V10M, VWND1, VWND2, VWND \n" . " USE DAO_MOD, ONLY : Z0, ZMEU, ZMMD, ZMMU \n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, L, IJ\n" . "\n" . " !=================================================================\n" . " ! MET_FIELD_DEBUG begins here!\n" . " !=================================================================\n" . "\n" . " ! Define box to print out\n" . " I = 23\n" . " J = 34\n" . " L = 1\n" . " IJ = ( ( J-1 ) * IIPAR ) + I\n" . "\n" . " !=================================================================\n" . " ! Print out met fields at (I,J,L)\n" . " !=================================================================\n" . " IF ( ALLOCATED( AD ) ) PRINT*, 'AD : ', AD(I,J,L) \n" . " IF ( ALLOCATED( AIRDEN ) ) PRINT*, 'AIRDEN : ', AIRDEN(L,I,J) \n" . " IF ( ALLOCATED( AIRVOL ) ) PRINT*, 'AIRVOL : ', AIRVOL(I,J,L) \n" . " IF ( ALLOCATED( ALBD1 ) ) PRINT*, 'ALBD1 : ', ALBD1(I,J) \n" . " IF ( ALLOCATED( ALBD2 ) ) PRINT*, 'ALBD2 : ', ALBD2(I,J) \n" . " IF ( ALLOCATED( ALBD ) ) PRINT*, 'ALBD : ', ALBD(I,J) \n" . " IF ( ALLOCATED( AVGW ) ) PRINT*, 'AVGW : ', AVGW(I,J,L) \n" . " IF ( ALLOCATED( BXHEIGHT ) ) PRINT*, 'BXHEIGHT: ', BXHEIGHT(I,J,L) \n" . " IF ( ALLOCATED( CLDFRC ) ) PRINT*, 'CLDFRC : ', CLDFRC(I,J)\n" . " IF ( ALLOCATED( CLDF ) ) PRINT*, 'CLDF : ', CLDF(L,I,J) \n" . " IF ( ALLOCATED( CLDMAS ) ) PRINT*, 'CLDMAS : ', CLDMAS(I,J,L) \n" . " IF ( ALLOCATED( CLDTOPS ) ) PRINT*, 'CLDTOPS : ', CLDTOPS(I,J) \n" . " IF ( ALLOCATED( DELP ) ) PRINT*, 'DELP : ', DELP(L,I,J) \n" . " IF ( ALLOCATED( DTRAIN ) ) PRINT*, 'DTRAIN : ', DTRAIN(I,J,L) \n" . " IF ( ALLOCATED( GWETTOP ) ) PRINT*, 'GWETTOP : ', GWETTOP(I,J) \n" . " IF ( ALLOCATED( HFLUX ) ) PRINT*, 'HFLUX : ', HFLUX(I,J) \n" . " IF ( ALLOCATED( HKBETA ) ) PRINT*, 'HKBETA : ', HKBETA(I,J,L) \n" . " IF ( ALLOCATED( HKETA ) ) PRINT*, 'HKETA : ', HKETA(I,J,L) \n" . " IF ( ALLOCATED( LWI ) ) PRINT*, 'LWI : ', LWI(I,J) \n" . " IF ( ALLOCATED( MOISTQ ) ) PRINT*, 'MOISTQ : ', MOISTQ(L,I,J) \n" . " IF ( ALLOCATED( OPTD ) ) PRINT*, 'OPTD : ', OPTD(L,I,J) \n" . " IF ( ALLOCATED( OPTDEP ) ) PRINT*, 'OPTDEP : ', OPTDEP(L,I,J) \n" . " IF ( ALLOCATED( PBL ) ) PRINT*, 'PBL : ', PBL(I,J) \n" . " IF ( ALLOCATED( PREACC ) ) PRINT*, 'PREACC : ', PREACC(I,J) \n" . " IF ( ALLOCATED( PRECON ) ) PRINT*, 'PRECON : ', PRECON(I,J) \n" . " IF ( ALLOCATED( PS1 ) ) PRINT*, 'PS1 : ', PS1(I,J) \n" . " IF ( ALLOCATED( PS2 ) ) PRINT*, 'PS2 : ', PS2(I,J) \n" . " IF ( ALLOCATED( PSC2 ) ) PRINT*, 'PSC2 : ', PSC2(I,J)\n" . " IF ( ALLOCATED( RADLWG ) ) PRINT*, 'RADLWG : ', RADLWG(I,J)\n" . " IF ( ALLOCATED( RADSWG ) ) PRINT*, 'RADSWG : ', RADSWG(I,J)\n" . " IF ( ALLOCATED( RH ) ) PRINT*, 'RH : ', RH(I,J,L) \n" . " IF ( ALLOCATED( SLP ) ) PRINT*, 'SLP : ', SLP(I,J) \n" . " IF ( ALLOCATED( SNOW ) ) PRINT*, 'SNOW : ', SNOW(I,J) \n" . " IF ( ALLOCATED( SPHU1 ) ) PRINT*, 'SPHU1 : ', SPHU1(I,J,L) \n" . " IF ( ALLOCATED( SPHU2 ) ) PRINT*, 'SPHU2 : ', SPHU2(I,J,L) \n" . " IF ( ALLOCATED( SPHU ) ) PRINT*, 'SPHU : ', SPHU(I,J,L) \n" . " IF ( ALLOCATED( SUNCOS ) ) PRINT*, 'SUNCOS : ', SUNCOS(IJ) \n" . " IF ( ALLOCATED( SUNCOSB ) ) PRINT*, 'SUNCOSB : ', SUNCOSB(IJ) \n" . " IF ( ALLOCATED( TMPU1 ) ) PRINT*, 'TMPU1 : ', TMPU1(I,J,L) \n" . " IF ( ALLOCATED( TMPU2 ) ) PRINT*, 'TMPU2 : ', TMPU2(I,J,L) \n" . " IF ( ALLOCATED( T ) ) PRINT*, 'TMPU : ', T(I,J,L)\n" . " IF ( ALLOCATED( TROPP ) ) PRINT*, 'TROPP : ', TROPP(I,J) \n" . " IF ( ALLOCATED( TS ) ) PRINT*, 'TS : ', TS(I,J) \n" . " IF ( ALLOCATED( TSKIN ) ) PRINT*, 'TSKIN : ', TSKIN(I,J) \n" . " IF ( ALLOCATED( U10M ) ) PRINT*, 'U10M : ', U10M(I,J) \n" . " IF ( ALLOCATED( USTAR ) ) PRINT*, 'USTAR : ', USTAR(I,J) \n" . " IF ( ALLOCATED( UWND1 ) ) PRINT*, 'UWND1 : ', UWND1(I,J,L) \n" . " IF ( ALLOCATED( UWND2 ) ) PRINT*, 'UWND2 : ', UWND2(I,J,L) \n" . " IF ( ALLOCATED( UWND ) ) PRINT*, 'UWND : ', UWND(I,J,L) \n" . " IF ( ALLOCATED( V10M ) ) PRINT*, 'V10M : ', V10M(I,J) \n" . " IF ( ALLOCATED( VWND1 ) ) PRINT*, 'VWND1 : ', VWND1(I,J,L) \n" . " IF ( ALLOCATED( VWND2 ) ) PRINT*, 'VWND2 : ', VWND2(I,J,L) \n" . " IF ( ALLOCATED( VWND ) ) PRINT*, 'VWND : ', VWND(I,J,L) \n" . " IF ( ALLOCATED( Z0 ) ) PRINT*, 'Z0 : ', Z0(I,J) \n" . " IF ( ALLOCATED( ZMEU ) ) PRINT*, 'ZMEU : ', ZMEU(I,J,L) \n" . " IF ( ALLOCATED( ZMMD ) ) PRINT*, 'ZMMD : ', ZMMD(I,J,L) \n" . " IF ( ALLOCATED( ZMMU ) ) PRINT*, 'ZMMU : ', ZMMU(I,J,L) \n" . "\n" . " ! Flush the output buffer\n" . " CALL FLUSH( 6 )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE MET_FIELD_DEBUG\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " ! End of program\n" . " END MODULE SUBDRIVER_FWD\n"; close(FILE); } #============================================= # Create subdriver_fwd_fd.f #============================================= sub createSubdriverFwdFd() { printf "Creating subdriver_fwd_fd.f\n"; open(FILE, ">subdriver_fwd_fd.f") || die "Unable to open subdriver_fwd_fd.f"; print FILE "\n" . "! =============================================================\n" . "! subdriver_fwd_fd.f, 2008/24/01 Kumaresh \$\n" . "! Forward finite-difference driver is a modified version of\n" . "! main driver for GEOS-Chem to carryout finite difference tests\n" . "! =============================================================\n" . "!\n" . "! \$Id: main.f,v 1.42 2006/10/17 17:51:14 bmy Exp \$\n" . "! \$Log: main.f,v \$\n" . "! Revision 1.42 2006/10/17 17:51:14 bmy\n" . "! GEOS-Chem v7-04-10, includes the following modifications:\n" . "! - Includes variable tropopause with ND54 diagnostic\n" . "! - Added GFED2 biomass emissions for SO2, NH3, BC, OC, CO2\n" . "! - Rewrote default biomass emissions routines for clarity\n" . "! - Updates for GCAP: future emissions, met-field reading, TOMS-O3\n" . "! - Bug fix in planeflight_mod.f: set NCS variable correctly\n" . "! - Bug fix in SOA_LUMP; other minor bug fixes\n" . "!\n" . "! GEOS-Chem v7-04-09, includes the following modifications:\n" . "! - Updated CO for David Streets (2001 for China, 2000 elsewhere)\n" . "! - Now reset negative SPHU to a very small positive #\n" . "! - Remove use of TINY(1d0) to avoid NaN's on SUN platform\n" . "! - Minor bug fixes and deleted obsolete code\n" . "!\n" . "! Revision 1.38 2006/08/14 17:58:10 bmy\n" . "! GEOS-Chem v7-04-08, includes the following modifications:\n" . "! - Now add David Streets' emissions for China & SE Asia\n" . "! - Removed support for GEOS-1 and GEOS-STRAT met fields\n" . "! - Removed support for LINUX_IFC and LINUX_EFC compilers\n" . "!\n" . "! Revision 1.37 2006/06/28 17:26:52 bmy\n" . "! GEOS-Chem v7-04-06, includes the following modifications:\n" . "! - Now add BRAVO emissions (NOx, CO, SO2) over N. Mexico\n" . "! - Turn off HO2 uptake by aerosols in SMVGEAR mechanism\n" . "! - Bug fix: GEOS-4 convection now conserves mixing ratio\n" . "! - Other minor bug fixes & improvements\n" . "!\n" . "! Revision 1.36 2006/06/06 14:26:07 bmy\n" . "! GEOS-Chem v7-04-05, includes the following modifications:\n" . "! - Now gets ISOP that has reacted w/ OH from SMVGEAR (cf. D. Henze)\n" . "! - Incorporated IPCC future emission scale factors (cf. S. Wu)\n" . "! - Other minor bug fixes\n" . "!\n" . "! Revision 1.35 2006/05/26 17:45:24 bmy\n" . "! GEOS-Chem v7-04-04, includes the following modifications:\n" . "! - Now updated for SOA production from ISOP (cf D. Henze)\n" . "! - Now archive SOA concentrations in [ug/m3] (\"diag42_mod.f\")\n" . "! - Other minor bug fixes\n" . "!\n" . "! Revision 1.34 2006/05/15 17:52:52 bmy\n" . "! GEOS-Chem v7-04-03, includes the following modifications:\n" . "! - Added near-land formulation for lightning\n" . "! - Now can use CTH, MFLUX, PRECON params for lightning\n" . "! (NOTE: new lightning is only applied for GEOS-4 for time being)\n" . "! - Added ND56 diagnostic for lightning flash rates\n" . "! - Fixed Feb 28 -> Mar 1 transition for GCAP (i.e. no leap years)\n" . "! - Other minor bug fixes\n" . "!\n" . "! Revision 1.33 2006/03/24 20:22:53 bmy\n" . "! GEOS-CHEM v7-04-01, includes the following modifications:\n" . "! - Updates to new Hg simulation (eck, cdh, sas)\n" . "! - Changed Reynold's # criterion for aerodyn smooth surfaces in drydep\n" . "! - Standardized several bug fixes implemented in v7-03-06 patch\n" . "! - Bug fix: Now call MAKE_RH from \"main.f\" to avoid problems in drydep\n" . "! - Removed obsolete code\n" . "!\n" . " MODULE SUBDRIVER_FWD\n" . "! \n" . "!******************************************************************************\n" . "! \n" . "! \n" . "! GGGGGG EEEEEEE OOOOO SSSSSSS CCCCCC H H EEEEEEE M M \n" . "! G E O O S C H H E M M M M \n" . "! G GGG EEEEEE O O SSSSSSS C HHHHHHH EEEEEE M M M \n" . "! G G E O O S C H H E M M \n" . "! GGGGGG EEEEEEE OOOOO SSSSSSS CCCCCC H H EEEEEEE M M \n" . "! \n" . "! \n" . "! (formerly known as the Harvard-GEOS model)\n" . "! for 4 x 5, 2 x 2.5 global grids and 1 x 1 nested grids\n" . "!\n" . "! Contact: Bob Yantosca, Harvard University (bmy.as.harvard.edu)\n" . "! \n" . "!******************************************************************************\n" . "!\n" . "! See the GEOS-Chem Web Site:\n" . "!\n" . "! http://www.as.harvard.edu/chemistry/trop/geos/\n" . "!\n" . "! and the GEOS-CHEM User's Guide:\n" . "!\n" . "! http://www.as.harvard.edu/chemistry/trop/geos/doc/man/\n" . "!\n" . "! for the most up-to-date GEOS-CHEM documentation on the following topics:\n" . "!\n" . "! - installation, compilation, and execution\n" . "! - coding practice and style\n" . "! - input files and met field data files\n" . "! - horizontal and vertical resolution\n" . "! - modification history\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules \n" . " USE A3_READ_MOD, ONLY : GET_A3_FIELDS\n" . " USE A3_READ_MOD, ONLY : OPEN_A3_FIELDS\n" . " USE A3_READ_MOD, ONLY : UNZIP_A3_FIELDS\n" . " USE A6_READ_MOD, ONLY : GET_A6_FIELDS\n" . " USE A6_READ_MOD, ONLY : OPEN_A6_FIELDS\n" . " USE A6_READ_MOD, ONLY : UNZIP_A6_FIELDS\n" . " USE CHECKPOINT_MOD \n" . " USE CHEMISTRY_MOD, ONLY : DO_CHEMISTRY\n" . " USE BENCHMARK_MOD, ONLY : STDRUN\n" . " USE CONVECTION_MOD, ONLY : DO_CONVECTION\n" . " USE COMODE_MOD, ONLY : INIT_COMODE, CSPEC, IXSAVE, IYSAVE, \n" . " & IZSAVE\n" . " USE DIAG_MOD, ONLY : DIAGCHLORO\n" . " USE DIAG41_MOD, ONLY : DIAG41, ND41\n" . " USE DIAG42_MOD, ONLY : DIAG42, ND42\n" . " USE DIAG48_MOD, ONLY : DIAG48, ITS_TIME_FOR_DIAG48\n" . " USE DIAG49_MOD, ONLY : DIAG49, ITS_TIME_FOR_DIAG49\n" . " USE DIAG50_MOD, ONLY : DIAG50, DO_SAVE_DIAG50\n" . " USE DIAG51_MOD, ONLY : DIAG51, DO_SAVE_DIAG51\n" . " USE DIAG_OH_MOD, ONLY : PRINT_DIAG_OH\n" . " USE DAO_MOD, ONLY : AD, AIRQNT \n" . " USE DAO_MOD, ONLY : AVGPOLE, CLDTOPS\n" . " USE DAO_MOD, ONLY : CONVERT_UNITS, COPY_I6_FIELDS\n" . " USE DAO_MOD, ONLY : COSSZA, INIT_DAO\n" . " USE DAO_MOD, ONLY : INTERP, PS1\n" . " USE DAO_MOD, ONLY : PS2, PSC2 \n" . " USE DAO_MOD, ONLY : T, TS \n" . " USE DAO_MOD, ONLY : SUNCOS, SUNCOSB\n" . " USE DAO_MOD, ONLY : MAKE_RH\n" . " USE DRYDEP_MOD, ONLY : DO_DRYDEP\n" . " USE EMISSIONS_MOD, ONLY : DO_EMISSIONS\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_BPCH, IU_DEBUG\n" . " USE FILE_MOD, ONLY : IU_ND48, IU_SMV2LOG \n" . " USE FILE_MOD, ONLY : CLOSE_FILES\n" . " USE GLOBAL_CH4_MOD, ONLY : INIT_GLOBAL_CH4, CH4_AVGTP\n" . " USE GCAP_READ_MOD, ONLY : GET_GCAP_FIELDS\n" . " USE GCAP_READ_MOD, ONLY : OPEN_GCAP_FIELDS\n" . " USE GCAP_READ_MOD, ONLY : UNZIP_GCAP_FIELDS\n" . " USE GWET_READ_MOD, ONLY : GET_GWET_FIELDS\n" . " USE GWET_READ_MOD, ONLY : OPEN_GWET_FIELDS\n" . " USE GWET_READ_MOD, ONLY : UNZIP_GWET_FIELDS\n" . " USE I6_READ_MOD, ONLY : GET_I6_FIELDS_1\n" . " USE I6_READ_MOD, ONLY : GET_I6_FIELDS_2\n" . " USE I6_READ_MOD, ONLY : OPEN_I6_FIELDS\n" . " USE I6_READ_MOD, ONLY : UNZIP_I6_FIELDS\n" . " USE INPUT_MOD, ONLY : READ_INPUT_FILE\n" . " USE LAI_MOD, ONLY : RDISOLAI\n" . " USE LIGHTNING_NOX_MOD, ONLY : LIGHTNING\n" . " !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " !%%% NOTE: Temporary kludge: For GEOS-4 we want to use the new near-land\n" . " !%%% lightning formulation. But for the time being, we must keep the \n" . " !%%% existing lightning for other met field types. (ltm, bmy, 5/10/06)\n" . " USE LIGHTNING_NOX_NL_MOD, ONLY : LIGHTNING_NL\n" . " !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " USE LOGICAL_MOD, ONLY : LEMIS, LCHEM, LUNZIP, LDUST\n" . " USE LOGICAL_MOD, ONLY : LLIGHTNOX, LPRT, LSTDRUN, LSVGLB\n" . " USE LOGICAL_MOD, ONLY : LWAIT, LTRAN, LUPBD, LCONV\n" . " USE LOGICAL_MOD, ONLY : LWETD, LTURB, LDRYD, LMEGAN \n" . " USE LOGICAL_MOD, ONLY : LDYNOCEAN, LSOA, LVARTROP\n" . " USE LOGICAL_MOD, ONLY : LSULF, LCARB, LSSALT\n" . " USE MEGAN_MOD, ONLY : INIT_MEGAN\n" . " USE MEGAN_MOD, ONLY : UPDATE_T_15_AVG\n" . " USE MEGAN_MOD, ONLY : UPDATE_T_DAY\n" . " USE PBL_MIX_MOD, ONLY : DO_PBL_MIX\n" . " USE OCEAN_MERCURY_MOD, ONLY : MAKE_OCEAN_Hg_RESTART\n" . " USE OCEAN_MERCURY_MOD, ONLY : READ_OCEAN_Hg_RESTART\n" . " USE PLANEFLIGHT_MOD, ONLY : PLANEFLIGHT\n" . " USE PLANEFLIGHT_MOD, ONLY : SETUP_PLANEFLIGHT \n" . " USE PRESSURE_MOD, ONLY : INIT_PRESSURE\n" . " USE PRESSURE_MOD, ONLY : SET_FLOATING_PRESSURE\n" . " USE TIME_MOD, ONLY : GET_NYMDb, GET_NHMSb\n" . " USE TIME_MOD, ONLY : GET_NYMD, GET_NHMS\n" . " USE TIME_MOD, ONLY : GET_A3_TIME, GET_FIRST_A3_TIME\n" . " USE TIME_MOD, ONLY : GET_A6_TIME, GET_FIRST_A6_TIME\n" . " USE TIME_MOD, ONLY : GET_I6_TIME, GET_MONTH\n" . " USE TIME_MOD, ONLY : GET_TAU, GET_TAUb\n" . " USE TIME_MOD, ONLY : GET_TS_CHEM, GET_TS_DYN\n" . " USE TIME_MOD, ONLY : GET_ELAPSED_SEC, GET_TIME_AHEAD\n" . " USE TIME_MOD, ONLY : GET_DAY_OF_YEAR, ITS_A_NEW_DAY\n" . " USE TIME_MOD, ONLY : ITS_A_NEW_SEASON, GET_SEASON\n" . " USE TIME_MOD, ONLY : ITS_A_NEW_MONTH, GET_NDIAGTIME\n" . " USE TIME_MOD, ONLY : ITS_A_LEAPYEAR, GET_YEAR\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_A3, ITS_TIME_FOR_A6\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_I6, ITS_TIME_FOR_CHEM\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_CONV,ITS_TIME_FOR_DEL\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_DIAG,ITS_TIME_FOR_DYN\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_EMIS,ITS_TIME_FOR_EXIT\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_UNIT,ITS_TIME_FOR_UNZIP\n" . " USE TIME_MOD, ONLY : SET_CT_CONV, SET_CT_DYN\n" . " USE TIME_MOD, ONLY : SET_CT_EMIS, SET_CT_CHEM\n" . " USE TIME_MOD, ONLY : SET_DIAGb, SET_DIAGe\n" . " USE TIME_MOD, ONLY : SET_CURRENT_TIME, PRINT_CURRENT_TIME\n" . " USE TIME_MOD, ONLY : SET_ELAPSED_MIN, SYSTEM_TIMESTAMP\n" . " USE TRACER_MOD, ONLY : CHECK_STT,N_TRACERS,STT,TCVV,PERT\n" . " USE TRACER_MOD, ONLY : ITS_AN_AEROSOL_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_CH4_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_FULLCHEM_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_MERCURY_SIM\n" . " USE TRACERID_MOD, ONLY : IDO3\n" . " USE TRANSPORT_MOD, ONLY : DO_TRANSPORT\n" . " USE TROPOPAUSE_MOD, ONLY : READ_TROPOPAUSE, CHECK_VAR_TROP\n" . " USE RESTART_MOD, ONLY : MAKE_RESTART_FILE, READ_RESTART_FILE\n" . " USE UPBDFLX_MOD, ONLY : DO_UPBDFLX, UPBDFLX_NOY\n" . " USE UVALBEDO_MOD, ONLY : READ_UVALBEDO\n" . " USE WETSCAV_MOD, ONLY : INIT_WETSCAV, DO_WETDEP\n" . " USE XTRA_READ_MOD, ONLY : GET_XTRA_FIELDS, OPEN_XTRA_FIELDS\n" . " USE XTRA_READ_MOD, ONLY : UNZIP_XTRA_FIELDS\n" . " USE GCKPP_Global \n" . "\n" . " ! Force all variables to be declared explicitly\n" . " IMPLICIT NONE\n" . " \n" . " ! Header files \n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"CMN_DIAG\" ! Diagnostic switches, NJDAY\n" . "# include \"CMN_GCTM\" ! Physical constants\n" . "# include \"CMN\"\n" . "\n" . " ! Local variables\n" . " LOGICAL :: FIRST = .TRUE.\n" . " LOGICAL :: LXTRA \n" . " INTEGER :: I, IOS, J, K, L\n" . " INTEGER :: N, JDAY, NDIAGTIME, N_DYN\n" . " INTEGER :: N_DYN_STEPS, NSECb, N_STEP, DATE(2)\n" . " INTEGER :: YEAR, MONTH, DAY, DAY_OF_YEAR\n" . " INTEGER :: SEASON, NYMD, NYMDb, NHMS\n" . " INTEGER :: ELAPSED_SEC, NHMSb, NH_TMP, NY_TMP\n" . " REAL*8 :: TAU, TAUb \n" . " CHARACTER(LEN=255) :: ZTYPE \n" . "\n" . " CONTAINS\n" . "\n" . " SUBROUTINE DO_GC_FWD(EPS, TRAC, FEPS)\n" . "\n" . " REAL*8 EPS, FEPS, fd\n" . " INTEGER TRAC, IT_NUM, JLOOP\n" . "\n" . " REAL*8 :: STT_O3(IIPAR,JJPAR,LLPAR,1)\n" . " REAL*8 :: STT_O3P1(IIPAR,JJPAR,LLPAR,1)\n" . " REAL*8 :: STT_O3P2(IIPAR,JJPAR,LLPAR,1)\n" . "\n" . " !=================================================================\n" . " ! GEOS-CHEM starts here! \n" . " !=================================================================\n" . "\n" . " ! Display current grid resolution and data set type\n" . " CALL DISPLAY_GRID_AND_MODEL\n" . "\n" . " !=================================================================\n" . " ! ***** I N I T I A L I Z A T I O N *****\n" . " !=================================================================\n" . "\n" . " ! Read input file and call init routines from other modules\n" . " CALL READ_INPUT_FILE \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a READ_INPUT_FILE' )\n" . "\n" . " ! Initialize met field arrays from \"dao_mod.f\"\n" . " CALL INIT_DAO\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INIT_DAO' )\n" . "\n" . " ! Initialize diagnostic arrays and counters\n" . " CALL INITIALIZE( 2 )\n" . " CALL INITIALIZE( 3 )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INITIALIZE' )\n" . "\n" . " ! Initialize the new hybrid pressure module. Define Ap and Bp.\n" . " CALL INIT_PRESSURE\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INIT_PRESSURE' )\n" . "\n" . " ! Read annual mean tropopause if not a variable tropopause\n" . " ! read_tropopause is obsolete with variable tropopause\n" . " IF ( .not. LVARTROP ) THEN\n" . " CALL READ_TROPOPAUSE\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a READ_TROPOPAUSE' )\n" . " ENDIF\n" . "\n" . " ! Initialize allocatable SMVGEAR arrays\n" . " IF ( LEMIS .or. LCHEM ) THEN\n" . " IF ( ITS_A_FULLCHEM_SIM() ) CALL INIT_COMODE\n" . " IF ( ITS_AN_AEROSOL_SIM() ) CALL INIT_COMODE\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INIT_COMODE' )\n" . " ENDIF\n" . " \n" . " ! Allocate arrays from \"global_ch4_mod.f\" for CH4 run \n" . " IF ( ITS_A_CH4_SIM() ) CALL INIT_GLOBAL_CH4\n" . "\n" . " ! Initialize MEGAN arrays, get 15-day avg temperatures\n" . " IF ( LMEGAN ) THEN\n" . " CALL INIT_MEGAN\n" . " CALL INITIALIZE( 2 )\n" . " CALL INITIALIZE( 3 )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INIT_MEGAN' )\n" . " ENDIF\n" . "\n" . " ! Local flag for reading XTRA fields for GEOS-3\n" . " !LXTRA = ( LDUST .or. LMEGAN )\n" . " LXTRA = LMEGAN\n" . "\n" . " ! Define time variables for use below\n" . " NHMS = GET_NHMS()\n" . " NHMSb = GET_NHMSb()\n" . " NYMD = GET_NYMD()\n" . " NYMDb = GET_NYMDb()\n" . " TAU = GET_TAU()\n" . " TAUb = GET_TAUb()\n" . "\n" . " !=================================================================\n" . " ! ***** U N Z I P M E T F I E L D S \@ start of run *****\n" . " !=================================================================\n" . " IF ( LUNZIP ) THEN\n" . "\n" . " !---------------------\n" . " ! Remove all files\n" . " !---------------------\n" . "\n" . " ! Type of unzip operation\n" . " ZTYPE = 'remove all'\n" . " \n" . " ! Remove any leftover A-3, A-6, I-6, in temp dir\n" . " CALL UNZIP_A3_FIELDS( ZTYPE )\n" . " CALL UNZIP_A6_FIELDS( ZTYPE )\n" . " CALL UNZIP_I6_FIELDS( ZTYPE )\n" . "\n" . "#if defined( GEOS_3 )\n" . " ! Remove GEOS-3 GWET and XTRA files \n" . " IF ( LDUST ) CALL UNZIP_GWET_FIELDS( ZTYPE )\n" . " IF ( LXTRA ) CALL UNZIP_XTRA_FIELDS( ZTYPE )\n" . "#endif\n" . "\n" . "#if defined( GCAP )\n" . " ! Unzip GCAP PHIS field (if necessary)\n" . " CALL UNZIP_GCAP_FIELDS( ZTYPE )\n" . "#endif\n" . "\n" . " !---------------------\n" . " ! Unzip in foreground\n" . " !---------------------\n" . "\n" . " ! Type of unzip operation\n" . " ZTYPE = 'unzip foreground'\n" . "\n" . " ! Unzip A-3, A-6, I-6 files for START of run\n" . " CALL UNZIP_A3_FIELDS( ZTYPE, NYMDb )\n" . " CALL UNZIP_A6_FIELDS( ZTYPE, NYMDb )\n" . " CALL UNZIP_I6_FIELDS( ZTYPE, NYMDb )\n" . "\n" . "#if defined( GEOS_3 )\n" . " ! Unzip GEOS-3 GWET and XTRA fields for START of run\n" . " IF ( LDUST ) CALL UNZIP_GWET_FIELDS( ZTYPE, NYMDb )\n" . " IF ( LXTRA ) CALL UNZIP_XTRA_FIELDS( ZTYPE, NYMDb )\n" . "#endif\n" . "\n" . "#if defined( GCAP )\n" . " ! Unzip GCAP PHIS field (if necessary)\n" . " CALL UNZIP_GCAP_FIELDS( ZTYPE )\n" . "#endif\n" . "\n" . " !### Debug output\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a UNZIP' )\n" . " ENDIF\n" . "\n" . " !=================================================================\n" . " ! ***** R E A D M E T F I E L D S \@ start of run *****\n" . " !=================================================================\n" . "\n" . " ! Open and read A-3 fields\n" . " DATE = GET_FIRST_A3_TIME()\n" . " CALL OPEN_A3_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_A3_FIELDS( DATE(1), DATE(2) )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st A3 TIME' )\n" . "\n" . " ! For MEGAN biogenics, update hourly temps w/in 15-day window\n" . " IF ( LMEGAN ) THEN\n" . " CALL UPDATE_T_DAY\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: UPDATE T_DAY' )\n" . " ENDIF\n" . "\n" . " ! Open & read A-6 fields\n" . " DATE = GET_FIRST_A6_TIME()\n" . " CALL OPEN_A6_FIELDS( DATE(1), DATE(2) ) \n" . " CALL GET_A6_FIELDS( DATE(1), DATE(2) ) \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st A6 TIME' )\n" . "\n" . " ! Open & read I-6 fields\n" . " DATE = (/ NYMD, NHMS /)\n" . " CALL OPEN_I6_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_I6_FIELDS_1( DATE(1), DATE(2) )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st I6 TIME' )\n" . " \n" . "#if defined( GEOS_3 )\n" . " ! Open & read GEOS-3 GWET fields\n" . " IF ( LDUST ) THEN\n" . " DATE = GET_FIRST_A3_TIME()\n" . " CALL OPEN_GWET_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_GWET_FIELDS( DATE(1), DATE(2) ) \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st GWET TIME' )\n" . " ENDIF\n" . "\n" . " ! Open & read GEOS-3 XTRA fields\n" . " IF ( LXTRA ) THEN\n" . " DATE = GET_FIRST_A3_TIME()\n" . " CALL OPEN_XTRA_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_XTRA_FIELDS( DATE(1), DATE(2) ) \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st XTRA TIME' )\n" . " ENDIF\n" . "#endif\n" . "\n" . "#if defined( GCAP )\n" . " ! Read GCAP PHIS and LWI fields (if necessary)\n" . " CALL OPEN_GCAP_FIELDS\n" . " CALL GET_GCAP_FIELDS\n" . "\n" . " ! Remove temporary file (if necessary)\n" . " IF ( LUNZIP ) THEN\n" . " CALL UNZIP_GCAP_FIELDS( 'remove date' )\n" . " ENDIF\n" . "#endif\n" . "\n" . "#if defined( GCAP )\n" . " ! Read GCAP PHIS and LWI fields (if necessary)\n" . " CALL OPEN_GCAP_FIELDS\n" . " CALL GET_GCAP_FIELDS\n" . "\n" . " ! Remove temporary file (if necessary)\n" . " IF ( LUNZIP ) THEN\n" . " CALL UNZIP_GCAP_FIELDS( 'remove date' )\n" . " ENDIF\n" . "#endif\n" . "\n" . " ! Compute avg surface pressure near polar caps\n" . " CALL AVGPOLE( PS1 )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a AVGPOLE' )\n" . "\n" . " ! Call AIRQNT to compute air mass quantities from PS1 \n" . " CALL SET_FLOATING_PRESSURE( PS1 ) \n" . " CALL AIRQNT\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a AIRQNT' )\n" . "\n" . " ! Compute lightning NOx emissions [molec/box/6h]\n" . " IF ( LLIGHTNOX ) THEN\n" . " !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " !%%% NOTE: Temporary kludge: For GEOS-4 we want to use the new near-land \n" . " !%%% lightning formulation. But for the time being, we must keep the existing\n" . " !%%% lightning for other met field types. (ltm, bmy, 5/10/06)\n" . "#if defined( GEOS_4 )\n" . " CALL LIGHTNING_NL\n" . "#else\n" . " CALL LIGHTNING( T, CLDTOPS )\n" . "#endif\n" . "!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . "\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a LIGHTNING' )\n" . " ENDIF\n" . "\n" . " ! Read land types and fractions from \"vegtype.global\"\n" . " CALL RDLAND \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a RDLAND' )\n" . "\n" . " ! Initialize PBL quantities but do not do mixing\n" . " CALL DO_PBL_MIX( .FALSE. )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a TURBDAY:1' )\n" . "\n" . " !=================================================================\n" . " ! ***** I N I T I A L C O N D I T I O N S *****\n" . " !=================================================================\n" . "\n" . " ! Read initial tracer conditions\n" . " CALL READ_RESTART_FILE( NYMDb, NHMSb )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a READ_RESTART_FILE' )\n" . "\n" . " ! Read ocean Hg initial conditions (if necessary)\n" . " IF ( ITS_A_MERCURY_SIM() .and. LDYNOCEAN ) THEN\n" . " CALL READ_OCEAN_Hg_RESTART( NYMDb, NHMSb )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a READ_OCEAN_RESTART' )\n" . " ENDIF\n" . "\n" . " ! Save initial tracer masses to disk for benchmark runs\n" . " IF ( LSTDRUN ) CALL STDRUN( LBEGIN=.TRUE. )\n" . "\n" . " !============================================================================\n" . " ! ***** PERTURB INITIAL CONCENTRATIONS *****\n" . " !============================================================================\n" . " \n" . " open(20,file='ITER')\n" . " read(20,*)IT_NUM\n" . " close(20)\n" . "\n" . " NH_TMP = GET_NHMS()\n" . " NY_TMP = GET_NYMD()\n" . " TAU = GET_TAU()\n" . " \n" . " PERT = 0d0\n" . " PERT(:,:,:,1) = STT(:,:,:,TRAC)*FEPS\n" . " \n" . " IF(IT_NUM.eq.0)THEN \n" . " STT(:,:,:,TRAC) = STT(:,:,:,TRAC) + PERT(:,:,:,1)\n" . " ELSE IF(IT_NUM.eq.1)THEN\n" . " STT(:,:,:,TRAC) = STT(:,:,:,TRAC) - PERT(:,:,:,1)\n" . " END IF\n" . "\n" . " !=================================================================\n" . " ! ***** 6 - H O U R T I M E S T E P L O O P *****\n" . " !================================================================= \n" . "\n" . " ! Echo message before first timestep\n" . " WRITE( 6, '(a)' )\n" . " WRITE( 6, '(a)' ) REPEAT( '*', 44 )\n" . " WRITE( 6, '(a)' ) '* B e g i n T i m e S t e p p i n g !! *'\n" . " WRITE( 6, '(a)' ) REPEAT( '*', 44 )\n" . " WRITE( 6, '(a)' ) \n" . "\n" . " ! NSTEP is the number of dynamic timesteps w/in a 6-h interval\n" . " N_DYN_STEPS = 360 / GET_TS_DYN()\n" . "\n" . " ! Start a new 6-h loop\n" . " DO \n" . "\n" . " ! Compute time parameters at start of 6-h loop\n" . " CALL SET_CURRENT_TIME\n" . "\n" . " ! NSECb is # of seconds at the start of 6-h loop\n" . " NSECb = GET_ELAPSED_SEC()\n" . "\n" . " ! Get dynamic timestep in seconds\n" . " N_DYN = 60d0 * GET_TS_DYN()\n" . "\n" . " !=================================================================\n" . " ! ***** D Y N A M I C T I M E S T E P L O O P *****\n" . " !=================================================================\n" . " DO N_STEP = 1, N_DYN_STEPS\n" . " \n" . " ! Compute & print time quantities at start of dyn step\n" . " CALL SET_CURRENT_TIME\n" . " CALL PRINT_CURRENT_TIME\n" . "\n" . " ! Set time variables for dynamic loop\n" . " !DAY = GET_DAY()\n" . " DAY_OF_YEAR = GET_DAY_OF_YEAR()\n" . " ELAPSED_SEC = GET_ELAPSED_SEC()\n" . " MONTH = GET_MONTH()\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . " YEAR = GET_YEAR()\n" . " SEASON = GET_SEASON()\n" . "\n" . " !==============================================================\n" . " ! ***** W R I T E D I A G N O S T I C F I L E S *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_BPCH() ) THEN\n" . " \n" . " ! Set time at end of diagnostic timestep\n" . " CALL SET_DIAGe( TAU )\n" . "\n" . " ! Write bpch file\n" . " CALL DIAG3 \n" . "\n" . " ! Flush file units\n" . " CALL CTM_FLUSH\n" . "\n" . " !===========================================================\n" . " ! ***** W R I T E R E S T A R T F I L E *****\n" . " !===========================================================\n" . " IF ( LSVGLB ) THEN\n" . "\n" . " ! Make atmospheric restart file\n" . " CALL MAKE_RESTART_FILE( NYMD, NHMS, TAU )\n" . " \n" . " ! Make ocean mercury restart file\n" . " IF ( ITS_A_MERCURY_SIM() .and. LDYNOCEAN ) THEN\n" . " CALL MAKE_OCEAN_Hg_RESTART( NYMD, NHMS, TAU )\n" . " ENDIF\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) THEN\n" . " CALL DEBUG_MSG( '### MAIN: a MAKE_RESTART_FILE' )\n" . " ENDIF\n" . " ENDIF\n" . "\n" . " ! Set time at beginning of next diagnostic timestep\n" . " CALL SET_DIAGb( TAU )\n" . "\n" . " !===========================================================\n" . " ! ***** Z E R O D I A G N O S T I C S *****\n" . " !===========================================================\n" . " CALL INITIALIZE( 2 ) ! Zero arrays\n" . " CALL INITIALIZE( 3 ) ! Zero counters\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** T E S T F O R E N D O F R U N *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_EXIT() ) GOTO 9999\n" . "\n" . " !===============================================================\n" . " ! ***** U N Z I P M E T F I E L D S *****\n" . " !===============================================================\n" . " IF ( LUNZIP .and. ITS_TIME_FOR_UNZIP() ) THEN\n" . " \n" . " ! Get the date & time for 12h (720 mins) from now\n" . " DATE = GET_TIME_AHEAD( 720 )\n" . "\n" . " ! If LWAIT=T then wait for the met fields to be\n" . " ! fully unzipped before proceeding w/ the run.\n" . " ! Otherwise, unzip fields in the background\n" . " IF ( LWAIT ) THEN\n" . " ZTYPE = 'unzip foreground'\n" . " ELSE\n" . " ZTYPE = 'unzip background'\n" . " ENDIF\n" . " \n" . " ! Unzip A3, A6, I6 fields\n" . " CALL UNZIP_A3_FIELDS( ZTYPE, DATE(1) )\n" . " CALL UNZIP_A6_FIELDS( ZTYPE, DATE(1) )\n" . " CALL UNZIP_I6_FIELDS( ZTYPE, DATE(1) )\n" . "\n" . "#if defined( GEOS_3 )\n" . " ! Unzip GEOS-3 GWET & XTRA fields\n" . " IF ( LDUST ) CALL UNZIP_GWET_FIELDS( ZTYPE, DATE(1) )\n" . " IF ( LXTRA ) CALL UNZIP_XTRA_FIELDS( ZTYPE, DATE(1) )\n" . "#endif\n" . " ENDIF \n" . "\n" . " !==============================================================\n" . " ! ***** R E A D A - 3 F I E L D S *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_A3() ) THEN\n" . "\n" . " ! Get the date/time for the next A-3 data block\n" . " DATE = GET_A3_TIME()\n" . "\n" . " ! Open & read A-3 fields\n" . " CALL OPEN_A3_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_A3_FIELDS( DATE(1), DATE(2) )\n" . "\n" . " ! Update daily mean temperature archive for MEGAN biogenics\n" . " IF ( LMEGAN ) CALL UPDATE_T_DAY \n" . "\n" . "#if defined( GEOS_3 )\n" . " ! Read GEOS-3 GWET fields\n" . " IF ( LDUST ) THEN\n" . " CALL OPEN_GWET_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_GWET_FIELDS( DATE(1), DATE(2) ) \n" . " ENDIF\n" . " \n" . " ! Read GEOS-3 PARDF, PARDR, SNOW fields\n" . " IF ( LXTRA ) THEN\n" . " CALL OPEN_XTRA_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_XTRA_FIELDS( DATE(1), DATE(2) ) \n" . " ENDIF\n" . "#endif\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** R E A D A - 6 F I E L D S ***** \n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_A6() ) THEN\n" . " \n" . " ! Get the date/time for the next A-6 data block\n" . " DATE = GET_A6_TIME()\n" . "\n" . " ! Open and read A-6 fields\n" . " CALL OPEN_A6_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_A6_FIELDS( DATE(1), DATE(2) )\n" . "\n" . " ! Since CLDTOPS is an A-6 field, update the\n" . " ! lightning NOx emissions [molec/box/6h]\n" . "!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . "!%%% NOTE: Temporary kludge: For GEOS-4 we want to use the new near-land \n" . "!%%% lightning formulation. But for the time being, we must keep the \n" . "!%%% existing lightning for other met field types. (ltm, bmy, 5/10/06)\n" . " IF ( LLIGHTNOX ) THEN\n" . "#if defined( GEOS_4 )\n" . " CALL LIGHTNING_NL\n" . "#else \n" . " CALL LIGHTNING( T, CLDTOPS )\n" . "#endif\n" . " ENDIF\n" . "!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** R E A D I - 6 F I E L D S ***** \n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_I6() ) THEN\n" . "\n" . " ! Get the date/time for the next I-6 data block\n" . " DATE = GET_I6_TIME()\n" . "\n" . " ! Open and read files\n" . " CALL OPEN_I6_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_I6_FIELDS_2( DATE(1), DATE(2) )\n" . "\n" . " ! Compute avg pressure at polar caps \n" . " CALL AVGPOLE( PS2 )\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** M O N T H L Y O R S E A S O N A L D A T A *****\n" . " !==============================================================\n" . "\n" . " ! UV albedoes\n" . " IF ( LCHEM .and. ITS_A_NEW_MONTH() ) THEN\n" . " CALL READ_UVALBEDO( MONTH )\n" . " ENDIF\n" . "\n" . " ! Fossil fuel emissions (SMVGEAR)\n" . " IF ( ITS_A_FULLCHEM_SIM() ) THEN\n" . " IF ( LEMIS .and. ITS_A_NEW_SEASON() ) THEN\n" . " CALL ANTHROEMS( SEASON )\n" . " ENDIF\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** D A I L Y D A T A *****\n" . " !==============================================================\n" . " IF ( ITS_A_NEW_DAY() ) THEN \n" . "\n" . " ! Read leaf-area index (needed for drydep)\n" . " CALL RDLAI( DAY_OF_YEAR, MONTH )\n" . "\n" . " ! For MEGAN biogenics ...\n" . " IF ( LMEGAN ) THEN\n" . "\n" . " ! Read AVHRR daily leaf-area-index\n" . " CALL RDISOLAI( DAY_OF_YEAR, MONTH )\n" . "\n" . " ! Compute 15-day average temperature for MEGAN\n" . " CALL UPDATE_T_15_AVG\n" . " ENDIF\n" . " \n" . " ! Also read soil-type info for fullchem simulation\n" . " IF ( ITS_A_FULLCHEM_SIM() ) CALL RDSOIL \n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG ( '### MAIN: a DAILY DATA' )\n" . " ENDIF\n" . "\n" . " ! Get averaging intervals for local-time diagnostics\n" . " ! (NOTE: maybe improve this later on)\n" . " CALL DIAG_2PM\n" . " \n" . " !==============================================================\n" . " ! ***** I N T E R P O L A T E Q U A N T I T I E S ***** \n" . " !==============================================================\n" . " \n" . " !#################################################\n" . " !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" . " ! Interpolate I-6 fields to current dynamic timestep, \n" . " ! based on their values at NSEC and NSEC+N_DYN !--------------------------!\n" . " CALL INTERP( NSECb, ELAPSED_SEC, N_DYN ) ! CALL INTERP, sets psc2 !\n" . " !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ !--------------------------!\n" . " !#################################################\n" . "\n" . " ! Case of variable tropopause:\n" . " ! Check LLTROP and set LMIN, LMAX, and LPAUSE\n" . " ! since this is not done with READ_TROPOPAUSE anymore.\n" . " ! (Need to double-check that LMIN, Lmax are not used before-phs) \n" . " IF ( LVARTROP ) CALL CHECK_VAR_TROP\n" . " \n" . " !#################################################\n" . " !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" . " ! If we are not doing transport, then make sure that\n" . " ! the floating pressure is set to PSC2 (bdf, bmy, 8/22/02) !-----------------------------------------!\n" . " IF ( .not. LTRAN ) CALL SET_FLOATING_PRESSURE( PSC2 ) ! PSC2 = p2 = interpolated pres at t=T+ΔT !\n" . " !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ !-----------------------------------------!\n" . " !#################################################\n" . "\n" . " ! Compute airmass quantities at each grid box \n" . " CALL AIRQNT\n" . " \n" . " ! Compute the cosine of the solar zenith angle at each grid box\n" . " CALL COSSZA( DAY_OF_YEAR, NHMSb, ELAPSED_SEC, SUNCOS )\n" . " \n" . " ! For SMVGEAR II, we also need to compute SUNCOS at\n" . " ! the end of this chemistry timestep (bdf, bmy, 4/1/03)\n" . " IF ( LCHEM .and. ITS_A_FULLCHEM_SIM() ) THEN\n" . " CALL COSSZA( DAY_OF_YEAR, NHMSb, \n" . " & ELAPSED_SEC+GET_TS_CHEM()*60, SUNCOSB )\n" . " ENDIF\n" . "\n" . " ! Compute tropopause height for ND55 diagnostic\n" . " IF ( ND55 > 0 ) CALL TROPOPAUSE\n" . "\n" . "#if defined( GEOS_3 )\n" . "\n" . " ! 1998 GEOS-3 carries the ground temperature and not the air\n" . " ! temperature -- thus TS will be 2-3 K too high. As a quick fix, \n" . " ! copy the temperature at the first sigma level into TS. \n" . " ! (mje, bnd, bmy, 7/3/01)\n" . " IF ( YEAR == 1998 ) TS(:,:) = T(:,:,1)\n" . "#endif\n" . "\n" . " ! Update dynamic timestep\n" . " CALL SET_CT_DYN( INCREMENT=.TRUE. )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INTERP, etc' )\n" . "\n" . " !==============================================================\n" . " ! ***** U N I T C O N V E R S I O N ( kg -> v/v ) *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_UNIT() ) THEN\n" . " CALL CONVERT_UNITS( 1, N_TRACERS, TCVV, AD, STT )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CONVERT_UNITS:1' )\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** S T R A T O S P H E R I C F L U X E S *****\n" . " !==============================================================\n" . " IF ( LUPBD ) CALL DO_UPBDFLX\n" . "\n" . " !==============================================================\n" . " ! ***** T R A N S P O R T *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_DYN() ) THEN\n" . "\n" . " ! Call the appropritate version of TPCORE\n" . " IF ( LTRAN ) CALL DO_TRANSPORT\n" . "\n" . " ! Reset air mass quantities\n" . " CALL AIRQNT\n" . "\n" . " ! Repartition [NOy] species after transport\n" . " IF ( LUPBD .and. ITS_A_FULLCHEM_SIM() ) THEN\n" . " !CALL UPBDFLX_NOY( 2 )\n" . " ENDIF\n" . "\n" . " ! Get relative humidity \n" . " ! (after recomputing pressure quantities)\n" . " CALL MAKE_RH\n" . "\n" . " ! Initialize wet scavenging and wetdep fields after\n" . " ! the airmass quantities are reset after transport\n" . " IF ( LCONV .or. LWETD ) CALL INIT_WETSCAV\n" . " ENDIF\n" . "\n" . " !-------------------------------\n" . " ! Test for convection timestep\n" . " !-------------------------------\n" . " IF ( ITS_TIME_FOR_CONV() ) THEN\n" . "\n" . " ! Increment the convection timestep\n" . " CALL SET_CT_CONV( INCREMENT=.TRUE. )\n" . "\n" . " !===========================================================\n" . " ! ***** M I X E D L A Y E R M I X I N G *****\n" . " !===========================================================\n" . " CALL DO_PBL_MIX( LTURB )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a TURBDAY:2' )\n" . "\n" . " !===========================================================\n" . " ! ***** C L O U D C O N V E C T I O N *****\n" . " !===========================================================\n" . " IF ( LCONV ) THEN\n" . " \n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . " CALL MAKE_CONVECTION_CHKFILE( NYMD, NHMS, TAU )\n" . "\n" . " CALL DO_CONVECTION\n" . " \n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CONVECTION' )\n" . " ENDIF \n" . " ENDIF \n" . "\n" . " !==============================================================\n" . " ! ***** U N I T C O N V E R S I O N ( v/v -> kg ) *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_UNIT() ) THEN \n" . " CALL CONVERT_UNITS( 2, N_TRACERS, TCVV, AD, STT )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CONVERT_UNITS:2' )\n" . " ENDIF\n" . "\n" . " !-------------------------------\n" . " ! Test for emission timestep\n" . " !-------------------------------\n" . " IF ( ITS_TIME_FOR_EMIS() ) THEN\n" . " \n" . " ! Increment emission counter\n" . " CALL SET_CT_EMIS( INCREMENT=.TRUE. )\n" . "\n" . " !========================================================\n" . " ! ***** D R Y D E P O S I T I O N *****\n" . " !========================================================\n" . " IF ( LDRYD ) CALL DO_DRYDEP\n" . "\n" . " !========================================================\n" . " ! ***** E M I S S I O N S *****\n" . " !========================================================\n" . " IF ( LEMIS ) CALL DO_EMISSIONS\n" . " ENDIF \n" . "\n" . " !===========================================================\n" . " ! ***** C H E M I S T R Y *****\n" . " !=========================================================== \n" . "\n" . " ! Every chemistry timestep...\n" . " IF ( ITS_TIME_FOR_CHEM() ) THEN\n" . "\n" . " ! Increment chemistry timestep counter\n" . " CALL SET_CT_CHEM( INCREMENT=.TRUE. )\n" . "\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . "\n" . " CALL MAKE_CHEMISTRY_CHKFILE(NYMD, NHMS, TAU)\n" . "\n" . " ! Call the appropriate chemistry routine\n" . " CALL DO_CHEMISTRY\n" . "\n" . " ENDIF \n" . " \n" . " !==============================================================\n" . " ! ***** W E T D E P O S I T I O N (rainout + washout) *****\n" . " !==============================================================\n" . " \n" . " IF ( LWETD .and. ITS_TIME_FOR_DYN() ) CALL DO_WETDEP\n" . "\n" . " !==============================================================\n" . " ! ***** E N D O F D Y N A M I C T I M E S T E P *****\n" . " !==============================================================\n" . "\n" . " ! Check for NaN, Negatives, Infinities in STT once per hour\n" . " IF ( ITS_TIME_FOR_DIAG() ) THEN\n" . " CALL CHECK_STT( 'End of Dynamic Loop' )\n" . " ENDIF\n" . "\n" . " ! Increment elapsed time\n" . " CALL SET_ELAPSED_MIN\n" . "\n" . " !--------------------------------------------------------------\n" . " ! ***** CHECKPOINTING EVERY DYNAMIC TIME STEP ***** \n" . " !--------------------------------------------------------------\n" . " CALL SET_CURRENT_TIME\n" . "\n" . " ENDDO\n" . "\n" . " !=================================================================\n" . " ! ***** C O P Y I - 6 F I E L D S *****\n" . " !\n" . " ! The I-6 fields at the end of this timestep become\n" . " ! the fields at the beginning of the next timestep\n" . " !=================================================================\n" . " CALL COPY_I6_FIELDS\n" . "\n" . " ENDDO \n" . "\n" . " !=================================================================\n" . " ! ***** C L E A N U P A N D Q U I T *****\n" . " !=================================================================\n" . " 9999 CONTINUE \n" . "\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU() \n" . "\n" . " IF(IT_NUM.eq.0)THEN \n" . " CALL MAKE_CHEMISTRY_CHKFILE_P( NYMD, NHMS, TAU )\n" . " ELSE IF(IT_NUM.eq.1)THEN\n" . " CALL MAKE_CHEMISTRY_CHKFILE_P1( NYMD, NHMS, TAU )\n" . " ELSE\n" . "\n" . " STT_O3(:,:,:,1) = STT(:,:,:,2) ! 2-O3, 3-PAN, 4-CO, 27-SO4\n" . " \n" . " CALL READ_CHEMISTRY_CHKFILE_P( NYMD, NHMS )\n" . " STT_O3P1(:,:,:,1) = STT(:,:,:,2) ! 2-O3, 3-PAN, 4-CO, 27-SO4\n" . "\n" . " CALL READ_CHEMISTRY_CHKFILE_P1( NYMD, NHMS )\n" . " STT_O3P2(:,:,:,1) = STT(:,:,:,2) ! 2-O3, 3-PAN, 4-CO\n" . "\n" . " STT = 0d0\n" . " OPEN(31,FILE='fd1_Ox')\n" . " OPEN(32,FILE='fd2_Ox')\n" . " \n" . " DO L=1,LLPAR\n" . " !IF(L/=1.and.L/=10.and.L/=15)CYCLE\n" . " !IF(L/=10) CYCLE\n" . " DO J=1,JJPAR\n" . " DO I=1,IIPAR\n" . " \n" . " fd = (STT_O3P1(I,J,L,1)-STT_O3(I,J,L,1))/\n" . " & max( PERT(I,J,L,1),1.d-8 ) !(0.01)\n" . "\n" . " STT(I,J,L,1) = fd\n" . " WRITE(31,*)fd\n" . "\n" . " fd = (STT_O3P1(I,J,L,1)-STT_O3P2(I,J,L,1))/\n" . " & (2*max( PERT(I,J,L,1),1.d-8 ))!(0.02) \n" . "\n" . " STT(I,J,L,2) = fd\n" . " WRITE(32,*)fd\n" . " \n" . " END DO\n" . " END DO\n" . " END DO\n" . "\n" . " CLOSE(31)\n" . " CLOSE(32)\n" . "\n" . " CALL MAKE_CHEMISTRY_CHKFILE_P2( NY_TMP, NH_TMP, TAU )\n" . "\n" . " CALL MAKE_CHEMISTRY_CHKFILE_P( NY_TMP, NH_TMP, TAU )\n" . "\n" . " ENDIF\n" . "\n" . " ! Print the mass-weighted mean OH concentration (if applicable)\n" . " CALL PRINT_DIAG_OH\n" . "\n" . " ! For model benchmarking, save final masses of \n" . " ! Rn,Pb,Be or Ox to a binary punch file \n" . " IF ( LSTDRUN ) CALL STDRUN( LBEGIN=.FALSE. )\n" . "\n" . " ! Print ending time of simulation\n" . " CALL DISPLAY_END_TIME\n" . "\n" . "!\n" . "!******************************************************************************\n" . "! Internal procedures -- Use the F90 CONTAINS command to inline \n" . "! subroutines that only can be called from this main program. \n" . "!\n" . "! All variables referenced in the main program (local variables, F90 \n" . "! module variables, or common block variables) also have scope within \n" . "! internal subroutines. \n" . "!\n" . "! List of Internal Procedures:\n" . "! ============================================================================\n" . "! (1 ) DISPLAY_GRID_AND_MODEL : Displays resolution, data set, & start time\n" . "! (2 ) GET_NYMD_PHIS : Gets YYYYMMDD for the PHIS data field\n" . "! (3 ) DISPLAY_SIGMA_LAT_LON : Displays sigma, lat, and lon information\n" . "! (4 ) GET_WIND10M : Wrapper for MAKE_WIND10M (from \"dao_mod.f\")\n" . "! (5 ) CTM_FLUSH : Flushes diagnostic files to disk\n" . "! (6 ) DISPLAY_END_TIME : Displays ending time of simulation\n" . "! (7 ) MET_FIELD_DEBUG : Prints min and max of met fields for debug\n" . "!******************************************************************************\n" . "!\n" . " END SUBROUTINE DO_GC_FWD\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE DISPLAY_GRID_AND_MODEL\n" . "\n" . " !=================================================================\n" . " ! Internal Subroutine DISPLAY_GRID_AND_MODEL displays the \n" . " ! appropriate messages for the given model grid and machine type.\n" . " ! It also prints the starting time and date (local time) of the\n" . " ! GEOS-CHEM simulation. (bmy, 12/2/03, 10/18/05)\n" . " !=================================================================\n" . "\n" . " ! For system time stamp\n" . " CHARACTER(LEN=16) :: STAMP\n" . "\n" . " !-----------------------\n" . " ! Print resolution info\n" . " !-----------------------\n" . "#if defined( GRID4x5 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) //\n" . " & ' S T A R T I N G 4 x 5 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID2x25 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 2 x 2.5 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID1x125 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 1 x 1.25 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID1x1 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 1 x 1 G E O S -- C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! Print machine info\n" . " !-----------------------\n" . "\n" . " ! Get the proper FORMAT statement for the model being used\n" . "#if defined( COMPAQ )\n" . " WRITE( 6, '(a)' ) 'Created w/ HP/COMPAQ Alpha compiler'\n" . "#elif defined( IBM_AIX )\n" . " WRITE( 6, '(a)' ) 'Created w/ IBM-AIX compiler'\n" . "#elif defined( LINUX_PGI )\n" . " WRITE( 6, '(a)' ) 'Created w/ LINUX/PGI compiler'\n" . "#elif defined( LINUX_IFORT )\n" . " WRITE( 6, '(a)' ) 'Created w/ LINUX/IFORT (64-bit) compiler'\n" . "#elif defined( SGI_MIPS )\n" . " WRITE( 6, '(a)' ) 'Created w/ SGI MIPSpro compiler'\n" . "#elif defined( SPARC )\n" . " WRITE( 6, '(a)' ) 'Created w/ Sun/SPARC compiler'\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! Print met field info\n" . " !-----------------------\n" . "#if defined( GEOS_3 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-3 met fields'\n" . "#elif defined( GEOS_4 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-4/fvDAS met fields'\n" . "#elif defined( GEOS_5 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-5/fvDAS met fields'\n" . "#elif defined( GCAP )\n" . " WRITE( 6, '(a)' ) 'Using GCAP/GISS met fields'\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! System time stamp\n" . " !-----------------------\n" . " STAMP = SYSTEM_TIMESTAMP()\n" . " WRITE( 6, 100 ) STAMP\n" . " 100 FORMAT( /, '===> SIMULATION START TIME: ', a, ' <===', / )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE DISPLAY_GRID_AND_MODEL\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " FUNCTION ITS_TIME_FOR_BPCH() RESULT( DO_BPCH )\n" . "\n" . " !=================================================================\n" . " ! Internal function ITS_TIME_FOR_BPCH returns TRUE if it is time\n" . " ! to write to the binary punch file and FALSE otherwise.\n" . " !=================================================================\n" . "\n" . " ! Local variables\n" . " INTEGER :: TODAY, THIS_NJDAY, NHMS, NDIAGTIME\n" . " \n" . " ! Function value\n" . " LOGICAL :: DO_BPCH\n" . "\n" . " !=================================================================\n" . " ! ITS_TIME_FOR_BPCH begins here!\n" . " !================================================================= \n" . " \n" . " ! Return FALSE if it's the first timestep\n" . " IF ( GET_TAU() == GET_TAUb() ) THEN\n" . " DO_BPCH = .FALSE.\n" . " RETURN\n" . " ENDIF\n" . "\n" . " ! Current day of year\n" . " TODAY = GET_DAY_OF_YEAR()\n" . "\n" . " ! Current time of day\n" . " NHMS = GET_NHMS()\n" . "\n" . " ! Time of day to write bpch files to disk\n" . " NDIAGTIME = GET_NDIAGTIME()\n" . "\n" . " ! Look up appropriate value of NJDAY array. We may need to add a\n" . " ! day to skip past the Feb 29 element of NJDAY for non-leap-years.\n" . " IF ( .not. ITS_A_LEAPYEAR( FORCE=.TRUE. ) .and. TODAY > 59 ) THEN\n" . " THIS_NJDAY = NJDAY( TODAY + 1 ) \n" . " ELSE\n" . " THIS_NJDAY = NJDAY( TODAY )\n" . " ENDIF\n" . "\n" . " ! Test if this is the day & time to write to the BPCH file!\n" . " IF ( ( THIS_NJDAY > 0 ) .and. NHMS == NDIAGTIME ) THEN\n" . " DO_BPCH = .TRUE.\n" . " ELSE\n" . " DO_BPCH = .FALSE.\n" . " ENDIF\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION ITS_TIME_FOR_BPCH\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE CTM_FLUSH\n" . "\n" . " !================================================================\n" . " ! Internal subroutine CTM_FLUSH flushes certain diagnostic\n" . " ! file buffers to disk. (bmy, 8/31/00, 7/1/02)\n" . " !\n" . " ! CTM_FLUSH should normally be called after each diagnostic \n" . " ! output, so that in case the run dies, the output files from \n" . " ! the last diagnostic timestep will not be lost. \n" . " !\n" . " ! FLUSH is an intrinsic FORTRAN subroutine and takes as input \n" . " ! the unit number of the file to be flushed to disk.\n" . " !================================================================\n" . " CALL FLUSH( IU_ND48 ) \n" . " CALL FLUSH( IU_BPCH ) \n" . " CALL FLUSH( IU_SMV2LOG ) \n" . " CALL FLUSH( IU_DEBUG ) \n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE CTM_FLUSH\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE DISPLAY_END_TIME\n" . "\n" . " !=================================================================\n" . " ! Internal subroutine DISPLAY_END_TIME prints the ending time of\n" . " ! the GEOS-CHEM simulation (bmy, 5/3/05)\n" . " !=================================================================\n" . "\n" . " ! Local variables\n" . " CHARACTER(LEN=16) :: STAMP\n" . "\n" . " ! Print system time stamp\n" . " STAMP = SYSTEM_TIMESTAMP()\n" . " WRITE( 6, 100 ) STAMP\n" . " 100 FORMAT( /, '===> SIMULATION END TIME: ', a, ' <===', / )\n" . "\n" . " ! Echo info\n" . " WRITE ( 6, 3000 ) \n" . " 3000 FORMAT\n" . " & ( /, '************** E N D O F G E O S -- C H E M ',\n" . " & '**************' )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE DISPLAY_END_TIME\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MET_FIELD_DEBUG\n" . "\n" . " !=================================================================\n" . " ! Internal subroutine MET_FIELD_DEBUG prints out the maximum\n" . " ! and minimum, and sum of DAO met fields for debugging \n" . " !=================================================================\n" . "\n" . " ! References to F90 modules\n" . " USE DAO_MOD, ONLY : AD, AIRDEN, AIRVOL, ALBD1, ALBD2\n" . " USE DAO_MOD, ONLY : ALBD, AVGW, BXHEIGHT, CLDFRC, CLDF \n" . " USE DAO_MOD, ONLY : CLDMAS, CLDTOPS, DELP \n" . " USE DAO_MOD, ONLY : DTRAIN, GWETTOP, HFLUX, HKBETA, HKETA \n" . " USE DAO_MOD, ONLY : LWI, MOISTQ, OPTD, OPTDEP, PBL \n" . " USE DAO_MOD, ONLY : PREACC, PRECON, PS1, PS2, PSC2 \n" . " USE DAO_MOD, ONLY : RADLWG, RADSWG, RH, SLP, SNOW \n" . " USE DAO_MOD, ONLY : SPHU1, SPHU2, SPHU, SUNCOS, SUNCOSB \n" . " USE DAO_MOD, ONLY : TMPU1, TMPU2, T, TROPP, TS \n" . " USE DAO_MOD, ONLY : TSKIN, U10M, USTAR, UWND1, UWND2 \n" . " USE DAO_MOD, ONLY : UWND, V10M, VWND1, VWND2, VWND \n" . " USE DAO_MOD, ONLY : Z0, ZMEU, ZMMD, ZMMU \n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, L, IJ\n" . "\n" . " !=================================================================\n" . " ! MET_FIELD_DEBUG begins here!\n" . " !=================================================================\n" . "\n" . " ! Define box to print out\n" . " I = 23\n" . " J = 34\n" . " L = 1\n" . " IJ = ( ( J-1 ) * IIPAR ) + I\n" . "\n" . " !=================================================================\n" . " ! Print out met fields at (I,J,L)\n" . " !=================================================================\n" . " IF ( ALLOCATED( AD ) ) PRINT*, 'AD : ', AD(I,J,L) \n" . " IF ( ALLOCATED( AIRDEN ) ) PRINT*, 'AIRDEN : ', AIRDEN(L,I,J) \n" . " IF ( ALLOCATED( AIRVOL ) ) PRINT*, 'AIRVOL : ', AIRVOL(I,J,L) \n" . " IF ( ALLOCATED( ALBD1 ) ) PRINT*, 'ALBD1 : ', ALBD1(I,J) \n" . " IF ( ALLOCATED( ALBD2 ) ) PRINT*, 'ALBD2 : ', ALBD2(I,J) \n" . " IF ( ALLOCATED( ALBD ) ) PRINT*, 'ALBD : ', ALBD(I,J) \n" . " IF ( ALLOCATED( AVGW ) ) PRINT*, 'AVGW : ', AVGW(I,J,L) \n" . " IF ( ALLOCATED( BXHEIGHT ) ) PRINT*, 'BXHEIGHT: ', BXHEIGHT(I,J,L) \n" . " IF ( ALLOCATED( CLDFRC ) ) PRINT*, 'CLDFRC : ', CLDFRC(I,J)\n" . " IF ( ALLOCATED( CLDF ) ) PRINT*, 'CLDF : ', CLDF(L,I,J) \n" . " IF ( ALLOCATED( CLDMAS ) ) PRINT*, 'CLDMAS : ', CLDMAS(I,J,L) \n" . " IF ( ALLOCATED( CLDTOPS ) ) PRINT*, 'CLDTOPS : ', CLDTOPS(I,J) \n" . " IF ( ALLOCATED( DELP ) ) PRINT*, 'DELP : ', DELP(L,I,J) \n" . " IF ( ALLOCATED( DTRAIN ) ) PRINT*, 'DTRAIN : ', DTRAIN(I,J,L) \n" . " IF ( ALLOCATED( GWETTOP ) ) PRINT*, 'GWETTOP : ', GWETTOP(I,J) \n" . " IF ( ALLOCATED( HFLUX ) ) PRINT*, 'HFLUX : ', HFLUX(I,J) \n" . " IF ( ALLOCATED( HKBETA ) ) PRINT*, 'HKBETA : ', HKBETA(I,J,L) \n" . " IF ( ALLOCATED( HKETA ) ) PRINT*, 'HKETA : ', HKETA(I,J,L) \n" . " IF ( ALLOCATED( LWI ) ) PRINT*, 'LWI : ', LWI(I,J) \n" . " IF ( ALLOCATED( MOISTQ ) ) PRINT*, 'MOISTQ : ', MOISTQ(L,I,J) \n" . " IF ( ALLOCATED( OPTD ) ) PRINT*, 'OPTD : ', OPTD(L,I,J) \n" . " IF ( ALLOCATED( OPTDEP ) ) PRINT*, 'OPTDEP : ', OPTDEP(L,I,J) \n" . " IF ( ALLOCATED( PBL ) ) PRINT*, 'PBL : ', PBL(I,J) \n" . " IF ( ALLOCATED( PREACC ) ) PRINT*, 'PREACC : ', PREACC(I,J) \n" . " IF ( ALLOCATED( PRECON ) ) PRINT*, 'PRECON : ', PRECON(I,J) \n" . " IF ( ALLOCATED( PS1 ) ) PRINT*, 'PS1 : ', PS1(I,J) \n" . " IF ( ALLOCATED( PS2 ) ) PRINT*, 'PS2 : ', PS2(I,J) \n" . " IF ( ALLOCATED( PSC2 ) ) PRINT*, 'PSC2 : ', PSC2(I,J)\n" . " IF ( ALLOCATED( RADLWG ) ) PRINT*, 'RADLWG : ', RADLWG(I,J)\n" . " IF ( ALLOCATED( RADSWG ) ) PRINT*, 'RADSWG : ', RADSWG(I,J)\n" . " IF ( ALLOCATED( RH ) ) PRINT*, 'RH : ', RH(I,J,L) \n" . " IF ( ALLOCATED( SLP ) ) PRINT*, 'SLP : ', SLP(I,J) \n" . " IF ( ALLOCATED( SNOW ) ) PRINT*, 'SNOW : ', SNOW(I,J) \n" . " IF ( ALLOCATED( SPHU1 ) ) PRINT*, 'SPHU1 : ', SPHU1(I,J,L) \n" . " IF ( ALLOCATED( SPHU2 ) ) PRINT*, 'SPHU2 : ', SPHU2(I,J,L) \n" . " IF ( ALLOCATED( SPHU ) ) PRINT*, 'SPHU : ', SPHU(I,J,L) \n" . " IF ( ALLOCATED( SUNCOS ) ) PRINT*, 'SUNCOS : ', SUNCOS(IJ) \n" . " IF ( ALLOCATED( SUNCOSB ) ) PRINT*, 'SUNCOSB : ', SUNCOSB(IJ) \n" . " IF ( ALLOCATED( TMPU1 ) ) PRINT*, 'TMPU1 : ', TMPU1(I,J,L) \n" . " IF ( ALLOCATED( TMPU2 ) ) PRINT*, 'TMPU2 : ', TMPU2(I,J,L) \n" . " IF ( ALLOCATED( T ) ) PRINT*, 'TMPU : ', T(I,J,L)\n" . " IF ( ALLOCATED( TROPP ) ) PRINT*, 'TROPP : ', TROPP(I,J) \n" . " IF ( ALLOCATED( TS ) ) PRINT*, 'TS : ', TS(I,J) \n" . " IF ( ALLOCATED( TSKIN ) ) PRINT*, 'TSKIN : ', TSKIN(I,J) \n" . " IF ( ALLOCATED( U10M ) ) PRINT*, 'U10M : ', U10M(I,J) \n" . " IF ( ALLOCATED( USTAR ) ) PRINT*, 'USTAR : ', USTAR(I,J) \n" . " IF ( ALLOCATED( UWND1 ) ) PRINT*, 'UWND1 : ', UWND1(I,J,L) \n" . " IF ( ALLOCATED( UWND2 ) ) PRINT*, 'UWND2 : ', UWND2(I,J,L) \n" . " IF ( ALLOCATED( UWND ) ) PRINT*, 'UWND : ', UWND(I,J,L) \n" . " IF ( ALLOCATED( V10M ) ) PRINT*, 'V10M : ', V10M(I,J) \n" . " IF ( ALLOCATED( VWND1 ) ) PRINT*, 'VWND1 : ', VWND1(I,J,L) \n" . " IF ( ALLOCATED( VWND2 ) ) PRINT*, 'VWND2 : ', VWND2(I,J,L) \n" . " IF ( ALLOCATED( VWND ) ) PRINT*, 'VWND : ', VWND(I,J,L) \n" . " IF ( ALLOCATED( Z0 ) ) PRINT*, 'Z0 : ', Z0(I,J) \n" . " IF ( ALLOCATED( ZMEU ) ) PRINT*, 'ZMEU : ', ZMEU(I,J,L) \n" . " IF ( ALLOCATED( ZMMD ) ) PRINT*, 'ZMMD : ', ZMMD(I,J,L) \n" . " IF ( ALLOCATED( ZMMU ) ) PRINT*, 'ZMMU : ', ZMMU(I,J,L) \n" . "\n" . " ! Flush the output buffer\n" . " CALL FLUSH( 6 )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE MET_FIELD_DEBUG\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " ! End of program\n" . " END MODULE SUBDRIVER_FWD\n"; close(FILE); } #============================================= # Create subdriver_fwd_senst.f #============================================= sub createSubdriverFwdSenst() { printf "Creating subdriver_fwd_senst.f\n"; open(FILE, ">subdriver_fwd_senst.f") || die "Unable to open subdriver_fwd_senst.f"; print FILE "\n" . "! =============================================================\n" . "! subdriver_fwd_fd.f, 2008/24/01 Kumaresh \$\n" . "! Forward finite-difference driver is a modified version of\n" . "! main driver for GEOS-Chem to carryout finite difference tests\n" . "! =============================================================\n" . "!\n" . "! \$Id: main.f,v 1.42 2006/10/17 17:51:14 bmy Exp \$\n" . "! \$Log: main.f,v \$\n" . "! Revision 1.42 2006/10/17 17:51:14 bmy\n" . "! GEOS-Chem v7-04-10, includes the following modifications:\n" . "! - Includes variable tropopause with ND54 diagnostic\n" . "! - Added GFED2 biomass emissions for SO2, NH3, BC, OC, CO2\n" . "! - Rewrote default biomass emissions routines for clarity\n" . "! - Updates for GCAP: future emissions, met-field reading, TOMS-O3\n" . "! - Bug fix in planeflight_mod.f: set NCS variable correctly\n" . "! - Bug fix in SOA_LUMP; other minor bug fixes\n" . "!\n" . "! GEOS-Chem v7-04-09, includes the following modifications:\n" . "! - Updated CO for David Streets (2001 for China, 2000 elsewhere)\n" . "! - Now reset negative SPHU to a very small positive #\n" . "! - Remove use of TINY(1d0) to avoid NaN's on SUN platform\n" . "! - Minor bug fixes and deleted obsolete code\n" . "!\n" . "! Revision 1.38 2006/08/14 17:58:10 bmy\n" . "! GEOS-Chem v7-04-08, includes the following modifications:\n" . "! - Now add David Streets' emissions for China & SE Asia\n" . "! - Removed support for GEOS-1 and GEOS-STRAT met fields\n" . "! - Removed support for LINUX_IFC and LINUX_EFC compilers\n" . "!\n" . "! Revision 1.37 2006/06/28 17:26:52 bmy\n" . "! GEOS-Chem v7-04-06, includes the following modifications:\n" . "! - Now add BRAVO emissions (NOx, CO, SO2) over N. Mexico\n" . "! - Turn off HO2 uptake by aerosols in SMVGEAR mechanism\n" . "! - Bug fix: GEOS-4 convection now conserves mixing ratio\n" . "! - Other minor bug fixes & improvements\n" . "!\n" . "! Revision 1.36 2006/06/06 14:26:07 bmy\n" . "! GEOS-Chem v7-04-05, includes the following modifications:\n" . "! - Now gets ISOP that has reacted w/ OH from SMVGEAR (cf. D. Henze)\n" . "! - Incorporated IPCC future emission scale factors (cf. S. Wu)\n" . "! - Other minor bug fixes\n" . "!\n" . "! Revision 1.35 2006/05/26 17:45:24 bmy\n" . "! GEOS-Chem v7-04-04, includes the following modifications:\n" . "! - Now updated for SOA production from ISOP (cf D. Henze)\n" . "! - Now archive SOA concentrations in [ug/m3] (\"diag42_mod.f\")\n" . "! - Other minor bug fixes\n" . "!\n" . "! Revision 1.34 2006/05/15 17:52:52 bmy\n" . "! GEOS-Chem v7-04-03, includes the following modifications:\n" . "! - Added near-land formulation for lightning\n" . "! - Now can use CTH, MFLUX, PRECON params for lightning\n" . "! (NOTE: new lightning is only applied for GEOS-4 for time being)\n" . "! - Added ND56 diagnostic for lightning flash rates\n" . "! - Fixed Feb 28 -> Mar 1 transition for GCAP (i.e. no leap years)\n" . "! - Other minor bug fixes\n" . "!\n" . "! Revision 1.33 2006/03/24 20:22:53 bmy\n" . "! GEOS-CHEM v7-04-01, includes the following modifications:\n" . "! - Updates to new Hg simulation (eck, cdh, sas)\n" . "! - Changed Reynold's # criterion for aerodyn smooth surfaces in drydep\n" . "! - Standardized several bug fixes implemented in v7-03-06 patch\n" . "! - Bug fix: Now call MAKE_RH from \"main.f\" to avoid problems in drydep\n" . "! - Removed obsolete code\n" . "!\n" . " MODULE SUBDRIVER_FWD\n" . "! \n" . "!******************************************************************************\n" . "! \n" . "! \n" . "! GGGGGG EEEEEEE OOOOO SSSSSSS CCCCCC H H EEEEEEE M M \n" . "! G E O O S C H H E M M M M \n" . "! G GGG EEEEEE O O SSSSSSS C HHHHHHH EEEEEE M M M \n" . "! G G E O O S C H H E M M \n" . "! GGGGGG EEEEEEE OOOOO SSSSSSS CCCCCC H H EEEEEEE M M \n" . "! \n" . "! \n" . "! (formerly known as the Harvard-GEOS model)\n" . "! for 4 x 5, 2 x 2.5 global grids and 1 x 1 nested grids\n" . "!\n" . "! Contact: Bob Yantosca, Harvard University (bmy.as.harvard.edu)\n" . "! \n" . "!******************************************************************************\n" . "!\n" . "! See the GEOS-Chem Web Site:\n" . "!\n" . "! http://www.as.harvard.edu/chemistry/trop/geos/\n" . "!\n" . "! and the GEOS-CHEM User's Guide:\n" . "!\n" . "! http://www.as.harvard.edu/chemistry/trop/geos/doc/man/\n" . "!\n" . "! for the most up-to-date GEOS-CHEM documentation on the following topics:\n" . "!\n" . "! - installation, compilation, and execution\n" . "! - coding practice and style\n" . "! - input files and met field data files\n" . "! - horizontal and vertical resolution\n" . "! - modification history\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules \n" . " USE A3_READ_MOD, ONLY : GET_A3_FIELDS\n" . " USE A3_READ_MOD, ONLY : OPEN_A3_FIELDS\n" . " USE A3_READ_MOD, ONLY : UNZIP_A3_FIELDS\n" . " USE A6_READ_MOD, ONLY : GET_A6_FIELDS\n" . " USE A6_READ_MOD, ONLY : OPEN_A6_FIELDS\n" . " USE A6_READ_MOD, ONLY : UNZIP_A6_FIELDS\n" . " USE CHECKPOINT_MOD \n" . " USE CHEMISTRY_MOD, ONLY : DO_CHEMISTRY\n" . " USE BENCHMARK_MOD, ONLY : STDRUN\n" . " USE CONVECTION_MOD, ONLY : DO_CONVECTION\n" . " USE COMODE_MOD, ONLY : INIT_COMODE, CSPEC, IXSAVE, IYSAVE, \n" . " & IZSAVE\n" . " USE DIAG_MOD, ONLY : DIAGCHLORO\n" . " USE DIAG41_MOD, ONLY : DIAG41, ND41\n" . " USE DIAG42_MOD, ONLY : DIAG42, ND42\n" . " USE DIAG48_MOD, ONLY : DIAG48, ITS_TIME_FOR_DIAG48\n" . " USE DIAG49_MOD, ONLY : DIAG49, ITS_TIME_FOR_DIAG49\n" . " USE DIAG50_MOD, ONLY : DIAG50, DO_SAVE_DIAG50\n" . " USE DIAG51_MOD, ONLY : DIAG51, DO_SAVE_DIAG51\n" . " USE DIAG_OH_MOD, ONLY : PRINT_DIAG_OH\n" . " USE DAO_MOD, ONLY : AD, AIRQNT \n" . " USE DAO_MOD, ONLY : AVGPOLE, CLDTOPS\n" . " USE DAO_MOD, ONLY : CONVERT_UNITS, COPY_I6_FIELDS\n" . " USE DAO_MOD, ONLY : COSSZA, INIT_DAO\n" . " USE DAO_MOD, ONLY : INTERP, PS1\n" . " USE DAO_MOD, ONLY : PS2, PSC2 \n" . " USE DAO_MOD, ONLY : T, TS \n" . " USE DAO_MOD, ONLY : SUNCOS, SUNCOSB\n" . " USE DAO_MOD, ONLY : MAKE_RH\n" . " USE DRYDEP_MOD, ONLY : DO_DRYDEP\n" . " USE EMISSIONS_MOD, ONLY : DO_EMISSIONS\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_BPCH, IU_DEBUG\n" . " USE FILE_MOD, ONLY : IU_ND48, IU_SMV2LOG \n" . " USE FILE_MOD, ONLY : CLOSE_FILES\n" . " USE GLOBAL_CH4_MOD, ONLY : INIT_GLOBAL_CH4, CH4_AVGTP\n" . " USE GCAP_READ_MOD, ONLY : GET_GCAP_FIELDS\n" . " USE GCAP_READ_MOD, ONLY : OPEN_GCAP_FIELDS\n" . " USE GCAP_READ_MOD, ONLY : UNZIP_GCAP_FIELDS\n" . " USE GWET_READ_MOD, ONLY : GET_GWET_FIELDS\n" . " USE GWET_READ_MOD, ONLY : OPEN_GWET_FIELDS\n" . " USE GWET_READ_MOD, ONLY : UNZIP_GWET_FIELDS\n" . " USE I6_READ_MOD, ONLY : GET_I6_FIELDS_1\n" . " USE I6_READ_MOD, ONLY : GET_I6_FIELDS_2\n" . " USE I6_READ_MOD, ONLY : OPEN_I6_FIELDS\n" . " USE I6_READ_MOD, ONLY : UNZIP_I6_FIELDS\n" . " USE INPUT_MOD, ONLY : READ_INPUT_FILE\n" . " USE LAI_MOD, ONLY : RDISOLAI\n" . " USE LIGHTNING_NOX_MOD, ONLY : LIGHTNING\n" . " !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " !%%% NOTE: Temporary kludge: For GEOS-4 we want to use the new near-land\n" . " !%%% lightning formulation. But for the time being, we must keep the \n" . " !%%% existing lightning for other met field types. (ltm, bmy, 5/10/06)\n" . " USE LIGHTNING_NOX_NL_MOD, ONLY : LIGHTNING_NL\n" . " !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " USE LOGICAL_MOD, ONLY : LEMIS, LCHEM, LUNZIP, LDUST\n" . " USE LOGICAL_MOD, ONLY : LLIGHTNOX, LPRT, LSTDRUN, LSVGLB\n" . " USE LOGICAL_MOD, ONLY : LWAIT, LTRAN, LUPBD, LCONV\n" . " USE LOGICAL_MOD, ONLY : LWETD, LTURB, LDRYD, LMEGAN \n" . " USE LOGICAL_MOD, ONLY : LDYNOCEAN, LSOA, LVARTROP\n" . " USE LOGICAL_MOD, ONLY : LSULF, LCARB, LSSALT\n" . " USE MEGAN_MOD, ONLY : INIT_MEGAN\n" . " USE MEGAN_MOD, ONLY : UPDATE_T_15_AVG\n" . " USE MEGAN_MOD, ONLY : UPDATE_T_DAY\n" . " USE PBL_MIX_MOD, ONLY : DO_PBL_MIX\n" . " USE OCEAN_MERCURY_MOD, ONLY : MAKE_OCEAN_Hg_RESTART\n" . " USE OCEAN_MERCURY_MOD, ONLY : READ_OCEAN_Hg_RESTART\n" . " USE PLANEFLIGHT_MOD, ONLY : PLANEFLIGHT\n" . " USE PLANEFLIGHT_MOD, ONLY : SETUP_PLANEFLIGHT \n" . " USE PRESSURE_MOD, ONLY : INIT_PRESSURE\n" . " USE PRESSURE_MOD, ONLY : SET_FLOATING_PRESSURE\n" . " USE TIME_MOD, ONLY : GET_NYMDb, GET_NHMSb\n" . " USE TIME_MOD, ONLY : GET_NYMD, GET_NHMS\n" . " USE TIME_MOD, ONLY : GET_A3_TIME, GET_FIRST_A3_TIME\n" . " USE TIME_MOD, ONLY : GET_A6_TIME, GET_FIRST_A6_TIME\n" . " USE TIME_MOD, ONLY : GET_I6_TIME, GET_MONTH\n" . " USE TIME_MOD, ONLY : GET_TAU, GET_TAUb\n" . " USE TIME_MOD, ONLY : GET_TS_CHEM, GET_TS_DYN\n" . " USE TIME_MOD, ONLY : GET_ELAPSED_SEC, GET_TIME_AHEAD\n" . " USE TIME_MOD, ONLY : GET_DAY_OF_YEAR, ITS_A_NEW_DAY\n" . " USE TIME_MOD, ONLY : ITS_A_NEW_SEASON, GET_SEASON\n" . " USE TIME_MOD, ONLY : ITS_A_NEW_MONTH, GET_NDIAGTIME\n" . " USE TIME_MOD, ONLY : ITS_A_LEAPYEAR, GET_YEAR\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_A3, ITS_TIME_FOR_A6\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_I6, ITS_TIME_FOR_CHEM\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_CONV,ITS_TIME_FOR_DEL\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_DIAG,ITS_TIME_FOR_DYN\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_EMIS,ITS_TIME_FOR_EXIT\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_UNIT,ITS_TIME_FOR_UNZIP\n" . " USE TIME_MOD, ONLY : SET_CT_CONV, SET_CT_DYN\n" . " USE TIME_MOD, ONLY : SET_CT_EMIS, SET_CT_CHEM\n" . " USE TIME_MOD, ONLY : SET_DIAGb, SET_DIAGe\n" . " USE TIME_MOD, ONLY : SET_CURRENT_TIME, PRINT_CURRENT_TIME\n" . " USE TIME_MOD, ONLY : SET_ELAPSED_MIN, SYSTEM_TIMESTAMP\n" . " USE TRACER_MOD, ONLY : CHECK_STT,N_TRACERS,STT,TCVV,PERT\n" . " USE TRACER_MOD, ONLY : ITS_AN_AEROSOL_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_CH4_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_FULLCHEM_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_MERCURY_SIM\n" . " USE TRACERID_MOD, ONLY : IDO3\n" . " USE TRANSPORT_MOD, ONLY : DO_TRANSPORT\n" . " USE TROPOPAUSE_MOD, ONLY : READ_TROPOPAUSE, CHECK_VAR_TROP\n" . " USE RESTART_MOD, ONLY : MAKE_RESTART_FILE, READ_RESTART_FILE\n" . " USE UPBDFLX_MOD, ONLY : DO_UPBDFLX, UPBDFLX_NOY\n" . " USE UVALBEDO_MOD, ONLY : READ_UVALBEDO\n" . " USE WETSCAV_MOD, ONLY : INIT_WETSCAV, DO_WETDEP\n" . " USE XTRA_READ_MOD, ONLY : GET_XTRA_FIELDS, OPEN_XTRA_FIELDS\n" . " USE XTRA_READ_MOD, ONLY : UNZIP_XTRA_FIELDS\n" . " USE GCKPP_Global \n" . "\n" . " ! Force all variables to be declared explicitly\n" . " IMPLICIT NONE\n" . " \n" . " ! Header files \n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"CMN_DIAG\" ! Diagnostic switches, NJDAY\n" . "# include \"CMN_GCTM\" ! Physical constants\n" . "# include \"CMN\"\n" . "\n" . " ! Local variables\n" . " LOGICAL :: FIRST = .TRUE.\n" . " LOGICAL :: LXTRA \n" . " INTEGER :: I, IOS, J, K, L\n" . " INTEGER :: N, JDAY, NDIAGTIME, N_DYN\n" . " INTEGER :: N_DYN_STEPS, NSECb, N_STEP, DATE(2)\n" . " INTEGER :: YEAR, MONTH, DAY, DAY_OF_YEAR\n" . " INTEGER :: SEASON, NYMD, NYMDb, NHMS\n" . " INTEGER :: ELAPSED_SEC, NHMSb, NH_TMP, NY_TMP\n" . " REAL*8 :: TAU, TAUb \n" . " CHARACTER(LEN=255) :: ZTYPE \n" . "\n" . " CONTAINS\n" . "\n" . " SUBROUTINE DO_GC_FWD()\n" . "\n" . " INTEGER JLOOP\n" . "\n" . " REAL*8 :: OMP_GET_WTIME\n" . " \n" . "\n" . " !=================================================================\n" . " ! GEOS-CHEM starts here! \n" . " !=================================================================\n" . "\n" . " ! Display current grid resolution and data set type\n" . " CALL DISPLAY_GRID_AND_MODEL\n" . "\n" . " !=================================================================\n" . " ! ***** I N I T I A L I Z A T I O N *****\n" . " !=================================================================\n" . "\n" . " ! Read input file and call init routines from other modules\n" . " CALL READ_INPUT_FILE \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a READ_INPUT_FILE' )\n" . "\n" . " ! Initialize met field arrays from \"dao_mod.f\"\n" . " CALL INIT_DAO\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INIT_DAO' )\n" . "\n" . " ! Initialize diagnostic arrays and counters\n" . " CALL INITIALIZE( 2 )\n" . " CALL INITIALIZE( 3 )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INITIALIZE' )\n" . "\n" . " ! Initialize the new hybrid pressure module. Define Ap and Bp.\n" . " CALL INIT_PRESSURE\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INIT_PRESSURE' )\n" . "\n" . " ! Read annual mean tropopause if not a variable tropopause\n" . " ! read_tropopause is obsolete with variable tropopause\n" . " IF ( .not. LVARTROP ) THEN\n" . " CALL READ_TROPOPAUSE\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a READ_TROPOPAUSE' )\n" . " ENDIF\n" . "\n" . " ! Initialize allocatable SMVGEAR arrays\n" . " IF ( LEMIS .or. LCHEM ) THEN\n" . " IF ( ITS_A_FULLCHEM_SIM() ) CALL INIT_COMODE\n" . " IF ( ITS_AN_AEROSOL_SIM() ) CALL INIT_COMODE\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INIT_COMODE' )\n" . " ENDIF\n" . " \n" . " ! Allocate arrays from \"global_ch4_mod.f\" for CH4 run \n" . " IF ( ITS_A_CH4_SIM() ) CALL INIT_GLOBAL_CH4\n" . "\n" . " ! Initialize MEGAN arrays, get 15-day avg temperatures\n" . " IF ( LMEGAN ) THEN\n" . " CALL INIT_MEGAN\n" . " CALL INITIALIZE( 2 )\n" . " CALL INITIALIZE( 3 )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INIT_MEGAN' )\n" . " ENDIF\n" . "\n" . " ! Local flag for reading XTRA fields for GEOS-3\n" . " !LXTRA = ( LDUST .or. LMEGAN )\n" . " LXTRA = LMEGAN\n" . "\n" . " ! Define time variables for use below\n" . " NHMS = GET_NHMS()\n" . " NHMSb = GET_NHMSb()\n" . " NYMD = GET_NYMD()\n" . " NYMDb = GET_NYMDb()\n" . " TAU = GET_TAU()\n" . " TAUb = GET_TAUb()\n" . "\n" . " !=================================================================\n" . " ! ***** U N Z I P M E T F I E L D S \@ start of run *****\n" . " !=================================================================\n" . " IF ( LUNZIP ) THEN\n" . "\n" . " !---------------------\n" . " ! Remove all files\n" . " !---------------------\n" . "\n" . " ! Type of unzip operation\n" . " ZTYPE = 'remove all'\n" . " \n" . " ! Remove any leftover A-3, A-6, I-6, in temp dir\n" . " CALL UNZIP_A3_FIELDS( ZTYPE )\n" . " CALL UNZIP_A6_FIELDS( ZTYPE )\n" . " CALL UNZIP_I6_FIELDS( ZTYPE )\n" . "\n" . "#if defined( GEOS_3 )\n" . " ! Remove GEOS-3 GWET and XTRA files \n" . " IF ( LDUST ) CALL UNZIP_GWET_FIELDS( ZTYPE )\n" . " IF ( LXTRA ) CALL UNZIP_XTRA_FIELDS( ZTYPE )\n" . "#endif\n" . "\n" . "#if defined( GCAP )\n" . " ! Unzip GCAP PHIS field (if necessary)\n" . " CALL UNZIP_GCAP_FIELDS( ZTYPE )\n" . "#endif\n" . "\n" . " !---------------------\n" . " ! Unzip in foreground\n" . " !---------------------\n" . "\n" . " ! Type of unzip operation\n" . " ZTYPE = 'unzip foreground'\n" . "\n" . " ! Unzip A-3, A-6, I-6 files for START of run\n" . " CALL UNZIP_A3_FIELDS( ZTYPE, NYMDb )\n" . " CALL UNZIP_A6_FIELDS( ZTYPE, NYMDb )\n" . " CALL UNZIP_I6_FIELDS( ZTYPE, NYMDb )\n" . "\n" . "#if defined( GEOS_3 )\n" . " ! Unzip GEOS-3 GWET and XTRA fields for START of run\n" . " IF ( LDUST ) CALL UNZIP_GWET_FIELDS( ZTYPE, NYMDb )\n" . " IF ( LXTRA ) CALL UNZIP_XTRA_FIELDS( ZTYPE, NYMDb )\n" . "#endif\n" . "\n" . "#if defined( GCAP )\n" . " ! Unzip GCAP PHIS field (if necessary)\n" . " CALL UNZIP_GCAP_FIELDS( ZTYPE )\n" . "#endif\n" . "\n" . " !### Debug output\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a UNZIP' )\n" . " ENDIF\n" . "\n" . " !=================================================================\n" . " ! ***** R E A D M E T F I E L D S \@ start of run *****\n" . " !=================================================================\n" . "\n" . " ! Open and read A-3 fields\n" . " DATE = GET_FIRST_A3_TIME()\n" . " CALL OPEN_A3_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_A3_FIELDS( DATE(1), DATE(2) )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st A3 TIME' )\n" . "\n" . " ! For MEGAN biogenics, update hourly temps w/in 15-day window\n" . " IF ( LMEGAN ) THEN\n" . " CALL UPDATE_T_DAY\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: UPDATE T_DAY' )\n" . " ENDIF\n" . "\n" . " ! Open & read A-6 fields\n" . " DATE = GET_FIRST_A6_TIME()\n" . " CALL OPEN_A6_FIELDS( DATE(1), DATE(2) ) \n" . " CALL GET_A6_FIELDS( DATE(1), DATE(2) ) \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st A6 TIME' )\n" . "\n" . " ! Open & read I-6 fields\n" . " DATE = (/ NYMD, NHMS /)\n" . " CALL OPEN_I6_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_I6_FIELDS_1( DATE(1), DATE(2) )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st I6 TIME' )\n" . " \n" . "#if defined( GEOS_3 )\n" . " ! Open & read GEOS-3 GWET fields\n" . " IF ( LDUST ) THEN\n" . " DATE = GET_FIRST_A3_TIME()\n" . " CALL OPEN_GWET_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_GWET_FIELDS( DATE(1), DATE(2) ) \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st GWET TIME' )\n" . " ENDIF\n" . "\n" . " ! Open & read GEOS-3 XTRA fields\n" . " IF ( LXTRA ) THEN\n" . " DATE = GET_FIRST_A3_TIME()\n" . " CALL OPEN_XTRA_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_XTRA_FIELDS( DATE(1), DATE(2) ) \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st XTRA TIME' )\n" . " ENDIF\n" . "#endif\n" . "\n" . "#if defined( GCAP )\n" . " ! Read GCAP PHIS and LWI fields (if necessary)\n" . " CALL OPEN_GCAP_FIELDS\n" . " CALL GET_GCAP_FIELDS\n" . "\n" . " ! Remove temporary file (if necessary)\n" . " IF ( LUNZIP ) THEN\n" . " CALL UNZIP_GCAP_FIELDS( 'remove date' )\n" . " ENDIF\n" . "#endif\n" . "\n" . "#if defined( GCAP )\n" . " ! Read GCAP PHIS and LWI fields (if necessary)\n" . " CALL OPEN_GCAP_FIELDS\n" . " CALL GET_GCAP_FIELDS\n" . "\n" . " ! Remove temporary file (if necessary)\n" . " IF ( LUNZIP ) THEN\n" . " CALL UNZIP_GCAP_FIELDS( 'remove date' )\n" . " ENDIF\n" . "#endif\n" . "\n" . " ! Compute avg surface pressure near polar caps\n" . " CALL AVGPOLE( PS1 )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a AVGPOLE' )\n" . "\n" . " ! Call AIRQNT to compute air mass quantities from PS1 \n" . " CALL SET_FLOATING_PRESSURE( PS1 ) \n" . " CALL AIRQNT\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a AIRQNT' )\n" . "\n" . " ! Compute lightning NOx emissions [molec/box/6h]\n" . " IF ( LLIGHTNOX ) THEN\n" . " !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " !%%% NOTE: Temporary kludge: For GEOS-4 we want to use the new near-land \n" . " !%%% lightning formulation. But for the time being, we must keep the existing\n" . " !%%% lightning for other met field types. (ltm, bmy, 5/10/06)\n" . "#if defined( GEOS_4 )\n" . " CALL LIGHTNING_NL\n" . "#else\n" . " CALL LIGHTNING( T, CLDTOPS )\n" . "#endif\n" . "!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . "\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a LIGHTNING' )\n" . " ENDIF\n" . "\n" . " ! Read land types and fractions from \"vegtype.global\"\n" . " CALL RDLAND \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a RDLAND' )\n" . "\n" . " ! Initialize PBL quantities but do not do mixing\n" . " CALL DO_PBL_MIX( .FALSE. )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a TURBDAY:1' )\n" . "\n" . " !=================================================================\n" . " ! ***** I N I T I A L C O N D I T I O N S *****\n" . " !=================================================================\n" . "\n" . " ! Read initial tracer conditions\n" . " CALL READ_RESTART_FILE( NYMDb, NHMSb )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a READ_RESTART_FILE' )\n" . "\n" . " ! Read ocean Hg initial conditions (if necessary)\n" . " IF ( ITS_A_MERCURY_SIM() .and. LDYNOCEAN ) THEN\n" . " CALL READ_OCEAN_Hg_RESTART( NYMDb, NHMSb )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a READ_OCEAN_RESTART' )\n" . " ENDIF\n" . "\n" . " ! Save initial tracer masses to disk for benchmark runs\n" . " IF ( LSTDRUN ) CALL STDRUN( LBEGIN=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! ***** 6 - H O U R T I M E S T E P L O O P *****\n" . " !================================================================= \n" . "\n" . " ! Echo message before first timestep\n" . " WRITE( 6, '(a)' )\n" . " WRITE( 6, '(a)' ) REPEAT( '*', 44 )\n" . " WRITE( 6, '(a)' ) '* B e g i n T i m e S t e p p i n g !! *'\n" . " WRITE( 6, '(a)' ) REPEAT( '*', 44 )\n" . " WRITE( 6, '(a)' ) \n" . "\n" . " ! NSTEP is the number of dynamic timesteps w/in a 6-h interval\n" . " N_DYN_STEPS = 360 / GET_TS_DYN()\n" . "\n" . " ! Start a new 6-h loop\n" . " DO \n" . "\n" . " ! Compute time parameters at start of 6-h loop\n" . " CALL SET_CURRENT_TIME\n" . "\n" . " ! NSECb is # of seconds at the start of 6-h loop\n" . " NSECb = GET_ELAPSED_SEC()\n" . "\n" . " ! Get dynamic timestep in seconds\n" . " N_DYN = 60d0 * GET_TS_DYN()\n" . "\n" . " !=================================================================\n" . " ! ***** D Y N A M I C T I M E S T E P L O O P *****\n" . " !=================================================================\n" . " DO N_STEP = 1, N_DYN_STEPS\n" . " \n" . " ! Compute & print time quantities at start of dyn step\n" . " CALL SET_CURRENT_TIME\n" . " CALL PRINT_CURRENT_TIME\n" . "\n" . " ! Set time variables for dynamic loop\n" . " !DAY = GET_DAY()\n" . " DAY_OF_YEAR = GET_DAY_OF_YEAR()\n" . " ELAPSED_SEC = GET_ELAPSED_SEC()\n" . " MONTH = GET_MONTH()\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . " YEAR = GET_YEAR()\n" . " SEASON = GET_SEASON()\n" . "\n" . " !==============================================================\n" . " ! ***** W R I T E D I A G N O S T I C F I L E S *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_BPCH() ) THEN\n" . " \n" . " ! Set time at end of diagnostic timestep\n" . " CALL SET_DIAGe( TAU )\n" . "\n" . " ! Write bpch file\n" . " CALL DIAG3 \n" . "\n" . " ! Flush file units\n" . " CALL CTM_FLUSH\n" . "\n" . " !===========================================================\n" . " ! ***** W R I T E R E S T A R T F I L E *****\n" . " !===========================================================\n" . " IF ( LSVGLB ) THEN\n" . "\n" . " ! Make atmospheric restart file\n" . " CALL MAKE_RESTART_FILE( NYMD, NHMS, TAU )\n" . " \n" . " ! Make ocean mercury restart file\n" . " IF ( ITS_A_MERCURY_SIM() .and. LDYNOCEAN ) THEN\n" . " CALL MAKE_OCEAN_Hg_RESTART( NYMD, NHMS, TAU )\n" . " ENDIF\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) THEN\n" . " CALL DEBUG_MSG( '### MAIN: a MAKE_RESTART_FILE' )\n" . " ENDIF\n" . " ENDIF\n" . "\n" . " ! Set time at beginning of next diagnostic timestep\n" . " CALL SET_DIAGb( TAU )\n" . "\n" . " !===========================================================\n" . " ! ***** Z E R O D I A G N O S T I C S *****\n" . " !===========================================================\n" . " CALL INITIALIZE( 2 ) ! Zero arrays\n" . " CALL INITIALIZE( 3 ) ! Zero counters\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** T E S T F O R E N D O F R U N *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_EXIT() ) GOTO 9999\n" . "\n" . " !===============================================================\n" . " ! ***** U N Z I P M E T F I E L D S *****\n" . " !===============================================================\n" . " IF ( LUNZIP .and. ITS_TIME_FOR_UNZIP() ) THEN\n" . " \n" . " ! Get the date & time for 12h (720 mins) from now\n" . " DATE = GET_TIME_AHEAD( 720 )\n" . "\n" . " ! If LWAIT=T then wait for the met fields to be\n" . " ! fully unzipped before proceeding w/ the run.\n" . " ! Otherwise, unzip fields in the background\n" . " IF ( LWAIT ) THEN\n" . " ZTYPE = 'unzip foreground'\n" . " ELSE\n" . " ZTYPE = 'unzip background'\n" . " ENDIF\n" . " \n" . " ! Unzip A3, A6, I6 fields\n" . " CALL UNZIP_A3_FIELDS( ZTYPE, DATE(1) )\n" . " CALL UNZIP_A6_FIELDS( ZTYPE, DATE(1) )\n" . " CALL UNZIP_I6_FIELDS( ZTYPE, DATE(1) )\n" . "\n" . "#if defined( GEOS_3 )\n" . " ! Unzip GEOS-3 GWET & XTRA fields\n" . " IF ( LDUST ) CALL UNZIP_GWET_FIELDS( ZTYPE, DATE(1) )\n" . " IF ( LXTRA ) CALL UNZIP_XTRA_FIELDS( ZTYPE, DATE(1) )\n" . "#endif\n" . " ENDIF \n" . "\n" . " !==============================================================\n" . " ! ***** R E A D A - 3 F I E L D S *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_A3() ) THEN\n" . "\n" . " ! Get the date/time for the next A-3 data block\n" . " DATE = GET_A3_TIME()\n" . "\n" . " ! Open & read A-3 fields\n" . " CALL OPEN_A3_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_A3_FIELDS( DATE(1), DATE(2) )\n" . "\n" . " ! Update daily mean temperature archive for MEGAN biogenics\n" . " IF ( LMEGAN ) CALL UPDATE_T_DAY \n" . "\n" . "#if defined( GEOS_3 )\n" . " ! Read GEOS-3 GWET fields\n" . " IF ( LDUST ) THEN\n" . " CALL OPEN_GWET_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_GWET_FIELDS( DATE(1), DATE(2) ) \n" . " ENDIF\n" . " \n" . " ! Read GEOS-3 PARDF, PARDR, SNOW fields\n" . " IF ( LXTRA ) THEN\n" . " CALL OPEN_XTRA_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_XTRA_FIELDS( DATE(1), DATE(2) ) \n" . " ENDIF\n" . "#endif\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** R E A D A - 6 F I E L D S ***** \n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_A6() ) THEN\n" . " \n" . " ! Get the date/time for the next A-6 data block\n" . " DATE = GET_A6_TIME()\n" . "\n" . " ! Open and read A-6 fields\n" . " CALL OPEN_A6_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_A6_FIELDS( DATE(1), DATE(2) )\n" . "\n" . " ! Since CLDTOPS is an A-6 field, update the\n" . " ! lightning NOx emissions [molec/box/6h]\n" . "!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . "!%%% NOTE: Temporary kludge: For GEOS-4 we want to use the new near-land \n" . "!%%% lightning formulation. But for the time being, we must keep the \n" . "!%%% existing lightning for other met field types. (ltm, bmy, 5/10/06)\n" . " IF ( LLIGHTNOX ) THEN\n" . "#if defined( GEOS_4 )\n" . " CALL LIGHTNING_NL\n" . "#else \n" . " CALL LIGHTNING( T, CLDTOPS )\n" . "#endif\n" . " ENDIF\n" . "!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** R E A D I - 6 F I E L D S ***** \n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_I6() ) THEN\n" . "\n" . " ! Get the date/time for the next I-6 data block\n" . " DATE = GET_I6_TIME()\n" . "\n" . " ! Open and read files\n" . " CALL OPEN_I6_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_I6_FIELDS_2( DATE(1), DATE(2) )\n" . "\n" . " ! Compute avg pressure at polar caps \n" . " CALL AVGPOLE( PS2 )\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** M O N T H L Y O R S E A S O N A L D A T A *****\n" . " !==============================================================\n" . "\n" . " ! UV albedoes\n" . " IF ( LCHEM .and. ITS_A_NEW_MONTH() ) THEN\n" . " CALL READ_UVALBEDO( MONTH )\n" . " ENDIF\n" . "\n" . " ! Fossil fuel emissions (SMVGEAR)\n" . " IF ( ITS_A_FULLCHEM_SIM() ) THEN\n" . " IF ( LEMIS .and. ITS_A_NEW_SEASON() ) THEN\n" . " CALL ANTHROEMS( SEASON )\n" . " ENDIF\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** D A I L Y D A T A *****\n" . " !==============================================================\n" . " IF ( ITS_A_NEW_DAY() ) THEN \n" . "\n" . " ! Read leaf-area index (needed for drydep)\n" . " CALL RDLAI( DAY_OF_YEAR, MONTH )\n" . "\n" . " ! For MEGAN biogenics ...\n" . " IF ( LMEGAN ) THEN\n" . "\n" . " ! Read AVHRR daily leaf-area-index\n" . " CALL RDISOLAI( DAY_OF_YEAR, MONTH )\n" . "\n" . " ! Compute 15-day average temperature for MEGAN\n" . " CALL UPDATE_T_15_AVG\n" . " ENDIF\n" . " \n" . " ! Also read soil-type info for fullchem simulation\n" . " IF ( ITS_A_FULLCHEM_SIM() ) CALL RDSOIL \n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG ( '### MAIN: a DAILY DATA' )\n" . " ENDIF\n" . "\n" . " ! Get averaging intervals for local-time diagnostics\n" . " ! (NOTE: maybe improve this later on)\n" . " CALL DIAG_2PM\n" . " \n" . " !==============================================================\n" . " ! ***** I N T E R P O L A T E Q U A N T I T I E S ***** \n" . " !==============================================================\n" . " \n" . " !#################################################\n" . " !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" . " ! Interpolate I-6 fields to current dynamic timestep, \n" . " ! based on their values at NSEC and NSEC+N_DYN !--------------------------!\n" . " CALL INTERP( NSECb, ELAPSED_SEC, N_DYN ) ! CALL INTERP, sets psc2 !\n" . " !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ !--------------------------!\n" . " !#################################################\n" . "\n" . " ! Case of variable tropopause:\n" . " ! Check LLTROP and set LMIN, LMAX, and LPAUSE\n" . " ! since this is not done with READ_TROPOPAUSE anymore.\n" . " ! (Need to double-check that LMIN, Lmax are not used before-phs) \n" . " IF ( LVARTROP ) CALL CHECK_VAR_TROP\n" . " \n" . " !#################################################\n" . " !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" . " ! If we are not doing transport, then make sure that\n" . " ! the floating pressure is set to PSC2 (bdf, bmy, 8/22/02) !-----------------------------------------!\n" . " IF ( .not. LTRAN ) CALL SET_FLOATING_PRESSURE( PSC2 ) ! PSC2 = p2 = interpolated pres at t=T+ΔT !\n" . " !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ !-----------------------------------------!\n" . " !#################################################\n" . "\n" . " ! Compute airmass quantities at each grid box \n" . " CALL AIRQNT\n" . " \n" . " ! Compute the cosine of the solar zenith angle at each grid box\n" . " CALL COSSZA( DAY_OF_YEAR, NHMSb, ELAPSED_SEC, SUNCOS )\n" . " \n" . " ! For SMVGEAR II, we also need to compute SUNCOS at\n" . " ! the end of this chemistry timestep (bdf, bmy, 4/1/03)\n" . " IF ( LCHEM .and. ITS_A_FULLCHEM_SIM() ) THEN\n" . " CALL COSSZA( DAY_OF_YEAR, NHMSb, \n" . " & ELAPSED_SEC+GET_TS_CHEM()*60, SUNCOSB )\n" . " ENDIF\n" . "\n" . " ! Compute tropopause height for ND55 diagnostic\n" . " IF ( ND55 > 0 ) CALL TROPOPAUSE\n" . "\n" . "#if defined( GEOS_3 )\n" . "\n" . " ! 1998 GEOS-3 carries the ground temperature and not the air\n" . " ! temperature -- thus TS will be 2-3 K too high. As a quick fix, \n" . " ! copy the temperature at the first sigma level into TS. \n" . " ! (mje, bnd, bmy, 7/3/01)\n" . " IF ( YEAR == 1998 ) TS(:,:) = T(:,:,1)\n" . "#endif\n" . "\n" . " ! Update dynamic timestep\n" . " CALL SET_CT_DYN( INCREMENT=.TRUE. )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INTERP, etc' )\n" . "\n" . " !==============================================================\n" . " ! ***** U N I T C O N V E R S I O N ( kg -> v/v ) *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_UNIT() ) THEN\n" . " CALL CONVERT_UNITS( 1, N_TRACERS, TCVV, AD, STT )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CONVERT_UNITS:1' )\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** S T R A T O S P H E R I C F L U X E S *****\n" . " !==============================================================\n" . " IF ( LUPBD ) CALL DO_UPBDFLX\n" . "\n" . " !==============================================================\n" . " ! ***** T R A N S P O R T *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_DYN() ) THEN\n" . "\n" . " ! Call the appropritate version of TPCORE\n" . " IF ( LTRAN ) CALL DO_TRANSPORT \n" . "\n" . " ! Reset air mass quantities\n" . " CALL AIRQNT\n" . "\n" . " ! Repartition [NOy] species after transport\n" . " IF ( LUPBD .and. ITS_A_FULLCHEM_SIM() ) THEN\n" . " CALL UPBDFLX_NOY( 2 )\n" . " ENDIF\n" . "\n" . " ! Get relative humidity \n" . " ! (after recomputing pressure quantities)\n" . " CALL MAKE_RH\n" . "\n" . " ! Initialize wet scavenging and wetdep fields after\n" . " ! the airmass quantities are reset after transport\n" . " IF ( LCONV .or. LWETD ) CALL INIT_WETSCAV\n" . " ENDIF\n" . "\n" . " !-------------------------------\n" . " ! Test for convection timestep\n" . " !-------------------------------\n" . " IF ( ITS_TIME_FOR_CONV() ) THEN\n" . "\n" . " ! Increment the convection timestep\n" . " CALL SET_CT_CONV( INCREMENT=.TRUE. )\n" . "\n" . " !===========================================================\n" . " ! ***** M I X E D L A Y E R M I X I N G *****\n" . " !===========================================================\n" . " CALL DO_PBL_MIX( LTURB )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a TURBDAY:2' )\n" . "\n" . " !===========================================================\n" . " ! ***** C L O U D C O N V E C T I O N *****\n" . " !===========================================================\n" . " IF ( LCONV ) THEN\n" . " \n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . " CALL MAKE_CONVECTION_CHKFILE( NYMD, NHMS, TAU )\n" . "\n" . " CALL DO_CONVECTION\n" . " \n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CONVECTION' )\n" . " ENDIF \n" . " ENDIF \n" . "\n" . " !==============================================================\n" . " ! ***** U N I T C O N V E R S I O N ( v/v -> kg ) *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_UNIT() ) THEN \n" . " CALL CONVERT_UNITS( 2, N_TRACERS, TCVV, AD, STT )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CONVERT_UNITS:2' )\n" . " ENDIF\n" . "\n" . " !-------------------------------\n" . " ! Test for emission timestep\n" . " !-------------------------------\n" . " IF ( ITS_TIME_FOR_EMIS() ) THEN\n" . " \n" . " ! Increment emission counter\n" . " CALL SET_CT_EMIS( INCREMENT=.TRUE. )\n" . "\n" . " !========================================================\n" . " ! ***** D R Y D E P O S I T I O N *****\n" . " !========================================================\n" . " IF ( LDRYD ) CALL DO_DRYDEP\n" . "\n" . " !========================================================\n" . " ! ***** E M I S S I O N S *****\n" . " !========================================================\n" . " IF ( LEMIS ) CALL DO_EMISSIONS\n" . " ENDIF \n" . "\n" . " !===========================================================\n" . " ! ***** C H E M I S T R Y *****\n" . " !=========================================================== \n" . "\n" . " ! Every chemistry timestep...\n" . " IF ( ITS_TIME_FOR_CHEM() ) THEN\n" . "\n" . " ! Increment chemistry timestep counter\n" . " CALL SET_CT_CHEM( INCREMENT=.TRUE. )\n" . "\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . "\n" . " CALL MAKE_CHEMISTRY_CHKFILE(NYMD, NHMS, TAU)\n" . "\n" . " ! Call the appropriate chemistry routine\n" . " CALL DO_CHEMISTRY\n" . "\n" . " ENDIF \n" . " \n" . " !==============================================================\n" . " ! ***** W E T D E P O S I T I O N (rainout + washout) *****\n" . " !==============================================================\n" . " \n" . " IF ( LWETD .and. ITS_TIME_FOR_DYN() ) CALL DO_WETDEP\n" . "\n" . " !==============================================================\n" . " ! ***** E N D O F D Y N A M I C T I M E S T E P *****\n" . " !==============================================================\n" . "\n" . " ! Check for NaN, Negatives, Infinities in STT once per hour\n" . " IF ( ITS_TIME_FOR_DIAG() ) THEN\n" . " CALL CHECK_STT( 'End of Dynamic Loop' )\n" . " ENDIF\n" . "\n" . " ! Increment elapsed time\n" . " CALL SET_ELAPSED_MIN\n" . "\n" . " !--------------------------------------------------------------\n" . " ! ***** CHECKPOINTING EVERY DYNAMIC TIME STEP ***** \n" . " !--------------------------------------------------------------\n" . " CALL SET_CURRENT_TIME\n" . "\n" . " ENDDO\n" . "\n" . " !=================================================================\n" . " ! ***** C O P Y I - 6 F I E L D S *****\n" . " !\n" . " ! The I-6 fields at the end of this timestep become\n" . " ! the fields at the beginning of the next timestep\n" . " !=================================================================\n" . " CALL COPY_I6_FIELDS\n" . "\n" . " ENDDO \n" . "\n" . " !=================================================================\n" . " ! ***** C L E A N U P A N D Q U I T *****\n" . " !=================================================================\n" . " 9999 CONTINUE \n" . "\n" . " ! Print the mass-weighted mean OH concentration (if applicable)\n" . " CALL PRINT_DIAG_OH\n" . "\n" . " ! For model benchmarking, save final masses of \n" . " ! Rn,Pb,Be or Ox to a binary punch file \n" . " IF ( LSTDRUN ) CALL STDRUN( LBEGIN=.FALSE. )\n" . "\n" . " ! Print ending time of simulation\n" . " CALL DISPLAY_END_TIME\n" . "!\n" . "!******************************************************************************\n" . "! Internal procedures -- Use the F90 CONTAINS command to inline \n" . "! subroutines that only can be called from this main program. \n" . "!\n" . "! All variables referenced in the main program (local variables, F90 \n" . "! module variables, or common block variables) also have scope within \n" . "! internal subroutines. \n" . "!\n" . "! List of Internal Procedures:\n" . "! ============================================================================\n" . "! (1 ) DISPLAY_GRID_AND_MODEL : Displays resolution, data set, & start time\n" . "! (2 ) GET_NYMD_PHIS : Gets YYYYMMDD for the PHIS data field\n" . "! (3 ) DISPLAY_SIGMA_LAT_LON : Displays sigma, lat, and lon information\n" . "! (4 ) GET_WIND10M : Wrapper for MAKE_WIND10M (from \"dao_mod.f\")\n" . "! (5 ) CTM_FLUSH : Flushes diagnostic files to disk\n" . "! (6 ) DISPLAY_END_TIME : Displays ending time of simulation\n" . "! (7 ) MET_FIELD_DEBUG : Prints min and max of met fields for debug\n" . "!******************************************************************************\n" . "!\n" . " END SUBROUTINE DO_GC_FWD\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE DISPLAY_GRID_AND_MODEL\n" . "\n" . " !=================================================================\n" . " ! Internal Subroutine DISPLAY_GRID_AND_MODEL displays the \n" . " ! appropriate messages for the given model grid and machine type.\n" . " ! It also prints the starting time and date (local time) of the\n" . " ! GEOS-CHEM simulation. (bmy, 12/2/03, 10/18/05)\n" . " !=================================================================\n" . "\n" . " ! For system time stamp\n" . " CHARACTER(LEN=16) :: STAMP\n" . "\n" . " !-----------------------\n" . " ! Print resolution info\n" . " !-----------------------\n" . "#if defined( GRID4x5 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) //\n" . " & ' S T A R T I N G 4 x 5 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID2x25 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 2 x 2.5 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID1x125 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 1 x 1.25 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID1x1 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 1 x 1 G E O S -- C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! Print machine info\n" . " !-----------------------\n" . "\n" . " ! Get the proper FORMAT statement for the model being used\n" . "#if defined( COMPAQ )\n" . " WRITE( 6, '(a)' ) 'Created w/ HP/COMPAQ Alpha compiler'\n" . "#elif defined( IBM_AIX )\n" . " WRITE( 6, '(a)' ) 'Created w/ IBM-AIX compiler'\n" . "#elif defined( LINUX_PGI )\n" . " WRITE( 6, '(a)' ) 'Created w/ LINUX/PGI compiler'\n" . "#elif defined( LINUX_IFORT )\n" . " WRITE( 6, '(a)' ) 'Created w/ LINUX/IFORT (64-bit) compiler'\n" . "#elif defined( SGI_MIPS )\n" . " WRITE( 6, '(a)' ) 'Created w/ SGI MIPSpro compiler'\n" . "#elif defined( SPARC )\n" . " WRITE( 6, '(a)' ) 'Created w/ Sun/SPARC compiler'\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! Print met field info\n" . " !-----------------------\n" . "#if defined( GEOS_3 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-3 met fields'\n" . "#elif defined( GEOS_4 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-4/fvDAS met fields'\n" . "#elif defined( GEOS_5 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-5/fvDAS met fields'\n" . "#elif defined( GCAP )\n" . " WRITE( 6, '(a)' ) 'Using GCAP/GISS met fields'\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! System time stamp\n" . " !-----------------------\n" . " STAMP = SYSTEM_TIMESTAMP()\n" . " WRITE( 6, 100 ) STAMP\n" . " 100 FORMAT( /, '===> SIMULATION START TIME: ', a, ' <===', / )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE DISPLAY_GRID_AND_MODEL\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " FUNCTION ITS_TIME_FOR_BPCH() RESULT( DO_BPCH )\n" . "\n" . " !=================================================================\n" . " ! Internal function ITS_TIME_FOR_BPCH returns TRUE if it is time\n" . " ! to write to the binary punch file and FALSE otherwise.\n" . " !=================================================================\n" . "\n" . " ! Local variables\n" . " INTEGER :: TODAY, THIS_NJDAY, NHMS, NDIAGTIME\n" . " \n" . " ! Function value\n" . " LOGICAL :: DO_BPCH\n" . "\n" . " !=================================================================\n" . " ! ITS_TIME_FOR_BPCH begins here!\n" . " !================================================================= \n" . " \n" . " ! Return FALSE if it's the first timestep\n" . " IF ( GET_TAU() == GET_TAUb() ) THEN\n" . " DO_BPCH = .FALSE.\n" . " RETURN\n" . " ENDIF\n" . "\n" . " ! Current day of year\n" . " TODAY = GET_DAY_OF_YEAR()\n" . "\n" . " ! Current time of day\n" . " NHMS = GET_NHMS()\n" . "\n" . " ! Time of day to write bpch files to disk\n" . " NDIAGTIME = GET_NDIAGTIME()\n" . "\n" . " ! Look up appropriate value of NJDAY array. We may need to add a\n" . " ! day to skip past the Feb 29 element of NJDAY for non-leap-years.\n" . " IF ( .not. ITS_A_LEAPYEAR( FORCE=.TRUE. ) .and. TODAY > 59 ) THEN\n" . " THIS_NJDAY = NJDAY( TODAY + 1 ) \n" . " ELSE\n" . " THIS_NJDAY = NJDAY( TODAY )\n" . " ENDIF\n" . "\n" . " ! Test if this is the day & time to write to the BPCH file!\n" . " IF ( ( THIS_NJDAY > 0 ) .and. NHMS == NDIAGTIME ) THEN\n" . " DO_BPCH = .TRUE.\n" . " ELSE\n" . " DO_BPCH = .FALSE.\n" . " ENDIF\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION ITS_TIME_FOR_BPCH\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE CTM_FLUSH\n" . "\n" . " !================================================================\n" . " ! Internal subroutine CTM_FLUSH flushes certain diagnostic\n" . " ! file buffers to disk. (bmy, 8/31/00, 7/1/02)\n" . " !\n" . " ! CTM_FLUSH should normally be called after each diagnostic \n" . " ! output, so that in case the run dies, the output files from \n" . " ! the last diagnostic timestep will not be lost. \n" . " !\n" . " ! FLUSH is an intrinsic FORTRAN subroutine and takes as input \n" . " ! the unit number of the file to be flushed to disk.\n" . " !================================================================\n" . " CALL FLUSH( IU_ND48 ) \n" . " CALL FLUSH( IU_BPCH ) \n" . " CALL FLUSH( IU_SMV2LOG ) \n" . " CALL FLUSH( IU_DEBUG ) \n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE CTM_FLUSH\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE DISPLAY_END_TIME\n" . "\n" . " !=================================================================\n" . " ! Internal subroutine DISPLAY_END_TIME prints the ending time of\n" . " ! the GEOS-CHEM simulation (bmy, 5/3/05)\n" . " !=================================================================\n" . "\n" . " ! Local variables\n" . " CHARACTER(LEN=16) :: STAMP\n" . "\n" . " ! Print system time stamp\n" . " STAMP = SYSTEM_TIMESTAMP()\n" . " WRITE( 6, 100 ) STAMP\n" . " 100 FORMAT( /, '===> SIMULATION END TIME: ', a, ' <===', / )\n" . "\n" . " ! Echo info\n" . " WRITE ( 6, 3000 ) \n" . " 3000 FORMAT\n" . " & ( /, '************** E N D O F G E O S -- C H E M ',\n" . " & '**************' )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE DISPLAY_END_TIME\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MET_FIELD_DEBUG\n" . "\n" . " !=================================================================\n" . " ! Internal subroutine MET_FIELD_DEBUG prints out the maximum\n" . " ! and minimum, and sum of DAO met fields for debugging \n" . " !=================================================================\n" . "\n" . " ! References to F90 modules\n" . " USE DAO_MOD, ONLY : AD, AIRDEN, AIRVOL, ALBD1, ALBD2\n" . " USE DAO_MOD, ONLY : ALBD, AVGW, BXHEIGHT, CLDFRC, CLDF \n" . " USE DAO_MOD, ONLY : CLDMAS, CLDTOPS, DELP \n" . " USE DAO_MOD, ONLY : DTRAIN, GWETTOP, HFLUX, HKBETA, HKETA \n" . " USE DAO_MOD, ONLY : LWI, MOISTQ, OPTD, OPTDEP, PBL \n" . " USE DAO_MOD, ONLY : PREACC, PRECON, PS1, PS2, PSC2 \n" . " USE DAO_MOD, ONLY : RADLWG, RADSWG, RH, SLP, SNOW \n" . " USE DAO_MOD, ONLY : SPHU1, SPHU2, SPHU, SUNCOS, SUNCOSB \n" . " USE DAO_MOD, ONLY : TMPU1, TMPU2, T, TROPP, TS \n" . " USE DAO_MOD, ONLY : TSKIN, U10M, USTAR, UWND1, UWND2 \n" . " USE DAO_MOD, ONLY : UWND, V10M, VWND1, VWND2, VWND \n" . " USE DAO_MOD, ONLY : Z0, ZMEU, ZMMD, ZMMU \n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, L, IJ\n" . "\n" . " !=================================================================\n" . " ! MET_FIELD_DEBUG begins here!\n" . " !=================================================================\n" . "\n" . " ! Define box to print out\n" . " I = 23\n" . " J = 34\n" . " L = 1\n" . " IJ = ( ( J-1 ) * IIPAR ) + I\n" . "\n" . " !=================================================================\n" . " ! Print out met fields at (I,J,L)\n" . " !=================================================================\n" . " IF ( ALLOCATED( AD ) ) PRINT*, 'AD : ', AD(I,J,L) \n" . " IF ( ALLOCATED( AIRDEN ) ) PRINT*, 'AIRDEN : ', AIRDEN(L,I,J) \n" . " IF ( ALLOCATED( AIRVOL ) ) PRINT*, 'AIRVOL : ', AIRVOL(I,J,L) \n" . " IF ( ALLOCATED( ALBD1 ) ) PRINT*, 'ALBD1 : ', ALBD1(I,J) \n" . " IF ( ALLOCATED( ALBD2 ) ) PRINT*, 'ALBD2 : ', ALBD2(I,J) \n" . " IF ( ALLOCATED( ALBD ) ) PRINT*, 'ALBD : ', ALBD(I,J) \n" . " IF ( ALLOCATED( AVGW ) ) PRINT*, 'AVGW : ', AVGW(I,J,L) \n" . " IF ( ALLOCATED( BXHEIGHT ) ) PRINT*, 'BXHEIGHT: ', BXHEIGHT(I,J,L) \n" . " IF ( ALLOCATED( CLDFRC ) ) PRINT*, 'CLDFRC : ', CLDFRC(I,J)\n" . " IF ( ALLOCATED( CLDF ) ) PRINT*, 'CLDF : ', CLDF(L,I,J) \n" . " IF ( ALLOCATED( CLDMAS ) ) PRINT*, 'CLDMAS : ', CLDMAS(I,J,L) \n" . " IF ( ALLOCATED( CLDTOPS ) ) PRINT*, 'CLDTOPS : ', CLDTOPS(I,J) \n" . " IF ( ALLOCATED( DELP ) ) PRINT*, 'DELP : ', DELP(L,I,J) \n" . " IF ( ALLOCATED( DTRAIN ) ) PRINT*, 'DTRAIN : ', DTRAIN(I,J,L) \n" . " IF ( ALLOCATED( GWETTOP ) ) PRINT*, 'GWETTOP : ', GWETTOP(I,J) \n" . " IF ( ALLOCATED( HFLUX ) ) PRINT*, 'HFLUX : ', HFLUX(I,J) \n" . " IF ( ALLOCATED( HKBETA ) ) PRINT*, 'HKBETA : ', HKBETA(I,J,L) \n" . " IF ( ALLOCATED( HKETA ) ) PRINT*, 'HKETA : ', HKETA(I,J,L) \n" . " IF ( ALLOCATED( LWI ) ) PRINT*, 'LWI : ', LWI(I,J) \n" . " IF ( ALLOCATED( MOISTQ ) ) PRINT*, 'MOISTQ : ', MOISTQ(L,I,J) \n" . " IF ( ALLOCATED( OPTD ) ) PRINT*, 'OPTD : ', OPTD(L,I,J) \n" . " IF ( ALLOCATED( OPTDEP ) ) PRINT*, 'OPTDEP : ', OPTDEP(L,I,J) \n" . " IF ( ALLOCATED( PBL ) ) PRINT*, 'PBL : ', PBL(I,J) \n" . " IF ( ALLOCATED( PREACC ) ) PRINT*, 'PREACC : ', PREACC(I,J) \n" . " IF ( ALLOCATED( PRECON ) ) PRINT*, 'PRECON : ', PRECON(I,J) \n" . " IF ( ALLOCATED( PS1 ) ) PRINT*, 'PS1 : ', PS1(I,J) \n" . " IF ( ALLOCATED( PS2 ) ) PRINT*, 'PS2 : ', PS2(I,J) \n" . " IF ( ALLOCATED( PSC2 ) ) PRINT*, 'PSC2 : ', PSC2(I,J)\n" . " IF ( ALLOCATED( RADLWG ) ) PRINT*, 'RADLWG : ', RADLWG(I,J)\n" . " IF ( ALLOCATED( RADSWG ) ) PRINT*, 'RADSWG : ', RADSWG(I,J)\n" . " IF ( ALLOCATED( RH ) ) PRINT*, 'RH : ', RH(I,J,L) \n" . " IF ( ALLOCATED( SLP ) ) PRINT*, 'SLP : ', SLP(I,J) \n" . " IF ( ALLOCATED( SNOW ) ) PRINT*, 'SNOW : ', SNOW(I,J) \n" . " IF ( ALLOCATED( SPHU1 ) ) PRINT*, 'SPHU1 : ', SPHU1(I,J,L) \n" . " IF ( ALLOCATED( SPHU2 ) ) PRINT*, 'SPHU2 : ', SPHU2(I,J,L) \n" . " IF ( ALLOCATED( SPHU ) ) PRINT*, 'SPHU : ', SPHU(I,J,L) \n" . " IF ( ALLOCATED( SUNCOS ) ) PRINT*, 'SUNCOS : ', SUNCOS(IJ) \n" . " IF ( ALLOCATED( SUNCOSB ) ) PRINT*, 'SUNCOSB : ', SUNCOSB(IJ) \n" . " IF ( ALLOCATED( TMPU1 ) ) PRINT*, 'TMPU1 : ', TMPU1(I,J,L) \n" . " IF ( ALLOCATED( TMPU2 ) ) PRINT*, 'TMPU2 : ', TMPU2(I,J,L) \n" . " IF ( ALLOCATED( T ) ) PRINT*, 'TMPU : ', T(I,J,L)\n" . " IF ( ALLOCATED( TROPP ) ) PRINT*, 'TROPP : ', TROPP(I,J) \n" . " IF ( ALLOCATED( TS ) ) PRINT*, 'TS : ', TS(I,J) \n" . " IF ( ALLOCATED( TSKIN ) ) PRINT*, 'TSKIN : ', TSKIN(I,J) \n" . " IF ( ALLOCATED( U10M ) ) PRINT*, 'U10M : ', U10M(I,J) \n" . " IF ( ALLOCATED( USTAR ) ) PRINT*, 'USTAR : ', USTAR(I,J) \n" . " IF ( ALLOCATED( UWND1 ) ) PRINT*, 'UWND1 : ', UWND1(I,J,L) \n" . " IF ( ALLOCATED( UWND2 ) ) PRINT*, 'UWND2 : ', UWND2(I,J,L) \n" . " IF ( ALLOCATED( UWND ) ) PRINT*, 'UWND : ', UWND(I,J,L) \n" . " IF ( ALLOCATED( V10M ) ) PRINT*, 'V10M : ', V10M(I,J) \n" . " IF ( ALLOCATED( VWND1 ) ) PRINT*, 'VWND1 : ', VWND1(I,J,L) \n" . " IF ( ALLOCATED( VWND2 ) ) PRINT*, 'VWND2 : ', VWND2(I,J,L) \n" . " IF ( ALLOCATED( VWND ) ) PRINT*, 'VWND : ', VWND(I,J,L) \n" . " IF ( ALLOCATED( Z0 ) ) PRINT*, 'Z0 : ', Z0(I,J) \n" . " IF ( ALLOCATED( ZMEU ) ) PRINT*, 'ZMEU : ', ZMEU(I,J,L) \n" . " IF ( ALLOCATED( ZMMD ) ) PRINT*, 'ZMMD : ', ZMMD(I,J,L) \n" . " IF ( ALLOCATED( ZMMU ) ) PRINT*, 'ZMMU : ', ZMMU(I,J,L) \n" . "\n" . " ! Flush the output buffer\n" . " CALL FLUSH( 6 )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE MET_FIELD_DEBUG\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " ! End of program\n" . " END MODULE SUBDRIVER_FWD\n" . "\n"; close(FILE); } #============================================= # Create checkpoint_mod.f #============================================= sub createCheckMod { printf "Creating checkpoint_mod.f\n"; open(FILE, ">checkpoint_mod.f") || die "Unable to open checkpoint_mod.f"; print FILE "! \$Id: restart_mod.f,v 1.14 2006/09/08 19:21:03 bmy Exp \$\n" . " MODULE CHECKPOINT_MOD\n" . "!\n" . "!******************************************************************************\n" . "! Module CHECKPOINT_MOD contains variables and routines which are used to read\n" . "! and write GEOS-CHEM restart files, which contain tracer concentrations\n" . "! in [v/v] mixing ratio. (bmy, 6/25/02, 12/16/05)\n" . "!\n" . "! Module Variables:\n" . "! ============================================================================\n" . "! (1 ) INPUT_CHECKPOINT_FILE : Full path name of the restart file to be read\n" . "! (2 ) OUTPUT_CHECKPOINT_FILE : Full path name (w/ tokens!) of output file\n" . "!\n" . "! Module Routines:\n" . "! ============================================================================\n" . "! (1 ) MAKE_CHECKPOINT_FILE : Writes restart file to disk \n" . "! (2 ) READ_CHECKPOINT_FILE : Reads restart file from disk \n" . "! (3 ) CONVERT_TRACER_TO_VV : Converts from [ppbv], [ppmv], etc to [v/v]\n" . "! (4 ) CHECK_DIMENSIONS : Ensures that restart file contains global data\n" . "! (5 ) COPY_STT : Converts [v/v] to [kg] and stores in STT\n" . "! (6 ) CHECK_DATA_BLOCKS : Makes sure we have read in data for each tracer\n" . "! (7 ) SET_CHECKPOINT : Gets restart filenames from \"input_mod.f\"\n" . "!\n" . "! GEOS-CHEM modules referenced by restart_mod.f\n" . "! ============================================================================\n" . "! (1 ) bpch2_mod.f : Module w/ routines for binary punch file I/O\n" . "! (2 ) error_mod.f : Module w/ NaN and other error check routines\n" . "! (3 ) file_mod.f : Module w/ file unit numbers and error checks\n" . "! (4 ) grid_mod.f : Module w/ horizontal grid information\n" . "! (5 ) logical_mod.f : Module w/ GEOS-CHEM logical switches\n" . "! (6 ) time_mod.f : Module w/ routines for computing time & date\n" . "! (7 ) tracer_mod.f : Module w/ GEOS-CHEM tracer array STT etc.\n" . "!\n" . "! NOTES:\n" . "! (1 ) Moved routines \"make_restart_file.f\"\" and \"read_restart_file.f\" into\n" . "! this module. Also now internal routines to \"read_restart_file.f\"\n" . "! are now a part of this module. Now reference \"file_mod.f\" to get\n" . "! file unit numbers and error checking routines. (bmy, 6/25/02)\n" . "! (2 ) Now reference AD from \"dao_mod.f\". Now reference \"error_mod.f\".\n" . "! Also added minor bug fix for ALPHA platform. (bmy, 10/15/02)\n" . "! (3 ) Now references \"grid_mod.f\" and the new \"time_mod.f\" (bmy, 2/11/03)\n" . "! (4 ) Added error-check and cosmetic changes (bmy, 4/29/03)\n" . "! (5 ) Removed call to COPY_STT_FOR_OX, it's obsolete (bmy, 8/18/03)\n" . "! (6 ) Add fancy output (bmy, 4/26/04)\n" . "! (7 ) Added routine SET_CHECKPOINT. Now reference \"logical_mod.f\" and\n" . "! \"tracer_mod.f\" (bmy, 7/20/04)\n" . "! (8 ) Removed obsolete routines TRUE_TRACER_INDEX and COPY_DATA_FOR_CO_OH\n" . "! (bmy, 6/28/05)\n" . "! (9 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (10) Now pass TAU via the arg list in MAKE_CHECKPOINT_FILE (bmy, 12/15/05)\n" . "!******************************************************************************\n" . "!\n" . " IMPLICIT NONE\n" . "\n" . " !=================================================================\n" . " ! MODULE VARIABLES\n" . " !================================================================= \n" . " CHARACTER(LEN=255) :: INPUT_CHECKPOINT_FILE \n" . " CHARACTER(LEN=255) :: OUTPUT_CHECKPOINT_FILE\n" . "\n" . " !=================================================================\n" . " ! MODULE ROUTINES -- follow below the \"CONTAINS\" statement \n" . " !=================================================================\n" . " CONTAINS\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_CONVECTION_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHECKPOINT_FILE creates GEOS-CHEM restart files of tracer \n" . "! mixing ratios (v/v), in binary punch file format. (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (2 ) Reference F90 module \"bpch2_mod.f\" which contains routines BPCH2_HDR, \n" . "! BPCH2, and GET_MODELNAME for writing data to binary punch files. \n" . "! (bmy, 6/22/00)\n" . "! (3 ) Now do not write more than NTRACE data blocks to disk. \n" . "! Also updated comments. (bmy, 7/17/00)\n" . "! (4 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (5 ) Added to \"restart_mod.f\". Also now save the entire grid to the\n" . "! restart file. (bmy, 6/24/02)\n" . "! (6 ) Bug fix: Remove duplicate definition of MM. This causes compile-time\n" . "! problems on the ALPHA platform. (gcc, bmy, 11/6/02)\n" . "! (7 ) Now references functions GET_OFFSET, GET_YOFFSET from \"grid_mod.f\".\n" . "! Now references function GET_TAU from \"time_mod.f\". Now added a call \n" . "! to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (8 ) Cosmetic changes (bmy, 4/29/03)\n" . "! (9 ) Now reference STT, N_TRACERS, TCVV from \"tracer_mod.f\". Also now\n" . "! remove hardwired output restart filename. Now references LPRT\n" . "! from \"logical_mod.f\". (bmy, 7/20/04)\n" . "! (10) Remove references to CMN_DIAG and TRCOFFSET. Now call GET_HALFPOLAR \n" . "! from \"bpch2_mod.f\" to get the HALFPOLAR flag value for GEOS or GCAP \n" . "! grids. (bmy, 6/28/05)\n" . "! (11) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (12) Add TAU to the argument list (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2_CHK, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " REAL*8 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " REAL*8, PARAMETER :: SMALLNUM = 1d-12\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('CONV_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . " DO N = 1, N_TRACERS\n" . " \n" . " ! Convert from [kg] to [v/v] and store in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " TRACER(I,J,L) = STT(I,J,L,N) !* TCVV(N) / AD(I,J,L)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . " \n" . " ! Convert STT from [kg] to [v/v] mixing ratio \n" . " ! and store in temporary variable TRACER\n" . " CALL BPCH2_CHK( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . " ENDDO \n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_CONVECTION_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE READ_CONVECTION_CHKFILE( YYYYMMDD, HHMMSS ) \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine READ_CHECKPOINT_FILE initializes GEOS-CHEM tracer concentrations \n" . "! from a restart file (binary punch file format) (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Day \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to read restart file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now check that N = NTRACER - TRCOFFSET is valid. \n" . "! Also reorganize some print statements (bmy, 10/25/99)\n" . "! (2 ) Now pass LFORCE, LSPLIT via CMN_SETUP. (bmy, 11/4/99)\n" . "! (3 ) Cosmetic changes, added comments (bmy, 3/17/00)\n" . "! (4 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (5 ) Broke up sections of code into internal subroutines. Also updated\n" . "! comments & cleaned up a few things. (bmy, 7/17/00)\n" . "! (6 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (7 ) Print max & min of tracer regardless of the units (bmy, 10/5/00)\n" . "! (8 ) Removed obsolete code from 10/00 (bmy, 12/21/00)\n" . "! (9 ) Removed obsolete commented out code (bmy, 4/23/01)\n" . "! (10) Added updates from amf for tagged Ox run. Also updated comments\n" . "! and made some cosmetic changes (bmy, 7/3/01)\n" . "! (11) Bug fix: if starting from multiox restart file, then NTRACER \n" . "! will be greater than 40 but less than 60. Adjust COPY_STT_FOR_OX\n" . "! accordingly. (amf, bmy, 9/6/01)\n" . "! (12) Now reference TRANUC from \"charpak_mod.f\" (bmy, 11/15/01)\n" . "! (13) Updated comments (bmy, 1/25/02)\n" . "! (14) Now reference AD from \"dao_mod.f\" (bmy, 9/18/02)\n" . "! (15) Now added a call to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (16) Remove call to COPY_STT_FOR_OX, it's obsolete. (bmy, 8/18/03)\n" . "! (17) Add fancy output string (bmy, 4/26/04)\n" . "! (18) No longer use hardwired filename. Also now reference \"logical_mod.f\"\n" . "! and \"tracer_mod.f\" (bmy, 7/20/04)\n" . "! (19) Remove code for obsolete CO-OH simulation. Also remove references\n" . "! to CMN_DIAG and TRCOFFSET. Change tracer name format string to A10.\n" . "! (bmy, 6/24/05)\n" . "! (20) Updated comments (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE LOGICAL_MOD, ONLY : LSPLIT, LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT\n" . " USE TRACER_MOD, ONLY : TRACER_NAME, TRACER_MW_G\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . "\n" . " ! Local Variables\n" . " INTEGER :: I, IOS, J, L, N\n" . " INTEGER :: NCOUNT(NNPAR) \n" . " REAL*8 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: SUMTC\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " INTEGER :: NI, NJ, NL\n" . " INTEGER :: IFIRST, JFIRST, LFIRST\n" . " INTEGER :: NTRACER, NSKIP\n" . " INTEGER :: HALFPOLAR, CENTER180\n" . " REAL*4 :: LONRES, LATRES\n" . " REAL*8 :: ZTAU0, ZTAU1\n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED\n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . "\n" . " !=================================================================\n" . " ! READ_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " ! Initialize some variables\n" . " NCOUNT(:) = 0\n" . " TRACER(:,:,:) = 0e0\n" . "\n" . " !=================================================================\n" . " ! Open restart file and read top-of-file header\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " INPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('CONV_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Copy input file name to a local variable\n" . " FILENAME = TRIM( INPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " ! Echo some input to the screen\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " WRITE( 6, '(a,/)' ) 'R E S T A R T F I L E I N P U T'\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( 'READ_CHECKPOINT_FILE: Reading ', a )\n" . "\n" . " ! Open the binary punch file for input\n" . " CALL OPEN_BPCH2_FOR_READ( IU_RST, FILENAME )\n" . " \n" . " ! Echo more output\n" . " WRITE( 6, 110 )\n" . " 110 FORMAT( /, 'Min and Max of each tracer, as read from the file:',\n" . " & /, '(in volume mixing ratio units: v/v)' )\n" . "\n" . " !=================================================================\n" . " ! Read concentrations -- store in the TRACER array\n" . " !=================================================================\n" . " DO \n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & MODELNAME, LONRES, LATRES, HALFPOLAR, CENTER180\n" . "\n" . " ! IOS < 0 is end-of-file, so exit\n" . " IF ( IOS < 0 ) EXIT\n" . "\n" . " ! IOS > 0 is a real I/O error -- print error message\n" . " IF ( IOS > 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:4' )\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & CATEGORY, NTRACER, UNIT, ZTAU0, ZTAU1, RESERVED,\n" . " & NI, NJ, NL, IFIRST, JFIRST, LFIRST,\n" . " & NSKIP\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:5')\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & ( ( ( TRACER(I,J,L), I=1,NI ), J=1,NJ ), L=1,NL )\n" . " \n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:6')\n" . "\n" . " !==============================================================\n" . " ! Assign data from the TRACER array to the STT array.\n" . " !==============================================================\n" . " \n" . " ! Only process concentration data (i.e. mixing ratio)\n" . " IF ( CATEGORY(1:8) == 'IJ-AVG-\$' ) THEN \n" . "\n" . " ! Convert TRACER from [v/v] to [kg] and copy into STT array\n" . " CALL COPY_STT( NTRACER, TRACER, NCOUNT )\n" . "\n" . " ENDIF\n" . " ENDDO\n" . "\n" . " !=================================================================\n" . " ! Examine data blocks, print totals, and return\n" . " !=================================================================\n" . "\n" . " ! Check for missing or duplicate data blocks\n" . " CALL CHECK_DATA_BLOCKS( N_TRACERS, NCOUNT )\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST ) \n" . "\n" . " ! Print totals atmospheric mass for each tracer\n" . " WRITE( 6, 120 )\n" . " 120 FORMAT( /, 'Total atmospheric masses for each tracer: ' ) \n" . "\n" . " ! Fancy output\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### READ_CHECKPOINT_FILE: read file')\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE READ_CONVECTION_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_CHEMISTRY_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHECKPOINT_FILE creates GEOS-CHEM restart files of tracer \n" . "! mixing ratios (v/v), in binary punch file format. (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (2 ) Reference F90 module \"bpch2_mod.f\" which contains routines BPCH2_HDR, \n" . "! BPCH2, and GET_MODELNAME for writing data to binary punch files. \n" . "! (bmy, 6/22/00)\n" . "! (3 ) Now do not write more than NTRACE data blocks to disk. \n" . "! Also updated comments. (bmy, 7/17/00)\n" . "! (4 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (5 ) Added to \"restart_mod.f\". Also now save the entire grid to the\n" . "! restart file. (bmy, 6/24/02)\n" . "! (6 ) Bug fix: Remove duplicate definition of MM. This causes compile-time\n" . "! problems on the ALPHA platform. (gcc, bmy, 11/6/02)\n" . "! (7 ) Now references functions GET_OFFSET, GET_YOFFSET from \"grid_mod.f\".\n" . "! Now references function GET_TAU from \"time_mod.f\". Now added a call \n" . "! to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (8 ) Cosmetic changes (bmy, 4/29/03)\n" . "! (9 ) Now reference STT, N_TRACERS, TCVV from \"tracer_mod.f\". Also now\n" . "! remove hardwired output restart filename. Now references LPRT\n" . "! from \"logical_mod.f\". (bmy, 7/20/04)\n" . "! (10) Remove references to CMN_DIAG and TRCOFFSET. Now call GET_HALFPOLAR \n" . "! from \"bpch2_mod.f\" to get the HALFPOLAR flag value for GEOS or GCAP \n" . "! grids. (bmy, 6/28/05)\n" . "! (11) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (12) Add TAU to the argument list (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2_CHK, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " REAL*8 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('CHEM_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . " DO N = 1, N_TRACERS\n" . " \n" . " ! Convert from [kg] to [v/v] and store in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " TRACER(I,J,L) = STT(I,J,L,N) !* TCVV(N) / AD(I,J,L)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . " \n" . " ! Convert STT from [kg] to [v/v] mixing ratio \n" . " ! and store in temporary variable TRACER\n" . " CALL BPCH2_CHK( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . " ENDDO \n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_CHEMISTRY_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE READ_CHEMISTRY_CHKFILE( YYYYMMDD, HHMMSS ) \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine READ_CHECKPOINT_FILE initializes GEOS-CHEM tracer concentrations \n" . "! from a restart file (binary punch file format) (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Day \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to read restart file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now check that N = NTRACER - TRCOFFSET is valid. \n" . "! Also reorganize some print statements (bmy, 10/25/99)\n" . "! (2 ) Now pass LFORCE, LSPLIT via CMN_SETUP. (bmy, 11/4/99)\n" . "! (3 ) Cosmetic changes, added comments (bmy, 3/17/00)\n" . "! (4 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (5 ) Broke up sections of code into internal subroutines. Also updated\n" . "! comments & cleaned up a few things. (bmy, 7/17/00)\n" . "! (6 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (7 ) Print max & min of tracer regardless of the units (bmy, 10/5/00)\n" . "! (8 ) Removed obsolete code from 10/00 (bmy, 12/21/00)\n" . "! (9 ) Removed obsolete commented out code (bmy, 4/23/01)\n" . "! (10) Added updates from amf for tagged Ox run. Also updated comments\n" . "! and made some cosmetic changes (bmy, 7/3/01)\n" . "! (11) Bug fix: if starting from multiox restart file, then NTRACER \n" . "! will be greater than 40 but less than 60. Adjust COPY_STT_FOR_OX\n" . "! accordingly. (amf, bmy, 9/6/01)\n" . "! (12) Now reference TRANUC from \"charpak_mod.f\" (bmy, 11/15/01)\n" . "! (13) Updated comments (bmy, 1/25/02)\n" . "! (14) Now reference AD from \"dao_mod.f\" (bmy, 9/18/02)\n" . "! (15) Now added a call to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (16) Remove call to COPY_STT_FOR_OX, it's obsolete. (bmy, 8/18/03)\n" . "! (17) Add fancy output string (bmy, 4/26/04)\n" . "! (18) No longer use hardwired filename. Also now reference \"logical_mod.f\"\n" . "! and \"tracer_mod.f\" (bmy, 7/20/04)\n" . "! (19) Remove code for obsolete CO-OH simulation. Also remove references\n" . "! to CMN_DIAG and TRCOFFSET. Change tracer name format string to A10.\n" . "! (bmy, 6/24/05)\n" . "! (20) Updated comments (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE LOGICAL_MOD, ONLY : LSPLIT, LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT\n" . " USE TRACER_MOD, ONLY : TRACER_NAME, TRACER_MW_G\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . "\n" . " ! Local Variables\n" . " INTEGER :: I, IOS, J, L, N\n" . " INTEGER :: NCOUNT(NNPAR) \n" . " REAL*8 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: SUMTC\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " INTEGER :: NI, NJ, NL\n" . " INTEGER :: IFIRST, JFIRST, LFIRST\n" . " INTEGER :: NTRACER, NSKIP\n" . " INTEGER :: HALFPOLAR, CENTER180\n" . " REAL*4 :: LONRES, LATRES\n" . " REAL*8 :: ZTAU0, ZTAU1\n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED\n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . "\n" . " !=================================================================\n" . " ! READ_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " ! Initialize some variables\n" . " NCOUNT(:) = 0\n" . " TRACER(:,:,:) = 0e0\n" . "\n" . " !=================================================================\n" . " ! Open restart file and read top-of-file header\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " INPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('CHEM_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Copy input file name to a local variable\n" . " FILENAME = TRIM( INPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " ! Echo some input to the screen\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " WRITE( 6, '(a,/)' ) 'R E S T A R T F I L E I N P U T'\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( 'READ_CHECKPOINT_FILE: Reading ', a )\n" . "\n" . " ! Open the binary punch file for input\n" . " CALL OPEN_BPCH2_FOR_READ( IU_RST, FILENAME )\n" . " \n" . " ! Echo more output\n" . " WRITE( 6, 110 )\n" . " 110 FORMAT( /, 'Min and Max of each tracer, as read from the file:',\n" . " & /, '(in volume mixing ratio units: v/v)' )\n" . "\n" . " !=================================================================\n" . " ! Read concentrations -- store in the TRACER array\n" . " !=================================================================\n" . "\n" . " DO \n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & MODELNAME, LONRES, LATRES, HALFPOLAR, CENTER180\n" . "\n" . " ! IOS < 0 is end-of-file, so exit\n" . " IF ( IOS < 0 ) EXIT\n" . "\n" . " ! IOS > 0 is a real I/O error -- print error message\n" . " IF ( IOS > 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:4' )\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & CATEGORY, NTRACER, UNIT, ZTAU0, ZTAU1, RESERVED,\n" . " & NI, NJ, NL, IFIRST, JFIRST, LFIRST,\n" . " & NSKIP\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:5')\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & ( ( ( TRACER(I,J,L), I=1,NI ), J=1,NJ ), L=1,NL )\n" . "\n" . " !-------------------------------------------\n" . " ! *****TESTING CHECKPOINTING*****\n" . " !-------------------------------------------\n" . " !PRINT*,'TRACER(2,2,2)=',TRACER(2,2,2)\n" . " \n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:6')\n" . "\n" . " !==============================================================\n" . " ! Assign data from the TRACER array to the STT array.\n" . " !==============================================================\n" . "\n" . " CALL COPY_STT( NTRACER, TRACER, NCOUNT )\n" . "\n" . " ENDDO\n" . "\n" . " !=================================================================\n" . " ! Examine data blocks, print totals, and return\n" . " !=================================================================\n" . "\n" . " ! Check for missing or duplicate data blocks\n" . " CALL CHECK_DATA_BLOCKS( N_TRACERS, NCOUNT )\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST ) \n" . "\n" . " ! Print totals atmospheric mass for each tracer\n" . " WRITE( 6, 120 )\n" . " 120 FORMAT( /, 'Total atmospheric masses for each tracer: ' ) \n" . "\n" . " ! Fancy output\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### READ_CHECKPOINT_FILE: read file')\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE READ_CHEMISTRY_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_CHEMISTRY_CHKFILE_CSP1( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHECKPOINT_FILE creates GEOS-CHEM restart files of tracer \n" . "! mixing ratios (v/v), in binary punch file format. (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (2 ) Reference F90 module \"bpch2_mod.f\" which contains routines BPCH2_HDR, \n" . "! BPCH2, and GET_MODELNAME for writing data to binary punch files. \n" . "! (bmy, 6/22/00)\n" . "! (3 ) Now do not write more than NTRACE data blocks to disk. \n" . "! Also updated comments. (bmy, 7/17/00)\n" . "! (4 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (5 ) Added to \"restart_mod.f\". Also now save the entire grid to the\n" . "! restart file. (bmy, 6/24/02)\n" . "! (6 ) Bug fix: Remove duplicate definition of MM. This causes compile-time\n" . "! problems on the ALPHA platform. (gcc, bmy, 11/6/02)\n" . "! (7 ) Now references functions GET_OFFSET, GET_YOFFSET from \"grid_mod.f\".\n" . "! Now references function GET_TAU from \"time_mod.f\". Now added a call \n" . "! to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (8 ) Cosmetic changes (bmy, 4/29/03)\n" . "! (9 ) Now reference STT, N_TRACERS, TCVV from \"tracer_mod.f\". Also now\n" . "! remove hardwired output restart filename. Now references LPRT\n" . "! from \"logical_mod.f\". (bmy, 7/20/04)\n" . "! (10) Remove references to CMN_DIAG and TRCOFFSET. Now call GET_HALFPOLAR \n" . "! from \"bpch2_mod.f\" to get the HALFPOLAR flag value for GEOS or GCAP \n" . "! grids. (bmy, 6/28/05)\n" . "! (11) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (12) Add TAU to the argument list (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2_CSP, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . " USE COMODE_MOD, ONLY : CSPEC\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"comode.h\"\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " INTEGER :: JLOOP,JJ, KK\n" . " REAL*8 :: TRACER(ITLOOP,IGAS)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('CHEM_CHK_CSP1.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " !PRINT*,'ITLOOP, IGAS = ',ITLOOP,IGAS\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J )\n" . " DO J = 1, IGAS\n" . " DO I = 1, ITLOOP\n" . " ! Compute tracer concentration [molec/cm3/box] by\n" . " ! looping over all species belonging to this tracer\n" . " TRACER(I,J) = CSPEC(I,J)\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " !-------------------------------------------\n" . " ! *****TESTING CHECKPOINTING*****\n" . " !-------------------------------------------\n" . "\n" . " CALL BPCH2_CSP( IU_RST, ITLOOP, IGAS, TRACER )\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_CHEMISTRY_CHKFILE_CSP1\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE READ_CHEMISTRY_CHKFILE_CSP1( YYYYMMDD, HHMMSS ) \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine READ_CHECKPOINT_FILE initializes GEOS-CHEM tracer concentrations \n" . "! from a restart file (binary punch file format) (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Day \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to read restart file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now check that N = NTRACER - TRCOFFSET is valid. \n" . "! Also reorganize some print statements (bmy, 10/25/99)\n" . "! (2 ) Now pass LFORCE, LSPLIT via CMN_SETUP. (bmy, 11/4/99)\n" . "! (3 ) Cosmetic changes, added comments (bmy, 3/17/00)\n" . "! (4 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (5 ) Broke up sections of code into internal subroutines. Also updated\n" . "! comments & cleaned up a few things. (bmy, 7/17/00)\n" . "! (6 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (7 ) Print max & min of tracer regardless of the units (bmy, 10/5/00)\n" . "! (8 ) Removed obsolete code from 10/00 (bmy, 12/21/00)\n" . "! (9 ) Removed obsolete commented out code (bmy, 4/23/01)\n" . "! (10) Added updates from amf for tagged Ox run. Also updated comments\n" . "! and made some cosmetic changes (bmy, 7/3/01)\n" . "! (11) Bug fix: if starting from multiox restart file, then NTRACER \n" . "! will be greater than 40 but less than 60. Adjust COPY_STT_FOR_OX\n" . "! accordingly. (amf, bmy, 9/6/01)\n" . "! (12) Now reference TRANUC from \"charpak_mod.f\" (bmy, 11/15/01)\n" . "! (13) Updated comments (bmy, 1/25/02)\n" . "! (14) Now reference AD from \"dao_mod.f\" (bmy, 9/18/02)\n" . "! (15) Now added a call to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (16) Remove call to COPY_STT_FOR_OX, it's obsolete. (bmy, 8/18/03)\n" . "! (17) Add fancy output string (bmy, 4/26/04)\n" . "! (18) No longer use hardwired filename. Also now reference \"logical_mod.f\"\n" . "! and \"tracer_mod.f\" (bmy, 7/20/04)\n" . "! (19) Remove code for obsolete CO-OH simulation. Also remove references\n" . "! to CMN_DIAG and TRCOFFSET. Change tracer name format string to A10.\n" . "! (bmy, 6/24/05)\n" . "! (20) Updated comments (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE LOGICAL_MOD, ONLY : LSPLIT, LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT\n" . " USE TRACER_MOD, ONLY : TRACER_NAME, TRACER_MW_G\n" . " USE COMODE_MOD, ONLY : CSPEC, JLOP\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"comode.h\"\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . "\n" . " ! Local Variables\n" . " INTEGER :: I, IOS, J, L, N\n" . " INTEGER :: NCOUNT(NNPAR) \n" . " REAL*8 :: TRACER(ITLOOP,IGAS)\n" . " REAL*8 :: SUMTC\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " INTEGER :: NI, NJ, NL\n" . " INTEGER :: IFIRST, JFIRST, LFIRST\n" . " INTEGER :: NTRACER, NSKIP\n" . " INTEGER :: HALFPOLAR, CENTER180\n" . " REAL*4 :: LONRES, LATRES\n" . " REAL*8 :: ZTAU0, ZTAU1\n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED\n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . "\n" . " !=================================================================\n" . " ! READ_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " ! Initialize some variables\n" . " NCOUNT(:) = 0\n" . " TRACER(:,:) = 0e0\n" . "\n" . " !=================================================================\n" . " ! Open restart file and read top-of-file header\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " INPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('CHEM_CHK_CSP1.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Copy input file name to a local variable\n" . " FILENAME = TRIM( INPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " ! Echo some input to the screen\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " WRITE( 6, '(a,/)' ) 'R E S T A R T F I L E I N P U T'\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( 'READ_CHECKPOINT_FILE: Reading ', a )\n" . "\n" . " ! Open the binary punch file for input\n" . " CALL OPEN_BPCH2_FOR_READ( IU_RST, FILENAME )\n" . " \n" . " ! Echo more output\n" . " WRITE( 6, 110 )\n" . " 110 FORMAT( /, 'Min and Max of each tracer, as read from the file:',\n" . " & /, '(in volume mixing ratio units: v/v)' )\n" . "\n" . " !=================================================================\n" . " ! Read concentrations -- store in the TRACER array\n" . " !=================================================================\n" . "\n" . " READ( IU_RST, IOSTAT=IOS )\n" . " & NI, NJ\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:5')\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & ( ( TRACER(I,J), I=1,ITLOOP ), J=1,IGAS )\n" . "\n" . " !-------------------------------------------\n" . " ! *****TESTING CHECKPOINTING*****\n" . " !-------------------------------------------\n" . " !PRINT*,'TRACER(2,2,2)=',TRACER(2,2,2)\n" . " \n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:6')\n" . "\n" . " !==============================================================\n" . " ! Assign data from the TRACER array to the STT array.\n" . " !==============================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J )\n" . " DO J = 1, IGAS\n" . " DO I = 1, ITLOOP\n" . " ! Compute tracer concentration [molec/cm3/box] by\n" . " ! looping over all species belonging to this tracer\n" . " CSPEC(I,J) = TRACER(I,J)\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO \n" . "\n" . " !=================================================================\n" . " ! Examine data blocks, print totals, and return\n" . " !=================================================================\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST ) \n" . "\n" . " ! Print totals atmospheric mass for each tracer\n" . " WRITE( 6, 120 )\n" . " 120 FORMAT( /, 'Total atmospheric masses for each tracer: ' ) \n" . "\n" . " ! Fancy output\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### READ_CHECKPOINT_FILE: read file')\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE READ_CHEMISTRY_CHKFILE_CSP1\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_CHEMISTRY_CHKFILE_CSP2( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHECKPOINT_FILE creates GEOS-CHEM restart files of tracer \n" . "! mixing ratios (v/v), in binary punch file format. (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (2 ) Reference F90 module \"bpch2_mod.f\" which contains routines BPCH2_HDR, \n" . "! BPCH2, and GET_MODELNAME for writing data to binary punch files. \n" . "! (bmy, 6/22/00)\n" . "! (3 ) Now do not write more than NTRACE data blocks to disk. \n" . "! Also updated comments. (bmy, 7/17/00)\n" . "! (4 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (5 ) Added to \"restart_mod.f\". Also now save the entire grid to the\n" . "! restart file. (bmy, 6/24/02)\n" . "! (6 ) Bug fix: Remove duplicate definition of MM. This causes compile-time\n" . "! problems on the ALPHA platform. (gcc, bmy, 11/6/02)\n" . "! (7 ) Now references functions GET_OFFSET, GET_YOFFSET from \"grid_mod.f\".\n" . "! Now references function GET_TAU from \"time_mod.f\". Now added a call \n" . "! to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (8 ) Cosmetic changes (bmy, 4/29/03)\n" . "! (9 ) Now reference STT, N_TRACERS, TCVV from \"tracer_mod.f\". Also now\n" . "! remove hardwired output restart filename. Now references LPRT\n" . "! from \"logical_mod.f\". (bmy, 7/20/04)\n" . "! (10) Remove references to CMN_DIAG and TRCOFFSET. Now call GET_HALFPOLAR \n" . "! from \"bpch2_mod.f\" to get the HALFPOLAR flag value for GEOS or GCAP \n" . "! grids. (bmy, 6/28/05)\n" . "! (11) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (12) Add TAU to the argument list (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2_CSP, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . " USE COMODE_MOD, ONLY : CSPEC\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"comode.h\"\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " INTEGER :: JLOOP,JJ, KK\n" . " REAL*8 :: TRACER(ITLOOP,IGAS)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('CHEM_CHK_CSP2.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " !PRINT*,'ITLOOP, IGAS = ',ITLOOP,IGAS\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J )\n" . " DO J = 1, IGAS\n" . " DO I = 1, ITLOOP\n" . " ! Compute tracer concentration [molec/cm3/box] by\n" . " ! looping over all species belonging to this tracer\n" . " TRACER(I,J) = CSPEC(I,J)\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " !-------------------------------------------\n" . " ! *****TESTING CHECKPOINTING*****\n" . " !-------------------------------------------\n" . "\n" . " CALL BPCH2_CSP( IU_RST, ITLOOP, IGAS, TRACER )\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_CHEMISTRY_CHKFILE_CSP2\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE READ_CHEMISTRY_CHKFILE_CSP2( YYYYMMDD, HHMMSS ) \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine READ_CHECKPOINT_FILE initializes GEOS-CHEM tracer concentrations \n" . "! from a restart file (binary punch file format) (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Day \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to read restart file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now check that N = NTRACER - TRCOFFSET is valid. \n" . "! Also reorganize some print statements (bmy, 10/25/99)\n" . "! (2 ) Now pass LFORCE, LSPLIT via CMN_SETUP. (bmy, 11/4/99)\n" . "! (3 ) Cosmetic changes, added comments (bmy, 3/17/00)\n" . "! (4 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (5 ) Broke up sections of code into internal subroutines. Also updated\n" . "! comments & cleaned up a few things. (bmy, 7/17/00)\n" . "! (6 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (7 ) Print max & min of tracer regardless of the units (bmy, 10/5/00)\n" . "! (8 ) Removed obsolete code from 10/00 (bmy, 12/21/00)\n" . "! (9 ) Removed obsolete commented out code (bmy, 4/23/01)\n" . "! (10) Added updates from amf for tagged Ox run. Also updated comments\n" . "! and made some cosmetic changes (bmy, 7/3/01)\n" . "! (11) Bug fix: if starting from multiox restart file, then NTRACER \n" . "! will be greater than 40 but less than 60. Adjust COPY_STT_FOR_OX\n" . "! accordingly. (amf, bmy, 9/6/01)\n" . "! (12) Now reference TRANUC from \"charpak_mod.f\" (bmy, 11/15/01)\n" . "! (13) Updated comments (bmy, 1/25/02)\n" . "! (14) Now reference AD from \"dao_mod.f\" (bmy, 9/18/02)\n" . "! (15) Now added a call to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (16) Remove call to COPY_STT_FOR_OX, it's obsolete. (bmy, 8/18/03)\n" . "! (17) Add fancy output string (bmy, 4/26/04)\n" . "! (18) No longer use hardwired filename. Also now reference \"logical_mod.f\"\n" . "! and \"tracer_mod.f\" (bmy, 7/20/04)\n" . "! (19) Remove code for obsolete CO-OH simulation. Also remove references\n" . "! to CMN_DIAG and TRCOFFSET. Change tracer name format string to A10.\n" . "! (bmy, 6/24/05)\n" . "! (20) Updated comments (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE LOGICAL_MOD, ONLY : LSPLIT, LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT\n" . " USE TRACER_MOD, ONLY : TRACER_NAME, TRACER_MW_G\n" . " USE COMODE_MOD, ONLY : CSPEC, JLOP\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"comode.h\"\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . "\n" . " ! Local Variables\n" . " INTEGER :: I, IOS, J, L, N\n" . " INTEGER :: NCOUNT(NNPAR) \n" . " REAL*8 :: TRACER(ITLOOP,IGAS)\n" . " REAL*8 :: SUMTC\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " INTEGER :: NI, NJ, NL\n" . " INTEGER :: IFIRST, JFIRST, LFIRST\n" . " INTEGER :: NTRACER, NSKIP\n" . " INTEGER :: HALFPOLAR, CENTER180\n" . " REAL*4 :: LONRES, LATRES\n" . " REAL*8 :: ZTAU0, ZTAU1\n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED\n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . "\n" . " !=================================================================\n" . " ! READ_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " ! Initialize some variables\n" . " NCOUNT(:) = 0\n" . " TRACER(:,:) = 0e0\n" . "\n" . " !=================================================================\n" . " ! Open restart file and read top-of-file header\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " INPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('CHEM_CHK_CSP2.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Copy input file name to a local variable\n" . " FILENAME = TRIM( INPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " ! Echo some input to the screen\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " WRITE( 6, '(a,/)' ) 'R E S T A R T F I L E I N P U T'\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( 'READ_CHECKPOINT_FILE: Reading ', a )\n" . "\n" . " ! Open the binary punch file for input\n" . " CALL OPEN_BPCH2_FOR_READ( IU_RST, FILENAME )\n" . " \n" . " ! Echo more output\n" . " WRITE( 6, 110 )\n" . " 110 FORMAT( /, 'Min and Max of each tracer, as read from the file:',\n" . " & /, '(in volume mixing ratio units: v/v)' )\n" . "\n" . " !=================================================================\n" . " ! Read concentrations -- store in the TRACER array\n" . " !=================================================================\n" . "\n" . " READ( IU_RST, IOSTAT=IOS )\n" . " & NI, NJ\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:5')\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & ( ( TRACER(I,J), I=1,ITLOOP ), J=1,IGAS )\n" . "\n" . " !-------------------------------------------\n" . " ! *****TESTING CHECKPOINTING*****\n" . " !-------------------------------------------\n" . " !PRINT*,'TRACER(2,2,2)=',TRACER(2,2,2)\n" . " \n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:6')\n" . "\n" . " !==============================================================\n" . " ! Assign data from the TRACER array to the STT array.\n" . " !==============================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J )\n" . " DO J = 1, IGAS\n" . " DO I = 1, ITLOOP\n" . " ! Compute tracer concentration [molec/cm3/box] by\n" . " ! looping over all species belonging to this tracer\n" . " CSPEC(I,J) = TRACER(I,J)\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO \n" . "\n" . " !=================================================================\n" . " ! Examine data blocks, print totals, and return\n" . " !=================================================================\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST ) \n" . "\n" . " ! Print totals atmospheric mass for each tracer\n" . " WRITE( 6, 120 )\n" . " 120 FORMAT( /, 'Total atmospheric masses for each tracer: ' ) \n" . "\n" . " ! Fancy output\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### READ_CHECKPOINT_FILE: read file')\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE READ_CHEMISTRY_CHKFILE_CSP2\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE CONVERT_TRACER_TO_VV( NTRACER, TRACER, UNIT )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine CONVERT_TRACER_TO_VV converts the TRACER array from its\n" . "! natural units (e.g. ppbv, ppmv) as read from the restart file to v/v\n" . "! mixing ratio. (bmy, 6/25/02, 6/24/05)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) NTRACER (INTEGER) : Tracer number\n" . "! (2 ) TRACER (REAL*4 ) : Array containing tracer concentrations\n" . "! (3 ) UNIT (CHARACTER) : Unit of tracer as read in from restart file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Added to \"restart_mod.f\". Can now also convert from ppm or ppmv\n" . "! to v/v mixing ratio. (bmy, 6/25/02)\n" . "! (2 ) Now reference GEOS_CHEM_STOP from \"error_mod.f\", which frees all\n" . "! allocated memory before stopping the run. (bmy, 10/15/02)\n" . "! (3 ) Remove obsolete reference to CMN (bmy, 6/24/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE CHARPAK_MOD, ONLY : TRANUC\n" . " USE ERROR_MOD, ONLY : GEOS_CHEM_STOP\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NTRACER\n" . " REAL*8, INTENT(INOUT) :: TRACER(IIPAR,JJPAR,LLPAR) \n" . " CHARACTER(LEN=*), INTENT(IN) :: UNIT\n" . "\n" . " !=================================================================\n" . " ! CONVERT_TRACER_TO_VV begins here!\n" . " !=================================================================\n" . "\n" . " ! Convert UNIT to uppercase\n" . " CALL TRANUC( UNIT )\n" . "\n" . " ! Convert from the current unit to v/v\n" . " SELECT CASE ( TRIM( UNIT ) )\n" . "\n" . " CASE ( '', 'V/V' )\n" . " ! Do nothing, TRACER is already in v/v\n" . " \n" . " CASE ( 'PPM', 'PPMV', 'PPMC' ) \n" . " TRACER = TRACER * 1d-6\n" . "\n" . " CASE ( 'PPB', 'PPBV', 'PPBC' ) \n" . " TRACER = TRACER * 1d-9\n" . "\n" . " CASE ( 'PPT', 'PPTV', 'PPTC' )\n" . " TRACER = TRACER * 1d-12\n" . "\n" . " CASE DEFAULT\n" . " WRITE( 6, '(a)' ) 'Incompatible units in punch file!'\n" . " WRITE( 6, '(a)' ) 'STOP in CONVERT_TRACER_TO_VV'\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " CALL GEOS_CHEM_STOP\n" . "\n" . " END SELECT\n" . "\n" . " ! Print the min & max of each tracer as it is read from the file\n" . " WRITE( 6, 110 ) NTRACER, MINVAL( TRACER ), MAXVAL( TRACER )\n" . " 110 FORMAT( 'Tracer ', i3, ': Min = ', es12.5, ' Max = ', es12.5 )\n" . "\n" . " ! Return to READ_CHECKPOINT_FILE\n" . " END SUBROUTINE CONVERT_TRACER_TO_VV\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE CHECK_DIMENSIONS( NI, NJ, NL ) \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine CHECK_DIMENSIONS makes sure that the dimensions of the\n" . "! restart file extend to cover the entire grid. (bmy, 6/25/02, 10/15/02)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) NI (INTEGER) : Number of longitudes read from restart file\n" . "! (2 ) NJ (INTEGER) : Number of latitudes read from restart file\n" . "! (3 ) NL (INTEGER) : Numbef of levels read from restart file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Added to \"restart_mod.f\". Now no longer allow initialization with \n" . "! less than a globally-sized data block. (bmy, 6/25/02)\n" . "! (2 ) Now reference GEOS_CHEM_STOP from \"error_mod.f\", which frees all\n" . "! allocated memory before stopping the run. (bmy, 10/15/02)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE ERROR_MOD, ONLY : GEOS_CHEM_STOP\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NI, NJ, NL\n" . "\n" . "# include \"CMN_SIZE\"\n" . "\n" . " !=================================================================\n" . " ! CHECK_DIMENSIONS begins here!\n" . " !=================================================================\n" . "\n" . " ! Error check longitude dimension: NI must equal IIPAR\n" . " IF ( NI /= IIPAR ) THEN\n" . " WRITE( 6, '(a)' ) 'ERROR reading in restart file!'\n" . " WRITE( 6, '(a)' ) 'Wrong number of longitudes encountered!'\n" . " WRITE( 6, '(a)' ) 'STOP in CHECK_DIMENSIONS (restart_mod.f)'\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " CALL GEOS_CHEM_STOP\n" . " ENDIF\n" . "\n" . " ! Error check latitude dimension: NJ must equal JJPAR\n" . " IF ( NJ /= JJPAR ) THEN\n" . " WRITE( 6, '(a)' ) 'ERROR reading in restart file!'\n" . " WRITE( 6, '(a)' ) 'Wrong number of latitudes encountered!'\n" . " WRITE( 6, '(a)' ) 'STOP in CHECK_DIMENSIONS (restart_mod.f)'\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " CALL GEOS_CHEM_STOP\n" . " ENDIF\n" . " \n" . " ! Error check vertical dimension: NL must equal LLPAR\n" . " IF ( NL /= LLPAR ) THEN\n" . " WRITE( 6, '(a)' ) 'ERROR reading in restart file!'\n" . " WRITE( 6, '(a)' ) 'Wrong number of levels encountered!'\n" . " WRITE( 6, '(a)' ) 'STOP in CHECK_DIMENSIONS (restart_mod.f)'\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " CALL GEOS_CHEM_STOP\n" . " ENDIF\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE CHECK_DIMENSIONS\n" . "\n" . "!------------------------------------------------------------------------------\n" . " \n" . " SUBROUTINE COPY_STT( NTRACER, TRACER, NCOUNT )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine COPY_STT copies the results into the STT tracer array. \n" . "! (Kumaresh, 01/24/08)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) NTRACER (INTEGER) : Tracer number\n" . "! (2 ) NCOUNT (INTEGER) : Ctr array - # of data blocks read for each tracer\n" . "! (3 ) TRACER (REAL*4 ) : Tracer concentrations from restart file [v/v]\n" . "!\n" . "! NOTES:\n" . "! (1 ) Added to \"restart_mod.f\". Also added parallel loops. (bmy, 6/25/02)\n" . "! (2 ) Now reference AD from \"dao_mod.f\" (bmy, 9/18/02)\n" . "! (3 ) Now exit if N is out of range (bmy, 4/29/03)\n" . "! (4 ) Now references N_TRACERS, STT & TCVV from \"tracer_mod.f\" (bmy, 7/20/04)\n" . "! (5 ) Remove call to TRUE_TRACER_INDEX (bmy, 6/24/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE DAO_MOD, ONLY : AD\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT, TCVV\n" . " \n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NTRACER\n" . " REAL*8, INTENT(IN) :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " INTEGER, INTENT(INOUT) :: NCOUNT(NNPAR)\n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, L, N\n" . " \n" . " !=================================================================\n" . " ! COPY_STT begins here!\n" . " !=================================================================\n" . "\n" . " ! Tracer number\n" . " N = NTRACER\n" . "\n" . " ! Exit if N is out of range\n" . " IF ( N < 1 .or. N > N_TRACERS ) RETURN\n" . "\n" . " ! store Tracers into GEOS-CHEM tracer arry\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " STT(I,J,L,N) = TRACER(I,J,L) !* AD(I,J,L) / TCVV(N) \n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " ! Increment the # of records found for tracer N\n" . " NCOUNT(N) = NCOUNT(N) + 1\n" . "\n" . " END SUBROUTINE COPY_STT\n" . "\n" . "!------------------------------------------------------------------------------\n" . " \n" . " SUBROUTINE COPY_STT_ADJ( NTRACER, TRACER, NCOUNT )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine COPY_STT_ADJ converts tracer concetrations copies the results into \n" . "! the STT_ADJ tracer array. (Kumaresh, 01/24/08)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) NTRACER (INTEGER) : Tracer number\n" . "! (2 ) NCOUNT (INTEGER) : Ctr array - # of data blocks read for each tracer\n" . "! (3 ) TRACER (REAL*4 ) : Tracer concentrations from restart file [v/v]\n" . "!\n" . "! NOTES:\n" . "! (1 ) Added to \"restart_mod.f\". Also added parallel loops. (bmy, 6/25/02)\n" . "! (2 ) Now reference AD from \"dao_mod.f\" (bmy, 9/18/02)\n" . "! (3 ) Now exit if N is out of range (bmy, 4/29/03)\n" . "! (4 ) Now references N_TRACERS, STT & TCVV from \"tracer_mod.f\" (bmy, 7/20/04)\n" . "! (5 ) Remove call to TRUE_TRACER_INDEX (bmy, 6/24/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE DAO_MOD, ONLY : AD\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT_ADJ, TCVV\n" . " \n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NTRACER\n" . " REAL*8, INTENT(IN) :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " INTEGER, INTENT(INOUT) :: NCOUNT(NNPAR)\n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, L, N\n" . " \n" . " !=================================================================\n" . " ! COPY_STT_ADJ begins here!\n" . " !=================================================================\n" . "\n" . " ! Tracer number\n" . " N = NTRACER\n" . "\n" . " ! Exit if N is out of range\n" . " IF ( N < 1 .or. N > N_TRACERS ) RETURN\n" . "\n" . " ! Store Tracer values in GEOS-CHEM tracers\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " STT_ADJ(I,J,L,N) = TRACER(I,J,L) !* AD(I,J,L) / TCVV(N) \n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " ! Increment the # of records found for tracer N\n" . " NCOUNT(N) = NCOUNT(N) + 1\n" . "\n" . " END SUBROUTINE COPY_STT_ADJ\n" . "\n" . "!------------------------------------------------------------------------------\n" . " \n" . " SUBROUTINE COPY_F( NTRACER, TRACER, NCOUNT )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine COPY_STT copies the results into the STT tracer array. \n" . "! (Kumaresh, 01/24/08)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) NTRACER (INTEGER) : Tracer number\n" . "! (2 ) NCOUNT (INTEGER) : Ctr array - # of data blocks read for each tracer\n" . "! (3 ) TRACER (REAL*4 ) : Tracer concentrations from restart file [v/v]\n" . "!\n" . "! NOTES:\n" . "! (1 ) Added to \"restart_mod.f\". Also added parallel loops. (bmy, 6/25/02)\n" . "! (2 ) Now reference AD from \"dao_mod.f\" (bmy, 9/18/02)\n" . "! (3 ) Now exit if N is out of range (bmy, 4/29/03)\n" . "! (4 ) Now references N_TRACERS, STT & TCVV from \"tracer_mod.f\" (bmy, 7/20/04)\n" . "! (5 ) Remove call to TRUE_TRACER_INDEX (bmy, 6/24/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE DAO_MOD, ONLY : AD\n" . " USE TRACER_MOD, ONLY : N_TRACERS, F, TCVV\n" . " \n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NTRACER\n" . " REAL*8, INTENT(IN) :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " INTEGER, INTENT(INOUT) :: NCOUNT(NNPAR)\n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, L, N\n" . " \n" . " !=================================================================\n" . " ! COPY_STT begins here!\n" . " !=================================================================\n" . "\n" . " ! Tracer number\n" . " N = NTRACER\n" . "\n" . " ! Exit if N is out of range\n" . " IF ( N < 1 .or. N > N_TRACERS ) RETURN\n" . "\n" . " ! store Tracers into GEOS-CHEM tracer arry\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " F(I,J,L,N) = TRACER(I,J,L) !* AD(I,J,L) / TCVV(N) \n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " ! Increment the # of records found for tracer N\n" . " NCOUNT(N) = NCOUNT(N) + 1\n" . "\n" . " END SUBROUTINE COPY_F\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_RRATE_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHECKPOINT_FILE creates GEOS-CHEM restart files of tracer \n" . "! mixing ratios (v/v), in binary punch file format. (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (2 ) Reference F90 module \"bpch2_mod.f\" which contains routines BPCH2_HDR, \n" . "! BPCH2, and GET_MODELNAME for writing data to binary punch files. \n" . "! (bmy, 6/22/00)\n" . "! (3 ) Now do not write more than NTRACE data blocks to disk. \n" . "! Also updated comments. (bmy, 7/17/00)\n" . "! (4 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (5 ) Added to \"restart_mod.f\". Also now save the entire grid to the\n" . "! restart file. (bmy, 6/24/02)\n" . "! (6 ) Bug fix: Remove duplicate definition of MM. This causes compile-time\n" . "! problems on the ALPHA platform. (gcc, bmy, 11/6/02)\n" . "! (7 ) Now references functions GET_OFFSET, GET_YOFFSET from \"grid_mod.f\".\n" . "! Now references function GET_TAU from \"time_mod.f\". Now added a call \n" . "! to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (8 ) Cosmetic changes (bmy, 4/29/03)\n" . "! (9 ) Now reference STT, N_TRACERS, TCVV from \"tracer_mod.f\". Also now\n" . "! remove hardwired output restart filename. Now references LPRT\n" . "! from \"logical_mod.f\". (bmy, 7/20/04)\n" . "! (10) Remove references to CMN_DIAG and TRCOFFSET. Now call GET_HALFPOLAR \n" . "! from \"bpch2_mod.f\" to get the HALFPOLAR flag value for GEOS or GCAP \n" . "! grids. (bmy, 6/28/05)\n" . "! (11) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (12) Add TAU to the argument list (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2_CSP, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . " USE COMODE_MOD, ONLY : R_KPP\n" . " USE gckpp_Global, ONLY : NTT, IND\n" . " USE gckpp_Parameters\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " INTEGER :: JLOOP,JJ, KK\n" . " REAL*8 :: TRACER(NTT,NREACT)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('RRATE_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " !PRINT*,'ITLOOP, IGAS = ',ITLOOP,IGAS\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J )\n" . " DO J = 1, NREACT\n" . " DO I = 1, NTT\n" . " ! Compute tracer concentration [molec/cm3/box] by\n" . " ! looping over all species belonging to this tracer\n" . " TRACER(I,J) = R_KPP(I,IND(J))\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " !-------------------------------------------\n" . " ! *****TESTING CHECKPOINTING*****\n" . " !-------------------------------------------\n" . "\n" . " CALL BPCH2_CSP( IU_RST, NTT, NREACT, TRACER )\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_RRATE_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE READ_RRATE_CHKFILE( YYYYMMDD, HHMMSS ) \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine READ_CHECKPOINT_FILE initializes GEOS-CHEM tracer concentrations \n" . "! from a restart file (binary punch file format) (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Day \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to read restart file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now check that N = NTRACER - TRCOFFSET is valid. \n" . "! Also reorganize some print statements (bmy, 10/25/99)\n" . "! (2 ) Now pass LFORCE, LSPLIT via CMN_SETUP. (bmy, 11/4/99)\n" . "! (3 ) Cosmetic changes, added comments (bmy, 3/17/00)\n" . "! (4 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (5 ) Broke up sections of code into internal subroutines. Also updated\n" . "! comments & cleaned up a few things. (bmy, 7/17/00)\n" . "! (6 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (7 ) Print max & min of tracer regardless of the units (bmy, 10/5/00)\n" . "! (8 ) Removed obsolete code from 10/00 (bmy, 12/21/00)\n" . "! (9 ) Removed obsolete commented out code (bmy, 4/23/01)\n" . "! (10) Added updates from amf for tagged Ox run. Also updated comments\n" . "! and made some cosmetic changes (bmy, 7/3/01)\n" . "! (11) Bug fix: if starting from multiox restart file, then NTRACER \n" . "! will be greater than 40 but less than 60. Adjust COPY_STT_FOR_OX\n" . "! accordingly. (amf, bmy, 9/6/01)\n" . "! (12) Now reference TRANUC from \"charpak_mod.f\" (bmy, 11/15/01)\n" . "! (13) Updated comments (bmy, 1/25/02)\n" . "! (14) Now reference AD from \"dao_mod.f\" (bmy, 9/18/02)\n" . "! (15) Now added a call to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (16) Remove call to COPY_STT_FOR_OX, it's obsolete. (bmy, 8/18/03)\n" . "! (17) Add fancy output string (bmy, 4/26/04)\n" . "! (18) No longer use hardwired filename. Also now reference \"logical_mod.f\"\n" . "! and \"tracer_mod.f\" (bmy, 7/20/04)\n" . "! (19) Remove code for obsolete CO-OH simulation. Also remove references\n" . "! to CMN_DIAG and TRCOFFSET. Change tracer name format string to A10.\n" . "! (bmy, 6/24/05)\n" . "! (20) Updated comments (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE LOGICAL_MOD, ONLY : LSPLIT, LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT\n" . " USE TRACER_MOD, ONLY : TRACER_NAME, TRACER_MW_G\n" . " USE COMODE_MOD, ONLY : R_KPP\n" . " USE gckpp_Global\n" . " USE gckpp_Parameters\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . "\n" . " ! Local Variables\n" . " INTEGER :: I, IOS, J, L, N\n" . " INTEGER :: NCOUNT(NNPAR) \n" . " REAL*8 :: TRACER(NTT,NREACT)\n" . " REAL*8 :: SUMTC\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " INTEGER :: II, JJ\n" . " INTEGER :: IFIRST, JFIRST, LFIRST\n" . " INTEGER :: NTRACER, NSKIP\n" . " INTEGER :: HALFPOLAR, CENTER180\n" . " REAL*4 :: LONRES, LATRES\n" . " REAL*8 :: ZTAU0, ZTAU1\n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED\n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . "\n" . " !=================================================================\n" . " ! READ_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " ! Initialize some variables\n" . " NCOUNT(:) = 0\n" . " TRACER(:,:) = 0e0\n" . "\n" . " !=================================================================\n" . " ! Open restart file and read top-of-file header\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " INPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('RRATE_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Copy input file name to a local variable\n" . " FILENAME = TRIM( INPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " ! Echo some input to the screen\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " WRITE( 6, '(a,/)' ) 'R E S T A R T F I L E I N P U T'\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( 'READ_CHECKPOINT_FILE: Reading ', a )\n" . "\n" . " ! Open the binary punch file for input\n" . " CALL OPEN_BPCH2_FOR_READ( IU_RST, FILENAME )\n" . " \n" . " ! Echo more output\n" . " WRITE( 6, 110 )\n" . " 110 FORMAT( /, 'Min and Max of each tracer, as read from the file:',\n" . " & /, '(in volume mixing ratio units: v/v)' )\n" . "\n" . " !=================================================================\n" . " ! Read concentrations -- store in the TRACER array\n" . " !=================================================================\n" . "\n" . " READ( IU_RST, IOSTAT=IOS )\n" . " & II, JJ\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:5')\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & ( ( TRACER(I,J), I=1,NTT ), J=1,NREACT )\n" . "\n" . " !-------------------------------------------\n" . " ! *****TESTING CHECKPOINTING*****\n" . " !-------------------------------------------\n" . " !PRINT*,'TRACER(2,2,2)=',TRACER(2,2,2)\n" . " \n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:6')\n" . "\n" . " !==============================================================\n" . " ! Assign data from the TRACER array to the STT array.\n" . " !==============================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J )\n" . " DO J = 1, NREACT\n" . " DO I = 1, NTT\n" . " ! Compute tracer concentration [molec/cm3/box] by\n" . " ! looping over all species belonging to this tracer\n" . " R_KPP(I,IND(J)) = TRACER(I,J)\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO \n" . "\n" . " !=================================================================\n" . " ! Examine data blocks, print totals, and return\n" . " !=================================================================\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST ) \n" . "\n" . " ! Print totals atmospheric mass for each tracer\n" . " WRITE( 6, 120 )\n" . " 120 FORMAT( /, 'Total atmospheric masses for each tracer: ' ) \n" . "\n" . " ! Fancy output\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### READ_CHECKPOINT_FILE: read file')\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE READ_RRATE_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE CHECK_DATA_BLOCKS( NTRACE, NCOUNT )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine CHECK_DATA_BLOCKS checks to see if we have multiple or \n" . "! missing data blocks for a given tracer. (bmy, 6/25/02, 10/15/02)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) NTRACE (INTEGER) : Number of tracers\n" . "! (2 ) NCOUNT (INTEGER) : Ctr array - # of data blocks found per tracer\n" . "!\n" . "! NOTES:\n" . "! (1 ) Added to \"restart_mod.f\". Also now use F90 intrinsic REPEAT to\n" . "! write a long line of \"=\"'s to the screen. (bmy, 6/25/02)\n" . "! (2 ) Now reference GEOS_CHEM_STOP from \"error_mod.f\", which frees all\n" . "! allocated memory before stopping the run. (bmy, 10/15/02)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE ERROR_MOD, ONLY : GEOS_CHEM_STOP\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: NTRACE, NCOUNT(NNPAR)\n" . " \n" . " ! Local variables\n" . " INTEGER :: N\n" . "\n" . " !=================================================================\n" . " ! CHECK_DATA_BLOCKS begins here! \n" . " !=================================================================\n" . "\n" . " ! Loop over all tracers\n" . " DO N = 1, NTRACE\n" . "\n" . " ! Stop if a tracer has more than one data block \n" . " IF ( NCOUNT(N) > 1 ) THEN \n" . " WRITE( 6, 100 ) N\n" . " WRITE( 6, 120 ) \n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " CALL GEOS_CHEM_STOP\n" . " ENDIF\n" . " \n" . " ! Stop if a tracer has no data blocks \n" . " IF ( NCOUNT(N) == 0 ) THEN\n" . " WRITE( 6, 110 ) N\n" . " WRITE( 6, 120 ) \n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " CALL GEOS_CHEM_STOP\n" . " ENDIF\n" . " ENDDO\n" . "\n" . " ! FORMAT statements\n" . " 100 FORMAT( 'More than one record found for tracer : ', i4 )\n" . " 110 FORMAT( 'No records found for tracer : ', i4 ) \n" . " 120 FORMAT( 'STOP in CHECK_DATA_BLOCKS (restart_mod.f)' )\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE CHECK_DATA_BLOCKS\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_ADJOINT_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHECKPOINT_FILE creates GEOS-CHEM restart files of tracer \n" . "! mixing ratios (v/v), in binary punch file format. (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (2 ) Reference F90 module \"bpch2_mod.f\" which contains routines BPCH2_HDR, \n" . "! BPCH2, and GET_MODELNAME for writing data to binary punch files. \n" . "! (bmy, 6/22/00)\n" . "! (3 ) Now do not write more than NTRACE data blocks to disk. \n" . "! Also updated comments. (bmy, 7/17/00)\n" . "! (4 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (5 ) Added to \"restart_mod.f\". Also now save the entire grid to the\n" . "! restart file. (bmy, 6/24/02)\n" . "! (6 ) Bug fix: Remove duplicate definition of MM. This causes compile-time\n" . "! problems on the ALPHA platform. (gcc, bmy, 11/6/02)\n" . "! (7 ) Now references functions GET_OFFSET, GET_YOFFSET from \"grid_mod.f\".\n" . "! Now references function GET_TAU from \"time_mod.f\". Now added a call \n" . "! to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (8 ) Cosmetic changes (bmy, 4/29/03)\n" . "! (9 ) Now reference STT, N_TRACERS, TCVV from \"tracer_mod.f\". Also now\n" . "! remove hardwired output restart filename. Now references LPRT\n" . "! from \"logical_mod.f\". (bmy, 7/20/04)\n" . "! (10) Remove references to CMN_DIAG and TRCOFFSET. Now call GET_HALFPOLAR \n" . "! from \"bpch2_mod.f\" to get the HALFPOLAR flag value for GEOS or GCAP \n" . "! grids. (bmy, 6/28/05)\n" . "! (11) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (12) Add TAU to the argument list (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT_ADJ, N_TRACERS, TCVV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " REAL*4 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " REAL*8, PARAMETER :: SMALLOX = 1d-6\n" . " REAL*8, PARAMETER :: SMALLNOX = 1d-8\n" . " REAL*8, PARAMETER :: SMALLCO = 1d-9\n" . " \n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('ADJ.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_ADJ_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . " DO N = 1, N_TRACERS\n" . " \n" . " ! Convert from [kg] to [v/v] and store in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " TRACER(I,J,L) = STT_ADJ(I,J,L,N) !* TCVV(N) / AD(I,J,L)\n" . "c\$\$\$ IF(N==1)THEN\n" . "c\$\$\$ IF(STT_ADJ(I,J,L,N).ne.0d0) THEN\n" . "c\$\$\$ IF( STT_ADJ(I,J,L,N) < SMALLNOX )THEN\n" . "c\$\$\$ TRACER(I,J,L) = 0d0\n" . "c\$\$\$ ENDIF\n" . "c\$\$\$ ENDIF\n" . "c\$\$\$ ELSEIF(N==2)THEN\n" . "c\$\$\$ IF(STT_ADJ(I,J,L,N).ne.0d0) THEN\n" . "c\$\$\$ IF( STT_ADJ(I,J,L,N) < SMALLOX )THEN\n" . "c\$\$\$ TRACER(I,J,L) = 0d0\n" . "c\$\$\$ ENDIF\n" . "c\$\$\$ ENDIF\n" . "c\$\$\$ ELSE\n" . "c\$\$\$ IF(STT_ADJ(I,J,L,N).ne.0d0) THEN\n" . "c\$\$\$ IF( STT_ADJ(I,J,L,N) < SMALLCO )THEN\n" . "c\$\$\$ TRACER(I,J,L) = 0d0\n" . "c\$\$\$ ENDIF\n" . "c\$\$\$ ENDIF\n" . "c\$\$\$ ENDIF\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " ! Convert STT from [kg] to [v/v] mixing ratio \n" . " ! and store in temporary variable TRACER\n" . " CALL BPCH2( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . " ENDDO \n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_ADJOINT_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_CHEMISTRY_CHKFILE_P( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHEMISTRY_CHKFILE_P creates GEOS-CHEM restart files of tracers\n" . "! in binary punch file format for perturbed chemistry concentrations. \n" . "! (Kumaresh, 01/24/08)\n" . "\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2_CHK, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " REAL*8 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('CHEM_CHK_P.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . " DO N = 1, N_TRACERS\n" . " \n" . " ! Store GEOS-CHEM tracers in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " TRACER(I,J,L) = STT(I,J,L,N) !* TCVV(N) / AD(I,J,L)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . " \n" . " CALL BPCH2_CHK( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . " ENDDO \n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_CHEMISTRY_CHKFILE_P\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE READ_CHEMISTRY_CHKFILE_P( YYYYMMDD, HHMMSS ) \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine READ_CHEMISTRY_CHKFILE_P initializes GEOS-CHEM tracer concentrations \n" . "! from a binary punch file for perturbed chemistry concentrations. \n" . "! (Kumaresh, 01/24/08)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Day \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to read restart file\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE LOGICAL_MOD, ONLY : LSPLIT, LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT\n" . " USE TRACER_MOD, ONLY : TRACER_NAME, TRACER_MW_G\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . "\n" . " ! Local Variables\n" . " INTEGER :: I, IOS, J, L, N\n" . " INTEGER :: NCOUNT(NNPAR) \n" . " REAL*8 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: SUMTC\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " INTEGER :: NI, NJ, NL\n" . " INTEGER :: IFIRST, JFIRST, LFIRST\n" . " INTEGER :: NTRACER, NSKIP\n" . " INTEGER :: HALFPOLAR, CENTER180\n" . " REAL*4 :: LONRES, LATRES\n" . " REAL*8 :: ZTAU0, ZTAU1\n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED\n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . "\n" . " !=================================================================\n" . " ! READ_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " ! Initialize some variables\n" . " NCOUNT(:) = 0\n" . " TRACER(:,:,:) = 0e0\n" . "\n" . " !=================================================================\n" . " ! Open restart file and read top-of-file header\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " INPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('CHEM_CHK_P.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Copy input file name to a local variable\n" . " FILENAME = TRIM( INPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " ! Echo some input to the screen\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " WRITE( 6, '(a,/)' ) 'R E S T A R T F I L E I N P U T'\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( 'READ_CHECKPOINT_FILE: Reading ', a )\n" . "\n" . " ! Open the binary punch file for input\n" . " CALL OPEN_BPCH2_FOR_READ( IU_RST, FILENAME )\n" . " \n" . " ! Echo more output\n" . " WRITE( 6, 110 )\n" . " 110 FORMAT( /, 'Min and Max of each tracer, as read from the file:',\n" . " & /, '(in volume mixing ratio units: v/v)' )\n" . "\n" . " !=================================================================\n" . " ! Read concentrations -- store in the TRACER array\n" . " !=================================================================\n" . "\n" . " DO \n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & MODELNAME, LONRES, LATRES, HALFPOLAR, CENTER180\n" . "\n" . " ! IOS < 0 is end-of-file, so exit\n" . " IF ( IOS < 0 ) EXIT\n" . "\n" . " ! IOS > 0 is a real I/O error -- print error message\n" . " IF ( IOS > 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:4' )\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & CATEGORY, NTRACER, UNIT, ZTAU0, ZTAU1, RESERVED,\n" . " & NI, NJ, NL, IFIRST, JFIRST, LFIRST,\n" . " & NSKIP\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:5')\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & ( ( ( TRACER(I,J,L), I=1,NI ), J=1,NJ ), L=1,NL )\n" . "\n" . " !-------------------------------------------\n" . " ! *****TESTING CHECKPOINTING*****\n" . " !-------------------------------------------\n" . " !PRINT*,'TRACER(2,2,2)=',TRACER(2,2,2)\n" . " \n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:6')\n" . "\n" . " !==============================================================\n" . " ! Assign data from the TRACER array to the STT array.\n" . " !==============================================================\n" . " CALL COPY_STT( NTRACER, TRACER, NCOUNT )\n" . "\n" . " ENDDO\n" . "\n" . " !=================================================================\n" . " ! Examine data blocks, print totals, and return\n" . " !=================================================================\n" . "\n" . " ! Check for missing or duplicate data blocks\n" . " CALL CHECK_DATA_BLOCKS( N_TRACERS, NCOUNT )\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST ) \n" . "\n" . " ! Print totals atmospheric mass for each tracer\n" . " WRITE( 6, 120 )\n" . " 120 FORMAT( /, 'Total atmospheric masses for each tracer: ' ) \n" . "\n" . " ! Fancy output\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### READ_CHECKPOINT_FILE: read file')\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE READ_CHEMISTRY_CHKFILE_P\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_CHEMISTRY_CHKFILE_P1( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHEMISTRY_CHKFILE_P1 creates GEOS-CHEM restart files of tracers\n" . "! in binary punch file format for chemistry checkpoints of type1 information. \n" . "! (Kumaresh, 01/24/08)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2_CHK, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " REAL*8 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('CHEM_CHK_P1.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . " DO N = 1, N_TRACERS\n" . " \n" . " ! Store GEOS-CHEM tracers in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " TRACER(I,J,L) = STT(I,J,L,N) !* TCVV(N) / AD(I,J,L)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " CALL BPCH2_CHK( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . " ENDDO \n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_CHEMISTRY_CHKFILE_P1\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE READ_CHEMISTRY_CHKFILE_P1( YYYYMMDD, HHMMSS ) \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine READ_CHEMISTRY_CHKFILE_P1 initializes GEOS-CHEM tracer concentrations \n" . "! from a binary punch file for chemistry checkpoints of type1 informations. \n" . "! (Kumaresh, 01/24/08)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Day \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to read restart file\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE LOGICAL_MOD, ONLY : LSPLIT, LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT\n" . " USE TRACER_MOD, ONLY : TRACER_NAME, TRACER_MW_G\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . "\n" . " ! Local Variables\n" . " INTEGER :: I, IOS, J, L, N\n" . " INTEGER :: NCOUNT(NNPAR) \n" . " REAL*8 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: SUMTC\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " INTEGER :: NI, NJ, NL\n" . " INTEGER :: IFIRST, JFIRST, LFIRST\n" . " INTEGER :: NTRACER, NSKIP\n" . " INTEGER :: HALFPOLAR, CENTER180\n" . " REAL*4 :: LONRES, LATRES\n" . " REAL*8 :: ZTAU0, ZTAU1\n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED\n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . "\n" . " !=================================================================\n" . " ! READ_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " ! Initialize some variables\n" . " NCOUNT(:) = 0\n" . " TRACER(:,:,:) = 0e0\n" . "\n" . " !=================================================================\n" . " ! Open restart file and read top-of-file header\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " INPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('CHEM_CHK_P1.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Copy input file name to a local variable\n" . " FILENAME = TRIM( INPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " ! Echo some input to the screen\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " WRITE( 6, '(a,/)' ) 'R E S T A R T F I L E I N P U T'\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( 'READ_CHECKPOINT_FILE: Reading ', a )\n" . "\n" . " ! Open the binary punch file for input\n" . " CALL OPEN_BPCH2_FOR_READ( IU_RST, FILENAME )\n" . " \n" . " ! Echo more output\n" . " WRITE( 6, 110 )\n" . " 110 FORMAT( /, 'Min and Max of each tracer, as read from the file:',\n" . " & /, '(in volume mixing ratio units: v/v)' )\n" . "\n" . " !=================================================================\n" . " ! Read concentrations -- store in the TRACER array\n" . " !=================================================================\n" . "\n" . " DO \n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & MODELNAME, LONRES, LATRES, HALFPOLAR, CENTER180\n" . "\n" . " ! IOS < 0 is end-of-file, so exit\n" . " IF ( IOS < 0 ) EXIT\n" . "\n" . " ! IOS > 0 is a real I/O error -- print error message\n" . " IF ( IOS > 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:4' )\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & CATEGORY, NTRACER, UNIT, ZTAU0, ZTAU1, RESERVED,\n" . " & NI, NJ, NL, IFIRST, JFIRST, LFIRST,\n" . " & NSKIP\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:5')\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & ( ( ( TRACER(I,J,L), I=1,NI ), J=1,NJ ), L=1,NL )\n" . " \n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:6')\n" . "\n" . " !==============================================================\n" . " ! Assign data from the TRACER array to the STT array.\n" . " !==============================================================\n" . " CALL COPY_STT( NTRACER, TRACER, NCOUNT )\n" . "\n" . " ENDDO\n" . "\n" . " !=================================================================\n" . " ! Examine data blocks, print totals, and return\n" . " !=================================================================\n" . "\n" . " ! Check for missing or duplicate data blocks\n" . " CALL CHECK_DATA_BLOCKS( N_TRACERS, NCOUNT )\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST ) \n" . "\n" . " ! Print totals atmospheric mass for each tracer\n" . " WRITE( 6, 120 )\n" . " 120 FORMAT( /, 'Total atmospheric masses for each tracer: ' ) \n" . "\n" . " ! Fancy output\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### READ_CHECKPOINT_FILE: read file')\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE READ_CHEMISTRY_CHKFILE_P1\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_HSAVE_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_HSAVE_CHKFILE creates GEOS-CHEM restart files of KPP chemistry \n" . "! step size in binary punch file format. (Kumaresh, 01/24/08)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE COMODE_MOD, ONLY : IXSAVE, IYSAVE, IZSAVE, HSAVE_KPP\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . " USE GCKPP_Global \n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS, JJLOOP\n" . " REAL*4 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('HSAVE_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . " N = 1\n" . " \n" . " ! Store KPP Chemistry step size in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( JJLOOP )\n" . " DO JJLOOP = 1,NTT\n" . " I = IXSAVE(JJLOOP)\n" . " J = IYSAVE(JJLOOP)\n" . " L = IZSAVE(JJLOOP)\n" . " TRACER(I,J,L) = HSAVE_KPP(I,J,L)\n" . " END DO\n" . "!\$OMP END PARALLEL DO\n" . " \n" . " CALL BPCH2( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_HSAVE_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE READ_HSAVE_CHKFILE( YYYYMMDD, HHMMSS ) \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine READ_HSAVE_CHKFILE initializes GEOS-CHEM tracer concentrations \n" . "! from a binary punch file with KPP chemistry step size. (Kumaresh, 01/24/08)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Day \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to read restart file\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE LOGICAL_MOD, ONLY : LSPLIT, LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT\n" . " USE TRACER_MOD, ONLY : TRACER_NAME, TRACER_MW_G\n" . " USE GCKPP_Global \n" . " USE COMODE_MOD, ONLY : IXSAVE, IYSAVE, IZSAVE, HSAVE_KPP\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . "\n" . " ! Local Variables\n" . " INTEGER :: I, IOS, J, L, N\n" . " INTEGER :: NCOUNT(NNPAR), JJLOOP \n" . " REAL*4 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: SUMTC\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " INTEGER :: NI, NJJ, NL\n" . " INTEGER :: IFIRST, JFIRST, LFIRST\n" . " INTEGER :: NTRACER, NSKIP\n" . " INTEGER :: HALFPOLAR, CENTER180\n" . " REAL*4 :: LONRES, LATRES\n" . " REAL*8 :: ZTAU0, ZTAU1\n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED\n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . "\n" . " !=================================================================\n" . " ! READ_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " ! Initialize some variables\n" . " NCOUNT(:) = 0\n" . " TRACER(:,:,:) = 0e0\n" . "\n" . " !=================================================================\n" . " ! Open restart file and read top-of-file header\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " INPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('HSAVE_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Copy input file name to a local variable\n" . " FILENAME = TRIM( INPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " ! Echo some input to the screen\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " WRITE( 6, '(a,/)' ) 'R E S T A R T F I L E I N P U T'\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( 'READ_CHECKPOINT_FILE: Reading ', a )\n" . "\n" . " ! Open the binary punch file for input\n" . " CALL OPEN_BPCH2_FOR_READ( IU_RST, FILENAME )\n" . " \n" . " ! Echo more output\n" . " WRITE( 6, 110 )\n" . " 110 FORMAT( /, 'Min and Max of each tracer, as read from the file:',\n" . " & /, '(in volume mixing ratio units: v/v)' )\n" . "\n" . " !=================================================================\n" . " ! Read concentrations -- store in the TRACER array\n" . " !=================================================================\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & MODELNAME, LONRES, LATRES, HALFPOLAR, CENTER180\n" . "\n" . " ! IOS > 0 is a real I/O error -- print error message\n" . " IF ( IOS > 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:4' )\n" . " \n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & CATEGORY, NTRACER, UNIT, ZTAU0, ZTAU1, RESERVED,\n" . " & NI, NJJ, NL, IFIRST, JFIRST, LFIRST,\n" . " & NSKIP\n" . " \n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:5')\n" . " \n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & ( ( ( TRACER(I,J,L), I=1,NI ), J=1,NJJ ), L=1,NL )\n" . " \n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:6')\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( JJLOOP )\n" . " DO JJLOOP = 1,NTT\n" . " I = IXSAVE(JJLOOP)\n" . " J = IYSAVE(JJLOOP)\n" . " L = IZSAVE(JJLOOP)\n" . " HSAVE_KPP(I,J,L) = TRACER(I,J,L) !* TCVV(N) / AD(I,J,L)\n" . " END DO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " !=================================================================\n" . " ! Examine data blocks, print totals, and return\n" . " !=================================================================\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST ) \n" . "\n" . " ! Print totals atmospheric mass for each tracer\n" . " WRITE( 6, 120 )\n" . " 120 FORMAT( /, 'Total atmospheric masses for each tracer: ' ) \n" . "\n" . " ! Fancy output\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### READ_CHECKPOINT_FILE: read file')\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE READ_HSAVE_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_PART_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_HSAVE_CHKFILE creates GEOS-CHEM restart files of KPP chemistry \n" . "! step size in binary punch file format. (Kumaresh, 01/24/08)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE COMODE_MOD, ONLY : IXSAVE, IYSAVE, IZSAVE, PART_CASE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . " USE GCKPP_Global \n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS, JJLOOP\n" . " REAL*4 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('PART_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . " N = 1\n" . " \n" . " ! Store KPP Chemistry step size in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( JJLOOP )\n" . " DO JJLOOP = 1,NTT\n" . " I = IXSAVE(JJLOOP)\n" . " J = IYSAVE(JJLOOP)\n" . " L = IZSAVE(JJLOOP)\n" . " TRACER(I,J,L) = PART_CASE(JJLOOP)\n" . " END DO\n" . "!\$OMP END PARALLEL DO\n" . " \n" . " CALL BPCH2( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_PART_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE READ_PART_CHKFILE( YYYYMMDD, HHMMSS ) \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine READ_HSAVE_CHKFILE initializes GEOS-CHEM tracer concentrations \n" . "! from a binary punch file with KPP chemistry step size. (Kumaresh, 01/24/08)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Day \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to read restart file\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE LOGICAL_MOD, ONLY : LSPLIT, LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT\n" . " USE TRACER_MOD, ONLY : TRACER_NAME, TRACER_MW_G\n" . " USE GCKPP_Global \n" . " USE COMODE_MOD, ONLY : IXSAVE, IYSAVE, IZSAVE, PART_CASE\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . "\n" . " ! Local Variables\n" . " INTEGER :: I, IOS, J, L, N\n" . " INTEGER :: NCOUNT(NNPAR), JJLOOP \n" . " REAL*4 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: SUMTC\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " INTEGER :: NI, NJJ, NL\n" . " INTEGER :: IFIRST, JFIRST, LFIRST\n" . " INTEGER :: NTRACER, NSKIP\n" . " INTEGER :: HALFPOLAR, CENTER180\n" . " REAL*4 :: LONRES, LATRES\n" . " REAL*8 :: ZTAU0, ZTAU1\n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED\n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . "\n" . " !=================================================================\n" . " ! READ_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " ! Initialize some variables\n" . " NCOUNT(:) = 0\n" . " TRACER(:,:,:) = 0e0\n" . "\n" . " !=================================================================\n" . " ! Open restart file and read top-of-file header\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " INPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('PART_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Copy input file name to a local variable\n" . " FILENAME = TRIM( INPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " ! Echo some input to the screen\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " WRITE( 6, '(a,/)' ) 'R E S T A R T F I L E I N P U T'\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( 'READ_CHECKPOINT_FILE: Reading ', a )\n" . "\n" . " ! Open the binary punch file for input\n" . " CALL OPEN_BPCH2_FOR_READ( IU_RST, FILENAME )\n" . " \n" . " ! Echo more output\n" . " WRITE( 6, 110 )\n" . " 110 FORMAT( /, 'Min and Max of each tracer, as read from the file:',\n" . " & /, '(in volume mixing ratio units: v/v)' )\n" . "\n" . " !=================================================================\n" . " ! Read concentrations -- store in the TRACER array\n" . " !=================================================================\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & MODELNAME, LONRES, LATRES, HALFPOLAR, CENTER180\n" . "\n" . " ! IOS > 0 is a real I/O error -- print error message\n" . " IF ( IOS > 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:4' )\n" . " \n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & CATEGORY, NTRACER, UNIT, ZTAU0, ZTAU1, RESERVED,\n" . " & NI, NJJ, NL, IFIRST, JFIRST, LFIRST,\n" . " & NSKIP\n" . " \n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:5')\n" . " \n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & ( ( ( TRACER(I,J,L), I=1,NI ), J=1,NJJ ), L=1,NL )\n" . " \n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:6')\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( JJLOOP )\n" . " DO JJLOOP = 1,NTT\n" . " I = IXSAVE(JJLOOP)\n" . " J = IYSAVE(JJLOOP)\n" . " L = IZSAVE(JJLOOP)\n" . " PART_CASE(JJLOOP) = TRACER(I,J,L) !* TCVV(N) / AD(I,J,L)\n" . " END DO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " !=================================================================\n" . " ! Examine data blocks, print totals, and return\n" . " !=================================================================\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST ) \n" . "\n" . " ! Print totals atmospheric mass for each tracer\n" . " WRITE( 6, 120 )\n" . " 120 FORMAT( /, 'Total atmospheric masses for each tracer: ' ) \n" . "\n" . " ! Fancy output\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### READ_CHECKPOINT_FILE: read file')\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE READ_PART_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_CHEMISTRY_CHKFILE_P2( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHEMISTRY_CHKFILE_P3 creates GEOS-CHEM restart files of tracers \n" . "! in binary punch file format. Used to checkpoint tracers for type2 information\n" . "! (Kumaresh, 01/24/08)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " REAL*4 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('CHEM_CHK_P2.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . " DO N = 1, N_TRACERS\n" . " \n" . " ! Store GEOS-CHEM tracers in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " TRACER(I,J,L) = STT(I,J,L,N) !* TCVV(N) / AD(I,J,L)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . " \n" . " CALL BPCH2( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . " ENDDO \n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_CHEMISTRY_CHKFILE_P2\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_CHEMISTRY_CHKFILE_P3( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHEMISTRY_CHKFILE_P3 creates GEOS-CHEM restart files of tracers \n" . "! in binary punch file format. Used to checkpoint tracers for type3 information\n" . "! (Kumaresh, 01/24/08)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " REAL*4 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('CHEM_CHK_P3.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . " DO N = 1, N_TRACERS\n" . " \n" . " ! store GEOS-CHEM tracer in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " TRACER(I,J,L) = STT(I,J,L,N) !* TCVV(N) / AD(I,J,L)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . " \n" . " CALL BPCH2( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . " ENDDO \n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_CHEMISTRY_CHKFILE_P3\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_PRESSURE_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHECKPOINT_FILE creates GEOS-CHEM restart files of tracer \n" . "! mixing ratios (v/v), in binary punch file format. (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (2 ) Reference F90 module \"bpch2_mod.f\" which contains routines BPCH2_HDR, \n" . "! BPCH2, and GET_MODELNAME for writing data to binary punch files. \n" . "! (bmy, 6/22/00)\n" . "! (3 ) Now do not write more than NTRACE data blocks to disk. \n" . "! Also updated comments. (bmy, 7/17/00)\n" . "! (4 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (5 ) Added to \"restart_mod.f\". Also now save the entire grid to the\n" . "! restart file. (bmy, 6/24/02)\n" . "! (6 ) Bug fix: Remove duplicate definition of MM. This causes compile-time\n" . "! problems on the ALPHA platform. (gcc, bmy, 11/6/02)\n" . "! (7 ) Now references functions GET_OFFSET, GET_YOFFSET from \"grid_mod.f\".\n" . "! Now references function GET_TAU from \"time_mod.f\". Now added a call \n" . "! to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (8 ) Cosmetic changes (bmy, 4/29/03)\n" . "! (9 ) Now reference STT, N_TRACERS, TCVV from \"tracer_mod.f\". Also now\n" . "! remove hardwired output restart filename. Now references LPRT\n" . "! from \"logical_mod.f\". (bmy, 7/20/04)\n" . "! (10) Remove references to CMN_DIAG and TRCOFFSET. Now call GET_HALFPOLAR \n" . "! from \"bpch2_mod.f\" to get the HALFPOLAR flag value for GEOS or GCAP \n" . "! grids. (bmy, 6/28/05)\n" . "! (11) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (12) Add TAU to the argument list (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2_2D, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD, TMP_PRESS\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"comode.h\"\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " INTEGER :: JLOOP,JJ, KK\n" . " REAL*4 :: TRACER(IIPAR,JJPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('PRESS_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " !PRINT*,'ITLOOP, IGAS = ',ITLOOP,IGAS\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J )\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " ! Compute tracer concentration [molec/cm3/box] by\n" . " ! looping over all species belonging to this tracer\n" . " TRACER(I,J) = TMP_PRESS(I,J)\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " !-------------------------------------------\n" . " ! *****TESTING CHECKPOINTING*****\n" . " !-------------------------------------------\n" . "\n" . " CALL BPCH2_2D( IU_RST, IIPAR, JJPAR, TRACER )\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_PRESSURE_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE READ_PRESSURE_CHKFILE( YYYYMMDD, HHMMSS ) \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine READ_CHECKPOINT_FILE initializes GEOS-CHEM tracer concentrations \n" . "! from a restart file (binary punch file format) (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Day \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to read restart file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now check that N = NTRACER - TRCOFFSET is valid. \n" . "! Also reorganize some print statements (bmy, 10/25/99)\n" . "! (2 ) Now pass LFORCE, LSPLIT via CMN_SETUP. (bmy, 11/4/99)\n" . "! (3 ) Cosmetic changes, added comments (bmy, 3/17/00)\n" . "! (4 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (5 ) Broke up sections of code into internal subroutines. Also updated\n" . "! comments & cleaned up a few things. (bmy, 7/17/00)\n" . "! (6 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (7 ) Print max & min of tracer regardless of the units (bmy, 10/5/00)\n" . "! (8 ) Removed obsolete code from 10/00 (bmy, 12/21/00)\n" . "! (9 ) Removed obsolete commented out code (bmy, 4/23/01)\n" . "! (10) Added updates from amf for tagged Ox run. Also updated comments\n" . "! and made some cosmetic changes (bmy, 7/3/01)\n" . "! (11) Bug fix: if starting from multiox restart file, then NTRACER \n" . "! will be greater than 40 but less than 60. Adjust COPY_STT_FOR_OX\n" . "! accordingly. (amf, bmy, 9/6/01)\n" . "! (12) Now reference TRANUC from \"charpak_mod.f\" (bmy, 11/15/01)\n" . "! (13) Updated comments (bmy, 1/25/02)\n" . "! (14) Now reference AD from \"dao_mod.f\" (bmy, 9/18/02)\n" . "! (15) Now added a call to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (16) Remove call to COPY_STT_FOR_OX, it's obsolete. (bmy, 8/18/03)\n" . "! (17) Add fancy output string (bmy, 4/26/04)\n" . "! (18) No longer use hardwired filename. Also now reference \"logical_mod.f\"\n" . "! and \"tracer_mod.f\" (bmy, 7/20/04)\n" . "! (19) Remove code for obsolete CO-OH simulation. Also remove references\n" . "! to CMN_DIAG and TRCOFFSET. Change tracer name format string to A10.\n" . "! (bmy, 6/24/05)\n" . "! (20) Updated comments (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ\n" . " USE DAO_MOD, ONLY : AD, TMP_PRESS\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE LOGICAL_MOD, ONLY : LSPLIT, LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT\n" . " USE TRACER_MOD, ONLY : TRACER_NAME, TRACER_MW_G\n" . " USE COMODE_MOD, ONLY : JLOP\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"comode.h\"\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . "\n" . " ! Local Variables\n" . " INTEGER :: I, IOS, J, L, N\n" . " INTEGER :: NCOUNT(NNPAR) \n" . " REAL*4 :: TRACER(IIPAR,JJPAR)\n" . " REAL*8 :: SUMTC\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " INTEGER :: NI, NJ, NL\n" . " INTEGER :: IFIRST, JFIRST, LFIRST\n" . " INTEGER :: NTRACER, NSKIP\n" . " INTEGER :: HALFPOLAR, CENTER180\n" . " REAL*4 :: LONRES, LATRES\n" . " REAL*8 :: ZTAU0, ZTAU1\n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED\n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . "\n" . " !=================================================================\n" . " ! READ_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " ! Initialize some variables\n" . " NCOUNT(:) = 0\n" . " TRACER(:,:) = 0e0\n" . "\n" . " !=================================================================\n" . " ! Open restart file and read top-of-file header\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " INPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('PRESS_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Copy input file name to a local variable\n" . " FILENAME = TRIM( INPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " ! Echo some input to the screen\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " WRITE( 6, '(a,/)' ) 'R E S T A R T F I L E I N P U T'\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( 'READ_CHECKPOINT_FILE: Reading ', a )\n" . "\n" . " ! Open the binary punch file for input\n" . " CALL OPEN_BPCH2_FOR_READ( IU_RST, FILENAME )\n" . " \n" . " ! Echo more output\n" . " WRITE( 6, 110 )\n" . " 110 FORMAT( /, 'Min and Max of each tracer, as read from the file:',\n" . " & /, '(in volume mixing ratio units: v/v)' )\n" . "\n" . " !=================================================================\n" . " ! Read concentrations -- store in the TRACER array\n" . " !=================================================================\n" . "\n" . " READ( IU_RST, IOSTAT=IOS )\n" . " & NI, NJ\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:5')\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & ( ( TRACER(I,J), I=1,IIPAR ), J=1,JJPAR )\n" . "\n" . " !-------------------------------------------\n" . " ! *****TESTING CHECKPOINTING*****\n" . " !-------------------------------------------\n" . " !PRINT*,'TRACER(2,2,2)=',TRACER(2,2,2)\n" . " \n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:6')\n" . "\n" . " !==============================================================\n" . " ! Assign data from the TRACER array to the STT array.\n" . " !==============================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J )\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " ! Compute tracer concentration [molec/cm3/box] by\n" . " ! looping over all species belonging to this tracer\n" . " TMP_PRESS(I,J) = TRACER(I,J)\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO \n" . "\n" . " !=================================================================\n" . " ! Examine data blocks, print totals, and return\n" . " !=================================================================\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST ) \n" . "\n" . " ! Print totals atmospheric mass for each tracer\n" . " WRITE( 6, 120 )\n" . " 120 FORMAT( /, 'Total atmospheric masses for each tracer: ' ) \n" . "\n" . " ! Fancy output\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### READ_CHECKPOINT_FILE: read file')\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE READ_PRESSURE_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_FPBL_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHECKPOINT_FILE creates GEOS-CHEM restart files of tracer \n" . "! mixing ratios (v/v), in binary punch file format. (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (2 ) Reference F90 module \"bpch2_mod.f\" which contains routines BPCH2_HDR, \n" . "! BPCH2, and GET_MODELNAME for writing data to binary punch files. \n" . "! (bmy, 6/22/00)\n" . "! (3 ) Now do not write more than NTRACE data blocks to disk. \n" . "! Also updated comments. (bmy, 7/17/00)\n" . "! (4 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (5 ) Added to \"restart_mod.f\". Also now save the entire grid to the\n" . "! restart file. (bmy, 6/24/02)\n" . "! (6 ) Bug fix: Remove duplicate definition of MM. This causes compile-time\n" . "! problems on the ALPHA platform. (gcc, bmy, 11/6/02)\n" . "! (7 ) Now references functions GET_OFFSET, GET_YOFFSET from \"grid_mod.f\".\n" . "! Now references function GET_TAU from \"time_mod.f\". Now added a call \n" . "! to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (8 ) Cosmetic changes (bmy, 4/29/03)\n" . "! (9 ) Now reference STT, N_TRACERS, TCVV from \"tracer_mod.f\". Also now\n" . "! remove hardwired output restart filename. Now references LPRT\n" . "! from \"logical_mod.f\". (bmy, 7/20/04)\n" . "! (10) Remove references to CMN_DIAG and TRCOFFSET. Now call GET_HALFPOLAR \n" . "! from \"bpch2_mod.f\" to get the HALFPOLAR flag value for GEOS or GCAP \n" . "! grids. (bmy, 6/28/05)\n" . "! (11) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (12) Add TAU to the argument list (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2_CSP, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD, TMP_PRESS\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV, FP\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"comode.h\"\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " INTEGER :: JLOOP,JJ, KK\n" . " REAL*8 :: TRACER(IIPAR,JJPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('FPBL_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " !PRINT*,'ITLOOP, IGAS = ',ITLOOP,IGAS\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J )\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " ! Compute tracer concentration [molec/cm3/box] by\n" . " ! looping over all species belonging to this tracer\n" . " TRACER(I,J) = FP(I,J)\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " !-------------------------------------------\n" . " ! *****TESTING CHECKPOINTING*****\n" . " !-------------------------------------------\n" . "\n" . " CALL BPCH2_CSP( IU_RST, IIPAR, JJPAR, TRACER )\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_FPBL_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE READ_FPBL_CHKFILE( YYYYMMDD, HHMMSS ) \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine READ_CHECKPOINT_FILE initializes GEOS-CHEM tracer concentrations \n" . "! from a restart file (binary punch file format) (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Day \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to read restart file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now check that N = NTRACER - TRCOFFSET is valid. \n" . "! Also reorganize some print statements (bmy, 10/25/99)\n" . "! (2 ) Now pass LFORCE, LSPLIT via CMN_SETUP. (bmy, 11/4/99)\n" . "! (3 ) Cosmetic changes, added comments (bmy, 3/17/00)\n" . "! (4 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (5 ) Broke up sections of code into internal subroutines. Also updated\n" . "! comments & cleaned up a few things. (bmy, 7/17/00)\n" . "! (6 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (7 ) Print max & min of tracer regardless of the units (bmy, 10/5/00)\n" . "! (8 ) Removed obsolete code from 10/00 (bmy, 12/21/00)\n" . "! (9 ) Removed obsolete commented out code (bmy, 4/23/01)\n" . "! (10) Added updates from amf for tagged Ox run. Also updated comments\n" . "! and made some cosmetic changes (bmy, 7/3/01)\n" . "! (11) Bug fix: if starting from multiox restart file, then NTRACER \n" . "! will be greater than 40 but less than 60. Adjust COPY_STT_FOR_OX\n" . "! accordingly. (amf, bmy, 9/6/01)\n" . "! (12) Now reference TRANUC from \"charpak_mod.f\" (bmy, 11/15/01)\n" . "! (13) Updated comments (bmy, 1/25/02)\n" . "! (14) Now reference AD from \"dao_mod.f\" (bmy, 9/18/02)\n" . "! (15) Now added a call to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (16) Remove call to COPY_STT_FOR_OX, it's obsolete. (bmy, 8/18/03)\n" . "! (17) Add fancy output string (bmy, 4/26/04)\n" . "! (18) No longer use hardwired filename. Also now reference \"logical_mod.f\"\n" . "! and \"tracer_mod.f\" (bmy, 7/20/04)\n" . "! (19) Remove code for obsolete CO-OH simulation. Also remove references\n" . "! to CMN_DIAG and TRCOFFSET. Change tracer name format string to A10.\n" . "! (bmy, 6/24/05)\n" . "! (20) Updated comments (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ\n" . " USE DAO_MOD, ONLY : AD, TMP_PRESS\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE LOGICAL_MOD, ONLY : LSPLIT, LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : N_TRACERS\n" . " USE TRACER_MOD, ONLY : TRACER_NAME, TRACER_MW_G, FP\n" . " USE COMODE_MOD, ONLY : JLOP\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"comode.h\"\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . "\n" . " ! Local Variables\n" . " INTEGER :: I, IOS, J, L, N\n" . " INTEGER :: NCOUNT(NNPAR) \n" . " REAL*8 :: TRACER(IIPAR,JJPAR)\n" . " REAL*8 :: SUMTC\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " INTEGER :: NI, NJ, NL\n" . " INTEGER :: IFIRST, JFIRST, LFIRST\n" . " INTEGER :: NTRACER, NSKIP\n" . " INTEGER :: HALFPOLAR, CENTER180\n" . " REAL*4 :: LONRES, LATRES\n" . " REAL*8 :: ZTAU0, ZTAU1\n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED\n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . "\n" . " !=================================================================\n" . " ! READ_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " ! Initialize some variables\n" . " NCOUNT(:) = 0\n" . " TRACER(:,:) = 0e0\n" . "\n" . " !=================================================================\n" . " ! Open restart file and read top-of-file header\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " INPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('FPBL_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Copy input file name to a local variable\n" . " FILENAME = TRIM( INPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " ! Echo some input to the screen\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " WRITE( 6, '(a,/)' ) 'R E S T A R T F I L E I N P U T'\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( 'READ_CHECKPOINT_FILE: Reading ', a )\n" . "\n" . " ! Open the binary punch file for input\n" . " CALL OPEN_BPCH2_FOR_READ( IU_RST, FILENAME )\n" . " \n" . " ! Echo more output\n" . " WRITE( 6, 110 )\n" . " 110 FORMAT( /, 'Min and Max of each tracer, as read from the file:',\n" . " & /, '(in volume mixing ratio units: v/v)' )\n" . "\n" . " !=================================================================\n" . " ! Read concentrations -- store in the TRACER array\n" . " !=================================================================\n" . "\n" . " READ( IU_RST, IOSTAT=IOS )\n" . " & NI, NJ\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:5')\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & ( ( TRACER(I,J), I=1,IIPAR ), J=1,JJPAR )\n" . "\n" . " !-------------------------------------------\n" . " ! *****TESTING CHECKPOINTING*****\n" . " !-------------------------------------------\n" . " !PRINT*,'TRACER(2,2,2)=',TRACER(2,2,2)\n" . " \n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:6')\n" . "\n" . " !==============================================================\n" . " ! Assign data from the TRACER array to the STT array.\n" . " !==============================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J )\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " ! Compute tracer concentration [molec/cm3/box] by\n" . " ! looping over all species belonging to this tracer\n" . " FP(I,J) = TRACER(I,J)\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO \n" . "\n" . " !=================================================================\n" . " ! Examine data blocks, print totals, and return\n" . " !=================================================================\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST ) \n" . "\n" . " ! Print totals atmospheric mass for each tracer\n" . " WRITE( 6, 120 )\n" . " 120 FORMAT( /, 'Total atmospheric masses for each tracer: ' ) \n" . "\n" . " ! Fancy output\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### READ_CHECKPOINT_FILE: read file')\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE READ_FPBL_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_IMIX_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHECKPOINT_FILE creates GEOS-CHEM restart files of tracer \n" . "! mixing ratios (v/v), in binary punch file format. (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (2 ) Reference F90 module \"bpch2_mod.f\" which contains routines BPCH2_HDR, \n" . "! BPCH2, and GET_MODELNAME for writing data to binary punch files. \n" . "! (bmy, 6/22/00)\n" . "! (3 ) Now do not write more than NTRACE data blocks to disk. \n" . "! Also updated comments. (bmy, 7/17/00)\n" . "! (4 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (5 ) Added to \"restart_mod.f\". Also now save the entire grid to the\n" . "! restart file. (bmy, 6/24/02)\n" . "! (6 ) Bug fix: Remove duplicate definition of MM. This causes compile-time\n" . "! problems on the ALPHA platform. (gcc, bmy, 11/6/02)\n" . "! (7 ) Now references functions GET_OFFSET, GET_YOFFSET from \"grid_mod.f\".\n" . "! Now references function GET_TAU from \"time_mod.f\". Now added a call \n" . "! to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (8 ) Cosmetic changes (bmy, 4/29/03)\n" . "! (9 ) Now reference STT, N_TRACERS, TCVV from \"tracer_mod.f\". Also now\n" . "! remove hardwired output restart filename. Now references LPRT\n" . "! from \"logical_mod.f\". (bmy, 7/20/04)\n" . "! (10) Remove references to CMN_DIAG and TRCOFFSET. Now call GET_HALFPOLAR \n" . "! from \"bpch2_mod.f\" to get the HALFPOLAR flag value for GEOS or GCAP \n" . "! grids. (bmy, 6/28/05)\n" . "! (11) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (12) Add TAU to the argument list (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2_INT, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD, TMP_PRESS\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV, IM\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"comode.h\"\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " INTEGER :: JLOOP,JJ, KK\n" . " INTEGER :: TRACER(IIPAR,JJPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('IMIX_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " !PRINT*,'ITLOOP, IGAS = ',ITLOOP,IGAS\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J )\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " ! Compute tracer concentration [molec/cm3/box] by\n" . " ! looping over all species belonging to this tracer\n" . " TRACER(I,J) = IM(I,J)\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " !-------------------------------------------\n" . " ! *****TESTING CHECKPOINTING*****\n" . " !-------------------------------------------\n" . "\n" . " CALL BPCH2_INT( IU_RST, IIPAR, JJPAR, TRACER )\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_IMIX_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE READ_IMIX_CHKFILE( YYYYMMDD, HHMMSS ) \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine READ_CHECKPOINT_FILE initializes GEOS-CHEM tracer concentrations \n" . "! from a restart file (binary punch file format) (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Day \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to read restart file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now check that N = NTRACER - TRCOFFSET is valid. \n" . "! Also reorganize some print statements (bmy, 10/25/99)\n" . "! (2 ) Now pass LFORCE, LSPLIT via CMN_SETUP. (bmy, 11/4/99)\n" . "! (3 ) Cosmetic changes, added comments (bmy, 3/17/00)\n" . "! (4 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (5 ) Broke up sections of code into internal subroutines. Also updated\n" . "! comments & cleaned up a few things. (bmy, 7/17/00)\n" . "! (6 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (7 ) Print max & min of tracer regardless of the units (bmy, 10/5/00)\n" . "! (8 ) Removed obsolete code from 10/00 (bmy, 12/21/00)\n" . "! (9 ) Removed obsolete commented out code (bmy, 4/23/01)\n" . "! (10) Added updates from amf for tagged Ox run. Also updated comments\n" . "! and made some cosmetic changes (bmy, 7/3/01)\n" . "! (11) Bug fix: if starting from multiox restart file, then NTRACER \n" . "! will be greater than 40 but less than 60. Adjust COPY_STT_FOR_OX\n" . "! accordingly. (amf, bmy, 9/6/01)\n" . "! (12) Now reference TRANUC from \"charpak_mod.f\" (bmy, 11/15/01)\n" . "! (13) Updated comments (bmy, 1/25/02)\n" . "! (14) Now reference AD from \"dao_mod.f\" (bmy, 9/18/02)\n" . "! (15) Now added a call to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (16) Remove call to COPY_STT_FOR_OX, it's obsolete. (bmy, 8/18/03)\n" . "! (17) Add fancy output string (bmy, 4/26/04)\n" . "! (18) No longer use hardwired filename. Also now reference \"logical_mod.f\"\n" . "! and \"tracer_mod.f\" (bmy, 7/20/04)\n" . "! (19) Remove code for obsolete CO-OH simulation. Also remove references\n" . "! to CMN_DIAG and TRCOFFSET. Change tracer name format string to A10.\n" . "! (bmy, 6/24/05)\n" . "! (20) Updated comments (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ\n" . " USE DAO_MOD, ONLY : AD, TMP_PRESS\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE LOGICAL_MOD, ONLY : LSPLIT, LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : N_TRACERS\n" . " USE TRACER_MOD, ONLY : TRACER_NAME, TRACER_MW_G, IM\n" . " USE COMODE_MOD, ONLY : JLOP\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"comode.h\"\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . "\n" . " ! Local Variables\n" . " INTEGER :: I, IOS, J, L, N\n" . " INTEGER :: NCOUNT(NNPAR) \n" . " INTEGER :: TRACER(IIPAR,JJPAR)\n" . " REAL*8 :: SUMTC\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " INTEGER :: NI, NJ, NL\n" . " INTEGER :: IFIRST, JFIRST, LFIRST\n" . " INTEGER :: NTRACER, NSKIP\n" . " INTEGER :: HALFPOLAR, CENTER180\n" . " REAL*4 :: LONRES, LATRES\n" . " REAL*8 :: ZTAU0, ZTAU1\n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED\n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . "\n" . " !=================================================================\n" . " ! READ_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " ! Initialize some variables\n" . " NCOUNT(:) = 0\n" . " TRACER(:,:) = 0\n" . "\n" . " !=================================================================\n" . " ! Open restart file and read top-of-file header\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " INPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('IMIX_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Copy input file name to a local variable\n" . " FILENAME = TRIM( INPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " ! Echo some input to the screen\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " WRITE( 6, '(a,/)' ) 'R E S T A R T F I L E I N P U T'\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( 'READ_CHECKPOINT_FILE: Reading ', a )\n" . "\n" . " ! Open the binary punch file for input\n" . " CALL OPEN_BPCH2_FOR_READ( IU_RST, FILENAME )\n" . " \n" . " ! Echo more output\n" . " WRITE( 6, 110 )\n" . " 110 FORMAT( /, 'Min and Max of each tracer, as read from the file:',\n" . " & /, '(in volume mixing ratio units: v/v)' )\n" . "\n" . " !=================================================================\n" . " ! Read concentrations -- store in the TRACER array\n" . " !=================================================================\n" . "\n" . " READ( IU_RST, IOSTAT=IOS )\n" . " & NI, NJ\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:5')\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & ( ( TRACER(I,J), I=1,IIPAR ), J=1,JJPAR )\n" . "\n" . " !-------------------------------------------\n" . " ! *****TESTING CHECKPOINTING*****\n" . " !-------------------------------------------\n" . " !PRINT*,'TRACER(2,2,2)=',TRACER(2,2,2)\n" . " \n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:6')\n" . "\n" . " !==============================================================\n" . " ! Assign data from the TRACER array to the STT array.\n" . " !==============================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J )\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " ! Compute tracer concentration [molec/cm3/box] by\n" . " ! looping over all species belonging to this tracer\n" . " IM(I,J) = TRACER(I,J)\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO \n" . "\n" . " !=================================================================\n" . " ! Examine data blocks, print totals, and return\n" . " !=================================================================\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST ) \n" . "\n" . " ! Print totals atmospheric mass for each tracer\n" . " WRITE( 6, 120 )\n" . " 120 FORMAT( /, 'Total atmospheric masses for each tracer: ' ) \n" . "\n" . " ! Fancy output\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### READ_CHECKPOINT_FILE: read file')\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE READ_IMIX_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_EMISRATE_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHECKPOINT_FILE creates GEOS-CHEM restart files of tracer \n" . "! mixing ratios (v/v), in binary punch file format. (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (2 ) Reference F90 module \"bpch2_mod.f\" which contains routines BPCH2_HDR, \n" . "! BPCH2, and GET_MODELNAME for writing data to binary punch files. \n" . "! (bmy, 6/22/00)\n" . "! (3 ) Now do not write more than NTRACE data blocks to disk. \n" . "! Also updated comments. (bmy, 7/17/00)\n" . "! (4 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (5 ) Added to \"restart_mod.f\". Also now save the entire grid to the\n" . "! restart file. (bmy, 6/24/02)\n" . "! (6 ) Bug fix: Remove duplicate definition of MM. This causes compile-time\n" . "! problems on the ALPHA platform. (gcc, bmy, 11/6/02)\n" . "! (7 ) Now references functions GET_OFFSET, GET_YOFFSET from \"grid_mod.f\".\n" . "! Now references function GET_TAU from \"time_mod.f\". Now added a call \n" . "! to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (8 ) Cosmetic changes (bmy, 4/29/03)\n" . "! (9 ) Now reference STT, N_TRACERS, TCVV from \"tracer_mod.f\". Also now\n" . "! remove hardwired output restart filename. Now references LPRT\n" . "! from \"logical_mod.f\". (bmy, 7/20/04)\n" . "! (10) Remove references to CMN_DIAG and TRCOFFSET. Now call GET_HALFPOLAR \n" . "! from \"bpch2_mod.f\" to get the HALFPOLAR flag value for GEOS or GCAP \n" . "! grids. (bmy, 6/28/05)\n" . "! (11) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (12) Add TAU to the argument list (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2_CSP, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . " USE COMODE_MOD, ONLY : EMIS_RATE\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"comode.h\"\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " INTEGER :: JLOOP,JJ, KK\n" . " INTEGER, PARAMETER :: IND = 40\n" . " REAL*8 :: TRACER(ITLOOP,IND)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('EMISRATE_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " !PRINT*,'ITLOOP, IGAS = ',ITLOOP,IGAS\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_EMISRATE_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J )\n" . " DO J = 1, IND\n" . " DO I = 1, ITLOOP\n" . " ! Compute tracer concentration [molec/cm3/box] by\n" . " ! looping over all species belonging to this tracer\n" . " TRACER(I,J) = EMIS_RATE(I,J)\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " !-------------------------------------------\n" . " ! *****TESTING CHECKPOINTING*****\n" . " !-------------------------------------------\n" . "\n" . " CALL BPCH2_CSP( IU_RST, ITLOOP, IND, TRACER )\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_EMISRATE_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_EMISRATE_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE READ_EMISRATE_CHKFILE( YYYYMMDD, HHMMSS ) \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine READ_CHECKPOINT_FILE initializes GEOS-CHEM tracer concentrations \n" . "! from a restart file (binary punch file format) (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Day \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to read restart file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now check that N = NTRACER - TRCOFFSET is valid. \n" . "! Also reorganize some print statements (bmy, 10/25/99)\n" . "! (2 ) Now pass LFORCE, LSPLIT via CMN_SETUP. (bmy, 11/4/99)\n" . "! (3 ) Cosmetic changes, added comments (bmy, 3/17/00)\n" . "! (4 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (5 ) Broke up sections of code into internal subroutines. Also updated\n" . "! comments & cleaned up a few things. (bmy, 7/17/00)\n" . "! (6 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (7 ) Print max & min of tracer regardless of the units (bmy, 10/5/00)\n" . "! (8 ) Removed obsolete code from 10/00 (bmy, 12/21/00)\n" . "! (9 ) Removed obsolete commented out code (bmy, 4/23/01)\n" . "! (10) Added updates from amf for tagged Ox run. Also updated comments\n" . "! and made some cosmetic changes (bmy, 7/3/01)\n" . "! (11) Bug fix: if starting from multiox restart file, then NTRACER \n" . "! will be greater than 40 but less than 60. Adjust COPY_STT_FOR_OX\n" . "! accordingly. (amf, bmy, 9/6/01)\n" . "! (12) Now reference TRANUC from \"charpak_mod.f\" (bmy, 11/15/01)\n" . "! (13) Updated comments (bmy, 1/25/02)\n" . "! (14) Now reference AD from \"dao_mod.f\" (bmy, 9/18/02)\n" . "! (15) Now added a call to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (16) Remove call to COPY_STT_FOR_OX, it's obsolete. (bmy, 8/18/03)\n" . "! (17) Add fancy output string (bmy, 4/26/04)\n" . "! (18) No longer use hardwired filename. Also now reference \"logical_mod.f\"\n" . "! and \"tracer_mod.f\" (bmy, 7/20/04)\n" . "! (19) Remove code for obsolete CO-OH simulation. Also remove references\n" . "! to CMN_DIAG and TRCOFFSET. Change tracer name format string to A10.\n" . "! (bmy, 6/24/05)\n" . "! (20) Updated comments (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE LOGICAL_MOD, ONLY : LSPLIT, LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT\n" . " USE TRACER_MOD, ONLY : TRACER_NAME, TRACER_MW_G\n" . " USE COMODE_MOD, ONLY : EMIS_RATE, JLOP\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"comode.h\"\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . "\n" . " ! Local Variables\n" . " INTEGER :: I, IOS, J, L, N\n" . " INTEGER :: NCOUNT(NNPAR) \n" . " INTEGER, PARAMETER :: IND = 40\n" . " REAL*8 :: TRACER(ITLOOP,IND)\n" . " REAL*8 :: SUMTC\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " INTEGER :: NI, NJ, NL\n" . " INTEGER :: IFIRST, JFIRST, LFIRST\n" . " INTEGER :: NTRACER, NSKIP\n" . " INTEGER :: HALFPOLAR, CENTER180\n" . " REAL*4 :: LONRES, LATRES\n" . " REAL*8 :: ZTAU0, ZTAU1\n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED\n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . "\n" . " !=================================================================\n" . " ! READ_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " ! Initialize some variables\n" . " NCOUNT(:) = 0\n" . " TRACER(:,:) = 0e0\n" . "\n" . " !=================================================================\n" . " ! Open restart file and read top-of-file header\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " INPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('EMISRATE_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Copy input file name to a local variable\n" . " FILENAME = TRIM( INPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " ! Echo some input to the screen\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " WRITE( 6, '(a,/)' ) 'R E S T A R T F I L E I N P U T'\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( 'READ_EMISRATE_FILE: Reading ', a )\n" . "\n" . " ! Open the binary punch file for input\n" . " CALL OPEN_BPCH2_FOR_READ( IU_RST, FILENAME )\n" . " \n" . " ! Echo more output\n" . " WRITE( 6, 110 )\n" . " 110 FORMAT( /, 'Min and Max of each tracer, as read from the file:',\n" . " & /, '(in volume mixing ratio units: v/v)' )\n" . "\n" . " !=================================================================\n" . " ! Read concentrations -- store in the TRACER array\n" . " !=================================================================\n" . "\n" . " READ( IU_RST, IOSTAT=IOS )\n" . " & NI, NJ\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:5')\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & ( ( TRACER(I,J), I=1,ITLOOP ), J=1,IND )\n" . "\n" . " !-------------------------------------------\n" . " ! *****TESTING CHECKPOINTING*****\n" . " !-------------------------------------------\n" . " !PRINT*,'TRACER(2,2,2)=',TRACER(2,2,2)\n" . " \n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:6')\n" . "\n" . " !==============================================================\n" . " ! Assign data from the TRACER array to the STT array.\n" . " !==============================================================\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J )\n" . " DO J = 1, IND\n" . " DO I = 1, ITLOOP\n" . " ! Compute tracer concentration [molec/cm3/box] by\n" . " ! looping over all species belonging to this tracer\n" . " EMIS_RATE(I,J) = TRACER(I,J)\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO \n" . "\n" . " !=================================================================\n" . " ! Examine data blocks, print totals, and return\n" . " !=================================================================\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST ) \n" . "\n" . " ! Print totals atmospheric mass for each tracer\n" . " WRITE( 6, 120 )\n" . " 120 FORMAT( /, 'Total atmospheric masses for each tracer: ' ) \n" . "\n" . " ! Fancy output\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### READ_EMISRATE_FILE: read file')\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE READ_EMISRATE_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_F_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHECKPOINT_FILE creates GEOS-CHEM restart files of tracer \n" . "! mixing ratios (v/v), in binary punch file format. (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (2 ) Reference F90 module \"bpch2_mod.f\" which contains routines BPCH2_HDR, \n" . "! BPCH2, and GET_MODELNAME for writing data to binary punch files. \n" . "! (bmy, 6/22/00)\n" . "! (3 ) Now do not write more than NTRACE data blocks to disk. \n" . "! Also updated comments. (bmy, 7/17/00)\n" . "! (4 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (5 ) Added to \"restart_mod.f\". Also now save the entire grid to the\n" . "! restart file. (bmy, 6/24/02)\n" . "! (6 ) Bug fix: Remove duplicate definition of MM. This causes compile-time\n" . "! problems on the ALPHA platform. (gcc, bmy, 11/6/02)\n" . "! (7 ) Now references functions GET_OFFSET, GET_YOFFSET from \"grid_mod.f\".\n" . "! Now references function GET_TAU from \"time_mod.f\". Now added a call \n" . "! to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (8 ) Cosmetic changes (bmy, 4/29/03)\n" . "! (9 ) Now reference STT, N_TRACERS, TCVV from \"tracer_mod.f\". Also now\n" . "! remove hardwired output restart filename. Now references LPRT\n" . "! from \"logical_mod.f\". (bmy, 7/20/04)\n" . "! (10) Remove references to CMN_DIAG and TRCOFFSET. Now call GET_HALFPOLAR \n" . "! from \"bpch2_mod.f\" to get the HALFPOLAR flag value for GEOS or GCAP \n" . "! grids. (bmy, 6/28/05)\n" . "! (11) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (12) Add TAU to the argument list (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2_CHK, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : F, N_TRACERS, TCVV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " REAL*8 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " REAL*8, PARAMETER :: SMALLNUM = 1d-12\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('F_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . " DO N = 1, N_TRACERS\n" . " \n" . " ! Convert from [kg] to [v/v] and store in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " TRACER(I,J,L) = F(I,J,L,N) !* TCVV(N) / AD(I,J,L)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . " \n" . " ! Convert STT from [kg] to [v/v] mixing ratio \n" . " ! and store in temporary variable TRACER\n" . " CALL BPCH2_CHK( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . " ENDDO \n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_F_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE READ_F_CHKFILE( YYYYMMDD, HHMMSS ) \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine READ_CHECKPOINT_FILE initializes GEOS-CHEM tracer concentrations \n" . "! from a restart file (binary punch file format) (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Day \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to read restart file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now check that N = NTRACER - TRCOFFSET is valid. \n" . "! Also reorganize some print statements (bmy, 10/25/99)\n" . "! (2 ) Now pass LFORCE, LSPLIT via CMN_SETUP. (bmy, 11/4/99)\n" . "! (3 ) Cosmetic changes, added comments (bmy, 3/17/00)\n" . "! (4 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (5 ) Broke up sections of code into internal subroutines. Also updated\n" . "! comments & cleaned up a few things. (bmy, 7/17/00)\n" . "! (6 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (7 ) Print max & min of tracer regardless of the units (bmy, 10/5/00)\n" . "! (8 ) Removed obsolete code from 10/00 (bmy, 12/21/00)\n" . "! (9 ) Removed obsolete commented out code (bmy, 4/23/01)\n" . "! (10) Added updates from amf for tagged Ox run. Also updated comments\n" . "! and made some cosmetic changes (bmy, 7/3/01)\n" . "! (11) Bug fix: if starting from multiox restart file, then NTRACER \n" . "! will be greater than 40 but less than 60. Adjust COPY_STT_FOR_OX\n" . "! accordingly. (amf, bmy, 9/6/01)\n" . "! (12) Now reference TRANUC from \"charpak_mod.f\" (bmy, 11/15/01)\n" . "! (13) Updated comments (bmy, 1/25/02)\n" . "! (14) Now reference AD from \"dao_mod.f\" (bmy, 9/18/02)\n" . "! (15) Now added a call to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (16) Remove call to COPY_STT_FOR_OX, it's obsolete. (bmy, 8/18/03)\n" . "! (17) Add fancy output string (bmy, 4/26/04)\n" . "! (18) No longer use hardwired filename. Also now reference \"logical_mod.f\"\n" . "! and \"tracer_mod.f\" (bmy, 7/20/04)\n" . "! (19) Remove code for obsolete CO-OH simulation. Also remove references\n" . "! to CMN_DIAG and TRCOFFSET. Change tracer name format string to A10.\n" . "! (bmy, 6/24/05)\n" . "! (20) Updated comments (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE LOGICAL_MOD, ONLY : LSPLIT, LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : N_TRACERS, F\n" . " USE TRACER_MOD, ONLY : TRACER_NAME, TRACER_MW_G\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . "\n" . " ! Local Variables\n" . " INTEGER :: I, IOS, J, L, N\n" . " INTEGER :: NCOUNT(NNPAR) \n" . " REAL*8 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: SUMTC\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " INTEGER :: NI, NJ, NL\n" . " INTEGER :: IFIRST, JFIRST, LFIRST\n" . " INTEGER :: NTRACER, NSKIP\n" . " INTEGER :: HALFPOLAR, CENTER180\n" . " REAL*4 :: LONRES, LATRES\n" . " REAL*8 :: ZTAU0, ZTAU1\n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED\n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . "\n" . " !=================================================================\n" . " ! READ_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " ! Initialize some variables\n" . " NCOUNT(:) = 0\n" . " TRACER(:,:,:) = 0e0\n" . "\n" . " !=================================================================\n" . " ! Open restart file and read top-of-file header\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " INPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('F_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Copy input file name to a local variable\n" . " FILENAME = TRIM( INPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " ! Echo some input to the screen\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " WRITE( 6, '(a,/)' ) 'R E S T A R T F I L E I N P U T'\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( 'READ_CHECKPOINT_FILE: Reading ', a )\n" . "\n" . " ! Open the binary punch file for input\n" . " CALL OPEN_BPCH2_FOR_READ( IU_RST, FILENAME )\n" . " \n" . " ! Echo more output\n" . " WRITE( 6, 110 )\n" . " 110 FORMAT( /, 'Min and Max of each tracer, as read from the file:',\n" . " & /, '(in volume mixing ratio units: v/v)' )\n" . "\n" . " !=================================================================\n" . " ! Read concentrations -- store in the TRACER array\n" . " !=================================================================\n" . " DO \n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & MODELNAME, LONRES, LATRES, HALFPOLAR, CENTER180\n" . "\n" . " ! IOS < 0 is end-of-file, so exit\n" . " IF ( IOS < 0 ) EXIT\n" . "\n" . " ! IOS > 0 is a real I/O error -- print error message\n" . " IF ( IOS > 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:4' )\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & CATEGORY, NTRACER, UNIT, ZTAU0, ZTAU1, RESERVED,\n" . " & NI, NJ, NL, IFIRST, JFIRST, LFIRST,\n" . " & NSKIP\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:5')\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & ( ( ( TRACER(I,J,L), I=1,NI ), J=1,NJ ), L=1,NL )\n" . " \n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:6')\n" . "\n" . " !==============================================================\n" . " ! Assign data from the TRACER array to the STT array.\n" . " !==============================================================\n" . " \n" . " ! Only process concentration data (i.e. mixing ratio)\n" . " IF ( CATEGORY(1:8) == 'IJ-AVG-\$' ) THEN \n" . "\n" . " ! Convert TRACER from [v/v] to [kg] and copy into STT array\n" . " CALL COPY_F( NTRACER, TRACER, NCOUNT )\n" . "\n" . " ENDIF\n" . " ENDDO\n" . "\n" . " !=================================================================\n" . " ! Examine data blocks, print totals, and return\n" . " !=================================================================\n" . "\n" . " ! Check for missing or duplicate data blocks\n" . " CALL CHECK_DATA_BLOCKS( N_TRACERS, NCOUNT )\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST ) \n" . "\n" . " ! Print totals atmospheric mass for each tracer\n" . " WRITE( 6, 120 )\n" . " 120 FORMAT( /, 'Total atmospheric masses for each tracer: ' ) \n" . "\n" . " ! Fancy output\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### READ_CHECKPOINT_FILE: read file')\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE READ_F_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_EMISDEP_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHECKPOINT_FILE creates GEOS-CHEM restart files of tracer \n" . "! mixing ratios (v/v), in binary punch file format. (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (2 ) Reference F90 module \"bpch2_mod.f\" which contains routines BPCH2_HDR, \n" . "! BPCH2, and GET_MODELNAME for writing data to binary punch files. \n" . "! (bmy, 6/22/00)\n" . "! (3 ) Now do not write more than NTRACE data blocks to disk. \n" . "! Also updated comments. (bmy, 7/17/00)\n" . "! (4 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (5 ) Added to \"restart_mod.f\". Also now save the entire grid to the\n" . "! restart file. (bmy, 6/24/02)\n" . "! (6 ) Bug fix: Remove duplicate definition of MM. This causes compile-time\n" . "! problems on the ALPHA platform. (gcc, bmy, 11/6/02)\n" . "! (7 ) Now references functions GET_OFFSET, GET_YOFFSET from \"grid_mod.f\".\n" . "! Now references function GET_TAU from \"time_mod.f\". Now added a call \n" . "! to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (8 ) Cosmetic changes (bmy, 4/29/03)\n" . "! (9 ) Now reference STT, N_TRACERS, TCVV from \"tracer_mod.f\". Also now\n" . "! remove hardwired output restart filename. Now references LPRT\n" . "! from \"logical_mod.f\". (bmy, 7/20/04)\n" . "! (10) Remove references to CMN_DIAG and TRCOFFSET. Now call GET_HALFPOLAR \n" . "! from \"bpch2_mod.f\" to get the HALFPOLAR flag value for GEOS or GCAP \n" . "! grids. (bmy, 6/28/05)\n" . "! (11) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (12) Add TAU to the argument list (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " REAL*4 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " REAL*8, PARAMETER :: SMALLOX = 1d-6\n" . " REAL*8, PARAMETER :: SMALLNOX = 1d-8\n" . " REAL*8, PARAMETER :: SMALLCO = 1d-9\n" . " \n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('EMISDEP.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_ADJ_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . " DO N = 1, N_TRACERS\n" . " \n" . " ! Convert from [kg] to [v/v] and store in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " TRACER(I,J,L) = STT(I,J,L,N) !* TCVV(N) / AD(I,J,L)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " ! Convert STT from [kg] to [v/v] mixing ratio \n" . " ! and store in temporary variable TRACER\n" . " CALL BPCH2( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . " ENDDO \n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_EMISDEP_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_SRCEMIS_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHECKPOINT_FILE creates GEOS-CHEM restart files of tracer \n" . "! mixing ratios (v/v), in binary punch file format. (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (2 ) Reference F90 module \"bpch2_mod.f\" which contains routines BPCH2_HDR, \n" . "! BPCH2, and GET_MODELNAME for writing data to binary punch files. \n" . "! (bmy, 6/22/00)\n" . "! (3 ) Now do not write more than NTRACE data blocks to disk. \n" . "! Also updated comments. (bmy, 7/17/00)\n" . "! (4 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (5 ) Added to \"restart_mod.f\". Also now save the entire grid to the\n" . "! restart file. (bmy, 6/24/02)\n" . "! (6 ) Bug fix: Remove duplicate definition of MM. This causes compile-time\n" . "! problems on the ALPHA platform. (gcc, bmy, 11/6/02)\n" . "! (7 ) Now references functions GET_OFFSET, GET_YOFFSET from \"grid_mod.f\".\n" . "! Now references function GET_TAU from \"time_mod.f\". Now added a call \n" . "! to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (8 ) Cosmetic changes (bmy, 4/29/03)\n" . "! (9 ) Now reference STT, N_TRACERS, TCVV from \"tracer_mod.f\". Also now\n" . "! remove hardwired output restart filename. Now references LPRT\n" . "! from \"logical_mod.f\". (bmy, 7/20/04)\n" . "! (10) Remove references to CMN_DIAG and TRCOFFSET. Now call GET_HALFPOLAR \n" . "! from \"bpch2_mod.f\" to get the HALFPOLAR flag value for GEOS or GCAP \n" . "! grids. (bmy, 6/28/05)\n" . "! (11) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (12) Add TAU to the argument list (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " REAL*4 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " REAL*8, PARAMETER :: SMALLOX = 1d-6\n" . " REAL*8, PARAMETER :: SMALLNOX = 1d-8\n" . " REAL*8, PARAMETER :: SMALLCO = 1d-9\n" . " \n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('SRCEMIS.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_ADJ_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . " DO N = 1, N_TRACERS\n" . " \n" . " ! Convert from [kg] to [v/v] and store in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " TRACER(I,J,L) = STT(I,J,L,N) !* TCVV(N) / AD(I,J,L)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " ! Convert STT from [kg] to [v/v] mixing ratio \n" . " ! and store in temporary variable TRACER\n" . " CALL BPCH2( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . " ENDDO \n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_SRCEMIS_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_OBS_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHECKPOINT_FILE creates GEOS-CHEM restart files of tracer \n" . "! mixing ratios (v/v), in binary punch file format. (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (2 ) Reference F90 module \"bpch2_mod.f\" which contains routines BPCH2_HDR, \n" . "! BPCH2, and GET_MODELNAME for writing data to binary punch files. \n" . "! (bmy, 6/22/00)\n" . "! (3 ) Now do not write more than NTRACE data blocks to disk. \n" . "! Also updated comments. (bmy, 7/17/00)\n" . "! (4 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (5 ) Added to \"restart_mod.f\". Also now save the entire grid to the\n" . "! restart file. (bmy, 6/24/02)\n" . "! (6 ) Bug fix: Remove duplicate definition of MM. This causes compile-time\n" . "! problems on the ALPHA platform. (gcc, bmy, 11/6/02)\n" . "! (7 ) Now references functions GET_OFFSET, GET_YOFFSET from \"grid_mod.f\".\n" . "! Now references function GET_TAU from \"time_mod.f\". Now added a call \n" . "! to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (8 ) Cosmetic changes (bmy, 4/29/03)\n" . "! (9 ) Now reference STT, N_TRACERS, TCVV from \"tracer_mod.f\". Also now\n" . "! remove hardwired output restart filename. Now references LPRT\n" . "! from \"logical_mod.f\". (bmy, 7/20/04)\n" . "! (10) Remove references to CMN_DIAG and TRCOFFSET. Now call GET_HALFPOLAR \n" . "! from \"bpch2_mod.f\" to get the HALFPOLAR flag value for GEOS or GCAP \n" . "! grids. (bmy, 6/28/05)\n" . "! (11) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (12) Add TAU to the argument list (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2_CHK, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " REAL*8 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('OBS_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . " DO N = 1, N_TRACERS\n" . " \n" . " ! Convert from [kg] to [v/v] and store in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " TRACER(I,J,L) = STT(I,J,L,N) !* TCVV(N) / AD(I,J,L)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . " \n" . " ! Convert STT from [kg] to [v/v] mixing ratio \n" . " ! and store in temporary variable TRACER\n" . " CALL BPCH2_CHK( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . " ENDDO \n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_OBS_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE READ_OBS_CHKFILE( YYYYMMDD, HHMMSS ) \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine READ_CHECKPOINT_FILE initializes GEOS-CHEM tracer concentrations \n" . "! from a restart file (binary punch file format) (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Day \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to read restart file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now check that N = NTRACER - TRCOFFSET is valid. \n" . "! Also reorganize some print statements (bmy, 10/25/99)\n" . "! (2 ) Now pass LFORCE, LSPLIT via CMN_SETUP. (bmy, 11/4/99)\n" . "! (3 ) Cosmetic changes, added comments (bmy, 3/17/00)\n" . "! (4 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (5 ) Broke up sections of code into internal subroutines. Also updated\n" . "! comments & cleaned up a few things. (bmy, 7/17/00)\n" . "! (6 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (7 ) Print max & min of tracer regardless of the units (bmy, 10/5/00)\n" . "! (8 ) Removed obsolete code from 10/00 (bmy, 12/21/00)\n" . "! (9 ) Removed obsolete commented out code (bmy, 4/23/01)\n" . "! (10) Added updates from amf for tagged Ox run. Also updated comments\n" . "! and made some cosmetic changes (bmy, 7/3/01)\n" . "! (11) Bug fix: if starting from multiox restart file, then NTRACER \n" . "! will be greater than 40 but less than 60. Adjust COPY_STT_FOR_OX\n" . "! accordingly. (amf, bmy, 9/6/01)\n" . "! (12) Now reference TRANUC from \"charpak_mod.f\" (bmy, 11/15/01)\n" . "! (13) Updated comments (bmy, 1/25/02)\n" . "! (14) Now reference AD from \"dao_mod.f\" (bmy, 9/18/02)\n" . "! (15) Now added a call to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (16) Remove call to COPY_STT_FOR_OX, it's obsolete. (bmy, 8/18/03)\n" . "! (17) Add fancy output string (bmy, 4/26/04)\n" . "! (18) No longer use hardwired filename. Also now reference \"logical_mod.f\"\n" . "! and \"tracer_mod.f\" (bmy, 7/20/04)\n" . "! (19) Remove code for obsolete CO-OH simulation. Also remove references\n" . "! to CMN_DIAG and TRCOFFSET. Change tracer name format string to A10.\n" . "! (bmy, 6/24/05)\n" . "! (20) Updated comments (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE LOGICAL_MOD, ONLY : LSPLIT, LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT\n" . " USE TRACER_MOD, ONLY : TRACER_NAME, TRACER_MW_G\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . "\n" . " ! Local Variables\n" . " INTEGER :: I, IOS, J, L, N\n" . " INTEGER :: NCOUNT(NNPAR) \n" . " REAL*8 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: SUMTC\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " INTEGER :: NI, NJ, NL\n" . " INTEGER :: IFIRST, JFIRST, LFIRST\n" . " INTEGER :: NTRACER, NSKIP\n" . " INTEGER :: HALFPOLAR, CENTER180\n" . " REAL*4 :: LONRES, LATRES\n" . " REAL*8 :: ZTAU0, ZTAU1\n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED\n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . "\n" . " !=================================================================\n" . " ! READ_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " ! Initialize some variables\n" . " NCOUNT(:) = 0\n" . " TRACER(:,:,:) = 0e0\n" . "\n" . " !=================================================================\n" . " ! Open restart file and read top-of-file header\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " INPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('OBS_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Copy input file name to a local variable\n" . " FILENAME = TRIM( INPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " ! Echo some input to the screen\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " WRITE( 6, '(a,/)' ) 'R E S T A R T F I L E I N P U T'\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( 'READ_CHECKPOINT_FILE: Reading ', a )\n" . "\n" . " ! Open the binary punch file for input\n" . " CALL OPEN_BPCH2_FOR_READ( IU_RST, FILENAME )\n" . " \n" . " ! Echo more output\n" . " WRITE( 6, 110 )\n" . " 110 FORMAT( /, 'Min and Max of each tracer, as read from the file:',\n" . " & /, '(in volume mixing ratio units: v/v)' )\n" . "\n" . " !=================================================================\n" . " ! Read concentrations -- store in the TRACER array\n" . " !=================================================================\n" . "\n" . " DO \n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & MODELNAME, LONRES, LATRES, HALFPOLAR, CENTER180\n" . "\n" . " ! IOS < 0 is end-of-file, so exit\n" . " IF ( IOS < 0 ) EXIT\n" . "\n" . " ! IOS > 0 is a real I/O error -- print error message\n" . " IF ( IOS > 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:4' )\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & CATEGORY, NTRACER, UNIT, ZTAU0, ZTAU1, RESERVED,\n" . " & NI, NJ, NL, IFIRST, JFIRST, LFIRST,\n" . " & NSKIP\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:5')\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & ( ( ( TRACER(I,J,L), I=1,NI ), J=1,NJ ), L=1,NL )\n" . "\n" . " !-------------------------------------------\n" . " ! *****TESTING CHECKPOINTING*****\n" . " !-------------------------------------------\n" . " !PRINT*,'TRACER(2,2,2)=',TRACER(2,2,2)\n" . " \n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:6')\n" . "\n" . " !==============================================================\n" . " ! Assign data from the TRACER array to the STT array.\n" . " !==============================================================\n" . "\n" . " CALL COPY_STT( NTRACER, TRACER, NCOUNT )\n" . "\n" . " ENDDO\n" . "\n" . " !=================================================================\n" . " ! Examine data blocks, print totals, and return\n" . " !=================================================================\n" . "\n" . " ! Check for missing or duplicate data blocks\n" . " CALL CHECK_DATA_BLOCKS( N_TRACERS, NCOUNT )\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST ) \n" . "\n" . " ! Print totals atmospheric mass for each tracer\n" . " WRITE( 6, 120 )\n" . " 120 FORMAT( /, 'Total atmospheric masses for each tracer: ' ) \n" . "\n" . " ! Fancy output\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### READ_CHECKPOINT_FILE: read file')\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE READ_OBS_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_CURR_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHECKPOINT_FILE creates GEOS-CHEM restart files of tracer \n" . "! mixing ratios (v/v), in binary punch file format. (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (2 ) Reference F90 module \"bpch2_mod.f\" which contains routines BPCH2_HDR, \n" . "! BPCH2, and GET_MODELNAME for writing data to binary punch files. \n" . "! (bmy, 6/22/00)\n" . "! (3 ) Now do not write more than NTRACE data blocks to disk. \n" . "! Also updated comments. (bmy, 7/17/00)\n" . "! (4 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (5 ) Added to \"restart_mod.f\". Also now save the entire grid to the\n" . "! restart file. (bmy, 6/24/02)\n" . "! (6 ) Bug fix: Remove duplicate definition of MM. This causes compile-time\n" . "! problems on the ALPHA platform. (gcc, bmy, 11/6/02)\n" . "! (7 ) Now references functions GET_OFFSET, GET_YOFFSET from \"grid_mod.f\".\n" . "! Now references function GET_TAU from \"time_mod.f\". Now added a call \n" . "! to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (8 ) Cosmetic changes (bmy, 4/29/03)\n" . "! (9 ) Now reference STT, N_TRACERS, TCVV from \"tracer_mod.f\". Also now\n" . "! remove hardwired output restart filename. Now references LPRT\n" . "! from \"logical_mod.f\". (bmy, 7/20/04)\n" . "! (10) Remove references to CMN_DIAG and TRCOFFSET. Now call GET_HALFPOLAR \n" . "! from \"bpch2_mod.f\" to get the HALFPOLAR flag value for GEOS or GCAP \n" . "! grids. (bmy, 6/28/05)\n" . "! (11) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (12) Add TAU to the argument list (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2_CHK, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " REAL*8 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('CURR_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . " DO N = 1, N_TRACERS\n" . " \n" . " ! Convert from [kg] to [v/v] and store in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " TRACER(I,J,L) = STT(I,J,L,N) !* TCVV(N) / AD(I,J,L)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . " \n" . " ! Convert STT from [kg] to [v/v] mixing ratio \n" . " ! and store in temporary variable TRACER\n" . " CALL BPCH2_CHK( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . " ENDDO \n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_CURR_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE READ_CURR_CHKFILE( YYYYMMDD, HHMMSS ) \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine READ_CHECKPOINT_FILE initializes GEOS-CHEM tracer concentrations \n" . "! from a restart file (binary punch file format) (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Day \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to read restart file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now check that N = NTRACER - TRCOFFSET is valid. \n" . "! Also reorganize some print statements (bmy, 10/25/99)\n" . "! (2 ) Now pass LFORCE, LSPLIT via CMN_SETUP. (bmy, 11/4/99)\n" . "! (3 ) Cosmetic changes, added comments (bmy, 3/17/00)\n" . "! (4 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (5 ) Broke up sections of code into internal subroutines. Also updated\n" . "! comments & cleaned up a few things. (bmy, 7/17/00)\n" . "! (6 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (7 ) Print max & min of tracer regardless of the units (bmy, 10/5/00)\n" . "! (8 ) Removed obsolete code from 10/00 (bmy, 12/21/00)\n" . "! (9 ) Removed obsolete commented out code (bmy, 4/23/01)\n" . "! (10) Added updates from amf for tagged Ox run. Also updated comments\n" . "! and made some cosmetic changes (bmy, 7/3/01)\n" . "! (11) Bug fix: if starting from multiox restart file, then NTRACER \n" . "! will be greater than 40 but less than 60. Adjust COPY_STT_FOR_OX\n" . "! accordingly. (amf, bmy, 9/6/01)\n" . "! (12) Now reference TRANUC from \"charpak_mod.f\" (bmy, 11/15/01)\n" . "! (13) Updated comments (bmy, 1/25/02)\n" . "! (14) Now reference AD from \"dao_mod.f\" (bmy, 9/18/02)\n" . "! (15) Now added a call to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (16) Remove call to COPY_STT_FOR_OX, it's obsolete. (bmy, 8/18/03)\n" . "! (17) Add fancy output string (bmy, 4/26/04)\n" . "! (18) No longer use hardwired filename. Also now reference \"logical_mod.f\"\n" . "! and \"tracer_mod.f\" (bmy, 7/20/04)\n" . "! (19) Remove code for obsolete CO-OH simulation. Also remove references\n" . "! to CMN_DIAG and TRCOFFSET. Change tracer name format string to A10.\n" . "! (bmy, 6/24/05)\n" . "! (20) Updated comments (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE LOGICAL_MOD, ONLY : LSPLIT, LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT\n" . " USE TRACER_MOD, ONLY : TRACER_NAME, TRACER_MW_G\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . "\n" . " ! Local Variables\n" . " INTEGER :: I, IOS, J, L, N\n" . " INTEGER :: NCOUNT(NNPAR) \n" . " REAL*8 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: SUMTC\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " INTEGER :: NI, NJ, NL\n" . " INTEGER :: IFIRST, JFIRST, LFIRST\n" . " INTEGER :: NTRACER, NSKIP\n" . " INTEGER :: HALFPOLAR, CENTER180\n" . " REAL*4 :: LONRES, LATRES\n" . " REAL*8 :: ZTAU0, ZTAU1\n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED\n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . "\n" . " !=================================================================\n" . " ! READ_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " ! Initialize some variables\n" . " NCOUNT(:) = 0\n" . " TRACER(:,:,:) = 0e0\n" . "\n" . " !=================================================================\n" . " ! Open restart file and read top-of-file header\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " INPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('CURR_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Copy input file name to a local variable\n" . " FILENAME = TRIM( INPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " ! Echo some input to the screen\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " WRITE( 6, '(a,/)' ) 'R E S T A R T F I L E I N P U T'\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( 'READ_CHECKPOINT_FILE: Reading ', a )\n" . "\n" . " ! Open the binary punch file for input\n" . " CALL OPEN_BPCH2_FOR_READ( IU_RST, FILENAME )\n" . " \n" . " ! Echo more output\n" . " WRITE( 6, 110 )\n" . " 110 FORMAT( /, 'Min and Max of each tracer, as read from the file:',\n" . " & /, '(in volume mixing ratio units: v/v)' )\n" . "\n" . " !=================================================================\n" . " ! Read concentrations -- store in the TRACER array\n" . " !=================================================================\n" . "\n" . " DO \n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & MODELNAME, LONRES, LATRES, HALFPOLAR, CENTER180\n" . "\n" . " ! IOS < 0 is end-of-file, so exit\n" . " IF ( IOS < 0 ) EXIT\n" . "\n" . " ! IOS > 0 is a real I/O error -- print error message\n" . " IF ( IOS > 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:4' )\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & CATEGORY, NTRACER, UNIT, ZTAU0, ZTAU1, RESERVED,\n" . " & NI, NJ, NL, IFIRST, JFIRST, LFIRST,\n" . " & NSKIP\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:5')\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & ( ( ( TRACER(I,J,L), I=1,NI ), J=1,NJ ), L=1,NL )\n" . "\n" . " !-------------------------------------------\n" . " ! *****TESTING CHECKPOINTING*****\n" . " !-------------------------------------------\n" . " !PRINT*,'TRACER(2,2,2)=',TRACER(2,2,2)\n" . " \n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:6')\n" . "\n" . " !==============================================================\n" . " ! Assign data from the TRACER array to the STT array.\n" . " !==============================================================\n" . "\n" . " CALL COPY_STT( NTRACER, TRACER, NCOUNT )\n" . "\n" . " ENDDO\n" . "\n" . " !=================================================================\n" . " ! Examine data blocks, print totals, and return\n" . " !=================================================================\n" . "\n" . " ! Check for missing or duplicate data blocks\n" . " CALL CHECK_DATA_BLOCKS( N_TRACERS, NCOUNT )\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST ) \n" . "\n" . " ! Print totals atmospheric mass for each tracer\n" . " WRITE( 6, 120 )\n" . " 120 FORMAT( /, 'Total atmospheric masses for each tracer: ' ) \n" . "\n" . " ! Fancy output\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### READ_CHECKPOINT_FILE: read file')\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE READ_CURR_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_BG_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHECKPOINT_FILE creates GEOS-CHEM restart files of tracer \n" . "! mixing ratios (v/v), in binary punch file format. (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (2 ) Reference F90 module \"bpch2_mod.f\" which contains routines BPCH2_HDR, \n" . "! BPCH2, and GET_MODELNAME for writing data to binary punch files. \n" . "! (bmy, 6/22/00)\n" . "! (3 ) Now do not write more than NTRACE data blocks to disk. \n" . "! Also updated comments. (bmy, 7/17/00)\n" . "! (4 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (5 ) Added to \"restart_mod.f\". Also now save the entire grid to the\n" . "! restart file. (bmy, 6/24/02)\n" . "! (6 ) Bug fix: Remove duplicate definition of MM. This causes compile-time\n" . "! problems on the ALPHA platform. (gcc, bmy, 11/6/02)\n" . "! (7 ) Now references functions GET_OFFSET, GET_YOFFSET from \"grid_mod.f\".\n" . "! Now references function GET_TAU from \"time_mod.f\". Now added a call \n" . "! to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (8 ) Cosmetic changes (bmy, 4/29/03)\n" . "! (9 ) Now reference STT, N_TRACERS, TCVV from \"tracer_mod.f\". Also now\n" . "! remove hardwired output restart filename. Now references LPRT\n" . "! from \"logical_mod.f\". (bmy, 7/20/04)\n" . "! (10) Remove references to CMN_DIAG and TRCOFFSET. Now call GET_HALFPOLAR \n" . "! from \"bpch2_mod.f\" to get the HALFPOLAR flag value for GEOS or GCAP \n" . "! grids. (bmy, 6/28/05)\n" . "! (11) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (12) Add TAU to the argument list (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2_CHK, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " REAL*8 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('BG_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . " DO N = 1, N_TRACERS\n" . " \n" . " ! Convert from [kg] to [v/v] and store in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " TRACER(I,J,L) = STT(I,J,L,N) !* TCVV(N) / AD(I,J,L)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . " \n" . " ! Convert STT from [kg] to [v/v] mixing ratio \n" . " ! and store in temporary variable TRACER\n" . " CALL BPCH2_CHK( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . " ENDDO \n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_BG_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE READ_BG_CHKFILE( YYYYMMDD, HHMMSS ) \n" . "!\n" . "!******************************************************************************\n" . "! Subroutine READ_CHECKPOINT_FILE initializes GEOS-CHEM tracer concentrations \n" . "! from a restart file (binary punch file format) (bmy, 5/27/99, 12/16/05)\n" . "!\n" . "! Arguments as input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Day \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to read restart file\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now check that N = NTRACER - TRCOFFSET is valid. \n" . "! Also reorganize some print statements (bmy, 10/25/99)\n" . "! (2 ) Now pass LFORCE, LSPLIT via CMN_SETUP. (bmy, 11/4/99)\n" . "! (3 ) Cosmetic changes, added comments (bmy, 3/17/00)\n" . "! (4 ) Now use function NYMD_STRING from \"time_mod.f\" to generate a\n" . "! Y2K compliant string for all data sets. (bmy, 6/22/00)\n" . "! (5 ) Broke up sections of code into internal subroutines. Also updated\n" . "! comments & cleaned up a few things. (bmy, 7/17/00)\n" . "! (6 ) Now use IOS /= 0 to trap both I/O errors and EOF. (bmy, 9/13/00)\n" . "! (7 ) Print max & min of tracer regardless of the units (bmy, 10/5/00)\n" . "! (8 ) Removed obsolete code from 10/00 (bmy, 12/21/00)\n" . "! (9 ) Removed obsolete commented out code (bmy, 4/23/01)\n" . "! (10) Added updates from amf for tagged Ox run. Also updated comments\n" . "! and made some cosmetic changes (bmy, 7/3/01)\n" . "! (11) Bug fix: if starting from multiox restart file, then NTRACER \n" . "! will be greater than 40 but less than 60. Adjust COPY_STT_FOR_OX\n" . "! accordingly. (amf, bmy, 9/6/01)\n" . "! (12) Now reference TRANUC from \"charpak_mod.f\" (bmy, 11/15/01)\n" . "! (13) Updated comments (bmy, 1/25/02)\n" . "! (14) Now reference AD from \"dao_mod.f\" (bmy, 9/18/02)\n" . "! (15) Now added a call to DEBUG_MSG from \"error_mod.f\" (bmy, 2/11/03)\n" . "! (16) Remove call to COPY_STT_FOR_OX, it's obsolete. (bmy, 8/18/03)\n" . "! (17) Add fancy output string (bmy, 4/26/04)\n" . "! (18) No longer use hardwired filename. Also now reference \"logical_mod.f\"\n" . "! and \"tracer_mod.f\" (bmy, 7/20/04)\n" . "! (19) Remove code for obsolete CO-OH simulation. Also remove references\n" . "! to CMN_DIAG and TRCOFFSET. Change tracer name format string to A10.\n" . "! (bmy, 6/24/05)\n" . "! (20) Updated comments (bmy, 12/16/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : OPEN_BPCH2_FOR_READ\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE LOGICAL_MOD, ONLY : LSPLIT, LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT\n" . " USE TRACER_MOD, ONLY : TRACER_NAME, TRACER_MW_G\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . "\n" . " ! Local Variables\n" . " INTEGER :: I, IOS, J, L, N\n" . " INTEGER :: NCOUNT(NNPAR) \n" . " REAL*8 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " REAL*8 :: SUMTC\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " INTEGER :: NI, NJ, NL\n" . " INTEGER :: IFIRST, JFIRST, LFIRST\n" . " INTEGER :: NTRACER, NSKIP\n" . " INTEGER :: HALFPOLAR, CENTER180\n" . " REAL*4 :: LONRES, LATRES\n" . " REAL*8 :: ZTAU0, ZTAU1\n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED\n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . "\n" . " !=================================================================\n" . " ! READ_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " ! Initialize some variables\n" . " NCOUNT(:) = 0\n" . " TRACER(:,:,:) = 0e0\n" . "\n" . " !=================================================================\n" . " ! Open restart file and read top-of-file header\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " INPUT_CHECKPOINT_FILE = TRIM('adjoint/')\n" . " & //TRIM('BG_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Copy input file name to a local variable\n" . " FILENAME = TRIM( INPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " ! Echo some input to the screen\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . " WRITE( 6, '(a,/)' ) 'R E S T A R T F I L E I N P U T'\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( 'READ_CHECKPOINT_FILE: Reading ', a )\n" . "\n" . " ! Open the binary punch file for input\n" . " CALL OPEN_BPCH2_FOR_READ( IU_RST, FILENAME )\n" . " \n" . " ! Echo more output\n" . " WRITE( 6, 110 )\n" . " 110 FORMAT( /, 'Min and Max of each tracer, as read from the file:',\n" . " & /, '(in volume mixing ratio units: v/v)' )\n" . "\n" . " !=================================================================\n" . " ! Read concentrations -- store in the TRACER array\n" . " !=================================================================\n" . "\n" . " DO \n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & MODELNAME, LONRES, LATRES, HALFPOLAR, CENTER180\n" . "\n" . " ! IOS < 0 is end-of-file, so exit\n" . " IF ( IOS < 0 ) EXIT\n" . "\n" . " ! IOS > 0 is a real I/O error -- print error message\n" . " IF ( IOS > 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:4' )\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & CATEGORY, NTRACER, UNIT, ZTAU0, ZTAU1, RESERVED,\n" . " & NI, NJ, NL, IFIRST, JFIRST, LFIRST,\n" . " & NSKIP\n" . "\n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:5')\n" . "\n" . " READ( IU_RST, IOSTAT=IOS ) \n" . " & ( ( ( TRACER(I,J,L), I=1,NI ), J=1,NJ ), L=1,NL )\n" . "\n" . " !-------------------------------------------\n" . " ! *****TESTING CHECKPOINTING*****\n" . " !-------------------------------------------\n" . " !PRINT*,'TRACER(2,2,2)=',TRACER(2,2,2)\n" . " \n" . " IF ( IOS /= 0 ) CALL IOERROR( IOS,IU_RST,'read_restart_file:6')\n" . "\n" . " !==============================================================\n" . " ! Assign data from the TRACER array to the STT array.\n" . " !==============================================================\n" . "\n" . " CALL COPY_STT( NTRACER, TRACER, NCOUNT )\n" . "\n" . " ENDDO\n" . "\n" . " !=================================================================\n" . " ! Examine data blocks, print totals, and return\n" . " !=================================================================\n" . "\n" . " ! Check for missing or duplicate data blocks\n" . " CALL CHECK_DATA_BLOCKS( N_TRACERS, NCOUNT )\n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST ) \n" . "\n" . " ! Print totals atmospheric mass for each tracer\n" . " WRITE( 6, 120 )\n" . " 120 FORMAT( /, 'Total atmospheric masses for each tracer: ' ) \n" . "\n" . " ! Fancy output\n" . " WRITE( 6, '(a)' ) REPEAT( '=', 79 )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### READ_CHECKPOINT_FILE: read file')\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE READ_BG_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_ORIG_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHEMISTRY_CHKFILE_P3 creates GEOS-CHEM restart files of tracers \n" . "! in binary punch file format. Used to checkpoint tracers for type2 information\n" . "! (Kumaresh, 01/24/08)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " REAL*4 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('opt/')\n" . " & //TRIM('ORIG_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . " DO N = 1, N_TRACERS\n" . " \n" . " ! Store GEOS-CHEM tracers in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " TRACER(I,J,L) = STT(I,J,L,N) !* TCVV(N) / AD(I,J,L)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . " \n" . " CALL BPCH2( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . " ENDDO \n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_ORIG_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_PERT_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHEMISTRY_CHKFILE_P3 creates GEOS-CHEM restart files of tracers \n" . "! in binary punch file format. Used to checkpoint tracers for type2 information\n" . "! (Kumaresh, 01/24/08)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " REAL*4 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('opt/')\n" . " & //TRIM('PERT_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . " DO N = 1, N_TRACERS\n" . " \n" . " ! Store GEOS-CHEM tracers in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " TRACER(I,J,L) = STT(I,J,L,N) !* TCVV(N) / AD(I,J,L)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . " \n" . " CALL BPCH2( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . " ENDDO \n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_PERT_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_OPTZ_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHEMISTRY_CHKFILE_P3 creates GEOS-CHEM restart files of tracers \n" . "! in binary punch file format. Used to checkpoint tracers for type2 information\n" . "! (Kumaresh, 01/24/08)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " REAL*4 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('opt/')\n" . " & //TRIM('OPTZ_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . " DO N = 1, N_TRACERS\n" . " \n" . " ! Store GEOS-CHEM tracers in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " TRACER(I,J,L) = STT(I,J,L,N) !* TCVV(N) / AD(I,J,L)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . " \n" . " CALL BPCH2( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . " ENDDO \n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_OPTZ_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_DIFFPERT_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHEMISTRY_CHKFILE_P3 creates GEOS-CHEM restart files of tracers \n" . "! in binary punch file format. Used to checkpoint tracers for type2 information\n" . "! (Kumaresh, 01/24/08)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " REAL*4 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('opt/')\n" . " & //TRIM('DIFFPERT_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . " DO N = 1, N_TRACERS\n" . " \n" . " ! Store GEOS-CHEM tracers in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " TRACER(I,J,L) = STT(I,J,L,N) !* TCVV(N) / AD(I,J,L)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . " \n" . " CALL BPCH2( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . " ENDDO \n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_DIFFPERT_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MAKE_DIFFOPTZ_CHKFILE( YYYYMMDD, HHMMSS, TAU )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine MAKE_CHEMISTRY_CHKFILE_P3 creates GEOS-CHEM restart files of tracers \n" . "! in binary punch file format. Used to checkpoint tracers for type2 information\n" . "! (Kumaresh, 01/24/08)\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) YYYYMMDD : Year-Month-Date \n" . "! (2 ) HHMMSS : and Hour-Min-Sec for which to create a restart file \n" . "! (3 ) TAU : GEOS-CHEM TAU value corresponding to YYYYMMDD, HHMMSS\n" . "!******************************************************************************\n" . "! \n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : BPCH2, GET_MODELNAME\n" . " USE BPCH2_MOD, ONLY : GET_HALFPOLAR, OPEN_BPCH2_FOR_WRITE\n" . " USE DAO_MOD, ONLY : AD\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_RST, IOERROR\n" . " USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET\n" . " USE LOGICAL_MOD, ONLY : LPRT\n" . " USE TIME_MOD, ONLY : EXPAND_DATE\n" . " USE TRACER_MOD, ONLY : STT, N_TRACERS, TCVV\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Arguments\n" . " INTEGER, INTENT(IN) :: YYYYMMDD, HHMMSS\n" . " REAL*8, INTENT(IN) :: TAU\n" . "\n" . " ! Local Variables \n" . " INTEGER :: I, I0, IOS, J, J0, L, N\n" . " INTEGER :: YYYY, MM, DD, HH, SS\n" . " REAL*4 :: TRACER(IIPAR,JJPAR,LLPAR)\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! For binary punch file, version 2.0\n" . " REAL*4 :: LONRES, LATRES\n" . " INTEGER :: HALFPOLAR\n" . " INTEGER, PARAMETER :: CENTER180 = 1\n" . " \n" . " CHARACTER(LEN=20) :: MODELNAME\n" . " CHARACTER(LEN=40) :: CATEGORY\n" . " CHARACTER(LEN=40) :: UNIT \n" . " CHARACTER(LEN=40) :: RESERVED = ''\n" . " CHARACTER(LEN=80) :: TITLE \n" . " CHARACTER*10 :: SUFFIX1\n" . " CHARACTER*1 :: SUFFIX2(4)\n" . " INTEGER :: T,MULT,IT,LT\n" . " !=================================================================\n" . " ! MAKE_CHECKPOINT_FILE begins here!\n" . " !=================================================================\n" . "\n" . " WRITE (SUFFIX1,'(I8)')YYYYMMDD \n" . "\n" . " T = HHMMSS/100\n" . "\n" . " DO IT = 1, 4\n" . " LT = T-(T/10)*10\n" . " WRITE (SUFFIX2(4-IT+1),'(I1)')LT\n" . " T = T/10\n" . " END DO\n" . "\n" . " OUTPUT_CHECKPOINT_FILE = TRIM('opt/')\n" . " & //TRIM('DIFFOPTZ_CHK.')//TRIM(SUFFIX1)//TRIM('.')\n" . " & //TRIM(SUFFIX2(1))//TRIM(SUFFIX2(2))//TRIM(SUFFIX2(3))\n" . " & //TRIM(SUFFIX2(4))\n" . "\n" . " ! Define variables for BINARY PUNCH FILE OUTPUT\n" . " TITLE = 'GEOS-CHEM CHECKPOINT File: ' // \n" . " & 'Instantaneous Tracer Concentrations (v/v)'\n" . " UNIT = 'v/v'\n" . " CATEGORY = 'IJ-AVG-\$'\n" . " LONRES = DISIZE\n" . " LATRES = DJSIZE\n" . "\n" . " ! Call GET_MODELNAME to return the proper model name for\n" . " ! the given met data being used (bmy, 6/22/00)\n" . " MODELNAME = GET_MODELNAME()\n" . "\n" . " ! Call GET_HALFPOLAR to return the proper value\n" . " ! for either GCAP or GEOS grids (bmy, 6/28/05)\n" . " HALFPOLAR = GET_HALFPOLAR()\n" . "\n" . " ! Get the nested-grid offsets\n" . " I0 = GET_XOFFSET( GLOBAL=.TRUE. )\n" . " J0 = GET_YOFFSET( GLOBAL=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! Open the restart file for output -- binary punch format\n" . " !=================================================================\n" . "\n" . " ! Copy the output restart file name into a local variable\n" . " FILENAME = TRIM( OUTPUT_CHECKPOINT_FILE )\n" . "\n" . " ! Replace YYYY, MM, DD, HH tokens in FILENAME w/ actual values\n" . " CALL EXPAND_DATE( FILENAME, YYYYMMDD, HHMMSS )\n" . "\n" . " WRITE( 6, 100 ) TRIM( FILENAME )\n" . " 100 FORMAT( ' - MAKE_CHECKPOINT_FILE: Writing ', a )\n" . "\n" . " ! Open restart file for output\n" . " CALL OPEN_BPCH2_FOR_WRITE( IU_RST, FILENAME, TITLE )\n" . "\n" . " !=================================================================\n" . " ! Write each tracer to the restart file\n" . " !=================================================================\n" . "\n" . " DO N = 1, N_TRACERS\n" . " \n" . " ! Store GEOS-CHEM tracers in the TRACER array\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L )\n" . " DO L = 1, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . " TRACER(I,J,L) = STT(I,J,L,N) !* TCVV(N) / AD(I,J,L)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . " \n" . " CALL BPCH2( IU_RST, MODELNAME, LONRES, LATRES, \n" . " & HALFPOLAR, CENTER180, CATEGORY, N,\n" . " & UNIT, TAU, TAU, RESERVED, \n" . " & IIPAR, JJPAR, LLPAR, I0+1, \n" . " & J0+1, 1, TRACER )\n" . " ENDDO \n" . "\n" . " ! Close file\n" . " CLOSE( IU_RST )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG('### MAKE_CHECKPOINT_FILE: wrote file')\n" . " \n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE MAKE_DIFFOPTZ_CHKFILE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " ! End of module\n" . " END MODULE CHECKPOINT_MOD\n"; close(FILE); } #============================================= # Create gasconc_adj.f #============================================= sub createGasconcAdj() { printf "Creating gasconc_adj.f\n"; open(FILE, ">gasconc_adj.f") || die "Unable to open gasconc_adj.f"; print FILE "! \$Id: gasconc.f,v 1.13 2006/10/17 17:51:11 bmy Exp \$\n" . " SUBROUTINE GASCONC_ADJ( FIRSTCHEM, NTRACER, STT, XNUMOL, FRCLND )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine GASCONC initializes gas concentrations for SMVGEAR II.\n" . "! (M. Jacobson 1997; bdf, bmy, 4/18/03, 10/16/06)\n" . "!\n" . "! NOTES:\n" . "! (1 ) Now reference ABSHUM, AIRDENS, CSPEC, IXSAVE, IYSAVE, IZSAVE, \n" . "! PRESS3, T3 from \"comode_mod.f\". Also now references tracer ID flags\n" . "! from \"tracerid_mod.f\". Also removed code that is not needed for\n" . "! GEOS-CHEM. Now also force double precision with \"D\" exponents.\n" . "! (bdf, bmy, 4/18/03)\n" . "! (2 ) Remove IRUN -- it's obsolete. Remove obsolete variables from\n" . "! documentation. (bmy, 7/16/03)\n" . "! (3 ) Now dimension args XNUMOL, STT w/ NTRACER and not NNPAR (bmy, 7/20/04)\n" . "! (4 ) Now remove LPAUSE from the arg list. Now references ITS_IN_THE_TROP\n" . "! from \"tropopause_mod.f\". (bmy, 8/22/05)\n" . "! (5 ) Now make sure all USE statements are USE, ONLY. Also remove \n" . "! reference to TRACERID_MOD, it's not needed. (bmy, 10/3/05)\n" . "! (6 ) Now zero out the isoprene oxidation counter species (dkh, bmy, 6/1/06)\n" . "! (7 ) Now take care of variable tropopause case. Also set NCS=NCSURBAN\n" . "! (=1) instead of hardwiring it. (bdf, phs, 10/16/06)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules \n" . " USE COMODE_MOD, ONLY : ABSHUM, AIRDENS, CSPEC, IXSAVE\n" . " USE COMODE_MOD, ONLY : IYSAVE, IZSAVE, PRESS3, T3\n" . " USE COMODE_MOD, ONLY : CSPEC_FULL\n" . " USE TROPOPAUSE_MOD, ONLY : ITS_IN_THE_TROP, COPY_FULL_TROP\n" . " USE TROPOPAUSE_MOD, ONLY : SAVE_FULL_TROP\n" . " USE LOGICAL_MOD, ONLY : LVARTROP\n" . " USE DAO_MOD, ONLY : T\n" . " USE PRESSURE_MOD, ONLY : GET_PCENTER\n" . " !***************KPP_INTERFACE****************\n" . " USE CHECKPOINT_MOD \n" . " USE TIME_MOD\n" . " !********************************************\n" . " IMPLICIT NONE\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"comode.h\" ! SMVGEAR II arrays\n" . "\n" . " ! Arguments\n" . " LOGICAL, INTENT(IN) :: FIRSTCHEM\n" . " INTEGER, INTENT(IN) :: NTRACER\n" . " REAL*8, INTENT(INOUT) :: STT(IIPAR,JJPAR,LLPAR,NTRACER)\n" . " REAL*8, INTENT(IN) :: XNUMOL(NTRACER)\n" . " REAL*8, INTENT(IN) :: FRCLND(IIPAR,JJPAR)\n" . "C\n" . "C *********************************************************************\n" . "C ************ WRITTEN BY MARK JACOBSON (1991-4) ************\n" . "C *** (C) COPYRIGHT, 1991-4 BY MARK Z. JACOBSON *** \n" . "C *** (650) 723-6836 *** \n" . "C *********************************************************************\n" . "C\n" . "C GGGGGG A SSSSSS CCCCCC OOOOO N N CCCCCC \n" . "C G A A S C O O N N N C \n" . "C G GGGG A A SSSSSSS C O O N N N C \n" . "C G G AAAAAAA S C O O N N N C \n" . "C GGGGGG A A SSSSSS CCCCCC OOOOO N N CCCCCC \n" . "C\n" . "C *********************************************************************\n" . "C ****** INITIALIZE GAS CONCENTRATIONS IN THE MODEL ******\n" . "C *********** AND SET MISCELLANEOUS PARAMETERS ********** \n" . "C *********************************************************************\n" . "C\n" . "C *********************************************************************\n" . "C * SET THE CONCENTRATION (# CM-3) OF ACTIVE AND INACTIVE GASES *\n" . "C *********************************************************************\n" . "C\n" . "C NTLOOP = NUMBER OF GRID-CELLS IN THE ENTIRE GRID-DOMAIN\n" . "C NTSPECGAS = NUMBER OF ACTIVE PLUS INACTIVE GASES\n" . "C NVERT = NUMBER OF VERTICAL LAYERS. \n" . "C\n" . "C QBKGAS = INITIAL BACKGROUND CONCENTRATION (VOL MIXING RATIO) \n" . "C RHO3 = G-AIR CM-3-AIR\n" . "C C(GAS) = GAS CONCENTRATION IN A GIVEN GRID-CELL (# CM-3)\n" . "C\n" . " ! Local variables\n" . " INTEGER :: IX, IY, IZ, N, NK, JJ\n" . " INTEGER :: JGAS,JLOOP,NGASMIX,JALTS,K,J,NM,L,JN,MLOOP,I\n" . " INTEGER :: IPCOMPAR,JRUN,JNEW,JOLD,NGCOUNT,IAVG,KN,SUM,SUM1\n" . " REAL*8 :: PMBCEN,PBELOW,PABOVE,ALNPRES,PS,ALNCONC,AVMIX,S1CON\n" . " REAL*8 :: S2CON,GRCONC1,GRCONC2,GRCONC3,SUMRMS,SUMFRACS,QNEW\n" . " REAL*8 :: QACC,FRACDIF,FRACABS,AVGERR,RMSCUR\n" . " REAL*8 :: TK,CONSEXP,VPRESH2O,CONST\n" . "\n" . " INTEGER :: NYMD, NHMS\n" . " REAL*8 :: TAU\n" . "\n" . " !=================================================================\n" . " ! GASCONC begins here!\n" . " !=================================================================\n" . "\n" . " !-----------------------\n" . " ! Prior to 10/16/06:\n" . " !NCS = 1\n" . " !-----------------------\n" . "\n" . " ! Set NCS=NCSURBAN here since we have defined our tropospheric\n" . " ! chemistry mechanism in the urban slot of SMVGEAR II\n" . " NCS = NCSURBAN\n" . "\n" . " !=================================================================\n" . " ! First time through here, copy initial conditions from QBKCHEM\n" . " ! to CSPEC() for each grid box. QBKCHEM stores the default\n" . " ! background concentrations for species in the file \"chem.dat\".\n" . " !=================================================================\n" . " IF ( FIRSTCHEM ) THEN\n" . "\n" . " ! Loop over species\n" . " DO 28 JGAS = 1, NTSPEC(NCS)\n" . "\n" . " !===========================================================\n" . " ! For methanol (MOH), now use different initial background\n" . " ! concentrations for different regions of the atmosphere:\n" . " !\n" . " ! (a) 2.0 ppbv MOH -- continental boundary layer\n" . " ! (b) 0.9 ppbv MOH -- marine boundary layer\n" . " ! (c) 0.6 ppbv MOH -- free troposphere\n" . " !\n" . " ! The concentrations listed above are from Heikes et al,\n" . " ! \"Atmospheric methanol budget and ocean implication\",\n" . " ! _Global Biogeochem. Cycles_, submitted, 2002. These\n" . " ! represent the best estimates for the methanol conc.'s\n" . " ! in the troposphere based on various measurements.\n" . " !\n" . " ! MOH is an inactive chemical species in GEOS-CHEM, so\n" . " ! these initial concentrations will never change. However,\n" . " ! MOH acts as a sink for OH, and therefore will affect both\n" . " ! the OH concentration and the methylchloroform lifetime.\n" . " !\n" . " ! We specify the MOH concentration as ppbv, but then we\n" . " ! need to multiply by PRESS3(JLOOP) / ( T3(JLOOP) * BK )\n" . " ! in order to convert to [molec/cm3]. (bdf, bmy, 2/22/02)\n" . " !===========================================================\n" . " IF ( NAMEGAS(JGAS) == 'MOH' ) THEN\n" . "\n" . " ! Loop over all potential tropospheric boxes\n" . " !-------------------------------------------------\n" . " ! Prior to 10/3/06:\n" . " ! Make DO-loops go in the right order\n" . " !DO IX = 1, IIPAR\n" . " !DO IY = 1, JJPAR\n" . " !DO IZ = 1, LLTROP\n" . " !-------------------------------------------------\n" . " DO IZ = 1, LLTROP\n" . " DO IY = 1, JJPAR\n" . " DO IX = 1, IIPAR\n" . "\n" . " ! Conversion factor\n" . " CONST = GET_PCENTER(IX,IY,IZ)*1000D0/(T(IX,IY,IZ)*BK)\n" . " \n" . "!======= prior 09/12 ==========================\n" . "! DO JLOOP = 1, NTLOOP\n" . "! ! Convert 1-D grid box index to 3-D indices\n" . "! IX = IXSAVE(JLOOP)\n" . "! IY = IYSAVE(JLOOP)\n" . "! IZ = IZSAVE(JLOOP)\n" . "!=================== ==========================\n" . "\n" . " !------------------------------\n" . " ! Test for altitude\n" . " ! IZ < 9 is always in the trop.\n" . " !------------------------------\n" . " IF ( IZ <= 9 ) THEN\n" . "\n" . " !---------------------------\n" . " ! Test for ocean/land boxes\n" . " !---------------------------\n" . " IF ( FRCLND(IX,IY) >= 0.5 ) THEN\n" . "\n" . " ! Continental boundary layer: 2 ppbv MOH\n" . " CSPEC_FULL(IX,IY,IZ,JGAS) = 2.000d-9 * CONST\n" . "\n" . " !======= prior 09/12 ==========================\n" . "! & 2.000d-9 * PRESS3(JLOOP) / ( T3(JLOOP) * BK )\n" . " !=============================================\n" . "\n" . " ! Make sure MOH conc. is not negative (SMAL2 = 1d-99)\n" . " CSPEC_FULL(IX,IY,IZ,JGAS) = \n" . " & MAX(CSPEC_FULL(IX,IY,IZ,JGAS),SMAL2)\n" . "\n" . " ELSE\n" . "\n" . " ! Marine boundary layer: 0.9 ppbv MOH\n" . " CSPEC_FULL(IX,IY,IZ,JGAS) = 0.900d-9 * CONST\n" . "\n" . " !======= prior 09/12 ==========================\n" . "! & 0.900d-9 * PRESS3(JLOOP) / ( T3(JLOOP) * BK )\n" . " !==============================================\n" . "\n" . " ! Make sure MOH conc. is not negative (SMAL2 = 1d-99)\n" . " CSPEC_FULL(IX,IY,IZ,JGAS) = \n" . " & MAX(CSPEC_FULL(IX,IY,IZ,JGAS),SMAL2)\n" . " ENDIF\n" . "\n" . " ELSE\n" . "\n" . " !---------------------------\n" . " ! Test for troposphere\n" . " !---------------------------\n" . " IF ( ITS_IN_THE_TROP( IX, IY, IZ ) ) THEN\n" . " \n" . " ! Free troposphere: 0.6 ppbv MOH\n" . " CSPEC_FULL(IX,IY,IZ,JGAS) = 0.600d-9 * CONST\n" . "\n" . " ! Make sure MOH conc. is not negative (SMAL2 = 1d-99)\n" . " CSPEC_FULL(IX,IY,IZ,JGAS) = \n" . " & MAX(CSPEC_FULL(IX,IY,IZ,JGAS),SMAL2)\n" . "\n" . " ELSE\n" . "\n" . " ! Stratosphere: set MOH conc. to SMAL2 = 1d-99\n" . " CSPEC_FULL(IX,IY,IZ,JGAS) = SMAL2\n" . " ENDIF\n" . " ENDIF\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "\n" . " ELSE\n" . "\n" . " !========================================================\n" . " ! Set default initial conc. for species other than\n" . " ! Methanol (MOH) in mixing ratios units\n" . " !========================================================\n" . "\n" . " !DO 26 JLOOP = 1, NTLOOP\n" . " !---------------------------------------\n" . " ! Prior to 10/3/06:\n" . " ! Make DO-loops go in the right order\n" . " !DO IX = 1, IIPAR\n" . " !DO IY = 1, JJPAR\n" . " !DO IZ = 1, LLTROP\n" . " !----------------------------------------\n" . " DO IZ = 1, LLTROP \n" . " DO IY = 1, JJPAR\n" . " DO IX = 1, IIPAR\n" . "\n" . " ! Conversion factor\n" . " CONST = GET_PCENTER(IX,IY,IZ)*1000D0/(T(IX,IY,IZ)*BK)\n" . " \n" . " ! Copy default background conc. from \"globchem.dat\" to CSPEC\n" . " CSPEC_FULL(IX,IY,IZ,JGAS) = QBKCHEM(JGAS,NCS)* CONST\n" . "\n" . " ! Make sure concentration is not negative (SMAL2 = 1d-99)\n" . " CSPEC_FULL(IX,IY,IZ,JGAS) = \n" . " & MAX(CSPEC_FULL(IX,IY,IZ,JGAS),SMAL2)\n" . "\n" . " ! For emission species, don't do unit conversion\n" . " IF (NAMEGAS(JGAS).EQ.'EMISSION') THEN\n" . " CSPEC_FULL(IX,IY,IZ,JGAS) = QBKCHEM(JGAS,NCS)\n" . " ENDIF\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . " ENDIF\n" . " 28 CONTINUE\n" . " ENDIF !(FIRSTCHEM)\n" . " \n" . " ! If it's the first chemistry timestep then we need to copy the\n" . " ! concentrations from CSPEC_FULL into CSPEC. We also need to do\n" . " ! this on subsequent chemistry timesteps if the variable tropopause\n" . " ! is turned on. (bdf, phs, bmy, 10/3/06)\n" . " IF ( LVARTROP .or. FIRSTCHEM ) CALL COPY_FULL_TROP\n" . "\n" . "C ********************************************************************\n" . "C * Update starting concentrations for plumes *\n" . "C ********************************************************************\n" . "C\n" . "\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . " IF(.not.FIRSTCHEM)CALL READ_CHEMISTRY_CHKFILE_CSP1(NYMD, NHMS)\n" . " CALL READ_PART_CHKFILE( NYMD, NHMS )\n" . "\n" . "! CALL PARTITION( NTRACER, STT, XNUMOL ) \n" . "C\n" . "C *********************************************************************\n" . "C * zero out dry deposition counter species *\n" . "C *********************************************************************\n" . "\n" . " !-------------------------------------------------------------------\n" . " ! Prior to 10/16/06:\n" . " ! Now set NCS = NCSURBAN (=1) (dbm, bmy, 10/16/06)\n" . " !! NCS should equal 1 for drydep, only happens in first layer.\n" . " !NCS = 1\n" . " !-------------------------------------------------------------------\n" . "\n" . " ! Set NCS=NCSURBAN here since we have defined our tropospheric\n" . " ! chemistry mechanism in the urban slot of SMVGEAR II\n" . " NCS = NCSURBAN\n" . "\n" . " DO 130 N = 1,NDRYDEP(NCS)\n" . " NK = NTDEP(N)\n" . " IF (NK.EQ.0) GOTO 130\n" . " JJ = IRM(NPRODLO+1,NK,NCS)\n" . " !write(6,*) 'value of drydep reactions in cspec= ',jj\n" . " IF (JJ.LE.0) GOTO 130\n" . " DO 135 JLOOP = 1,NTTLOOP\n" . " CSPEC(JLOOP,JJ) = 0.0D0\n" . " 135 CONTINUE\n" . " 130 CONTINUE\n" . "\n" . "C\n" . "C *********************************************************************\n" . "C * INITIALIZE H2O (# CM-3) IF H2O IS INACTIVE *\n" . "C *********************************************************************\n" . "C VPRESH2O = SATURATION VAPOR PRESSURE OVER H2O (# CM-3)\n" . "C ABSHUM = ABSOLUTE HUMIDITY (molec cm^-3) [input] (ABSHUM)\n" . "C ABSHUM = RELATIVE HUMIDITY (FRACTION) [output]\n" . "C TK = TEMPERATURE (K)\n" . "C\n" . " IF (IH2O.GT.NGAS) THEN\n" . " DO 33 JLOOP = 1, NTTLOOP\n" . " TK = T3(JLOOP)\n" . " CONSEXP = 17.2693882D0 * (TK - 273.16D0) /\n" . " 1 (TK - 35.86D0)\n" . " VPRESH2O = CONSVAP * EXP(CONSEXP) / TK \n" . " CSPEC(JLOOP,IH2O) = ABSHUM(JLOOP)\n" . "C then calculate R.H.\n" . " ABSHUM(JLOOP) = CSPEC(JLOOP,IH2O) / VPRESH2O \n" . "! write(297,*) 'in initgas',jloop,abshum(jloop)\n" . " 33 CONTINUE\n" . " ENDIF\n" . "\n" . "C *********************************************************************\n" . "C * INITIALIZE O2 (# CM-3) IF O2 IS INACTIVE *\n" . "C *********************************************************************\n" . "C AIRDENS = AIR DENSITY (G CM-3)\n" . "C OXYCONS = (# G-1) CONVERSION OF O2 FROM G CM-3 TO # CM-3\n" . "C\n" . " IF (IOXYGEN.GT.NGAS) THEN\n" . " OXYCONS = 0.2095d0\n" . " DO 260 JLOOP = 1, NTLOOP\n" . " 260 CSPEC(JLOOP,IOXYGEN) = AIRDENS(JLOOP) * OXYCONS\n" . " ENDIF\n" . " 999 format(E10.3)\n" . "\n" . "C\n" . "C *********************************************************************\n" . "C * ZERO OUT ISOPRENE OXIDATION COUNTER SPECIES\n" . "C * (dkh, bmy, 6/1/06) \n" . "C *********************************************************************\n" . "C LISOPOH = Dummy variable for tracking loss of isoprene due to rxn w/ OH\n" . "C ILISOPOH = Location of LISOPOH in CSPEC \n" . "C\n" . " IF ( ILISOPOH > 0 ) THEN\n" . " DO JLOOP = 1, NTLOOP\n" . " CSPEC(JLOOP,ILISOPOH) = 0d0\n" . " ENDDO\n" . " ENDIF \n" . "C\n" . "C *********************************************************************\n" . "C * SUM UP INITIAL GAS MASSES OVER ENTIRE GRID *\n" . "C *********************************************************************\n" . "C GQSUMINI(JGAS) = INITIAL # MOLECULES, OVER THE ENTIRE GRID\n" . "C QSUMINIT = SUM OF ALL ME OR IM # OVER GRID\n" . "C SUM OF ALL MEVF OR IMVF CM3 OVER GRID\n" . "C GRIDVH = VOLUME OF A GRID-CELL (CM**3)\n" . "C\n" . "\n" . "! DO 800 JGAS = 1, NTSPECGAS\n" . "! GQSUMINI(JGAS) = 0. \n" . "! DO 800 JLOOP = 1, NTLOOP\n" . "! GQSUMINI(JGAS)=GQSUMINI(JGAS)+CSPEC(JLOOP,JGAS)*GRIDVH(JLOOP) \n" . "! 800 CONTINUE\n" . "C\n" . "C *********************************************************************\n" . "C * IDENTIFY GASES FOR PRINTING *\n" . "C *********************************************************************\n" . "C\n" . " NUMPRG = 0 \n" . " DO 290 JGAS = 1, NTSPECGAS\n" . " JST = NAMEGAS(JGAS)\n" . " IF (APGASA.EQ.JST) IFPRGAS(JGAS) = 2 \n" . " IF (APGASB.EQ.JST) IFPRGAS(JGAS) = 2 \n" . " IF (APGASC.EQ.JST) IFPRGAS(JGAS) = 2 \n" . " IF (APGASD.EQ.JST) IFPRGAS(JGAS) = 2 \n" . " IF (APGASE.EQ.JST) IFPRGAS(JGAS) = 2 \n" . " IF (APGASF.EQ.JST) IFPRGAS(JGAS) = 2 \n" . " IF (APGASG.EQ.JST) IFPRGAS(JGAS) = 2 \n" . " IF (APGASH.EQ.JST) IFPRGAS(JGAS) = 2 \n" . " IF (IFPRGAS(JGAS).GE.1) THEN\n" . " NUMPRG = NUMPRG + 1\n" . " LGNUM(NUMPRG) = JGAS \n" . " ENDIF\n" . " 290 CONTINUE\n" . "C\n" . " 370 FORMAT(25X,0PF6.4/) \n" . " 380 FORMAT(A14,1X,1PE10.4,I5,I7)\n" . "C\n" . "C *********************************************************************\n" . "C **** PRINT OUT INITIAL CONCENTRATION INFORMATION ****\n" . "C *********************************************************************\n" . "C\n" . " NCS = 1\n" . "C\n" . " IF (ITESTGEAR.EQ.2) THEN\n" . " WRITE(KCPD,810) 0.,0.,(NAMENCS(INEWOLD(I,NCS),NCS),\n" . " 1 CSPEC(LLOOP,INEWOLD(I,NCS)), I = 1, ISCHANG(NCS))\n" . " WRITE(KCPD,820)\n" . " ENDIF\n" . "C\n" . " 810 FORMAT('CONC (# CM-3) AT TIME=',1PE10.2,' SECONDS. ', \n" . " l 'STEP=',E10.2,' . RUN =',I3/3(A13,'=',E11.4,1X))\n" . " 820 FORMAT('END')\n" . "C\n" . "C *********************************************************************\n" . "C ********** READ DATA FOR TESTING RESULTS FROM CHEMISTRY *************\n" . "C *********************************************************************\n" . "C CSPEC(), GEARCONC ARE # CM-3 FOR GASES\n" . "C\n" . " IF (ITESTGEAR.EQ.1) THEN\n" . " IPCOMPAR = 0 \n" . " JRUN = 0 \n" . " WRITE(6,*)\n" . " WRITE(6,*)'GEAR-CODE CONCENTRATIONS TO TEST'\n" . " READ(KCPD,450) HEADING\n" . " 470 READ(KCPD,460) RINP(1), GRCONC1, RINP(2), GRCONC2, \n" . " 1 RINP(3), GRCONC3 \n" . " IF (RINP(1).NE.'END') THEN\n" . " DO 480 JNEW = 1, ISCHANG(NCS)\n" . " JOLD = INEWOLD(JNEW,NCS)\n" . " JST = NAMENCS(JOLD,NCS)\n" . " IF (JST.EQ.RINP(1)) GEARCONC(JNEW,JRUN,NCS) = GRCONC1\n" . " IF (JST.EQ.RINP(2)) GEARCONC(JNEW,JRUN,NCS) = GRCONC2\n" . " IF (JST.EQ.RINP(3)) GEARCONC(JNEW,JRUN,NCS) = GRCONC3\n" . " 480 CONTINUE\n" . " GOTO 470 \n" . " ELSE\n" . " IF (IPCOMPAR.EQ.1) THEN\n" . " WRITE(6,450) HEADING\n" . " WRITE(6,460)(NAMENCS(INEWOLD(JNEW,NCS),NCS),\n" . " 1 GEARCONC(JNEW,JRUN,NCS), JNEW = 1, ISCHANG(NCS)) \n" . " ENDIF\n" . "C\n" . "C COMPARE INITIAL CONDITIONS OF GEAR DATA TO chem.dat DATA\n" . "C\n" . " IF (JRUN.EQ.0) THEN\n" . " IF (IPCOMPAR.EQ.1) WRITE(6,475)\n" . "C\n" . " SUMRMS = 0.d0\n" . " SUMFRACS = 0.d0\n" . " NGCOUNT = 0\n" . "C\n" . " DO 485 JNEW = 1, ISCHANG(NCS)\n" . " JOLD = INEWOLD(JNEW,NCS)\n" . " QNEW = QBKCHEM(JOLD,NCS) \n" . " QACC = GEARCONC(JNEW,0,NCS) \n" . "C\n" . " IF (QACC.EQ.0.AND.QNEW.NE.0.) THEN\n" . " WRITE(6,465) NAMEGAS(JOLD) \n" . " STOP \n" . " ENDIF \n" . "C\n" . " IF (QNEW.GT.1.0d-20) THEN\n" . " FRACDIF = (QNEW - QACC)/QACC\n" . " FRACABS = ABS(FRACDIF)\n" . " SUMFRACS = SUMFRACS + FRACABS \n" . " SUMRMS = SUMRMS + FRACABS * FRACABS\n" . " NGCOUNT = NGCOUNT + 1\n" . " IAVG = 1\n" . " ELSE\n" . " FRACDIF = 0.d0\n" . " IAVG = 0\n" . " ENDIF\n" . " IF (IPCOMPAR.EQ.1) \n" . " 1 WRITE(6,495) NAMENCS(JOLD,NCS),QACC,QNEW,\n" . " 2 FRACDIF*100, IAVG\n" . " 485 CONTINUE\n" . "C\n" . " AVGERR = 100.d0 * SUMFRACS / NGCOUNT \n" . " RMSCUR = 100.d0 * SQRT(SUMRMS / NGCOUNT)\n" . " WRITE(6,505) JRUN, AVGERR, NGCOUNT \n" . "C\n" . " ENDIF\n" . "C ENDIF JRUN.EQ.0\n" . "C\n" . " JRUN = JRUN + 1\n" . " IF (GRCONC1.EQ.0.) THEN \n" . " READ(KCPD,450) HEADING\n" . " GOTO 470 \n" . " ENDIF\n" . " IF (JRUN.GT.MXHOLD) THEN\n" . " WRITE(6,*)'JSPARSE: JRUN > MXHOLD'\n" . " STOP\n" . " ENDIF\n" . " ENDIF\n" . " ENDIF\n" . "C\n" . " 475 FORMAT(4X,'SPECIES',5X,'GEARCONC chem.dat % ERROR IFAVG')\n" . " 495 FORMAT(A14,2(1X,1PE11.4),2X,0PF8.2,'%',3X,I1)\n" . " 505 FORMAT(I3,37X,F8.2,'% AVERAGE OF ',I5,' SPECIES')\n" . " 450 FORMAT(A76) \n" . " 460 FORMAT(3(A13,1X,1PE11.4,1X))\n" . " 465 FORMAT('GASCONC: AN INITIAL CONCENTRATION FROM compare.dat '/\n" . " 1 'DOES NOT MATCH THAT FROM globchem.dat. CHECK WHETHER '/\n" . " 2 'THE CONDITIONS FOR THIS RUN (ITESTGEAR = 1) ARE THE '/\n" . " 3 'SAME FOR THE CONDITIONS FOR THE RUN WITH ITESTGEAR=2. '/\n" . " 4 'OTHERWISE, TURN ITESTGEAR = 0 OR 2. ',A14) \n" . "C\n" . "C *********************************************************************\n" . "C ********************* END OF SUBROUTINE GASCONC *********************\n" . "C *********************************************************************\n" . "C\n" . " RETURN\n" . " END SUBROUTINE GASCONC_ADJ\n"; close(FILE); } #============================================= # Create linoz.com #============================================= sub createLinozCom() { printf "Creating linoz.com\n"; open(FILE, ">linoz.com") || die "Unable to open linoz.com"; print FILE "C \$Id: linoz.com,v 2.23 2000/05/24 23:09:33 pjc Exp \$\n" . "C \$Log: linoz.com,v \$\n" . "C Revision 2.23 2000/05/24 23:09:33 pjc\n" . "C Changed criteria for using Linoz: now must have [Ox]>150ppb AND Level>=9.\n" . "C\n" . "C Revision 2.10 2000/03/23 20:39:04 pjc\n" . "C Initial version created out of McLinden's original files.\n" . "C\n" . "\n" . "C common block for linoz. Created by Philip Cameron-Smith, 00/1/14.\n" . "\n" . " INTEGER nfields_linoz,nlevels_linoz,nlat_linoz,nmonths_linoz\n" . " PARAMETER(nfields_linoz=7) ! Number of linoz fields.\n" . " PARAMETER(nlevels_linoz=25) ! Number of levels in linoz fields.\n" . " PARAMETER(nlat_linoz=18) ! Number of latitudes in linoz fields.\n" . " PARAMETER(nmonths_linoz=12) !Number of months in linoz fields.\n" . "\n" . " REAL*8 TPARM(nlevels_linoz,nlat_linoz,nmonths_linoz,nfields_linoz)\n" . " REAL*8 TLSTT(JJPAR,LLPAR,nfields_linoz)\n" . " COMMON/linoz_fields/TPARM,TLSTT\n" . "\n" . " REAL*8 linoz_min_alt !Minimum altitude covered by linoz data.\n" . " PARAMETER(linoz_min_alt=10) ! units=[km]\n" . " INTEGER linoz_min_lev ! Minimum GCM level linoz can cover.\n" . " COMMON/linoz_levels/linoz_min_lev\n" . "\n" . "C*PJC* Need to define the minimum Level at which Linoz can be used.\n" . "C NB: Linoz data goes down to ~277mbar, so any part of a layer below \n" . "C this has effectively no Linoz chemistry.\n" . " INTEGER Linoz_min_L\n" . " PARAMETER(Linoz_min_L=9)\n" . "C*PJC* Define ozone tropopause, below which Linoz not used.\n" . " REAL*8 Linoz_min_Ox\n" . " PARAMETER(Linoz_min_Ox=150E-9) ! VMR, so 150E-9 = 150 ppb.\n"; close(FILE); } #============================================= # Create linoz_mod.f #============================================= sub createLinozMod() { printf "Creating linoz_mod.f\n"; open(FILE, ">linoz_mod.f") || die "Unable to open linoz_mod.f"; print FILE " MODULE LINOZ_MOD\n" . "\n" . "C Revision 2.10 2000/03/23 20:41:45 pjc\n" . "C Initial version adapted heavily from McLinden's original file.\n" . "C\n" . "\n" . "c-----------------------------------------------------------------------\n" . "c---(pchem.f)-------generic CTM shell from UCIrvine (p-code 4.0b, 5/99)\n" . "c-------- PCHEM is basic trop/strat chemistry package\n" . "c-------- subroutines: CHEM2, CHEM3, STRATL, STRT2M, SOMLFQ\n" . "c CHEMSTRAT, TPAUSE, TROPFLUX\n" . "c-----------------------------------------------------------------------\n" . "c\n" . "c Modified to work with GISS II' GCM and Harvard chemistry by \n" . "c Philip Cameron-Smith, 00/1/14\n" . "c\n" . "c----------------------------------------------------------------------- \n" . "\n" . "\n" . " CONTAINS\n" . "\n" . " subroutine do_linoz \n" . "\n" . " USE TIME_MOD\n" . "\n" . "# include \"CMN_SIZE\"\n" . "\n" . " ! Local variables\n" . " ! Chem time step in seconds for linoz (dbj,bdf 6/24/03)\n" . " REAL*8 :: NSCHEM\n" . "\n" . " INTEGER, SAVE :: LASTMONTH = -99\n" . "\n" . " ! if new month, get new parameters????kk\n" . " IF ( GET_MONTH() /= LASTMONTH ) THEN\n" . " CALL LINOZ_STRATL\n" . " LASTMONTH = GET_MONTH()\n" . " ENDIF\n" . " NSCHEM = GET_TS_CHEM()*60D0 ! Linoz needs time step in seconds\n" . " CALL LINOZ_CHEM3(NSCHEM)\n" . "\n" . " end subroutine do_linoz \n" . "\n" . " !============================================================\n" . " \n" . " \n" . " SUBROUTINE LINOZ_CHEM3 (DTCHEM)\n" . "\n" . "c-----------------------------------------------------------------------\n" . "c CHEM3 applies linearized chemistry based on tables from\n" . "c PRATMO model using climatological T, O3, time of year\n" . "c-----------------------------------------------------------------------\n" . "c\n" . "C Calling parameters:\n" . "C DTCHEM Chemistry time step in [seconds]\n" . "C\n" . "c-----------------------------------------------------------------------\n" . "\n" . " USE TRACERID_MOD !(dbj 06/24/03)\n" . " USE DAO_MOD !(dbj 06/24/03)\n" . " USE GRID_MOD, ONLY : GET_AREA_CM2 !(dbj 06/24/03)\n" . " USE TRACER_MOD\n" . " \n" . " IMPLICIT NONE\n" . "\n" . "c include 'cmn_h.f' ! UCI include file\n" . "c include 'cmn_t.f' ! UCI include file\n" . "c include 'cmn_w.f' ! UCI include file\n" . "c include 'cmn_d.f' ! UCI include file \n" . "# include \"CMN_SIZE\"\n" . "# include \"CMN\"\n" . "# include \"linoz.com\"\n" . "!# include \"comtrid.h\" (dbj, 06/24/03)\n" . "\n" . "! include 'tracers.com'\n" . "\n" . " real*8 climo3,climpml,dco3,dero3,dertmp,derco3,dmass,pmltot,dtmp\n" . " real*8 sso3,vol\n" . " real*8 do3,dnoy,pi,pmlc,pml0(iipar,jjpar,llpar),pmltmr,xlat\n" . " real*8 pml0zm(jjpar,llpar),dmon(12),vmix,xmlat\n" . " real*8 dcolo3(iipar,jjpar,llpar),colo3(iipar,jjpar,llpar),scalmom\n" . "! real*8 sttold(ntrace)\n" . "\n" . " REAL*8 DTCHEM,O3BOX,TBOX\n" . "! integer JBOX,LBOX\n" . "! parameter (pi=3.1415926)\n" . " integer I,J,L,N,k,m\n" . " INTEGER NTRACER\n" . "\n" . " ! Now declare IMX, JM as local variables\n" . " ! since they have removed them from the common block (dbj 6/24/03)\n" . " INTEGER IMX, JM, LM\n" . "\n" . " real*8 out_data(iipar,jjpar,llpar)\n" . "c\n" . "! IF (.NOT. LSTRAT) GOTO 99 ! Now in physproc. {PJC}\n" . "c goto 99\n" . "c\n" . "c stratospheric chem occurs in top NSTRTC layers of 21/23 layer CTM\n" . "c TLSTT(J,LR,N) is stored LR from top (=LM) down (=LM+1-NCSTRT)!Obsolete {PJC}\n" . "c\n" . "! LSMIN = LM+1 - NSTRTC ! looping controlled elsewhere {PJC}\n" . "\n" . " ! Assign values for local IMX and JM (dbj 6/24/03) \n" . " IMX = IIPAR\n" . " JM = JJPAR\n" . " LM = LLPAR ! dbj\n" . "\n" . "c Stratospheric Chemistry Tables for O3:\n" . "c ======================================\n" . "c 7 tables, each a function of month (12), latitude \n" . "c (18, -85 to 85 in 10 deg. increments) and altitude \n" . "c (25, z*=10-58 km in 2 km increments).\n" . "c 1- ozone (Logan climatology), v/v\n" . "c 2- Temperature climatology, K\n" . "c 3- Column ozone climatology, Logan ozone integrated above box, DU\n" . "c 4- ozone (P-L) for climatological ozone, v/v/s\n" . "c 5- d(P-L) / dO3, 1/s\n" . "c 6- d(P-L) / dT, v/v/s/K \n" . "c 7- d(P-L) / d(column O3), v/v/s/DU\n" . "c\n" . "c zero storage arrays\n" . "! do n=1,ntrace\n" . "! sttold(n)=0.d0\n" . "! enddo\n" . "\n" . "!\n" . "!*****************************************************************************\n" . "! Select the proper tracer number to store O3 into, depending on\n" . "! whether this is a full chemistry run or a single tracer Ox run\n" . "!*****************************************************************************\n" . "!\n" . " IF ( ITS_A_FULLCHEM_SIM() ) THEN\n" . " NTRACER = IDTOX\n" . " ELSE\n" . " IF ( ITS_A_TAGOX_SIM() ) THEN\n" . " NTRACER = 1\n" . " ELSE\n" . " ! All other simulations don't use O3...print error message\n" . " WRITE( 6, '(a)' ) 'This simulation does not use O3!!'\n" . " WRITE( 6, '(a)' ) 'STOP in linoz_chem3.f!'\n" . " STOP\n" . " ENDIF\n" . " ENDIF\n" . "\n" . " !SELECT CASE ( NSRCX )\n" . "\n" . " ! Full chemistry\n" . " !CASE ( 3 )\n" . " ! NTRACER = IDTOX\n" . " \n" . " ! Single tracer Ox\n" . " !CASE ( 6 )\n" . " ! NTRACER = 1\n" . "\n" . " ! All other simulations don't use O3...print error message\n" . " !CASE DEFAULT\n" . " ! WRITE( 6, '(a)' ) 'This simulation does not use O3!!'\n" . " ! WRITE( 6, '(a)' ) 'STOP in linoz_chem3.f!'\n" . " ! STOP\n" . "\n" . " !END SELECT\n" . "\n" . " WRITE(6,*) '-----------------------------------------------------'\n" . " write(6,*) ' doing linoz stratospheric chemistry'\n" . " WRITE(6,*) '-----------------------------------------------------'\n" . "\n" . "c start at top layer and continue to lowest layer for strat. chem\n" . " out_data = 0d0\n" . " DO 33 L = LM,MINVAL(LPAUSE),-1 \n" . " DO 34 J = 1,JM\n" . " DO 31 I=1,IMX\n" . " IF (L .LT. LPAUSE(I,J)) GOTO 31\n" . " if (STT(I,J,L,NTRACER) .LE. 0.D0) GOTO 31\n" . "\n" . "!c calculate ozone column above box (and save)\n" . "!c dcolo3 = ozone column (in DU) in given layer\n" . "!c colo3 = ozone column above layer + half of\n" . "!c column in layer\n" . "\n" . "! bdf stt is in v/v, make conversion to DU\n" . " if (l.eq.lm) then !top model layer\n" . " dcolo3(i,j,l) = (stt(i,j,l,NTRACER)*AD(I,J,L)/\n" . " & TCVV(NTRACER))/ GET_AREA_CM2(J) *\n" . "! DXYP replaced\n" . "! & TCVV(NTRACER))/ DXYP(J) * 1d-4 *\n" . "! & 6.022d23/(TCMASS(NTRACER)*1d-3)/ 2.687d16\n" . "! dbj: TCMASS = 28.97/TCVV\n" . " & 6.022d23/(28.97/TCVV(NTRACER)*1d-3)/ 2.687d16\n" . " colo3(i,j,l) = dcolo3(i,j,l)*0.5\n" . " else\n" . " dcolo3(i,j,l) = (stt(i,j,l,NTRACER)*AD(I,J,L)/\n" . " & TCVV(NTRACER))/ GET_AREA_CM2(J) *\n" . "! & TCVV(NTRACER))/ DXYP(J) * 1d-4 *\n" . "! & 6.022d23/(TCMASS(NTRACER)*1d-3)/ 2.687d16\n" . " & 6.022d23/(28.97/TCVV(NTRACER)*1d-3)/ 2.687d16\n" . " colo3(i,j,l) = colo3(i,j,l+1) +\n" . " & (dcolo3(i,j,l)+dcolo3(i,j,l+1))*0.5\n" . " endif\n" . " out_data(i,j,l) = colo3(i,j,l)\n" . "\n" . "c ****** O3 Chemistry ******\n" . "c n=1\n" . "c store tracer mass before chemistry\n" . "! sttold=stt(i,j,l,1)\n" . "\n" . "c ++++++ climatological P-L: ++++++ \n" . " climpml=tlstt(j,l,4) ! Climatological P-L = (P-L)^o\n" . "c ++++++ local ozone feedback: ++++++ \n" . " dero3=tlstt(j,l,5) ! Derivative w.r.t. O3. dero3=-1/(time constant)\n" . " IF (dero3.EQ.0) goto 31 !skip Linoz if lifetime is infinite.\n" . " climo3=tlstt(j,l,1) ! Climatological O3 = f^o\n" . " derco3=tlstt(j,l,7) ! Derivative w.r.t. Column O3\n" . " dco3=(colo3(i,j,l)-tlstt(j,l,3)) ! deviation from o3 climatology.\n" . "\n" . "c ++++++ temperature feedback: ++++++ \n" . " dertmp=tlstt(j,l,6) ! Derivative w.r.t. Temperature\n" . " dtmp=(T(I,J,L)-tlstt(j,l,2)) !Deviation in Temperature from climatology.\n" . "\n" . "c ++++++ calculate steady-state ozone: ++++++ \n" . " sso3=climo3 - (climpml+dtmp*dertmp+dco3*derco3)/dero3 !ssO3 = f^*\n" . "\n" . "c ++++++ change in ozone mass due to chemistry: ++++++\n" . " dmass=(sso3-STT(I,J,L,NTRACER))*(1.0-exp(dero3*dtchem))\n" . "\n" . "c ++++++ update ozone mass ++++++ \n" . "\n" . "! for the GEOS_STRAT model, the top layer goes to .1mbar, well above the \n" . "! stratopause (1mbar). linoz is not valid above the stratopuase.\n" . "#if defined( GEOS_STRAT )\n" . " IF (L .EQ. LM) DMASS = 0D0\n" . "#elif defined( GEOS_3 )\n" . " IF (L .GT. LM-5) DMASS = 0D0\n" . "#endif\n" . "\n" . " ! bdf control test\n" . "! if (dmass .gt. stt(i,j,l,ntracer)/4. .or. \n" . "! & dmass .lt. -stt(i,j,l,ntracer)/4.) then\n" . " ! report result\n" . "! write(666,*) 'tau= ',tau,'dmass to high or low'\n" . "! write(666,*) i,j,l,'dmass= ',dmass*1d9,\n" . "! & 'stt= ',stt(i,j,l,ntracer)*1d9\n" . "! dmass=0d0\n" . "! endif\n" . " STT(I,J,L,NTRACER) = STT(I,J,L,NTRACER) + dmass\n" . "\n" . "! endif\n" . " 31 continue\n" . "\n" . " 34 continue\n" . "\n" . " 33 continue\n" . "! write our calculated column o3 maximum\n" . " write(6,*) 'max of columns= ',maxval(out_data)\n" . "\n" . "! STOP 'LINOZ DEBUGGING'\n" . "\n" . " 99 return\n" . "\n" . " end SUBROUTINE LINOZ_CHEM3\n" . "\n" . " !============================================================\n" . "\n" . " SUBROUTINE LINOZ_STRATL\n" . "\n" . "c-----------------------------------------------------------------------\n" . "c-------- monthly fixup of chemistry PARAM'S -- NO SPLINES FOR 21-LAYER)\n" . "c-------- stratospheric chem occurs in top NSTRTC layers ---------------\n" . "\n" . " USE GRID_MOD, ONLY : GET_YMID !(dbj 06/24/03)\n" . " USE TIME_MOD, ONLY : GET_MONTH !(dbj 06/24/03)\n" . " USE PRESSURE_MOD \n" . "\n" . " IMPLICIT NONE\n" . "\n" . "c include 'cmn_h.f' ! UCI include file\n" . "c include 'cmn_t.f' ! UCI include file\n" . "# include \"CMN_SIZE\"\n" . "# include \"CMN\"\n" . "# include \"linoz.com\"\n" . "\n" . " integer J,K,L,N,JLATMD(jjpar),JXXX,LR,JJ,i,im1,im2 !,je\n" . "! integer jdofm(nmonths_linoz+1),jdmc(nmonths_linoz)\n" . "! parameter (je=18) !number of latitudes in look-up table\n" . "\n" . " ! Now declare IMX, JM as local variables\n" . " ! since we have removed them from the common block (dbj 6/24/03)\n" . " INTEGER IMX, JM, MONTH\n" . "\n" . " real*8 STRTX(nlevels_linoz),YSTRT(nlat_linoz)\n" . " real*8 P0L(llpar+1)\n" . " real*8 STRT0L(llpar+1),STRT1L(llpar+1),STRT2L(llpar+1)\n" . "! real*8, PARAMETER :: PSF=984D0\n" . " real*8, PARAMETER :: PSF=1010D0\n" . "\n" . " !Define Month names locally (dbj 6/25/03)\n" . " CHARACTER(LEN=3) :: CMONTH(12) = (/'jan', 'feb', 'mar', 'apr',\n" . " & 'may', 'jun', 'jul', 'aug',\n" . " & 'sep', 'oct', 'nov', 'dec'/)\n" . "\n" . "! & STRTXY1(nlevels_linoz,JJPAR), STRTXY2(nlevels_linoz,JJPAR)\n" . "! & wm1,wm2,TPAR2(nlevels_linoz,nlat_linoz)\n" . "\n" . "! data JDOFM/0,31,59,90,120,151,181,212,243,273,304,334,365/\n" . "c-----------------------------------------------------------------------\n" . "! IF (.NOT. LSTRAT) GOTO 99 ! Now handled in calling routine {PJC}\n" . "\n" . " ! Assign values for local IMX and JM (dbj 6/24/03)\n" . " IMX = IIPAR\n" . " JM = JJPAR\n" . "\n" . " ! added call to GET_MONTH (dbj 6/25/03) \n" . " WRITE(6,*)'#####################################################'\n" . " WRITE(6,*)'# Interpolating Linoz fields for ',\n" . " & CMONTH( GET_MONTH() ),\n" . " & ' #'\n" . " WRITE(6,*)'#####################################################'\n" . "\n" . "\n" . "! ***** Linear interpolation between months is not currently used {PJC} *****\n" . "!c get weights for month interpolation\n" . "! do i=1,nmonths_linoz\n" . "! jdmc(i) = jdofm(i+1) - (jdofm(i+1)-jdofm(i))/2\n" . "! enddo\n" . "!\n" . "! im1=0\n" . "! do i=1,nmonths_linoz\n" . "! if (jdmc(i).lt.jday) then\n" . "! im1=i\n" . "! endif\n" . "! enddo\n" . "! if (im1.eq.0) then\n" . "! im1=nmonths_linoz\n" . "! im2=1\n" . "! wm1=(jdmc(im2)-jday)*1.0/(jdmc(im2)-(jdmc(im1)-365.0))\n" . "! elseif (im1.eq.nmonths_linoz) then\n" . "! im2=1\n" . "! wm1=(jdmc(im2)+365.0-jday)/(jdmc(im2)+365.0-jdmc(im1))\n" . "! else\n" . "! im2=im1+1\n" . "! wm1=(jdmc(im2)-jday)*1.0/(jdmc(im2)-jdmc(im1))\n" . "! endif\n" . "! wm2=1.0-wm1\n" . "!\n" . "!c write(6,*)iday,jday,' weights: ',wm1,wm2\n" . "!c write(6,*)'months: ',im1,im2,month\n" . "!c write(6,*)'between: ',jdmc(im1),jdmc(im2)\n" . "! ***************************************************************************\n" . "\n" . "c latitude interpolation \n" . "\n" . " YSTRT(1) = -85.d0 !Latitudes = -85, -75, -65, .... +75, +85.\n" . " do J = 2,NLAT_LINOZ\n" . " YSTRT(J) = YSTRT(J-1) + 10.d0\n" . " enddo\n" . "\n" . "\n" . " DO J = 1,JJPAR\n" . "! WRITE(6,*)'J =',J,', LATITUDE =',ylmid(j) ! debugging {PJC}\n" . " ! added call to GET_YMID (dbj 6/25/03) \n" . " JXXX = int(0.1d0 * GET_YMID(J) +10.d0) !YLMID=latitude of box middle\n" . "! JXXX = int(0.1d0 *YDGRD(J) +10.d0)\n" . " JLATMD(J) = MIN(18,MAX(1,JXXX)) !index of nearest Linoz data column\n" . " ENDDO\n" . "\n" . " DO L = 1,LLPAR+1\n" . "! P0L(L) = ZEDG(LLPAR+2-L) ! order in increasing pressure {PJC}\n" . " !P0L(L) = SIGE(LLPAR+2-L)*(PSF-PTOP)+PTOP !order in increasing pressure {PJC}\n" . " ! added call to GET_BP (dbj 6/25/03) \n" . " !P0L(L) = GET_BP(LLPAR+2-L)*(PSF-PTOP)+PTOP !order in increasing pressure {PJC}\n" . " P0L(L) = GET_AP(LLPAR+2-L) + (GET_BP(LLPAR+2-L)*PSF) ! dbj\n" . "\n" . "\n" . " ENDDO\n" . "! WRITE(6,*)'***** LINOZ_STRATL EDGE PRESSURES *****'\n" . "! WRITE(6,*)'PSF,PTOP =',psf,ptop\n" . "! WRITE(6,*)'SIGE =',SIGE\n" . "! WRITE(6,*)'P0L =',P0L\n" . "\n" . "c-------- TPARM(25,18,12,N) defined for --------------------------------\n" . "c 25 layers from 58 km to 10 km by 2 km intervals\n" . "c 18 LATS (85S, 75S, ...85N) \n" . "c 12 months\n" . "c N tables = NTBLS\n" . "c-------- skip interpolating, pick nearest latitude --------------------\n" . "\n" . " DO N = 1,nfields_linoz\n" . "\n" . "! ***** Interpolation between latitudes is not currently used {PJC} *****\n" . "!c----- interpolating along latitude, from TPAR2 to STRTXY\n" . "! do K = 1,nlevels_linoz\n" . "! do J = 1,nlat_linoz\n" . "!c TPAR2(K,J) = TPARM(K,J,MONTH,N)\n" . "! TPAR2(K,J) = TPARM(K,J,im1,N)\n" . "! enddo\n" . "! enddo\n" . "! call LINOZ_INTPL(nlevels_linoz,NLAT_LINOZ,JPAR,JM,YSTRT,YDGRD,\n" . "! & TPAR2,STRTXY1)\n" . "! do K = 1,nlevels_linoz\n" . "! do J = 1,nlat_linoz\n" . "! TPAR2(K,J) = TPARM(K,J,im2,N)\n" . "! enddo\n" . "! enddo\n" . "! call LINOZ_INTPL(nlevels_linoz,NLAT_LINOZ,JPAR,JM,YSTRT,YDGRD,\n" . "! & TPAR2,STRTXY2)\n" . "! ***********************************************************************\n" . "\n" . " !month = GET_MONTH() ! (dbj 6/25/03)\n" . " DO J = 1,JM\n" . " JJ = JLATMD(J)\n" . " DO K = 1,nlevels_linoz\n" . "c linearly interpolate in latitude and month\n" . "c STRTX(K) = STRTXY1(K,J)*wm1 + STRTXY2(K,J)*wm2\n" . "c linearly interpolate in latitude, single month\n" . "c STRTX(K) = STRTXY2(K,J)\n" . "c nearest latitude, linearly interpolate in month\n" . "c STRTX(K) = TPARM(K,JJ,im1,N)*wm1 + TPARM(K,JJ,im2,N)*wm2\n" . "c nearest latitude, single month\n" . " STRTX(K) = TPARM(K,JJ,GET_MONTH(),N)\n" . " ENDDO\n" . "\n" . "c*PJC* Interpolate and calculate moments of column distribution \n" . "\n" . "! WRITE(6,*)'---- Before LINOZ_STRT2M ----'\n" . "! WRITE(6,*)'STRTX =',STRTX\n" . "! WRITE(6,*)'nlevels_linoz =',nlevels_linoz\n" . "! WRITE(6,*)'STRT0L =',STRT0L\n" . "! WRITE(6,*)'STRT1L =',STRT1L\n" . "! WRITE(6,*)'STRT2L =',STRT2L\n" . "! WRITE(6,*)'P0L =',P0L\n" . "! WRITE(6,*)'LLPAR =',LLPAR\n" . " CALL LINOZ_STRT2M(STRTX,nlevels_linoz,STRT0L,STRT1L,STRT2L,\n" . " & P0L,LLPAR)\n" . "! WRITE(6,*)'---- After LINOZ_STRT2M ----'\n" . "! WRITE(6,*)'STRTX =',STRTX\n" . "! WRITE(6,*)'nlevels_linoz =',nlevels_linoz\n" . "! WRITE(6,*)'STRT0L =',STRT0L\n" . "! WRITE(6,*)'STRT1L =',STRT1L\n" . "! WRITE(6,*)'STRT2L =',STRT2L\n" . "! WRITE(6,*)'P0L =',P0L\n" . "! WRITE(6,*)'LLPAR =',LLPAR\n" . "! WRITE(6,*)'----------------------------'\n" . "\n" . "c\n" . "c-------store loss freq/yields & moments in TLSTT/SWT/SWW \n" . "c------- for exact CTM layers LM down\n" . "! DO LR = 1,NSTRTC\n" . " DO LR = 1,LLPAR ! order reversed from C.McLinden version {PJC}\n" . "! NSTRTC = number of stratospheric chem layers. {PJC}\n" . " TLSTT(J,LR,N) = STRT0L(LLPAR+1-LR)\n" . "! TLSWT(J,LR,N) = STRT1L(LR) ! Moment not used {PJC}\n" . "! TLSWW(J,LR,N) = STRT2L(LR) ! Moment not used {PJC}\n" . " if (n .eq. 1) then\n" . " write(776,*) tlstt(j,lr,N)\n" . " endif\n" . "! WRITE(776,*)'J,LR,N =',J,LR,N,', TLSTT(J,LR,N)=',TLSTT(J,LR,N)\n" . "\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "! STOP 'LINOZ_STRATL debugging'\n" . "\n" . "c\n" . " \n" . "! WRITE(6,*)'#######################################################'\n" . "! WRITE(6,*)'# Finished Interpolating Linoz fields for ',\n" . "! & JMONTH(1:3),' #'\n" . "! WRITE(6,*)'#######################################################'\n" . "\n" . "\n" . "c\n" . " 99 RETURN\n" . " END SUBROUTINE LINOZ_STRATL\n" . "\n" . " !============================================================\n" . "\n" . " SUBROUTINE LINOZ_STRT2M (STRTX,NX,STRT0L,STRT1L,STRT2L,P0L,NSTRT)\n" . "\n" . "c-----------------------------------------------------------------------\n" . " implicit none\n" . "\n" . "# include \"CMN_SIZE\"\n" . "# include \"linoz.com\"\n" . "\n" . " integer NX,NSTRT,ncbox,nl,l,k\n" . "! parameter (ncbox=25) ! Now use nlevels_linoz for all routines. {PJC}\n" . " parameter (NL=nlevels_linoz+5)\n" . "\n" . " real*8 P0L(llpar+1)\n" . " real*8 STRT0L(llpar+1),STRT1L(llpar+1),STRT2L(llpar+1)\n" . " real*8 STRTX(nlevels_linoz)\n" . " real*8 P1,P2,F0,F1,F2,PS(NL+1),F(NL)\n" . " real*8 XPSD,XPSLM1,XPSL\n" . "c-----------------------------------------------------------------------\n" . "c set up std z* atmosphere: p = 1000 * 10**(-z*/16 km)\n" . "c assume that stratospheric chemical parameters always start at\n" . "cc 52 km (N=27) scan downward from 52 km to 14 km (NX=20) by 2 km\n" . "c 58 km (N=30) scan downward from 58 km to 10 km (NX=25) by 2 km \n" . "c intervals, constant >58km\n" . "c-------- N.B. F(\@30km) assumed to be constant from 29-31 km (by mass) \n" . "c\n" . "C======== Comments from Chris McLinden by Email ={PJC}==================\n" . "C CALL SOMLFQ(P1,P2,F0,F1,F2,PS,F,NL)\n" . "C - P1,P2 are the pressure EDGES for the CTM layer onto which the\n" . "C coefficients will be mapped. [P1>P2 I believe {PJC}]\n" . "C - F0,F1,F2 are the CTM layer vertical moments determined in SOMLFQ\n" . "C - PS are the pressure layer edges of the original [ie Linox] grid\n" . "C - F is the column of coefficients (on the original grid); note\n" . "C F is flipped relative to STRTX and since the coefficients begin\n" . "C at z*=10, F(1)=F(2)=...=F(5)=0\n" . "C - NL is 30; size of F()\n" . "C \n" . "C The box model calculations were performed at z*=10km, 12km, ... and\n" . "C so these would represent the centres with the corresponding edges at\n" . "C 9,11km ; 11,13km; ...\n" . "C PS() represents the edges (although PS(1) is set to 1000mb).\n" . "C The first few values are:\n" . "C PS(1)=1000\n" . "C PS(2)=874.947105 (note PS(2) is not quite 1000 exp(-1/16) as the\n" . "C PS(3)=656.117767 the average pressure is used - not the pressure\n" . "C PS(4)=492.018914 at the average z*)\n" . "C PS(5)=368.96213\n" . "C PS(6)=276.68257\n" . "C PS(7)=207.48266\n" . "C ...\n" . "C PS(30)=0.276682568\n" . "C PS(31)=0.0\n" . "C \n" . "C F(1) spans PS(1)-PS(2)\n" . "C F(2) spans PS(2)-PS(3)\n" . "C ...\n" . "C F(30) spans PS(30)-PS(31)\n" . "C=======================================================================\n" . "\n" . "\n" . " XPSD = 10.D0 **(-0.125D0)\n" . " XPSLM1 = 1000.D0\n" . " PS(1) = 1000.D0\n" . " DO L = 2,NL\n" . " XPSL = XPSLM1 *XPSD\n" . " PS(L) = 0.5D0 *(XPSLM1 +XPSL)\n" . " XPSLM1 = XPSL\n" . " ENDDO\n" . " PS(NL+1) = 0.D0\n" . " DO L = 1,NL-NX\n" . " F(L) = 0.D0\n" . " ENDDO\n" . "c-------- K=1 is at the top of atmosphere ------------------------------\n" . " DO K = 1,NX\n" . " F(NL+1-K)= STRTX(K) !STRTX has increasing preasure. {PJC}\n" . " ENDDO\n" . " DO K = 1,NSTRT\n" . " P1 = P0L(K+1)\n" . " P2 = P0L(K)\n" . " CALL LINOZ_SOMLFQ(P1,P2,F0,F1,F2,PS,F,NL)\n" . " STRT0L(K)= F0\n" . " write(778,*) 'value after regrid',k,strt0l(k)\n" . " STRT1L(K)= F1\n" . " STRT2L(K)= F2\n" . " ENDDO\n" . "c\n" . " RETURN\n" . " END SUBROUTINE LINOZ_STRT2M\n" . "\n" . " !============================================================\n" . "\n" . " SUBROUTINE LINOZ_SOMLFQ(P1,P2,F0,F1,F2,PS,F,NL)\n" . "\n" . "c-----------------------------------------------------------------------\n" . "c------ calculate loss freq moments from a set of loss freq's at std z*\n" . "c-------- given a CTM model interval pressure range: P1 > P2 (decreasing up)\n" . "c-------- the pressure levels BETWEEN z* values are:\n" . "c PS(i) > PS(i+1) bounds z*(i)\n" . "c-------- NL: z* levels, ==> PS(NL+1) = 0 (extrapolate chemical loss to top)\n" . "c Z1 = 16.D0*LOG10(1000.D0/P1)\n" . "c Z2 = 16.D0*LOG10(1000.D0/P2)\n" . "c\n" . "c-------- The MOMENTS for a square-wave or 'bar': F(x)=f0 b<=x<=c, =0.0 else\n" . "c----- S0 = f0 (x) [from x=b to x=c]\n" . "c----- S1 = 3 f0 (x^2 - x) [from x=b to x=c]\n" . "c----- S2 = 5 f0 (2x^3 - 3x^2 + x) [from x=b to x=c]\n" . "c-----------------------------------------------------------------------\n" . " implicit none\n" . " integer NL\n" . " real*8 P1,P2,F0,F1,F2,PS(NL+1),F(NL),sgnf0\n" . "c\n" . " integer I\n" . " real*8 XB,XC,PC,PB,THIRD\n" . "c-----------------------------------------------------------------------\n" . " F0 = 0.D0\n" . " F1 = 0.D0\n" . " F2 = 0.D0\n" . " DO I = 1,NL\n" . " PC = MIN(P1,PS(I))\n" . " PB = MAX(P2,PS(I+1))\n" . " IF (PC .GT. PB) THEN\n" . "C-------- have condition: P1>=PC > PB>=P2, 0<=XB < XC<=1 --------------\n" . " XC = (PC-P2)/(P1-P2)\n" . " XB = (PB-P2)/(P1-P2)\n" . "c\n" . "c-------- assume that the loss freq, F, is constant over interval [XB,XC],\n" . "c-------- F0: (c-b), F1: 6((c2-c)-(b2-b)), F2: 5((2c3-3c2+c)-(2b3-3b2+b))\n" . "c-------- calculate its contribution to the moments in the interval [0,1]\n" . "c\n" . " F0 = F0 +F(I) *(XC -XB)\n" . " F1 = F1 +F(I) *3.D0 *((XC *XC -XC) - (XB *XB -XB))\n" . " F2 = F2 +F(I) *5.D0 *\n" . " & ((XC+XC-1.D0)*(XC*XC -XC) - (XB+XB-1.D0)*(XB*XB -XB))\n" . " ENDIF\n" . " ENDDO\n" . "c\n" . "c-------- RESTRAIN moments: force monotonicity & positive at min end pt\n" . "c\n" . "c -=-=- cam: tables can be + or -\n" . " if (f0.ne.0.0) then\n" . " sgnf0=f0 / abs(f0)\n" . " else\n" . " sgnf0=1.0\n" . " endif\n" . " f0=abs(f0)\n" . " \n" . "c F0 = MAX(F0, 0.D0)\n" . " THIRD = 1.D0/3.D0\n" . " IF (F2 .GT. 0.D0) THEN\n" . "c\n" . "c-------- do not allow reversal of curvature: F2 > 0 -------------------\n" . " F2 = MIN(F2, ABS(F1)*THIRD, 5.D-1*F0)\n" . " IF (F1 .LT .0.D0) THEN\n" . " F1 = MAX(-(F0+F2), F1)\n" . " ELSE\n" . " F1 = MIN(+(F0+F2), F1)\n" . " ENDIF\n" . " ELSE\n" . "c\n" . "c-------- F2 < 0 = curved down at ends, allow if F1 < F0 ---------------\n" . " F1 = MIN(F0,MAX(-F0,F1))\n" . " F2 = MAX(F2,(ABS(F1)-F0),(-ABS(F1)*THIRD))\n" . " ENDIF\n" . "c\n" . "c -=-=- cam: apply sign\n" . " f0=sgnf0 * f0\n" . " f1=sgnf0 * f1\n" . " f2=sgnf0 * f2\n" . "c\n" . " RETURN\n" . " END SUBROUTINE LINOZ_SOMLFQ\n" . " \n" . " !============================================================\n" . "\n" . " SUBROUTINE LINOZ_READ\n" . "\n" . "c-----------------------------------------------------------------------\n" . " IMPLICIT NONE\n" . "\n" . "# include \"CMN_SIZE\"\n" . "# include \"linoz.com\"\n" . "\n" . " INTEGER K,J,M,NTBLS\n" . "\n" . " REAL*8 TMAX,TMIN\n" . " CHARACTER*80 Heading,TITL1\n" . "\n" . "c-------- new std z*=2km levels from model: z*=10,12,...(25*2)+8 km\n" . " open(8,ERR=101,\n" . " & file='/home/kumaresh/GEOS/data/G4x5'//\n" . " & 'linoz_coeff.dat',\n" . " & form='FORMATTED',STATUS='OLD')\n" . "\n" . " WRITE(6,*)\n" . " WRITE(6,*)'\$\$ Reading in Linoz Data \$\$'\n" . "\n" . " read (8,901) Heading\n" . " WRITE(6,*)Heading\n" . " do NTBLS = 1,nfields_linoz\n" . " TMIN = +1.d30\n" . " TMAX = -1.d30\n" . " read (8,901) TITL1\n" . "! WRITE(6,*) TITL1\n" . " do M = 1,nmonths_linoz !Month\n" . " do J = 1,nlat_linoz !Latitudes\n" . " read (8,907) (TPARM(K,J,M,NTBLS),K=nlevels_linoz,1,-1)\n" . " do K=1,nlevels_linoz\n" . " TMAX = max (TMAX, TPARM(K,J,M,ntbls))\n" . " TMIN = min (TMIN, TPARM(K,J,M,ntbls))\n" . " enddo\n" . " enddo\n" . " enddo\n" . " write (6,912) TITL1,TMIN,TMAX\n" . " enddo\n" . "! debug\n" . " do j=1,nlat_linoz\n" . " do m=nlevels_linoz,1,-1\n" . " write(777,*) tparm(m,j,1,1)\n" . " enddo\n" . " enddo\n" . "! stop\n" . "\n" . " WRITE(6,*)'\$\$ Finished Reading Linoz Data \$\$'\n" . " WRITE(6,*)\n" . "\n" . " GOTO 999\n" . "C --- IF error ---- \n" . " 101 CONTINUE\n" . " WRITE(6,*)'**** STOP: Error reading Linoz Coefficients {PJC} ****'\n" . " write(6,*)'NTBLS =',ntbls,', M =',m,', J =',j,', K =',k\n" . " write(6,*)'TPARM(K,J,M,NTBLS) =',TPARM(K,J,M,NTBLS)\n" . " STOP\n" . "C -----------------\n" . "\n" . " 901 FORMAT(A)\n" . " 907 FORMAT(20X,6E10.3/(8E10.3))\n" . " 912 FORMAT(' Linoz Data: ',a80,1p,2e10.3)\n" . " \n" . "\n" . " 999 CONTINUE\n" . "\n" . " END SUBROUTINE LINOZ_READ\n" . "\n" . " !============================================================\n" . "\n" . " SUBROUTINE LINOZ_INTPL(KE,IE,ND,NE,XI,XN,YI,YN)\n" . "\n" . "c-----------------------------------------------------------------------\n" . " implicit none\n" . " integer KE,IE,ND,NE\n" . " real*8 XI(IE),XN(ND),YI(KE,IE),YN(KE,ND)\n" . " integer I,II,J,K\n" . " real*8 CNST1,CNST2\n" . "c----------------------------------------------------------------------\n" . "c k=height; i=lat\n" . "\n" . " J = 2\n" . " do I = 1,NE\n" . " if (XN(I) .gt. XI(1 )) then\n" . " if (XN(I) .lt. XI(IE)) then\n" . " CNST1 = (XI(J) - XN(I)) / (XI(J) - XI(J-1))\n" . " CNST2 = (XN(I) - XI(J-1)) / (XI(J) - XI(J-1))\n" . " do K = 1,KE\n" . " YN(K,I) = CNST1 * YI(K,J-1) + CNST2 * YI(K,J)\n" . " enddo\n" . " II = min(I+1,NE)\n" . " if (XN(II) .gt. XI(J)) J = min(IE,J+1)\n" . " else\n" . " do K = 1 ,KE\n" . " YN(K,I) = YI(K,IE)\n" . " enddo\n" . " endif\n" . " else\n" . " do K = 1,KE\n" . " YN(K,I) = YI(K,1)\n" . " enddo\n" . " endif\n" . "c write(6,*)i,(yn(k,i),k=1,ke)\n" . " enddo\n" . " return\n" . " end SUBROUTINE LINOZ_INTPL\n" . "\n" . " !============================================================\n" . "\n" . " SUBROUTINE STRAT_INIT\n" . "\n" . " USE TRACERID_MOD !(dbj 06/24/03)\n" . " USE TRACER_MOD \n" . "\n" . " IMPLICIT NONE\n" . "\n" . "# include \"CMN_SIZE\"\n" . "# include \"CMN\"\n" . "# include \"linoz.com\"\n" . "!# include \"comtrid.h\"\n" . "\n" . " INTEGER I, J, L\n" . "\n" . " CALL LINOZ_STRATL\n" . " DO I=1,IIPAR\n" . " DO J=1,JJPAR\n" . " DO L=MINVAL(LPAUSE),LLPAR\n" . " IF (L .LT. LPAUSE(I,J)) CYCLE\n" . " STT(I,J,L,IDTOX) = TLSTT(J,L,1) / TCVV(IDTOX)\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "\n" . "! call write_fields2(7)\n" . "! call flush(12)\n" . "\n" . " END SUBROUTINE STRAT_INIT\n" . "\n" . " !============================================================\n" . "\n" . "\n" . " ! End of module\n" . " END MODULE LINOZ_MOD\n"; close(FILE); } #============================================= # Create schem_adj.f #============================================= sub createSchemAdj() { printf "Creating schem_adj.f\n"; open(FILE, ">schem_adj.f") || die "Unable to open schem_adj.f"; print FILE "! \$Id: schem.f,v 1.9 2005/11/03 17:50:35 bmy Exp \$\n" . " SUBROUTINE SCHEM_ADJ\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine SCHEM performs simplified stratospheric chemistry, which means\n" . "! only reactions with OH and photolysis are considered. The production and\n" . "! loss of CO and NOy in the stratosphere are taken from Dylan Jones' 2-D \n" . "! model. (qli, bmy, 11/20/1999, 10/25/05) \n" . "!\n" . "! NOTES:\n" . "! (1 ) Now read all inputs (stratospheric OH, monthly mean J-values, \n" . "! P(CO) rates, and L(CO) rates) from binary punch file format. \n" . "! (bmy, 12/10/99) \n" . "! (2 ) Uses READ_BPCH2 to read from binary file format (bmy, 12/10/99)\n" . "! (3 ) Make sure the DO-loops go in the order N-L-J-I to avoid disk\n" . "! swapping problems (bmy, 12/10/99)\n" . "! (4 ) Remove reactions for HNO3 photolysis and HNO3 + OH. The HNO3\n" . "! concentrations that we read in from disk are from Dylan's 2-D\n" . "! model, where chemistry is already taken into account. \n" . "! (qli, bmy, 12/23/99)\n" . "! (5 ) Remove obsolete code from 12/23/99. (bmy, 4/18/00)\n" . "! (6 ) Bug fixes: Cap RDLOSS so that it does not exceed 1.0.\n" . "! Now declare RDLOSS, T1L, RC, K0, K1, K2, K3, M as REAL*8 \n" . "! Cosmetic changes & update comments (bmy, 5/4/00)\n" . "! (7 ) Reference F90 module \"bpch2_mod\" which contains routine \"read_bpch2\"\n" . "! for reading data from binary punch files (bmy, 6/28/00)\n" . "! (8 ) Now all monthly mean J-values are in the same file (bmy, 6/30/00)\n" . "! (9 ) Now use function GET_TAU0 (from \"bpch2_mod.f\") to return the TAU0 \n" . "! value used to index the binary punch file. (bmy, 7/20/00)\n" . "! (10) Declared arrays for reading data from disk to be both ALLOCATABLE\n" . "! and SAVE. Also cosmetic changes & some cleanup. (bmy, 9/8/00) \n" . "! (11) Activated parallel DO-loops (bmy, 12/12/00)\n" . "! (12) Now use 3 arguments (M/D/Y) in call to GET_TAU0. ARRAY needs to be \n" . "! of size (IGLOB,JGLOB). Use JGLOB,LGLOB in calls to READ_BPCH2.\n" . "! Use TRANSFER_ZONAL (from \"transfer_mod.f\") to cast from REAL*4 to \n" . "! REAL*8 and resize arrays to (JJPAR,LLPAR). Updated comments, \n" . "! made cosmetic changes. (bmy, 9/27/01)\n" . "! (13) Removed obsolete commented out code from 9/01 (bmy, 10/24/01)\n" . "! (14) Now read COprod and COloss files directly from the\n" . "! DATA_DIR/pco_lco_200203/ subdirectory. Also read stratOH files\n" . "! directly from the DATA_DIR/stratOH_200203/ subdirectory. Also \n" . "! read stratjv files directly from the DATA_DIR/stratjv_200203/ \n" . "! subdirectory. (bmy, 4/2/02)\n" . "! (15) Now reference AD and T from \"dao_mod.f\". Also reference routine\n" . "! ALLOC_ERR from \"error_mod.f\". Now reference IDTOX, IDTNOX, etc.\n" . "! from \"tracerid_mod.f\". (bmy, 11/6/02)\n" . "! (16) Now use functions GET_TS_CHEM, GET_MONTH and GET_TAU, and \n" . "! TIMESTAMP_STRING from the new \"time_mod.f\". Also call READ_BPCH2 \n" . "! with QUIET=.TRUE., which prevents info from being printed to the \n" . "! log file. (bmy, 3/14/03)\n" . "! (17) LINUX has a problem putting a function call w/in a WRITE statement. \n" . "! Now save output from TIMESTAMP_STRING to STAMP and print that.\n" . "! (bmy, 9/29/03)\n" . "! (18) Now reference STT and TRACER_MW_KG from \"tracer_mod.f\". Now reference\n" . "! DATA_DIR from \"directory_mod.f\". Bug fix: now loop over N_TRACERS\n" . "! and not NNPAR. NNPAR is the max # of tracers but may not be the\n" . "! actual number of tracers. (bmy, 7/20/04)\n" . "! (19) Now references GET_MIN_TPAUSE_LEVEL and ITS_IN_THE_STRAT from\n" . "! \"tropopause_mod.f\". Now remove reference to CMN, it's obsolete.\n" . "! (bmy, 8/22/05)\n" . "! (20) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (21) Now references XNUMOLAIR from \"tracer_mod.f\" (bmy, 10/25/05)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules\n" . " USE BPCH2_MOD, ONLY : GET_NAME_EXT, GET_RES_EXT\n" . " USE BPCH2_MOD, ONLY : GET_TAU0, READ_BPCH2\n" . " USE DAO_MOD, ONLY : AD, T\n" . " USE DIRECTORY_MOD, ONLY : DATA_DIR \n" . " USE ERROR_MOD, ONLY : ALLOC_ERR\n" . " USE TIME_MOD, ONLY : GET_MONTH, GET_TAU\n" . " USE TIME_MOD, ONLY : GET_TS_CHEM, TIMESTAMP_STRING\n" . " USE TRACER_MOD, ONLY : N_TRACERS, STT_ADJ\n" . " USE TRACER_MOD, ONLY : TRACER_MW_KG, XNUMOLAIR\n" . " USE TRACERID_MOD, ONLY : IDTACET, IDTALD2, IDTALK4, IDTC2H6\n" . " USE TRACERID_MOD, ONLY : IDTC3H8, IDTCH2O, IDTH2O2, IDTHNO4\n" . " USE TRACERID_MOD, ONLY : IDTISOP, IDTMACR, IDTMEK, IDTMP \n" . " USE TRACERID_MOD, ONLY : IDTMVK, IDTPMN, IDTPRPE, IDTR4N2\n" . " USE TRACERID_MOD, ONLY : IDTRCHO\n" . " USE TRANSFER_MOD, ONLY : TRANSFER_ZONAL\n" . " USE TROPOPAUSE_MOD, ONLY : GET_MIN_TPAUSE_LEVEL, ITS_IN_THE_STRAT\n" . "\n" . " IMPLICIT NONE\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "\n" . " ! Local variables\n" . " LOGICAL, SAVE :: FIRST = .TRUE.\n" . "\n" . " INTEGER :: I, IOS, J, L, N, NN, LMIN\n" . " INTEGER, SAVE :: MONTHSAVE = 0 \n" . " \n" . " ! Number of photolysis species (currently is 13)\n" . " INTEGER, PARAMETER :: NSPHOTO = 13 \n" . "\n" . " ! Tracers that undergo photolysis loss in the stratosphere\n" . " INTEGER :: SPHOTOID(NSPHOTO) = (/ \n" . " & 3, 8, 9, 10, 11, 12, 13, \n" . " & 14, 17, 20, 22, 23, 24 /)\n" . "\n" . " ! Character variables\n" . " CHARACTER(LEN=16 ) :: STAMP\n" . " CHARACTER(LEN=255) :: FILENAME\n" . "\n" . " ! REAL*4 arrays -- for reading from binary data files\n" . " REAL*4 :: ARRAY(1,JGLOB,LGLOB) \n" . " REAL*4, ALLOCATABLE, SAVE :: STRATOH(:,:)\n" . " REAL*4, ALLOCATABLE, SAVE :: SJVALUE(:,:,:) \n" . " REAL*4, ALLOCATABLE, SAVE :: COPROD(:,:)\n" . " REAL*4, ALLOCATABLE, SAVE :: COLOSS(:,:)\n" . "\n" . " ! REAL*8 variables\n" . " REAL*8 :: k0, k1, k2, k3, XTAU\n" . " REAL*8 :: DTCHEM, RDLOSS, T1L, M, TK, RC \n" . "\n" . " ! External functions\n" . " REAL*8, EXTERNAL :: BOXVL\n" . "\n" . " !=================================================================\n" . " ! SCHEM begins here!\n" . " !=================================================================\n" . "\n" . " ! Chemistry timestep [s]\n" . " DTCHEM = GET_TS_CHEM() * 60d0\n" . "\n" . " ! Echo info\n" . " STAMP = TIMESTAMP_STRING()\n" . " WRITE( 6, 100 ) STAMP\n" . " 100 FORMAT( ' - SCHEM: Strat chemistry at ', a )\n" . "\n" . " !=================================================================\n" . " ! If it is the first call to SCHEM, allocate arrays for reading \n" . " ! data. These arrays are declared SAVE so they will be preserved \n" . " ! between calls. \n" . " !=================================================================\n" . " IF ( FIRST ) THEN \n" . " ALLOCATE( STRATOH( JJPAR, LLPAR ), STAT=IOS )\n" . " IF ( IOS /= 0 ) CALL ALLOC_ERR( 'STRATOH' )\n" . " STRATOH = 0e0\n" . "\n" . " ALLOCATE( SJVALUE( JJPAR, LLPAR, NSPHOTO ), STAT=IOS )\n" . " IF ( IOS /= 0 ) CALL ALLOC_ERR( 'SJVALUE' )\n" . " SJVALUE = 0e0\n" . "\n" . " ALLOCATE( COPROD( JJPAR, LLPAR ), STAT=IOS )\n" . " IF ( IOS /= 0 ) CALL ALLOC_ERR( 'COPROD' )\n" . " COPROD = 0e0\n" . "\n" . " ALLOCATE( COLOSS( JJPAR, LLPAR ), STAT=IOS )\n" . " IF ( IOS /= 0 ) CALL ALLOC_ERR( 'COLOSS' )\n" . " COLOSS = 0e0\n" . " ENDIF\n" . "\n" . " !=================================================================\n" . " ! If it is a new month (or the first call to SCHEM), \n" . " ! do the following:\n" . " !\n" . " ! (1) Read archived J-values and store in SJVALUE\n" . " ! (2) Read archived CO production rates and store in COPROD\n" . " ! (3) Read archived CO loss rates and store in COLOSS\n" . " !\n" . " ! NOTES\n" . " ! (a) All of the above-mentioned data are stored in binary punch \n" . " ! files, for ease of use. \n" . " !\n" . " ! (b) STRATOH, SJVALUE, CO_PROD, and CO_LOSS are now declared \n" . " ! as both ALLOCATABLE and SAVE. If SCHEM is called, then \n" . " ! data will be declared for these arrays, and the values in \n" . " ! these arrays will be preserved between calls. \n" . " !\n" . " ! (c) If SCHEM is never called (i.e. if you are running another \n" . " ! type of chemistry simulation), then memory never gets \n" . " ! allocated to STRATOH, SJVALUE, CO_PROD, and CO_LOSS. \n" . " ! This saves on computational resources. \n" . " !=================================================================\n" . " IF ( GET_MONTH() /= MONTHSAVE .or. FIRST ) THEN\n" . " MONTHSAVE = GET_MONTH()\n" . " \n" . " ! TAU value at the beginning of this month\n" . " XTAU = GET_TAU0( GET_MONTH(), 1, 1985 )\n" . "\n" . " !==============================================================\n" . " ! Read this month's OH \n" . " !==============================================================\n" . " FILENAME = TRIM( DATA_DIR ) // 'stratOH_200203/stratOH.' // \n" . " & GET_NAME_EXT() // '.' // \n" . " & GET_RES_EXT()\n" . "\n" . " ! Read data\n" . " CALL READ_BPCH2( FILENAME, 'CHEM-L=\$', 1, \n" . " & XTAU, 1, JGLOB, \n" . " & LGLOB, ARRAY, QUIET=.TRUE. )\n" . "\n" . " ! Cast from REAL*4 to REAL*8 and resize to (JJPAR,LLPAR)\n" . " CALL TRANSFER_ZONAL( ARRAY(1,:,:), STRATOH )\n" . " \n" . " !==============================================================\n" . " ! Read in monthly mean archived J-values\n" . " !==============================================================\n" . " FILENAME = TRIM( DATA_DIR ) // 'stratjv_200203/stratjv.' //\n" . " & GET_NAME_EXT() // '.' // \n" . " & GET_RES_EXT()\n" . "\n" . " DO NN = 1, NSPHOTO\n" . " N = SPHOTOID(NN)\n" . "\n" . " ! Read data\n" . " CALL READ_BPCH2( FILENAME, 'JV-MAP-\$', N, \n" . " & XTAU, 1, JGLOB, \n" . " & LGLOB, ARRAY, QUIET=.TRUE. )\n" . "\n" . " ! Cast from REAL*4 to REAL*8 and resize to (JJPAR,LLPAR) \n" . " CALL TRANSFER_ZONAL( ARRAY(1,:,:), SJVALUE(:,:,NN) )\n" . " ENDDO\n" . "\n" . " !==============================================================\n" . " ! Read in CO production rates\n" . " !==============================================================\n" . " FILENAME = TRIM( DATA_DIR ) // 'pco_lco_200203/COprod.' //\n" . " & GET_NAME_EXT() // '.' // \n" . " & GET_RES_EXT()\n" . "\n" . " ! Read data\n" . " CALL READ_BPCH2( FILENAME, 'PORL-L=\$', 9, \n" . " & XTAU, 1, JGLOB, \n" . " & LGLOB, ARRAY, QUIET=.TRUE. )\n" . "\n" . " ! Cast from REAL*4 to REAL*8 and resize to (JJPAR,LLPAR) \n" . " CALL TRANSFER_ZONAL( ARRAY(1,:,:), COPROD )\n" . " \n" . " !==============================================================\n" . " ! Read in CO loss rates\n" . " !==============================================================\n" . " FILENAME = TRIM( DATA_DIR ) // 'pco_lco_200203/COloss.' //\n" . " & GET_NAME_EXT() // '.' // \n" . " & GET_RES_EXT()\n" . "\n" . " ! Read data\n" . " CALL READ_BPCH2( FILENAME, 'PORL-L=\$', 10, \n" . " & XTAU, 1, JGLOB, \n" . " & LGLOB, ARRAY, QUIET=.TRUE. )\n" . "\n" . " ! Cast from REAL*4 to REAL*8 and resize to (JJPAR,LLPAR) \n" . " CALL TRANSFER_ZONAL( ARRAY(1,:,:), COLOSS )\n" . "\n" . " ENDIF\n" . "\n" . " !=================================================================\n" . " ! Do photolysis for selected tracers with this \n" . " ! month's archived J-values\n" . " !=================================================================\n" . "\n" . " ! Get the minimum level extent of the ann mean tropopause\n" . " LMIN = GET_MIN_TPAUSE_LEVEL()\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L, N, NN )\n" . "!\$OMP+SCHEDULE( DYNAMIC )\n" . " DO NN = 1, NSPHOTO\n" . " N = SPHOTOID(NN)\n" . "\n" . " DO L = LMIN, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . "\n" . " ! Only proceed for stratospheric boxes\n" . " IF ( ITS_IN_THE_STRAT( I, J, L ) ) THEN\n" . "\n" . " ! Compute photolysis loss \n" . " STT_ADJ(I,J,L,N) = STT_ADJ(I,J,L,N) * \n" . " & EXP( -SJVALUE(J,L,NN) * DTCHEM )\n" . " ENDIF\n" . "\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " !print*, 'In schem, done with photolysis'\n" . "\n" . " !=================================================================\n" . " ! CO is special -- \n" . " ! use archived P, L rates for CO chemistry in stratosphere\n" . " !=================================================================\n" . " CALL CO_STRAT_PL( COPROD, COLOSS )\n" . "\n" . " !=================================================================\n" . " ! Reaction with OH -- compute rate constants for each tracer\n" . " !=================================================================\n" . " !print*, 'In schem, before reaction with OH'\n" . "\n" . "!\$OMP PARALLEL DO\n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( I, J, L, N, M, TK, RC, k0, k1, RDLOSS, T1L )\n" . "!\$OMP+SCHEDULE( DYNAMIC )\n" . " DO N = 1, N_TRACERS\n" . " DO L = LMIN, LLPAR\n" . " DO J = 1, JJPAR\n" . " DO I = 1, IIPAR\n" . "\n" . " ! Only proceed for stratospheric boxes\n" . " IF ( ITS_IN_THE_STRAT( I, J, L ) ) THEN\n" . "\n" . " ! Density of air at grid box (I,J,L) in molec/cm3\n" . " M = AD(I,J,L) / BOXVL(I,J,L) * XNUMOLAIR\n" . "\n" . " ! Temperature at grid box (I,J,L) in K\n" . " TK = T(I,J,L)\n" . "\n" . " ! Select proper reaction rate w/ OH for the given tracer\n" . " ! Some rates are temperature or density dependent\n" . " IF ( N == IDTALK4 ) THEN\n" . " RC = 8.20D-12 * EXP( -300.D0 / TK )\n" . " \n" . " ELSE IF ( N == IDTISOP ) THEN\n" . " RC = 2.55D-11 * EXP( 410.D0 / TK )\n" . "\n" . " ELSE IF ( N == IDTH2O2 ) THEN \n" . " RC = 2.90D-12 * EXP( -160.D0 / TK )\n" . " \n" . " ELSE IF ( N == IDTACET ) THEN\n" . " RC = 1.70D-12 * EXP( -600.D0 / TK )\n" . " \n" . " ELSE IF ( N == IDTMEK ) THEN \n" . " RC = 2.92D-13 * EXP( 414.D0 / TK )\n" . " \n" . " ELSE IF ( N == IDTALD2 ) THEN \n" . " RC = 1.40D-12 * EXP( -1860.D0 / TK )\n" . " \n" . " ELSE IF ( N == IDTRCHO ) THEN \n" . " RC = 2.00D-11\n" . " \n" . " ELSE IF ( N == IDTMVK ) THEN \n" . " RC = 4.13D-12 * EXP( 452.D0 / TK )\n" . " \n" . " ELSE IF ( N == IDTMACR ) THEN \n" . " RC = 1.86D-11 * EXP( -175.D0 / TK )\n" . " \n" . " ELSE IF ( N == IDTPMN ) THEN \n" . " RC = 3.60D-12\n" . "\n" . " ELSE IF ( N == IDTR4N2 ) THEN\n" . " RC = 1.30D-12\n" . " \n" . " ELSE IF ( N == IDTPRPE ) THEN \n" . " k0 = 8.0D-27 * ( 300.D0 / TK )**3.5\n" . " k1 = 3.0D-11\n" . "\n" . " RC = k1 * k0 * M / ( k1 + k0*M )\n" . " RC = RC * 0.5 ** (1 / ( 1 + LOG10( k0*M/k1 )**2 ) )\n" . "\n" . " ELSE IF ( N == IDTC3H8 ) THEN\n" . " RC = 8.00D-12 * EXP( -590.D0 / TK )\n" . " \n" . " ELSE IF ( N == IDTCH2O ) THEN\n" . " RC = 1.00D-12\n" . " \n" . " ELSE IF ( N == IDTC2H6 ) THEN\n" . " RC = 7.9D-12 * EXP( -1030.D0 / TK )\n" . " \n" . " ELSE IF ( N == IDTHNO4 ) THEN\n" . " RC = 1.30D-12 * EXP( 380.D0 / TK )\n" . " \n" . " ELSE IF ( N == IDTMP ) THEN\n" . " RC = 1.14D-12 * EXP( 200.D0 / TK )\n" . "\n" . " ELSE\n" . " RC = 0d0\n" . " \n" . " ENDIF\n" . "\n" . " ! Compute loss with OH based on the rate constants from above\n" . " ! Cap RDLOSS so that it does not exceed 1.0 (bmy, 5/4/00)\n" . " RDLOSS = RC * STRATOH(J,L) * DTCHEM\n" . " RDLOSS = MIN( RDLOSS, 1d0 )\n" . "\n" . " ! T1L is the absolute amount of STT_ADJ lost to rxn with OH\n" . " ! Subtract T1L from STT_ADJ \n" . " T1L = STT_ADJ(I,J,L,N) * RDLOSS\n" . " STT_ADJ(I,J,L,N) = STT_ADJ(I,J,L,N) - T1L\n" . " \n" . " ! Oxidation of PRPE as source of ACET with 80% yield\n" . " IF ( N == IDTPRPE ) THEN\n" . " STT_ADJ(I,J,L,IDTACET) = STT_ADJ(I,J,L,IDTACET) +\n" . " & 0.8d0 * T1L * \n" . " & TRACER_MW_KG(IDTACET) / TRACER_MW_KG(IDTPRPE)\n" . " ENDIF\n" . " ENDIF\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . " ENDDO\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " ! Set FIRST = .FALSE. -- we have been thru SCHEM at least once now\n" . " FIRST = .FALSE.\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE SCHEM_ADJ\n"; close(FILE); } #============================================= # Create setemis_adj.f #============================================= sub createSetEmisAdj() { printf "Creating setemis_adj.f\n"; open(FILE, ">setemis_adj.f") || die "Unable to open setemis_adj.f"; print FILE "! \$Id: setemis.f,v 1.12 2006/10/17 17:51:16 bmy Exp \$\n" . " SUBROUTINE SETEMIS_ADJ( EMISRR, EMISRRN )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine SETEMIS places emissions computed from GEOS-Chem\n" . "! subroutines into arrays for SMVGEAR II chemistry. \n" . "! (lwh, jyl, gmg, djj, bdf, bmy, 6/8/98, 9/27/06)\n" . "!\n" . "! SETEMIS converts from units of [molec tracer/box/s] to units of\n" . "! [molec chemical species/cm3/s], and stores in the REMIS array. For\n" . "! hydrocarbons that are carried through the GEOS-CHEM model as [molec C], \n" . "! these are converted back to [molec hydrocarbon], and then stored in REMIS. \n" . "!\n" . "! REMIS(JLOOP,N) = emis. rate of species corr. to tracer N in box JLOOP\n" . "! (reaction number NTEMIS(N))\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) EMISRR (REAL*8 ) : CO, hydrocarbon emission [molec tracer/box/s ]\n" . "! (2 ) EMISRRN (REAL*8 ) : Multi-level NOx emissions [molec NOx/box/s ]\n" . "!\n" . "! Variables taken from F90 Modules:\n" . "! ============================================================================\n" . "! (1 ) BIOFUEL (REAL*8 ) : Biofuel burning emissions [molec (C)/cm3/s ]\n" . "! (2 ) BFTRACE (INTEGER) : Index array for biofuels [CTM tracer # ]\n" . "! (3 ) NBFTRACE (INTEGER) : Number of biofuel species [unitless ]\n" . "! (4 ) BURNEMIS (REAL*8 ) : Biomass burning emissions [molec (C)/cm3/s ] \n" . "! (5 ) BIOTRCE (INTEGER) : Index array for bioburn [CTM tracer # ] \n" . "! (6 ) NBIOTRCE (INTEGER) : Number of bioburn species [unitless ]\n" . "! (7 ) JLOP (INTEGER) : SMVGEAR grid box index [unitless ]\n" . "! (8 ) REMIS (REAL*8 ) : SMVGEAR emissions array [molec species/cm3/s]\n" . "! (9 ) VOLUME (REAL*8 ) : SMVGEAR volume array [cm3 ]\n" . "!\n" . "! NOTES: \n" . "! (1 ) Original code from Harvard Tropospheric Chemistry Module for 3-D \n" . "! applications by Larry Horowitz, Jinyou Liang, Gerry Gardner, \n" . "! Prof. Daniel Jacob of Harvard University (Release V2.0) \n" . "! (2 ) New version 3.0 by Bob Yantosca to place NOx emissions into boxes \n" . "! above the surface. (bmy, 6/8/98) \n" . "! (3 ) Also now do chemistry up to the location of the annual mean \n" . "! tropopause (bmy, 12/9/99) \n" . "! (4 ) BURNEMIS is now dynamically allocatable and is contained in F90 \n" . "! module \"biomass_mod.f\". BIOTRCE and NBIOTRCE are also contained\n" . "! in \"biomass_mod.f\". (bmy, 9/12/00) \n" . "! (5 ) BIOFUEL is now dynamically allocatable and is contained in F90\n" . "! module \"biofuel_mod.f\". BFTRACE and NBFTRACE are also contained\n" . "! in \"biofuel_mod.f\" (bmy, 9/12/00, 4/17/01)\n" . "! (6 ) BURNEMIS and BIOFUEL are now treated as true global arrays, \n" . "! and need to be referenced by the global offset variables \n" . "! IREF = I + I0 and JREF = J + J0 (bmy, 9/12/00) \n" . "! (7 ) Now reference JLOP, REMIS, VOLUME from F90 module \"comode_mod.f\", \n" . "! in order to save memory (bmy, 10/19/00) \n" . "! (8 ) Now add in up to NBFTRACE biofuel species (bmy, 4/17/01) \n" . "! (9 ) Add new subroutine header, updated comments, cosmetic changes.\n" . "! (bmy, 4/17/01) \n" . "! (10) Updated comments -- GEMISNOX is [molec/cm3/s]. (bdf, bmy, 6/7/01) \n" . "! (11) For GEOS-3, we now distributes surface emissions throughout the \n" . "! boundary layer. This is necessary since the first couple of GEOS-3 \n" . "! surface layers are very thin. Piling up of emissions into a small \n" . "! layer will cause SMVGEAR to choke. (bdf, bmy, 6/15/01)\n" . "! (12) Also now reference BFTRACE and NBFTRACE from \"biofuel_mod.f\", \n" . "! and reference AD12 from \"diag_mod.f\". (bdf, bmy, 6/15/01)\n" . "! (13) For GEOS-1, GEOS-STRAT, emit into the surface layer, as we did\n" . "! in prior versions. (bmy, 6/26/01)\n" . "! (14) Bug fix: corrected a typo for the biofuel emissions (bmy, 7/10/01)\n" . "! (15) Bug fix: make sure BIOMASS and BIOFUEL, and SOIL NOx emissions have \n" . "! units of [molec/box/s] before distributing thru the boundary layer. \n" . "! This involves multiplication by VOLUME(JLOOP1) and division by\n" . "! VOLUME(JLOOP). (bmy, 7/16/01)\n" . "! (16) XTRA2(IREF,JREF,5) is now XTRA2(I,J). BIOFUEL(:,IREF,JREF) is now\n" . "! BIOFUEL(:,I,J). BURNEMIS(:,IREF,JREF) is now BURNEMIS(:,I,J).\n" . "! Replace PW(I,J) with P(I,J). (bmy, 9/28/01)\n" . "! (17) Removed obsolete code from 9/01 (bmy, 10/24/01)\n" . "! (18) Now references GET_PEDGE from \"pressure_mod.f\", to compute P at \n" . "! the bottom edge of grid box (I,J,L). (dsa, bdf, bmy, 8/21/02)\n" . "! (19) Now reference IDTNOX, IDENOX, etc from \"tracerid_mod.f\" (bmy, 11/6/02)\n" . "! (20) Remove references to IREF, JREF (bmy, 2/11/03)\n" . "! (21) NEMIS is now NEMIS(NCS) for SMVGEAR II (gcc, bdf, bmy, 4/1/03)\n" . "! (22) Added parallel loop over N. Also directly substituted JLOP(I,J,1) \n" . "! for all instances of JLOOP1. Updated comments. (hamid, bmy, 3/19/04)\n" . "! (23) Bug fix for COMPAQ compiler...do not use EXIT from w/in parallel loop.\n" . "! (auvray, bmy, 11/29/04)\n" . "! (24) Now replace XTRA2 with GET_PBL_TOP_L in \"pbl_mix_mod.f\". Now remove\n" . "! reference to CMN, it's obsolete. Now references GET_TPAUSE_LEVEL\n" . "! from \"tropopause_mod.f\" (bmy, 8/22/05)\n" . "! (25) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)\n" . "! (26) Now updated for new \"biomass_mod.f\" (bmy, 4/5/06)\n" . "! (27) Now account for the different definition of tropopause in case \n" . "! of variable tropopause. The BIOMASS array from \"biomass_mod.f\" is \n" . "! now in units of [molec CO/cm2/s]. Adjust unit conversion accordingly.\n" . "! Also replace NBIOMAX with NBIOMAX_GAS, since aerosol biomass is\n" . "! handled elsewhere. (bdf, phs, bmy, 9/27/06)\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules \n" . " USE BIOFUEL_MOD, ONLY : BIOFUEL, BFTRACE, NBFTRACE\n" . " !----------------------------------------------------------------------\n" . " ! Prior to 9/27/06:\n" . " ! Now reference NBIOMAX_GAS instead of NBIOMAX, so that we only loop\n" . " ! over the gas-phase species. Aerosol biomass is handled elsewhere.\n" . " ! (bmy, 9/27/06)\n" . " !USE BIOMASS_MOD, ONLY : BIOMASS, BIOTRCE, NBIOMAX\n" . " !----------------------------------------------------------------------\n" . " USE BIOMASS_MOD, ONLY : BIOMASS, BIOTRCE, NBIOMAX_GAS\n" . " USE COMODE_MOD, ONLY : JLOP, REMIS, VOLUME\n" . " USE COMODE_MOD, ONLY : IYSAVE, EMIS_RATE\n" . " USE DIAG_MOD, ONLY : AD12\n" . " USE GRID_MOD, ONLY : GET_AREA_CM2\n" . " USE LOGICAL_MOD, ONLY : LVARTROP\n" . " USE PBL_MIX_MOD, ONLY : GET_PBL_TOP_L\n" . " USE PRESSURE_MOD, ONLY : GET_PEDGE\n" . " USE TRACERID_MOD, ONLY : CTRMB, IDEMIS, IDENOX\n" . " USE TROPOPAUSE_MOD, ONLY : GET_TPAUSE_LEVEL\n" . "\n" . " IMPLICIT NONE\n" . "\n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"CMN_NOX\" ! GEMISNOX, GEMISNOX2\n" . "# include \"CMN_DIAG\" ! Diagnostic flags\n" . "# include \"comode.h\" ! IDEMS, NEMIS\n" . "\n" . " ! Arguments\n" . " REAL*8, INTENT(IN) :: EMISRR(IIPAR,JJPAR,2:NEMPARA+NEMPARB)\n" . " REAL*8, INTENT(IN) :: EMISRRN(IIPAR,JJPAR,NOXEXTENT) \n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, JLOOP, JLOOP1, LTROP\n" . " INTEGER :: L, LL, N, NN, NBB, NBF, TOP\n" . " REAL*8 :: COEF1, TOTPRES, DELTPRES\n" . " REAL*8 :: EMIS_BL, NOXTOT, TOTAL, A_CM2\n" . " INTEGER :: IT_NUM\n" . " LOGICAL, SAVE :: FIRSTIME = .TRUE.\n" . "\n" . " !=================================================================\n" . " ! SETEMIS begins here!\n" . " !=================================================================\n" . "\n" . " EMIS_RATE = 0d0\n" . "\n" . " open(20,file='ITER')\n" . " read(20,*)IT_NUM\n" . " close(20)\n" . "\n" . "!\$OMP PARALLEL DO \n" . "!\$OMP+DEFAULT( SHARED )\n" . "!\$OMP+PRIVATE( N, NN, NBB, NBF, I, J, L, JLOOP )\n" . "!\$OMP+PRIVATE( COEF1, TOP, TOTPRES, NOXTOT, DELTPRES, EMIS_BL, A_CM2 )\n" . "!\$OMP+SCHEDULE( DYNAMIC )\n" . "\n" . " ! Loop over emission species\n" . " DO N = 1, NEMIS(NCS)\n" . "\n" . " ! Get CTM tracer number NN corresponding to emission species N\n" . " NN = IDEMS(N)\n" . " IF ( NN == 0 ) CYCLE\n" . "\n" . " ! We have to search for the biomass burning species in \n" . " ! BIOTRCE with the same CTM tracer number NN as in IDEMS\n" . " NBB = 0\n" . " IF ( ALLOCATED( BIOMASS ) ) THEN \n" . " !---------------------------------------------------------------\n" . " ! Prior to 9/27/06:\n" . " ! Use NBIOMAX_GAS=10 instead of NBIOMAX=15 (bmy, 9/27/060\n" . " !DO I = 1, NBIOMAX\n" . " !---------------------------------------------------------------\n" . " DO I = 1, NBIOMAX_GAS\n" . " IF ( BIOTRCE(I) == NN ) THEN \n" . " NBB = I\n" . "#if defined( COMPAQ )\n" . " ! COMPAQ has an issue with EXIT from w/in parallel loop\n" . " ! (auvray, bmy, 11/29/04)\n" . "#else\n" . " EXIT\n" . "#endif\n" . " ENDIF\n" . " ENDDO\n" . " ENDIF\n" . "\n" . " ! We have to search for the biofuel burning species in \n" . " ! BFTRACE with the same CTM tracer number NN as in IDEMS\n" . " NBF = 0\n" . " IF ( ALLOCATED( BIOFUEL ) ) THEN\n" . " DO I = 1, NBFTRACE\n" . " IF ( BFTRACE(I) == NN ) THEN\n" . " NBF = I\n" . "#if defined( COMPAQ )\n" . " ! COMPAQ has an issue with EXIT from w/in parallel loop\n" . " ! (auvray, bmy, 11/29/04)\n" . "#else\n" . " EXIT\n" . "#endif \n" . " ENDIF\n" . " ENDDO\n" . " ENDIF \n" . "\n" . " ! Initialize REMIS(*,N) -- the emission rate array\n" . " DO JLOOP = 1, NTTLOOP\n" . " REMIS(JLOOP,N) = 0d0\n" . " ENDDO \n" . "\n" . " ! COEF1 = molecules of emission species / molecules of tracer\n" . " COEF1 = 1.0 + CTRMB(NN, IDEMIS(NN)) \n" . "\n" . " ! Loop over Lat and Long boxes\n" . " DO J = 1, NLAT\n" . " DO I = 1, NLONG\n" . "\n" . " !===========================================================\n" . " ! For GEOS-3: distribute surface emissions throughout the\n" . " ! entire boundary layer. Define some variables here.\n" . " ! (bdf, 6/15/01)\n" . " !===========================================================\n" . "\n" . " ! Top level of the boundary layer\n" . " ! guard for b.l. being in first level.\n" . " TOP = FLOOR( GET_PBL_TOP_L( I, J ) )\n" . " IF ( TOP == 0 ) TOP = 1\n" . "\n" . " ! Pressure thickness of entire boundary layer [hPa]\n" . " TOTPRES = GET_PEDGE(I,J,1) - GET_PEDGE(I,J,TOP+1)\n" . "\n" . " ! For NOx only....\n" . " IF ( N == IDENOX ) THEN\n" . "\n" . " !========================================================\n" . " ! Anthropogenic NOx emissions [molec/box/s]\n" . " ! Distribute emissions thru the entire boundary layer\n" . " !========================================================\n" . "\n" . " ! Sum anthro NOx emissions over all levels [molec NOx/box/s]\n" . " NOXTOT = 0d0\n" . " DO L = 1, NOXEXTENT\n" . " NOXTOT = NOXTOT + EMISRRN(I,J,L)\n" . " ENDDO\n" . "\n" . " ! Loop over the boundary layer\n" . " DO L = 1, TOP\n" . " JLOOP = JLOP(I,J,L)\n" . " EMIS_BL = 0d0\n" . "\n" . " IF ( JLOOP /= 0 ) THEN\n" . "\n" . " ! Thickness of level L [mb]\n" . " DELTPRES = GET_PEDGE(I,J,L) - GET_PEDGE(I,J,L+1)\n" . "\n" . " ! Of the total anthro NOx, the fraction DELTPRES/TOTPRES\n" . " ! goes into level L, since that is the fraction of the\n" . " ! boundary layer occupied by level L. Also divide NOx \n" . " ! by COEF1 to convert from [molec NOx/box/s] to \n" . " ! [molec NO/box/s], which is really what gets emitted.\n" . " EMIS_BL = ( NOXTOT / COEF1 ) *\n" . " & ( DELTPRES / TOTPRES )\n" . "\n" . " ! Convert anthro NOx emissions from [molec NO/box/s]\n" . " ! to [molec NO/cm3/s] and store in the REMIS array\n" . " REMIS(JLOOP,N) = EMIS_BL / VOLUME(JLOOP)\n" . " !-----------SAVING INDIVIDUAL EMISSIONS--------------!\n" . " EMIS_RATE(JLOOP,1) = EMIS_BL / VOLUME(JLOOP)\n" . " !----------------------------------------------------!\n" . " ENDIF\n" . " ENDDO\n" . "\n" . " !========================================================\n" . " ! Soil Nox emissions [molec/cm3/s] \n" . " ! Distribute emissions thru the entire boundary layer\n" . " !========================================================\n" . " DO L = 1, TOP\n" . " JLOOP = JLOP(I,J,L)\n" . " EMIS_BL = 0d0\n" . "\n" . " IF ( JLOOP /= 0 ) THEN\n" . "\n" . " ! Thickness of level L [mb]\n" . " DELTPRES = GET_PEDGE(I,J,L) - GET_PEDGE(I,J,L+1)\n" . " \n" . " ! Soil NOx is in [molec/cm3/s], so we need to multiply\n" . " ! by VOLUME(JLOP(I,J,1)) to convert it to [molec/box/s],\n" . " ! VOLUME(JLOP(I,J,1)) is the volume in cm3 of the surface\n" . " ! grid box (I,J,1). Then we need to divide that by \n" . " ! COEF1 to convert from [molec NOx/box/s] to \n" . " ! [molec NO/box/s], which is really what gets emitted. \n" . " ! Of the total soil NOx, the fraction DELTPRES/TOTPRES \n" . " ! goes into level L, since that is the fraction of the \n" . " ! boundary layer occupied by level L. Store in EMIS_BL.\n" . " EMIS_BL = ( GEMISNOX2(I,J) *\n" . " & VOLUME( JLOP(I,J,1) ) / COEF1 ) * \n" . " & ( DELTPRES / TOTPRES )\n" . "\n" . " ! Since EMIS_BL is in [molec NO/box/s], we have to\n" . " ! divide by VOLUME(JLOOP), which is the volume of the\n" . " ! grid box (I,J,L) to convert back to [molec/cm3/s].\n" . " ! Store in the REMIS array for SMVGEAR.\n" . " REMIS(JLOOP,N) = REMIS(JLOOP,N) + \n" . " & ( EMIS_BL / VOLUME(JLOOP) ) \n" . " !-----------SAVING INDIVIDUAL EMISSIONS--------------!\n" . " EMIS_RATE(JLOOP,2) = EMIS_BL / VOLUME(JLOOP)\n" . " !----------------------------------------------------!\n" . " ENDIF\n" . " ENDDO\n" . "\n" . " !========================================================\n" . " ! Aircraft and Lightning NOx [molec/cm3/s]\n" . " ! Distribute emissions in the troposphere\n" . " !========================================================\n" . "\n" . " ! bdf - variable tropopause is a tropospheric box\n" . " IF ( LVARTROP ) THEN \n" . " LTROP = GET_TPAUSE_LEVEL( I, J ) \n" . " ELSE\n" . " LTROP = GET_TPAUSE_LEVEL( I, J ) - 1\n" . " ENDIF\n" . "\n" . "\n" . " DO L = 1, LTROP \n" . " JLOOP = JLOP(I,J,L)\n" . " EMIS_BL = 0d0\n" . "\n" . " IF ( JLOOP /= 0 ) THEN\n" . "\n" . " ! Divide aircraft & lightning NOx by COEF1 to convert\n" . " ! from [molec NOx/cm3/s] to [molec NO/cm3/s], since\n" . " ! NO is the actual emission species for NOx.\n" . " EMIS_BL = GEMISNOX(I,J,L) / COEF1\n" . "\n" . " ! Save aircraft/lightning NOx [molec NO/cm3/s] in REMIS\n" . " REMIS(JLOOP,N) = REMIS(JLOOP,N) + EMIS_BL\n" . " !-----------SAVING INDIVIDUAL EMISSIONS--------------!\n" . " EMIS_RATE(JLOOP,3) = EMIS_BL\n" . " !----------------------------------------------------!\n" . " ENDIF\n" . " ENDDO\n" . "\n" . " ELSE\n" . "\n" . " !========================================================\n" . " ! Anthropogenic tracers other than NOx [molec/box/s]\n" . " ! Distribute emissions thru the entire boundary layer\n" . " !========================================================\n" . " DO L = 1, TOP\n" . " JLOOP = JLOP(I,J,L)\n" . " EMIS_BL = 0d0\n" . "\n" . " IF ( JLOOP /= 0 ) THEN \n" . "\n" . " ! Thickness of level L [mb]\n" . " DELTPRES = GET_PEDGE(I,J,L) - GET_PEDGE(I,J,L+1)\n" . "\n" . " ! Of the total tracer, the fraction DELTPRES/TOTPRES\n" . " ! goes into level L, since that is the fraction of the\n" . " ! boundary layer occupied by level L. Also divide the\n" . " ! tracer by COEF1 to convert from [molec tracer/box/s] \n" . " ! to [molec species/box/s]. For example, ISOPRENE is\n" . " ! carried by GEOS-CHEM as 5 carbons, so you would divide\n" . " ! by 5 to get \"effective molecules\" of ISOPRENE.\n" . " EMIS_BL = ( EMISRR(I,J,N) / COEF1 ) *\n" . " & ( DELTPRES / TOTPRES )\n" . "\n" . " ! Convert emissions from [molec species/box/s] to \n" . " ! [molec species/cm3/s] and store in the REMIS array\n" . " REMIS(JLOOP,N) = EMIS_BL / VOLUME(JLOOP)\n" . " !-----------SAVING INDIVIDUAL EMISSIONS--------------!\n" . " EMIS_RATE(JLOOP,2+N) = EMIS_BL / VOLUME(JLOOP)\n" . " !----------------------------------------------------!\n" . " ENDIF\n" . " ENDDO\n" . " ENDIF\n" . "\n" . " !===========================================================\n" . " ! Add biomass burning source [molec/cm3/s]\n" . " ! Distribute emissions thru the entire boundary layer\n" . " !===========================================================\n" . " IF ( NBB /= 0 ) THEN\n" . " DO L = 1, TOP\n" . " JLOOP = JLOP(I,J,L)\n" . " EMIS_BL = 0d0\n" . "\n" . " IF ( JLOOP /= 0 ) THEN\n" . "\n" . " ! Thickness of level L [mb]\n" . " DELTPRES = GET_PEDGE(I,J,L) - GET_PEDGE(I,J,L+1)\n" . " \n" . "!------------------------------------------------------------------------------\n" . "! Prior to 9/27/06:\n" . "! The BIOMASS array from \"biomass_mod.f\" is now in units of [molec CO/cm2/s].\n" . "! Adjust unit conversion accordingly. (bmy, 9/27/06)\n" . "! ! Biomass burning is in [molec/cm3/s], so we need to \n" . "! ! multiply by VOLUME(JLOP(I,J,1)) to convert it to \n" . "! ! [molec/box/s], VOLUME(JLOP(I,J,1)) is the volume in cm3\n" . "! ! of the surface grid box (I,J,1). Then we need to \n" . "! ! divide that by COEF1 to convert from \n" . "! ! [molec tracer/box/s] to [molec species/cm3/s].\n" . "! ! Of the total biomass burning emissions, the fraction \n" . "! ! DELTPRES/TOTPRES goes into level L, since that is the \n" . "! ! fraction of the boundary layer occupied by level L. \n" . "! ! Store in EMIS_BL.\n" . "! EMIS_BL = ( BIOMASS(I,J,NBB) *\n" . "! & VOLUME( JLOP(I,J,1) ) / COEF1 ) *\n" . "! & ( DELTPRES / TOTPRES )\n" . "!------------------------------------------------------------------------------\n" . " \n" . " ! Grid box area [cm2]\n" . " A_CM2 = GET_AREA_CM2( IYSAVE(JLOOP) )\n" . " \n" . " ! Biomass burning is in [molec/cm2/s], so we need to \n" . " ! multiply by A_CM2 to convert it to [molec/box/s].\n" . " ! Then we need to divide that by COEF1 to convert from \n" . " ! [molec tracer/box/s] to [molec species/box/s].\n" . " ! Of the total biomass burning emissions, the fraction \n" . " ! DELTPRES/TOTPRES goes into level L, since that is the \n" . " ! fraction of the boundary layer occupied by level L. \n" . " ! Store in EMIS_BL.\n" . " EMIS_BL = ( BIOMASS(I,J,NBB) * A_CM2 / COEF1 ) *\n" . " & ( DELTPRES / TOTPRES )\n" . "\n" . " ! Since EMIS_BL is in [molec species/box/s], we \n" . " ! have to divide by VOLUME(JLOOP), which is the \n" . " ! volume of the grid box (I,J,L) to convert back to \n" . " ! [molec species/cm3/s]. Store in the REMIS array.\n" . " REMIS(JLOOP,N) = REMIS(JLOOP,N) + \n" . " & ( EMIS_BL / VOLUME(JLOOP) )\n" . " !-----------SAVING INDIVIDUAL EMISSIONS--------------!\n" . " EMIS_RATE(JLOOP,13+N) = EMIS_BL / VOLUME(JLOOP)\n" . " !----------------------------------------------------!\n" . " ENDIF\n" . " ENDDO\n" . " ENDIF\n" . "\n" . " !===========================================================\n" . " ! Add biofuel burning source [molec/cm3/s]\n" . " ! Distribute emissions thru the entire boundary layer \n" . " !===========================================================\n" . " IF ( NBF /= 0 ) THEN\n" . " DO L = 1, TOP\n" . " JLOOP = JLOP(I,J,L)\n" . " EMIS_BL = 0d0\n" . "\n" . " IF ( JLOOP /= 0 ) THEN\n" . "\n" . " ! Thickness of level L [mb]\n" . " DELTPRES = GET_PEDGE(I,J,L) - GET_PEDGE(I,J,L+1)\n" . "\n" . " ! Biofuel burning is in [molec/cm3/s], so we need to \n" . " ! multiply by VOLUME(JLOP(I,J,1)) to convert it to \n" . " ! [molec/box/s], VOLUME(JLOP(I,J,1)) is the volume in cm3 \n" . " ! of the surface grid box (I,J,1). Then we need to \n" . " ! divide that by COEF1 to convert from \n" . " ! [molec tracer/box/s] to [molec species/box/s].\n" . " ! Of the total biofuel burning emissions, the fraction \n" . " ! DELTPRES/TOTPRES goes into level L, since that is the \n" . " ! fraction of the boundary layer occupied by level L. \n" . " ! Store in EMIS_BL.\n" . " EMIS_BL = ( BIOFUEL(NBF,I,J) *\n" . " & VOLUME( JLOP(I,J,1) ) / COEF1 ) *\n" . " & ( DELTPRES / TOTPRES )\n" . "\n" . " ! Since EMIS_BL is in [molec species/box/s], we \n" . " ! have to divide by VOLUME(JLOOP), which is the \n" . " ! volume of the grid box (I,J,L) to convert back to \n" . " ! [molec species/cm3/s]. Store in the REMIS array.\n" . " REMIS(JLOOP,N) = REMIS(JLOOP,N) + \n" . " & ( EMIS_BL / VOLUME(JLOOP) )\n" . " !-----------SAVING INDIVIDUAL EMISSIONS--------------!\n" . " EMIS_RATE(JLOOP,24+N) = EMIS_BL / VOLUME(JLOOP)\n" . " !----------------------------------------------------!\n" . " ENDIF\n" . " ENDDO\n" . " ENDIF\n" . "\n" . " !===========================================================\n" . " ! ND12 Diagnostic: Save the fraction of the boundary layer\n" . " ! occupied by level L into the AD12 diagnostic array.\n" . " !===========================================================\n" . " IF ( N == 1 .and. ND12 > 0 ) THEN\n" . " DO L = 1, MIN( TOP, LD12 )\n" . "\n" . " ! Thickness of layer L [mb]\n" . " DELTPRES = GET_PEDGE(I,J,L) - GET_PEDGE(I,J,L+1)\n" . "\n" . " ! Save boundary layer fraction into AD12\n" . " AD12(I,J,L) = AD12(I,J,L) + ( DELTPRES / TOTPRES )\n" . " ENDDO\n" . " ENDIF\n" . "\n" . " ENDDO ! I\n" . " ENDDO ! J\n" . " ENDDO ! N\n" . "!\$OMP END PARALLEL DO\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE SETEMIS_ADJ\n"; close(FILE); } #============================================= # Create read_teso3_mod.f #============================================= sub createReadTeso3Mod() { printf "Creating read_teso3_mod.f\n"; open(FILE, ">read_teso3_mod.f") || die "Unable to open read_teso3_mod.f"; print FILE "!\$ read_sciao3_mod.f, Kumaresh 2008/24/01; based on read_sciano2_mod.f \n" . "!\$ designed by Daven Henze for geos-3 Adjoint v6\n" . "\n" . " MODULE READ_TESO3_MOD \n" . "\n" . "!---------------------------------------------------------------------\n" . " \n" . " implicit none\n" . " \n" . " CHARACTER(LEN=140) :: SCIA_FILE\n" . "\n" . " ! Location of scia data \n" . " CHARACTER(LEN=140), PARAMETER :: SCIA_DATA_DIR = \n" . " & '/home/kumaresh/GEOS/data/SCIA_DATA/'\n" . " \n" . " CONTAINS \n" . " \n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE CALC_TESO3_FORCE( STT_ADJ )\n" . "!\n" . "!******************************************************************************\n" . "! Subroutine CALC_TESO3_FORCE calculates adjoint forcing and cost function\n" . "! contribution from observations of O3 tropospheric column\n" . "!\n" . "! Arguments as Input:\n" . "! ============================================================================\n" . "! (1 ) STT_ADJ (REAL*8) : Adjoint Variable\n" . "! (2 ) COST_FUNC (REAL*8) : Cost function \n" . "! \n" . "! Arguments as Output:\n" . "! ============================================================================\n" . "! (1 ) STT_ADJ (REAL*8) : Adjoint Variable\n" . "! (2 ) COST_FUNC (REAL*8) : Cost function \n" . "! \n" . "! NOTES:\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! Reference to f90 modules\n" . " USE COMODE_MOD, ONLY : JLOP\n" . " USE TRACERID_MOD, ONLY : IDO3\n" . " USE ERROR_MOD, ONLY : ERROR_STOP\n" . " USE GRID_MOD, ONLY : GET_IJ\n" . " USE TIME_MOD, ONLY : GET_TS_CHEM, GET_NYMD, GET_NHMS, \n" . " & GET_NHMSb, GET_NYMDb\n" . " USE TRACER_MOD, ONLY : N_TRACERS\n" . "\n" . "\n" . "# include \"CMN_SIZE\" ! Size params, PTOP\n" . "\n" . " ! Arguments\n" . " REAL*8, INTENT(INOUT) :: STT_ADJ(IIPAR,JJPAR,LLPAR,N_TRACERS)\n" . " \n" . " ! Local variables \n" . " INTEGER, PARAMETER :: MLGC_TOP = LLTROP\n" . " INTEGER :: TIMESPAN, NP_START, NP_STOP\n" . " REAL :: ALON, ALAT\n" . " INTEGER :: I, J, L, JLOOP, LTM, LGC, NP, IIJJ(2)\n" . " INTEGER :: II,JJ,LL\n" . " INTEGER :: NP_SPAN\n" . " LOGICAL, SAVE :: FIRST = .TRUE. \n" . "\n" . " !=================================================================\n" . " ! CALC_SCIAO3_FORCE begins here!\n" . " !=================================================================\n" . "\n" . " STT_ADJ = 0d0\n" . "\n" . " SCIA_FILE = TRIM( SCIA_DATA_DIR )//'o3lonlat.dat'\n" . "\n" . " open(UNIT=20,file=TRIM(SCIA_FILE))\n" . "\n" . " II = 1\n" . " JJ = 1\n" . " LL = 1\n" . "\n" . " ! Loop over number of pixels in current timespan\n" . " DO NP_SPAN = 1, 125\n" . "\n" . " read(20,*) ALON,ALAT\n" . "\n" . " DO L = 1,LLTROP\n" . "\n" . " ! Get GEOS grid cell of current pixel\n" . " IIJJ = GET_IJ(ALON,ALAT)\n" . " I = IIJJ(1)\n" . " J = IIJJ(2)\n" . "\n" . " \n" . " ! Get JLOOP 1-D coord from I,J,L 3-D coord\n" . " !JLOOP = JLOP(I,J,L) \n" . "\n" . " ! Add this in case I,J,L is not in current trop (dkh)\n" . " !IF ( JLOOP == 0 ) CYCLE\n" . "\n" . " IF( II==I.AND.JJ==J.AND.LL==L) CYCLE\n" . "\n" . " II = I\n" . " JJ = J\n" . " LL = L\n" . "\n" . " ! Calc cost function contribution\n" . "\n" . " STT_ADJ(I,J,L,2) = 1d0\n" . "\n" . " !COST_FUNC = COST_FUNC + STT(I,J,L,2)*STT(I,J,L,2)/2\n" . " \n" . " END DO\n" . " \n" . " ENDDO ! NP\n" . "\n" . " close(20)\n" . "\n" . " ! Return to calling program\n" . " END SUBROUTINE CALC_TESO3_FORCE\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " END MODULE READ_TESO3_MOD\n"; close(FILE); } #============================================= # Create routines.f #============================================= sub createRoutines() { printf "Creating routines.f\n"; open(FILE, ">routines.f") || die "Unable to open routines.f"; print FILE "c================ L-BFGS-B (version 2.1) ==========================\n" . " \n" . " subroutine setulb(n, m, x, l, u, nbd, f, g, factr, pgtol, wa, iwa,\n" . " + task, iprint, csave, lsave, isave, dsave)\n" . " \n" . " character*60 task, csave\n" . " logical lsave(4)\n" . " integer n, m, iprint, \n" . " + nbd(n), iwa(3*n), isave(44)\n" . " double precision f, factr, pgtol, x(n), l(n), u(n), g(n),\n" . " + wa(2*m*n+4*n+12*m*m+12*m), dsave(29)\n" . " \n" . "c ************\n" . "c\n" . "c Subroutine setulb\n" . "c\n" . "c This subroutine partitions the working arrays wa and iwa, and \n" . "c then uses the limited memory BFGS method to solve the bound\n" . "c constrained optimization problem by calling mainlb.\n" . "c (The direct method will be used in the subspace minimization.)\n" . "c\n" . "c n is an integer variable.\n" . "c On entry n is the dimension of the problem.\n" . "c On exit n is unchanged.\n" . "c\n" . "c m is an integer variable.\n" . "c On entry m is the maximum number of variable metric corrections\n" . "c used to define the limited memory matrix.\n" . "c On exit m is unchanged.\n" . "c\n" . "c x is a double precision array of dimension n.\n" . "c On entry x is an approximation to the solution.\n" . "c On exit x is the current approximation.\n" . "c\n" . "c l is a double precision array of dimension n.\n" . "c On entry l is the lower bound on x.\n" . "c On exit l is unchanged.\n" . "c\n" . "c u is a double precision array of dimension n.\n" . "c On entry u is the upper bound on x.\n" . "c On exit u is unchanged.\n" . "c\n" . "c nbd is an integer array of dimension n.\n" . "c On entry nbd represents the type of bounds imposed on the\n" . "c variables, and must be specified as follows:\n" . "c nbd(i)=0 if x(i) is unbounded,\n" . "c 1 if x(i) has only a lower bound,\n" . "c 2 if x(i) has both lower and upper bounds, and\n" . "c 3 if x(i) has only an upper bound.\n" . "c On exit nbd is unchanged.\n" . "c\n" . "c f is a double precision variable.\n" . "c On first entry f is unspecified.\n" . "c On final exit f is the value of the function at x.\n" . "c\n" . "c g is a double precision array of dimension n.\n" . "c On first entry g is unspecified.\n" . "c On final exit g is the value of the gradient at x.\n" . "c\n" . "c factr is a double precision variable.\n" . "c On entry factr >= 0 is specified by the user. The iteration\n" . "c will stop when\n" . "c\n" . "c (f^k - f^{k+1})/max{|f^k|,|f^{k+1}|,1} <= factr*epsmch\n" . "c\n" . "c where epsmch is the machine precision, which is automatically\n" . "c generated by the code. Typical values for factr: 1.d+12 for\n" . "c low accuracy; 1.d+7 for moderate accuracy; 1.d+1 for extremely\n" . "c high accuracy.\n" . "c On exit factr is unchanged.\n" . "c\n" . "c pgtol is a double precision variable.\n" . "c On entry pgtol >= 0 is specified by the user. The iteration\n" . "c will stop when\n" . "c\n" . "c max{|proj g_i | i = 1, ..., n} <= pgtol\n" . "c\n" . "c where pg_i is the ith component of the projected gradient. \n" . "c On exit pgtol is unchanged.\n" . "c\n" . "c wa is a double precision working array of length \n" . "c (2mmax + 4)nmax + 12mmax^2 + 12mmax.\n" . "c\n" . "c iwa is an integer working array of length 3nmax.\n" . "c\n" . "c task is a working string of characters of length 60 indicating\n" . "c the current job when entering and quitting this subroutine.\n" . "c\n" . "c iprint is an integer variable that must be set by the user.\n" . "c It controls the frequency and type of output generated:\n" . "c iprint<0 no output is generated;\n" . "c iprint=0 print only one line at the last iteration;\n" . "c 0100 print details of every iteration including x and g;\n" . "c When iprint > 0, the file iterate.dat will be created to\n" . "c summarize the iteration.\n" . "c\n" . "c csave is a working string of characters of length 60.\n" . "c\n" . "c lsave is a logical working array of dimension 4.\n" . "c On exit with 'task' = NEW_X, the following information is \n" . "c available:\n" . "c If lsave(1) = .true. then the initial X has been replaced by\n" . "c its projection in the feasible set;\n" . "c If lsave(2) = .true. then the problem is constrained;\n" . "c If lsave(3) = .true. then each variable has upper and lower\n" . "c bounds;\n" . "c\n" . "c isave is an integer working array of dimension 44.\n" . "c On exit with 'task' = NEW_X, the following information is \n" . "c available:\n" . "c isave(22) = the total number of intervals explored in the \n" . "c search of Cauchy points;\n" . "c isave(26) = the total number of skipped BFGS updates before \n" . "c the current iteration;\n" . "c isave(30) = the number of current iteration;\n" . "c isave(31) = the total number of BFGS updates prior the current\n" . "c iteration;\n" . "c isave(33) = the number of intervals explored in the search of\n" . "c Cauchy point in the current iteration;\n" . "c isave(34) = the total number of function and gradient \n" . "c evaluations;\n" . "c isave(36) = the number of function value or gradient\n" . "c evaluations in the current iteration;\n" . "c if isave(37) = 0 then the subspace argmin is within the box;\n" . "c if isave(37) = 1 then the subspace argmin is beyond the box;\n" . "c isave(38) = the number of free variables in the current\n" . "c iteration;\n" . "c isave(39) = the number of active constraints in the current\n" . "c iteration;\n" . "c n + 1 - isave(40) = the number of variables leaving the set of\n" . "c active constraints in the current iteration;\n" . "c isave(41) = the number of variables entering the set of active\n" . "c constraints in the current iteration.\n" . "c\n" . "c dsave is a double precision working array of dimension 29.\n" . "c On exit with 'task' = NEW_X, the following information is\n" . "c available:\n" . "c dsave(1) = current 'theta' in the BFGS matrix;\n" . "c dsave(2) = f(x) in the previous iteration;\n" . "c dsave(3) = factr*epsmch;\n" . "c dsave(4) = 2-norm of the line search direction vector;\n" . "c dsave(5) = the machine precision epsmch generated by the code;\n" . "c dsave(7) = the accumulated time spent on searching for\n" . "c Cauchy points;\n" . "c dsave(8) = the accumulated time spent on\n" . "c subspace minimization;\n" . "c dsave(9) = the accumulated time spent on line search;\n" . "c dsave(11) = the slope of the line search function at\n" . "c the current point of line search;\n" . "c dsave(12) = the maximum relative step length imposed in\n" . "c line search;\n" . "c dsave(13) = the infinity norm of the projected gradient;\n" . "c dsave(14) = the relative step length in the line search;\n" . "c dsave(15) = the slope of the line search function at\n" . "c the starting point of the line search;\n" . "c dsave(16) = the square of the 2-norm of the line search\n" . "c direction vector.\n" . "c\n" . "c Subprograms called:\n" . "c\n" . "c L-BFGS-B Library ... mainlb. \n" . "c\n" . "c\n" . "c References:\n" . "c\n" . "c [1] R. H. Byrd, P. Lu, J. Nocedal and C. Zhu, ``A limited\n" . "c memory algorithm for bound constrained optimization'',\n" . "c SIAM J. Scientific Computing 16 (1995), no. 5, pp. 1190--1208.\n" . "c\n" . "c [2] C. Zhu, R.H. Byrd, P. Lu, J. Nocedal, ``L-BFGS-B: a\n" . "c limited memory FORTRAN code for solving bound constrained\n" . "c optimization problems'', Tech. Report, NAM-11, EECS Department,\n" . "c Northwestern University, 1994.\n" . "c\n" . "c (Postscript files of these papers are available via anonymous\n" . "c ftp to eecs.nwu.edu in the directory pub/lbfgs/lbfgs_bcm.)\n" . "c\n" . "c * * *\n" . "c\n" . "c NEOS, November 1994. (Latest revision June 1996.)\n" . "c Optimization Technology Center.\n" . "c Argonne National Laboratory and Northwestern University.\n" . "c Written by\n" . "c Ciyou Zhu\n" . "c in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.\n" . "c\n" . "c\n" . "c ************\n" . " \n" . " integer l1,l2,l3,lws,lr,lz,lt,ld,lsg,lwa,lyg,\n" . " + lsgo,lwy,lsy,lss,lyy,lwt,lwn,lsnd,lygo\n" . "\n" . " if (task .eq. 'START') then\n" . " isave(1) = m*n\n" . " isave(2) = m**2\n" . " isave(3) = 4*m**2\n" . " isave(4) = 1\n" . " isave(5) = isave(4) + isave(1)\n" . " isave(6) = isave(5) + isave(1)\n" . " isave(7) = isave(6) + isave(2)\n" . " isave(8) = isave(7) + isave(2)\n" . " isave(9) = isave(8) + isave(2)\n" . " isave(10) = isave(9) + isave(2)\n" . " isave(11) = isave(10) + isave(3)\n" . " isave(12) = isave(11) + isave(3)\n" . " isave(13) = isave(12) + n\n" . " isave(14) = isave(13) + n\n" . " isave(15) = isave(14) + n\n" . " isave(16) = isave(15) + n\n" . " isave(17) = isave(16) + 8*m\n" . " isave(18) = isave(17) + m\n" . " isave(19) = isave(18) + m\n" . " isave(20) = isave(19) + m \n" . " endif\n" . " l1 = isave(1)\n" . " l2 = isave(2)\n" . " l3 = isave(3)\n" . " lws = isave(4)\n" . " lwy = isave(5)\n" . " lsy = isave(6)\n" . " lss = isave(7)\n" . " lyy = isave(8)\n" . " lwt = isave(9)\n" . " lwn = isave(10)\n" . " lsnd = isave(11)\n" . " lz = isave(12)\n" . " lr = isave(13)\n" . " ld = isave(14)\n" . " lt = isave(15)\n" . " lwa = isave(16)\n" . " lsg = isave(17)\n" . " lsgo = isave(18)\n" . " lyg = isave(19)\n" . " lygo = isave(20)\n" . "\n" . " call mainlb(n,m,x,l,u,nbd,f,g,factr,pgtol,\n" . " + wa(lws),wa(lwy),wa(lsy),wa(lss),wa(lyy),wa(lwt),\n" . " + wa(lwn),wa(lsnd),wa(lz),wa(lr),wa(ld),wa(lt),\n" . " + wa(lwa),wa(lsg),wa(lsgo),wa(lyg),wa(lygo),\n" . " + iwa(1),iwa(n+1),iwa(2*n+1),task,iprint,\n" . " + csave,lsave,isave(22),dsave)\n" . "\n" . " return\n" . "\n" . " end\n" . "\n" . "c======================= The end of setulb =============================\n" . " \n" . " subroutine mainlb(n, m, x, l, u, nbd, f, g, factr, pgtol, ws, wy,\n" . " + sy, ss, yy, wt, wn, snd, z, r, d, t, wa, sg,\n" . " + sgo, yg, ygo, index, iwhere, indx2, task,\n" . " + iprint, csave, lsave, isave, dsave)\n" . " \n" . " character*60 task, csave\n" . " logical lsave(4)\n" . " integer n, m, iprint, nbd(n), index(n),\n" . " + iwhere(n), indx2(n), isave(23)\n" . " double precision f, factr, pgtol,\n" . " + x(n), l(n), u(n), g(n), z(n), r(n), d(n), t(n), \n" . " + wa(8*m), sg(m), sgo(m), yg(m), ygo(m), \n" . " + ws(n, m), wy(n, m), sy(m, m), ss(m, m), yy(m, m),\n" . " + wt(m, m), wn(2*m, 2*m), snd(2*m, 2*m), dsave(29)\n" . "\n" . "c ************\n" . "c\n" . "c Subroutine mainlb\n" . "c\n" . "c This subroutine solves bound constrained optimization problems by\n" . "c using the compact formula of the limited memory BFGS updates.\n" . "c \n" . "c n is an integer variable.\n" . "c On entry n is the number of variables.\n" . "c On exit n is unchanged.\n" . "c\n" . "c m is an integer variable.\n" . "c On entry m is the maximum number of variable metric\n" . "c corrections allowed in the limited memory matrix.\n" . "c On exit m is unchanged.\n" . "c\n" . "c x is a double precision array of dimension n.\n" . "c On entry x is an approximation to the solution.\n" . "c On exit x is the current approximation.\n" . "c\n" . "c l is a double precision array of dimension n.\n" . "c On entry l is the lower bound of x.\n" . "c On exit l is unchanged.\n" . "c\n" . "c u is a double precision array of dimension n.\n" . "c On entry u is the upper bound of x.\n" . "c On exit u is unchanged.\n" . "c\n" . "c nbd is an integer array of dimension n.\n" . "c On entry nbd represents the type of bounds imposed on the\n" . "c variables, and must be specified as follows:\n" . "c nbd(i)=0 if x(i) is unbounded,\n" . "c 1 if x(i) has only a lower bound,\n" . "c 2 if x(i) has both lower and upper bounds,\n" . "c 3 if x(i) has only an upper bound.\n" . "c On exit nbd is unchanged.\n" . "c\n" . "c f is a double precision variable.\n" . "c On first entry f is unspecified.\n" . "c On final exit f is the value of the function at x.\n" . "c\n" . "c g is a double precision array of dimension n.\n" . "c On first entry g is unspecified.\n" . "c On final exit g is the value of the gradient at x.\n" . "c\n" . "c factr is a double precision variable.\n" . "c On entry factr >= 0 is specified by the user. The iteration\n" . "c will stop when\n" . "c\n" . "c (f^k - f^{k+1})/max{|f^k|,|f^{k+1}|,1} <= factr*epsmch\n" . "c\n" . "c where epsmch is the machine precision, which is automatically\n" . "c generated by the code.\n" . "c On exit factr is unchanged.\n" . "c\n" . "c pgtol is a double precision variable.\n" . "c On entry pgtol >= 0 is specified by the user. The iteration\n" . "c will stop when\n" . "c\n" . "c max{|proj g_i | i = 1, ..., n} <= pgtol\n" . "c\n" . "c where pg_i is the ith component of the projected gradient.\n" . "c On exit pgtol is unchanged.\n" . "c\n" . "c ws, wy, sy, and wt are double precision working arrays used to\n" . "c store the following information defining the limited memory\n" . "c BFGS matrix:\n" . "c ws, of dimension n x m, stores S, the matrix of s-vectors;\n" . "c wy, of dimension n x m, stores Y, the matrix of y-vectors;\n" . "c sy, of dimension m x m, stores S'Y;\n" . "c ss, of dimension m x m, stores S'S;\n" . "c yy, of dimension m x m, stores Y'Y;\n" . "c wt, of dimension m x m, stores the Cholesky factorization\n" . "c of (theta*S'S+LD^(-1)L'); see eq.\n" . "c (2.26) in [3].\n" . "c\n" . "c wn is a double precision working array of dimension 2m x 2m\n" . "c used to store the LEL^T factorization of the indefinite matrix\n" . "c K = [-D -Y'ZZ'Y/theta L_a'-R_z' ]\n" . "c [L_a -R_z theta*S'AA'S ]\n" . "c\n" . "c where E = [-I 0]\n" . "c [ 0 I]\n" . "c\n" . "c snd is a double precision working array of dimension 2m x 2m\n" . "c used to store the lower triangular part of\n" . "c N = [Y' ZZ'Y L_a'+R_z']\n" . "c [L_a +R_z S'AA'S ]\n" . "c \n" . "c z(n),r(n),d(n),t(n),wa(8*m) are double precision working arrays.\n" . "c z is used at different times to store the Cauchy point and\n" . "c the Newton point.\n" . "c\n" . "c sg(m),sgo(m),yg(m),ygo(m) are double precision working arrays. \n" . "c\n" . "c index is an integer working array of dimension n.\n" . "c In subroutine freev, index is used to store the free and fixed\n" . "c variables at the Generalized Cauchy Point (GCP).\n" . "c\n" . "c iwhere is an integer working array of dimension n used to record\n" . "c the status of the vector x for GCP computation.\n" . "c iwhere(i)=0 or -3 if x(i) is free and has bounds,\n" . "c 1 if x(i) is fixed at l(i), and l(i) .ne. u(i)\n" . "c 2 if x(i) is fixed at u(i), and u(i) .ne. l(i)\n" . "c 3 if x(i) is always fixed, i.e., u(i)=x(i)=l(i)\n" . "c -1 if x(i) is always free, i.e., no bounds on it.\n" . "c\n" . "c indx2 is an integer working array of dimension n.\n" . "c Within subroutine cauchy, indx2 corresponds to the array iorder.\n" . "c In subroutine freev, a list of variables entering and leaving\n" . "c the free set is stored in indx2, and it is passed on to\n" . "c subroutine formk with this information.\n" . "c\n" . "c task is a working string of characters of length 60 indicating\n" . "c the current job when entering and leaving this subroutine.\n" . "c\n" . "c iprint is an INTEGER variable that must be set by the user.\n" . "c It controls the frequency and type of output generated:\n" . "c iprint<0 no output is generated;\n" . "c iprint=0 print only one line at the last iteration;\n" . "c 0100 print details of every iteration including x and g;\n" . "c When iprint > 0, the file iterate.dat will be created to\n" . "c summarize the iteration.\n" . "c\n" . "c csave is a working string of characters of length 60.\n" . "c\n" . "c lsave is a logical working array of dimension 4.\n" . "c\n" . "c isave is an integer working array of dimension 23.\n" . "c\n" . "c dsave is a double precision working array of dimension 29.\n" . "c\n" . "c\n" . "c Subprograms called\n" . "c\n" . "c L-BFGS-B Library ... cauchy, subsm, lnsrlb, formk, \n" . "c\n" . "c errclb, prn1lb, prn2lb, prn3lb, active, projgr,\n" . "c\n" . "c freev, cmprlb, matupd, formt.\n" . "c\n" . "c Minpack2 Library ... timer, dpmeps.\n" . "c\n" . "c Linpack Library ... dcopy, ddot.\n" . "c\n" . "c\n" . "c References:\n" . "c\n" . "c [1] R. H. Byrd, P. Lu, J. Nocedal and C. Zhu, ``A limited\n" . "c memory algorithm for bound constrained optimization'',\n" . "c SIAM J. Scientific Computing 16 (1995), no. 5, pp. 1190--1208.\n" . "c\n" . "c [2] C. Zhu, R.H. Byrd, P. Lu, J. Nocedal, ``L-BFGS-B: FORTRAN\n" . "c Subroutines for Large Scale Bound Constrained Optimization''\n" . "c Tech. Report, NAM-11, EECS Department, Northwestern University,\n" . "c 1994.\n" . "c \n" . "c [3] R. Byrd, J. Nocedal and R. Schnabel \"Representations of\n" . "c Quasi-Newton Matrices and their use in Limited Memory Methods'',\n" . "c Mathematical Programming 63 (1994), no. 4, pp. 129-156.\n" . "c\n" . "c (Postscript files of these papers are available via anonymous\n" . "c ftp to eecs.nwu.edu in the directory pub/lbfgs/lbfgs_bcm.)\n" . "c\n" . "c * * *\n" . "c\n" . "c NEOS, November 1994. (Latest revision June 1996.)\n" . "c Optimization Technology Center.\n" . "c Argonne National Laboratory and Northwestern University.\n" . "c Written by\n" . "c Ciyou Zhu\n" . "c in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.\n" . "c\n" . "c\n" . "c ************\n" . " \n" . " logical prjctd,cnstnd,boxed,updatd,wrk\n" . " character*3 word\n" . " integer i,k,nintol,itfile,iback,nskip,\n" . " + head,col,iter,itail,iupdat,\n" . " + nint,nfgv,info,ifun,\n" . " + iword,nfree,nact,ileave,nenter\n" . " double precision theta,fold,ddot,dr,rr,tol,dpmeps,\n" . " + xstep,sbgnrm,ddum,dnorm,dtd,epsmch,\n" . " + cpu1,cpu2,cachyt,sbtime,lnscht,time1,time2,\n" . " + gd,gdold,stp,stpmx,time\n" . " double precision one,zero\n" . " parameter (one=1.0d0,zero=0.0d0)\n" . " \n" . " if (task .eq. 'START') then\n" . "\n" . " call timer(time1)\n" . "\n" . "c Generate the current machine precision.\n" . "\n" . " epsmch = dpmeps()\n" . "\n" . "c Initialize counters and scalars when task='START'.\n" . "\n" . "c for the limited memory BFGS matrices:\n" . " col = 0\n" . " head = 1\n" . " theta = one\n" . " iupdat = 0\n" . " updatd = .false.\n" . " \n" . "c for operation counts:\n" . " iter = 0\n" . " nfgv = 0\n" . " nint = 0\n" . " nintol = 0\n" . " nskip = 0\n" . " nfree = n\n" . "\n" . "c for stopping tolerance:\n" . " tol = factr*epsmch\n" . "\n" . "c for measuring running time:\n" . " cachyt = 0\n" . " sbtime = 0\n" . " lnscht = 0\n" . " \n" . "c 'word' records the status of subspace solutions.\n" . " word = '---'\n" . "\n" . "c 'info' records the termination information.\n" . " info = 0\n" . "\n" . " if (iprint .ge. 1) then\n" . "c open a summary file 'iterate.dat'\n" . " open (8, file = 'iterate.dat', status = 'unknown')\n" . " itfile = 8\n" . " endif \n" . "\n" . "c Check the input arguments for errors.\n" . "\n" . " call errclb(n,m,factr,l,u,nbd,task,info,k)\n" . " if (task(1:5) .eq. 'ERROR') then\n" . " call prn3lb(n,x,f,task,iprint,info,itfile,\n" . " + iter,nfgv,nintol,nskip,nact,sbgnrm,\n" . " + zero,nint,word,iback,stp,xstep,k,\n" . " + cachyt,sbtime,lnscht)\n" . " return\n" . " endif\n" . "\n" . " call prn1lb(n,m,l,u,x,iprint,itfile,epsmch)\n" . " \n" . "c Initialize iwhere & project x onto the feasible set.\n" . " \n" . " call active(n,l,u,nbd,x,iwhere,iprint,prjctd,cnstnd,boxed) \n" . "\n" . "c The end of the initialization.\n" . "\n" . " else\n" . "c restore local variables.\n" . "\n" . " prjctd = lsave(1)\n" . " cnstnd = lsave(2)\n" . " boxed = lsave(3)\n" . " updatd = lsave(4)\n" . "\n" . " nintol = isave(1)\n" . " itfile = isave(3)\n" . " iback = isave(4)\n" . " nskip = isave(5)\n" . " head = isave(6)\n" . " col = isave(7)\n" . " itail = isave(8)\n" . " iter = isave(9)\n" . " iupdat = isave(10)\n" . " nint = isave(12)\n" . " nfgv = isave(13)\n" . " info = isave(14)\n" . " ifun = isave(15)\n" . " iword = isave(16)\n" . " nfree = isave(17)\n" . " nact = isave(18)\n" . " ileave = isave(19)\n" . " nenter = isave(20)\n" . "\n" . " theta = dsave(1)\n" . " fold = dsave(2)\n" . " tol = dsave(3)\n" . " dnorm = dsave(4)\n" . " epsmch = dsave(5)\n" . " cpu1 = dsave(6)\n" . " cachyt = dsave(7)\n" . " sbtime = dsave(8)\n" . " lnscht = dsave(9)\n" . " time1 = dsave(10)\n" . " gd = dsave(11)\n" . " stpmx = dsave(12)\n" . " sbgnrm = dsave(13)\n" . " stp = dsave(14)\n" . " gdold = dsave(15)\n" . " dtd = dsave(16)\n" . " \n" . "c After returning from the driver go to the point where execution\n" . "c is to resume.\n" . "\n" . " if (task(1:5) .eq. 'FG_LN') goto 666\n" . " if (task(1:5) .eq. 'NEW_X') goto 777\n" . " if (task(1:5) .eq. 'FG_ST') goto 111\n" . " if (task(1:4) .eq. 'STOP') then\n" . " if (task(7:9) .eq. 'CPU') then\n" . "c restore the previous iterate.\n" . " call dcopy(n,t,1,x,1)\n" . " call dcopy(n,r,1,g,1)\n" . " f = fold\n" . " endif\n" . " goto 999\n" . " endif\n" . " endif \n" . "\n" . "c Compute f0 and g0.\n" . "\n" . " task = 'FG_START' \n" . "c return to the driver to calculate f and g; reenter at 111.\n" . " goto 1000\n" . " 111 continue\n" . " nfgv = 1\n" . " \n" . "c Compute the infinity norm of the (-) projected gradient.\n" . " \n" . " call projgr(n,l,u,nbd,x,g,sbgnrm)\n" . " \n" . " if (iprint .ge. 1) then\n" . " write (6,1002) iter,f,sbgnrm\n" . " write (itfile,1003) iter,nfgv,sbgnrm,f\n" . " endif\n" . " if (sbgnrm .le. pgtol) then\n" . "c terminate the algorithm.\n" . " task = 'CONVERGENCE: NORM OF PROJECTED GRADIENT <= PGTOL'\n" . " goto 999\n" . " endif \n" . " \n" . "c ----------------- the beginning of the loop --------------------------\n" . " \n" . " 222 continue\n" . " if (iprint .ge. 99) write (6,1001) iter + 1\n" . " iword = -1\n" . "c\n" . " if (.not. cnstnd .and. col .gt. 0) then \n" . "c skip the search for GCP.\n" . " call dcopy(n,x,1,z,1)\n" . " wrk = updatd\n" . " nint = 0\n" . " goto 333\n" . " endif\n" . "\n" . "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n" . "c\n" . "c Compute the Generalized Cauchy Point (GCP).\n" . "c\n" . "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n" . "\n" . " call timer(cpu1) \n" . " call cauchy(n,x,l,u,nbd,g,indx2,iwhere,t,d,z,\n" . " + m,wy,ws,sy,wt,theta,col,head,\n" . " + wa(1),wa(2*m+1),wa(4*m+1),wa(6*m+1),nint,\n" . " + sg,yg,iprint,sbgnrm,info,epsmch)\n" . " if (info .ne. 0) then \n" . "c singular triangular system detected; refresh the lbfgs memory.\n" . " if(iprint .ge. 1) write (6, 1005)\n" . " info = 0\n" . " col = 0\n" . " head = 1\n" . " theta = one\n" . " iupdat = 0\n" . " updatd = .false.\n" . " call timer(cpu2) \n" . " cachyt = cachyt + cpu2 - cpu1\n" . " goto 222\n" . " endif\n" . " call timer(cpu2) \n" . " cachyt = cachyt + cpu2 - cpu1\n" . " nintol = nintol + nint\n" . "\n" . "c Count the entering and leaving variables for iter > 0; \n" . "c find the index set of free and active variables at the GCP.\n" . "\n" . " call freev(n,nfree,index,nenter,ileave,indx2,\n" . " + iwhere,wrk,updatd,cnstnd,iprint,iter)\n" . "\n" . " nact = n - nfree\n" . " \n" . " 333 continue\n" . " \n" . "c If there are no free variables or B=theta*I, then\n" . "c skip the subspace minimization.\n" . " \n" . " if (nfree .eq. 0 .or. col .eq. 0) goto 555\n" . " \n" . "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n" . "c\n" . "c Subspace minimization.\n" . "c\n" . "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n" . "\n" . " call timer(cpu1) \n" . "\n" . "c Form the LEL^T factorization of the indefinite\n" . "c matrix K = [-D -Y'ZZ'Y/theta L_a'-R_z' ]\n" . "c [L_a -R_z theta*S'AA'S ]\n" . "c where E = [-I 0]\n" . "c [ 0 I]\n" . "\n" . " if (wrk) call formk(n,nfree,index,nenter,ileave,indx2,iupdat,\n" . " + updatd,wn,snd,m,ws,wy,sy,theta,col,head,info)\n" . " if (info .ne. 0) then\n" . "c nonpositive definiteness in Cholesky factorization;\n" . "c refresh the lbfgs memory and restart the iteration.\n" . " if(iprint .ge. 1) write (6, 1006)\n" . " info = 0\n" . " col = 0\n" . " head = 1\n" . " theta = one\n" . " iupdat = 0\n" . " updatd = .false.\n" . " call timer(cpu2) \n" . " sbtime = sbtime + cpu2 - cpu1 \n" . " goto 222\n" . " endif \n" . "\n" . "c compute r=-Z'B(xcp-xk)-Z'g (using wa(2m+1)=W'(xcp-x)\n" . "c from 'cauchy').\n" . " call cmprlb(n,m,x,g,ws,wy,sy,wt,z,r,wa,index,\n" . " + theta,col,head,nfree,cnstnd,info)\n" . " if (info .ne. 0) goto 444\n" . "c call the direct method.\n" . " call subsm(n,m,nfree,index,l,u,nbd,z,r,ws,wy,theta,\n" . " + col,head,iword,wa,wn,iprint,info)\n" . " 444 continue\n" . " if (info .ne. 0) then \n" . "c singular triangular system detected;\n" . "c refresh the lbfgs memory and restart the iteration.\n" . " if(iprint .ge. 1) write (6, 1005)\n" . " info = 0\n" . " col = 0\n" . " head = 1\n" . " theta = one\n" . " iupdat = 0\n" . " updatd = .false.\n" . " call timer(cpu2) \n" . " sbtime = sbtime + cpu2 - cpu1 \n" . " goto 222\n" . " endif\n" . " \n" . " call timer(cpu2) \n" . " sbtime = sbtime + cpu2 - cpu1 \n" . " 555 continue\n" . " \n" . "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n" . "c\n" . "c Line search and optimality tests.\n" . "c\n" . "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n" . " \n" . "c Generate the search direction d:=z-x.\n" . "\n" . " do 40 i = 1, n\n" . " d(i) = z(i) - x(i)\n" . " 40 continue\n" . " call timer(cpu1) \n" . " 666 continue\n" . " call lnsrlb(n,l,u,nbd,x,f,fold,gd,gdold,g,d,r,t,z,stp,dnorm,\n" . " + dtd,xstep,stpmx,iter,ifun,iback,nfgv,info,task,\n" . " + boxed,cnstnd,csave,isave(22),dsave(17))\n" . " if (info .ne. 0 .or. iback .ge. 20) then\n" . "c restore the previous iterate.\n" . " call dcopy(n,t,1,x,1)\n" . " call dcopy(n,r,1,g,1)\n" . " f = fold\n" . " if (col .eq. 0) then\n" . "c abnormal termination.\n" . " if (info .eq. 0) then\n" . " info = -9\n" . "c restore the actual number of f and g evaluations etc.\n" . " nfgv = nfgv - 1\n" . " ifun = ifun - 1\n" . " iback = iback - 1\n" . " endif\n" . " task = 'ABNORMAL_TERMINATION_IN_LNSRCH'\n" . " iter = iter + 1\n" . " goto 999\n" . " else\n" . "c refresh the lbfgs memory and restart the iteration.\n" . " if(iprint .ge. 1) write (6, 1008)\n" . " if (info .eq. 0) nfgv = nfgv - 1\n" . " info = 0\n" . " col = 0\n" . " head = 1\n" . " theta = one\n" . " iupdat = 0\n" . " updatd = .false.\n" . " task = 'RESTART_FROM_LNSRCH'\n" . " call timer(cpu2)\n" . " lnscht = lnscht + cpu2 - cpu1\n" . " goto 222\n" . " endif\n" . " else if (task(1:5) .eq. 'FG_LN') then\n" . "c return to the driver for calculating f and g; reenter at 666.\n" . " goto 1000\n" . " else \n" . "c calculate and print out the quantities related to the new X.\n" . " call timer(cpu2) \n" . " lnscht = lnscht + cpu2 - cpu1\n" . " iter = iter + 1\n" . " \n" . "c Compute the infinity norm of the projected (-)gradient.\n" . " \n" . " call projgr(n,l,u,nbd,x,g,sbgnrm)\n" . " \n" . "c Print iteration information.\n" . "\n" . " call prn2lb(n,x,f,g,iprint,itfile,iter,nfgv,nact,\n" . " + sbgnrm,nint,word,iword,iback,stp,xstep)\n" . " goto 1000\n" . " endif\n" . " 777 continue\n" . "\n" . "c Test for termination.\n" . "\n" . " if (sbgnrm .le. pgtol) then\n" . "c terminate the algorithm.\n" . " task = 'CONVERGENCE: NORM OF PROJECTED GRADIENT <= PGTOL'\n" . " goto 999\n" . " endif \n" . "\n" . " ddum = max(abs(fold), abs(f), one)\n" . " if ((fold - f) .le. tol*ddum) then\n" . "c terminate the algorithm.\n" . " task = 'CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH'\n" . " if (iback .ge. 10) info = -5\n" . "c i.e., to issue a warning if iback>10 in the line search.\n" . " goto 999\n" . " endif \n" . "\n" . "c Compute d=newx-oldx, r=newg-oldg, rr=y'y and dr=y's.\n" . " \n" . " do 42 i = 1, n\n" . " r(i) = g(i) - r(i)\n" . " 42 continue\n" . " rr = ddot(n,r,1,r,1)\n" . " if (stp .eq. one) then \n" . " dr = gd - gdold\n" . " ddum = -gdold\n" . " else\n" . " dr = (gd - gdold)*stp\n" . " call dscal(n,stp,d,1)\n" . " ddum = -gdold*stp\n" . " endif\n" . " \n" . " if (dr .le. epsmch*ddum) then\n" . "c skip the L-BFGS update.\n" . " nskip = nskip + 1\n" . " updatd = .false.\n" . " if (iprint .ge. 1) write (6,1004) dr, ddum\n" . " goto 888\n" . " endif \n" . " \n" . "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n" . "c\n" . "c Update the L-BFGS matrix.\n" . "c\n" . "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n" . " \n" . " updatd = .true.\n" . " iupdat = iupdat + 1\n" . "\n" . "c Update matrices WS and WY and form the middle matrix in B.\n" . "\n" . " call matupd(n,m,ws,wy,sy,ss,d,r,itail,\n" . " + iupdat,col,head,theta,rr,dr,stp,dtd)\n" . "\n" . "c Form the upper half of the pds T = theta*SS + L*D^(-1)*L';\n" . "c Store T in the upper triangular of the array wt;\n" . "c Cholesky factorize T to J*J' with\n" . "c J' stored in the upper triangular of wt.\n" . "\n" . " call formt(m,wt,sy,ss,col,theta,info)\n" . " \n" . " if (info .ne. 0) then \n" . "c nonpositive definiteness in Cholesky factorization;\n" . "c refresh the lbfgs memory and restart the iteration.\n" . " if(iprint .ge. 1) write (6, 1007)\n" . " info = 0\n" . " col = 0\n" . " head = 1\n" . " theta = one\n" . " iupdat = 0\n" . " updatd = .false.\n" . " goto 222\n" . " endif\n" . "\n" . "c Now the inverse of the middle matrix in B is\n" . "\n" . "c [ D^(1/2) O ] [ -D^(1/2) D^(-1/2)*L' ]\n" . "c [ -L*D^(-1/2) J ] [ 0 J' ]\n" . "\n" . " 888 continue\n" . " \n" . "c -------------------- the end of the loop -----------------------------\n" . " \n" . " goto 222\n" . " 999 continue\n" . " call timer(time2)\n" . " time = time2 - time1\n" . " call prn3lb(n,x,f,task,iprint,info,itfile,\n" . " + iter,nfgv,nintol,nskip,nact,sbgnrm,\n" . " + time,nint,word,iback,stp,xstep,k,\n" . " + cachyt,sbtime,lnscht)\n" . " 1000 continue\n" . "\n" . "c Save local variables.\n" . "\n" . " lsave(1) = prjctd\n" . " lsave(2) = cnstnd\n" . " lsave(3) = boxed\n" . " lsave(4) = updatd\n" . "\n" . " isave(1) = nintol \n" . " isave(3) = itfile \n" . " isave(4) = iback \n" . " isave(5) = nskip \n" . " isave(6) = head \n" . " isave(7) = col \n" . " isave(8) = itail \n" . " isave(9) = iter \n" . " isave(10) = iupdat \n" . " isave(12) = nint \n" . " isave(13) = nfgv \n" . " isave(14) = info \n" . " isave(15) = ifun \n" . " isave(16) = iword \n" . " isave(17) = nfree \n" . " isave(18) = nact \n" . " isave(19) = ileave \n" . " isave(20) = nenter \n" . "\n" . " dsave(1) = theta \n" . " dsave(2) = fold \n" . " dsave(3) = tol \n" . " dsave(4) = dnorm \n" . " dsave(5) = epsmch \n" . " dsave(6) = cpu1 \n" . " dsave(7) = cachyt \n" . " dsave(8) = sbtime \n" . " dsave(9) = lnscht \n" . " dsave(10) = time1 \n" . " dsave(11) = gd \n" . " dsave(12) = stpmx \n" . " dsave(13) = sbgnrm\n" . " dsave(14) = stp\n" . " dsave(15) = gdold\n" . " dsave(16) = dtd \n" . "\n" . " 1001 format (//,'ITERATION ',i5)\n" . " 1002 format\n" . " + (/,'At iterate',i5,4x,'f= ',1p,d12.5,4x,'|proj g|= ',1p,d12.5)\n" . " 1003 format (2(1x,i4),5x,'-',5x,'-',3x,'-',5x,'-',5x,'-',8x,'-',3x,\n" . " + 1p,2(1x,d10.3))\n" . " 1004 format (' ys=',1p,e10.3,' -gs=',1p,e10.3,' BFGS update SKIPPED')\n" . " 1005 format (/, \n" . " +' Singular triangular system detected;',/,\n" . " +' refresh the lbfgs memory and restart the iteration.')\n" . " 1006 format (/, \n" . " +' Nonpositive definiteness in Cholesky factorization in formk;',/,\n" . " +' refresh the lbfgs memory and restart the iteration.')\n" . " 1007 format (/, \n" . " +' Nonpositive definiteness in Cholesky factorization in formt;',/,\n" . " +' refresh the lbfgs memory and restart the iteration.')\n" . " 1008 format (/, \n" . " +' Bad direction in the line search;',/,\n" . " +' refresh the lbfgs memory and restart the iteration.')\n" . "\n" . " return \n" . "\n" . " end\n" . " \n" . "c======================= The end of mainlb =============================\n" . "\n" . " subroutine active(n, l, u, nbd, x, iwhere, iprint,\n" . " + prjctd, cnstnd, boxed)\n" . "\n" . " logical prjctd, cnstnd, boxed\n" . " integer n, iprint, nbd(n), iwhere(n)\n" . " double precision x(n), l(n), u(n)\n" . "\n" . "c ************\n" . "c\n" . "c Subroutine active\n" . "c\n" . "c This subroutine initializes iwhere and projects the initial x to\n" . "c the feasible set if necessary.\n" . "c\n" . "c iwhere is an integer array of dimension n.\n" . "c On entry iwhere is unspecified.\n" . "c On exit iwhere(i)=-1 if x(i) has no bounds\n" . "c 3 if l(i)=u(i)\n" . "c 0 otherwise.\n" . "c In cauchy, iwhere is given finer gradations.\n" . "c\n" . "c\n" . "c * * *\n" . "c\n" . "c NEOS, November 1994. (Latest revision June 1996.)\n" . "c Optimization Technology Center.\n" . "c Argonne National Laboratory and Northwestern University.\n" . "c Written by\n" . "c Ciyou Zhu\n" . "c in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.\n" . "c\n" . "c\n" . "c ************\n" . "\n" . " integer nbdd,i\n" . " double precision zero\n" . " parameter (zero=0.0d0)\n" . "\n" . "c Initialize nbdd, prjctd, cnstnd and boxed.\n" . "\n" . " nbdd = 0\n" . " prjctd = .false.\n" . " cnstnd = .false.\n" . " boxed = .true.\n" . "\n" . "c Project the initial x to the easible set if necessary.\n" . "\n" . " do 10 i = 1, n\n" . " if (nbd(i) .gt. 0) then\n" . " if (nbd(i) .le. 2 .and. x(i) .le. l(i)) then\n" . " if (x(i) .lt. l(i)) then\n" . " prjctd = .true.\n" . " x(i) = l(i)\n" . " endif\n" . " nbdd = nbdd + 1\n" . " else if (nbd(i) .ge. 2 .and. x(i) .ge. u(i)) then\n" . " if (x(i) .gt. u(i)) then\n" . " prjctd = .true.\n" . " x(i) = u(i)\n" . " endif\n" . " nbdd = nbdd + 1\n" . " endif\n" . " endif\n" . " 10 continue\n" . "\n" . "c Initialize iwhere and assign values to cnstnd and boxed.\n" . "\n" . " do 20 i = 1, n\n" . " if (nbd(i) .ne. 2) boxed = .false.\n" . " if (nbd(i) .eq. 0) then\n" . "c this variable is always free\n" . " iwhere(i) = -1\n" . "\n" . "c otherwise set x(i)=mid(x(i), u(i), l(i)).\n" . " else\n" . " cnstnd = .true.\n" . " if (nbd(i) .eq. 2 .and. u(i) - l(i) .le. zero) then\n" . "c this variable is always fixed\n" . " iwhere(i) = 3\n" . " else \n" . " iwhere(i) = 0\n" . " endif\n" . " endif\n" . " 20 continue\n" . "\n" . " if (iprint .ge. 0) then\n" . " if (prjctd) write (6,*)\n" . " + 'The initial X is infeasible. Restart with its projection.'\n" . " if (.not. cnstnd)\n" . " + write (6,*) 'This problem is unconstrained.'\n" . " endif\n" . "\n" . " if (iprint .gt. 0) write (6,1001) nbdd\n" . "\n" . " 1001 format (/,'At X0 ',i9,' variables are exactly at the bounds') \n" . "\n" . " return\n" . "\n" . " end\n" . "\n" . "c======================= The end of active =============================\n" . " \n" . " subroutine bmv(m, sy, wt, col, v, p, info)\n" . "\n" . " integer m, col, info\n" . " double precision sy(m, m), wt(m, m), v(2*col), p(2*col)\n" . "\n" . "c ************\n" . "c\n" . "c Subroutine bmv\n" . "c\n" . "c This subroutine computes the product of the 2m x 2m middle matrix \n" . "c in the compact L-BFGS formula of B and a 2m vector v; \n" . "c it returns the product in p.\n" . "c \n" . "c m is an integer variable.\n" . "c On entry m is the maximum number of variable metric corrections\n" . "c used to define the limited memory matrix.\n" . "c On exit m is unchanged.\n" . "c\n" . "c sy is a double precision array of dimension m x m.\n" . "c On entry sy specifies the matrix S'Y.\n" . "c On exit sy is unchanged.\n" . "c\n" . "c wt is a double precision array of dimension m x m.\n" . "c On entry wt specifies the upper triangular matrix J' which is \n" . "c the Cholesky factor of (thetaS'S+LD^(-1)L').\n" . "c On exit wt is unchanged.\n" . "c\n" . "c col is an integer variable.\n" . "c On entry col specifies the number of s-vectors (or y-vectors)\n" . "c stored in the compact L-BFGS formula.\n" . "c On exit col is unchanged.\n" . "c\n" . "c v is a double precision array of dimension 2col.\n" . "c On entry v specifies vector v.\n" . "c On exit v is unchanged.\n" . "c\n" . "c p is a double precision array of dimension 2col.\n" . "c On entry p is unspecified.\n" . "c On exit p is the product Mv.\n" . "c\n" . "c info is an integer variable.\n" . "c On entry info is unspecified.\n" . "c On exit info = 0 for normal return,\n" . "c = nonzero for abnormal return when the system\n" . "c to be solved by dtrsl is singular.\n" . "c\n" . "c Subprograms called:\n" . "c\n" . "c Linpack ... dtrsl.\n" . "c\n" . "c\n" . "c * * *\n" . "c\n" . "c NEOS, November 1994. (Latest revision June 1996.)\n" . "c Optimization Technology Center.\n" . "c Argonne National Laboratory and Northwestern University.\n" . "c Written by\n" . "c Ciyou Zhu\n" . "c in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.\n" . "c\n" . "c\n" . "c ************\n" . " \n" . " integer i,k,i2\n" . " double precision sum\n" . " \n" . " if (col .eq. 0) return\n" . " \n" . "c PART I: solve [ D^(1/2) O ] [ p1 ] = [ v1 ]\n" . "c [ -L*D^(-1/2) J ] [ p2 ] [ v2 ].\n" . "\n" . "c solve Jp2=v2+LD^(-1)v1.\n" . " p(col + 1) = v(col + 1)\n" . " do 20 i = 2, col\n" . " i2 = col + i\n" . " sum = 0.0d0\n" . " do 10 k = 1, i - 1\n" . " sum = sum + sy(i,k)*v(k)/sy(k,k)\n" . " 10 continue\n" . " p(i2) = v(i2) + sum\n" . " 20 continue \n" . "c Solve the triangular system\n" . " call dtrsl(wt,m,col,p(col+1),11,info)\n" . " if (info .ne. 0) return\n" . " \n" . "c solve D^(1/2)p1=v1.\n" . " do 30 i = 1, col\n" . " p(i) = v(i)/sqrt(sy(i,i))\n" . " 30 continue \n" . " \n" . "c PART II: solve [ -D^(1/2) D^(-1/2)*L' ] [ p1 ] = [ p1 ]\n" . "c [ 0 J' ] [ p2 ] [ p2 ]. \n" . " \n" . "c solve J^Tp2=p2. \n" . " call dtrsl(wt,m,col,p(col+1),01,info)\n" . " if (info .ne. 0) return\n" . " \n" . "c compute p1=-D^(-1/2)(p1-D^(-1/2)L'p2)\n" . "c =-D^(-1/2)p1+D^(-1)L'p2. \n" . " do 40 i = 1, col\n" . " p(i) = -p(i)/sqrt(sy(i,i))\n" . " 40 continue\n" . " do 60 i = 1, col\n" . " sum = 0.d0\n" . " do 50 k = i + 1, col\n" . " sum = sum + sy(k,i)*p(col+k)/sy(i,i)\n" . " 50 continue\n" . " p(i) = p(i) + sum\n" . " 60 continue\n" . "\n" . " return\n" . "\n" . " end\n" . "\n" . "c======================== The end of bmv ===============================\n" . "\n" . " subroutine cauchy(n, x, l, u, nbd, g, iorder, iwhere, t, d, xcp, \n" . " + m, wy, ws, sy, wt, theta, col, head, p, c, wbp, \n" . " + v, nint, sg, yg, iprint, sbgnrm, info, epsmch)\n" . " \n" . " integer n, m, head, col, nint, iprint, info, \n" . " + nbd(n), iorder(n), iwhere(n)\n" . " double precision theta, epsmch,\n" . " + x(n), l(n), u(n), g(n), t(n), d(n), xcp(n),\n" . " + sg(m), yg(m), wy(n, col), ws(n, col), sy(m, m),\n" . " + wt(m, m), p(2*m), c(2*m), wbp(2*m), v(2*m)\n" . "\n" . "c ************\n" . "c\n" . "c Subroutine cauchy\n" . "c\n" . "c For given x, l, u, g (with sbgnrm > 0), and a limited memory\n" . "c BFGS matrix B defined in terms of matrices WY, WS, WT, and\n" . "c scalars head, col, and theta, this subroutine computes the\n" . "c generalized Cauchy point (GCP), defined as the first local\n" . "c minimizer of the quadratic\n" . "c\n" . "c Q(x + s) = g's + 1/2 s'Bs\n" . "c\n" . "c along the projected gradient direction P(x-tg,l,u).\n" . "c The routine returns the GCP in xcp. \n" . "c \n" . "c n is an integer variable.\n" . "c On entry n is the dimension of the problem.\n" . "c On exit n is unchanged.\n" . "c\n" . "c x is a double precision array of dimension n.\n" . "c On entry x is the starting point for the GCP computation.\n" . "c On exit x is unchanged.\n" . "c\n" . "c l is a double precision array of dimension n.\n" . "c On entry l is the lower bound of x.\n" . "c On exit l is unchanged.\n" . "c\n" . "c u is a double precision array of dimension n.\n" . "c On entry u is the upper bound of x.\n" . "c On exit u is unchanged.\n" . "c\n" . "c nbd is an integer array of dimension n.\n" . "c On entry nbd represents the type of bounds imposed on the\n" . "c variables, and must be specified as follows:\n" . "c nbd(i)=0 if x(i) is unbounded,\n" . "c 1 if x(i) has only a lower bound,\n" . "c 2 if x(i) has both lower and upper bounds, and\n" . "c 3 if x(i) has only an upper bound. \n" . "c On exit nbd is unchanged.\n" . "c\n" . "c g is a double precision array of dimension n.\n" . "c On entry g is the gradient of f(x). g must be a nonzero vector.\n" . "c On exit g is unchanged.\n" . "c\n" . "c iorder is an integer working array of dimension n.\n" . "c iorder will be used to store the breakpoints in the piecewise\n" . "c linear path and free variables encountered. On exit,\n" . "c iorder(1),...,iorder(nleft) are indices of breakpoints\n" . "c which have not been encountered; \n" . "c iorder(nleft+1),...,iorder(nbreak) are indices of\n" . "c encountered breakpoints; and\n" . "c iorder(nfree),...,iorder(n) are indices of variables which\n" . "c have no bound constraits along the search direction.\n" . "c\n" . "c iwhere is an integer array of dimension n.\n" . "c On entry iwhere indicates only the permanently fixed (iwhere=3)\n" . "c or free (iwhere= -1) components of x.\n" . "c On exit iwhere records the status of the current x variables.\n" . "c iwhere(i)=-3 if x(i) is free and has bounds, but is not moved\n" . "c 0 if x(i) is free and has bounds, and is moved\n" . "c 1 if x(i) is fixed at l(i), and l(i) .ne. u(i)\n" . "c 2 if x(i) is fixed at u(i), and u(i) .ne. l(i)\n" . "c 3 if x(i) is always fixed, i.e., u(i)=x(i)=l(i)\n" . "c -1 if x(i) is always free, i.e., it has no bounds.\n" . "c\n" . "c t is a double precision working array of dimension n. \n" . "c t will be used to store the break points.\n" . "c\n" . "c d is a double precision array of dimension n used to store\n" . "c the Cauchy direction P(x-tg)-x.\n" . "c\n" . "c xcp is a double precision array of dimension n used to return the\n" . "c GCP on exit.\n" . "c\n" . "c m is an integer variable.\n" . "c On entry m is the maximum number of variable metric corrections \n" . "c used to define the limited memory matrix.\n" . "c On exit m is unchanged.\n" . "c\n" . "c ws, wy, sy, and wt are double precision arrays.\n" . "c On entry they store information that defines the\n" . "c limited memory BFGS matrix:\n" . "c ws(n,m) stores S, a set of s-vectors;\n" . "c wy(n,m) stores Y, a set of y-vectors;\n" . "c sy(m,m) stores S'Y;\n" . "c wt(m,m) stores the\n" . "c Cholesky factorization of (theta*S'S+LD^(-1)L').\n" . "c On exit these arrays are unchanged.\n" . "c\n" . "c theta is a double precision variable.\n" . "c On entry theta is the scaling factor specifying B_0 = theta I.\n" . "c On exit theta is unchanged.\n" . "c\n" . "c col is an integer variable.\n" . "c On entry col is the actual number of variable metric\n" . "c corrections stored so far.\n" . "c On exit col is unchanged.\n" . "c\n" . "c head is an integer variable.\n" . "c On entry head is the location of the first s-vector (or y-vector)\n" . "c in S (or Y).\n" . "c On exit col is unchanged.\n" . "c\n" . "c p is a double precision working array of dimension 2m.\n" . "c p will be used to store the vector p = W^(T)d.\n" . "c\n" . "c c is a double precision working array of dimension 2m.\n" . "c c will be used to store the vector c = W^(T)(xcp-x).\n" . "c\n" . "c wbp is a double precision working array of dimension 2m.\n" . "c wbp will be used to store the row of W corresponding\n" . "c to a breakpoint.\n" . "c\n" . "c v is a double precision working array of dimension 2m.\n" . "c\n" . "c nint is an integer variable.\n" . "c On exit nint records the number of quadratic segments explored\n" . "c in searching for the GCP.\n" . "c\n" . "c sg and yg are double precision arrays of dimension m.\n" . "c On entry sg and yg store S'g and Y'g correspondingly.\n" . "c On exit they are unchanged. \n" . "c \n" . "c iprint is an INTEGER variable that must be set by the user.\n" . "c It controls the frequency and type of output generated:\n" . "c iprint<0 no output is generated;\n" . "c iprint=0 print only one line at the last iteration;\n" . "c 0100 print details of every iteration including x and g;\n" . "c When iprint > 0, the file iterate.dat will be created to\n" . "c summarize the iteration.\n" . "c\n" . "c sbgnrm is a double precision variable.\n" . "c On entry sbgnrm is the norm of the projected gradient at x.\n" . "c On exit sbgnrm is unchanged.\n" . "c\n" . "c info is an integer variable.\n" . "c On entry info is 0.\n" . "c On exit info = 0 for normal return,\n" . "c = nonzero for abnormal return when the the system\n" . "c used in routine bmv is singular.\n" . "c\n" . "c Subprograms called:\n" . "c \n" . "c L-BFGS-B Library ... hpsolb, bmv.\n" . "c\n" . "c Linpack ... dscal dcopy, daxpy.\n" . "c\n" . "c\n" . "c References:\n" . "c\n" . "c [1] R. H. Byrd, P. Lu, J. Nocedal and C. Zhu, ``A limited\n" . "c memory algorithm for bound constrained optimization'',\n" . "c SIAM J. Scientific Computing 16 (1995), no. 5, pp. 1190--1208.\n" . "c\n" . "c [2] C. Zhu, R.H. Byrd, P. Lu, J. Nocedal, ``L-BFGS-B: FORTRAN\n" . "c Subroutines for Large Scale Bound Constrained Optimization''\n" . "c Tech. Report, NAM-11, EECS Department, Northwestern University,\n" . "c 1994.\n" . "c\n" . "c (Postscript files of these papers are available via anonymous\n" . "c ftp to eecs.nwu.edu in the directory pub/lbfgs/lbfgs_bcm.)\n" . "c\n" . "c * * *\n" . "c\n" . "c NEOS, November 1994. (Latest revision June 1996.)\n" . "c Optimization Technology Center.\n" . "c Argonne National Laboratory and Northwestern University.\n" . "c Written by\n" . "c Ciyou Zhu\n" . "c in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.\n" . "c\n" . "c\n" . "c ************\n" . "\n" . " logical xlower,xupper,bnded\n" . " integer i,j,col2,nfree,nbreak,pointr,\n" . " + ibp,nleft,ibkmin,iter\n" . " double precision f1,f2,dt,dtm,tsum,dibp,zibp,dibp2,bkmin,\n" . " + tu,tl,wmc,wmp,wmw,ddot,tj,tj0,neggi,sbgnrm,\n" . " + f2_org\n" . " double precision one,zero\n" . " parameter (one=1.0d0,zero=0.0d0)\n" . " \n" . "c Check the status of the variables, reset iwhere(i) if necessary;\n" . "c compute the Cauchy direction d and the breakpoints t; initialize\n" . "c the derivative f1 and the vector p = W'd (for theta = 1).\n" . " \n" . " if (sbgnrm .le. zero) then\n" . " if (iprint .ge. 0) write (6,*) 'Subgnorm = 0. GCP = X.'\n" . " call dcopy(n,x,1,xcp,1)\n" . " return\n" . " endif \n" . " bnded = .true.\n" . " nfree = n + 1\n" . " nbreak = 0\n" . " ibkmin = 0\n" . " bkmin = zero\n" . " col2 = 2*col\n" . " f1 = zero\n" . " if (iprint .ge. 99) write (6,3010)\n" . "\n" . "c We set p to zero and build it up as we determine d.\n" . "\n" . " do 20 i = 1, col2\n" . " p(i) = zero\n" . " 20 continue \n" . "\n" . "c In the following loop we determine for each variable its bound\n" . "c status and its breakpoint, and update p accordingly.\n" . "c Smallest breakpoint is identified.\n" . "\n" . " do 50 i = 1, n \n" . " neggi = -g(i) \n" . " if (iwhere(i) .ne. 3 .and. iwhere(i) .ne. -1) then\n" . "c if x(i) is not a constant and has bounds,\n" . "c compute the difference between x(i) and its bounds.\n" . " if (nbd(i) .le. 2) tl = x(i) - l(i)\n" . " if (nbd(i) .ge. 2) tu = u(i) - x(i)\n" . "\n" . "c If a variable is close enough to a bound\n" . "c we treat it as at bound.\n" . " xlower = nbd(i) .le. 2 .and. tl .le. zero\n" . " xupper = nbd(i) .ge. 2 .and. tu .le. zero\n" . "\n" . "c reset iwhere(i).\n" . " iwhere(i) = 0\n" . " if (xlower) then\n" . " if (neggi .le. zero) iwhere(i) = 1\n" . " else if (xupper) then\n" . " if (neggi .ge. zero) iwhere(i) = 2\n" . " else\n" . " if (abs(neggi) .le. zero) iwhere(i) = -3\n" . " endif\n" . " endif \n" . " pointr = head\n" . " if (iwhere(i) .ne. 0 .and. iwhere(i) .ne. -1) then\n" . " d(i) = zero\n" . " else\n" . " d(i) = neggi\n" . " f1 = f1 - neggi*neggi\n" . "c calculate p := p - W'e_i* (g_i).\n" . " do 40 j = 1, col\n" . " p(j) = p(j) + wy(i,pointr)* neggi\n" . " p(col + j) = p(col + j) + ws(i,pointr)*neggi\n" . " pointr = mod(pointr,m) + 1\n" . " 40 continue \n" . " if (nbd(i) .le. 2 .and. nbd(i) .ne. 0\n" . " + .and. neggi .lt. zero) then\n" . "c x(i) + d(i) is bounded; compute t(i).\n" . " nbreak = nbreak + 1\n" . " iorder(nbreak) = i\n" . " t(nbreak) = tl/(-neggi)\n" . " if (nbreak .eq. 1 .or. t(nbreak) .lt. bkmin) then\n" . " bkmin = t(nbreak)\n" . " ibkmin = nbreak\n" . " endif\n" . " else if (nbd(i) .ge. 2 .and. neggi .gt. zero) then\n" . "c x(i) + d(i) is bounded; compute t(i).\n" . " nbreak = nbreak + 1\n" . " iorder(nbreak) = i\n" . " t(nbreak) = tu/neggi\n" . " if (nbreak .eq. 1 .or. t(nbreak) .lt. bkmin) then\n" . " bkmin = t(nbreak)\n" . " ibkmin = nbreak\n" . " endif\n" . " else\n" . "c x(i) + d(i) is not bounded.\n" . " nfree = nfree - 1\n" . " iorder(nfree) = i\n" . " if (abs(neggi) .gt. zero) bnded = .false.\n" . " endif\n" . " endif\n" . " 50 continue \n" . " \n" . "c The indices of the nonzero components of d are now stored\n" . "c in iorder(1),...,iorder(nbreak) and iorder(nfree),...,iorder(n).\n" . "c The smallest of the nbreak breakpoints is in t(ibkmin)=bkmin.\n" . " \n" . " if (theta .ne. one) then\n" . "c complete the initialization of p for theta not= one.\n" . " call dscal(col,theta,p(col+1),1)\n" . " endif\n" . " \n" . "c Initialize GCP xcp = x.\n" . "\n" . " call dcopy(n,x,1,xcp,1)\n" . "\n" . " if (nbreak .eq. 0 .and. nfree .eq. n + 1) then\n" . "c is a zero vector, return with the initial xcp as GCP.\n" . " if (iprint .gt. 100) write (6,1010) (xcp(i), i = 1, n)\n" . " return\n" . " endif \n" . " \n" . "c Initialize c = W'(xcp - x) = 0.\n" . " \n" . " do 60 j = 1, col2\n" . " c(j) = zero\n" . " 60 continue \n" . " \n" . "c Initialize derivative f2.\n" . " \n" . " f2 = -theta*f1 \n" . " f2_org = f2\n" . " if (col .gt. 0) then\n" . " call bmv(m,sy,wt,col,p,v,info)\n" . " if (info .ne. 0) return\n" . " f2 = f2 - ddot(col2,v,1,p,1)\n" . " endif\n" . " dtm = -f1/f2\n" . " tsum = zero\n" . " nint = 1\n" . " if (iprint .ge. 99) \n" . " + write (6,*) 'There are ',nbreak,' breakpoints '\n" . " \n" . "c If there are no breakpoints, locate the GCP and return. \n" . " \n" . " if (nbreak .eq. 0) goto 888\n" . " \n" . " nleft = nbreak\n" . " iter = 1\n" . " \n" . " \n" . " tj = zero\n" . " \n" . "c------------------- the beginning of the loop -------------------------\n" . " \n" . " 777 continue\n" . " \n" . "c Find the next smallest breakpoint;\n" . "c compute dt = t(nleft) - t(nleft + 1).\n" . " \n" . " tj0 = tj\n" . " if (iter .eq. 1) then\n" . "c Since we already have the smallest breakpoint we need not do\n" . "c heapsort yet. Often only one breakpoint is used and the\n" . "c cost of heapsort is avoided.\n" . " tj = bkmin\n" . " ibp = iorder(ibkmin)\n" . " else\n" . " if (iter .eq. 2) then\n" . "c Replace the already used smallest breakpoint with the\n" . "c breakpoint numbered nbreak > nlast, before heapsort call.\n" . " if (ibkmin .ne. nbreak) then\n" . " t(ibkmin) = t(nbreak)\n" . " iorder(ibkmin) = iorder(nbreak)\n" . " endif \n" . "c Update heap structure of breakpoints\n" . "c (if iter=2, initialize heap).\n" . " endif\n" . " call hpsolb(nleft,t,iorder,iter-2)\n" . " tj = t(nleft)\n" . " ibp = iorder(nleft) \n" . " endif \n" . " \n" . " dt = tj - tj0\n" . " \n" . " if (dt .ne. zero .and. iprint .ge. 100) then\n" . " write (6,4011) nint,f1,f2\n" . " write (6,5010) dt\n" . " write (6,6010) dtm\n" . " endif \n" . " \n" . "c If a minimizer is within this interval, locate the GCP and return. \n" . " \n" . " if (dtm .lt. dt) goto 888\n" . " \n" . "c Otherwise fix one variable and\n" . "c reset the corresponding component of d to zero.\n" . " \n" . " tsum = tsum + dt\n" . " nleft = nleft - 1\n" . " iter = iter + 1\n" . " dibp = d(ibp)\n" . " d(ibp) = zero\n" . " if (dibp .gt. zero) then\n" . " zibp = u(ibp) - x(ibp)\n" . " xcp(ibp) = u(ibp)\n" . " iwhere(ibp) = 2\n" . " else\n" . " zibp = l(ibp) - x(ibp)\n" . " xcp(ibp) = l(ibp)\n" . " iwhere(ibp) = 1\n" . " endif\n" . " if (iprint .ge. 100) write (6,*) 'Variable ',ibp,' is fixed.'\n" . " if (nleft .eq. 0 .and. nbreak .eq. n) then\n" . "c all n variables are fixed,\n" . "c return with xcp as GCP.\n" . " dtm = dt\n" . " goto 999\n" . " endif\n" . " \n" . "c Update the derivative information.\n" . " \n" . " nint = nint + 1\n" . " dibp2 = dibp**2\n" . " \n" . "c Update f1 and f2.\n" . " \n" . "c temporarily set f1 and f2 for col=0.\n" . " f1 = f1 + dt*f2 + dibp2 - theta*dibp*zibp\n" . " f2 = f2 - theta*dibp2\n" . "\n" . " if (col .gt. 0) then\n" . "c update c = c + dt*p.\n" . " call daxpy(col2,dt,p,1,c,1)\n" . " \n" . "c choose wbp,\n" . "c the row of W corresponding to the breakpoint encountered.\n" . " pointr = head\n" . " do 70 j = 1,col\n" . " wbp(j) = wy(ibp,pointr)\n" . " wbp(col + j) = theta*ws(ibp,pointr)\n" . " pointr = mod(pointr,m) + 1\n" . " 70 continue \n" . " \n" . "c compute (wbp)Mc, (wbp)Mp, and (wbp)M(wbp)'.\n" . " call bmv(m,sy,wt,col,wbp,v,info)\n" . " if (info .ne. 0) return\n" . " wmc = ddot(col2,c,1,v,1)\n" . " wmp = ddot(col2,p,1,v,1) \n" . " wmw = ddot(col2,wbp,1,v,1)\n" . " \n" . "c update p = p - dibp*wbp. \n" . " call daxpy(col2,-dibp,wbp,1,p,1)\n" . " \n" . "c complete updating f1 and f2 while col > 0.\n" . " f1 = f1 + dibp*wmc\n" . " f2 = f2 + 2.0d0*dibp*wmp - dibp2*wmw\n" . " endif\n" . "\n" . " f2 = max(epsmch*f2_org,f2)\n" . " if (nleft .gt. 0) then\n" . " dtm = -f1/f2\n" . " goto 777\n" . "c to repeat the loop for unsearched intervals. \n" . " else if(bnded) then\n" . " f1 = zero\n" . " f2 = zero\n" . " dtm = zero\n" . " else\n" . " dtm = -f1/f2\n" . " endif \n" . "\n" . "c------------------- the end of the loop -------------------------------\n" . " \n" . " 888 continue\n" . " if (iprint .ge. 99) then\n" . " write (6,*)\n" . " write (6,*) 'GCP found in this segment'\n" . " write (6,4010) nint,f1,f2\n" . " write (6,6010) dtm\n" . " endif \n" . " if (dtm .le. zero) dtm = zero\n" . " tsum = tsum + dtm\n" . " \n" . "c Move free variables (i.e., the ones w/o breakpoints) and \n" . "c the variables whose breakpoints haven't been reached.\n" . " \n" . " call daxpy(n,tsum,d,1,xcp,1)\n" . " \n" . " 999 continue\n" . " \n" . "c Update c = c + dtm*p = W'(x^c - x) \n" . "c which will be used in computing r = Z'(B(x^c - x) + g).\n" . " \n" . " if (col .gt. 0) call daxpy(col2,dtm,p,1,c,1)\n" . " if (iprint .gt. 100) write (6,1010) (xcp(i),i = 1,n)\n" . " if (iprint .ge. 99) write (6,2010)\n" . "\n" . " 1010 format ('Cauchy X = ',/,(4x,1p,6(1x,d11.4)))\n" . " 2010 format (/,'---------------- exit CAUCHY----------------------',/)\n" . " 3010 format (/,'---------------- CAUCHY entered-------------------')\n" . " 4010 format ('Piece ',i3,' --f1, f2 at start point ',1p,2(1x,d11.4))\n" . " 4011 format (/,'Piece ',i3,' --f1, f2 at start point ',\n" . " + 1p,2(1x,d11.4))\n" . " 5010 format ('Distance to the next break point = ',1p,d11.4)\n" . " 6010 format ('Distance to the stationary point = ',1p,d11.4) \n" . " \n" . " return\n" . " \n" . " end\n" . "\n" . "c====================== The end of cauchy ==============================\n" . "\n" . " subroutine cmprlb(n, m, x, g, ws, wy, sy, wt, z, r, wa, index, \n" . " + theta, col, head, nfree, cnstnd, info)\n" . " \n" . " logical cnstnd\n" . " integer n, m, col, head, nfree, info, index(n)\n" . " double precision theta, \n" . " + x(n), g(n), z(n), r(n), wa(4*m), \n" . " + ws(n, m), wy(n, m), sy(m, m), wt(m, m)\n" . "\n" . "c ************\n" . "c\n" . "c Subroutine cmprlb \n" . "c\n" . "c This subroutine computes r=-Z'B(xcp-xk)-Z'g by using \n" . "c wa(2m+1)=W'(xcp-x) from subroutine cauchy.\n" . "c\n" . "c Subprograms called:\n" . "c\n" . "c L-BFGS-B Library ... bmv.\n" . "c\n" . "c\n" . "c * * *\n" . "c\n" . "c NEOS, November 1994. (Latest revision June 1996.)\n" . "c Optimization Technology Center.\n" . "c Argonne National Laboratory and Northwestern University.\n" . "c Written by\n" . "c Ciyou Zhu\n" . "c in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.\n" . "c\n" . "c\n" . "c ************\n" . " \n" . " integer i,j,k,pointr\n" . " double precision a1,a2\n" . "\n" . " if (.not. cnstnd .and. col .gt. 0) then \n" . " do 26 i = 1, n\n" . " r(i) = -g(i)\n" . " 26 continue\n" . " else\n" . " do 30 i = 1, nfree\n" . " k = index(i)\n" . " r(i) = -theta*(z(k) - x(k)) - g(k)\n" . " 30 continue\n" . " call bmv(m,sy,wt,col,wa(2*m+1),wa(1),info)\n" . " if (info .ne. 0) then\n" . " info = -8\n" . " return\n" . " endif\n" . " pointr = head \n" . " do 34 j = 1, col\n" . " a1 = wa(j)\n" . " a2 = theta*wa(col + j)\n" . " do 32 i = 1, nfree\n" . " k = index(i)\n" . " r(i) = r(i) + wy(k,pointr)*a1 + ws(k,pointr)*a2\n" . " 32 continue\n" . " pointr = mod(pointr,m) + 1\n" . " 34 continue\n" . " endif\n" . "\n" . " return\n" . "\n" . " end\n" . "\n" . "c======================= The end of cmprlb =============================\n" . "\n" . " subroutine errclb(n, m, factr, l, u, nbd, task, info, k)\n" . " \n" . " character*60 task\n" . " integer n, m, info, k, nbd(n)\n" . " double precision factr, l(n), u(n)\n" . "\n" . "c ************\n" . "c\n" . "c Subroutine errclb\n" . "c\n" . "c This subroutine checks the validity of the input data.\n" . "c\n" . "c\n" . "c * * *\n" . "c\n" . "c NEOS, November 1994. (Latest revision June 1996.)\n" . "c Optimization Technology Center.\n" . "c Argonne National Laboratory and Northwestern University.\n" . "c Written by\n" . "c Ciyou Zhu\n" . "c in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.\n" . "c\n" . "c\n" . "c ************\n" . "\n" . " integer i\n" . " double precision one,zero\n" . " parameter (one=1.0d0,zero=0.0d0)\n" . "\n" . "c Check the input arguments for errors.\n" . "\n" . " if (n .le. 0) task = 'ERROR: N .LE. 0'\n" . " if (m .le. 0) task = 'ERROR: M .LE. 0'\n" . " if (factr .lt. zero) task = 'ERROR: FACTR .LT. 0'\n" . "\n" . "c Check the validity of the arrays nbd(i), u(i), and l(i).\n" . "\n" . " do 10 i = 1, n\n" . " if (nbd(i) .lt. 0 .or. nbd(i) .gt. 3) then\n" . "c return\n" . " task = 'ERROR: INVALID NBD'\n" . " info = -6\n" . " k = i\n" . " endif\n" . " if (nbd(i) .eq. 2) then\n" . " if (l(i) .gt. u(i)) then\n" . "c return\n" . " task = 'ERROR: NO FEASIBLE SOLUTION'\n" . " info = -7\n" . " k = i\n" . " endif\n" . " endif\n" . " 10 continue\n" . "\n" . " return\n" . "\n" . " end\n" . "\n" . "c======================= The end of errclb =============================\n" . " \n" . " subroutine formk(n, nsub, ind, nenter, ileave, indx2, iupdat, \n" . " + updatd, wn, wn1, m, ws, wy, sy, theta, col,\n" . " + head, info)\n" . "\n" . " integer n, nsub, m, col, head, nenter, ileave, iupdat,\n" . " + info, ind(n), indx2(n)\n" . " double precision theta, wn(2*m, 2*m), wn1(2*m, 2*m),\n" . " + ws(n, m), wy(n, m), sy(m, m)\n" . " logical updatd\n" . "\n" . "c ************\n" . "c\n" . "c Subroutine formk \n" . "c\n" . "c This subroutine forms the LEL^T factorization of the indefinite\n" . "c\n" . "c matrix K = [-D -Y'ZZ'Y/theta L_a'-R_z' ]\n" . "c [L_a -R_z theta*S'AA'S ]\n" . "c where E = [-I 0]\n" . "c [ 0 I]\n" . "c The matrix K can be shown to be equal to the matrix M^[-1]N\n" . "c occurring in section 5.1 of [1], as well as to the matrix\n" . "c Mbar^[-1] Nbar in section 5.3.\n" . "c\n" . "c n is an integer variable.\n" . "c On entry n is the dimension of the problem.\n" . "c On exit n is unchanged.\n" . "c\n" . "c nsub is an integer variable\n" . "c On entry nsub is the number of subspace variables in free set.\n" . "c On exit nsub is not changed.\n" . "c\n" . "c ind is an integer array of dimension nsub.\n" . "c On entry ind specifies the indices of subspace variables.\n" . "c On exit ind is unchanged. \n" . "c\n" . "c nenter is an integer variable.\n" . "c On entry nenter is the number of variables entering the \n" . "c free set.\n" . "c On exit nenter is unchanged. \n" . "c\n" . "c ileave is an integer variable.\n" . "c On entry indx2(ileave),...,indx2(n) are the variables leaving\n" . "c the free set.\n" . "c On exit ileave is unchanged. \n" . "c\n" . "c indx2 is an integer array of dimension n.\n" . "c On entry indx2(1),...,indx2(nenter) are the variables entering\n" . "c the free set, while indx2(ileave),...,indx2(n) are the\n" . "c variables leaving the free set.\n" . "c On exit indx2 is unchanged. \n" . "c\n" . "c iupdat is an integer variable.\n" . "c On entry iupdat is the total number of BFGS updates made so far.\n" . "c On exit iupdat is unchanged. \n" . "c\n" . "c updatd is a logical variable.\n" . "c On entry 'updatd' is true if the L-BFGS matrix is updatd.\n" . "c On exit 'updatd' is unchanged. \n" . "c\n" . "c wn is a double precision array of dimension 2m x 2m.\n" . "c On entry wn is unspecified.\n" . "c On exit the upper triangle of wn stores the LEL^T factorization\n" . "c of the 2*col x 2*col indefinite matrix\n" . "c [-D -Y'ZZ'Y/theta L_a'-R_z' ]\n" . "c [L_a -R_z theta*S'AA'S ]\n" . "c\n" . "c wn1 is a double precision array of dimension 2m x 2m.\n" . "c On entry wn1 stores the lower triangular part of \n" . "c [Y' ZZ'Y L_a'+R_z']\n" . "c [L_a+R_z S'AA'S ]\n" . "c in the previous iteration.\n" . "c On exit wn1 stores the corresponding updated matrices.\n" . "c The purpose of wn1 is just to store these inner products\n" . "c so they can be easily updated and inserted into wn.\n" . "c\n" . "c m is an integer variable.\n" . "c On entry m is the maximum number of variable metric corrections\n" . "c used to define the limited memory matrix.\n" . "c On exit m is unchanged.\n" . "c\n" . "c ws, wy, sy, and wtyy are double precision arrays;\n" . "c theta is a double precision variable;\n" . "c col is an integer variable;\n" . "c head is an integer variable.\n" . "c On entry they store the information defining the\n" . "c limited memory BFGS matrix:\n" . "c ws(n,m) stores S, a set of s-vectors;\n" . "c wy(n,m) stores Y, a set of y-vectors;\n" . "c sy(m,m) stores S'Y;\n" . "c wtyy(m,m) stores the Cholesky factorization\n" . "c of (theta*S'S+LD^(-1)L')\n" . "c theta is the scaling factor specifying B_0 = theta I;\n" . "c col is the number of variable metric corrections stored;\n" . "c head is the location of the 1st s- (or y-) vector in S (or Y).\n" . "c On exit they are unchanged.\n" . "c\n" . "c info is an integer variable.\n" . "c On entry info is unspecified.\n" . "c On exit info = 0 for normal return;\n" . "c = -1 when the 1st Cholesky factorization failed;\n" . "c = -2 when the 2st Cholesky factorization failed.\n" . "c\n" . "c Subprograms called:\n" . "c\n" . "c Linpack ... dcopy, dpofa, dtrsl.\n" . "c\n" . "c\n" . "c References:\n" . "c [1] R. H. Byrd, P. Lu, J. Nocedal and C. Zhu, ``A limited\n" . "c memory algorithm for bound constrained optimization'',\n" . "c SIAM J. Scientific Computing 16 (1995), no. 5, pp. 1190--1208.\n" . "c\n" . "c [2] C. Zhu, R.H. Byrd, P. Lu, J. Nocedal, ``L-BFGS-B: a\n" . "c limited memory FORTRAN code for solving bound constrained\n" . "c optimization problems'', Tech. Report, NAM-11, EECS Department,\n" . "c Northwestern University, 1994.\n" . "c\n" . "c (Postscript files of these papers are available via anonymous\n" . "c ftp to eecs.nwu.edu in the directory pub/lbfgs/lbfgs_bcm.)\n" . "c\n" . "c * * *\n" . "c\n" . "c NEOS, November 1994. (Latest revision June 1996.)\n" . "c Optimization Technology Center.\n" . "c Argonne National Laboratory and Northwestern University.\n" . "c Written by\n" . "c Ciyou Zhu\n" . "c in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.\n" . "c\n" . "c\n" . "c ************\n" . "\n" . " integer m2,ipntr,jpntr,iy,is,jy,js,is1,js1,k1,i,k,\n" . " + col2,pbegin,pend,dbegin,dend,upcl\n" . " double precision ddot,temp1,temp2,temp3,temp4\n" . " double precision one,zero\n" . " parameter (one=1.0d0,zero=0.0d0)\n" . "\n" . "c Form the lower triangular part of\n" . "c WN1 = [Y' ZZ'Y L_a'+R_z'] \n" . "c [L_a+R_z S'AA'S ]\n" . "c where L_a is the strictly lower triangular part of S'AA'Y\n" . "c R_z is the upper triangular part of S'ZZ'Y.\n" . " \n" . " if (updatd) then\n" . " if (iupdat .gt. m) then \n" . "c shift old part of WN1.\n" . " do 10 jy = 1, m - 1\n" . " js = m + jy\n" . " call dcopy(m-jy,wn1(jy+1,jy+1),1,wn1(jy,jy),1)\n" . " call dcopy(m-jy,wn1(js+1,js+1),1,wn1(js,js),1)\n" . " call dcopy(m-1,wn1(m+2,jy+1),1,wn1(m+1,jy),1)\n" . " 10 continue\n" . " endif\n" . " \n" . "c put new rows in blocks (1,1), (2,1) and (2,2).\n" . " pbegin = 1\n" . " pend = nsub\n" . " dbegin = nsub + 1\n" . " dend = n\n" . " iy = col\n" . " is = m + col\n" . " ipntr = head + col - 1\n" . " if (ipntr .gt. m) ipntr = ipntr - m \n" . " jpntr = head\n" . " do 20 jy = 1, col\n" . " js = m + jy\n" . " temp1 = zero\n" . " temp2 = zero\n" . " temp3 = zero\n" . "c compute element jy of row 'col' of Y'ZZ'Y\n" . " do 15 k = pbegin, pend\n" . " k1 = ind(k)\n" . " temp1 = temp1 + wy(k1,ipntr)*wy(k1,jpntr)\n" . " 15 continue\n" . "c compute elements jy of row 'col' of L_a and S'AA'S\n" . " do 16 k = dbegin, dend\n" . " k1 = ind(k)\n" . " temp2 = temp2 + ws(k1,ipntr)*ws(k1,jpntr)\n" . " temp3 = temp3 + ws(k1,ipntr)*wy(k1,jpntr)\n" . " 16 continue\n" . " wn1(iy,jy) = temp1\n" . " wn1(is,js) = temp2\n" . " wn1(is,jy) = temp3\n" . " jpntr = mod(jpntr,m) + 1\n" . " 20 continue\n" . " \n" . "c put new column in block (2,1).\n" . " jy = col \n" . " jpntr = head + col - 1\n" . " if (jpntr .gt. m) jpntr = jpntr - m\n" . " ipntr = head\n" . " do 30 i = 1, col\n" . " is = m + i\n" . " temp3 = zero\n" . "c compute element i of column 'col' of R_z\n" . " do 25 k = pbegin, pend\n" . " k1 = ind(k)\n" . " temp3 = temp3 + ws(k1,ipntr)*wy(k1,jpntr)\n" . " 25 continue \n" . " ipntr = mod(ipntr,m) + 1\n" . " wn1(is,jy) = temp3\n" . " 30 continue\n" . " upcl = col - 1\n" . " else\n" . " upcl = col\n" . " endif\n" . " \n" . "c modify the old parts in blocks (1,1) and (2,2) due to changes\n" . "c in the set of free variables.\n" . " ipntr = head \n" . " do 45 iy = 1, upcl\n" . " is = m + iy\n" . " jpntr = head\n" . " do 40 jy = 1, iy\n" . " js = m + jy\n" . " temp1 = zero\n" . " temp2 = zero\n" . " temp3 = zero\n" . " temp4 = zero\n" . " do 35 k = 1, nenter\n" . " k1 = indx2(k)\n" . " temp1 = temp1 + wy(k1,ipntr)*wy(k1,jpntr)\n" . " temp2 = temp2 + ws(k1,ipntr)*ws(k1,jpntr)\n" . " 35 continue\n" . " do 36 k = ileave, n\n" . " k1 = indx2(k)\n" . " temp3 = temp3 + wy(k1,ipntr)*wy(k1,jpntr)\n" . " temp4 = temp4 + ws(k1,ipntr)*ws(k1,jpntr)\n" . " 36 continue\n" . " wn1(iy,jy) = wn1(iy,jy) + temp1 - temp3 \n" . " wn1(is,js) = wn1(is,js) - temp2 + temp4 \n" . " jpntr = mod(jpntr,m) + 1\n" . " 40 continue\n" . " ipntr = mod(ipntr,m) + 1\n" . " 45 continue\n" . " \n" . "c modify the old parts in block (2,1).\n" . " ipntr = head \n" . " do 60 is = m + 1, m + upcl\n" . " jpntr = head \n" . " do 55 jy = 1, upcl\n" . " temp1 = zero\n" . " temp3 = zero\n" . " do 50 k = 1, nenter\n" . " k1 = indx2(k)\n" . " temp1 = temp1 + ws(k1,ipntr)*wy(k1,jpntr)\n" . " 50 continue\n" . " do 51 k = ileave, n\n" . " k1 = indx2(k)\n" . " temp3 = temp3 + ws(k1,ipntr)*wy(k1,jpntr)\n" . " 51 continue\n" . " if (is .le. jy + m) then\n" . " wn1(is,jy) = wn1(is,jy) + temp1 - temp3 \n" . " else\n" . " wn1(is,jy) = wn1(is,jy) - temp1 + temp3 \n" . " endif\n" . " jpntr = mod(jpntr,m) + 1\n" . " 55 continue\n" . " ipntr = mod(ipntr,m) + 1\n" . " 60 continue\n" . " \n" . "c Form the upper triangle of WN = [D+Y' ZZ'Y/theta -L_a'+R_z' ] \n" . "c [-L_a +R_z S'AA'S*theta]\n" . "\n" . " m2 = 2*m\n" . " do 70 iy = 1, col\n" . " is = col + iy\n" . " is1 = m + iy\n" . " do 65 jy = 1, iy\n" . " js = col + jy\n" . " js1 = m + jy\n" . " wn(jy,iy) = wn1(iy,jy)/theta\n" . " wn(js,is) = wn1(is1,js1)*theta\n" . " 65 continue\n" . " do 66 jy = 1, iy - 1\n" . " wn(jy,is) = -wn1(is1,jy)\n" . " 66 continue\n" . " do 67 jy = iy, col\n" . " wn(jy,is) = wn1(is1,jy)\n" . " 67 continue\n" . " wn(iy,iy) = wn(iy,iy) + sy(iy,iy)\n" . " 70 continue\n" . "\n" . "c Form the upper triangle of WN= [ LL' L^-1(-L_a'+R_z')] \n" . "c [(-L_a +R_z)L'^-1 S'AA'S*theta ]\n" . "\n" . "c first Cholesky factor (1,1) block of wn to get LL'\n" . "c with L' stored in the upper triangle of wn.\n" . " call dpofa(wn,m2,col,info)\n" . " if (info .ne. 0) then\n" . " info = -1\n" . " return\n" . " endif\n" . "c then form L^-1(-L_a'+R_z') in the (1,2) block.\n" . " col2 = 2*col\n" . " do 71 js = col+1 ,col2\n" . " call dtrsl(wn,m2,col,wn(1,js),11,info)\n" . " 71 continue\n" . "\n" . "c Form S'AA'S*theta + (L^-1(-L_a'+R_z'))'L^-1(-L_a'+R_z') in the\n" . "c upper triangle of (2,2) block of wn.\n" . " \n" . "\n" . " do 72 is = col+1, col2\n" . " do 74 js = is, col2\n" . " wn(is,js) = wn(is,js) + ddot(col,wn(1,is),1,wn(1,js),1)\n" . " 74 continue\n" . " 72 continue\n" . "\n" . "c Cholesky factorization of (2,2) block of wn.\n" . "\n" . " call dpofa(wn(col+1,col+1),m2,col,info)\n" . " if (info .ne. 0) then\n" . " info = -2\n" . " return\n" . " endif\n" . "\n" . " return\n" . "\n" . " end\n" . "\n" . "c======================= The end of formk ==============================\n" . "\n" . " subroutine formt(m, wt, sy, ss, col, theta, info)\n" . " \n" . " integer m, col, info\n" . " double precision theta, wt(m, m), sy(m, m), ss(m, m)\n" . "\n" . "c ************\n" . "c\n" . "c Subroutine formt\n" . "c\n" . "c This subroutine forms the upper half of the pos. def. and symm.\n" . "c T = theta*SS + L*D^(-1)*L', stores T in the upper triangle\n" . "c of the array wt, and performs the Cholesky factorization of T\n" . "c to produce J*J', with J' stored in the upper triangle of wt.\n" . "c\n" . "c Subprograms called:\n" . "c\n" . "c Linpack ... dpofa.\n" . "c\n" . "c\n" . "c * * *\n" . "c\n" . "c NEOS, November 1994. (Latest revision June 1996.)\n" . "c Optimization Technology Center.\n" . "c Argonne National Laboratory and Northwestern University.\n" . "c Written by\n" . "c Ciyou Zhu\n" . "c in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.\n" . "c\n" . "c\n" . "c ************\n" . "\n" . " integer i,j,k,k1\n" . " double precision ddum\n" . " double precision zero\n" . " parameter (zero=0.0d0)\n" . "\n" . "\n" . "c Form the upper half of T = theta*SS + L*D^(-1)*L',\n" . "c store T in the upper triangle of the array wt.\n" . " \n" . " do 52 j = 1, col\n" . " wt(1,j) = theta*ss(1,j)\n" . " 52 continue\n" . " do 55 i = 2, col\n" . " do 54 j = i, col\n" . " k1 = min(i,j) - 1\n" . " ddum = zero\n" . " do 53 k = 1, k1\n" . " ddum = ddum + sy(i,k)*sy(j,k)/sy(k,k)\n" . " 53 continue\n" . " wt(i,j) = ddum + theta*ss(i,j)\n" . " 54 continue\n" . " 55 continue\n" . " \n" . "c Cholesky factorize T to J*J' with \n" . "c J' stored in the upper triangle of wt.\n" . " \n" . " call dpofa(wt,m,col,info)\n" . " if (info .ne. 0) then\n" . " info = -3\n" . " endif\n" . "\n" . " return\n" . "\n" . " end\n" . "\n" . "c======================= The end of formt ==============================\n" . " \n" . " subroutine freev(n, nfree, index, nenter, ileave, indx2, \n" . " + iwhere, wrk, updatd, cnstnd, iprint, iter)\n" . "\n" . " integer n, nfree, nenter, ileave, iprint, iter, \n" . " + index(n), indx2(n), iwhere(n)\n" . " logical wrk, updatd, cnstnd\n" . "\n" . "c ************\n" . "c\n" . "c Subroutine freev \n" . "c\n" . "c This subroutine counts the entering and leaving variables when\n" . "c iter > 0, and finds the index set of free and active variables\n" . "c at the GCP.\n" . "c\n" . "c cnstnd is a logical variable indicating whether bounds are present\n" . "c\n" . "c index is an integer array of dimension n\n" . "c for i=1,...,nfree, index(i) are the indices of free variables\n" . "c for i=nfree+1,...,n, index(i) are the indices of bound variables\n" . "c On entry after the first iteration, index gives \n" . "c the free variables at the previous iteration.\n" . "c On exit it gives the free variables based on the determination\n" . "c in cauchy using the array iwhere.\n" . "c\n" . "c indx2 is an integer array of dimension n\n" . "c On entry indx2 is unspecified.\n" . "c On exit with iter>0, indx2 indicates which variables\n" . "c have changed status since the previous iteration.\n" . "c For i= 1,...,nenter, indx2(i) have changed from bound to free.\n" . "c For i= ileave+1,...,n, indx2(i) have changed from free to bound.\n" . "c \n" . "c\n" . "c * * *\n" . "c\n" . "c NEOS, November 1994. (Latest revision June 1996.)\n" . "c Optimization Technology Center.\n" . "c Argonne National Laboratory and Northwestern University.\n" . "c Written by\n" . "c Ciyou Zhu\n" . "c in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.\n" . "c\n" . "c\n" . "c ************\n" . " \n" . " integer iact,i,k\n" . "\n" . " nenter = 0\n" . " ileave = n + 1\n" . " if (iter .gt. 0 .and. cnstnd) then\n" . "c count the entering and leaving variables.\n" . " do 20 i = 1, nfree\n" . " k = index(i)\n" . " if (iwhere(k) .gt. 0) then\n" . " ileave = ileave - 1\n" . " indx2(ileave) = k\n" . " if (iprint .ge. 100) write (6,*)\n" . " + 'Variable ',k,' leaves the set of free variables'\n" . " endif\n" . " 20 continue\n" . " do 22 i = 1 + nfree, n\n" . " k = index(i)\n" . " if (iwhere(k) .le. 0) then\n" . " nenter = nenter + 1\n" . " indx2(nenter) = k\n" . " if (iprint .ge. 100) write (6,*)\n" . " + 'Variable ',k,' enters the set of free variables'\n" . " endif\n" . " 22 continue\n" . " if (iprint .ge. 99) write (6,*)\n" . " + n+1-ileave,' variables leave; ',nenter,' variables enter'\n" . " endif\n" . " wrk = (ileave .lt. n+1) .or. (nenter .gt. 0) .or. updatd\n" . " \n" . "c Find the index set of free and active variables at the GCP.\n" . " \n" . " nfree = 0 \n" . " iact = n + 1\n" . " do 24 i = 1, n\n" . " if (iwhere(i) .le. 0) then\n" . " nfree = nfree + 1\n" . " index(nfree) = i\n" . " else\n" . " iact = iact - 1\n" . " index(iact) = i\n" . " endif\n" . " 24 continue\n" . " if (iprint .ge. 99) write (6,*)\n" . " + nfree,' variables are free at GCP ',iter + 1 \n" . "\n" . " return\n" . "\n" . " end\n" . "\n" . "c======================= The end of freev ==============================\n" . "\n" . " subroutine hpsolb(n, t, iorder, iheap)\n" . " integer iheap, n, iorder(n)\n" . " double precision t(n)\n" . " \n" . "c ************\n" . "c\n" . "c Subroutine hpsolb \n" . "c\n" . "c This subroutine sorts out the least element of t, and puts the\n" . "c remaining elements of t in a heap.\n" . "c \n" . "c n is an integer variable.\n" . "c On entry n is the dimension of the arrays t and iorder.\n" . "c On exit n is unchanged.\n" . "c\n" . "c t is a double precision array of dimension n.\n" . "c On entry t stores the elements to be sorted,\n" . "c On exit t(n) stores the least elements of t, and t(1) to t(n-1)\n" . "c stores the remaining elements in the form of a heap.\n" . "c\n" . "c iorder is an integer array of dimension n.\n" . "c On entry iorder(i) is the index of t(i).\n" . "c On exit iorder(i) is still the index of t(i), but iorder may be\n" . "c permuted in accordance with t.\n" . "c\n" . "c iheap is an integer variable specifying the task.\n" . "c On entry iheap should be set as follows:\n" . "c iheap .eq. 0 if t(1) to t(n) is not in the form of a heap,\n" . "c iheap .ne. 0 if otherwise.\n" . "c On exit iheap is unchanged.\n" . "c\n" . "c\n" . "c References:\n" . "c Algorithm 232 of CACM (J. W. J. Williams): HEAPSORT.\n" . "c\n" . "c * * *\n" . "c\n" . "c NEOS, November 1994. (Latest revision June 1996.)\n" . "c Optimization Technology Center.\n" . "c Argonne National Laboratory and Northwestern University.\n" . "c Written by\n" . "c Ciyou Zhu\n" . "c in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.\n" . "c\n" . "c ************\n" . " \n" . " integer i,j,k,indxin,indxou\n" . " double precision ddum,out\n" . "\n" . " if (iheap .eq. 0) then\n" . "\n" . "c Rearrange the elements t(1) to t(n) to form a heap.\n" . "\n" . " do 20 k = 2, n\n" . " ddum = t(k)\n" . " indxin = iorder(k)\n" . "\n" . "c Add ddum to the heap.\n" . " i = k\n" . " 10 continue\n" . " if (i.gt.1) then\n" . " j = i/2\n" . " if (ddum .lt. t(j)) then\n" . " t(i) = t(j)\n" . " iorder(i) = iorder(j)\n" . " i = j\n" . " goto 10 \n" . " endif \n" . " endif \n" . " t(i) = ddum\n" . " iorder(i) = indxin\n" . " 20 continue\n" . " endif\n" . " \n" . "c Assign to 'out' the value of t(1), the least member of the heap,\n" . "c and rearrange the remaining members to form a heap as\n" . "c elements 1 to n-1 of t.\n" . " \n" . " if (n .gt. 1) then\n" . " i = 1\n" . " out = t(1)\n" . " indxou = iorder(1)\n" . " ddum = t(n)\n" . " indxin = iorder(n)\n" . "\n" . "c Restore the heap \n" . " 30 continue\n" . " j = i+i\n" . " if (j .le. n-1) then\n" . " if (t(j+1) .lt. t(j)) j = j+1\n" . " if (t(j) .lt. ddum ) then\n" . " t(i) = t(j)\n" . " iorder(i) = iorder(j)\n" . " i = j\n" . " goto 30\n" . " endif \n" . " endif \n" . " t(i) = ddum\n" . " iorder(i) = indxin\n" . " \n" . "c Put the least member in t(n). \n" . "\n" . " t(n) = out\n" . " iorder(n) = indxou\n" . " endif \n" . "\n" . " return\n" . "\n" . " end\n" . "\n" . "c====================== The end of hpsolb ==============================\n" . "\n" . " subroutine lnsrlb(n, l, u, nbd, x, f, fold, gd, gdold, g, d, r, t,\n" . " + z, stp, dnorm, dtd, xstep, stpmx, iter, ifun,\n" . " + iback, nfgv, info, task, boxed, cnstnd, csave,\n" . " + isave, dsave)\n" . "\n" . " character*60 task, csave\n" . " logical boxed, cnstnd\n" . " integer n, iter, ifun, iback, nfgv, info,\n" . " + nbd(n), isave(2)\n" . " double precision f, fold, gd, gdold, stp, dnorm, dtd, xstep,\n" . " + stpmx, x(n), l(n), u(n), g(n), d(n), r(n), t(n),\n" . " + z(n), dsave(13)\n" . "c **********\n" . "c\n" . "c Subroutine lnsrlb\n" . "c\n" . "c This subroutine calls subroutine dcsrch from the Minpack2 library\n" . "c to perform the line search. Subroutine dscrch is safeguarded so\n" . "c that all trial points lie within the feasible region.\n" . "c\n" . "c Subprograms called:\n" . "c\n" . "c Minpack2 Library ... dcsrch.\n" . "c\n" . "c Linpack ... dtrsl, ddot.\n" . "c\n" . "c\n" . "c * * *\n" . "c\n" . "c NEOS, November 1994. (Latest revision June 1996.)\n" . "c Optimization Technology Center.\n" . "c Argonne National Laboratory and Northwestern University.\n" . "c Written by\n" . "c Ciyou Zhu\n" . "c in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.\n" . "c\n" . "c\n" . "c **********\n" . "\n" . " integer i\n" . " double precision ddot,a1,a2\n" . " double precision one,zero,big\n" . " parameter (one=1.0d0,zero=0.0d0,big=1.0d+10)\n" . " double precision ftol,gtol,xtol\n" . " parameter (ftol=1.0d-3,gtol=0.9d0,xtol=0.1d0)\n" . "\n" . " if (task(1:5) .eq. 'FG_LN') goto 556\n" . "\n" . " dtd = ddot(n,d,1,d,1)\n" . " dnorm = sqrt(dtd)\n" . "\n" . "c Determine the maximum step length.\n" . "\n" . " stpmx = big\n" . " if (cnstnd) then\n" . " if (iter .eq. 0) then\n" . " stpmx = one\n" . " else\n" . " do 43 i = 1, n\n" . " a1 = d(i)\n" . " if (nbd(i) .ne. 0) then\n" . " if (a1 .lt. zero .and. nbd(i) .le. 2) then\n" . " a2 = l(i) - x(i)\n" . " if (a2 .ge. zero) then\n" . " stpmx = zero\n" . " else if (a1*stpmx .lt. a2) then\n" . " stpmx = a2/a1\n" . " endif\n" . " else if (a1 .gt. zero .and. nbd(i) .ge. 2) then\n" . " a2 = u(i) - x(i)\n" . " if (a2 .le. zero) then\n" . " stpmx = zero\n" . " else if (a1*stpmx .gt. a2) then\n" . " stpmx = a2/a1\n" . " endif\n" . " endif\n" . " endif\n" . " 43 continue\n" . " endif\n" . " endif\n" . " \n" . " if (iter .eq. 0 .and. .not. boxed) then\n" . " stp = min(one/dnorm, stpmx)\n" . " else\n" . " stp = one\n" . " endif \n" . "\n" . " call dcopy(n,x,1,t,1)\n" . " call dcopy(n,g,1,r,1)\n" . " fold = f\n" . " ifun = 0\n" . " iback = 0\n" . " csave = 'START'\n" . " 556 continue\n" . " gd = ddot(n,g,1,d,1)\n" . " if (ifun .eq. 0) then\n" . " gdold=gd\n" . " if (gd .ge. zero) then\n" . "c the directional derivative >=0.\n" . "c Line search is impossible.\n" . " info = -4\n" . " return\n" . " endif\n" . " endif\n" . "\n" . " call dcsrch(f,gd,stp,ftol,gtol,xtol,zero,stpmx,csave,isave,dsave)\n" . "\n" . " xstep = stp*dnorm\n" . " if (csave(1:4) .ne. 'CONV' .and. csave(1:4) .ne. 'WARN') then\n" . " task = 'FG_LNSRCH'\n" . " ifun = ifun + 1\n" . " nfgv = nfgv + 1\n" . " iback = ifun - 1 \n" . " if (stp .eq. one) then\n" . " call dcopy(n,z,1,x,1)\n" . " else\n" . " do 41 i = 1, n\n" . " x(i) = stp*d(i) + t(i)\n" . " 41 continue\n" . " endif\n" . " else\n" . " task = 'NEW_X'\n" . " endif\n" . "\n" . " return\n" . "\n" . " end\n" . "\n" . "c======================= The end of lnsrlb =============================\n" . "\n" . " subroutine matupd(n, m, ws, wy, sy, ss, d, r, itail, \n" . " + iupdat, col, head, theta, rr, dr, stp, dtd)\n" . " \n" . " integer n, m, itail, iupdat, col, head\n" . " double precision theta, rr, dr, stp, dtd, d(n), r(n), \n" . " + ws(n, m), wy(n, m), sy(m, m), ss(m, m)\n" . "\n" . "c ************\n" . "c\n" . "c Subroutine matupd\n" . "c\n" . "c This subroutine updates matrices WS and WY, and forms the\n" . "c middle matrix in B.\n" . "c\n" . "c Subprograms called:\n" . "c\n" . "c Linpack ... dcopy, ddot.\n" . "c\n" . "c\n" . "c * * *\n" . "c\n" . "c NEOS, November 1994. (Latest revision June 1996.)\n" . "c Optimization Technology Center.\n" . "c Argonne National Laboratory and Northwestern University.\n" . "c Written by\n" . "c Ciyou Zhu\n" . "c in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.\n" . "c\n" . "c\n" . "c ************\n" . " \n" . " integer j,pointr\n" . " double precision ddot\n" . " double precision one\n" . " parameter (one=1.0d0)\n" . "\n" . "c Set pointers for matrices WS and WY.\n" . " \n" . " if (iupdat .le. m) then\n" . " col = iupdat\n" . " itail = mod(head+iupdat-2,m) + 1\n" . " else\n" . " itail = mod(itail,m) + 1\n" . " head = mod(head,m) + 1\n" . " endif\n" . " \n" . "c Update matrices WS and WY.\n" . "\n" . " call dcopy(n,d,1,ws(1,itail),1)\n" . " call dcopy(n,r,1,wy(1,itail),1)\n" . " \n" . "c Set theta=yy/ys.\n" . " \n" . " theta = rr/dr\n" . " \n" . "c Form the middle matrix in B.\n" . " \n" . "c update the upper triangle of SS,\n" . "c and the lower triangle of SY:\n" . " if (iupdat .gt. m) then\n" . "c move old information\n" . " do 50 j = 1, col - 1\n" . " call dcopy(j,ss(2,j+1),1,ss(1,j),1)\n" . " call dcopy(col-j,sy(j+1,j+1),1,sy(j,j),1)\n" . " 50 continue\n" . " endif\n" . "c add new information: the last row of SY\n" . "c and the last column of SS:\n" . " pointr = head\n" . " do 51 j = 1, col - 1\n" . " sy(col,j) = ddot(n,d,1,wy(1,pointr),1)\n" . " ss(j,col) = ddot(n,ws(1,pointr),1,d,1)\n" . " pointr = mod(pointr,m) + 1\n" . " 51 continue\n" . " if (stp .eq. one) then\n" . " ss(col,col) = dtd\n" . " else\n" . " ss(col,col) = stp*stp*dtd\n" . " endif\n" . " sy(col,col) = dr\n" . " \n" . " return\n" . "\n" . " end\n" . "\n" . "c======================= The end of matupd =============================\n" . "\n" . " subroutine prn1lb(n, m, l, u, x, iprint, itfile, epsmch)\n" . " \n" . " integer n, m, iprint, itfile\n" . " double precision epsmch, x(n), l(n), u(n)\n" . "\n" . "c ************\n" . "c\n" . "c Subroutine prn1lb\n" . "c\n" . "c This subroutine prints the input data, initial point, upper and\n" . "c lower bounds of each variable, machine precision, as well as \n" . "c the headings of the output.\n" . "c\n" . "c\n" . "c * * *\n" . "c\n" . "c NEOS, November 1994. (Latest revision June 1996.)\n" . "c Optimization Technology Center.\n" . "c Argonne National Laboratory and Northwestern University.\n" . "c Written by\n" . "c Ciyou Zhu\n" . "c in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.\n" . "c\n" . "c\n" . "c ************\n" . "\n" . " integer i\n" . "\n" . " if (iprint .ge. 0) then\n" . " write (6,7001) epsmch\n" . " write (6,*) 'N = ',n,' M = ',m\n" . " if (iprint .ge. 1) then\n" . " write (itfile,2001) epsmch\n" . " write (itfile,*)'N = ',n,' M = ',m\n" . " write (itfile,9001)\n" . " if (iprint .gt. 100) then\n" . " write (6,1004) 'L =',(l(i),i = 1,n)\n" . " write (6,1004) 'X0 =',(x(i),i = 1,n)\n" . " write (6,1004) 'U =',(u(i),i = 1,n)\n" . " endif \n" . " endif\n" . " endif \n" . "\n" . " 1004 format (/,a4, 1p, 6(1x,d11.4),/,(4x,1p,6(1x,d11.4)))\n" . " 2001 format ('RUNNING THE L-BFGS-B CODE',/,/,\n" . " + 'it = iteration number',/,\n" . " + 'nf = number of function evaluations',/,\n" . " + 'nint = number of segments explored during the Cauchy search',/,\n" . " + 'nact = number of active bounds at the generalized Cauchy point'\n" . " + ,/,\n" . " + 'sub = manner in which the subspace minimization terminated:'\n" . " + ,/,' con = converged, bnd = a bound was reached',/,\n" . " + 'itls = number of iterations performed in the line search',/,\n" . " + 'stepl = step length used',/,\n" . " + 'tstep = norm of the displacement (total step)',/,\n" . " + 'projg = norm of the projected gradient',/,\n" . " + 'f = function value',/,/,\n" . " + ' * * *',/,/,\n" . " + 'Machine precision =',1p,d10.3)\n" . " 7001 format ('RUNNING THE L-BFGS-B CODE',/,/,\n" . " + ' * * *',/,/,\n" . " + 'Machine precision =',1p,d10.3)\n" . " 9001 format (/,3x,'it',3x,'nf',2x,'nint',2x,'nact',2x,'sub',2x,'itls',\n" . " + 2x,'stepl',4x,'tstep',5x,'projg',8x,'f')\n" . "\n" . " return\n" . "\n" . " end\n" . "\n" . "c======================= The end of prn1lb =============================\n" . "\n" . " subroutine prn2lb(n, x, f, g, iprint, itfile, iter, nfgv, nact, \n" . " + sbgnrm, nint, word, iword, iback, stp, xstep)\n" . " \n" . " character*3 word\n" . " integer n, iprint, itfile, iter, nfgv, nact, nint,\n" . " + iword, iback\n" . " double precision f, sbgnrm, stp, xstep, x(n), g(n)\n" . "\n" . "c ************\n" . "c\n" . "c Subroutine prn2lb\n" . "c\n" . "c This subroutine prints out new information after a successful\n" . "c line search. \n" . "c\n" . "c\n" . "c * * *\n" . "c\n" . "c NEOS, November 1994. (Latest revision June 1996.)\n" . "c Optimization Technology Center.\n" . "c Argonne National Laboratory and Northwestern University.\n" . "c Written by\n" . "c Ciyou Zhu\n" . "c in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.\n" . "c\n" . "c\n" . "c ************\n" . "\n" . " integer i,imod\n" . "\n" . "c 'word' records the status of subspace solutions.\n" . " if (iword .eq. 0) then\n" . "c the subspace minimization converged.\n" . " word = 'con'\n" . " else if (iword .eq. 1) then\n" . "c the subspace minimization stopped at a bound.\n" . " word = 'bnd'\n" . " else if (iword .eq. 5) then\n" . "c the truncated Newton step has been used.\n" . " word = 'TNT'\n" . " else\n" . " word = '---'\n" . " endif\n" . " if (iprint .ge. 99) then\n" . " write (6,*) 'LINE SEARCH',iback,' times; norm of step = ',xstep\n" . " write (6,2001) iter,f,sbgnrm\n" . " if (iprint .gt. 100) then \n" . " write (6,1004) 'X =',(x(i), i = 1, n)\n" . " write (6,1004) 'G =',(g(i), i = 1, n)\n" . " endif\n" . " else if (iprint .gt. 0) then \n" . " imod = mod(iter,iprint)\n" . " if (imod .eq. 0) write (6,2001) iter,f,sbgnrm\n" . " endif\n" . " if (iprint .ge. 1) write (itfile,3001)\n" . " + iter,nfgv,nint,nact,word,iback,stp,xstep,sbgnrm,f\n" . "\n" . " 1004 format (/,a4, 1p, 6(1x,d11.4),/,(4x,1p,6(1x,d11.4)))\n" . " 2001 format\n" . " + (/,'At iterate',i5,4x,'f= ',1p,d12.5,4x,'|proj g|= ',1p,d12.5)\n" . " 3001 format(2(1x,i4),2(1x,i5),2x,a3,1x,i4,1p,2(2x,d7.1),1p,2(1x,d10.3))\n" . "\n" . " return\n" . "\n" . " end\n" . "\n" . "c======================= The end of prn2lb =============================\n" . "\n" . " subroutine prn3lb(n, x, f, task, iprint, info, itfile, \n" . " + iter, nfgv, nintol, nskip, nact, sbgnrm, \n" . " + time, nint, word, iback, stp, xstep, k, \n" . " + cachyt, sbtime, lnscht)\n" . " \n" . " character*60 task\n" . " character*3 word\n" . " integer n, iprint, info, itfile, iter, nfgv, nintol,\n" . " + nskip, nact, nint, iback, k\n" . " double precision f, sbgnrm, time, stp, xstep, cachyt, sbtime,\n" . " + lnscht, x(n)\n" . "\n" . "c ************\n" . "c\n" . "c Subroutine prn3lb\n" . "c\n" . "c This subroutine prints out information when either a built-in\n" . "c convergence test is satisfied or when an error message is\n" . "c generated.\n" . "c \n" . "c\n" . "c * * *\n" . "c\n" . "c NEOS, November 1994. (Latest revision June 1996.)\n" . "c Optimization Technology Center.\n" . "c Argonne National Laboratory and Northwestern University.\n" . "c Written by\n" . "c Ciyou Zhu\n" . "c in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.\n" . "c\n" . "c\n" . "c ************\n" . "\n" . " integer i\n" . "\n" . " if (task(1:5) .eq. 'ERROR') goto 999\n" . "\n" . " if (iprint .ge. 0) then\n" . " write (6,3003)\n" . " write (6,3004)\n" . " write(6,3005) n,iter,nfgv,nintol,nskip,nact,sbgnrm,f\n" . " if (iprint .ge. 100) then\n" . " write (6,1004) 'X =',(x(i),i = 1,n)\n" . " endif \n" . " if (iprint .ge. 1) write (6,*) ' F =',f\n" . " endif \n" . " 999 continue\n" . " if (iprint .ge. 0) then\n" . " write (6,3009) task\n" . " if (info .ne. 0) then\n" . " if (info .eq. -1) write (6,9011)\n" . " if (info .eq. -2) write (6,9012)\n" . " if (info .eq. -3) write (6,9013)\n" . " if (info .eq. -4) write (6,9014)\n" . " if (info .eq. -5) write (6,9015)\n" . " if (info .eq. -6) write (6,*)' Input nbd(',k,') is invalid.'\n" . " if (info .eq. -7) \n" . " + write (6,*)' l(',k,') > u(',k,'). No feasible solution.'\n" . " if (info .eq. -8) write (6,9018)\n" . " if (info .eq. -9) write (6,9019)\n" . " endif\n" . " if (iprint .ge. 1) write (6,3007) cachyt,sbtime,lnscht\n" . " write (6,3008) time\n" . " if (iprint .ge. 1) then\n" . " if (info .eq. -4 .or. info .eq. -9) then\n" . " write (itfile,3002)\n" . " + iter,nfgv,nint,nact,word,iback,stp,xstep\n" . " endif\n" . " write (itfile,3009) task\n" . " if (info .ne. 0) then\n" . " if (info .eq. -1) write (itfile,9011)\n" . " if (info .eq. -2) write (itfile,9012)\n" . " if (info .eq. -3) write (itfile,9013)\n" . " if (info .eq. -4) write (itfile,9014)\n" . " if (info .eq. -5) write (itfile,9015)\n" . " if (info .eq. -8) write (itfile,9018)\n" . " if (info .eq. -9) write (itfile,9019)\n" . " endif\n" . " write (itfile,3008) time\n" . " endif\n" . " endif\n" . "\n" . " 1004 format (/,a4, 1p, 6(1x,d11.4),/,(4x,1p,6(1x,d11.4)))\n" . " 3002 format(2(1x,i4),2(1x,i5),2x,a3,1x,i4,1p,2(2x,d7.1),6x,'-',10x,'-')\n" . " 3003 format (/,\n" . " + ' * * *',/,/,\n" . " + 'Tit = total number of iterations',/,\n" . " + 'Tnf = total number of function evaluations',/,\n" . " + 'Tnint = total number of segments explored during',\n" . " + ' Cauchy searches',/,\n" . " + 'Skip = number of BFGS updates skipped',/,\n" . " + 'Nact = number of active bounds at final generalized',\n" . " + ' Cauchy point',/,\n" . " + 'Projg = norm of the final projected gradient',/,\n" . " + 'F = final function value',/,/,\n" . " + ' * * *')\n" . " 3004 format (/,3x,'N',3x,'Tit',2x,'Tnf',2x,'Tnint',2x,\n" . " + 'Skip',2x,'Nact',5x,'Projg',8x,'F')\n" . " 3005 format (i5,2(1x,i4),(1x,i6),(2x,i4),(1x,i5),1p,2(2x,d10.3))\n" . " 3006 format (i5,2(1x,i4),2(1x,i6),(1x,i4),(1x,i5),7x,'-',10x,'-')\n" . " 3007 format (/,' Cauchy time',1p,e10.3,' seconds.',/ \n" . " + ' Subspace minimization time',1p,e10.3,' seconds.',/\n" . " + ' Line search time',1p,e10.3,' seconds.')\n" . " 3008 format (/,' Total User time',1p,e10.3,' seconds.',/)\n" . " 3009 format (/,a60)\n" . " 9011 format (/,\n" . " +' Matrix in 1st Cholesky factorization in formk is not Pos. Def.')\n" . " 9012 format (/,\n" . " +' Matrix in 2st Cholesky factorization in formk is not Pos. Def.')\n" . " 9013 format (/,\n" . " +' Matrix in the Cholesky factorization in formt is not Pos. Def.')\n" . " 9014 format (/,\n" . " +' Derivative >= 0, backtracking line search impossible.',/,\n" . " +' Previous x, f and g restored.',/,\n" . " +' Possible causes: 1 error in function or gradient evaluation;',/,\n" . " +' 2 rounding errors dominate computation.')\n" . " 9015 format (/,\n" . " +' Warning: more than 10 function and gradient',/,\n" . " +' evaluations in the last line search. Termination',/,\n" . " +' may possibly be caused by a bad search direction.')\n" . " 9018 format (/,' The triangular system is singular.')\n" . " 9019 format (/,\n" . " +' Line search cannot locate an adequate point after 20 function',/\n" . " +,' and gradient evaluations. Previous x, f and g restored.',/,\n" . " +' Possible causes: 1 error in function or gradient evaluation;',/,\n" . " +' 2 rounding error dominate computation.')\n" . "\n" . " return\n" . "\n" . " end\n" . "\n" . "c======================= The end of prn3lb =============================\n" . "\n" . " subroutine projgr(n, l, u, nbd, x, g, sbgnrm)\n" . "\n" . " integer n, nbd(n)\n" . " double precision sbgnrm, x(n), l(n), u(n), g(n)\n" . "\n" . "c ************\n" . "c\n" . "c Subroutine projgr\n" . "c\n" . "c This subroutine computes the infinity norm of the projected\n" . "c gradient.\n" . "c\n" . "c\n" . "c * * *\n" . "c\n" . "c NEOS, November 1994. (Latest revision June 1996.)\n" . "c Optimization Technology Center.\n" . "c Argonne National Laboratory and Northwestern University.\n" . "c Written by\n" . "c Ciyou Zhu\n" . "c in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.\n" . "c\n" . "c\n" . "c ************\n" . "\n" . " integer i\n" . " double precision gi\n" . " double precision one,zero\n" . " parameter (one=1.0d0,zero=0.0d0)\n" . "\n" . " sbgnrm = zero\n" . " do 15 i = 1, n\n" . " gi = g(i)\n" . " if (nbd(i) .ne. 0) then\n" . " if (gi .lt. zero) then\n" . " if (nbd(i) .ge. 2) gi = max((x(i)-u(i)),gi)\n" . " else\n" . " if (nbd(i) .le. 2) gi = min((x(i)-l(i)),gi)\n" . " endif\n" . " endif\n" . " sbgnrm = max(sbgnrm,abs(gi))\n" . " 15 continue\n" . "\n" . " return\n" . "\n" . " end\n" . "\n" . "c======================= The end of projgr =============================\n" . "\n" . " subroutine subsm(n, m, nsub, ind, l, u, nbd, x, d, ws, wy, theta, \n" . " + col, head, iword, wv, wn, iprint, info)\n" . " \n" . " integer n, m, nsub, col, head, iword, iprint, info, \n" . " + ind(nsub), nbd(n)\n" . " double precision theta, \n" . " + l(n), u(n), x(n), d(n), \n" . " + ws(n, m), wy(n, m), \n" . " + wv(2*m), wn(2*m, 2*m)\n" . "\n" . "c ************\n" . "c\n" . "c Subroutine subsm\n" . "c\n" . "c Given xcp, l, u, r, an index set that specifies\n" . "c the active set at xcp, and an l-BFGS matrix B \n" . "c (in terms of WY, WS, SY, WT, head, col, and theta), \n" . "c this subroutine computes an approximate solution\n" . "c of the subspace problem\n" . "c\n" . "c (P) min Q(x) = r'(x-xcp) + 1/2 (x-xcp)' B (x-xcp)\n" . "c\n" . "c subject to l<=x<=u\n" . "c x_i=xcp_i for all i in A(xcp)\n" . "c \n" . "c along the subspace unconstrained Newton direction \n" . "c \n" . "c d = -(Z'BZ)^(-1) r.\n" . "c\n" . "c The formula for the Newton direction, given the L-BFGS matrix\n" . "c and the Sherman-Morrison formula, is\n" . "c\n" . "c d = (1/theta)r + (1/theta*2) Z'WK^(-1)W'Z r.\n" . "c \n" . "c where\n" . "c K = [-D -Y'ZZ'Y/theta L_a'-R_z' ]\n" . "c [L_a -R_z theta*S'AA'S ]\n" . "c\n" . "c Note that this procedure for computing d differs \n" . "c from that described in [1]. One can show that the matrix K is\n" . "c equal to the matrix M^[-1]N in that paper.\n" . "c\n" . "c n is an integer variable.\n" . "c On entry n is the dimension of the problem.\n" . "c On exit n is unchanged.\n" . "c\n" . "c m is an integer variable.\n" . "c On entry m is the maximum number of variable metric corrections\n" . "c used to define the limited memory matrix.\n" . "c On exit m is unchanged.\n" . "c\n" . "c nsub is an integer variable.\n" . "c On entry nsub is the number of free variables.\n" . "c On exit nsub is unchanged.\n" . "c\n" . "c ind is an integer array of dimension nsub.\n" . "c On entry ind specifies the coordinate indices of free variables.\n" . "c On exit ind is unchanged.\n" . "c\n" . "c l is a double precision array of dimension n.\n" . "c On entry l is the lower bound of x.\n" . "c On exit l is unchanged.\n" . "c\n" . "c u is a double precision array of dimension n.\n" . "c On entry u is the upper bound of x.\n" . "c On exit u is unchanged.\n" . "c\n" . "c nbd is a integer array of dimension n.\n" . "c On entry nbd represents the type of bounds imposed on the\n" . "c variables, and must be specified as follows:\n" . "c nbd(i)=0 if x(i) is unbounded,\n" . "c 1 if x(i) has only a lower bound,\n" . "c 2 if x(i) has both lower and upper bounds, and\n" . "c 3 if x(i) has only an upper bound.\n" . "c On exit nbd is unchanged.\n" . "c\n" . "c x is a double precision array of dimension n.\n" . "c On entry x specifies the Cauchy point xcp. \n" . "c On exit x(i) is the minimizer of Q over the subspace of\n" . "c free variables. \n" . "c\n" . "c d is a double precision array of dimension n.\n" . "c On entry d is the reduced gradient of Q at xcp.\n" . "c On exit d is the Newton direction of Q. \n" . "c\n" . "c ws and wy are double precision arrays;\n" . "c theta is a double precision variable;\n" . "c col is an integer variable;\n" . "c head is an integer variable.\n" . "c On entry they store the information defining the\n" . "c limited memory BFGS matrix:\n" . "c ws(n,m) stores S, a set of s-vectors;\n" . "c wy(n,m) stores Y, a set of y-vectors;\n" . "c theta is the scaling factor specifying B_0 = theta I;\n" . "c col is the number of variable metric corrections stored;\n" . "c head is the location of the 1st s- (or y-) vector in S (or Y).\n" . "c On exit they are unchanged.\n" . "c\n" . "c iword is an integer variable.\n" . "c On entry iword is unspecified.\n" . "c On exit iword specifies the status of the subspace solution.\n" . "c iword = 0 if the solution is in the box,\n" . "c 1 if some bound is encountered.\n" . "c\n" . "c wv is a double precision working array of dimension 2m.\n" . "c\n" . "c wn is a double precision array of dimension 2m x 2m.\n" . "c On entry the upper triangle of wn stores the LEL^T factorization\n" . "c of the indefinite matrix\n" . "c\n" . "c K = [-D -Y'ZZ'Y/theta L_a'-R_z' ]\n" . "c [L_a -R_z theta*S'AA'S ]\n" . "c where E = [-I 0]\n" . "c [ 0 I]\n" . "c On exit wn is unchanged.\n" . "c\n" . "c iprint is an INTEGER variable that must be set by the user.\n" . "c It controls the frequency and type of output generated:\n" . "c iprint<0 no output is generated;\n" . "c iprint=0 print only one line at the last iteration;\n" . "c 0100 print details of every iteration including x and g;\n" . "c When iprint > 0, the file iterate.dat will be created to\n" . "c summarize the iteration.\n" . "c\n" . "c info is an integer variable.\n" . "c On entry info is unspecified.\n" . "c On exit info = 0 for normal return,\n" . "c = nonzero for abnormal return \n" . "c when the matrix K is ill-conditioned.\n" . "c\n" . "c Subprograms called:\n" . "c\n" . "c Linpack dtrsl.\n" . "c\n" . "c\n" . "c References:\n" . "c\n" . "c [1] R. H. Byrd, P. Lu, J. Nocedal and C. Zhu, ``A limited\n" . "c memory algorithm for bound constrained optimization'',\n" . "c SIAM J. Scientific Computing 16 (1995), no. 5, pp. 1190--1208.\n" . "c\n" . "c\n" . "c\n" . "c * * *\n" . "c\n" . "c NEOS, November 1994. (Latest revision June 1996.)\n" . "c Optimization Technology Center.\n" . "c Argonne National Laboratory and Northwestern University.\n" . "c Written by\n" . "c Ciyou Zhu\n" . "c in collaboration with R.H. Byrd, P. Lu-Chen and J. Nocedal.\n" . "c\n" . "c\n" . "c ************\n" . "\n" . " integer pointr,m2,col2,ibd,jy,js,i,j,k\n" . " double precision alpha,dk,temp1,temp2\n" . " double precision one,zero\n" . " parameter (one=1.0d0,zero=0.0d0)\n" . "\n" . " if (nsub .le. 0) return\n" . " if (iprint .ge. 99) write (6,1001)\n" . "\n" . "c Compute wv = W'Zd.\n" . "\n" . " pointr = head \n" . " do 20 i = 1, col\n" . " temp1 = zero\n" . " temp2 = zero\n" . " do 10 j = 1, nsub\n" . " k = ind(j)\n" . " temp1 = temp1 + wy(k,pointr)*d(j)\n" . " temp2 = temp2 + ws(k,pointr)*d(j)\n" . " 10 continue\n" . " wv(i) = temp1\n" . " wv(col + i) = theta*temp2\n" . " pointr = mod(pointr,m) + 1\n" . " 20 continue\n" . " \n" . "c Compute wv:=K^(-1)wv.\n" . "\n" . " m2 = 2*m\n" . " col2 = 2*col\n" . " call dtrsl(wn,m2,col2,wv,11,info)\n" . " if (info .ne. 0) return\n" . " do 25 i = 1, col\n" . " wv(i) = -wv(i)\n" . " 25 continue\n" . " call dtrsl(wn,m2,col2,wv,01,info)\n" . " if (info .ne. 0) return\n" . " \n" . "c Compute d = (1/theta)d + (1/theta**2)Z'W wv.\n" . " \n" . " pointr = head\n" . " do 40 jy = 1, col\n" . " js = col + jy\n" . " do 30 i = 1, nsub\n" . " k = ind(i)\n" . " d(i) = d(i) + wy(k,pointr)*wv(jy)/theta \n" . " + + ws(k,pointr)*wv(js)\n" . " 30 continue\n" . " pointr = mod(pointr,m) + 1\n" . " 40 continue\n" . " do 50 i = 1, nsub\n" . " d(i) = d(i)/theta\n" . " 50 continue\n" . " \n" . "c Backtrack to the feasible region.\n" . " \n" . " alpha = one\n" . " temp1 = alpha \n" . " do 60 i = 1, nsub\n" . " k = ind(i)\n" . " dk = d(i)\n" . " if (nbd(k) .ne. 0) then\n" . " if (dk .lt. zero .and. nbd(k) .le. 2) then\n" . " temp2 = l(k) - x(k)\n" . " if (temp2 .ge. zero) then\n" . " temp1 = zero\n" . " else if (dk*alpha .lt. temp2) then\n" . " temp1 = temp2/dk\n" . " endif\n" . " else if (dk .gt. zero .and. nbd(k) .ge. 2) then\n" . " temp2 = u(k) - x(k)\n" . " if (temp2 .le. zero) then\n" . " temp1 = zero\n" . " else if (dk*alpha .gt. temp2) then\n" . " temp1 = temp2/dk\n" . " endif\n" . " endif\n" . " if (temp1 .lt. alpha) then\n" . " alpha = temp1\n" . " ibd = i\n" . " endif\n" . " endif\n" . " 60 continue\n" . " \n" . " if (alpha .lt. one) then\n" . " dk = d(ibd)\n" . " k = ind(ibd)\n" . " if (dk .gt. zero) then\n" . " x(k) = u(k)\n" . " d(ibd) = zero\n" . " else if (dk .lt. zero) then\n" . " x(k) = l(k)\n" . " d(ibd) = zero\n" . " endif\n" . " endif\n" . " do 70 i = 1, nsub\n" . " k = ind(i)\n" . " x(k) = x(k) + alpha*d(i)\n" . " 70 continue\n" . " \n" . " if (iprint .ge. 99) then\n" . " if (alpha .lt. one) then\n" . " write (6,1002) alpha\n" . " else\n" . " write (6,*) 'SM solution inside the box'\n" . " end if \n" . " if (iprint .gt.100) write (6,1003) (x(i),i=1,n)\n" . " endif\n" . " \n" . " if (alpha .lt. one) then\n" . " iword = 1\n" . " else\n" . " iword = 0\n" . " endif \n" . " if (iprint .ge. 99) write (6,1004)\n" . "\n" . " 1001 format (/,'----------------SUBSM entered-----------------',/)\n" . " 1002 format ( 'ALPHA = ',f7.5,' backtrack to the BOX') \n" . " 1003 format ('Subspace solution X = ',/,(4x,1p,6(1x,d11.4)))\n" . " 1004 format (/,'----------------exit SUBSM --------------------',/)\n" . "\n" . " return\n" . "\n" . " end\n" . " \n" . "c====================== The end of subsm ===============================\n" . "\n" . " subroutine dcsrch(f,g,stp,ftol,gtol,xtol,stpmin,stpmax,\n" . " + task,isave,dsave)\n" . " character*(*) task\n" . " integer isave(2)\n" . " double precision f,g,stp,ftol,gtol,xtol,stpmin,stpmax\n" . " double precision dsave(13)\n" . "c **********\n" . "c\n" . "c Subroutine dcsrch\n" . "c\n" . "c This subroutine finds a step that satisfies a sufficient\n" . "c decrease condition and a curvature condition.\n" . "c\n" . "c Each call of the subroutine updates an interval with \n" . "c endpoints stx and sty. The interval is initially chosen \n" . "c so that it contains a minimizer of the modified function\n" . "c\n" . "c psi(stp) = f(stp) - f(0) - ftol*stp*f'(0).\n" . "c\n" . "c If psi(stp) <= 0 and f'(stp) >= 0 for some step, then the\n" . "c interval is chosen so that it contains a minimizer of f. \n" . "c\n" . "c The algorithm is designed to find a step that satisfies \n" . "c the sufficient decrease condition \n" . "c\n" . "c f(stp) <= f(0) + ftol*stp*f'(0),\n" . "c\n" . "c and the curvature condition\n" . "c\n" . "c abs(f'(stp)) <= gtol*abs(f'(0)).\n" . "c\n" . "c If ftol is less than gtol and if, for example, the function\n" . "c is bounded below, then there is always a step which satisfies\n" . "c both conditions. \n" . "c\n" . "c If no step can be found that satisfies both conditions, then \n" . "c the algorithm stops with a warning. In this case stp only \n" . "c satisfies the sufficient decrease condition.\n" . "c\n" . "c A typical invocation of dcsrch has the following outline:\n" . "c\n" . "c task = 'START'\n" . "c 10 continue\n" . "c call dcsrch( ... )\n" . "c if (task .eq. 'FG') then\n" . "c Evaluate the function and the gradient at stp \n" . "c goto 10\n" . "c end if\n" . "c\n" . "c NOTE: The user must no alter work arrays between calls.\n" . "c\n" . "c The subroutine statement is\n" . "c\n" . "c subroutine dcsrch(f,g,stp,ftol,gtol,xtol,stpmin,stpmax,\n" . "c task,isave,dsave)\n" . "c where\n" . "c\n" . "c f is a double precision variable.\n" . "c On initial entry f is the value of the function at 0.\n" . "c On subsequent entries f is the value of the \n" . "c function at stp.\n" . "c On exit f is the value of the function at stp.\n" . "c\n" . "c g is a double precision variable.\n" . "c On initial entry g is the derivative of the function at 0.\n" . "c On subsequent entries g is the derivative of the \n" . "c function at stp.\n" . "c On exit g is the derivative of the function at stp.\n" . "c\n" . "c stp is a double precision variable. \n" . "c On entry stp is the current estimate of a satisfactory \n" . "c step. On initial entry, a positive initial estimate \n" . "c must be provided. \n" . "c On exit stp is the current estimate of a satisfactory step\n" . "c if task = 'FG'. If task = 'CONV' then stp satisfies\n" . "c the sufficient decrease and curvature condition.\n" . "c\n" . "c ftol is a double precision variable.\n" . "c On entry ftol specifies a nonnegative tolerance for the \n" . "c sufficient decrease condition.\n" . "c On exit ftol is unchanged.\n" . "c\n" . "c gtol is a double precision variable.\n" . "c On entry gtol specifies a nonnegative tolerance for the \n" . "c curvature condition. \n" . "c On exit gtol is unchanged.\n" . "c\n" . "c xtol is a double precision variable.\n" . "c On entry xtol specifies a nonnegative relative tolerance\n" . "c for an acceptable step. The subroutine exits with a\n" . "c warning if the relative difference between sty and stx\n" . "c is less than xtol.\n" . "c On exit xtol is unchanged.\n" . "c\n" . "c stpmin is a double precision variable.\n" . "c On entry stpmin is a nonnegative lower bound for the step.\n" . "c On exit stpmin is unchanged.\n" . "c\n" . "c stpmax is a double precision variable.\n" . "c On entry stpmax is a nonnegative upper bound for the step.\n" . "c On exit stpmax is unchanged.\n" . "c\n" . "c task is a character variable of length at least 60.\n" . "c On initial entry task must be set to 'START'.\n" . "c On exit task indicates the required action:\n" . "c\n" . "c If task(1:2) = 'FG' then evaluate the function and \n" . "c derivative at stp and call dcsrch again.\n" . "c\n" . "c If task(1:4) = 'CONV' then the search is successful.\n" . "c\n" . "c If task(1:4) = 'WARN' then the subroutine is not able\n" . "c to satisfy the convergence conditions. The exit value of\n" . "c stp contains the best point found during the search.\n" . "c\n" . "c If task(1:5) = 'ERROR' then there is an error in the\n" . "c input arguments.\n" . "c\n" . "c On exit with convergence, a warning or an error, the\n" . "c variable task contains additional information.\n" . "c\n" . "c isave is an integer work array of dimension 2.\n" . "c \n" . "c dsave is a double precision work array of dimension 13.\n" . "c\n" . "c Subprograms called\n" . "c\n" . "c MINPACK-2 ... dcstep\n" . "c\n" . "c MINPACK-1 Project. June 1983.\n" . "c Argonne National Laboratory. \n" . "c Jorge J. More' and David J. Thuente.\n" . "c\n" . "c MINPACK-2 Project. October 1993.\n" . "c Argonne National Laboratory and University of Minnesota. \n" . "c Brett M. Averick, Richard G. Carter, and Jorge J. More'. \n" . "c\n" . "c **********\n" . " double precision zero,p5,p66\n" . " parameter(zero=0.0d0,p5=0.5d0,p66=0.66d0)\n" . " double precision xtrapl,xtrapu\n" . " parameter(xtrapl=1.1d0,xtrapu=4.0d0)\n" . "\n" . " logical brackt\n" . " integer stage\n" . " double precision finit,ftest,fm,fx,fxm,fy,fym,ginit,gtest,\n" . " + gm,gx,gxm,gy,gym,stx,sty,stmin,stmax,width,width1\n" . "\n" . "c Initialization block.\n" . "\n" . " if (task(1:5) .eq. 'START') then\n" . "\n" . "c Check the input arguments for errors.\n" . "\n" . " if (stp .lt. stpmin) task = 'ERROR: STP .LT. STPMIN'\n" . " if (stp .gt. stpmax) task = 'ERROR: STP .GT. STPMAX'\n" . " if (g .ge. zero) task = 'ERROR: INITIAL G .GE. ZERO'\n" . " if (ftol .lt. zero) task = 'ERROR: FTOL .LT. ZERO'\n" . " if (gtol .lt. zero) task = 'ERROR: GTOL .LT. ZERO'\n" . " if (xtol .lt. zero) task = 'ERROR: XTOL .LT. ZERO'\n" . " if (stpmin .lt. zero) task = 'ERROR: STPMIN .LT. ZERO'\n" . " if (stpmax .lt. stpmin) task = 'ERROR: STPMAX .LT. STPMIN'\n" . "\n" . "c Exit if there are errors on input.\n" . "\n" . " if (task(1:5) .eq. 'ERROR') return\n" . "\n" . "c Initialize local variables.\n" . "\n" . " brackt = .false.\n" . " stage = 1\n" . " finit = f\n" . " ginit = g\n" . " gtest = ftol*ginit\n" . " width = stpmax - stpmin\n" . " width1 = width/p5\n" . "\n" . "c The variables stx, fx, gx contain the values of the step, \n" . "c function, and derivative at the best step. \n" . "c The variables sty, fy, gy contain the value of the step, \n" . "c function, and derivative at sty.\n" . "c The variables stp, f, g contain the values of the step, \n" . "c function, and derivative at stp.\n" . "\n" . " stx = zero\n" . " fx = finit\n" . " gx = ginit\n" . " sty = zero\n" . " fy = finit\n" . " gy = ginit\n" . " stmin = zero\n" . " stmax = stp + xtrapu*stp\n" . " task = 'FG'\n" . "\n" . " goto 1000\n" . "\n" . " else\n" . "\n" . "c Restore local variables.\n" . "\n" . " if (isave(1) .eq. 1) then\n" . " brackt = .true.\n" . " else\n" . " brackt = .false.\n" . " endif\n" . " stage = isave(2) \n" . " ginit = dsave(1) \n" . " gtest = dsave(2) \n" . " gx = dsave(3) \n" . " gy = dsave(4) \n" . " finit = dsave(5) \n" . " fx = dsave(6) \n" . " fy = dsave(7) \n" . " stx = dsave(8) \n" . " sty = dsave(9) \n" . " stmin = dsave(10) \n" . " stmax = dsave(11) \n" . " width = dsave(12) \n" . " width1 = dsave(13) \n" . "\n" . " endif\n" . "\n" . "c If psi(stp) <= 0 and f'(stp) >= 0 for some step, then the\n" . "c algorithm enters the second stage.\n" . "\n" . " ftest = finit + stp*gtest\n" . " if (stage .eq. 1 .and. f .le. ftest .and. g .ge. zero) \n" . " + stage = 2\n" . "\n" . "c Test for warnings.\n" . "\n" . " if (brackt .and. (stp .le. stmin .or. stp .ge. stmax))\n" . " + task = 'WARNING: ROUNDING ERRORS PREVENT PROGRESS'\n" . " if (brackt .and. stmax - stmin .le. xtol*stmax) \n" . " + task = 'WARNING: XTOL TEST SATISFIED'\n" . " if (stp .eq. stpmax .and. f .le. ftest .and. g .le. gtest) \n" . " + task = 'WARNING: STP = STPMAX'\n" . " if (stp .eq. stpmin .and. (f .gt. ftest .or. g .ge. gtest)) \n" . " + task = 'WARNING: STP = STPMIN'\n" . "\n" . "c Test for convergence.\n" . "\n" . " if (f .le. ftest .and. abs(g) .le. gtol*(-ginit)) \n" . " + task = 'CONVERGENCE'\n" . "\n" . "c Test for termination.\n" . "\n" . " if (task(1:4) .eq. 'WARN' .or. task(1:4) .eq. 'CONV') goto 1000\n" . "\n" . "c A modified function is used to predict the step during the\n" . "c first stage if a lower function value has been obtained but \n" . "c the decrease is not sufficient.\n" . "\n" . " if (stage .eq. 1 .and. f .le. fx .and. f .gt. ftest) then\n" . "\n" . "c Define the modified function and derivative values.\n" . "\n" . " fm = f - stp*gtest\n" . " fxm = fx - stx*gtest\n" . " fym = fy - sty*gtest\n" . " gm = g - gtest\n" . " gxm = gx - gtest\n" . " gym = gy - gtest\n" . "\n" . "c Call dcstep to update stx, sty, and to compute the new step.\n" . "\n" . " call dcstep(stx,fxm,gxm,sty,fym,gym,stp,fm,gm,\n" . " + brackt,stmin,stmax)\n" . "\n" . "c Reset the function and derivative values for f.\n" . "\n" . " fx = fxm + stx*gtest\n" . " fy = fym + sty*gtest\n" . " gx = gxm + gtest\n" . " gy = gym + gtest\n" . "\n" . " else\n" . "\n" . "c Call dcstep to update stx, sty, and to compute the new step.\n" . "\n" . " call dcstep(stx,fx,gx,sty,fy,gy,stp,f,g,\n" . " + brackt,stmin,stmax)\n" . "\n" . " endif\n" . "\n" . "c Decide if a bisection step is needed.\n" . "\n" . " if (brackt) then\n" . " if (abs(sty-stx) .ge. p66*width1) stp = stx + p5*(sty - stx)\n" . " width1 = width\n" . " width = abs(sty-stx)\n" . " endif\n" . "\n" . "c Set the minimum and maximum steps allowed for stp.\n" . "\n" . " if (brackt) then\n" . " stmin = min(stx,sty)\n" . " stmax = max(stx,sty)\n" . " else\n" . " stmin = stp + xtrapl*(stp - stx)\n" . " stmax = stp + xtrapu*(stp - stx)\n" . " endif\n" . " \n" . "c Force the step to be within the bounds stpmax and stpmin.\n" . " \n" . " stp = max(stp,stpmin)\n" . " stp = min(stp,stpmax)\n" . "\n" . "c If further progress is not possible, let stp be the best\n" . "c point obtained during the search.\n" . "\n" . " if (brackt .and. (stp .le. stmin .or. stp .ge. stmax)\n" . " + .or. (brackt .and. stmax-stmin .le. xtol*stmax)) stp = stx\n" . "\n" . "c Obtain another function and derivative.\n" . "\n" . " task = 'FG'\n" . "\n" . " 1000 continue\n" . "\n" . "c Save local variables.\n" . "\n" . " if (brackt) then\n" . " isave(1) = 1\n" . " else\n" . " isave(1) = 0\n" . " endif\n" . " isave(2) = stage\n" . " dsave(1) = ginit\n" . " dsave(2) = gtest\n" . " dsave(3) = gx\n" . " dsave(4) = gy\n" . " dsave(5) = finit\n" . " dsave(6) = fx\n" . " dsave(7) = fy\n" . " dsave(8) = stx\n" . " dsave(9) = sty\n" . " dsave(10) = stmin\n" . " dsave(11) = stmax\n" . " dsave(12) = width\n" . " dsave(13) = width1\n" . "\n" . " end\n" . " \n" . "c====================== The end of dcsrch ==============================\n" . "\n" . " subroutine dcstep(stx,fx,dx,sty,fy,dy,stp,fp,dp,brackt,\n" . " + stpmin,stpmax)\n" . " logical brackt\n" . " double precision stx,fx,dx,sty,fy,dy,stp,fp,dp,stpmin,stpmax\n" . "c **********\n" . "c\n" . "c Subroutine dcstep\n" . "c\n" . "c This subroutine computes a safeguarded step for a search\n" . "c procedure and updates an interval that contains a step that\n" . "c satisfies a sufficient decrease and a curvature condition.\n" . "c\n" . "c The parameter stx contains the step with the least function\n" . "c value. If brackt is set to .true. then a minimizer has\n" . "c been bracketed in an interval with endpoints stx and sty.\n" . "c The parameter stp contains the current step. \n" . "c The subroutine assumes that if brackt is set to .true. then\n" . "c\n" . "c min(stx,sty) < stp < max(stx,sty),\n" . "c\n" . "c and that the derivative at stx is negative in the direction \n" . "c of the step.\n" . "c\n" . "c The subroutine statement is\n" . "c\n" . "c subroutine dcstep(stx,fx,dx,sty,fy,dy,stp,fp,dp,brackt,\n" . "c stpmin,stpmax)\n" . "c\n" . "c where\n" . "c\n" . "c stx is a double precision variable.\n" . "c On entry stx is the best step obtained so far and is an\n" . "c endpoint of the interval that contains the minimizer. \n" . "c On exit stx is the updated best step.\n" . "c\n" . "c fx is a double precision variable.\n" . "c On entry fx is the function at stx.\n" . "c On exit fx is the function at stx.\n" . "c\n" . "c dx is a double precision variable.\n" . "c On entry dx is the derivative of the function at \n" . "c stx. The derivative must be negative in the direction of \n" . "c the step, that is, dx and stp - stx must have opposite \n" . "c signs.\n" . "c On exit dx is the derivative of the function at stx.\n" . "c\n" . "c sty is a double precision variable.\n" . "c On entry sty is the second endpoint of the interval that \n" . "c contains the minimizer.\n" . "c On exit sty is the updated endpoint of the interval that \n" . "c contains the minimizer.\n" . "c\n" . "c fy is a double precision variable.\n" . "c On entry fy is the function at sty.\n" . "c On exit fy is the function at sty.\n" . "c\n" . "c dy is a double precision variable.\n" . "c On entry dy is the derivative of the function at sty.\n" . "c On exit dy is the derivative of the function at the exit sty.\n" . "c\n" . "c stp is a double precision variable.\n" . "c On entry stp is the current step. If brackt is set to .true.\n" . "c then on input stp must be between stx and sty. \n" . "c On exit stp is a new trial step.\n" . "c\n" . "c fp is a double precision variable.\n" . "c On entry fp is the function at stp\n" . "c On exit fp is unchanged.\n" . "c\n" . "c dp is a double precision variable.\n" . "c On entry dp is the the derivative of the function at stp.\n" . "c On exit dp is unchanged.\n" . "c\n" . "c brackt is an logical variable.\n" . "c On entry brackt specifies if a minimizer has been bracketed.\n" . "c Initially brackt must be set to .false.\n" . "c On exit brackt specifies if a minimizer has been bracketed.\n" . "c When a minimizer is bracketed brackt is set to .true.\n" . "c\n" . "c stpmin is a double precision variable.\n" . "c On entry stpmin is a lower bound for the step.\n" . "c On exit stpmin is unchanged.\n" . "c\n" . "c stpmax is a double precision variable.\n" . "c On entry stpmax is an upper bound for the step.\n" . "c On exit stpmax is unchanged.\n" . "c\n" . "c MINPACK-1 Project. June 1983\n" . "c Argonne National Laboratory. \n" . "c Jorge J. More' and David J. Thuente.\n" . "c\n" . "c MINPACK-2 Project. October 1993.\n" . "c Argonne National Laboratory and University of Minnesota. \n" . "c Brett M. Averick and Jorge J. More'.\n" . "c\n" . "c **********\n" . " double precision zero,p66,two,three\n" . " parameter(zero=0.0d0,p66=0.66d0,two=2.0d0,three=3.0d0)\n" . " \n" . " double precision gamma,p,q,r,s,sgnd,stpc,stpf,stpq,theta\n" . "\n" . " sgnd = dp*(dx/abs(dx))\n" . "\n" . "c First case: A higher function value. The minimum is bracketed. \n" . "c If the cubic step is closer to stx than the quadratic step, the \n" . "c cubic step is taken, otherwise the average of the cubic and \n" . "c quadratic steps is taken.\n" . "\n" . " if (fp .gt. fx) then\n" . " theta = three*(fx - fp)/(stp - stx) + dx + dp\n" . " s = max(abs(theta),abs(dx),abs(dp))\n" . " gamma = s*sqrt((theta/s)**2 - (dx/s)*(dp/s))\n" . " if (stp .lt. stx) gamma = -gamma\n" . " p = (gamma - dx) + theta\n" . " q = ((gamma - dx) + gamma) + dp\n" . " r = p/q\n" . " stpc = stx + r*(stp - stx)\n" . " stpq = stx + ((dx/((fx - fp)/(stp - stx) + dx))/two)*\n" . " + (stp - stx)\n" . " if (abs(stpc-stx) .lt. abs(stpq-stx)) then\n" . " stpf = stpc\n" . " else\n" . " stpf = stpc + (stpq - stpc)/two\n" . " endif\n" . " brackt = .true.\n" . "\n" . "c Second case: A lower function value and derivatives of opposite \n" . "c sign. The minimum is bracketed. If the cubic step is farther from \n" . "c stp than the secant step, the cubic step is taken, otherwise the \n" . "c secant step is taken.\n" . "\n" . " else if (sgnd .lt. zero) then\n" . " theta = three*(fx - fp)/(stp - stx) + dx + dp\n" . " s = max(abs(theta),abs(dx),abs(dp))\n" . " gamma = s*sqrt((theta/s)**2 - (dx/s)*(dp/s))\n" . " if (stp .gt. stx) gamma = -gamma\n" . " p = (gamma - dp) + theta\n" . " q = ((gamma - dp) + gamma) + dx\n" . " r = p/q\n" . " stpc = stp + r*(stx - stp)\n" . " stpq = stp + (dp/(dp - dx))*(stx - stp)\n" . " if (abs(stpc-stp) .gt. abs(stpq-stp)) then\n" . " stpf = stpc\n" . " else\n" . " stpf = stpq\n" . " endif\n" . " brackt = .true.\n" . "\n" . "c Third case: A lower function value, derivatives of the same sign,\n" . "c and the magnitude of the derivative decreases.\n" . "\n" . " else if (abs(dp) .lt. abs(dx)) then\n" . "\n" . "c The cubic step is computed only if the cubic tends to infinity \n" . "c in the direction of the step or if the minimum of the cubic\n" . "c is beyond stp. Otherwise the cubic step is defined to be the \n" . "c secant step.\n" . "\n" . " theta = three*(fx - fp)/(stp - stx) + dx + dp\n" . " s = max(abs(theta),abs(dx),abs(dp))\n" . "\n" . "c The case gamma = 0 only arises if the cubic does not tend\n" . "c to infinity in the direction of the step.\n" . "\n" . " gamma = s*sqrt(max(zero,(theta/s)**2-(dx/s)*(dp/s)))\n" . " if (stp .gt. stx) gamma = -gamma\n" . " p = (gamma - dp) + theta\n" . " q = (gamma + (dx - dp)) + gamma\n" . " r = p/q\n" . " if (r .lt. zero .and. gamma .ne. zero) then\n" . " stpc = stp + r*(stx - stp)\n" . " else if (stp .gt. stx) then\n" . " stpc = stpmax\n" . " else\n" . " stpc = stpmin\n" . " endif\n" . " stpq = stp + (dp/(dp - dx))*(stx - stp)\n" . "\n" . " if (brackt) then\n" . "\n" . "c A minimizer has been bracketed. If the cubic step is \n" . "c closer to stp than the secant step, the cubic step is \n" . "c taken, otherwise the secant step is taken.\n" . "\n" . " if (abs(stpc-stp) .lt. abs(stpq-stp)) then\n" . " stpf = stpc\n" . " else\n" . " stpf = stpq\n" . " endif\n" . " if (stp .gt. stx) then\n" . " stpf = min(stp+p66*(sty-stp),stpf)\n" . " else\n" . " stpf = max(stp+p66*(sty-stp),stpf)\n" . " endif\n" . " else\n" . "\n" . "c A minimizer has not been bracketed. If the cubic step is \n" . "c farther from stp than the secant step, the cubic step is \n" . "c taken, otherwise the secant step is taken.\n" . "\n" . " if (abs(stpc-stp) .gt. abs(stpq-stp)) then\n" . " stpf = stpc\n" . " else\n" . " stpf = stpq\n" . " endif\n" . " stpf = min(stpmax,stpf)\n" . " stpf = max(stpmin,stpf)\n" . " endif\n" . "\n" . "c Fourth case: A lower function value, derivatives of the same sign, \n" . "c and the magnitude of the derivative does not decrease. If the \n" . "c minimum is not bracketed, the step is either stpmin or stpmax, \n" . "c otherwise the cubic step is taken.\n" . "\n" . " else\n" . " if (brackt) then\n" . " theta = three*(fp - fy)/(sty - stp) + dy + dp\n" . " s = max(abs(theta),abs(dy),abs(dp))\n" . " gamma = s*sqrt((theta/s)**2 - (dy/s)*(dp/s))\n" . " if (stp .gt. sty) gamma = -gamma\n" . " p = (gamma - dp) + theta\n" . " q = ((gamma - dp) + gamma) + dy\n" . " r = p/q\n" . " stpc = stp + r*(sty - stp)\n" . " stpf = stpc\n" . " else if (stp .gt. stx) then\n" . " stpf = stpmax\n" . " else\n" . " stpf = stpmin\n" . " endif\n" . " endif\n" . "\n" . "c Update the interval which contains a minimizer.\n" . "\n" . " if (fp .gt. fx) then\n" . " sty = stp\n" . " fy = fp\n" . " dy = dp\n" . " else\n" . " if (sgnd .lt. zero) then\n" . " sty = stx\n" . " fy = fx\n" . " dy = dx\n" . " endif\n" . " stx = stp\n" . " fx = fp\n" . " dx = dp\n" . " endif\n" . "\n" . "c Compute the new step.\n" . "\n" . " stp = stpf\n" . "\n" . " end\n" . " \n" . "c====================== The end of dcstep ==============================\n" . "\n" . " subroutine timer(ttime)\n" . " double precision ttime\n" . "c *********\n" . "c\n" . "c Subroutine timer\n" . "c\n" . "c This subroutine is used to determine user time. In a typical \n" . "c application, the user time for a code segment requires calls \n" . "c to subroutine timer to determine the initial and final time.\n" . "c\n" . "c The subroutine statement is\n" . "c\n" . "c subroutine timer(ttime)\n" . "c\n" . "c where\n" . "c\n" . "c ttime is an output variable which specifies the user time.\n" . "c\n" . "c Argonne National Laboratory and University of Minnesota.\n" . "c MINPACK-2 Project.\n" . "c\n" . "c Modified October 1990 by Brett M. Averick.\n" . "c\n" . "c **********\n" . " real temp\n" . " real tarray(2)\n" . " real etime\n" . "\n" . "c The first element of the array tarray specifies user time\n" . "\n" . " temp = etime(tarray) \n" . "\n" . " ttime = dble(tarray(1))\n" . " \n" . " return\n" . "\n" . " end\n" . " \n" . "c====================== The end of timer ===============================\n" . "\n" . " double precision function dnrm2(n,x,incx)\n" . " integer n,incx\n" . " double precision x(n)\n" . "c **********\n" . "c\n" . "c Function dnrm2\n" . "c\n" . "c Given a vector x of length n, this function calculates the\n" . "c Euclidean norm of x with stride incx.\n" . "c\n" . "c The function statement is\n" . "c\n" . "c double precision function dnrm2(n,x,incx)\n" . "c\n" . "c where\n" . "c\n" . "c n is a positive integer input variable.\n" . "c\n" . "c x is an input array of length n.\n" . "c\n" . "c incx is a positive integer variable that specifies the \n" . "c stride of the vector.\n" . "c\n" . "c Subprograms called\n" . "c\n" . "c FORTRAN-supplied ... abs, max, sqrt\n" . "c\n" . "c MINPACK-2 Project. February 1991.\n" . "c Argonne National Laboratory.\n" . "c Brett M. Averick.\n" . "c\n" . "c **********\n" . " integer i\n" . " double precision scale\n" . "\n" . " dnrm2 = 0.0d0\n" . " scale = 0.0d0\n" . "\n" . " do 10 i = 1, n, incx\n" . " scale = max(scale, abs(x(i)))\n" . " 10 continue\n" . "\n" . " if (scale .eq. 0.0d0) return\n" . "\n" . " do 20 i = 1, n, incx\n" . " dnrm2 = dnrm2 + (x(i)/scale)**2\n" . " 20 continue\n" . "\n" . " dnrm2 = scale*sqrt(dnrm2)\n" . "\n" . " \n" . " return\n" . "\n" . " end\n" . " \n" . "c====================== The end of dnrm2 ===============================\n" . "\n" . " double precision function dpmeps()\n" . "c **********\n" . "c\n" . "c Subroutine dpeps\n" . "c\n" . "c This subroutine computes the machine precision parameter\n" . "c dpmeps as the smallest floating point number such that\n" . "c 1 + dpmeps differs from 1.\n" . "c\n" . "c This subroutine is based on the subroutine machar described in\n" . "c\n" . "c W. J. Cody,\n" . "c MACHAR: A subroutine to dynamically determine machine parameters,\n" . "c ACM Transactions on Mathematical Software, 14, 1988, pages 303-311.\n" . "c\n" . "c The subroutine statement is:\n" . "c\n" . "c subroutine dpeps(dpmeps)\n" . "c\n" . "c where\n" . "c\n" . "c dpmeps is a double precision variable.\n" . "c On entry dpmeps need not be specified.\n" . "c On exit dpmeps is the machine precision.\n" . "c\n" . "c MINPACK-2 Project. February 1991.\n" . "c Argonne National Laboratory and University of Minnesota.\n" . "c Brett M. Averick.\n" . "c\n" . "c *******\n" . " integer i,ibeta,irnd,it,itemp,negep\n" . " double precision a,b,beta,betain,betah,temp,tempa,temp1,\n" . " + zero,one,two\n" . " data zero,one,two /0.0d0,1.0d0,2.0d0/\n" . " \n" . "c determine ibeta, beta ala malcolm.\n" . "\n" . " a = one\n" . " b = one\n" . " 10 continue\n" . " a = a + a\n" . " temp = a + one\n" . " temp1 = temp - a\n" . " if (temp1 - one .eq. zero) go to 10\n" . " 20 continue\n" . " b = b + b\n" . " temp = a + b\n" . " itemp = int(temp - a)\n" . " if (itemp .eq. 0) go to 20\n" . " ibeta = itemp\n" . " beta = dble(ibeta)\n" . "\n" . "c determine it, irnd.\n" . "\n" . " it = 0\n" . " b = one\n" . " 30 continue\n" . " it = it + 1\n" . " b = b * beta\n" . " temp = b + one\n" . " temp1 = temp - b\n" . " if (temp1 - one .eq. zero) go to 30\n" . " irnd = 0\n" . " betah = beta/two\n" . " temp = a + betah\n" . " if (temp - a .ne. zero) irnd = 1\n" . " tempa = a + beta\n" . " temp = tempa + betah\n" . " if ((irnd .eq. 0) .and. (temp - tempa .ne. zero)) irnd = 2\n" . "\n" . "c determine dpmeps.\n" . "\n" . " negep = it + 3\n" . " betain = one/beta\n" . " a = one\n" . " do 40 i = 1, negep\n" . " a = a*betain\n" . " 40 continue\n" . " 50 continue\n" . " temp = one + a\n" . " if (temp - one .ne. zero) go to 60\n" . " a = a*beta\n" . " go to 50\n" . " 60 continue\n" . " dpmeps = a\n" . " if ((ibeta .eq. 2) .or. (irnd .eq. 0)) go to 70\n" . " a = (a*(one + a))/two\n" . " temp = one + a\n" . " if (temp - one .ne. zero) dpmeps = a\n" . "\n" . " 70 return\n" . "\n" . " end\n" . " \n" . "c====================== The end of dpmeps ==============================\n" . "\n" . " subroutine daxpy(n,da,dx,incx,dy,incy)\n" . "c\n" . "c constant times a vector plus a vector.\n" . "c uses unrolled loops for increments equal to one.\n" . "c jack dongarra, linpack, 3/11/78.\n" . "c\n" . " double precision dx(1),dy(1),da\n" . " integer i,incx,incy,ix,iy,m,mp1,n\n" . "c\n" . " if(n.le.0)return\n" . " if (da .eq. 0.0d0) return\n" . " if(incx.eq.1.and.incy.eq.1)go to 20\n" . "c\n" . "c code for unequal increments or equal increments\n" . "c not equal to 1\n" . "c\n" . " ix = 1\n" . " iy = 1\n" . " if(incx.lt.0)ix = (-n+1)*incx + 1\n" . " if(incy.lt.0)iy = (-n+1)*incy + 1\n" . " do 10 i = 1,n\n" . " dy(iy) = dy(iy) + da*dx(ix)\n" . " ix = ix + incx\n" . " iy = iy + incy\n" . " 10 continue\n" . " return\n" . "c\n" . "c code for both increments equal to 1\n" . "c\n" . "c\n" . "c clean-up loop\n" . "c\n" . " 20 m = mod(n,4)\n" . " if( m .eq. 0 ) go to 40\n" . " do 30 i = 1,m\n" . " dy(i) = dy(i) + da*dx(i)\n" . " 30 continue\n" . " if( n .lt. 4 ) return\n" . " 40 mp1 = m + 1\n" . " do 50 i = mp1,n,4\n" . " dy(i) = dy(i) + da*dx(i)\n" . " dy(i + 1) = dy(i + 1) + da*dx(i + 1)\n" . " dy(i + 2) = dy(i + 2) + da*dx(i + 2)\n" . " dy(i + 3) = dy(i + 3) + da*dx(i + 3)\n" . " 50 continue\n" . " return\n" . " end\n" . " \n" . "c====================== The end of daxpy ===============================\n" . "\n" . " subroutine dcopy(n,dx,incx,dy,incy)\n" . "c\n" . "c copies a vector, x, to a vector, y.\n" . "c uses unrolled loops for increments equal to one.\n" . "c jack dongarra, linpack, 3/11/78.\n" . "c\n" . " double precision dx(1),dy(1)\n" . " integer i,incx,incy,ix,iy,m,mp1,n\n" . "c\n" . " if(n.le.0)return\n" . " if(incx.eq.1.and.incy.eq.1)go to 20\n" . "c\n" . "c code for unequal increments or equal increments\n" . "c not equal to 1\n" . "c\n" . " ix = 1\n" . " iy = 1\n" . " if(incx.lt.0)ix = (-n+1)*incx + 1\n" . " if(incy.lt.0)iy = (-n+1)*incy + 1\n" . " do 10 i = 1,n\n" . " dy(iy) = dx(ix)\n" . " ix = ix + incx\n" . " iy = iy + incy\n" . " 10 continue\n" . " return\n" . "c\n" . "c code for both increments equal to 1\n" . "c\n" . "c\n" . "c clean-up loop\n" . "c\n" . " 20 m = mod(n,7)\n" . " if( m .eq. 0 ) go to 40\n" . " do 30 i = 1,m\n" . " dy(i) = dx(i)\n" . " 30 continue\n" . " if( n .lt. 7 ) return\n" . " 40 mp1 = m + 1\n" . " do 50 i = mp1,n,7\n" . " dy(i) = dx(i)\n" . " dy(i + 1) = dx(i + 1)\n" . " dy(i + 2) = dx(i + 2)\n" . " dy(i + 3) = dx(i + 3)\n" . " dy(i + 4) = dx(i + 4)\n" . " dy(i + 5) = dx(i + 5)\n" . " dy(i + 6) = dx(i + 6)\n" . " 50 continue\n" . " return\n" . " end\n" . " \n" . "c====================== The end of dcopy ===============================\n" . "\n" . " double precision function ddot(n,dx,incx,dy,incy)\n" . "c\n" . "c forms the dot product of two vectors.\n" . "c uses unrolled loops for increments equal to one.\n" . "c jack dongarra, linpack, 3/11/78.\n" . "c\n" . " double precision dx(1),dy(1),dtemp\n" . " integer i,incx,incy,ix,iy,m,mp1,n\n" . "c\n" . " ddot = 0.0d0\n" . " dtemp = 0.0d0\n" . " if(n.le.0)return\n" . " if(incx.eq.1.and.incy.eq.1)go to 20\n" . "c\n" . "c code for unequal increments or equal increments\n" . "c not equal to 1\n" . "c\n" . " ix = 1\n" . " iy = 1\n" . " if(incx.lt.0)ix = (-n+1)*incx + 1\n" . " if(incy.lt.0)iy = (-n+1)*incy + 1\n" . " do 10 i = 1,n\n" . " dtemp = dtemp + dx(ix)*dy(iy)\n" . " ix = ix + incx\n" . " iy = iy + incy\n" . " 10 continue\n" . " ddot = dtemp\n" . " return\n" . "c\n" . "c code for both increments equal to 1\n" . "c\n" . "c\n" . "c clean-up loop\n" . "c\n" . " 20 m = mod(n,5)\n" . " if( m .eq. 0 ) go to 40\n" . " do 30 i = 1,m\n" . " dtemp = dtemp + dx(i)*dy(i)\n" . " 30 continue\n" . " if( n .lt. 5 ) go to 60\n" . " 40 mp1 = m + 1\n" . " do 50 i = mp1,n,5\n" . " dtemp = dtemp + dx(i)*dy(i) + dx(i + 1)*dy(i + 1) +\n" . " * dx(i + 2)*dy(i + 2) + dx(i + 3)*dy(i + 3) + dx(i + 4)*dy(i + 4)\n" . " 50 continue\n" . " 60 ddot = dtemp\n" . " return\n" . " end\n" . " \n" . "c====================== The end of ddot ================================\n" . "\n" . " subroutine dpofa(a,lda,n,info)\n" . " integer lda,n,info\n" . " double precision a(lda,1)\n" . "c\n" . "c dpofa factors a double precision symmetric positive definite\n" . "c matrix.\n" . "c\n" . "c dpofa is usually called by dpoco, but it can be called\n" . "c directly with a saving in time if rcond is not needed.\n" . "c (time for dpoco) = (1 + 18/n)*(time for dpofa) .\n" . "c\n" . "c on entry\n" . "c\n" . "c a double precision(lda, n)\n" . "c the symmetric matrix to be factored. only the\n" . "c diagonal and upper triangle are used.\n" . "c\n" . "c lda integer\n" . "c the leading dimension of the array a .\n" . "c\n" . "c n integer\n" . "c the order of the matrix a .\n" . "c\n" . "c on return\n" . "c\n" . "c a an upper triangular matrix r so that a = trans(r)*r\n" . "c where trans(r) is the transpose.\n" . "c the strict lower triangle is unaltered.\n" . "c if info .ne. 0 , the factorization is not complete.\n" . "c\n" . "c info integer\n" . "c = 0 for normal return.\n" . "c = k signals an error condition. the leading minor\n" . "c of order k is not positive definite.\n" . "c\n" . "c linpack. this version dated 08/14/78 .\n" . "c cleve moler, university of new mexico, argonne national lab.\n" . "c\n" . "c subroutines and functions\n" . "c\n" . "c blas ddot\n" . "c fortran sqrt\n" . "c\n" . "c internal variables\n" . "c\n" . " double precision ddot,t\n" . " double precision s\n" . " integer j,jm1,k\n" . "c begin block with ...exits to 40\n" . "c\n" . "c\n" . " do 30 j = 1, n\n" . " info = j\n" . " s = 0.0d0\n" . " jm1 = j - 1\n" . " if (jm1 .lt. 1) go to 20\n" . " do 10 k = 1, jm1\n" . " t = a(k,j) - ddot(k-1,a(1,k),1,a(1,j),1)\n" . " t = t/a(k,k)\n" . " a(k,j) = t\n" . " s = s + t*t\n" . " 10 continue\n" . " 20 continue\n" . " s = a(j,j) - s\n" . "c ......exit\n" . " if (s .le. 0.0d0) go to 40\n" . " a(j,j) = sqrt(s)\n" . " 30 continue\n" . " info = 0\n" . " 40 continue\n" . " return\n" . " end\n" . " \n" . "c====================== The end of dpofa ===============================\n" . "\n" . " subroutine dscal(n,da,dx,incx)\n" . "c\n" . "c scales a vector by a constant.\n" . "c uses unrolled loops for increment equal to one.\n" . "c jack dongarra, linpack, 3/11/78.\n" . "c modified 3/93 to return if incx .le. 0.\n" . "c\n" . " double precision da,dx(1)\n" . " integer i,incx,m,mp1,n,nincx\n" . "c\n" . " if( n.le.0 .or. incx.le.0 )return\n" . " if(incx.eq.1)go to 20\n" . "c\n" . "c code for increment not equal to 1\n" . "c\n" . " nincx = n*incx\n" . " do 10 i = 1,nincx,incx\n" . " dx(i) = da*dx(i)\n" . " 10 continue\n" . " return\n" . "c\n" . "c code for increment equal to 1\n" . "c\n" . "c\n" . "c clean-up loop\n" . "c\n" . " 20 m = mod(n,5)\n" . " if( m .eq. 0 ) go to 40\n" . " do 30 i = 1,m\n" . " dx(i) = da*dx(i)\n" . " 30 continue\n" . " if( n .lt. 5 ) return\n" . " 40 mp1 = m + 1\n" . " do 50 i = mp1,n,5\n" . " dx(i) = da*dx(i)\n" . " dx(i + 1) = da*dx(i + 1)\n" . " dx(i + 2) = da*dx(i + 2)\n" . " dx(i + 3) = da*dx(i + 3)\n" . " dx(i + 4) = da*dx(i + 4)\n" . " 50 continue\n" . " return\n" . " end\n" . " \n" . "c====================== The end of dscal ===============================\n" . "\n" . " subroutine dtrsl(t,ldt,n,b,job,info)\n" . " integer ldt,n,job,info\n" . " double precision t(ldt,1),b(1)\n" . "c\n" . "c\n" . "c dtrsl solves systems of the form\n" . "c\n" . "c t * x = b\n" . "c or\n" . "c trans(t) * x = b\n" . "c\n" . "c where t is a triangular matrix of order n. here trans(t)\n" . "c denotes the transpose of the matrix t.\n" . "c\n" . "c on entry\n" . "c\n" . "c t double precision(ldt,n)\n" . "c t contains the matrix of the system. the zero\n" . "c elements of the matrix are not referenced, and\n" . "c the corresponding elements of the array can be\n" . "c used to store other information.\n" . "c\n" . "c ldt integer\n" . "c ldt is the leading dimension of the array t.\n" . "c\n" . "c n integer\n" . "c n is the order of the system.\n" . "c\n" . "c b double precision(n).\n" . "c b contains the right hand side of the system.\n" . "c\n" . "c job integer\n" . "c job specifies what kind of system is to be solved.\n" . "c if job is\n" . "c\n" . "c 00 solve t*x=b, t lower triangular,\n" . "c 01 solve t*x=b, t upper triangular,\n" . "c 10 solve trans(t)*x=b, t lower triangular,\n" . "c 11 solve trans(t)*x=b, t upper triangular.\n" . "c\n" . "c on return\n" . "c\n" . "c b b contains the solution, if info .eq. 0.\n" . "c otherwise b is unaltered.\n" . "c\n" . "c info integer\n" . "c info contains zero if the system is nonsingular.\n" . "c otherwise info contains the index of\n" . "c the first zero diagonal element of t.\n" . "c\n" . "c linpack. this version dated 08/14/78 .\n" . "c g. w. stewart, university of maryland, argonne national lab.\n" . "c\n" . "c subroutines and functions\n" . "c\n" . "c blas daxpy,ddot\n" . "c fortran mod\n" . "c\n" . "c internal variables\n" . "c\n" . " double precision ddot,temp\n" . " integer case,j,jj\n" . "c\n" . "c begin block permitting ...exits to 150\n" . "c\n" . "c check for zero diagonal elements.\n" . "c\n" . " do 10 info = 1, n\n" . "c ......exit\n" . " if (t(info,info) .eq. 0.0d0) go to 150\n" . " 10 continue\n" . " info = 0\n" . "c\n" . "c determine the task and go to it.\n" . "c\n" . " case = 1\n" . " if (mod(job,10) .ne. 0) case = 2\n" . " if (mod(job,100)/10 .ne. 0) case = case + 2\n" . " go to (20,50,80,110), case\n" . "c\n" . "c solve t*x=b for t lower triangular\n" . "c\n" . " 20 continue\n" . " b(1) = b(1)/t(1,1)\n" . " if (n .lt. 2) go to 40\n" . " do 30 j = 2, n\n" . " temp = -b(j-1)\n" . " call daxpy(n-j+1,temp,t(j,j-1),1,b(j),1)\n" . " b(j) = b(j)/t(j,j)\n" . " 30 continue\n" . " 40 continue\n" . " go to 140\n" . "c\n" . "c solve t*x=b for t upper triangular.\n" . "c\n" . " 50 continue\n" . " b(n) = b(n)/t(n,n)\n" . " if (n .lt. 2) go to 70\n" . " do 60 jj = 2, n\n" . " j = n - jj + 1\n" . " temp = -b(j+1)\n" . " call daxpy(j,temp,t(1,j+1),1,b(1),1)\n" . " b(j) = b(j)/t(j,j)\n" . " 60 continue\n" . " 70 continue\n" . " go to 140\n" . "c\n" . "c solve trans(t)*x=b for t lower triangular.\n" . "c\n" . " 80 continue\n" . " b(n) = b(n)/t(n,n)\n" . " if (n .lt. 2) go to 100\n" . " do 90 jj = 2, n\n" . " j = n - jj + 1\n" . " b(j) = b(j) - ddot(jj-1,t(j+1,j),1,b(j+1),1)\n" . " b(j) = b(j)/t(j,j)\n" . " 90 continue\n" . " 100 continue\n" . " go to 140\n" . "c\n" . "c solve trans(t)*x=b for t upper triangular.\n" . "c\n" . " 110 continue\n" . " b(1) = b(1)/t(1,1)\n" . " if (n .lt. 2) go to 130\n" . " do 120 j = 2, n\n" . " b(j) = b(j) - ddot(j-1,t(1,j),1,b(1),1)\n" . " b(j) = b(j)/t(j,j)\n" . " 120 continue\n" . " 130 continue\n" . " 140 continue\n" . " 150 continue\n" . " return\n" . " end\n" . " \n" . "c====================== The end of dtrsl ===============================\n"; close(FILE); } #============================================= # Create main.f driver for FWD_KPP #============================================= sub createMain { printf "Creating main.f\n"; open(FILE, ">main.f") || die "Unable to open main.f"; print FILE "! \$Id: main.f,v 1.42 2006/10/17 17:51:14 bmy Exp \$\n" . "! \$Log: main.f,v \$\n" . "! Revision 1.42 2006/10/17 17:51:14 bmy\n" . "! GEOS-Chem v7-04-10, includes the following modifications:\n" . "! - Includes variable tropopause with ND54 diagnostic\n" . "! - Added GFED2 biomass emissions for SO2, NH3, BC, OC, CO2\n" . "! - Rewrote default biomass emissions routines for clarity\n" . "! - Updates for GCAP: future emissions, met-field reading, TOMS-O3\n" . "! - Bug fix in planeflight_mod.f: set NCS variable correctly\n" . "! - Bug fix in SOA_LUMP; other minor bug fixes\n" . "!\n" . "! GEOS-Chem v7-04-09, includes the following modifications:\n" . "! - Updated CO for David Streets (2001 for China, 2000 elsewhere)\n" . "! - Now reset negative SPHU to a very small positive #\n" . "! - Remove use of TINY(1d0) to avoid NaN's on SUN platform\n" . "! - Minor bug fixes and deleted obsolete code\n" . "!\n" . "! Revision 1.38 2006/08/14 17:58:10 bmy\n" . "! GEOS-Chem v7-04-08, includes the following modifications:\n" . "! - Now add David Streets' emissions for China & SE Asia\n" . "! - Removed support for GEOS-1 and GEOS-STRAT met fields\n" . "! - Removed support for LINUX_IFC and LINUX_EFC compilers\n" . "!\n" . "! Revision 1.37 2006/06/28 17:26:52 bmy\n" . "! GEOS-Chem v7-04-06, includes the following modifications:\n" . "! - Now add BRAVO emissions (NOx, CO, SO2) over N. Mexico\n" . "! - Turn off HO2 uptake by aerosols in SMVGEAR mechanism\n" . "! - Bug fix: GEOS-4 convection now conserves mixing ratio\n" . "! - Other minor bug fixes & improvements\n" . "!\n" . "! Revision 1.36 2006/06/06 14:26:07 bmy\n" . "! GEOS-Chem v7-04-05, includes the following modifications:\n" . "! - Now gets ISOP that has reacted w/ OH from SMVGEAR (cf. D. Henze)\n" . "! - Incorporated IPCC future emission scale factors (cf. S. Wu)\n" . "! - Other minor bug fixes\n" . "!\n" . "! Revision 1.35 2006/05/26 17:45:24 bmy\n" . "! GEOS-Chem v7-04-04, includes the following modifications:\n" . "! - Now updated for SOA production from ISOP (cf D. Henze)\n" . "! - Now archive SOA concentrations in [ug/m3] (\"diag42_mod.f\")\n" . "! - Other minor bug fixes\n" . "!\n" . "! Revision 1.34 2006/05/15 17:52:52 bmy\n" . "! GEOS-Chem v7-04-03, includes the following modifications:\n" . "! - Added near-land formulation for lightning\n" . "! - Now can use CTH, MFLUX, PRECON params for lightning\n" . "! (NOTE: new lightning is only applied for GEOS-4 for time being)\n" . "! - Added ND56 diagnostic for lightning flash rates\n" . "! - Fixed Feb 28 -> Mar 1 transition for GCAP (i.e. no leap years)\n" . "! - Other minor bug fixes\n" . "!\n" . "! Revision 1.33 2006/03/24 20:22:53 bmy\n" . "! GEOS-CHEM v7-04-01, includes the following modifications:\n" . "! - Updates to new Hg simulation (eck, cdh, sas)\n" . "! - Changed Reynold's # criterion for aerodyn smooth surfaces in drydep\n" . "! - Standardized several bug fixes implemented in v7-03-06 patch\n" . "! - Bug fix: Now call MAKE_RH from \"main.f\" to avoid problems in drydep\n" . "! - Removed obsolete code\n" . "!\n" . " PROGRAM GEOS_CHEM\n" . "! \n" . "!******************************************************************************\n" . "! \n" . "! \n" . "! GGGGGG EEEEEEE OOOOO SSSSSSS CCCCCC H H EEEEEEE M M \n" . "! G E O O S C H H E M M M M \n" . "! G GGG EEEEEE O O SSSSSSS C HHHHHHH EEEEEE M M M \n" . "! G G E O O S C H H E M M \n" . "! GGGGGG EEEEEEE OOOOO SSSSSSS CCCCCC H H EEEEEEE M M \n" . "! \n" . "! \n" . "! (formerly known as the Harvard-GEOS model)\n" . "! for 4 x 5, 2 x 2.5 global grids and 1 x 1 nested grids\n" . "!\n" . "! Contact: Bob Yantosca, Harvard University (bmy\@io.as.harvard.edu)\n" . "! \n" . "!******************************************************************************\n" . "!\n" . "! See the GEOS-Chem Web Site:\n" . "!\n" . "! http://www.as.harvard.edu/chemistry/trop/geos/\n" . "!\n" . "! and the GEOS-CHEM User's Guide:\n" . "!\n" . "! http://www.as.harvard.edu/chemistry/trop/geos/doc/man/\n" . "!\n" . "! for the most up-to-date GEOS-CHEM documentation on the following topics:\n" . "!\n" . "! - installation, compilation, and execution\n" . "! - coding practice and style\n" . "! - input files and met field data files\n" . "! - horizontal and vertical resolution\n" . "! - modification history\n" . "!\n" . "!******************************************************************************\n" . "!\n" . " ! References to F90 modules \n" . " USE A3_READ_MOD, ONLY : GET_A3_FIELDS\n" . " USE A3_READ_MOD, ONLY : OPEN_A3_FIELDS\n" . " USE A3_READ_MOD, ONLY : UNZIP_A3_FIELDS\n" . " USE A6_READ_MOD, ONLY : GET_A6_FIELDS\n" . " USE A6_READ_MOD, ONLY : OPEN_A6_FIELDS\n" . " USE A6_READ_MOD, ONLY : UNZIP_A6_FIELDS\n" . " USE BENCHMARK_MOD, ONLY : STDRUN\n" . " USE CHEMISTRY_MOD, ONLY : DO_CHEMISTRY\n" . " USE CONVECTION_MOD, ONLY : DO_CONVECTION\n" . " USE COMODE_MOD, ONLY : INIT_COMODE\n" . " USE DIAG_MOD, ONLY : DIAGCHLORO\n" . " USE DIAG41_MOD, ONLY : DIAG41, ND41\n" . " USE DIAG42_MOD, ONLY : DIAG42, ND42\n" . " USE DIAG48_MOD, ONLY : DIAG48, ITS_TIME_FOR_DIAG48\n" . " USE DIAG49_MOD, ONLY : DIAG49, ITS_TIME_FOR_DIAG49\n" . " USE DIAG50_MOD, ONLY : DIAG50, DO_SAVE_DIAG50\n" . " USE DIAG51_MOD, ONLY : DIAG51, DO_SAVE_DIAG51\n" . " USE DIAG_OH_MOD, ONLY : PRINT_DIAG_OH\n" . " USE DAO_MOD, ONLY : AD, AIRQNT \n" . " USE DAO_MOD, ONLY : AVGPOLE, CLDTOPS\n" . " USE DAO_MOD, ONLY : CONVERT_UNITS, COPY_I6_FIELDS\n" . " USE DAO_MOD, ONLY : COSSZA, INIT_DAO\n" . " USE DAO_MOD, ONLY : INTERP, PS1\n" . " USE DAO_MOD, ONLY : PS2, PSC2 \n" . " USE DAO_MOD, ONLY : T, TS \n" . " USE DAO_MOD, ONLY : SUNCOS, SUNCOSB\n" . " USE DAO_MOD, ONLY : MAKE_RH\n" . " USE DRYDEP_MOD, ONLY : DO_DRYDEP\n" . " USE EMISSIONS_MOD, ONLY : DO_EMISSIONS\n" . " USE ERROR_MOD, ONLY : DEBUG_MSG\n" . " USE FILE_MOD, ONLY : IU_BPCH, IU_DEBUG\n" . " USE FILE_MOD, ONLY : IU_ND48, IU_SMV2LOG \n" . " USE FILE_MOD, ONLY : CLOSE_FILES\n" . " USE GLOBAL_CH4_MOD, ONLY : INIT_GLOBAL_CH4, CH4_AVGTP\n" . " USE GCAP_READ_MOD, ONLY : GET_GCAP_FIELDS\n" . " USE GCAP_READ_MOD, ONLY : OPEN_GCAP_FIELDS\n" . " USE GCAP_READ_MOD, ONLY : UNZIP_GCAP_FIELDS\n" . " USE GWET_READ_MOD, ONLY : GET_GWET_FIELDS\n" . " USE GWET_READ_MOD, ONLY : OPEN_GWET_FIELDS\n" . " USE GWET_READ_MOD, ONLY : UNZIP_GWET_FIELDS\n" . " USE I6_READ_MOD, ONLY : GET_I6_FIELDS_1\n" . " USE I6_READ_MOD, ONLY : GET_I6_FIELDS_2\n" . " USE I6_READ_MOD, ONLY : OPEN_I6_FIELDS\n" . " USE I6_READ_MOD, ONLY : UNZIP_I6_FIELDS\n" . " USE INPUT_MOD, ONLY : READ_INPUT_FILE\n" . " USE LAI_MOD, ONLY : RDISOLAI\n" . " USE LIGHTNING_NOX_MOD, ONLY : LIGHTNING\n" . " !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " !%%% NOTE: Temporary kludge: For GEOS-4 we want to use the new near-land\n" . " !%%% lightning formulation. But for the time being, we must keep the \n" . " !%%% existing lightning for other met field types. (ltm, bmy, 5/10/06)\n" . " USE LIGHTNING_NOX_NL_MOD, ONLY : LIGHTNING_NL\n" . " !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " USE LOGICAL_MOD, ONLY : LEMIS, LCHEM, LUNZIP, LDUST\n" . " USE LOGICAL_MOD, ONLY : LLIGHTNOX, LPRT, LSTDRUN, LSVGLB\n" . " USE LOGICAL_MOD, ONLY : LWAIT, LTRAN, LUPBD, LCONV\n" . " USE LOGICAL_MOD, ONLY : LWETD, LTURB, LDRYD, LMEGAN \n" . " USE LOGICAL_MOD, ONLY : LDYNOCEAN, LSOA, LVARTROP\n" . " USE MEGAN_MOD, ONLY : INIT_MEGAN\n" . " USE MEGAN_MOD, ONLY : UPDATE_T_15_AVG\n" . " USE MEGAN_MOD, ONLY : UPDATE_T_DAY\n" . " USE PBL_MIX_MOD, ONLY : DO_PBL_MIX\n" . " USE OCEAN_MERCURY_MOD, ONLY : MAKE_OCEAN_Hg_RESTART\n" . " USE OCEAN_MERCURY_MOD, ONLY : READ_OCEAN_Hg_RESTART\n" . " USE PLANEFLIGHT_MOD, ONLY : PLANEFLIGHT\n" . " USE PLANEFLIGHT_MOD, ONLY : SETUP_PLANEFLIGHT \n" . " USE PRESSURE_MOD, ONLY : INIT_PRESSURE\n" . " USE PRESSURE_MOD, ONLY : SET_FLOATING_PRESSURE\n" . " USE TIME_MOD, ONLY : GET_NYMDb, GET_NHMSb\n" . " USE TIME_MOD, ONLY : GET_NYMD, GET_NHMS\n" . " USE TIME_MOD, ONLY : GET_A3_TIME, GET_FIRST_A3_TIME\n" . " USE TIME_MOD, ONLY : GET_A6_TIME, GET_FIRST_A6_TIME\n" . " USE TIME_MOD, ONLY : GET_I6_TIME, GET_MONTH\n" . " USE TIME_MOD, ONLY : GET_TAU, GET_TAUb\n" . " USE TIME_MOD, ONLY : GET_TS_CHEM, GET_TS_DYN\n" . " USE TIME_MOD, ONLY : GET_ELAPSED_SEC, GET_TIME_AHEAD\n" . " USE TIME_MOD, ONLY : GET_DAY_OF_YEAR, ITS_A_NEW_DAY\n" . " USE TIME_MOD, ONLY : ITS_A_NEW_SEASON, GET_SEASON\n" . " USE TIME_MOD, ONLY : ITS_A_NEW_MONTH, GET_NDIAGTIME\n" . " USE TIME_MOD, ONLY : ITS_A_LEAPYEAR, GET_YEAR\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_A3, ITS_TIME_FOR_A6\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_I6, ITS_TIME_FOR_CHEM\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_CONV,ITS_TIME_FOR_DEL\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_DIAG,ITS_TIME_FOR_DYN\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_EMIS,ITS_TIME_FOR_EXIT\n" . " USE TIME_MOD, ONLY : ITS_TIME_FOR_UNIT,ITS_TIME_FOR_UNZIP\n" . " USE TIME_MOD, ONLY : SET_CT_CONV, SET_CT_DYN\n" . " USE TIME_MOD, ONLY : SET_CT_EMIS, SET_CT_CHEM\n" . " USE TIME_MOD, ONLY : SET_DIAGb, SET_DIAGe\n" . " USE TIME_MOD, ONLY : SET_CURRENT_TIME, PRINT_CURRENT_TIME\n" . " USE TIME_MOD, ONLY : SET_ELAPSED_MIN, SYSTEM_TIMESTAMP\n" . " USE TRACER_MOD, ONLY : CHECK_STT, N_TRACERS, STT, TCVV\n" . " USE TRACER_MOD, ONLY : ITS_AN_AEROSOL_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_CH4_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_FULLCHEM_SIM\n" . " USE TRACER_MOD, ONLY : ITS_A_MERCURY_SIM\n" . " USE TRANSPORT_MOD, ONLY : DO_TRANSPORT\n" . " USE TROPOPAUSE_MOD, ONLY : READ_TROPOPAUSE, CHECK_VAR_TROP\n" . " USE RESTART_MOD, ONLY : MAKE_RESTART_FILE, READ_RESTART_FILE\n" . " USE UPBDFLX_MOD, ONLY : DO_UPBDFLX, UPBDFLX_NOY\n" . " USE UVALBEDO_MOD, ONLY : READ_UVALBEDO\n" . " USE WETSCAV_MOD, ONLY : INIT_WETSCAV, DO_WETDEP\n" . " USE XTRA_READ_MOD, ONLY : GET_XTRA_FIELDS, OPEN_XTRA_FIELDS\n" . " USE XTRA_READ_MOD, ONLY : UNZIP_XTRA_FIELDS\n" . "\n" . " ! Force all variables to be declared explicitly\n" . " IMPLICIT NONE\n" . " \n" . " ! Header files \n" . "# include \"CMN_SIZE\" ! Size parameters\n" . "# include \"CMN_DIAG\" ! Diagnostic switches, NJDAY\n" . "# include \"CMN_GCTM\" ! Physical constants\n" . "\n" . " ! Local variables\n" . " LOGICAL :: FIRST = .TRUE.\n" . " LOGICAL :: LXTRA \n" . " INTEGER :: I, IOS, J, K, L\n" . " INTEGER :: N, JDAY, NDIAGTIME, N_DYN\n" . " INTEGER :: N_DYN_STEPS, NSECb, N_STEP, DATE(2)\n" . " INTEGER :: YEAR, MONTH, DAY, DAY_OF_YEAR\n" . " INTEGER :: SEASON, NYMD, NYMDb, NHMS\n" . " INTEGER :: ELAPSED_SEC, NHMSb\n" . " REAL*8 :: TAU, TAUb \n" . " CHARACTER(LEN=255) :: ZTYPE\n" . "\n" . " !=================================================================\n" . " ! GEOS-CHEM starts here! \n" . " !=================================================================\n" . "\n" . " ! Display current grid resolution and data set type\n" . " CALL DISPLAY_GRID_AND_MODEL\n" . "\n" . " !=================================================================\n" . " ! ***** I N I T I A L I Z A T I O N *****\n" . " !=================================================================\n" . "\n" . " ! Read input file and call init routines from other modules\n" . " CALL READ_INPUT_FILE \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a READ_INPUT_FILE' )\n" . "\n" . " ! Initialize met field arrays from \"dao_mod.f\"\n" . " CALL INIT_DAO\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INIT_DAO' )\n" . "\n" . " ! Initialize diagnostic arrays and counters\n" . " CALL INITIALIZE( 2 )\n" . " CALL INITIALIZE( 3 )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INITIALIZE' )\n" . "\n" . " ! Initialize the new hybrid pressure module. Define Ap and Bp.\n" . " CALL INIT_PRESSURE\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INIT_PRESSURE' )\n" . "\n" . " ! Read annual mean tropopause if not a variable tropopause\n" . " ! read_tropopause is obsolete with variable tropopause\n" . " IF ( .not. LVARTROP ) THEN\n" . " CALL READ_TROPOPAUSE\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a READ_TROPOPAUSE' )\n" . " ENDIF\n" . "\n" . " ! Initialize allocatable SMVGEAR arrays\n" . " IF ( LEMIS .or. LCHEM ) THEN\n" . " IF ( ITS_A_FULLCHEM_SIM() ) CALL INIT_COMODE\n" . " IF ( ITS_AN_AEROSOL_SIM() ) CALL INIT_COMODE\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INIT_COMODE' )\n" . " ENDIF\n" . " \n" . " ! Allocate arrays from \"global_ch4_mod.f\" for CH4 run \n" . " IF ( ITS_A_CH4_SIM() ) CALL INIT_GLOBAL_CH4\n" . "\n" . " ! Initialize MEGAN arrays, get 15-day avg temperatures\n" . " IF ( LMEGAN ) THEN\n" . " CALL INIT_MEGAN\n" . " CALL INITIALIZE( 2 )\n" . " CALL INITIALIZE( 3 )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INIT_MEGAN' )\n" . " ENDIF\n" . "\n" . " ! Local flag for reading XTRA fields for GEOS-3\n" . " !LXTRA = ( LDUST .or. LMEGAN )\n" . " LXTRA = LMEGAN\n" . "\n" . " ! Define time variables for use below\n" . " NHMS = GET_NHMS()\n" . " NHMSb = GET_NHMSb()\n" . " NYMD = GET_NYMD()\n" . " NYMDb = GET_NYMDb()\n" . " TAU = GET_TAU()\n" . " TAUb = GET_TAUb()\n" . "\n" . " !=================================================================\n" . " ! ***** U N Z I P M E T F I E L D S \@ start of run *****\n" . " !=================================================================\n" . " IF ( LUNZIP ) THEN\n" . "\n" . " !---------------------\n" . " ! Remove all files\n" . " !---------------------\n" . "\n" . " ! Type of unzip operation\n" . " ZTYPE = 'remove all'\n" . " \n" . " ! Remove any leftover A-3, A-6, I-6, in temp dir\n" . " CALL UNZIP_A3_FIELDS( ZTYPE )\n" . " CALL UNZIP_A6_FIELDS( ZTYPE )\n" . " CALL UNZIP_I6_FIELDS( ZTYPE )\n" . "\n" . "#if defined( GEOS_3 )\n" . " ! Remove GEOS-3 GWET and XTRA files \n" . " IF ( LDUST ) CALL UNZIP_GWET_FIELDS( ZTYPE )\n" . " IF ( LXTRA ) CALL UNZIP_XTRA_FIELDS( ZTYPE )\n" . "#endif\n" . "\n" . "#if defined( GCAP )\n" . " ! Unzip GCAP PHIS field (if necessary)\n" . " CALL UNZIP_GCAP_FIELDS( ZTYPE )\n" . "#endif\n" . "\n" . " !---------------------\n" . " ! Unzip in foreground\n" . " !---------------------\n" . "\n" . " ! Type of unzip operation\n" . " ZTYPE = 'unzip foreground'\n" . "\n" . " ! Unzip A-3, A-6, I-6 files for START of run\n" . " CALL UNZIP_A3_FIELDS( ZTYPE, NYMDb )\n" . " CALL UNZIP_A6_FIELDS( ZTYPE, NYMDb )\n" . " CALL UNZIP_I6_FIELDS( ZTYPE, NYMDb )\n" . "\n" . "#if defined( GEOS_3 )\n" . " ! Unzip GEOS-3 GWET and XTRA fields for START of run\n" . " IF ( LDUST ) CALL UNZIP_GWET_FIELDS( ZTYPE, NYMDb )\n" . " IF ( LXTRA ) CALL UNZIP_XTRA_FIELDS( ZTYPE, NYMDb )\n" . "#endif\n" . "\n" . "#if defined( GCAP )\n" . " ! Unzip GCAP PHIS field (if necessary)\n" . " CALL UNZIP_GCAP_FIELDS( ZTYPE )\n" . "#endif\n" . "\n" . " !### Debug output\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a UNZIP' )\n" . " ENDIF\n" . " \n" . " !=================================================================\n" . " ! ***** R E A D M E T F I E L D S \@ start of run *****\n" . " !=================================================================\n" . "\n" . " ! Open and read A-3 fields\n" . " DATE = GET_FIRST_A3_TIME()\n" . " CALL OPEN_A3_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_A3_FIELDS( DATE(1), DATE(2) )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st A3 TIME' )\n" . "\n" . " ! For MEGAN biogenics, update hourly temps w/in 15-day window\n" . " IF ( LMEGAN ) THEN\n" . " CALL UPDATE_T_DAY\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: UPDATE T_DAY' )\n" . " ENDIF\n" . "\n" . " ! Open & read A-6 fields\n" . " DATE = GET_FIRST_A6_TIME()\n" . " CALL OPEN_A6_FIELDS( DATE(1), DATE(2) ) \n" . " CALL GET_A6_FIELDS( DATE(1), DATE(2) ) \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st A6 TIME' )\n" . "\n" . " ! Open & read I-6 fields\n" . " DATE = (/ NYMD, NHMS /)\n" . " CALL OPEN_I6_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_I6_FIELDS_1( DATE(1), DATE(2) )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st I6 TIME' )\n" . " \n" . "#if defined( GEOS_3 )\n" . " ! Open & read GEOS-3 GWET fields\n" . " IF ( LDUST ) THEN\n" . " DATE = GET_FIRST_A3_TIME()\n" . " CALL OPEN_GWET_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_GWET_FIELDS( DATE(1), DATE(2) ) \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st GWET TIME' )\n" . " ENDIF\n" . "\n" . " ! Open & read GEOS-3 XTRA fields\n" . " IF ( LXTRA ) THEN\n" . " DATE = GET_FIRST_A3_TIME()\n" . " CALL OPEN_XTRA_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_XTRA_FIELDS( DATE(1), DATE(2) ) \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a 1st XTRA TIME' )\n" . " ENDIF\n" . "#endif\n" . "\n" . "#if defined( GCAP )\n" . " ! Read GCAP PHIS and LWI fields (if necessary)\n" . " CALL OPEN_GCAP_FIELDS\n" . " CALL GET_GCAP_FIELDS\n" . "\n" . " ! Remove temporary file (if necessary)\n" . " IF ( LUNZIP ) THEN\n" . " CALL UNZIP_GCAP_FIELDS( 'remove date' )\n" . " ENDIF\n" . "#endif\n" . "\n" . "#if defined( GCAP )\n" . " ! Read GCAP PHIS and LWI fields (if necessary)\n" . " CALL OPEN_GCAP_FIELDS\n" . " CALL GET_GCAP_FIELDS\n" . "\n" . " ! Remove temporary file (if necessary)\n" . " IF ( LUNZIP ) THEN\n" . " CALL UNZIP_GCAP_FIELDS( 'remove date' )\n" . " ENDIF\n" . "#endif\n" . "\n" . " ! Compute avg surface pressure near polar caps\n" . " CALL AVGPOLE( PS1 )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a AVGPOLE' )\n" . "\n" . " ! Call AIRQNT to compute air mass quantities from PS1\n" . " CALL SET_FLOATING_PRESSURE( PS1 )\n" . " CALL AIRQNT\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a AIRQNT' )\n" . "\n" . " ! Compute lightning NOx emissions [molec/box/6h]\n" . " IF ( LLIGHTNOX ) THEN\n" . "!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . "!%%% NOTE: Temporary kludge: For GEOS-4 we want to use the new near-land \n" . "!%%% lightning formulation. But for the time being, we must keep the existing\n" . "!%%% lightning for other met field types. (ltm, bmy, 5/10/06)\n" . "#if defined( GEOS_4 )\n" . " CALL LIGHTNING_NL\n" . "#else\n" . " CALL LIGHTNING( T, CLDTOPS )\n" . "#endif\n" . "!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . "\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a LIGHTNING' )\n" . " ENDIF\n" . "\n" . " ! Read land types and fractions from \"vegtype.global\"\n" . " CALL RDLAND \n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a RDLAND' )\n" . "\n" . " ! Initialize PBL quantities but do not do mixing\n" . " CALL DO_PBL_MIX( .FALSE. )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a TURBDAY:1' )\n" . "\n" . " !=================================================================\n" . " ! ***** I N I T I A L C O N D I T I O N S *****\n" . " !=================================================================\n" . "\n" . " ! Read initial tracer conditions\n" . " CALL READ_RESTART_FILE( NYMDb, NHMSb )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a READ_RESTART_FILE' )\n" . "\n" . " ! Read ocean Hg initial conditions (if necessary)\n" . " IF ( ITS_A_MERCURY_SIM() .and. LDYNOCEAN ) THEN\n" . " CALL READ_OCEAN_Hg_RESTART( NYMDb, NHMSb )\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a READ_OCEAN_RESTART' )\n" . " ENDIF\n" . "\n" . " ! Save initial tracer masses to disk for benchmark runs\n" . " IF ( LSTDRUN ) CALL STDRUN( LBEGIN=.TRUE. )\n" . "\n" . " !=================================================================\n" . " ! ***** 6 - H O U R T I M E S T E P L O O P *****\n" . " !================================================================= \n" . "\n" . " ! Echo message before first timestep\n" . " WRITE( 6, '(a)' )\n" . " WRITE( 6, '(a)' ) REPEAT( '*', 44 )\n" . " WRITE( 6, '(a)' ) '* B e g i n T i m e S t e p p i n g !! *'\n" . " WRITE( 6, '(a)' ) REPEAT( '*', 44 )\n" . " WRITE( 6, '(a)' ) \n" . "\n" . " ! NSTEP is the number of dynamic timesteps w/in a 6-h interval\n" . " N_DYN_STEPS = 360 / GET_TS_DYN()\n" . "\n" . " ! Start a new 6-h loop\n" . " DO \n" . "\n" . " ! Compute time parameters at start of 6-h loop\n" . " CALL SET_CURRENT_TIME\n" . "\n" . " ! NSECb is # of seconds at the start of 6-h loop\n" . " NSECb = GET_ELAPSED_SEC()\n" . "\n" . " ! Get dynamic timestep in seconds\n" . " N_DYN = 60d0 * GET_TS_DYN()\n" . "\n" . " !=================================================================\n" . " ! ***** D Y N A M I C T I M E S T E P L O O P *****\n" . " !=================================================================\n" . " DO N_STEP = 1, N_DYN_STEPS\n" . " \n" . " ! Compute & print time quantities at start of dyn step\n" . " CALL SET_CURRENT_TIME\n" . " CALL PRINT_CURRENT_TIME\n" . "\n" . " ! Set time variables for dynamic loop\n" . " !DAY = GET_DAY()\n" . " DAY_OF_YEAR = GET_DAY_OF_YEAR()\n" . " ELAPSED_SEC = GET_ELAPSED_SEC()\n" . " MONTH = GET_MONTH()\n" . " NHMS = GET_NHMS()\n" . " NYMD = GET_NYMD()\n" . " TAU = GET_TAU()\n" . " YEAR = GET_YEAR()\n" . " SEASON = GET_SEASON()\n" . "\n" . " !==============================================================\n" . " ! ***** W R I T E D I A G N O S T I C F I L E S *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_BPCH() ) THEN\n" . " \n" . " ! Set time at end of diagnostic timestep\n" . " CALL SET_DIAGe( TAU )\n" . "\n" . " ! Write bpch file\n" . " CALL DIAG3 \n" . "\n" . " ! Flush file units\n" . " CALL CTM_FLUSH\n" . "\n" . " !===========================================================\n" . " ! ***** W R I T E R E S T A R T F I L E *****\n" . " !===========================================================\n" . " IF ( LSVGLB ) THEN\n" . "\n" . " ! Make atmospheric restart file\n" . " CALL MAKE_RESTART_FILE( NYMD, NHMS, TAU )\n" . " \n" . " ! Make ocean mercury restart file\n" . " IF ( ITS_A_MERCURY_SIM() .and. LDYNOCEAN ) THEN\n" . " CALL MAKE_OCEAN_Hg_RESTART( NYMD, NHMS, TAU )\n" . " ENDIF\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) THEN\n" . " CALL DEBUG_MSG( '### MAIN: a MAKE_RESTART_FILE' )\n" . " ENDIF\n" . " ENDIF\n" . "\n" . " ! Set time at beginning of next diagnostic timestep\n" . " CALL SET_DIAGb( TAU )\n" . "\n" . " !===========================================================\n" . " ! ***** Z E R O D I A G N O S T I C S *****\n" . " !===========================================================\n" . " CALL INITIALIZE( 2 ) ! Zero arrays\n" . " CALL INITIALIZE( 3 ) ! Zero counters\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** T E S T F O R E N D O F R U N *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_EXIT() ) GOTO 9999\n" . "\n" . " !===============================================================\n" . " ! ***** U N Z I P M E T F I E L D S *****\n" . " !===============================================================\n" . " IF ( LUNZIP .and. ITS_TIME_FOR_UNZIP() ) THEN\n" . " \n" . " ! Get the date & time for 12h (720 mins) from now\n" . " DATE = GET_TIME_AHEAD( 720 )\n" . "\n" . " ! If LWAIT=T then wait for the met fields to be\n" . " ! fully unzipped before proceeding w/ the run.\n" . " ! Otherwise, unzip fields in the background\n" . " IF ( LWAIT ) THEN\n" . " ZTYPE = 'unzip foreground'\n" . " ELSE\n" . " ZTYPE = 'unzip background'\n" . " ENDIF\n" . " \n" . " ! Unzip A3, A6, I6 fields\n" . " CALL UNZIP_A3_FIELDS( ZTYPE, DATE(1) )\n" . " CALL UNZIP_A6_FIELDS( ZTYPE, DATE(1) )\n" . " CALL UNZIP_I6_FIELDS( ZTYPE, DATE(1) )\n" . "\n" . "#if defined( GEOS_3 )\n" . " ! Unzip GEOS-3 GWET & XTRA fields\n" . " IF ( LDUST ) CALL UNZIP_GWET_FIELDS( ZTYPE, DATE(1) )\n" . " IF ( LXTRA ) CALL UNZIP_XTRA_FIELDS( ZTYPE, DATE(1) )\n" . "#endif\n" . " ENDIF \n" . "\n" . " !===============================================================\n" . " ! ***** R E M O V E M E T F I E L D S ***** \n" . " !===============================================================\n" . " IF ( LUNZIP .and. ITS_TIME_FOR_DEL() ) THEN\n" . "\n" . " ! Type of operation\n" . " ZTYPE = 'remove date'\n" . "\n" . " ! Remove A-3, A-6, and I-6 files only for the current date\n" . " CALL UNZIP_A3_FIELDS( ZTYPE, NYMD )\n" . " CALL UNZIP_A6_FIELDS( ZTYPE, NYMD )\n" . " CALL UNZIP_I6_FIELDS( ZTYPE, NYMD )\n" . "\n" . "#if defined( GEOS_3 )\n" . " ! Remove GEOS-3 GWET & XTRA fields only for the current date\n" . " IF ( LDUST ) CALL UNZIP_GWET_FIELDS( ZTYPE, NYMD )\n" . " IF ( LXTRA ) CALL UNZIP_XTRA_FIELDS( ZTYPE, NYMD )\n" . "#endif\n" . " ENDIF \n" . "\n" . " !==============================================================\n" . " ! ***** R E A D A - 3 F I E L D S *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_A3() ) THEN\n" . "\n" . " ! Get the date/time for the next A-3 data block\n" . " DATE = GET_A3_TIME()\n" . "\n" . " ! Open & read A-3 fields\n" . " CALL OPEN_A3_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_A3_FIELDS( DATE(1), DATE(2) )\n" . "\n" . " ! Update daily mean temperature archive for MEGAN biogenics\n" . " IF ( LMEGAN ) CALL UPDATE_T_DAY \n" . "\n" . "#if defined( GEOS_3 )\n" . " ! Read GEOS-3 GWET fields\n" . " IF ( LDUST ) THEN\n" . " CALL OPEN_GWET_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_GWET_FIELDS( DATE(1), DATE(2) ) \n" . " ENDIF\n" . " \n" . " ! Read GEOS-3 PARDF, PARDR, SNOW fields\n" . " IF ( LXTRA ) THEN\n" . " CALL OPEN_XTRA_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_XTRA_FIELDS( DATE(1), DATE(2) ) \n" . " ENDIF\n" . "#endif\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** R E A D A - 6 F I E L D S ***** \n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_A6() ) THEN\n" . " \n" . " ! Get the date/time for the next A-6 data block\n" . " DATE = GET_A6_TIME()\n" . "\n" . " ! Open and read A-6 fields\n" . " CALL OPEN_A6_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_A6_FIELDS( DATE(1), DATE(2) )\n" . "\n" . " ! Since CLDTOPS is an A-6 field, update the\n" . " ! lightning NOx emissions [molec/box/6h]\n" . "!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . "!%%% NOTE: Temporary kludge: For GEOS-4 we want to use the new near-land \n" . "!%%% lightning formulation. But for the time being, we must keep the \n" . "!%%% existing lightning for other met field types. (ltm, bmy, 5/10/06)\n" . " IF ( LLIGHTNOX ) THEN\n" . "#if defined( GEOS_4 )\n" . " CALL LIGHTNING_NL\n" . "#else \n" . " CALL LIGHTNING( T, CLDTOPS )\n" . "#endif\n" . " ENDIF\n" . "!%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** R E A D I - 6 F I E L D S ***** \n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_I6() ) THEN\n" . "\n" . " ! Get the date/time for the next I-6 data block\n" . " DATE = GET_I6_TIME()\n" . "\n" . " ! Open and read files\n" . " CALL OPEN_I6_FIELDS( DATE(1), DATE(2) )\n" . " CALL GET_I6_FIELDS_2( DATE(1), DATE(2) )\n" . "\n" . " ! Compute avg pressure at polar caps \n" . " CALL AVGPOLE( PS2 )\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** M O N T H L Y O R S E A S O N A L D A T A *****\n" . " !==============================================================\n" . "\n" . " ! UV albedoes\n" . " IF ( LCHEM .and. ITS_A_NEW_MONTH() ) THEN\n" . " CALL READ_UVALBEDO( MONTH )\n" . " ENDIF\n" . "\n" . " ! Fossil fuel emissions (SMVGEAR)\n" . " IF ( ITS_A_FULLCHEM_SIM() ) THEN\n" . " IF ( LEMIS .and. ITS_A_NEW_SEASON() ) THEN\n" . " CALL ANTHROEMS( SEASON )\n" . " ENDIF\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** D A I L Y D A T A *****\n" . " !==============================================================\n" . " IF ( ITS_A_NEW_DAY() ) THEN \n" . "\n" . " ! Read leaf-area index (needed for drydep)\n" . " CALL RDLAI( DAY_OF_YEAR, MONTH )\n" . "\n" . " ! For MEGAN biogenics ...\n" . " IF ( LMEGAN ) THEN\n" . "\n" . " ! Read AVHRR daily leaf-area-index\n" . " CALL RDISOLAI( DAY_OF_YEAR, MONTH )\n" . "\n" . " ! Compute 15-day average temperature for MEGAN\n" . " CALL UPDATE_T_15_AVG\n" . " ENDIF\n" . " \n" . " ! Also read soil-type info for fullchem simulation\n" . " IF ( ITS_A_FULLCHEM_SIM() ) CALL RDSOIL \n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG ( '### MAIN: a DAILY DATA' )\n" . " ENDIF\n" . "\n" . " ! Get averaging intervals for local-time diagnostics\n" . " ! (NOTE: maybe improve this later on)\n" . " CALL DIAG_2PM\n" . " \n" . " !==============================================================\n" . " ! ***** I N T E R P O L A T E Q U A N T I T I E S ***** \n" . " !==============================================================\n" . " \n" . " ! Interpolate I-6 fields to current dynamic timestep, \n" . " ! based on their values at NSEC and NSEC+N_DYN\n" . " CALL INTERP( NSECb, ELAPSED_SEC, N_DYN )\n" . "\n" . " ! Case of variable tropopause:\n" . " ! Check LLTROP and set LMIN, LMAX, and LPAUSE\n" . " ! since this is not done with READ_TROPOPAUSE anymore.\n" . " ! (Need to double-check that LMIN, Lmax are not used before-phs) \n" . " IF ( LVARTROP ) CALL CHECK_VAR_TROP\n" . " \n" . " ! If we are not doing transport, then make sure that\n" . " ! the floating pressure is set to PSC2 (bdf, bmy, 8/22/02)\n" . " IF ( .not. LTRAN ) CALL SET_FLOATING_PRESSURE( PSC2 )\n" . "\n" . " ! Compute airmass quantities at each grid box \n" . " CALL AIRQNT\n" . " \n" . " ! Compute the cosine of the solar zenith angle at each grid box\n" . " CALL COSSZA( DAY_OF_YEAR, NHMSb, ELAPSED_SEC, SUNCOS )\n" . " \n" . " ! For SMVGEAR II, we also need to compute SUNCOS at\n" . " ! the end of this chemistry timestep (bdf, bmy, 4/1/03)\n" . " IF ( LCHEM .and. ITS_A_FULLCHEM_SIM() ) THEN\n" . " CALL COSSZA( DAY_OF_YEAR, NHMSb, \n" . " & ELAPSED_SEC+GET_TS_CHEM()*60, SUNCOSB )\n" . " ENDIF\n" . "\n" . " ! Compute tropopause height for ND55 diagnostic\n" . " IF ( ND55 > 0 ) CALL TROPOPAUSE\n" . "\n" . "#if defined( GEOS_3 )\n" . "\n" . " ! 1998 GEOS-3 carries the ground temperature and not the air\n" . " ! temperature -- thus TS will be 2-3 K too high. As a quick fix, \n" . " ! copy the temperature at the first sigma level into TS. \n" . " ! (mje, bnd, bmy, 7/3/01)\n" . " IF ( YEAR == 1998 ) TS(:,:) = T(:,:,1)\n" . "#endif\n" . "\n" . " ! Update dynamic timestep\n" . " CALL SET_CT_DYN( INCREMENT=.TRUE. )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a INTERP, etc' )\n" . "\n" . " !==============================================================\n" . " ! ***** U N I T C O N V E R S I O N ( kg -> v/v ) *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_UNIT() ) THEN\n" . " CALL CONVERT_UNITS( 1, N_TRACERS, TCVV, AD, STT )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CONVERT_UNITS:1' )\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** S T R A T O S P H E R I C F L U X E S *****\n" . " !==============================================================\n" . " IF ( LUPBD ) CALL DO_UPBDFLX\n" . "\n" . " !==============================================================\n" . " ! ***** T R A N S P O R T *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_DYN() ) THEN\n" . "\n" . " ! Call the appropritate version of TPCORE\n" . " IF ( LTRAN ) CALL DO_TRANSPORT \n" . "\n" . " ! Reset air mass quantities\n" . " CALL AIRQNT\n" . "\n" . " ! Repartition [NOy] species after transport\n" . " IF ( LUPBD .and. ITS_A_FULLCHEM_SIM() ) THEN\n" . " CALL UPBDFLX_NOY( 2 )\n" . " ENDIF\n" . "\n" . " ! Get relative humidity \n" . " ! (after recomputing pressure quantities)\n" . " CALL MAKE_RH\n" . "\n" . " ! Initialize wet scavenging and wetdep fields after\n" . " ! the airmass quantities are reset after transport\n" . " IF ( LCONV .or. LWETD ) CALL INIT_WETSCAV\n" . " ENDIF\n" . "\n" . " !-------------------------------\n" . " ! Test for convection timestep\n" . " !-------------------------------\n" . " IF ( ITS_TIME_FOR_CONV() ) THEN\n" . "\n" . " ! Increment the convection timestep\n" . " CALL SET_CT_CONV( INCREMENT=.TRUE. )\n" . "\n" . " !===========================================================\n" . " ! ***** M I X E D L A Y E R M I X I N G *****\n" . " !===========================================================\n" . " CALL DO_PBL_MIX( LTURB )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a TURBDAY:2' )\n" . "\n" . " !===========================================================\n" . " ! ***** C L O U D C O N V E C T I O N *****\n" . " !===========================================================\n" . " IF ( LCONV ) THEN\n" . " CALL DO_CONVECTION\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CONVECTION' )\n" . " ENDIF \n" . " ENDIF \n" . "\n" . " !==============================================================\n" . " ! ***** U N I T C O N V E R S I O N ( v/v -> kg ) *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_UNIT() ) THEN \n" . " CALL CONVERT_UNITS( 2, N_TRACERS, TCVV, AD, STT )\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CONVERT_UNITS:2' )\n" . " ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** A R C H I V E D I A G N O S T I C S *****\n" . " !==============================================================\n" . " IF ( ITS_TIME_FOR_DYN() ) THEN\n" . "\n" . " ! Accumulate several diagnostic quantities\n" . " CALL DIAG1\n" . "\n" . " ! ND41: save PBL height in 1200-1600 LT (amf)\n" . " ! (for comparison w/ Holzworth, 1967)\n" . " IF ( ND41 > 0 ) CALL DIAG41\n" . "\n" . " ! ND42: SOA concentrations [ug/m3]\n" . " IF ( ND42 > 0 ) CALL DIAG42\n" . "\n" . " !### Debug\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a DIAGNOSTICS' )\n" . " ENDIF\n" . "\n" . " !-------------------------------\n" . " ! Test for emission timestep\n" . " !-------------------------------\n" . " IF ( ITS_TIME_FOR_EMIS() ) THEN\n" . " \n" . " ! Increment emission counter\n" . " CALL SET_CT_EMIS( INCREMENT=.TRUE. )\n" . "\n" . " !========================================================\n" . " ! ***** D R Y D E P O S I T I O N *****\n" . " !========================================================\n" . " IF ( LDRYD ) CALL DO_DRYDEP\n" . "\n" . " !========================================================\n" . " ! ***** E M I S S I O N S *****\n" . " !========================================================\n" . " IF ( LEMIS ) CALL DO_EMISSIONS\n" . " ENDIF \n" . "\n" . " !===========================================================\n" . " ! ***** C H E M I S T R Y *****\n" . " !=========================================================== \n" . "\n" . " ! Also need to compute avg P, T for CH4 chemistry (bmy, 1/16/01)\n" . " IF ( ITS_A_CH4_SIM() ) CALL CH4_AVGTP\n" . "\n" . " ! Every chemistry timestep...\n" . " IF ( ITS_TIME_FOR_CHEM() ) THEN\n" . "\n" . " ! Increment chemistry timestep counter\n" . " CALL SET_CT_CHEM( INCREMENT=.TRUE. )\n" . "\n" . " ! Call the appropriate chemistry routine\n" . " CALL DO_CHEMISTRY\n" . " ENDIF \n" . " \n" . " !==============================================================\n" . " ! ***** W E T D E P O S I T I O N (rainout + washout) *****\n" . " !==============================================================\n" . " IF ( LWETD .and. ITS_TIME_FOR_DYN() ) CALL DO_WETDEP\n" . "\n" . " ! Activate this here someday (bmy, 7/20/04)\n" . " !!==============================================================\n" . " !! ***** A R C H I V E D I A G N O S T I C S *****\n" . " !!==============================================================\n" . " !IF ( ITS_TIME_FOR_DYN() ) THEN\n" . " !\n" . " ! ! Accumulate several diagnostic quantities\n" . " ! CALL DIAG1\n" . " !\n" . " ! ! ND41: save PBL height in 1200-1600 LT (amf)\n" . " ! ! (for comparison w/ Holzworth, 1967\n" . " ! IF ( ND41 > 0 ) CALL DIAG41\n" . " !\n" . " ! !### Debug\n" . " ! IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a DIAGNOSTICS' )\n" . " !ENDIF\n" . "\n" . " !==============================================================\n" . " ! ***** T I M E S E R I E S D I A G N O S T I C S *****\n" . " !\n" . " ! NOTE: Since we are saving soluble tracers, we must move\n" . " ! the ND40, ND49, and ND52 timeseries diagnostics\n" . " ! to after the call to DO_WETDEP (bmy, 4/22/04)\n" . " !============================================================== \n" . "\n" . " ! Plane following diagnostic\n" . " IF ( ND40 > 0 ) THEN \n" . " \n" . " ! Call SETUP_PLANEFLIGHT routine if necessary\n" . " IF ( ITS_A_NEW_DAY() ) THEN\n" . " \n" . " ! If it's a full-chemistry simulation but LCHEM=F,\n" . " ! or if it's an offline simulation, call setup routine \n" . " IF ( ITS_A_FULLCHEM_SIM() ) THEN\n" . " IF ( .not. LCHEM ) CALL SETUP_PLANEFLIGHT\n" . " ELSE\n" . " CALL SETUP_PLANEFLIGHT\n" . " ENDIF\n" . " ENDIF\n" . "\n" . " ! Archive data along the flight track\n" . " CALL PLANEFLIGHT\n" . " ENDIF\n" . " \n" . " ! Station timeseries\n" . " IF ( ITS_TIME_FOR_DIAG48() ) CALL DIAG48\n" . "\n" . " ! 3-D timeseries\n" . " IF ( ITS_TIME_FOR_DIAG49() ) CALL DIAG49\n" . "\n" . " ! 24-hr timeseries\n" . " IF ( DO_SAVE_DIAG50 ) CALL DIAG50\n" . "\n" . " ! Morning or afternoon timeseries\n" . " IF ( DO_SAVE_DIAG51 ) CALL DIAG51 \n" . "\n" . " ! Comment out for now \n" . " !! Column timeseries\n" . " !IF ( ND52 > 0 .and. ITS_TIME_FOR_ND52() ) THEN\n" . " ! CALL DIAG52\n" . " ! IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a ND52' )\n" . " !ENDIF\n" . "\n" . " !### After diagnostics\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: after TIMESERIES' )\n" . "\n" . " !==============================================================\n" . " ! ***** E N D O F D Y N A M I C T I M E S T E P *****\n" . " !==============================================================\n" . "\n" . " ! Check for NaN, Negatives, Infinities in STT once per hour\n" . " IF ( ITS_TIME_FOR_DIAG() ) THEN\n" . " CALL CHECK_STT( 'End of Dynamic Loop' )\n" . " ENDIF\n" . "\n" . " ! Increment elapsed time\n" . " CALL SET_ELAPSED_MIN\n" . " ENDDO\n" . "\n" . " !=================================================================\n" . " ! ***** C O P Y I - 6 F I E L D S *****\n" . " !\n" . " ! The I-6 fields at the end of this timestep become\n" . " ! the fields at the beginning of the next timestep\n" . " !=================================================================\n" . " CALL COPY_I6_FIELDS\n" . "\n" . " ENDDO\n" . "\n" . " !=================================================================\n" . " ! ***** C L E A N U P A N D Q U I T *****\n" . " !=================================================================\n" . " 9999 CONTINUE\n" . "\n" . " ! Remove all files from temporary directory \n" . " IF ( LUNZIP ) THEN\n" . " \n" . " ! Type of operation\n" . " ZTYPE = 'remove all'\n" . "\n" . " ! Remove A3, A6, I6 fields\n" . " CALL UNZIP_A3_FIELDS( ZTYPE )\n" . " CALL UNZIP_A6_FIELDS( ZTYPE )\n" . " CALL UNZIP_I6_FIELDS( ZTYPE )\n" . "\n" . "#if defined( GEOS_3 )\n" . " ! Remove GEOS-3 GWET & XTRA fields\n" . " IF ( LDUST ) CALL UNZIP_GWET_FIELDS( ZTYPE )\n" . " IF ( LXTRA ) CALL UNZIP_XTRA_FIELDS( ZTYPE )\n" . "#endif\n" . "\n" . "#if defined( GCAP )\n" . " ! Remove GCAP PHIS field (if necessary)\n" . " CALL UNZIP_GCAP_FIELDS( ZTYPE )\n" . "#endif\n" . "\n" . " ENDIF\n" . "\n" . " ! Print the mass-weighted mean OH concentration (if applicable)\n" . " CALL PRINT_DIAG_OH\n" . "\n" . " ! For model benchmarking, save final masses of \n" . " ! Rn,Pb,Be or Ox to a binary punch file \n" . " IF ( LSTDRUN ) CALL STDRUN( LBEGIN=.FALSE. )\n" . "\n" . " ! Close all files\n" . " CALL CLOSE_FILES\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CLOSE_FILES' )\n" . "\n" . " ! Deallocate dynamic module arrays\n" . " CALL CLEANUP\n" . " IF ( LPRT ) CALL DEBUG_MSG( '### MAIN: a CLEANUP' )\n" . "\n" . " ! Print ending time of simulation\n" . " CALL DISPLAY_END_TIME\n" . "!\n" . "!******************************************************************************\n" . "! Internal procedures -- Use the F90 CONTAINS command to inline \n" . "! subroutines that only can be called from this main program. \n" . "!\n" . "! All variables referenced in the main program (local variables, F90 \n" . "! module variables, or common block variables) also have scope within \n" . "! internal subroutines. \n" . "!\n" . "! List of Internal Procedures:\n" . "! ============================================================================\n" . "! (1 ) DISPLAY_GRID_AND_MODEL : Displays resolution, data set, & start time\n" . "! (2 ) GET_NYMD_PHIS : Gets YYYYMMDD for the PHIS data field\n" . "! (3 ) DISPLAY_SIGMA_LAT_LON : Displays sigma, lat, and lon information\n" . "! (4 ) GET_WIND10M : Wrapper for MAKE_WIND10M (from \"dao_mod.f\")\n" . "! (5 ) CTM_FLUSH : Flushes diagnostic files to disk\n" . "! (6 ) DISPLAY_END_TIME : Displays ending time of simulation\n" . "! (7 ) MET_FIELD_DEBUG : Prints min and max of met fields for debug\n" . "!******************************************************************************\n" . "!\n" . " CONTAINS\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE DISPLAY_GRID_AND_MODEL\n" . "\n" . " !=================================================================\n" . " ! Internal Subroutine DISPLAY_GRID_AND_MODEL displays the \n" . " ! appropriate messages for the given model grid and machine type.\n" . " ! It also prints the starting time and date (local time) of the\n" . " ! GEOS-CHEM simulation. (bmy, 12/2/03, 10/18/05)\n" . " !=================================================================\n" . "\n" . " ! For system time stamp\n" . " CHARACTER(LEN=16) :: STAMP\n" . "\n" . " !-----------------------\n" . " ! Print resolution info\n" . " !-----------------------\n" . "#if defined( GRID4x5 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) //\n" . " & ' S T A R T I N G 4 x 5 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID2x25 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 2 x 2.5 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID1x125 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 1 x 1.25 G E O S--C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#elif defined( GRID1x1 )\n" . " WRITE( 6, '(a)' ) \n" . " & REPEAT( '*', 13 ) // \n" . " & ' S T A R T I N G 1 x 1 G E O S -- C H E M ' //\n" . " & REPEAT( '*', 13 )\n" . "\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! Print machine info\n" . " !-----------------------\n" . "\n" . " ! Get the proper FORMAT statement for the model being used\n" . "#if defined( COMPAQ )\n" . " WRITE( 6, '(a)' ) 'Created w/ HP/COMPAQ Alpha compiler'\n" . "#elif defined( IBM_AIX )\n" . " WRITE( 6, '(a)' ) 'Created w/ IBM-AIX compiler'\n" . "#elif defined( LINUX_PGI )\n" . " WRITE( 6, '(a)' ) 'Created w/ LINUX/PGI compiler'\n" . "#elif defined( LINUX_IFORT )\n" . " WRITE( 6, '(a)' ) 'Created w/ LINUX/IFORT (64-bit) compiler'\n" . "#elif defined( SGI_MIPS )\n" . " WRITE( 6, '(a)' ) 'Created w/ SGI MIPSpro compiler'\n" . "#elif defined( SPARC )\n" . " WRITE( 6, '(a)' ) 'Created w/ Sun/SPARC compiler'\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! Print met field info\n" . " !-----------------------\n" . "#if defined( GEOS_3 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-3 met fields'\n" . "#elif defined( GEOS_4 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-4/fvDAS met fields'\n" . "#elif defined( GEOS_5 )\n" . " WRITE( 6, '(a)' ) 'Using GEOS-5/fvDAS met fields'\n" . "#elif defined( GCAP )\n" . " WRITE( 6, '(a)' ) 'Using GCAP/GISS met fields'\n" . "#endif\n" . "\n" . " !-----------------------\n" . " ! System time stamp\n" . " !-----------------------\n" . " STAMP = SYSTEM_TIMESTAMP()\n" . " WRITE( 6, 100 ) STAMP\n" . " 100 FORMAT( /, '===> SIMULATION START TIME: ', a, ' <===', / )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE DISPLAY_GRID_AND_MODEL\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " FUNCTION ITS_TIME_FOR_BPCH() RESULT( DO_BPCH )\n" . "\n" . " !=================================================================\n" . " ! Internal function ITS_TIME_FOR_BPCH returns TRUE if it is time\n" . " ! to write to the binary punch file and FALSE otherwise.\n" . " !=================================================================\n" . "\n" . " ! Local variables\n" . " INTEGER :: TODAY, THIS_NJDAY, NHMS, NDIAGTIME\n" . " \n" . " ! Function value\n" . " LOGICAL :: DO_BPCH\n" . "\n" . " !=================================================================\n" . " ! ITS_TIME_FOR_BPCH begins here!\n" . " !================================================================= \n" . " \n" . " ! Return FALSE if it's the first timestep\n" . " IF ( GET_TAU() == GET_TAUb() ) THEN\n" . " DO_BPCH = .FALSE.\n" . " RETURN\n" . " ENDIF\n" . "\n" . " ! Current day of year\n" . " TODAY = GET_DAY_OF_YEAR()\n" . "\n" . " ! Current time of day\n" . " NHMS = GET_NHMS()\n" . "\n" . " ! Time of day to write bpch files to disk\n" . " NDIAGTIME = GET_NDIAGTIME()\n" . "\n" . " ! Look up appropriate value of NJDAY array. We may need to add a\n" . " ! day to skip past the Feb 29 element of NJDAY for non-leap-years.\n" . " IF ( .not. ITS_A_LEAPYEAR( FORCE=.TRUE. ) .and. TODAY > 59 ) THEN\n" . " THIS_NJDAY = NJDAY( TODAY + 1 ) \n" . " ELSE\n" . " THIS_NJDAY = NJDAY( TODAY )\n" . " ENDIF\n" . "\n" . " ! Test if this is the day & time to write to the BPCH file!\n" . " IF ( ( THIS_NJDAY > 0 ) .and. NHMS == NDIAGTIME ) THEN\n" . " DO_BPCH = .TRUE.\n" . " ELSE\n" . " DO_BPCH = .FALSE.\n" . " ENDIF\n" . "\n" . " ! Return to calling program\n" . " END FUNCTION ITS_TIME_FOR_BPCH\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE CTM_FLUSH\n" . "\n" . " !================================================================\n" . " ! Internal subroutine CTM_FLUSH flushes certain diagnostic\n" . " ! file buffers to disk. (bmy, 8/31/00, 7/1/02)\n" . " !\n" . " ! CTM_FLUSH should normally be called after each diagnostic \n" . " ! output, so that in case the run dies, the output files from \n" . " ! the last diagnostic timestep will not be lost. \n" . " !\n" . " ! FLUSH is an intrinsic FORTRAN subroutine and takes as input \n" . " ! the unit number of the file to be flushed to disk.\n" . " !================================================================\n" . " CALL FLUSH( IU_ND48 ) \n" . " CALL FLUSH( IU_BPCH ) \n" . " CALL FLUSH( IU_SMV2LOG ) \n" . " CALL FLUSH( IU_DEBUG ) \n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE CTM_FLUSH\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE DISPLAY_END_TIME\n" . "\n" . " !=================================================================\n" . " ! Internal subroutine DISPLAY_END_TIME prints the ending time of\n" . " ! the GEOS-CHEM simulation (bmy, 5/3/05)\n" . " !=================================================================\n" . "\n" . " ! Local variables\n" . " CHARACTER(LEN=16) :: STAMP\n" . "\n" . " ! Print system time stamp\n" . " STAMP = SYSTEM_TIMESTAMP()\n" . " WRITE( 6, 100 ) STAMP\n" . " 100 FORMAT( /, '===> SIMULATION END TIME: ', a, ' <===', / )\n" . "\n" . " ! Echo info\n" . " WRITE ( 6, 3000 ) \n" . " 3000 FORMAT\n" . " & ( /, '************** E N D O F G E O S -- C H E M ',\n" . " & '**************' )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE DISPLAY_END_TIME\n" . "\n" . "!------------------------------------------------------------------------------\n" . "\n" . " SUBROUTINE MET_FIELD_DEBUG\n" . "\n" . " !=================================================================\n" . " ! Internal subroutine MET_FIELD_DEBUG prints out the maximum\n" . " ! and minimum, and sum of DAO met fields for debugging \n" . " !=================================================================\n" . "\n" . " ! References to F90 modules\n" . " USE DAO_MOD, ONLY : AD, AIRDEN, AIRVOL, ALBD1, ALBD2\n" . " USE DAO_MOD, ONLY : ALBD, AVGW, BXHEIGHT, CLDFRC, CLDF \n" . " USE DAO_MOD, ONLY : CLDMAS, CLDTOPS, DELP \n" . " USE DAO_MOD, ONLY : DTRAIN, GWETTOP, HFLUX, HKBETA, HKETA \n" . " USE DAO_MOD, ONLY : LWI, MOISTQ, OPTD, OPTDEP, PBL \n" . " USE DAO_MOD, ONLY : PREACC, PRECON, PS1, PS2, PSC2 \n" . " USE DAO_MOD, ONLY : RADLWG, RADSWG, RH, SLP, SNOW \n" . " USE DAO_MOD, ONLY : SPHU1, SPHU2, SPHU, SUNCOS, SUNCOSB \n" . " USE DAO_MOD, ONLY : TMPU1, TMPU2, T, TROPP, TS \n" . " USE DAO_MOD, ONLY : TSKIN, U10M, USTAR, UWND1, UWND2 \n" . " USE DAO_MOD, ONLY : UWND, V10M, VWND1, VWND2, VWND \n" . " USE DAO_MOD, ONLY : Z0, ZMEU, ZMMD, ZMMU \n" . "\n" . " ! Local variables\n" . " INTEGER :: I, J, L, IJ\n" . "\n" . " !=================================================================\n" . " ! MET_FIELD_DEBUG begins here!\n" . " !=================================================================\n" . "\n" . " ! Define box to print out\n" . " I = 23\n" . " J = 34\n" . " L = 1\n" . " IJ = ( ( J-1 ) * IIPAR ) + I\n" . "\n" . " !=================================================================\n" . " ! Print out met fields at (I,J,L)\n" . " !=================================================================\n" . " IF ( ALLOCATED( AD ) ) PRINT*, 'AD : ', AD(I,J,L) \n" . " IF ( ALLOCATED( AIRDEN ) ) PRINT*, 'AIRDEN : ', AIRDEN(L,I,J) \n" . " IF ( ALLOCATED( AIRVOL ) ) PRINT*, 'AIRVOL : ', AIRVOL(I,J,L) \n" . " IF ( ALLOCATED( ALBD1 ) ) PRINT*, 'ALBD1 : ', ALBD1(I,J) \n" . " IF ( ALLOCATED( ALBD2 ) ) PRINT*, 'ALBD2 : ', ALBD2(I,J) \n" . " IF ( ALLOCATED( ALBD ) ) PRINT*, 'ALBD : ', ALBD(I,J) \n" . " IF ( ALLOCATED( AVGW ) ) PRINT*, 'AVGW : ', AVGW(I,J,L) \n" . " IF ( ALLOCATED( BXHEIGHT ) ) PRINT*, 'BXHEIGHT: ', BXHEIGHT(I,J,L) \n" . " IF ( ALLOCATED( CLDFRC ) ) PRINT*, 'CLDFRC : ', CLDFRC(I,J)\n" . " IF ( ALLOCATED( CLDF ) ) PRINT*, 'CLDF : ', CLDF(L,I,J) \n" . " IF ( ALLOCATED( CLDMAS ) ) PRINT*, 'CLDMAS : ', CLDMAS(I,J,L) \n" . " IF ( ALLOCATED( CLDTOPS ) ) PRINT*, 'CLDTOPS : ', CLDTOPS(I,J) \n" . " IF ( ALLOCATED( DELP ) ) PRINT*, 'DELP : ', DELP(L,I,J) \n" . " IF ( ALLOCATED( DTRAIN ) ) PRINT*, 'DTRAIN : ', DTRAIN(I,J,L) \n" . " IF ( ALLOCATED( GWETTOP ) ) PRINT*, 'GWETTOP : ', GWETTOP(I,J) \n" . " IF ( ALLOCATED( HFLUX ) ) PRINT*, 'HFLUX : ', HFLUX(I,J) \n" . " IF ( ALLOCATED( HKBETA ) ) PRINT*, 'HKBETA : ', HKBETA(I,J,L) \n" . " IF ( ALLOCATED( HKETA ) ) PRINT*, 'HKETA : ', HKETA(I,J,L) \n" . " IF ( ALLOCATED( LWI ) ) PRINT*, 'LWI : ', LWI(I,J) \n" . " IF ( ALLOCATED( MOISTQ ) ) PRINT*, 'MOISTQ : ', MOISTQ(L,I,J) \n" . " IF ( ALLOCATED( OPTD ) ) PRINT*, 'OPTD : ', OPTD(L,I,J) \n" . " IF ( ALLOCATED( OPTDEP ) ) PRINT*, 'OPTDEP : ', OPTDEP(L,I,J) \n" . " IF ( ALLOCATED( PBL ) ) PRINT*, 'PBL : ', PBL(I,J) \n" . " IF ( ALLOCATED( PREACC ) ) PRINT*, 'PREACC : ', PREACC(I,J) \n" . " IF ( ALLOCATED( PRECON ) ) PRINT*, 'PRECON : ', PRECON(I,J) \n" . " IF ( ALLOCATED( PS1 ) ) PRINT*, 'PS1 : ', PS1(I,J) \n" . " IF ( ALLOCATED( PS2 ) ) PRINT*, 'PS2 : ', PS2(I,J) \n" . " IF ( ALLOCATED( PSC2 ) ) PRINT*, 'PSC2 : ', PSC2(I,J)\n" . " IF ( ALLOCATED( RADLWG ) ) PRINT*, 'RADLWG : ', RADLWG(I,J)\n" . " IF ( ALLOCATED( RADSWG ) ) PRINT*, 'RADSWG : ', RADSWG(I,J)\n" . " IF ( ALLOCATED( RH ) ) PRINT*, 'RH : ', RH(I,J,L) \n" . " IF ( ALLOCATED( SLP ) ) PRINT*, 'SLP : ', SLP(I,J) \n" . " IF ( ALLOCATED( SNOW ) ) PRINT*, 'SNOW : ', SNOW(I,J) \n" . " IF ( ALLOCATED( SPHU1 ) ) PRINT*, 'SPHU1 : ', SPHU1(I,J,L) \n" . " IF ( ALLOCATED( SPHU2 ) ) PRINT*, 'SPHU2 : ', SPHU2(I,J,L) \n" . " IF ( ALLOCATED( SPHU ) ) PRINT*, 'SPHU : ', SPHU(I,J,L) \n" . " IF ( ALLOCATED( SUNCOS ) ) PRINT*, 'SUNCOS : ', SUNCOS(IJ) \n" . " IF ( ALLOCATED( SUNCOSB ) ) PRINT*, 'SUNCOSB : ', SUNCOSB(IJ) \n" . " IF ( ALLOCATED( TMPU1 ) ) PRINT*, 'TMPU1 : ', TMPU1(I,J,L) \n" . " IF ( ALLOCATED( TMPU2 ) ) PRINT*, 'TMPU2 : ', TMPU2(I,J,L) \n" . " IF ( ALLOCATED( T ) ) PRINT*, 'TMPU : ', T(I,J,L)\n" . " IF ( ALLOCATED( TROPP ) ) PRINT*, 'TROPP : ', TROPP(I,J) \n" . " IF ( ALLOCATED( TS ) ) PRINT*, 'TS : ', TS(I,J) \n" . " IF ( ALLOCATED( TSKIN ) ) PRINT*, 'TSKIN : ', TSKIN(I,J) \n" . " IF ( ALLOCATED( U10M ) ) PRINT*, 'U10M : ', U10M(I,J) \n" . " IF ( ALLOCATED( USTAR ) ) PRINT*, 'USTAR : ', USTAR(I,J) \n" . " IF ( ALLOCATED( UWND1 ) ) PRINT*, 'UWND1 : ', UWND1(I,J,L) \n" . " IF ( ALLOCATED( UWND2 ) ) PRINT*, 'UWND2 : ', UWND2(I,J,L) \n" . " IF ( ALLOCATED( UWND ) ) PRINT*, 'UWND : ', UWND(I,J,L) \n" . " IF ( ALLOCATED( V10M ) ) PRINT*, 'V10M : ', V10M(I,J) \n" . " IF ( ALLOCATED( VWND1 ) ) PRINT*, 'VWND1 : ', VWND1(I,J,L) \n" . " IF ( ALLOCATED( VWND2 ) ) PRINT*, 'VWND2 : ', VWND2(I,J,L) \n" . " IF ( ALLOCATED( VWND ) ) PRINT*, 'VWND : ', VWND(I,J,L) \n" . " IF ( ALLOCATED( Z0 ) ) PRINT*, 'Z0 : ', Z0(I,J) \n" . " IF ( ALLOCATED( ZMEU ) ) PRINT*, 'ZMEU : ', ZMEU(I,J,L) \n" . " IF ( ALLOCATED( ZMMD ) ) PRINT*, 'ZMMD : ', ZMMD(I,J,L) \n" . " IF ( ALLOCATED( ZMMU ) ) PRINT*, 'ZMMU : ', ZMMU(I,J,L) \n" . "\n" . " ! Flush the output buffer\n" . " CALL FLUSH( 6 )\n" . "\n" . " ! Return to MAIN program\n" . " END SUBROUTINE MET_FIELD_DEBUG\n" . "\n" . "!-----------------------------------------------------------------------------\n" . "\n" . " ! End of program\n" . " END PROGRAM GEOS_CHEM\n" . "\n"; close(FILE); } #============================================= # Main Parser #============================================= printf "Starting GEOS-Chem KPP parser\n"; # Check if the adjoint emissions file is included $skipadjem = 0; open(FILE,"