SURFEX v7.3
General documentation of Surfex
|
00001 ! ######### 00002 SUBROUTINE PGD_GRID(HPROGRAM,HFILE,HFILETYPE,OGRID,HGRID,KGRID_PAR,PGRID_PAR) 00003 ! ########################################################## 00004 !! 00005 !! PURPOSE 00006 !! ------- 00007 !! Reads in namelist the grid type and parameters. 00008 !! 00009 !! METHOD 00010 !! ------ 00011 !! 00012 !! EXTERNAL 00013 !! -------- 00014 !! 00015 !! 00016 !! IMPLICIT ARGUMENTS 00017 !! ------------------ 00018 !! 00019 !! 00020 !! REFERENCE 00021 !! --------- 00022 !! 00023 !! AUTHOR 00024 !! ------ 00025 !! 00026 !! V. Masson Meteo-France 00027 !! 00028 !! MODIFICATION 00029 !! ------------ 00030 !! 00031 !! Original 01/2004 00032 !! E. Martin 10/2007 IGN grid 00033 !---------------------------------------------------------------------------- 00034 ! 00035 !* 0. DECLARATION 00036 ! ----------- 00037 ! 00038 USE MODD_SURFEX_MPI, ONLY : NSIZE, NINDEX 00039 USE MODD_SURFEX_OMP, ONLY : NINDX2, NWORK, XWORK, XWORK2 00040 ! 00041 USE MODD_PGD_GRID, ONLY : NL, XGRID_PAR, NGRID_PAR, XMESHLENGTH 00042 USE MODN_PGD_GRID 00043 USE MODD_SURF_ATM_GRID_n, ONLY : XLAT, XLON, XMESH_SIZE, XJPDIR 00044 USE MODD_SURF_ATM_n, ONLY : NDIM_FULL 00045 USE MODD_CSTS, ONLY : XPI, XRADIUS 00046 ! 00047 USE MODI_DEFAULT_GRID 00048 USE MODI_GRID_FROM_FILE 00049 USE MODI_OPEN_NAMELIST 00050 USE MODI_TEST_NAM_VAR_SURF 00051 USE MODI_CLOSE_NAMELIST 00052 USE MODI_GET_LUOUT 00053 USE MODI_READ_NAM_GRIDTYPE 00054 USE MODI_LATLON_GRID 00055 ! 00056 USE MODE_POS_SURF 00057 ! 00058 ! 00059 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00060 USE PARKIND1 ,ONLY : JPRB 00061 ! 00062 USE MODI_ABOR1_SFX 00063 ! 00064 IMPLICIT NONE 00065 ! 00066 !* 0.1 Declaration of dummy arguments 00067 ! ------------------------------ 00068 ! 00069 CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling the surface 00070 CHARACTER(LEN=28), INTENT(IN) :: HFILE ! atmospheric file name 00071 CHARACTER(LEN=6), INTENT(IN) :: HFILETYPE ! atmospheric file type 00072 LOGICAL, INTENT(IN) :: OGRID ! .true. if grid is imposed by atm. model 00073 CHARACTER(LEN=10), INTENT(OUT) :: HGRID ! grid type 00074 INTEGER, INTENT(OUT) :: KGRID_PAR ! size of PGRID_PAR 00075 REAL, DIMENSION(:), POINTER :: PGRID_PAR ! parameters defining this grid 00076 ! 00077 ! 00078 !* 0.2 Declaration of local variables 00079 ! ------------------------------ 00080 ! 00081 INTEGER :: ILUOUT ! output listing logical unit 00082 INTEGER :: ILUNAM ! namelist file logical unit 00083 LOGICAL :: GFOUND ! Flag true if namelist is present 00084 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00085 ! 00086 !* 0.3 Declaration of namelists 00087 ! ------------------------ 00088 ! 00089 !------------------------------------------------------------------------------ 00090 ! 00091 !* 1. Defaults 00092 ! -------- 00093 ! 00094 IF (LHOOK) CALL DR_HOOK('PGD_GRID',0,ZHOOK_HANDLE) 00095 CALL DEFAULT_GRID(HPROGRAM,CGRID) 00096 ! 00097 YINIFILE = ' ' 00098 YFILETYPE = ' ' 00099 ! 00100 IF (OGRID) THEN 00101 YINIFILE = HFILE 00102 YFILETYPE = HFILETYPE 00103 END IF 00104 ! 00105 CALL GET_LUOUT(HPROGRAM,ILUOUT) 00106 !------------------------------------------------------------------------------ 00107 ! 00108 !* 2. Open namelist 00109 ! ------------- 00110 ! 00111 IF (.NOT. OGRID) THEN 00112 CALL OPEN_NAMELIST(HPROGRAM,ILUNAM) 00113 ! 00114 !------------------------------------------------------------------------------ 00115 ! 00116 !* 3. Read grid type 00117 ! -------------- 00118 ! 00119 CALL POSNAM(ILUNAM,'NAM_PGD_GRID',GFOUND,ILUOUT) 00120 IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_PGD_GRID) 00121 ! 00122 !------------------------------------------------------------------------------ 00123 ! 00124 !* 5. Close namelist 00125 ! -------------- 00126 ! 00127 CALL CLOSE_NAMELIST(HPROGRAM,ILUNAM) 00128 ! 00129 END IF 00130 !------------------------------------------------------------------------------- 00131 ! 00132 !* 4. check of grid and input file types 00133 ! ---------------------------------- 00134 ! 00135 CALL TEST_NAM_VAR_SURF(ILUOUT,'CGRID',CGRID,'CONF PROJ ','NONE ','LONLAT REG','CARTESIAN ','GAUSS ',& 00136 'IGN ','LONLATVAL ') 00137 CALL TEST_NAM_VAR_SURF(ILUOUT,'YFILETYPE',YFILETYPE,' ','MESONH','LFI ','ASCII ') 00138 ! 00139 ! 00140 !------------------------------------------------------------------------------ 00141 ! 00142 !* 5. Initializes grid characteristics 00143 ! -------------------------------- 00144 ! 00145 !* 5.1 From another file 00146 ! ----------------- 00147 ! 00148 IF (LEN_TRIM(YFILETYPE)>0 .AND. LEN_TRIM(YINIFILE)>0 ) THEN 00149 IF (YFILETYPE=='MESONH' .OR. YFILETYPE=='LFI ' .OR. YFILETYPE=='ASCII ') THEN 00150 CALL GRID_FROM_FILE(HPROGRAM,YINIFILE,YFILETYPE,OGRID,CGRID,NGRID_PAR,XGRID_PAR,NL) 00151 ELSE 00152 CALL ABOR1_SFX('PGD_GRID: FILE TYPE NOT SUPPORTED '//HFILETYPE//' FOR FILE '//HFILE) 00153 END IF 00154 ! 00155 ELSE 00156 ! 00157 !* 5.2 Grid not initialized 00158 ! -------------------- 00159 ! 00160 IF (CGRID=='NONE ' .OR. CGRID==' ') THEN 00161 CALL ABOR1_SFX('PGD_GRID: GRID TYPE NOT INITIALIZED, CGRID='//CGRID) 00162 00163 ! 00164 !* 5.3 Grid initialized 00165 ! ---------------- 00166 ! 00167 ELSE 00168 ! 00169 CALL READ_NAM_GRIDTYPE(HPROGRAM,CGRID,NGRID_PAR,XGRID_PAR,NL) 00170 ! 00171 END IF 00172 00173 END IF 00174 ! 00175 HGRID = CGRID 00176 NDIM_FULL = NL 00177 NSIZE = NDIM_FULL 00178 IF (.NOT.ALLOCATED(NINDEX)) THEN 00179 ALLOCATE(NINDEX(NDIM_FULL)) 00180 NINDEX(:) = 0 00181 ENDIF 00182 NINDX2 = NDIM_FULL 00183 ALLOCATE(NWORK(NDIM_FULL)) 00184 ALLOCATE(XWORK(NDIM_FULL)) 00185 ALLOCATE(XWORK2(NDIM_FULL,10)) 00186 ! 00187 KGRID_PAR = NGRID_PAR 00188 ALLOCATE(PGRID_PAR(KGRID_PAR)) 00189 PGRID_PAR = XGRID_PAR 00190 ! 00191 !------------------------------------------------------------------------------ 00192 ! 00193 !* 6. Latitude and longitude 00194 ! ---------------------- 00195 ! 00196 ALLOCATE(XLAT (NL)) 00197 ALLOCATE(XLON (NL)) 00198 ALLOCATE(XMESH_SIZE (NL)) 00199 ALLOCATE(XJPDIR (NL)) 00200 CALL LATLON_GRID(CGRID,NGRID_PAR,NL,ILUOUT,XGRID_PAR,XLAT,XLON,XMESH_SIZE,XJPDIR) 00201 ! 00202 !------------------------------------------------------------------------------ 00203 ! 00204 !* 7. Average grid length (in degrees) 00205 ! -------------------------------- 00206 ! 00207 !* in meters 00208 XMESHLENGTH = SUM ( SQRT(XMESH_SIZE) ) / NL 00209 ! 00210 !* in degrees (of latitude) 00211 XMESHLENGTH = XMESHLENGTH *180. / XPI / XRADIUS 00212 IF (LHOOK) CALL DR_HOOK('PGD_GRID',1,ZHOOK_HANDLE) 00213 ! 00214 !------------------------------------------------------------------------------- 00215 ! 00216 END SUBROUTINE PGD_GRID