SURFEX v7.3
General documentation of Surfex
|
00001 ! ######### 00002 SUBROUTINE PREP_ISBA_NETCDF(HPROGRAM,HSURF,HFILE,KLUOUT,PFIELD) 00003 ! ################################################################################# 00004 ! 00005 !!**** *PREP_ISBA_NETCDF* - prepares ISBA fields from initialization files in NETCDF 00006 !! 00007 !! PURPOSE 00008 !! ------- 00009 ! 00010 !!** METHOD 00011 !! ------ 00012 !! 00013 !! REFERENCE 00014 !! --------- 00015 !! 00016 !! 00017 !! AUTHOR 00018 !! ------ 00019 !! M. Lafaysse 00020 !! 00021 !! MODIFICATIONS 00022 !! ------------- 00023 !! Original 04/2012 00024 !!------------------------------------------------------------------ 00025 ! 00026 00027 USE MODD_PREP, ONLY : CINTERP_TYPE 00028 USE MODD_DATA_COVER_PAR, ONLY : NVEGTYPE 00029 00030 USE MODI_ABOR1_SFX 00031 00032 USE MODE_READ_CDF 00033 ! 00034 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00035 USE PARKIND1 ,ONLY : JPRB 00036 ! 00037 IMPLICIT NONE 00038 00039 INCLUDE 'netcdf.inc' 00040 ! 00041 !* 0.1 declarations of arguments 00042 ! 00043 CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes 00044 CHARACTER(LEN=7), INTENT(IN) :: HSURF ! type of field 00045 CHARACTER(LEN=28), INTENT(IN) :: HFILE ! name of file 00046 INTEGER, INTENT(IN) :: KLUOUT ! logical unit of output listing 00047 REAL,DIMENSION(:,:,:), POINTER :: PFIELD ! field to interpolate horizontally 00048 ! 00049 !* 0.2 declarations of local variables 00050 ! 00051 REAL, DIMENSION(:), POINTER :: ZFIELD ! field read 00052 00053 REAL,DIMENSION(:,:),ALLOCATABLE:: ZFIELD_2D 00054 00055 ! CHARACTER(LEN=28) :: YNCVAR 00056 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00057 ! 00058 INTEGER::IERROR !error status 00059 INTEGER::JJ,JK,JLOOP ! loop counters 00060 INTEGER::INLAYERS ! vertical dimension length 00061 INTEGER::IL ! nature dimension length 00062 INTEGER::ID_FILE,ID_VAR ! Netcdf IDs for file and variable 00063 INTEGER::INVARDIMS !number of dimensions of netcdf input variable 00064 INTEGER,DIMENSION(:),ALLOCATABLE::IVARDIMSID 00065 INTEGER::ILENDIM,ILENDIM1,ILENDIM2 00066 00067 SELECT CASE (TRIM(HSURF)) 00068 CASE ('TG','WG','WGI') 00069 INLAYERS=3 ! 3 soil layers for initialization 00070 CASE DEFAULT 00071 CALL ABOR1_SFX('PREP_ISBA_NETCDF: '//TRIM(HSURF)//" initialization not implemented !") 00072 END SELECT 00073 ! 00074 INLAYERS=3 00075 ! 00076 !------------------------------------------------------------------------------------ 00077 ! --------- 00078 IF (LHOOK) CALL DR_HOOK('PREP_ISBA_NETCDF',0,ZHOOK_HANDLE) 00079 00080 !* 1. get nature dimension 00081 ! 00082 CALL GET_TYPE_DIM_n('NATURE',IL) 00083 ! 00084 !* 2. Reading of field 00085 ! ---------------- 00086 00087 ! Open netcdf file 00088 IERROR=NF_OPEN(HFILE,NF_NOWRITE,ID_FILE) 00089 CALL HANDLE_ERR_CDF(IERROR,"can't open file "//TRIM(HFILE)) 00090 00091 ! Look for variable ID 00092 IERROR=NF_INQ_VARID(ID_FILE,TRIM(HSURF),ID_VAR) 00093 CALL HANDLE_ERR_CDF(IERROR,"can't find variable "//TRIM(HSURF)) 00094 00095 ! Number of dimensions 00096 IERROR=NF_INQ_VARNDIMS(ID_FILE,ID_VAR,INVARDIMS) 00097 if (IERROR/=NF_NOERR) CALL HANDLE_ERR_CDF(IERROR,"can't get variable dimensions number") 00098 00099 ! Id of dimensions 00100 ALLOCATE(IVARDIMSID(INVARDIMS)) 00101 IERROR=NF_INQ_VARDIMID(ID_FILE,ID_VAR,IVARDIMSID) 00102 if (IERROR/=NF_NOERR) CALL HANDLE_ERR_CDF(IERROR,"can't get variable dimensions ids") 00103 00104 ALLOCATE(ZFIELD(IL)) 00105 00106 SELECT CASE (INVARDIMS) 00107 CASE (1) 00108 ! Check dimension length 00109 IERROR=NF_INQ_DIMLEN(ID_FILE,IVARDIMSID(1),ILENDIM) 00110 if (IERROR/=NF_NOERR) CALL HANDLE_ERR_CDF(IERROR,"can't get variable dimensions lengths") 00111 CASE (2) 00112 IERROR=NF_INQ_DIMLEN(ID_FILE,IVARDIMSID(1),ILENDIM1) 00113 if (IERROR/=NF_NOERR) CALL HANDLE_ERR_CDF(IERROR,"can't get variable dimensions lengths") 00114 IERROR=NF_INQ_DIMLEN(ID_FILE,IVARDIMSID(2),ILENDIM2) 00115 if (IERROR/=NF_NOERR) CALL HANDLE_ERR_CDF(IERROR,"can't get variable dimensions lengths") 00116 00117 ILENDIM=ILENDIM1*ILENDIM2 00118 00119 CASE DEFAULT 00120 CALL ABOR1_SFX('PREP_ISBA_NETCDF: incorrect number of dimensions for variable '//TRIM(HSURF)) 00121 00122 END SELECT 00123 ! 00124 IF(ILENDIM/=IL) CALL ABOR1_SFX('PREP_ISBA_NETCDF: incorrect number of points '// & 00125 'in netcdf file for variable '//TRIM(HSURF)) 00126 ! 00127 ! Read 1D variable 00128 IERROR=NF_GET_VAR_DOUBLE(ID_FILE,ID_VAR,ZFIELD) 00129 CALL HANDLE_ERR_CDF(IERROR,"can't read variable "//TRIM(HSURF)) 00130 ! 00131 ! Close netcdf file 00132 IERROR=NF_CLOSE(ID_FILE) 00133 ! 00134 ALLOCATE(PFIELD(IL,INLAYERS,NVEGTYPE)) !will be deallocated later by prep_hor_isba_field 00135 ! 00136 ! For now initial values are identical for all tiles / soil layers. 00137 DO JJ=1,INLAYERS 00138 DO JK=1,NVEGTYPE 00139 PFIELD(:,JJ,JK)=ZFIELD 00140 END DO 00141 END DO 00142 ! 00143 DEALLOCATE(ZFIELD) 00144 ! 00145 !Interpolation method 00146 CINTERP_TYPE='NONE' 00147 ! 00148 IF (LHOOK) CALL DR_HOOK('PREP_ISBA_NETCDF',1,ZHOOK_HANDLE) 00149 !------------------------------------------------------------------------------------- 00150 END SUBROUTINE PREP_ISBA_NETCDF