PageRenderTime 27ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/code/diag04_mod.f

https://gitlab.com/ywang/ywang_gcadj_diag
FORTRAN Legacy | 287 lines | 100 code | 57 blank | 130 comment | 6 complexity | e0b41621d01e239a6186d8e292bf0753 MD5 | raw file
  1. ! $Id: diag04_mod.f,v 1.2 2010/05/07 20:39:47 daven Exp $
  2. MODULE DIAG04_MOD
  3. !
  4. !******************************************************************************
  5. ! Module DIAG04_MOD contains arrays and routines for archiving the ND04
  6. ! diagnostic -- CO2 emissions and fluxes (bmy, 7/26/05, 9/5/06)
  7. !
  8. ! Module Variables:
  9. ! ============================================================================
  10. ! (1 ) AD04 (REAL*4) : Array for 2-D CO2 emissions/uptake
  11. ! (2 ) AD04_plane (REAL*4) : Array for 3-D CO2 emissions from aircraft
  12. ! (3 ) AD04_chem (REAL*4) : Array for 3-D CO2 emissions from chemical oxidation
  13. !
  14. ! Module Routines:
  15. ! ============================================================================
  16. ! (1 ) ZERO_DIAG04 : Sets all module arrays to zero
  17. ! (2 ) WRITE_DIAG04 : Writes data in module arrays to bpch file
  18. ! (3 ) INIT_DIAG04 : Allocates all module arrays
  19. ! (4 ) CLEANUP_DIAG04 : Deallocates all module arrays
  20. !
  21. ! GEOS-CHEM modules referenced by diag04_mod.f
  22. ! ============================================================================
  23. ! (1 ) bpch2_mod.f : Module w/ routines for binary pch file I/O
  24. ! (2 ) error_mod.f : Module w/ NaN and other error check routines
  25. ! (3 ) file_mod.f : Module w/ file unit numbers and error checks
  26. ! (4 ) grid_mod.f : Module w/ horizontal grid information
  27. ! (5 ) time_mod.f : Module w/ routines to compute date & time
  28. !
  29. ! NOTES:
  30. ! (1 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
  31. ! (2 ) Replace TINY(1d0) with 1d-32 to avoid problems on SUN 4100 platform
  32. ! (bmy, 9/5/06)
  33. ! (3 ) Modified for ship emissions (2-D), aircraft emissions (3-D) and
  34. ! chemical source for CO2 (3-D) (RayNassar, 2009-12-23)
  35. !******************************************************************************
  36. !
  37. IMPLICIT NONE
  38. !=================================================================
  39. ! MODULE PRIVATE DECLARATIONS -- keep certain internal variables
  40. ! and routines from being seen outside "diag04_mod.f"
  41. !=================================================================
  42. ! Make everything PUBLIC
  43. PUBLIC
  44. !=================================================================
  45. ! MODULE VARIABLES
  46. !=================================================================
  47. ! Scalars
  48. INTEGER :: ND04, LD04
  49. INTEGER, PARAMETER :: PD04 = 10
  50. ! Arrays
  51. REAL*4, ALLOCATABLE :: AD04(:,:,:)
  52. REAL*4, ALLOCATABLE :: AD04_plane(:,:,:)
  53. REAL*4, ALLOCATABLE :: AD04_chem(:,:,:)
  54. !=================================================================
  55. ! MODULE ROUTINES -- follow below the "CONTAINS" statement
  56. !=================================================================
  57. CONTAINS
  58. !------------------------------------------------------------------------------
  59. SUBROUTINE ZERO_DIAG04
  60. !
  61. !******************************************************************************
  62. ! Subroutine ZERO_DIAG04 zeroes the ND04 diagnostic array (bmy, 7/26/05)
  63. !******************************************************************************
  64. !
  65. ! ! References to F90 modules
  66. # include "CMN_SIZE" ! Size parameters
  67. !=================================================================
  68. ! ZERO_DIAG04 begins here!
  69. !=================================================================
  70. ! Exit if ND04 is turned off
  71. IF ( ND04 == 0 ) RETURN
  72. ! Zero 2-D array (for N=7 tracers) and 3-D plane and chem arrays
  73. AD04(:,:,:) = 0e0
  74. AD04_plane(:,:,:) = 0e0
  75. AD04_chem(:,:,:) = 0e0
  76. ! Return to calling program
  77. END SUBROUTINE ZERO_DIAG04
  78. !------------------------------------------------------------------------------
  79. SUBROUTINE WRITE_DIAG04
  80. !
  81. !******************************************************************************
  82. ! Subroutine WRITE_DIAG04 writes the ND04 diagnostic arrays to the binary
  83. ! punch file at the proper time. (bmy, 7/26/05, 9/3/06)
  84. !
  85. ! # : Field : Description : Units : Scale factor
  86. ! --------------------------------------------------------------------------
  87. ! (1 ) CO2-SRCE : CO2 fossil fuel emissions : molec/cm2/s : SCALE
  88. ! (2 ) CO2-SRCE : CO2 ocean emissions : molec/cm2/s : SCALE
  89. ! (3 ) CO2-SRCE : CO2 balanced biosphere : molec/cm2/s : SCALE
  90. ! (4 ) CO2-SRCE : CO2 biomass emissions : molec/cm2/s : SCALE
  91. ! (5 ) CO2-SRCE : CO2 biofuel emissions : molec/cm2/s : SCALE
  92. ! (6 ) CO2-SRCE : CO2 net terrestrial exchange : molec/cm2/s : SCALE
  93. ! (7 ) CO2-SRCE : CO2 ship emissions : molec/cm2/s : SCALE
  94. ! (8 ) CO2-SRCE : CO2 aircraft emissions (3-D) : molec/cm2/s : SCALE
  95. ! (9 ) CO2-SRCE : CO2 chemical source (3-D) : molec/cm2/s : SCALE
  96. ! (10) CO2-SRCE : CO2 chem source surf correct : molec/cm2/s : SCALE
  97. !
  98. ! NOTES:
  99. ! (1 ) Now make sure all USE statements are USE, ONLY (bmy, 10/3/05)
  100. ! (2 ) Replace TINY(1d0) with 1d-32 to avoid problems on SUN 4100 platform
  101. ! (bmy, 9/5/06)
  102. !******************************************************************************
  103. !
  104. ! References to F90 modules
  105. USE BPCH2_MOD, ONLY : BPCH2, GET_MODELNAME, GET_HALFPOLAR
  106. USE FILE_MOD, ONLY : IU_BPCH
  107. USE GRID_MOD, ONLY : GET_XOFFSET, GET_YOFFSET
  108. USE TIME_MOD, ONLY : GET_CT_EMIS, GET_DIAGb, GET_DIAGe
  109. # include "CMN_SIZE" ! Size parameters
  110. # include "CMN_DIAG" ! TINDEX
  111. ! Local variables
  112. INTEGER :: CENTER180, HALFPOLAR, IFIRST, JFIRST
  113. INTEGER :: LFIRST, LMAX, M, N
  114. REAL*4 :: ARRAY(IIPAR,JJPAR,LLPAR)
  115. REAL*4 :: LONRES, LATRES
  116. REAL*8 :: DIAGb, DIAGe, SCALE
  117. CHARACTER(LEN=20) :: MODELNAME
  118. CHARACTER(LEN=40) :: CATEGORY, RESERVED, UNIT
  119. !=================================================================
  120. ! WRITE_DIAG04 begins here!
  121. !=================================================================
  122. ! Exit if ND04 is turned off
  123. IF ( ND04 == 0 ) RETURN
  124. ! Initialize
  125. CENTER180 = 1
  126. DIAGb = GET_DIAGb()
  127. DIAGe = GET_DIAGe()
  128. HALFPOLAR = GET_HALFPOLAR()
  129. IFIRST = GET_XOFFSET( GLOBAL=.TRUE. ) + 1
  130. JFIRST = GET_YOFFSET( GLOBAL=.TRUE. ) + 1
  131. LATRES = DJSIZE
  132. LFIRST = 1
  133. LONRES = DISIZE
  134. MODELNAME = GET_MODELNAME()
  135. RESERVED = ''
  136. SCALE = DBLE( GET_CT_EMIS() ) + 1d-32
  137. !=================================================================
  138. ! Write data to the bpch file
  139. ! Note: if any of the ARRAY or AD04* dimensions are wrong, the
  140. ! run will crash with "ERROR RUNNING GEOS-CHEM" at the end.
  141. !=================================================================
  142. ! Loop over ND04 diagnostic tracers
  143. DO M = 1, TMAX(4)
  144. ! Get quantities
  145. N = TINDEX(4,M)
  146. IF (N <= 7) THEN
  147. CATEGORY = 'CO2-SRCE'
  148. UNIT = 'molec/cm2/s'
  149. !UNIT = '' ! Let GAMAP pick the unit
  150. LMAX = 1
  151. ARRAY(:,:,1) = AD04(:,:,N) / SCALE
  152. ELSEIF (N == 8) THEN
  153. CATEGORY = 'CO2-SRCE'
  154. UNIT = 'molec/cm3/s'
  155. LMAX = LD04
  156. ARRAY(:,:,1:LMAX) = AD04_plane(:,:,1:LMAX) / SCALE
  157. ELSEIF (N == 9) THEN
  158. CATEGORY = 'CO2-SRCE'
  159. UNIT = 'molec/cm3/s'
  160. LMAX = LD04
  161. ARRAY(:,:,1:LMAX) = AD04_chem(:,:,1:LMAX) / SCALE
  162. ELSEIF (N == 10) THEN
  163. CATEGORY = 'CO2-SRCE'
  164. UNIT = 'molec/cm2/s'
  165. LMAX = 1
  166. ARRAY(:,:,1) = AD04(:,:,N) / SCALE
  167. ELSE
  168. CYCLE
  169. ENDIF
  170. ! Write data to disk
  171. CALL BPCH2( IU_BPCH, MODELNAME, LONRES, LATRES,
  172. & HALFPOLAR, CENTER180, CATEGORY, N,
  173. & UNIT, DIAGb, DIAGe, RESERVED,
  174. & IIPAR, JJPAR, LMAX, IFIRST,
  175. & JFIRST, LFIRST, ARRAY(:,:,1:LMAX) )
  176. ENDDO
  177. ! Return to calling program
  178. END SUBROUTINE WRITE_DIAG04
  179. !------------------------------------------------------------------------------
  180. SUBROUTINE INIT_DIAG04
  181. !
  182. !******************************************************************************
  183. ! Subroutine INIT_DIAG04 allocates all module arrays (bmy, 7/26/05)
  184. !
  185. ! NOTES:
  186. !******************************************************************************
  187. !
  188. ! References to F90 modules
  189. USE ERROR_MOD, ONLY : ALLOC_ERR
  190. # include "CMN_SIZE"
  191. ! Local variables
  192. INTEGER :: AS
  193. !=================================================================
  194. ! INIT_DIAG04 begins here!
  195. !=================================================================
  196. ! Exit if ND04 is turned off
  197. IF ( ND04 == 0 ) RETURN
  198. ! Get number of levels for 3-D arrays
  199. LD04 = MIN( ND04, LLPAR )
  200. ! 2-D array ("CO2-SRCE")
  201. ! ALLOCATE( AD04( IIPAR, JJPAR, PD04-2 ), STAT=AS )
  202. ALLOCATE( AD04( IIPAR, JJPAR, PD04 ), STAT=AS )
  203. IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD04' )
  204. ! 3-D arrays ("CO2-SRCE")
  205. ALLOCATE( AD04_plane( IIPAR, JJPAR, LLPAR ), STAT=AS )
  206. IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD04_plane' )
  207. ALLOCATE( AD04_chem( IIPAR, JJPAR, LLPAR ), STAT=AS )
  208. IF ( AS /= 0 ) CALL ALLOC_ERR( 'AD04_chem' )
  209. ! Zero arrays
  210. CALL ZERO_DIAG04
  211. ! Return to calling program
  212. END SUBROUTINE INIT_DIAG04
  213. !------------------------------------------------------------------------------
  214. SUBROUTINE CLEANUP_DIAG04
  215. !
  216. !******************************************************************************
  217. ! Subroutine CLEANUP_DIAG04 deallocates all module arrays (bmy, 7/26/05)
  218. !******************************************************************************
  219. !
  220. !=================================================================
  221. ! CLEANUP_DIAG04 begins here!
  222. !=================================================================
  223. IF ( ALLOCATED( AD04 ) ) DEALLOCATE( AD04 )
  224. IF ( ALLOCATED( AD04_plane ) ) DEALLOCATE( AD04_plane )
  225. IF ( ALLOCATED( AD04_chem ) ) DEALLOCATE( AD04_chem )
  226. ! Return to calling program
  227. END SUBROUTINE CLEANUP_DIAG04
  228. !------------------------------------------------------------------------------
  229. ! End of module
  230. END MODULE DIAG04_MOD