SURFEX v7.3
General documentation of Surfex
|
00001 ! ################################################################ 00002 SUBROUTINE READ_NAM_GRID_CARTESIAN(HPROGRAM,KGRID_PAR,KL,PGRID_PAR) 00003 ! ################################################################ 00004 ! 00005 !!**** *READ_NAM_GRID_CARTESIAN* - routine to read in namelist the horizontal grid 00006 !! 00007 !! PURPOSE 00008 !! ------- 00009 !! 00010 !!** METHOD 00011 !! ------ 00012 !! 00013 !! EXTERNAL 00014 !! -------- 00015 !! 00016 !! 00017 !! IMPLICIT ARGUMENTS 00018 !! ------------------ 00019 !! 00020 !! REFERENCE 00021 !! --------- 00022 !! 00023 !! 00024 !! AUTHOR 00025 !! ------ 00026 !! V. Masson *Meteo France* 00027 !! 00028 !! MODIFICATIONS 00029 !! ------------- 00030 !! Original 01/2004 00031 !------------------------------------------------------------------------------- 00032 ! 00033 !* 0. DECLARATIONS 00034 ! ------------ 00035 ! 00036 USE MODE_POS_SURF 00037 ! 00038 USE MODI_OPEN_NAMELIST 00039 USE MODI_CLOSE_NAMELIST 00040 USE MODI_GET_LUOUT 00041 ! 00042 USE MODE_GRIDTYPE_CARTESIAN 00043 ! 00044 ! 00045 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00046 USE PARKIND1 ,ONLY : JPRB 00047 ! 00048 IMPLICIT NONE 00049 ! 00050 !* 0.1 Declarations of arguments 00051 ! ------------------------- 00052 ! 00053 CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! calling program 00054 INTEGER, INTENT(INOUT) :: KGRID_PAR ! size of PGRID_PAR 00055 INTEGER, INTENT(OUT) :: KL ! number of points 00056 REAL, DIMENSION(KGRID_PAR), INTENT(OUT) :: PGRID_PAR ! parameters defining this grid 00057 ! 00058 !* 0.2 Declarations of local variables 00059 ! ------------------------------- 00060 ! 00061 INTEGER :: ILUOUT ! output listing logical unit 00062 INTEGER :: ILUNAM ! namelist file logical unit 00063 INTEGER :: JI, JJ ! loop counters 00064 INTEGER :: JL ! loop counter 00065 00066 REAL, DIMENSION(:), ALLOCATABLE :: ZX ! X conformal coordinate of grid mesh 00067 REAL, DIMENSION(:), ALLOCATABLE :: ZY ! Y conformal coordinate of grid mesh 00068 REAL, DIMENSION(:), ALLOCATABLE :: ZDX ! X grid mesh size 00069 REAL, DIMENSION(:), ALLOCATABLE :: ZDY ! Y grid mesh size 00070 ! 00071 !* 0.3 Declarations of namelist 00072 ! ------------------------ 00073 ! 00074 REAL :: XLAT0 ! reference latitude 00075 REAL :: XLON0 ! reference longitude 00076 INTEGER :: NIMAX ! number of points in I direction 00077 INTEGER :: NJMAX ! number of points in J direction 00078 REAL :: XDX ! increment in X direction (in meters) 00079 REAL :: XDY ! increment in Y direction (in meters) 00080 ! 00081 REAL, DIMENSION(:), POINTER :: ZGRID_PAR 00082 ! 00083 LOGICAL :: GFOUND 00084 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00085 ! 00086 NAMELIST/NAM_CARTESIAN/XLAT0, XLON0, NIMAX, NJMAX, XDX, XDY 00087 ! 00088 !------------------------------------------------------------------------------ 00089 ! 00090 !* 1. opening of namelist 00091 ! 00092 IF (LHOOK) CALL DR_HOOK('READ_NAM_GRID_CARTESIAN',0,ZHOOK_HANDLE) 00093 CALL GET_LUOUT(HPROGRAM,ILUOUT) 00094 ! 00095 CALL OPEN_NAMELIST(HPROGRAM,ILUNAM) 00096 ! 00097 !--------------------------------------------------------------------------- 00098 ! 00099 !* 2. Reading of projection parameters 00100 ! -------------------------------- 00101 ! 00102 CALL POSNAM(ILUNAM,'NAM_CARTESIAN',GFOUND,ILUOUT) 00103 IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_CARTESIAN) 00104 ! 00105 !--------------------------------------------------------------------------- 00106 CALL CLOSE_NAMELIST(HPROGRAM,ILUNAM) 00107 !--------------------------------------------------------------------------- 00108 ! 00109 !* 3. Number of points 00110 ! ---------------- 00111 ! 00112 KL = NIMAX * NJMAX 00113 ! 00114 !--------------------------------------------------------------------------- 00115 ! 00116 !* 3. Array of X and Y coordinates 00117 ! ---------------------------- 00118 ! 00119 ! 00120 ALLOCATE(ZX(KL)) 00121 ALLOCATE(ZY(KL)) 00122 DO JJ=1,NJMAX 00123 DO JI=1,NIMAX 00124 JL = JI + (JJ-1) * NIMAX 00125 ZX(JL) = FLOAT(JI) * XDX 00126 ZY(JL) = FLOAT(JJ) * XDY 00127 END DO 00128 END DO 00129 ! 00130 !--------------------------------------------------------------------------- 00131 ! 00132 !* 4. Array of X and Y increments 00133 ! --------------------------- 00134 ! 00135 ALLOCATE(ZDX(KL)) 00136 ALLOCATE(ZDY(KL)) 00137 ZDX(:) = XDX 00138 ZDY(:) = XDY 00139 ! 00140 !--------------------------------------------------------------------------- 00141 ! 00142 !* 8. All this information stored into pointer PGRID_PAR 00143 ! -------------------------------------------------- 00144 ! 00145 CALL PUT_GRIDTYPE_CARTESIAN(ZGRID_PAR,XLAT0,XLON0, & 00146 NIMAX,NJMAX, & 00147 ZX,ZY,ZDX,ZDY ) 00148 ! 00149 !--------------------------------------------------------------------------- 00150 DEALLOCATE(ZX) 00151 DEALLOCATE(ZY) 00152 DEALLOCATE(ZDX) 00153 DEALLOCATE(ZDY) 00154 !--------------------------------------------------------------------------- 00155 ! 00156 !* 1st call : initializes dimension 00157 ! 00158 IF (KGRID_PAR==0) THEN 00159 KGRID_PAR = SIZE(ZGRID_PAR) 00160 ! 00161 ELSE 00162 ! 00163 !* 2nd call : initializes grid array 00164 ! 00165 PGRID_PAR(:) = 0. 00166 PGRID_PAR(:) = ZGRID_PAR 00167 END IF 00168 ! 00169 DEALLOCATE(ZGRID_PAR) 00170 IF (LHOOK) CALL DR_HOOK('READ_NAM_GRID_CARTESIAN',1,ZHOOK_HANDLE) 00171 ! 00172 !--------------------------------------------------------------------------- 00173 ! 00174 END SUBROUTINE READ_NAM_GRID_CARTESIAN