Files
GEOS-Chem-adjoint-v35-note/code/adjoint/gckpp_adj_Util.f90
2018-08-28 00:33:48 -04:00

471 lines
12 KiB
Fortran

! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!
! 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