SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/TRIP/mode_trip_netcdf.F90
Go to the documentation of this file.
00001 !######################
00002 MODULE MODE_TRIP_NETCDF
00003 !######################
00004 !
00005 !!****  *MODE_TRIP_NETCDF*
00006 !!
00007 !!    PURPOSE
00008 !!    -------
00009 !    
00010 !      The purpose of this routine is to store here all routines 
00011 !      used by TRIP for read/store variables in netcdf.
00012 !
00013 !!
00014 !!**  IMPLICIT ARGUMENTS
00015 !!    ------------------
00016 !!       NONE          
00017 !!
00018 !!    REFERENCE
00019 !!    ---------
00020 !!
00021 !!
00022 !!    AUTHOR
00023 !!    ------
00024 !!      B. Decharme       * Meteo France *
00025 !!
00026 !!    MODIFICATIONS
00027 !!    -------------
00028 !!      Original    25/04/08
00029 !--------------------------------------------------------------------------------
00030 !
00031 !*       0.    DECLARATIONS
00032 !              ------------
00033 !
00034 !
00035 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00036 USE PARKIND1  ,ONLY : JPRB
00037 !
00038   INTERFACE NCOPEN
00039       MODULE PROCEDURE NCOPEN
00040   END INTERFACE
00041 !
00042   INTERFACE NCCLOSE
00043       MODULE PROCEDURE NCCLOSE
00044   END INTERFACE
00045 !
00046   INTERFACE NCREAD
00047       MODULE PROCEDURE NCREAD_X
00048       MODULE PROCEDURE NCREAD_XY
00049       MODULE PROCEDURE NCREAD_XYZ
00050   END INTERFACE
00051 !
00052   INTERFACE NCCREATE
00053       MODULE PROCEDURE NCCREATE
00054   END INTERFACE
00055 !
00056   INTERFACE NCSTORE
00057       MODULE PROCEDURE NCSTORE
00058   END INTERFACE
00059 !
00060 !-------------------------------------------------------------------------------
00061 !
00062 CONTAINS
00063 !
00064 !-------------------------------------------------------------------------------
00065 !
00066 !     ######################################################
00067       SUBROUTINE NCOPEN(KLUOUT,ORW,OVERBOSE,HFILENAME,KNCID)
00068 !     ######################################################
00069 !
00070 !!    PURPOSE
00071 !!    -------
00072 !
00073 !     Open a netcdf file name YFILENAME
00074 !
00075 IMPLICIT NONE
00076 !
00077 include 'netcdf.inc'
00078 !
00079 !*      declarations of arguments
00080 !
00081  CHARACTER(LEN=nf_max_name), INTENT(IN) :: HFILENAME
00082 !
00083 LOGICAL, INTENT(IN)          :: ORW, OVERBOSE
00084 !
00085 INTEGER, INTENT(IN)          :: KLUOUT
00086 !
00087 INTEGER, INTENT(OUT)         :: KNCID
00088 !
00089 !*      declarations of local variables
00090 !
00091  CHARACTER(LEN=nf_max_name) :: YFNAME
00092 !
00093 INTEGER :: IC
00094 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00095 !
00096 !*      procedure
00097 !
00098 IF (LHOOK) CALL DR_HOOK('MODE_TRIP_NETCDF:NCOPEN',0,ZHOOK_HANDLE)
00099 YFNAME = HFILENAME(1:LEN_TRIM(HFILENAME))      
00100 !
00101 IF(ORW)THEN
00102   IC = NF_OPEN(YFNAME,NF_WRITE,KNCID)
00103 ELSE
00104   IC = NF_OPEN(YFNAME,NF_NOWRITE,KNCID)
00105 ENDIF
00106 !
00107 IF(IC/=NF_NOERR)THEN
00108   WRITE(KLUOUT,*)'NCOPEN for TRIP : Error opening file ',HFILENAME(1:LEN_TRIM(HFILENAME))
00109   WRITE(KLUOUT,*)NF_STRERROR(IC)
00110   STOP
00111 ELSEIF(OVERBOSE)THEN
00112   WRITE(KLUOUT,*)'NCOPEN for TRIP : Opening file ',HFILENAME(1:LEN_TRIM(HFILENAME))
00113 ENDIF
00114 IF (LHOOK) CALL DR_HOOK('MODE_TRIP_NETCDF:NCOPEN',1,ZHOOK_HANDLE)
00115 !
00116 END SUBROUTINE NCOPEN
00117 !
00118 !-------------------------------------------------------------------------------
00119 !
00120 !     ###################################################
00121       SUBROUTINE NCCLOSE(KLUOUT,OVERBOSE,HFILENAME,KNCID)
00122 !     ###################################################
00123 !
00124 !!    PURPOSE
00125 !!    -------
00126 !    
00127 !     Close a netcdf file
00128 !
00129 IMPLICIT NONE
00130 !
00131 include 'netcdf.inc'
00132 !
00133 !*      declarations of arguments
00134 !
00135  CHARACTER(LEN=nf_max_name), INTENT(IN) :: HFILENAME
00136 !
00137 LOGICAL, INTENT(IN)          :: OVERBOSE
00138 INTEGER, INTENT(IN)          :: KLUOUT
00139 INTEGER, INTENT(IN)          :: KNCID
00140 !
00141 !*      declarations of local variables
00142 !
00143 INTEGER :: IC
00144 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00145 !
00146 !*      procedure
00147 !
00148 IF (LHOOK) CALL DR_HOOK('MODE_TRIP_NETCDF:NCCLOSE',0,ZHOOK_HANDLE)
00149 IC = NF_CLOSE(KNCID)
00150 IF(OVERBOSE)WRITE(KLUOUT,*)'NCCLOSE for TRIP : Close file ',HFILENAME(1:LEN_TRIM(HFILENAME))
00151 IF (LHOOK) CALL DR_HOOK('MODE_TRIP_NETCDF:NCCLOSE',1,ZHOOK_HANDLE)
00152 !
00153 END SUBROUTINE NCCLOSE
00154 !
00155 !-------------------------------------------------------------------------------
00156 !
00157 !     #########################################################################
00158       SUBROUTINE NCREAD_X(KLUOUT,KNCID,HVNAME,PVECT,OVERBOSE)
00159 !     #########################################################################
00160 !
00161 !!    PURPOSE
00162 !!    -------
00163 !    
00164 !     Read a XY variable in a netcdf file
00165 !
00166 IMPLICIT NONE
00167 !
00168 include 'netcdf.inc'
00169 !
00170 !*      declarations of arguments
00171 !
00172  CHARACTER(LEN=nf_max_name), INTENT(IN) :: HVNAME
00173 !
00174 INTEGER, INTENT(IN)          :: KLUOUT
00175 INTEGER, INTENT(IN)          :: KNCID
00176 !
00177 LOGICAL, INTENT(IN)          :: OVERBOSE
00178 !
00179 REAL, DIMENSION(:), INTENT(OUT) :: PVECT
00180 !
00181 !*      declarations of local variables
00182 !
00183  CHARACTER(LEN=nf_max_name) :: YVNAME
00184 !
00185 INTEGER :: IC, ID
00186 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00187 !
00188 !*      procedure
00189 !
00190 IF (LHOOK) CALL DR_HOOK('MODE_TRIP_NETCDF:NCREAD_X',0,ZHOOK_HANDLE)
00191 YVNAME = HVNAME(1:LEN_TRIM(HVNAME))
00192 !
00193 IC = NF_INQ_VARID(KNCID,YVNAME,ID)
00194 !
00195 IF(IC/=NF_NOERR)THEN
00196   WRITE(KLUOUT,*)'NCREAD_X for TRIP : Error reading variable ',HVNAME(1:LEN_TRIM(HVNAME))
00197   WRITE(KLUOUT,*)NF_STRERROR(IC)
00198   STOP
00199 ELSE
00200   IC=NF_GET_VAR_DOUBLE(KNCID,ID,PVECT)
00201   IF(IC/=NF_NOERR)THEN
00202     WRITE(KLUOUT,*)'NCREAD_X for TRIP : Error reading variable ',HVNAME(1:LEN_TRIM(HVNAME))
00203     WRITE(KLUOUT,*)NF_STRERROR(IC)
00204     STOP
00205   ELSEIF(OVERBOSE)THEN
00206     WRITE(KLUOUT,*)'NCREAD_X for TRIP : Success in reading variable ',HVNAME(1:LEN_TRIM(HVNAME))
00207   ENDIF
00208 ENDIF
00209 IF (LHOOK) CALL DR_HOOK('MODE_TRIP_NETCDF:NCREAD_X',1,ZHOOK_HANDLE)
00210 !
00211 END SUBROUTINE NCREAD_X
00212 !-------------------------------------------------------------------------------
00213 !
00214 !     #########################################################################
00215       SUBROUTINE NCREAD_XY(KLUOUT,KNCID,HVNAME,PVECT,OVERBOSE)
00216 !     #########################################################################
00217 !
00218 !!    PURPOSE
00219 !!    -------
00220 !    
00221 !     Read a XY variable in a netcdf file
00222 !
00223 IMPLICIT NONE
00224 !
00225 include 'netcdf.inc'
00226 !
00227 !*      declarations of arguments
00228 !
00229  CHARACTER(LEN=nf_max_name), INTENT(IN) :: HVNAME
00230 !
00231 INTEGER, INTENT(IN)          :: KLUOUT
00232 INTEGER, INTENT(IN)          :: KNCID
00233 !
00234 LOGICAL, INTENT(IN)          :: OVERBOSE
00235 !
00236 REAL, DIMENSION(:,:), INTENT(OUT) :: PVECT
00237 !
00238 !*      declarations of local variables
00239 !
00240  CHARACTER(LEN=nf_max_name) :: YVNAME
00241 !
00242 INTEGER :: IC, ID
00243 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00244 !
00245 !*      procedure
00246 !
00247 IF (LHOOK) CALL DR_HOOK('MODE_TRIP_NETCDF:NCREAD_XY',0,ZHOOK_HANDLE)
00248 YVNAME = HVNAME(1:LEN_TRIM(HVNAME))
00249 !
00250 IC = NF_INQ_VARID(KNCID,YVNAME,ID)
00251 !
00252 IF(IC/=NF_NOERR)THEN
00253   WRITE(KLUOUT,*)'NCREAD_XY for TRIP : Error reading variable ',HVNAME(1:LEN_TRIM(HVNAME))
00254   WRITE(KLUOUT,*)NF_STRERROR(IC)
00255   STOP
00256 ELSE
00257   IC=NF_GET_VAR_DOUBLE(KNCID,ID,PVECT)
00258   IF(IC/=NF_NOERR)THEN
00259     WRITE(KLUOUT,*)'NCREAD_XY for TRIP : Error reading variable ',HVNAME(1:LEN_TRIM(HVNAME))
00260     WRITE(KLUOUT,*)NF_STRERROR(IC)
00261     STOP
00262   ELSEIF(OVERBOSE)THEN
00263     WRITE(KLUOUT,*)'NCREAD_XY for TRIP : Success in reading variable ',HVNAME(1:LEN_TRIM(HVNAME))
00264   ENDIF
00265 ENDIF
00266 IF (LHOOK) CALL DR_HOOK('MODE_TRIP_NETCDF:NCREAD_XY',1,ZHOOK_HANDLE)
00267 !
00268 END SUBROUTINE NCREAD_XY
00269 !-------------------------------------------------------------------------------
00270 !
00271 !     #########################################################################
00272       SUBROUTINE NCREAD_XYZ(KLUOUT,KNCID,HVNAME,PVECT,OVERBOSE)
00273 !     #########################################################################
00274 !
00275 !!    PURPOSE
00276 !!    -------
00277 !    
00278 !     Read a XYZ variable in a netcdf file
00279 !
00280 IMPLICIT NONE
00281 !
00282 include 'netcdf.inc'
00283 !
00284 !*      declarations of arguments
00285 !
00286  CHARACTER(LEN=nf_max_name), INTENT(IN) :: HVNAME
00287 !
00288 INTEGER, INTENT(IN)          :: KLUOUT
00289 INTEGER, INTENT(IN)          :: KNCID
00290 !
00291 LOGICAL, INTENT(IN)          :: OVERBOSE
00292 !
00293 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVECT
00294 !
00295 !*      declarations of local variables
00296 !
00297  CHARACTER(LEN=nf_max_name) :: YVNAME
00298 !
00299 INTEGER :: IC, ID
00300 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00301 !
00302 !*      procedure
00303 !
00304 IF (LHOOK) CALL DR_HOOK('MODE_TRIP_NETCDF:NCREAD_XYZ',0,ZHOOK_HANDLE)
00305 YVNAME = HVNAME(1:LEN_TRIM(HVNAME))
00306 !
00307 IC = NF_INQ_VARID(KNCID,YVNAME,ID)
00308 !
00309 IF(IC/=NF_NOERR)THEN
00310   WRITE(KLUOUT,*)'NCREAD_XYZ for TRIP : Error reading variable ',HVNAME(1:LEN_TRIM(HVNAME))
00311   WRITE(KLUOUT,*)NF_STRERROR(IC)
00312   STOP
00313 ELSE
00314   IC=NF_GET_VAR_DOUBLE(KNCID,ID,PVECT)
00315   IF(IC/=NF_NOERR)THEN
00316     WRITE(KLUOUT,*)'NCREAD_XYZ for TRIP : Error reading variable ',HVNAME(1:LEN_TRIM(HVNAME))
00317     WRITE(KLUOUT,*)NF_STRERROR(IC)
00318     STOP
00319   ELSEIF(OVERBOSE)THEN
00320     WRITE(KLUOUT,*)'NCREAD_XYZ for TRIP : Success in reading variable ',HVNAME(1:LEN_TRIM(HVNAME))
00321   ENDIF
00322 ENDIF
00323 IF (LHOOK) CALL DR_HOOK('MODE_TRIP_NETCDF:NCREAD_XYZ',1,ZHOOK_HANDLE)
00324 !
00325 END SUBROUTINE NCREAD_XYZ
00326 !
00327 !-------------------------------------------------------------------------------
00328 !
00329 !     ########################################################
00330       SUBROUTINE NCCREATE(KLUOUT,HFILENAME,HTITLE,HTIMEUNIT, &
00331                             HVNAME,HVLNAME,HUNIT,PLON,PLAT,    &
00332                             PMISSVAL,OVERBOSE,KNCID,OTIME,     &
00333                             KZLEN,OVARZDIM)  
00334 !     ########################################################
00335 !
00336 !!    PURPOSE
00337 !!    -------
00338 !    
00339 !     Open a netcdf file name YFILENAME
00340 !
00341 IMPLICIT NONE
00342 !
00343 include 'netcdf.inc'
00344 !
00345 !*      declarations of arguments
00346 !
00347  CHARACTER(LEN=nf_max_name), INTENT(IN) :: HFILENAME, HTITLE, HTIMEUNIT
00348 !
00349  CHARACTER(LEN=nf_max_name), DIMENSION(:), INTENT(IN) :: HVNAME, HVLNAME, HUNIT  
00350 !
00351 REAL, DIMENSION(:), INTENT(IN) :: PLON
00352 REAL, DIMENSION(:), INTENT(IN) :: PLAT
00353 !
00354 LOGICAL, INTENT(IN)  :: OVERBOSE
00355 !
00356 REAL,    INTENT(IN)  :: PMISSVAL
00357 !
00358 INTEGER, INTENT(IN)  :: KLUOUT
00359 !
00360 INTEGER, INTENT(OUT) :: KNCID
00361 !
00362 LOGICAL, INTENT(IN)  :: OTIME
00363 !
00364 INTEGER,               INTENT(IN), OPTIONAL  :: KZLEN
00365 LOGICAL, DIMENSION(:), INTENT(IN), OPTIONAL  :: OVARZDIM
00366 !
00367 !*      declarations of local variables
00368 !
00369  CHARACTER(LEN=nf_max_name) :: YWORK
00370 !
00371 REAL, DIMENSION(:), ALLOCATABLE :: ZWORK
00372 !
00373 INTEGER :: ILONDIM, ILATDIM, ILEVDIM, ITIMEDIM
00374 INTEGER :: ILON_ID, ILAT_ID, ILEV_ID, ITIME_ID, VAR_ID
00375 INTEGER :: IC, IWORK, INVAR
00376 INTEGER :: JVAR
00377 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00378 !
00379 !*      procedure
00380 !
00381 !
00382 !Creation
00383 IF (LHOOK) CALL DR_HOOK('MODE_TRIP_NETCDF:NCCREATE',0,ZHOOK_HANDLE)
00384 YWORK = HFILENAME(1:LEN_TRIM(HFILENAME))
00385 IC = NF_CREATE(YWORK,NF_CLOBBER,KNCID)
00386 IF(IC/=NF_NOERR)THEN
00387   WRITE(KLUOUT,*)'NCCREATE for TRIP : Error create file ',HFILENAME(1:LEN_TRIM(HFILENAME))
00388   WRITE(KLUOUT,*)NF_STRERROR(IC)
00389   STOP
00390 ELSEIF(OVERBOSE)THEN
00391     WRITE(KLUOUT,*)'NCCREATE for TRIP : Success in creating file ',HFILENAME(1:LEN_TRIM(HFILENAME))
00392 ENDIF
00393 !
00394 !Attributs
00395 YWORK = HTITLE(1:LEN_TRIM(HTITLE))
00396 IC = NF_PUT_ATT_TEXT(KNCID,NF_GLOBAL,'title',LEN_TRIM(YWORK),YWORK)
00397 YWORK = 'COARDS'
00398 IC = NF_PUT_ATT_TEXT(KNCID,NF_GLOBAL,'Conventions',LEN_TRIM(YWORK),YWORK)
00399 !
00400 !Dimensions
00401 IWORK = SIZE(PLON)
00402 IC = NF_DEF_DIM(KNCID,'longitude',IWORK,ILONDIM)
00403 IWORK = SIZE(PLAT)
00404 IC = NF_DEF_DIM(KNCID,'latitude',IWORK,ILATDIM)
00405 IF(PRESENT(KZLEN)) IC = NF_DEF_DIM(KNCID,'level',KZLEN,ILEVDIM)
00406 IF(OTIME) IC = NF_DEF_DIM(KNCID,'time',NF_UNLIMITED,ITIMEDIM)
00407 !
00408 !Variable attributs
00409 !
00410 IC = NF_DEF_VAR(KNCID,'longitude',NF_DOUBLE,1,ILONDIM,ILON_ID)
00411 IC = NF_DEF_VAR(KNCID,'latitude' ,NF_DOUBLE,1,ILATDIM,ILAT_ID)
00412 YWORK = 'degrees_east'
00413 IC = NF_PUT_ATT_TEXT(KNCID,ILON_ID,'units',LEN_TRIM(YWORK),YWORK)
00414 YWORK = 'degrees_north'
00415 IC = NF_PUT_ATT_TEXT(KNCID,ILAT_ID,'units',LEN_TRIM(YWORK),YWORK)
00416 IF(PRESENT(KZLEN))THEN
00417   IC = NF_DEF_VAR(KNCID,'level',NF_DOUBLE,1,ILEVDIM,ILEV_ID)
00418   YWORK = 'level'
00419   IC = NF_PUT_ATT_TEXT(KNCID,ILEV_ID,'units',LEN_TRIM(YWORK),YWORK)
00420 ENDIF
00421 !
00422 IF(OTIME)THEN
00423    YWORK = HTIMEUNIT(1:LEN_TRIM(HTIMEUNIT))
00424    IC = NF_DEF_VAR(KNCID,'time',NF_INT,1,ITIMEDIM,ITIME_ID)
00425    IC = NF_PUT_ATT_TEXT(KNCID,ITIME_ID,'units',LEN_TRIM(YWORK),YWORK)
00426 ENDIF
00427 !
00428 !Variables parametres
00429 !
00430 INVAR = SIZE(HVNAME)
00431 !
00432 DO JVAR=1,INVAR
00433    YWORK = HVNAME(JVAR)(1:LEN_TRIM(HVNAME(JVAR)))
00434    IF(PRESENT(KZLEN))THEN  
00435      IF(OTIME)THEN
00436        IF(OVARZDIM(JVAR))THEN
00437          IC = NF_DEF_VAR(KNCID,YWORK,NF_DOUBLE,4,(/ILONDIM,ILATDIM,ILEVDIM,ITIMEDIM/),VAR_ID)
00438        ELSE
00439          IC = NF_DEF_VAR(KNCID,YWORK,NF_DOUBLE,3,(/ILONDIM,ILATDIM,ITIMEDIM/),VAR_ID)
00440        ENDIF
00441      ELSE
00442        IF(OVARZDIM(JVAR))THEN
00443          IC = NF_DEF_VAR(KNCID,YWORK,NF_DOUBLE,3,(/ILONDIM,ILATDIM,ILEVDIM/),VAR_ID)
00444        ELSE
00445          IC = NF_DEF_VAR(KNCID,YWORK,NF_DOUBLE,2,(/ILONDIM,ILATDIM/),VAR_ID)
00446        ENDIF
00447      ENDIF
00448    ELSE
00449      IF(OTIME)THEN
00450        IC = NF_DEF_VAR(KNCID,YWORK,NF_DOUBLE,3,(/ILONDIM,ILATDIM,ITIMEDIM/),VAR_ID)
00451      ELSE
00452        IC = NF_DEF_VAR(KNCID,YWORK,NF_DOUBLE,2,(/ILONDIM,ILATDIM/),VAR_ID)
00453      ENDIF
00454    ENDIF
00455    YWORK = HVLNAME(JVAR)(1:LEN_TRIM(HVLNAME(JVAR)))
00456    IC = NF_PUT_ATT_TEXT(KNCID,VAR_ID,'long_name',LEN_TRIM(YWORK),YWORK)
00457    YWORK = HUNIT(JVAR)(1:LEN_TRIM(HUNIT(JVAR)))
00458    IC = NF_PUT_ATT_TEXT(KNCID,VAR_ID,'units',LEN_TRIM(YWORK),YWORK)
00459    IC = NF_PUT_ATT_DOUBLE(KNCID,VAR_ID,'missing_value',NF_DOUBLE,1,PMISSVAL)
00460 ENDDO
00461 !
00462 IC = NF_ENDDEF(KNCID)
00463 !
00464 !Write dimensions
00465 IC = NF_PUT_VAR_DOUBLE(KNCID,ILON_ID,PLON)
00466 IC = NF_PUT_VAR_DOUBLE(KNCID,ILAT_ID,PLAT)
00467 IF(PRESENT(KZLEN))THEN
00468   ALLOCATE(ZWORK(KZLEN))
00469   DO JVAR = 1,KZLEN
00470      ZWORK(JVAR)=JVAR
00471   ENDDO
00472   IC = NF_PUT_VAR_DOUBLE(KNCID,ILEV_ID,ZWORK)
00473   DEALLOCATE(ZWORK)
00474 ENDIF
00475 !
00476 WRITE(KLUOUT,*)'NCCREATE ',HFILENAME(1:LEN_TRIM(HFILENAME)),' for TRIP OK !'
00477 IF (LHOOK) CALL DR_HOOK('MODE_TRIP_NETCDF:NCCREATE',1,ZHOOK_HANDLE)
00478 !
00479 END SUBROUTINE NCCREATE
00480 !
00481 !-------------------------------------------------------------------------------
00482 !
00483 !     ################################################
00484       SUBROUTINE NCSTORE(KLUOUT,KNCID,HVNAME,PWRITE, &
00485                            OVERBOSE,KTIMENUM,KTIMEVAL, &
00486                            KLEVEL,OVARZDIM)  
00487 !     ################################################
00488 !
00489 !!    PURPOSE
00490 !!    -------
00491 !    
00492 !     Write in a netcdf file with illimited time if this this the case
00493 !
00494 IMPLICIT NONE
00495 !
00496 include 'netcdf.inc'
00497 !
00498 !*      declarations of arguments
00499 !
00500  CHARACTER(LEN=nf_max_name), INTENT(IN) :: HVNAME  
00501 !
00502 REAL, DIMENSION(:,:), INTENT(IN) :: PWRITE
00503 !
00504 INTEGER, INTENT(IN)           :: KLUOUT, KNCID
00505 !
00506 LOGICAL, INTENT(IN)           :: OVERBOSE
00507 !
00508 INTEGER, INTENT(IN), OPTIONAL :: KTIMENUM
00509 INTEGER, INTENT(IN), OPTIONAL :: KTIMEVAL
00510 
00511 INTEGER, INTENT(IN), OPTIONAL :: KLEVEL
00512 LOGICAL, INTENT(IN), OPTIONAL :: OVARZDIM
00513 !
00514 !*      declarations of local variables
00515 !
00516  CHARACTER(LEN=nf_max_name) :: YWORK
00517 !
00518 INTEGER, DIMENSION(4) :: ISTART, ICOUNT
00519 !
00520 INTEGER :: IUNLIMID, ITIMEID, ILENGHT, INDIM
00521 INTEGER :: IC, IVAR_ID
00522 REAL    :: ZWORK
00523 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00524 !
00525 !*      procedure
00526 !
00527 IF (LHOOK) CALL DR_HOOK('MODE_TRIP_NETCDF:NCSTORE',0,ZHOOK_HANDLE)
00528 IF(PRESENT(KLEVEL).AND..NOT.PRESENT(OVARZDIM))THEN
00529   WRITE(KLUOUT,*)'NCSTORE for TRIP : Error writing variable ',HVNAME(1:LEN_TRIM(HVNAME))
00530   WRITE(KLUOUT,*)'ILEVEL present but not LVARZDIM'
00531   WRITE(KLUOUT,*)NF_STRERROR(IC)
00532   STOP
00533 ENDIF       
00534 !
00535 IF(PRESENT(KTIMENUM).AND.PRESENT(KTIMEVAL))THEN
00536   IC = NF_INQ_UNLIMDIM(KNCID,IUNLIMID)
00537   IF(IUNLIMID/=-1)THEN
00538     IC = NF_INQ_DIMLEN(KNCID,IUNLIMID,ILENGHT)
00539     IF(KTIMENUM/=ILENGHT)THEN
00540       IC = NF_INQ_VARID(KNCID,'time',ITIMEID)
00541       ZWORK = KTIMEVAL
00542       IC = NF_PUT_VAR1_DOUBLE(KNCID,ITIMEID,(/KTIMENUM/),ZWORK)
00543       IF(OVERBOSE)THEN
00544         WRITE(KLUOUT,*)'NCSTORE : re-writing of time variable number=',&
00545                           KTIMENUM,' and value=',KTIMEVAL  
00546       ENDIF
00547     ENDIF
00548   ENDIF
00549 ENDIF
00550 !
00551 YWORK = HVNAME(1:LEN_TRIM(HVNAME))
00552 !
00553 IC = NF_INQ_VARID(KNCID,YWORK,IVAR_ID)
00554 IC = NF_INQ_VARNDIMS(KNCID,IVAR_ID,INDIM)
00555 !
00556 ICOUNT(1) = SIZE(PWRITE,1)
00557 ICOUNT(2) = SIZE(PWRITE,2)
00558 ICOUNT(3) = 1
00559 ICOUNT(4) = 1
00560 !  
00561 ISTART(1) = 1
00562 ISTART(2) = 1
00563 !
00564 IF(PRESENT(KLEVEL).AND.OVARZDIM)THEN
00565   ISTART(3) = KLEVEL
00566   IF(PRESENT(KTIMENUM).AND.PRESENT(KTIMEVAL))THEN
00567     ISTART(4) = KTIMENUM
00568     IC = NF_PUT_VARA_DOUBLE(KNCID,IVAR_ID,ISTART(1:4),ICOUNT(1:4),PWRITE)
00569   ELSE
00570     IC = NF_PUT_VARA_DOUBLE(KNCID,IVAR_ID,ISTART(1:3),ICOUNT(1:3),PWRITE)
00571   ENDIF 
00572 ELSE
00573   IF(PRESENT(KTIMENUM).AND.PRESENT(KTIMEVAL))THEN
00574     ISTART(3) = KTIMENUM
00575     IC = NF_PUT_VARA_DOUBLE(KNCID,IVAR_ID,ISTART(1:3),ICOUNT(1:3),PWRITE)
00576   ELSE
00577     IC = NF_PUT_VARA_DOUBLE(KNCID,IVAR_ID,ISTART(1:2),ICOUNT(1:2),PWRITE)
00578   ENDIF          
00579 ENDIF
00580 !
00581 IF(IC/=NF_NOERR)THEN
00582   WRITE(KLUOUT,*)'NCSTORE for TRIP : Error writing variable ',HVNAME(1:LEN_TRIM(HVNAME))
00583   WRITE(KLUOUT,*)NF_STRERROR(IC)
00584   STOP
00585 ELSEIF(OVERBOSE)THEN
00586   WRITE(KLUOUT,*)'NCSTORE for TRIP : Success in writing variable ',HVNAME(1:LEN_TRIM(HVNAME))
00587   IF(PRESENT(KLEVEL))WRITE(KLUOUT,*)'                   level: ',KLEVEL
00588 ENDIF
00589 !
00590 IF (LHOOK) CALL DR_HOOK('MODE_TRIP_NETCDF:NCSTORE',1,ZHOOK_HANDLE)
00591 !
00592 END SUBROUTINE NCSTORE
00593 !
00594 !-------------------------------------------------------------------------------
00595 !
00596 END MODULE MODE_TRIP_NETCDF