! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! ! Auxiliary Routines File ! ! Generated by KPP-2.2 symbolic chemistry Kinetics PreProcessor ! (http://www.cs.vt.edu/~asandu/Software/KPP) ! KPP is distributed under GPL, the general public licence ! (http://www.gnu.org/copyleft/gpl.html) ! (C) 1995-1997, V. Damian & A. Sandu, CGRER, Univ. Iowa ! (C) 1997-2005, A. Sandu, Michigan Tech, Virginia Tech ! With important contributions from: ! M. Damian, Villanova University, USA ! R. Sander, Max-Planck Institute for Chemistry, Mainz, Germany ! ! File : gckpp_adj_Util.f90 ! Time : Tue May 14 19:43:54 2013 ! Working directory : /home/daven/kpp-2.2.1/GC_KPP ! Equation file : gckpp_adj.kpp ! Output root filename : gckpp_adj ! ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ MODULE gckpp_adj_Util USE gckpp_adj_Parameters IMPLICIT NONE CONTAINS ! User INLINED Utility Functions ! End INLINED Utility Functions ! Need to add this to the INLINE !------------------------------------------------------------------------------ SUBROUTINE INIT_KPP( ) ! !****************************************************************************** ! Subroutine INIT_KPP allocates global arrays (dkh, 06/07/06) ! ! ! NOTES: ! (1 ) Should make this an inlines utility? ! (2 ) Use LAMBDA_P instead of SUM_LAMBDA. (dkh, 10/16/06) ! (3 ) Now define JCOEFF here and initialize RCONST2RRATE array. (dkh, 10/16/06) ! (4 ) Update to GCv8, now use VAR_R_ADJ instead of LAMBDA_P. It is not ! dynamically allocated. !****************************************************************************** ! ! Reference to f90 modules ! Modified for reaction rate sensitivities (tww, 05/08/12) USE GCKPP_ADJ_GLOBAL, ONLY : NCOEFF, NCOEFF_EM USE GCKPP_ADJ_GLOBAL, ONLY : JCOEFF USE LOGICAL_ADJ_MOD, ONLY : LADJ_RRATE USE ADJ_ARRAYS_MOD, ONLY : ID_RRATES, NRRATES USE GCKPP_ADJ_GLOBAL, ONLY : DMAP USE GCKPP_ADJ_PARAMETERS ! Local variables INTEGER :: I !================================================================= ! INIT_KPP begins here! !================================================================= ! Select ALL reaction rate constants ! Grab emissions rates here (tww, 05/08/12) DO I = 1, NCOEFF_EM-1 JCOEFF(I) = I + 228 ENDDO JCOEFF(NCOEFF_EM) = 244 ! Get reaction rates from input.gcadj (tww, 05/08/12) IF ( LADJ_RRATE ) THEN DO I = NCOEFF_EM+1, NCOEFF_EM+NRRATES JCOEFF(I) = ID_RRATES(I-NCOEFF_EM) ENDDO ENDIF ! emissions DMAP(1 ) = ind_NO DMAP(2 ) = ind_NO2 DMAP(3 ) = ind_CO DMAP(4 ) = ind_ALK4 DMAP(5 ) = ind_ISOP DMAP(6 ) = ind_ACET DMAP(7 ) = ind_PRPE DMAP(8 ) = ind_C3H8 DMAP(9 ) = ind_C2H6 DMAP(10) = ind_MEK DMAP(11) = ind_ALD2 DMAP(12) = ind_CH2O DMAP(13) = ind_O3 DMAP(14) = ind_HNO3 ! Return to calling program END SUBROUTINE INIT_KPP !------------------------------------------------------------------------------ ! Utility Functions from KPP_HOME/util/util ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! ! UTIL - Utility functions ! Arguments : ! ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! **************************************************************** ! ! InitSaveData - Opens the data file for writing ! Parameters : ! ! **************************************************************** SUBROUTINE InitSaveData () USE gckpp_adj_Parameters open(10, file='gckpp_adj.dat') END SUBROUTINE InitSaveData ! End of InitSaveData function ! **************************************************************** ! **************************************************************** ! ! SaveData - Write LOOKAT species in the data file ! Parameters : ! ! **************************************************************** SUBROUTINE SaveData () USE gckpp_adj_Global USE gckpp_adj_Monitor INTEGER i WRITE(10,999) (TIME-TSTART)/3600.D0, & (C(LOOKAT(i))/CFACTOR, i=1,NLOOKAT) 999 FORMAT(E24.16,100(1X,E24.16)) END SUBROUTINE SaveData ! End of SaveData function ! **************************************************************** ! **************************************************************** ! ! CloseSaveData - Close the data file ! Parameters : ! ! **************************************************************** SUBROUTINE CloseSaveData () USE gckpp_adj_Parameters CLOSE(10) END SUBROUTINE CloseSaveData ! End of CloseSaveData function ! **************************************************************** ! **************************************************************** ! ! GenerateMatlab - Generates MATLAB file to load the data file ! Parameters : ! It will have a character string to prefix each ! species name with. ! ! **************************************************************** SUBROUTINE GenerateMatlab ( PREFIX ) USE gckpp_adj_Parameters USE gckpp_adj_Global USE gckpp_adj_Monitor CHARACTER(LEN=8) PREFIX INTEGER i open(20, file='gckpp_adj.m') write(20,*) 'load gckpp_adj.dat;' write(20,990) PREFIX 990 FORMAT(A1,'c = gckpp_adj;') write(20,*) 'clear gckpp_adj;' write(20,991) PREFIX, PREFIX 991 FORMAT(A1,'t=',A1,'c(:,1);') write(20,992) PREFIX 992 FORMAT(A1,'c(:,1)=[];') do i=1,NLOOKAT write(20,993) PREFIX, SPC_NAMES(LOOKAT(i)), PREFIX, i 993 FORMAT(A1,A6,' = ',A1,'c(:,',I2,');') end do CLOSE(20) END SUBROUTINE GenerateMatlab ! End of GenerateMatlab function ! **************************************************************** ! End Utility Functions from KPP_HOME/util/util ! End of UTIL function ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! ! Shuffle_user2kpp - function to copy concentrations from USER to KPP ! Arguments : ! V_USER - Concentration of variable species in USER's order ! V - Concentrations of variable species (local) ! ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SUBROUTINE Shuffle_user2kpp ( V_USER, V ) ! V_USER - Concentration of variable species in USER's order REAL(kind=dp) :: V_USER(NVAR) ! V - Concentrations of variable species (local) REAL(kind=dp) :: V(NVAR) V(52) = V_USER(1) V(49) = V_USER(2) V(71) = V_USER(3) V(22) = V_USER(4) V(62) = V_USER(5) V(53) = V_USER(6) V(23) = V_USER(7) V(16) = V_USER(8) V(69) = V_USER(9) V(47) = V_USER(10) V(1) = V_USER(11) V(2) = V_USER(12) V(3) = V_USER(13) V(4) = V_USER(14) V(5) = V_USER(15) V(6) = V_USER(16) V(7) = V_USER(17) V(8) = V_USER(18) V(9) = V_USER(19) V(10) = V_USER(20) V(74) = V_USER(21) V(35) = V_USER(22) V(88) = V_USER(23) V(50) = V_USER(24) V(36) = V_USER(25) V(19) = V_USER(26) V(17) = V_USER(27) V(61) = V_USER(28) V(24) = V_USER(29) V(56) = V_USER(30) V(29) = V_USER(31) V(84) = V_USER(32) V(58) = V_USER(33) V(66) = V_USER(34) V(41) = V_USER(35) V(67) = V_USER(36) V(39) = V_USER(37) V(65) = V_USER(38) V(43) = V_USER(39) V(46) = V_USER(40) V(60) = V_USER(41) V(80) = V_USER(42) V(55) = V_USER(43) V(78) = V_USER(44) V(26) = V_USER(45) V(27) = V_USER(46) V(86) = V_USER(47) V(76) = V_USER(48) V(75) = V_USER(49) V(90) = V_USER(50) V(28) = V_USER(51) V(59) = V_USER(52) V(40) = V_USER(53) V(77) = V_USER(54) V(51) = V_USER(55) V(25) = V_USER(56) V(85) = V_USER(57) V(82) = V_USER(58) V(87) = V_USER(59) V(89) = V_USER(60) V(83) = V_USER(61) V(21) = V_USER(62) V(44) = V_USER(63) V(70) = V_USER(64) V(37) = V_USER(65) V(18) = V_USER(66) V(63) = V_USER(67) V(48) = V_USER(68) V(38) = V_USER(69) V(54) = V_USER(70) V(73) = V_USER(71) V(72) = V_USER(72) V(30) = V_USER(73) V(31) = V_USER(74) V(32) = V_USER(75) V(68) = V_USER(76) V(81) = V_USER(77) V(57) = V_USER(78) V(79) = V_USER(79) V(45) = V_USER(80) V(33) = V_USER(81) V(64) = V_USER(82) V(42) = V_USER(83) V(34) = V_USER(84) V(20) = V_USER(85) V(11) = V_USER(86) V(12) = V_USER(87) V(13) = V_USER(88) V(14) = V_USER(89) END SUBROUTINE Shuffle_user2kpp ! End of Shuffle_user2kpp function ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! ! Shuffle_kpp2user - function to restore concentrations from KPP to USER ! Arguments : ! V - Concentrations of variable species (local) ! V_USER - Concentration of variable species in USER's order ! ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SUBROUTINE Shuffle_kpp2user ( V, V_USER ) ! V - Concentrations of variable species (local) REAL(kind=dp) :: V(NVAR) ! V_USER - Concentration of variable species in USER's order REAL(kind=dp) :: V_USER(NVAR) V_USER(1) = V(52) V_USER(2) = V(49) V_USER(3) = V(71) V_USER(4) = V(22) V_USER(5) = V(62) V_USER(6) = V(53) V_USER(7) = V(23) V_USER(8) = V(16) V_USER(9) = V(69) V_USER(10) = V(47) V_USER(11) = V(1) V_USER(12) = V(2) V_USER(13) = V(3) V_USER(14) = V(4) V_USER(15) = V(5) V_USER(16) = V(6) V_USER(17) = V(7) V_USER(18) = V(8) V_USER(19) = V(9) V_USER(20) = V(10) V_USER(21) = V(74) V_USER(22) = V(35) V_USER(23) = V(88) V_USER(24) = V(50) V_USER(25) = V(36) V_USER(26) = V(19) V_USER(27) = V(17) V_USER(28) = V(61) V_USER(29) = V(24) V_USER(30) = V(56) V_USER(31) = V(29) V_USER(32) = V(84) V_USER(33) = V(58) V_USER(34) = V(66) V_USER(35) = V(41) V_USER(36) = V(67) V_USER(37) = V(39) V_USER(38) = V(65) V_USER(39) = V(43) V_USER(40) = V(46) V_USER(41) = V(60) V_USER(42) = V(80) V_USER(43) = V(55) V_USER(44) = V(78) V_USER(45) = V(26) V_USER(46) = V(27) V_USER(47) = V(86) V_USER(48) = V(76) V_USER(49) = V(75) V_USER(50) = V(90) V_USER(51) = V(28) V_USER(52) = V(59) V_USER(53) = V(40) V_USER(54) = V(77) V_USER(55) = V(51) V_USER(56) = V(25) V_USER(57) = V(85) V_USER(58) = V(82) V_USER(59) = V(87) V_USER(60) = V(89) V_USER(61) = V(83) V_USER(62) = V(21) V_USER(63) = V(44) V_USER(64) = V(70) V_USER(65) = V(37) V_USER(66) = V(18) V_USER(67) = V(63) V_USER(68) = V(48) V_USER(69) = V(38) V_USER(70) = V(54) V_USER(71) = V(73) V_USER(72) = V(72) V_USER(73) = V(30) V_USER(74) = V(31) V_USER(75) = V(32) V_USER(76) = V(68) V_USER(77) = V(81) V_USER(78) = V(57) V_USER(79) = V(79) V_USER(80) = V(45) V_USER(81) = V(33) V_USER(82) = V(64) V_USER(83) = V(42) V_USER(84) = V(34) V_USER(85) = V(20) V_USER(86) = V(11) V_USER(87) = V(12) V_USER(88) = V(13) V_USER(89) = V(14) END SUBROUTINE Shuffle_kpp2user ! End of Shuffle_kpp2user function ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! ! GetMass - compute total mass of selected atoms ! Arguments : ! CL - Concentration of all species (local) ! Mass - value of mass balance ! ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SUBROUTINE GetMass ( CL, Mass ) ! CL - Concentration of all species (local) REAL(kind=dp) :: CL(NSPEC) ! Mass - value of mass balance REAL(kind=dp) :: Mass(1) END SUBROUTINE GetMass ! End of GetMass function ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ END MODULE gckpp_adj_Util