SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/prep_isba_netcdf.F90
Go to the documentation of this file.
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