SURFEX v7.3
General documentation of Surfex
|
00001 ! ########################### 00002 MODULE MODD_CH_SNAP_n 00003 ! ########################### 00004 ! 00005 !!**** *MODD_CH_SNAP_n* - declaration of chemical emission data arrays 00006 !! 00007 !! PURPOSE 00008 !! ------- 00009 ! The purpose of this declarative module is to specify the 00010 ! chemical emission data arrays. 00011 ! 00012 !! 00013 !!** IMPLICIT ARGUMENTS 00014 !! ------------------ 00015 !! None 00016 !! 00017 !! REFERENCE 00018 !! --------- 00019 !! 00020 !! 00021 !! AUTHOR 00022 !! ------ 00023 !! D. Gazen *L.A.* 00024 !! 00025 !! MODIFICATIONS 00026 !! ------------- 00027 !! Original 08/03/2001 00028 !! 01/12/03 (D.Gazen) change emissions handling for surf. externalization 00029 !------------------------------------------------------------------------------- 00030 ! 00031 !* 0. DECLARATIONS 00032 ! ------------ 00033 ! 00034 USE MODD_TYPE_EFUTIL 00035 ! 00036 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00037 USE PARKIND1 ,ONLY : JPRB 00038 ! 00039 IMPLICIT NONE 00040 00041 INTEGER,PARAMETER :: JPEMISMAX = 1000 00042 INTEGER,PARAMETER :: JPSNAPMAX = 50 00043 TYPE CH_EMIS_SNAP_t 00044 ! 00045 INTEGER :: NEMIS_NBR 00046 ! ! number of chemical pgd fields chosen by user 00047 CHARACTER(LEN=3) :: CCONVERSION 00048 ! ! Unit conversion code 00049 CHARACTER(LEN=5) :: CSNAP_TIME_REF 00050 ! ! Reference time for Snap temporal profiles 00051 ! ! 'UTC ' : UTC time 00052 ! ! 'SOLAR' : SOLAR time 00053 ! ! 'LEGAL' : LEGAL time 00054 ! ! 00055 00056 CHARACTER(LEN=6), DIMENSION(:), POINTER :: CEMIS_NAME 00057 ! ! name of the chemical fields (emitted species) 00058 CHARACTER(LEN=40), DIMENSION(:), POINTER :: CEMIS_COMMENT 00059 ! ! comment on the chemical fields (emitted species) 00060 ! 00061 REAL, DIMENSION(:,:,:), POINTER:: XEMIS_FIELDS_SNAP ! Emission factor for 00062 ! ! each chemical specie and 00063 ! ! each snap 00064 REAL, DIMENSION(:,:), POINTER:: XEMIS_FIELDS ! Emission for each specie 00065 ! ! (at a given time taking into 00066 ! ! account all snaps) 00067 REAL, DIMENSION(:), POINTER:: XDELTA_LEGAL_TIME ! Difference (in hours)) between 00068 ! ! Legal time and UTC time 00069 INTEGER :: NEMIS_SNAP ! number of snaps 00070 INTEGER :: NSNAP_M ! number of months 00071 INTEGER :: NSNAP_D ! number of days 00072 INTEGER :: NSNAP_H ! number of hours 00073 REAL, DIMENSION(:,:,:), POINTER:: XSNAP_MONTHLY 00074 REAL, DIMENSION(:,:,:), POINTER:: XSNAP_DAILY 00075 REAL, DIMENSION(:,:,:), POINTER:: XSNAP_HOURLY 00076 REAL, DIMENSION(:), POINTER:: XCONVERSION ! conversion factor 00077 ! 00078 TYPE(PRONOSVAR_T), POINTER :: TSPRONOSLIST ! Head pointer on pronostic 00079 ! variables list 00080 LOGICAL :: LEMIS_FIELDS ! Flag to know if emissions have been computed 00081 !------------------------------------------------------------------------------- 00082 ! 00083 END TYPE CH_EMIS_SNAP_t 00084 00085 TYPE(CH_EMIS_SNAP_t), ALLOCATABLE, TARGET, SAVE :: CH_EMIS_SNAP_MODEL(:) 00086 00087 INTEGER, POINTER :: NEMIS_NBR=>NULL() 00088 !$OMP THREADPRIVATE(NEMIS_NBR) 00089 CHARACTER(LEN=3) , POINTER :: CCONVERSION=>NULL() 00090 !$OMP THREADPRIVATE(CCONVERSION) 00091 CHARACTER(LEN=5) , POINTER :: CSNAP_TIME_REF=>NULL() 00092 !$OMP THREADPRIVATE(CSNAP_TIME_REF) 00093 CHARACTER(LEN=40), DIMENSION(:), POINTER :: CEMIS_COMMENT=>NULL() 00094 !$OMP THREADPRIVATE(CEMIS_COMMENT) 00095 CHARACTER(LEN=6), DIMENSION(:), POINTER :: CEMIS_NAME=>NULL() 00096 !$OMP THREADPRIVATE(CEMIS_NAME) 00097 REAL, DIMENSION(:,:), POINTER:: XEMIS_FIELDS=>NULL() 00098 !$OMP THREADPRIVATE(XEMIS_FIELDS) 00099 REAL, DIMENSION(:), POINTER:: XDELTA_LEGAL_TIME=>NULL() 00100 !$OMP THREADPRIVATE(XDELTA_LEGAL_TIME) 00101 REAL, DIMENSION(:,:,:), POINTER:: XEMIS_FIELDS_SNAP=>NULL() 00102 !$OMP THREADPRIVATE(XEMIS_FIELDS_SNAP) 00103 REAL, DIMENSION(:,:,:), POINTER:: XSNAP_DAILY=>NULL() 00104 !$OMP THREADPRIVATE(XSNAP_DAILY) 00105 REAL, DIMENSION(:,:,:), POINTER:: XSNAP_HOURLY=>NULL() 00106 !$OMP THREADPRIVATE(XSNAP_HOURLY) 00107 REAL, DIMENSION(:,:,:), POINTER:: XSNAP_MONTHLY=>NULL() 00108 !$OMP THREADPRIVATE(XSNAP_MONTHLY) 00109 REAL, DIMENSION(:), POINTER:: XCONVERSION=>NULL() 00110 !$OMP THREADPRIVATE(XCONVERSION) 00111 INTEGER, POINTER :: NEMIS_SNAP=>NULL() 00112 !$OMP THREADPRIVATE(NEMIS_SNAP) 00113 INTEGER, POINTER :: NSNAP_M=>NULL() 00114 !$OMP THREADPRIVATE(NSNAP_M) 00115 INTEGER, POINTER :: NSNAP_D=>NULL() 00116 !$OMP THREADPRIVATE(NSNAP_D) 00117 INTEGER, POINTER :: NSNAP_H=>NULL() 00118 !$OMP THREADPRIVATE(NSNAP_H) 00119 TYPE(PRONOSVAR_T), POINTER :: TSPRONOSLIST=>NULL() 00120 !$OMP THREADPRIVATE(TSPRONOSLIST) 00121 LOGICAL, POINTER :: LEMIS_FIELDS 00122 !$OMP THREADPRIVATE(LEMIS_FIELDS) 00123 00124 00125 CONTAINS 00126 00127 SUBROUTINE CH_EMIS_SNAP_GOTO_MODEL(KFROM, KTO, LKFROM) 00128 LOGICAL, INTENT(IN) :: LKFROM 00129 INTEGER, INTENT(IN) :: KFROM, KTO 00130 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00131 ! 00132 ! Save current state for allocated arrays 00133 IF (LKFROM) THEN 00134 CH_EMIS_SNAP_MODEL(KFROM)%CEMIS_COMMENT=>CEMIS_COMMENT 00135 CH_EMIS_SNAP_MODEL(KFROM)%CEMIS_NAME=>CEMIS_NAME 00136 CH_EMIS_SNAP_MODEL(KFROM)%XDELTA_LEGAL_TIME=>XDELTA_LEGAL_TIME 00137 CH_EMIS_SNAP_MODEL(KFROM)%XEMIS_FIELDS=>XEMIS_FIELDS 00138 CH_EMIS_SNAP_MODEL(KFROM)%XEMIS_FIELDS_SNAP=>XEMIS_FIELDS_SNAP 00139 CH_EMIS_SNAP_MODEL(KFROM)%XSNAP_DAILY=>XSNAP_DAILY 00140 CH_EMIS_SNAP_MODEL(KFROM)%XSNAP_HOURLY=>XSNAP_HOURLY 00141 CH_EMIS_SNAP_MODEL(KFROM)%XSNAP_MONTHLY=>XSNAP_MONTHLY 00142 CH_EMIS_SNAP_MODEL(KFROM)%XCONVERSION=>XCONVERSION 00143 CH_EMIS_SNAP_MODEL(KFROM)%TSPRONOSLIST=>TSPRONOSLIST 00144 00145 ENDIF 00146 ! 00147 ! Current model is set to model KTO 00148 IF (LHOOK) CALL DR_HOOK('MODD_CH_SNAP_n:CH_EMIS_SNAP_GOTO_MODEL',0,ZHOOK_HANDLE) 00149 00150 NEMIS_NBR=>CH_EMIS_SNAP_MODEL(KTO)%NEMIS_NBR 00151 CCONVERSION=>CH_EMIS_SNAP_MODEL(KTO)%CCONVERSION 00152 CSNAP_TIME_REF=>CH_EMIS_SNAP_MODEL(KTO)%CSNAP_TIME_REF 00153 CEMIS_COMMENT=>CH_EMIS_SNAP_MODEL(KTO)%CEMIS_COMMENT 00154 CEMIS_NAME=>CH_EMIS_SNAP_MODEL(KTO)%CEMIS_NAME 00155 XDELTA_LEGAL_TIME=>CH_EMIS_SNAP_MODEL(KTO)%XDELTA_LEGAL_TIME 00156 XEMIS_FIELDS=>CH_EMIS_SNAP_MODEL(KTO)%XEMIS_FIELDS 00157 XEMIS_FIELDS_SNAP=>CH_EMIS_SNAP_MODEL(KTO)%XEMIS_FIELDS_SNAP 00158 XSNAP_DAILY=>CH_EMIS_SNAP_MODEL(KTO)%XSNAP_DAILY 00159 XSNAP_HOURLY=>CH_EMIS_SNAP_MODEL(KTO)%XSNAP_HOURLY 00160 XSNAP_MONTHLY=>CH_EMIS_SNAP_MODEL(KTO)%XSNAP_MONTHLY 00161 XCONVERSION=>CH_EMIS_SNAP_MODEL(KTO)%XCONVERSION 00162 TSPRONOSLIST=>CH_EMIS_SNAP_MODEL(KTO)%TSPRONOSLIST 00163 NEMIS_SNAP=>CH_EMIS_SNAP_MODEL(KTO)%NEMIS_SNAP 00164 NSNAP_M=>CH_EMIS_SNAP_MODEL(KTO)%NSNAP_M 00165 NSNAP_D=>CH_EMIS_SNAP_MODEL(KTO)%NSNAP_D 00166 NSNAP_H=>CH_EMIS_SNAP_MODEL(KTO)%NSNAP_H 00167 LEMIS_FIELDS=>CH_EMIS_SNAP_MODEL(KTO)%LEMIS_FIELDS 00168 00169 IF (LHOOK) CALL DR_HOOK('MODD_CH_SNAP_n:CH_EMIS_SNAP_GOTO_MODEL',1,ZHOOK_HANDLE) 00170 00171 END SUBROUTINE CH_EMIS_SNAP_GOTO_MODEL 00172 00173 SUBROUTINE CH_EMIS_SNAP_ALLOC(KMODEL) 00174 INTEGER, INTENT(IN) :: KMODEL 00175 INTEGER :: J 00176 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00177 IF (LHOOK) CALL DR_HOOK("MODD_CH_SNAP_n:CH_EMIS_FIELD_ALLOC",0,ZHOOK_HANDLE) 00178 ALLOCATE(CH_EMIS_SNAP_MODEL(KMODEL)) 00179 DO J=1,KMODEL 00180 NULLIFY(CH_EMIS_SNAP_MODEL(J)%CEMIS_COMMENT) 00181 NULLIFY(CH_EMIS_SNAP_MODEL(J)%CEMIS_NAME) 00182 NULLIFY(CH_EMIS_SNAP_MODEL(J)%XDELTA_LEGAL_TIME) 00183 NULLIFY(CH_EMIS_SNAP_MODEL(J)%XEMIS_FIELDS) 00184 NULLIFY(CH_EMIS_SNAP_MODEL(J)%XEMIS_FIELDS_SNAP) 00185 NULLIFY(CH_EMIS_SNAP_MODEL(J)%XSNAP_DAILY) 00186 NULLIFY(CH_EMIS_SNAP_MODEL(J)%XSNAP_HOURLY) 00187 NULLIFY(CH_EMIS_SNAP_MODEL(J)%XSNAP_MONTHLY) 00188 NULLIFY(CH_EMIS_SNAP_MODEL(J)%XCONVERSION) 00189 ENDDO 00190 CH_EMIS_SNAP_MODEL(:)%CCONVERSION=' ' 00191 CH_EMIS_SNAP_MODEL(:)%CSNAP_TIME_REF=' ' 00192 CH_EMIS_SNAP_MODEL(:)%NEMIS_NBR=0 00193 CH_EMIS_SNAP_MODEL(:)%NEMIS_SNAP=0 00194 CH_EMIS_SNAP_MODEL(:)%NSNAP_M=0 00195 CH_EMIS_SNAP_MODEL(:)%NSNAP_D=0 00196 CH_EMIS_SNAP_MODEL(:)%NSNAP_H=0 00197 CH_EMIS_SNAP_MODEL(:)%LEMIS_FIELDS=.FALSE. 00198 IF (LHOOK) CALL DR_HOOK("MODD_CH_SNAP_n:CH_EMIS_FIELD_ALLOC",1,ZHOOK_HANDLE) 00199 END SUBROUTINE CH_EMIS_SNAP_ALLOC 00200 00201 SUBROUTINE CH_EMIS_SNAP_DEALLO 00202 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00203 IF (LHOOK) CALL DR_HOOK("MODD_CH_SNAP_n:CH_EMIS_FIELD_DEALLO",0,ZHOOK_HANDLE) 00204 IF (ALLOCATED(CH_EMIS_SNAP_MODEL)) DEALLOCATE(CH_EMIS_SNAP_MODEL) 00205 IF (LHOOK) CALL DR_HOOK("MODD_CH_SNAP_n:CH_EMIS_FIELD_DEALLO",1,ZHOOK_HANDLE) 00206 END SUBROUTINE CH_EMIS_SNAP_DEALLO 00207 00208 END MODULE MODD_CH_SNAP_n 00209