SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/gauss_index.F90
Go to the documentation of this file.
00001 !     #########
00002       SUBROUTINE GAUSS_INDEX(HPROGRAM,HFILE,HFLAG,OINDEX_STORE,HINDEX_1KM,&
00003                                HINDEX_10KM,HINDEX_100KM,HRES_COMP)  
00004 !     #####################################################################
00005 !!
00006 !!    PURPOSE
00007 !!    -------
00008 !!     
00009 !!    Read or calculate and store gauss indexes
00010 !!
00011 !!    METHOD
00012 !!    ------
00013 !!   
00014 !!    EXTERNAL
00015 !!    --------
00016 !!
00017 !!
00018 !!    IMPLICIT ARGUMENTS
00019 !!    ------------------
00020 !!
00021 !!
00022 !!    REFERENCE
00023 !!    ---------
00024 !!
00025 !!    AUTHOR
00026 !!    ------
00027 !!
00028 !!    B. Decharme                   Meteo-France
00029 !!
00030 !!    MODIFICATION
00031 !!    ------------
00032 !!
00033 !!    Original     02/2010
00034 !----------------------------------------------------------------------------
00035 !
00036 !*    0.     DECLARATION
00037 !            -----------
00038 !
00039 USE MODD_PGD_GRID,   ONLY : XMESHLENGTH
00040 USE MODD_PGDWORK,    ONLY : NSSO
00041 !
00042 USE MODI_GET_LUOUT
00043 USE MODI_INI_SSOWORK
00044 !
00045 USE MODE_GAUSS_INDEX
00046 !
00047 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00048 USE PARKIND1  ,ONLY : JPRB
00049 !
00050 IMPLICIT NONE
00051 !
00052 !*    0.1    Declaration of dummy arguments
00053 !            ------------------------------
00054 !
00055  CHARACTER(LEN=6),  INTENT(IN)  :: HPROGRAM
00056  CHARACTER(LEN=28), INTENT(IN)  :: HFILE
00057  CHARACTER(LEN=6),  INTENT(IN)  :: HFLAG
00058 LOGICAL,           INTENT(IN)  :: OINDEX_STORE      ! Store index in a binary file
00059  CHARACTER(LEN=28), INTENT(IN)  :: HINDEX_1KM
00060  CHARACTER(LEN=28), INTENT(IN)  :: HINDEX_10KM
00061  CHARACTER(LEN=28), INTENT(IN)  :: HINDEX_100KM
00062  CHARACTER(LEN=5), INTENT(INOUT):: HRES_COMP
00063 !
00064 !
00065 !*    0.2    Declaration of local variables
00066 !            ------------------------------
00067 !
00068  CHARACTER(LEN=5)            :: YRES         ! Resolution in file 
00069 REAL, DIMENSION(:), POINTER :: ZLAT         ! latitude of data points
00070 REAL, DIMENSION(:), POINTER :: ZLON         ! longitude of data points
00071 REAL                        :: ZDLAT        ! latitude mesh in the data file
00072 REAL                        :: ZDLON        ! longitude mesh in the data file
00073 INTEGER                     :: INDIM        ! number of grid point in file
00074 INTEGER                     :: INLON        ! number of longitude rows in file
00075 INTEGER                     :: INLAT        ! number of latitude  rows in file
00076 INTEGER                     :: ILUOUT       ! output listing logical unit
00077  CHARACTER(LEN=28)           :: YINDEX       ! file name for gauss index           
00078 !
00079 INTEGER, DIMENSION(:), ALLOCATABLE :: IINDEX ! mesh index of all input points
00080                                              ! 0 indicates the point is out of the domain
00081 INTEGER, DIMENSION(:), ALLOCATABLE :: ISSOX  ! X submesh index in their mesh of all input points
00082 INTEGER, DIMENSION(:), ALLOCATABLE :: ISSOY  ! Y submesh index in their mesh of all input points
00083 !
00084 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00085 !
00086 !---------------------------------------------------------------
00087 !*    1.      Initializations
00088 !-------------------------------------------------------------------------------
00089 !
00090 IF (LHOOK) CALL DR_HOOK('GAUSS_INDEX',0,ZHOOK_HANDLE)
00091  CALL GET_LUOUT(HPROGRAM,ILUOUT)
00092 !
00093 !-------------------------------------------------------------------------------
00094 !*    2.      Read configuration
00095 !-------------------------------------------------------------------------------
00096 !
00097 !
00098  CALL READ_GAUSS_CONF(HPROGRAM,HFILE,HINDEX_1KM,HINDEX_10KM,HINDEX_100KM,  &
00099                        YINDEX,YRES,INDIM,INLON,INLAT,ZDLON,ZDLAT,ZLON,ZLAT)  
00100 !
00101 IF(HRES_COMP==YRES .AND. LHOOK) CALL DR_HOOK('GAUSS_INDEX',1,ZHOOK_HANDLE)
00102 IF(HRES_COMP==YRES)RETURN
00103 !
00104 !-------------------------------------------------------------------------------
00105 !*    3.      Read or calculate and store gauss indexes
00106 !-------------------------------------------------------------------------------
00107 !
00108 HRES_COMP=YRES
00109 !    
00110 ALLOCATE(IINDEX(INDIM))
00111 !
00112 IF(HFLAG=='A_OROG')THEN
00113 ! Adapt subgrid mesh to input file resolution
00114   CALL INI_SSOWORK(XMESHLENGTH,ZDLAT,ZDLON)
00115   ALLOCATE(ISSOX (INDIM))
00116   ALLOCATE(ISSOY (INDIM))
00117 ENDIF
00118 !
00119 IF(LEN_TRIM(YINDEX)/=0)THEN
00120 !
00121 ! Read input index file
00122 !
00123   IF(HFLAG=='A_OROG')THEN
00124     CALL READ_INDEX_GAUSS(HPROGRAM,YINDEX,INLON,INLAT,IINDEX,KSSOX=ISSOX,KSSOY=ISSOY)
00125   ELSE
00126     CALL READ_INDEX_GAUSS(HPROGRAM,YINDEX,INLON,INLAT,IINDEX)
00127   ENDIF
00128 !
00129   WRITE(ILUOUT,*) ' '
00130   WRITE(ILUOUT,*) '***********************************************************'
00131   WRITE(ILUOUT,*) '* Read input gauss index file at '//YRES//'               *'
00132   WRITE(ILUOUT,*) '***********************************************************'
00133   WRITE(ILUOUT,*) ' '
00134 !
00135 ELSE
00136 !    
00137 ! Calulate index
00138 !
00139   IF(HFLAG=='A_OROG')THEN
00140     CALL GET_INDEX_GAUSS(ILUOUT,ZLON,ZLAT,IINDEX,KSSO=NSSO,KSSOX=ISSOX,KSSOY=ISSOY)    
00141   ELSE
00142     CALL GET_INDEX_GAUSS(ILUOUT,ZLON,ZLAT,IINDEX)    
00143   ENDIF
00144 !
00145   DEALLOCATE(ZLON)
00146   DEALLOCATE(ZLAT)
00147 !
00148   WRITE(ILUOUT,*) ' '
00149   WRITE(ILUOUT,*) '***********************************************************'
00150   WRITE(ILUOUT,*) '* Calulate gauss index file at '//YRES//'                 *'
00151   WRITE(ILUOUT,*) '***********************************************************'
00152   WRITE(ILUOUT,*) ' '
00153 !
00154 ! Store index
00155 !
00156   IF(OINDEX_STORE)THEN
00157 !
00158     IF(HFLAG=='A_OROG')THEN
00159       CALL STORE_INDEX_GAUSS(HPROGRAM,YRES,INLON,INLAT,IINDEX,KSSOX=ISSOX,KSSOY=ISSOY)
00160     ELSE
00161       CALL STORE_INDEX_GAUSS(HPROGRAM,YRES,INLON,INLAT,IINDEX)
00162     ENDIF
00163 !
00164     WRITE(ILUOUT,*) ' '
00165     WRITE(ILUOUT,*) '***********************************************************'
00166     WRITE(ILUOUT,*) '* Store gauss index file at '//YRES//'                 *'
00167     WRITE(ILUOUT,*) '***********************************************************'
00168     WRITE(ILUOUT,*) ' '
00169 !
00170   ENDIF
00171 !
00172 ENDIF
00173 IF (LHOOK) CALL DR_HOOK('GAUSS_INDEX',1,ZHOOK_HANDLE)
00174 !  
00175 !-------------------------------------------------------------------------------
00176 !
00177 END SUBROUTINE GAUSS_INDEX