SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/writesurf_ch_emisn.F90
Go to the documentation of this file.
00001 !     #########
00002       SUBROUTINE WRITESURF_CH_EMIS_n(HPROGRAM)
00003 !     ##########################################################
00004 !
00005 !!****  *WRITESURF_CH_EMIS_n* - routine to write chemistry emission fields
00006 !!
00007 !!    PURPOSE
00008 !!    -------
00009 !!
00010 !!    AUTHOR
00011 !!    ------
00012 !!      V. Masson   *Meteo France*      
00013 !!
00014 !!    MODIFICATIONS
00015 !!    -------------
00016 !!      Original    03/2004
00017 !-------------------------------------------------------------------------------
00018 !
00019 !*       0.    DECLARATIONS
00020 !              ------------
00021 !
00022 USE MODD_CH_EMIS_FIELD_n,ONLY : JPEMISMAX, NEMIS_NBR, CEMIS_AREA, CEMIS_NAME, &
00023                                   CEMIS_COMMENT, NEMIS_TIME, XEMIS_FIELDS  
00024 USE MODI_WRITE_SURF
00025 !
00026 !
00027 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00028 USE PARKIND1  ,ONLY : JPRB
00029 !
00030 USE MODI_ABOR1_SFX
00031 !
00032 IMPLICIT NONE
00033 !
00034 !*       0.1   Declarations of arguments
00035 !              -------------------------
00036 !
00037  CHARACTER(LEN=6),  INTENT(IN)  :: HPROGRAM ! program calling
00038 !
00039 !*       0.2   Declarations of local variables
00040 !              -------------------------------
00041 !
00042 INTEGER           :: IRESP          ! IRESP  : return-code if a problem appears 
00043                                     ! at the open of the file in LFI  routines 
00044 !
00045  CHARACTER(LEN=12) :: YRECFM         ! Name of the article to be written
00046  CHARACTER(LEN=100):: YCOMMENT       ! Comment string
00047  CHARACTER(LEN=80) :: YNAME          ! emitted species name
00048 !
00049 INTEGER           :: JI,JT          ! loop indices
00050 INTEGER           :: JSPEC          ! loop index
00051 LOGICAL           :: GFOUND,LOK
00052  CHARACTER(LEN=40),DIMENSION(NEMIS_NBR) :: YEMISPEC_NAMES
00053 INTEGER,          DIMENSION(NEMIS_NBR) :: INBTIMES
00054 INTEGER,          DIMENSION(NEMIS_NBR) :: IFIRST,ILAST,INEXT
00055 INTEGER :: INTIMESMAX,ITMP
00056 INTEGER :: IEMISPEC_NBR
00057 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00058 
00059 !-------------------------------------------------------------------------------
00060 !
00061 !*       1.     Chemical Emission fields :
00062 !               --------------------------
00063 !
00064 IF (LHOOK) CALL DR_HOOK('WRITESURF_CH_EMIS_N',0,ZHOOK_HANDLE)
00065 YRECFM='EMISFILE_NBR'
00066 YCOMMENT='Total number of 2D emission files.'
00067  CALL WRITE_SURF(HPROGRAM,YRECFM,NEMIS_NBR,IRESP,HCOMMENT=YCOMMENT)
00068 !
00069 ! count emitted species 
00070 IEMISPEC_NBR = 0
00071 DO JI=1,NEMIS_NBR
00072   YNAME = TRIM(ADJUSTL(CEMIS_NAME(JI)))
00073   GFOUND = .FALSE.
00074   DO JSPEC = 1,IEMISPEC_NBR
00075     IF (YEMISPEC_NAMES(JSPEC) == YNAME) THEN
00076       GFOUND = .TRUE.
00077       EXIT
00078     END IF
00079   END DO
00080   IF (.NOT. GFOUND) THEN
00081     IEMISPEC_NBR = IEMISPEC_NBR+1
00082     YEMISPEC_NAMES(IEMISPEC_NBR) = YNAME
00083     INBTIMES(IEMISPEC_NBR) = 1
00084     IFIRST(IEMISPEC_NBR) = JI
00085     ILAST(IEMISPEC_NBR)  = JI
00086     INEXT(JI) = 0
00087   ELSE
00088     INEXT(ILAST(JSPEC)) = JI
00089     INEXT(JI)        = 0
00090     ILAST(JSPEC)        = JI
00091     INBTIMES(JSPEC) = INBTIMES(JSPEC)+1
00092   END IF
00093 END DO
00094 !
00095 YRECFM='EMISPEC_NBR '
00096 YCOMMENT='Number of emitted chemical species.'
00097  CALL WRITE_SURF(HPROGRAM,YRECFM,IEMISPEC_NBR,IRESP,HCOMMENT=YCOMMENT)
00098 !
00099 IF (IEMISPEC_NBR > 0) THEN
00100   !
00101   DO JSPEC = 1,IEMISPEC_NBR
00102     CALL WRITE_EMIS_SPEC(INBTIMES(JSPEC))
00103   ENDDO
00104   !
00105 ENDIF
00106 !
00107 IF (LHOOK) CALL DR_HOOK('WRITESURF_CH_EMIS_N',1,ZHOOK_HANDLE)
00108 !
00109 !-------------------------------------------------------------------------------
00110 CONTAINS
00111 !
00112 SUBROUTINE WRITE_EMIS_SPEC(KSIZE)
00113 !
00114 INTEGER, INTENT(IN) :: KSIZE
00115 INTEGER,DIMENSION(KSIZE) :: ITIME
00116 INTEGER,DIMENSION(KSIZE) :: IINDEX
00117 REAL,DIMENSION(SIZE(XEMIS_FIELDS,1),KSIZE) :: ZWORK2D
00118 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00119 !
00120 IF (LHOOK) CALL DR_HOOK('WRITESURF_CH_EMIS_N:WRITE_EMIS_SPEC',0,ZHOOK_HANDLE)
00121 !
00122 JI = IFIRST(JSPEC)
00123 JT = 0
00124 ! fill the emission times array (ITIME)
00125 ! and the corresponding indices array (IINDEX)
00126 ! for species number JSPEC
00127 DO WHILE(JI /= 0)
00128   JT = JT+1
00129   ITIME(JT)  = NEMIS_TIME(JI)
00130   IINDEX(JT) = JI
00131   JI = INEXT(JI)
00132 END DO
00133 IF (JT /= KSIZE) THEN
00134   CALL ABOR1_SFX('WRITESURF_CH_EMISN: ABNORMAL ERROR')
00135 END IF
00136 ! sort indices according to ITIME values
00137 LOK = .TRUE.
00138 DO WHILE (LOK)
00139   LOK = .FALSE.
00140   DO JI=2,KSIZE
00141     IF (ITIME(JI-1) > ITIME(JI)) THEN
00142       LOK = .TRUE.
00143       ITMP = ITIME(JI-1)
00144       ITIME(JI-1) = ITIME(JI)
00145       ITIME(JI)   = ITMP
00146       ITMP = IINDEX(JI-1)
00147       IINDEX(JI-1) = IINDEX(JI)
00148       IINDEX(JI)   = ITMP
00149     END IF
00150   END DO
00151 END DO
00152 ! Now fill the ZWORK2D array for writing
00153 ZWORK2D(:,:) = XEMIS_FIELDS(:,IINDEX(:))
00154 ! 
00155 ! Write NAME of species JSPEC with AREA and number of emission times 
00156 ! stored in the commentary
00157 WRITE(YRECFM,'("EMISNAME",I3.3)') JSPEC
00158 WRITE(YCOMMENT,'(A3,", emission times number:",I5)') CEMIS_AREA(IINDEX(1)),KSIZE
00159  CALL WRITE_SURF(HPROGRAM,YRECFM,YEMISPEC_NAMES(JSPEC),IRESP,HCOMMENT=YCOMMENT)
00160 ! 
00161 ! Write emission times (ITIME) for species JSPEC
00162 WRITE(YRECFM,'("EMISTIMES",I3.3)') JSPEC  
00163 YCOMMENT = "Emission times in second"
00164  CALL WRITE_SURF(HPROGRAM,YRECFM,ITIME(:),IRESP,HCOMMENT=YCOMMENT,HDIR='-')
00165 !
00166 ! Finally write emission data for species JSPEC
00167 YRECFM = "EMIS_"//TRIM(YEMISPEC_NAMES(JSPEC))
00168 YCOMMENT = "Emission data (x,y,t),"//TRIM(CEMIS_COMMENT(IINDEX(1)))
00169  CALL WRITE_SURF(HPROGRAM,YRECFM,ZWORK2D(:,:),IRESP,HCOMMENT=YCOMMENT)
00170 !
00171 IF (LHOOK) CALL DR_HOOK('WRITESURF_CH_EMIS_N:WRITE_EMIS_SPEC',1,ZHOOK_HANDLE)
00172 !
00173 END SUBROUTINE WRITE_EMIS_SPEC
00174 !
00175 END SUBROUTINE WRITESURF_CH_EMIS_n