SURFEX v7.3
General documentation of Surfex
|
00001 ! ######### 00002 SUBROUTINE PGD_CHEMISTRY_SNAP(HPROGRAM,OCH_EMIS) 00003 ! ############################################################## 00004 ! 00005 !!**** *PGD_CHEMISTRY_SNAP* monitor for averaging and interpolations of physiographic fields 00006 !! 00007 !! PURPOSE 00008 !! ------- 00009 !! 00010 !! METHOD 00011 !! ------ 00012 !! 00013 ! 00014 !! EXTERNAL 00015 !! -------- 00016 !! 00017 !! IMPLICIT ARGUMENTS 00018 !! ------------------ 00019 !! 00020 !! REFERENCE 00021 !! --------- 00022 !! 00023 !! AUTHOR 00024 !! ------ 00025 !! 00026 !! S; Queguiner Meteo-France 00027 !! 00028 !! MODIFICATION 00029 !! ------------ 00030 !! 00031 !! Original 09/2011 00032 !! 00033 !---------------------------------------------------------------------------- 00034 ! 00035 !* 0. DECLARATION 00036 ! ----------- 00037 ! 00038 USE MODD_PGDWORK, ONLY : CATYPE 00039 USE MODD_SURF_PAR, ONLY : XUNDEF 00040 USE MODD_PGD_GRID, ONLY : NL 00041 USE MODD_CH_SNAP_n, ONLY : JPEMISMAX,JPSNAPMAX, & 00042 NEMIS_SNAP_n=>NEMIS_SNAP, & 00043 NEMIS_NBR_n=>NEMIS_NBR, & 00044 CEMIS_NAME_n=>CEMIS_NAME, & 00045 CEMIS_COMMENT_n=>CEMIS_COMMENT, & 00046 XSNAP_MONTHLY,XSNAP_DAILY, XSNAP_HOURLY, & 00047 NSNAP_M, NSNAP_D, NSNAP_H, & 00048 XEMIS_FIELDS_SNAP, LEMIS_FIELDS, & 00049 CSNAP_TIME_REF, XDELTA_LEGAL_TIME 00050 USE MODI_GET_LUOUT 00051 USE MODI_OPEN_NAMELIST 00052 USE MODI_CLOSE_NAMELIST 00053 ! 00054 USE MODE_POS_SURF 00055 USE MODI_PGD_FIELD 00056 USE MODI_PGD_SNAP_TEMP_PROFILE 00057 USE MODI_GET_LUOUT 00058 USE MODI_ABOR1_SFX 00059 ! 00060 ! 00061 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00062 USE PARKIND1 ,ONLY : JPRB 00063 ! 00064 ! 00065 IMPLICIT NONE 00066 ! 00067 !* 0.1 Declaration of arguments 00068 ! ------------------------ 00069 ! 00070 CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! Type of program 00071 LOGICAL, INTENT(OUT) :: OCH_EMIS ! emission flag 00072 ! 00073 ! 00074 !* 0.2 Declaration of local variables 00075 ! ------------------------------ 00076 ! 00077 INTEGER :: ILUOUT ! output listing logical unit 00078 INTEGER :: ILUNAM ! namelist file logical unit 00079 LOGICAL :: GFOUND ! flag when namelist is present 00080 INTEGER :: JSPEC ! loop counter on emission species 00081 INTEGER :: JSNAP ! loop counter on SNAP categories 00082 CHARACTER(LEN=5) :: YSNAP_TIME_REF ! to check if all snaps use 00083 ! ! the same time reference 00084 ! 00085 !* 0.3 Declaration of namelists 00086 ! ------------------------ 00087 ! 00088 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00089 CHARACTER(LEN=6), DIMENSION(JPEMISMAX):: CEMIS_NAME 00090 CHARACTER(LEN=40), DIMENSION(JPEMISMAX):: CEMIS_COMMENT 00091 CHARACTER(LEN=28), DIMENSION(JPEMISMAX):: CSNAP_MONTHLY_FILE 00092 CHARACTER(LEN=28), DIMENSION(JPEMISMAX):: CSNAP_DAILY_FILE 00093 CHARACTER(LEN=28), DIMENSION(JPEMISMAX):: CSNAP_HOURLY_FILE 00094 CHARACTER(LEN=50), DIMENSION(JPEMISMAX,JPSNAPMAX):: CSNAP_POTENTIAL_FILE 00095 CHARACTER(LEN=6), DIMENSION(JPEMISMAX) :: CSNAP_POTENTIAL_FILETYPE 00096 REAL, DIMENSION(JPEMISMAX,JPSNAPMAX):: XUNIF_SNAP 00097 CHARACTER(LEN=50) :: CDELTA_LEGAL_TIME_FILE 00098 CHARACTER(LEN=6) :: CDELTA_LEGAL_TIME_FILETYPE 00099 REAL :: XUNIF_DELTA_LEGAL_TIME 00100 INTEGER :: NEMIS_NBR 00101 INTEGER :: NEMIS_SNAP 00102 ! 00103 ! 00104 NAMELIST/NAM_CH_SNAP_EMIS_PGD/ NEMIS_NBR, NEMIS_SNAP, CEMIS_NAME,& 00105 CEMIS_COMMENT, & 00106 CSNAP_MONTHLY_FILE, & 00107 CSNAP_DAILY_FILE, & 00108 CSNAP_HOURLY_FILE, & 00109 CSNAP_POTENTIAL_FILE, & 00110 CSNAP_POTENTIAL_FILETYPE, & 00111 XUNIF_SNAP, & 00112 XUNIF_DELTA_LEGAL_TIME, & 00113 CDELTA_LEGAL_TIME_FILE, & 00114 CDELTA_LEGAL_TIME_FILETYPE 00115 !------------------------------------------------------------------------------- 00116 ! 00117 !* 1. Initializations of defaults 00118 ! --------------------------- 00119 ! 00120 ! 00121 IF (LHOOK) CALL DR_HOOK('PGD_CHEMISTRY_SNAP',0,ZHOOK_HANDLE) 00122 NEMIS_NBR = 0 00123 CEMIS_NAME(:) = ' ' 00124 CEMIS_COMMENT(:) = '' 00125 ! 00126 NEMIS_SNAP = 0 00127 NSNAP_M = 12 00128 NSNAP_D = 7 00129 NSNAP_H = 24 00130 XUNIF_SNAP = XUNDEF 00131 XUNIF_DELTA_LEGAL_TIME = XUNDEF 00132 CSNAP_MONTHLY_FILE(:) = ' ' 00133 CSNAP_DAILY_FILE(:) = ' ' 00134 CSNAP_HOURLY_FILE(:) = ' ' 00135 CSNAP_POTENTIAL_FILETYPE(:)= ' ' 00136 CSNAP_POTENTIAL_FILE(:,:) = ' ' 00137 CDELTA_LEGAL_TIME_FILETYPE = ' ' 00138 CDELTA_LEGAL_TIME_FILE = ' ' 00139 ! 00140 CALL GET_LUOUT(HPROGRAM,ILUOUT) 00141 ! 00142 !------------------------------------------------------------------------------- 00143 ! 00144 !* 2. Reading of namelist 00145 ! ------------------- 00146 ! 00147 ! 00148 CALL OPEN_NAMELIST(HPROGRAM,ILUNAM) 00149 ! 00150 CALL POSNAM(ILUNAM,'NAM_CH_SNAP_EMIS_PGD',GFOUND,ILUOUT) 00151 IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_CH_SNAP_EMIS_PGD) 00152 ! 00153 CALL CLOSE_NAMELIST(HPROGRAM,ILUNAM) 00154 ! 00155 !------------------------------------------------------------------------------- 00156 ! 00157 !* 3. Allocation 00158 ! ---------- 00159 ! 00160 NEMIS_NBR_n = NEMIS_NBR 00161 NEMIS_SNAP_n = NEMIS_SNAP 00162 ! 00163 ALLOCATE(CEMIS_NAME_n(NEMIS_NBR)) 00164 ALLOCATE(CEMIS_COMMENT_n(NEMIS_NBR)) 00165 ! 00166 ALLOCATE(XSNAP_MONTHLY (NSNAP_M,NEMIS_SNAP,NEMIS_NBR)) 00167 ALLOCATE(XSNAP_DAILY (NSNAP_D,NEMIS_SNAP,NEMIS_NBR)) 00168 ALLOCATE(XSNAP_HOURLY (NSNAP_H,NEMIS_SNAP,NEMIS_NBR)) 00169 ! 00170 CEMIS_NAME_n (:) = CEMIS_NAME (1:NEMIS_NBR) 00171 CEMIS_COMMENT_n (:) = CEMIS_COMMENT(1:NEMIS_NBR) 00172 ! 00173 ALLOCATE(XEMIS_FIELDS_SNAP(NL,NEMIS_SNAP,NEMIS_NBR)) 00174 ! 00175 LEMIS_FIELDS = .FALSE. 00176 ! 00177 !------------------------------------------------------------------------------- 00178 OCH_EMIS = NEMIS_NBR > 0 00179 !------------------------------------------------------------------------------- 00180 ! 00181 !* 4. Computes Potential maps for each snap and reads temporal profiles 00182 ! ----------------------------------------------------------------- 00183 ! 00184 YSNAP_TIME_REF = ' ' 00185 ! 00186 DO JSPEC=1,NEMIS_NBR 00187 00188 CALL PGD_SNAP_TEMP_PROFILE('ASCII ',CSNAP_MONTHLY_FILE(JSPEC),XSNAP_MONTHLY(:,:,JSPEC),NEMIS_SNAP,NSNAP_M) 00189 CALL PGD_SNAP_TEMP_PROFILE('ASCII ',CSNAP_DAILY_FILE(JSPEC), XSNAP_DAILY(:,:,JSPEC),NEMIS_SNAP,NSNAP_D) 00190 CALL PGD_SNAP_TEMP_PROFILE('ASCII ',CSNAP_HOURLY_FILE(JSPEC), XSNAP_HOURLY(:,:,JSPEC),NEMIS_SNAP,NSNAP_H,CSNAP_TIME_REF) 00191 00192 IF (JSPEC==1) YSNAP_TIME_REF = CSNAP_TIME_REF 00193 IF (YSNAP_TIME_REF/=CSNAP_TIME_REF) THEN 00194 CALL ABOR1_SFX('ALL SNAP HOURLY PROFILES MUST HAVE THE SAME TIME REFERENCE') 00195 END IF 00196 00197 DO JSNAP=1,NEMIS_SNAP 00198 CATYPE = 'ARI' 00199 CALL PGD_FIELD(HPROGRAM,'SNAP','ALL',CSNAP_POTENTIAL_FILE(JSPEC,JSNAP), & 00200 CSNAP_POTENTIAL_FILETYPE(JSPEC),XUNIF_SNAP(JSPEC,JSNAP), & 00201 XEMIS_FIELDS_SNAP(:,JSNAP,JSPEC) ) 00202 ENDDO 00203 ENDDO 00204 ! 00205 !------------------------------------------------------------------------------- 00206 ! 00207 !* 5. Computes legal time map if legal time option is used 00208 ! ---------------------------------------------------- 00209 ! 00210 IF (CSNAP_TIME_REF=='LEGAL') THEN 00211 ALLOCATE(XDELTA_LEGAL_TIME(NL)) 00212 CALL PGD_FIELD(HPROGRAM,'LEGAL_TIME','ALL', CDELTA_LEGAL_TIME_FILE, & 00213 CDELTA_LEGAL_TIME_FILETYPE,XUNIF_DELTA_LEGAL_TIME, & 00214 XDELTA_LEGAL_TIME(:) ) 00215 !* conversion from seconds to hours 00216 ! Beware: 00217 ! one uses the fact here that no legal hour increment is less more than 24h. 00218 ! Legal hour is either zero (in which case division has no effect) 00219 ! or specified unit is second 00220 WHERE(ABS(XDELTA_LEGAL_TIME(:))>=24.) & 00221 XDELTA_LEGAL_TIME(:) = XDELTA_LEGAL_TIME(:) / 3600. 00222 END IF 00223 ! 00224 !------------------------------------------------------------------------------- 00225 ! 00226 IF (LHOOK) CALL DR_HOOK('PGD_CHEMISTRY_SNAP',1,ZHOOK_HANDLE) 00227 ! 00228 END SUBROUTINE PGD_CHEMISTRY_SNAP