SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/OFFLIN/mode_write_surf_ol.F90
Go to the documentation of this file.
00001 MODULE MODE_WRITE_SURF_OL
00002 !
00003 INTERFACE WRITE_SURF0_OL
00004         MODULE PROCEDURE WRITE_SURFX0_OL
00005         MODULE PROCEDURE WRITE_SURFN0_OL
00006         MODULE PROCEDURE WRITE_SURFC0_OL
00007         MODULE PROCEDURE WRITE_SURFL0_OL
00008 END INTERFACE
00009 INTERFACE WRITE_SURF0_TIME_OL
00010         MODULE PROCEDURE WRITE_SURFX0_TIME_OL
00011 END INTERFACE
00012 INTERFACE WRITE_SURFN_OL
00013         MODULE PROCEDURE WRITE_SURFX1_OL
00014         MODULE PROCEDURE WRITE_SURFN1_OL
00015         MODULE PROCEDURE WRITE_SURFL1_OL
00016         MODULE PROCEDURE WRITE_SURFX2_OL
00017 END INTERFACE
00018 INTERFACE WRITE_SURFT_OL
00019         MODULE PROCEDURE WRITE_SURFT0_OL
00020 END INTERFACE
00021 !
00022 CONTAINS
00023 !
00024 !     #############################################################
00025       SUBROUTINE WRITE_SURFX0_OL(HREC,PFIELD,KRESP,HCOMMENT)
00026 !     #############################################################
00027 !
00028 !!****  *WRITEX0* - routine to read a real scalar
00029 !
00030 USE MODI_OL_FIND_FILE_WRITE
00031 !
00032 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00033 USE PARKIND1  ,ONLY : JPRB
00034 !
00035 IMPLICIT NONE
00036 !
00037 INCLUDE "netcdf.inc"
00038 !
00039 !*      0.1   Declarations of arguments
00040 !
00041  CHARACTER(LEN=12),  INTENT(IN)  :: HREC     ! name of the article to be read
00042 REAL,               INTENT(IN)  :: PFIELD   ! the real scalar to be read
00043 INTEGER,            INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
00044  CHARACTER(LEN=100), INTENT(IN)  :: HCOMMENT
00045 !
00046 !*      0.2   Declarations of local variables
00047 !
00048 INTEGER              :: IFILE_ID,IVAR_ID,JRET
00049 INTEGER,DIMENSION(2) :: IRET
00050 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00051 !
00052 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFX0_OL',0,ZHOOK_HANDLE)
00053 !
00054 KRESP=0
00055 !
00056 ! 0. find filename
00057 ! -----------------
00058  CALL OL_FIND_FILE_WRITE(HREC,IFILE_ID)
00059 ! 
00060 IF (IFILE_ID /= 0) THEN        
00061   ! 1. Find id of the variable
00062   !----------------------------
00063   IRET(1)=NF_INQ_VARID   (IFILE_ID,HREC,IVAR_ID)  
00064   ! 2. Put variable
00065   !----------------------------
00066   IRET(2)=NF_PUT_VAR_DOUBLE (IFILE_ID,IVAR_ID,PFIELD)
00067 ENDIF
00068 !
00069 ! 3. Check for errors
00070 !--------------------
00071 DO JRET=1,2
00072   IF (IFILE_ID==0 .OR. IRET(JRET).NE.NF_NOERR) KRESP=1
00073 ENDDO
00074 !
00075 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFX0_OL',1,ZHOOK_HANDLE)
00076 !
00077 END SUBROUTINE WRITE_SURFX0_OL
00078 !
00079 !     #############################################################
00080       SUBROUTINE WRITE_SURFN0_OL(HREC,KFIELD,KRESP,HCOMMENT)
00081 !     #############################################################
00082 !
00083 !!****  *WRITEN0* - routine to read an integer
00084 !
00085 USE MODI_OL_FIND_FILE_WRITE
00086 !
00087 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00088 USE PARKIND1  ,ONLY : JPRB
00089 !
00090 IMPLICIT NONE
00091 !
00092 INCLUDE "netcdf.inc"
00093 !
00094 !*      0.1   Declarations of arguments
00095 !
00096  CHARACTER(LEN=12),  INTENT(IN)  :: HREC     ! name of the article to be read
00097 INTEGER,            INTENT(IN)  :: KFIELD   ! the integer scalar to be read
00098 INTEGER,            INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
00099  CHARACTER(LEN=100), INTENT(IN)  :: HCOMMENT
00100 !
00101 !*      0.2   Declarations of local variables
00102 !
00103 INTEGER              :: IFILE_ID, IVAR_ID, JRET
00104 INTEGER,DIMENSION(2) :: IRET
00105 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00106 !
00107 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFN0_OL',0,ZHOOK_HANDLE)
00108 !
00109 KRESP=0
00110 !
00111 ! 0. find filename
00112 ! -----------------
00113  CALL OL_FIND_FILE_WRITE(HREC,IFILE_ID)
00114 !
00115 IF (IFILE_ID /= 0) THEN    
00116   ! 1. Find id of the variable
00117   !----------------------------
00118   IRET(1)=NF_INQ_VARID   (IFILE_ID,HREC,IVAR_ID)   
00119   ! 2. Get variable
00120   !----------------------------
00121   IRET(2)=NF_PUT_VAR_INT(IFILE_ID,IVAR_ID,KFIELD)  
00122 ENDIF
00123 !
00124 ! 3. Check for errors
00125 !--------------------
00126 DO JRET=1,2
00127   IF (IFILE_ID==0 .OR. IRET(JRET).NE.NF_NOERR) KRESP=1
00128 ENDDO
00129 !
00130 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFN0_OL',1,ZHOOK_HANDLE)
00131 !
00132 END SUBROUTINE WRITE_SURFN0_OL
00133 !
00134 !     #############################################################
00135       SUBROUTINE WRITE_SURFC0_OL(HREC,HFIELD,KRESP,HCOMMENT)
00136 !     #############################################################
00137 !
00138 !!****  *WRITEC0* - routine to read a STRING
00139 !
00140 USE MODI_OL_FIND_FILE_WRITE
00141 !
00142 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00143 USE PARKIND1  ,ONLY : JPRB
00144 !
00145 IMPLICIT NONE
00146 !
00147 INCLUDE "netcdf.inc"
00148 !
00149 !*      0.1   Declarations of arguments
00150 !
00151  CHARACTER(LEN=12),  INTENT(IN)  :: HREC     ! name of the article to be read
00152  CHARACTER(LEN=40),  INTENT(IN)  :: HFIELD   ! the integer scalar to be read
00153 INTEGER,            INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
00154  CHARACTER(LEN=100), INTENT(IN)  :: HCOMMENT
00155 !
00156 !*      0.2   Declarations of local variables
00157 !
00158  CHARACTER(LEN=100)   :: YFIELD
00159 INTEGER              :: IFILE_ID, IVAR_ID, JRET
00160 INTEGER,DIMENSION(2) :: IRET
00161 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00162 !
00163 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFC0_OL',0,ZHOOK_HANDLE)
00164 !
00165 KRESP=0
00166 !
00167 ! 0. find filename
00168 ! -----------------
00169  CALL OL_FIND_FILE_WRITE(HREC,IFILE_ID)
00170 !
00171 IF (IFILE_ID /= 0) THEN 
00172   ! 1. Find id of the variable
00173   !----------------------------
00174   IRET(1)=NF_INQ_VARID   (IFILE_ID,HREC,IVAR_ID)
00175   ! 2. Get variable
00176   !----------------------------
00177   YFIELD=HFIELD(:LEN_TRIM(HFIELD))
00178   IRET(2)=NF_PUT_VAR_TEXT(IFILE_ID,IVAR_ID,YFIELD)  
00179 ENDIF
00180 !
00181 ! 3. Check for errors
00182 !--------------------
00183 DO JRET=1,2
00184   IF (IFILE_ID==0 .OR. IRET(JRET).NE.NF_NOERR) KRESP=1
00185 ENDDO
00186 !
00187 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFC0_OL',1,ZHOOK_HANDLE)
00188 !
00189 END SUBROUTINE WRITE_SURFC0_OL
00190 !
00191 !     #############################################################
00192       SUBROUTINE WRITE_SURFL0_OL(HREC,OFIELD,KRESP,HCOMMENT)
00193 !     #############################################################
00194 !
00195 !!****  *WRITEL0* - routine to read a logical
00196 !    
00197 USE MODI_OL_FIND_FILE_WRITE
00198 USE MODI_HANDLE_ERR
00199 !
00200 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00201 USE PARKIND1  ,ONLY : JPRB
00202 !
00203 IMPLICIT NONE
00204 !
00205 INCLUDE "netcdf.inc"
00206 !
00207 !*      0.1   Declarations of arguments
00208 !
00209  CHARACTER(LEN=12),   INTENT(IN) :: HREC     ! name of the article to be read
00210 LOGICAL,             INTENT(IN) :: OFIELD   ! array containing the data field
00211 INTEGER,             INTENT(OUT):: KRESP    ! KRESP  : return-code if a problem appears
00212  CHARACTER(LEN=100),  INTENT(IN) :: HCOMMENT
00213 !
00214 !*      0.2   Declarations of local variables
00215 !
00216  CHARACTER(LEN=1)     :: YFIELD   ! work array read in the file
00217 INTEGER              :: IFILE_ID, IVAR_ID, JRET
00218 INTEGER,DIMENSION(2) :: IRET
00219 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00220 !
00221 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFL0_OL',0,ZHOOK_HANDLE)
00222 !
00223 KRESP=0
00224 !
00225 ! 0. find filename
00226 ! -----------------
00227  CALL OL_FIND_FILE_WRITE(HREC,IFILE_ID)
00228 ! 
00229 IF (IFILE_ID /= 0) THEN        
00230   ! 1. Find id of the variable
00231   !----------------------------
00232   IRET(1)=NF_INQ_VARID   (IFILE_ID,HREC,IVAR_ID)
00233   IF (OFIELD) THEN
00234     YFIELD ='T'
00235   ELSE
00236     YFIELD ='F'
00237   ENDIF    
00238   ! 2. Put variable
00239   !----------------------------
00240   IRET(2)=NF_PUT_VAR_TEXT(IFILE_ID,IVAR_ID,YFIELD)
00241   CALL HANDLE_ERR(IRET(1),HREC)
00242 ENDIF
00243 !
00244 ! 3. Check for errors
00245 !--------------------
00246 DO JRET=1,2
00247   IF (IFILE_ID==0 .OR. IRET(JRET).NE.NF_NOERR) KRESP=1
00248 ENDDO
00249 !
00250 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFL0_OL',1,ZHOOK_HANDLE)
00251 !
00252 END SUBROUTINE WRITE_SURFL0_OL
00253 !
00254 !     #############################################################
00255       SUBROUTINE WRITE_SURFX0_TIME_OL(PFIELD,KRESP,HCOMMENT)
00256 !     #############################################################
00257 !
00258 !!****  *WRITEX1* - routine to fill a real 1D array for the externalised surface 
00259 !
00260 USE MODD_IO_SURF_OL, ONLY: XSTARTW, XTYPE
00261 USE MODD_OL_FILEID,  ONLY: XID_SURF, XID_NATURE, XID_SEA, XID_WATER, XID_TOWN 
00262 !
00263 USE MODI_HANDLE_ERR
00264 !
00265 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00266 USE PARKIND1  ,ONLY : JPRB
00267 !
00268 IMPLICIT NONE
00269 INCLUDE "netcdf.inc"
00270 !
00271 !*      0.1   Declarations of arguments
00272 !
00273 REAL,                INTENT(IN) :: PFIELD   ! array containing the data field
00274 INTEGER,             INTENT(OUT):: KRESP    ! KRESP  : return-code if a problem appears
00275  CHARACTER(LEN=100),  INTENT(IN) :: HCOMMENT
00276 !
00277 !*      0.2   Declarations of local variables
00278 !
00279 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00280 !
00281 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFX0_TIME_OL',0,ZHOOK_HANDLE)
00282 !
00283 KRESP=0
00284 !
00285 IF (XTYPE==1) THEN
00286   CALL WRITE_TIME_DIM(XID_SURF)
00287 ELSEIF (XTYPE==2) THEN
00288   CALL WRITE_TIME_DIM(XID_NATURE)
00289 ELSEIF (XTYPE==3) THEN
00290   CALL WRITE_TIME_DIM(XID_SEA)
00291 ELSEIF (XTYPE==4) THEN
00292   CALL WRITE_TIME_DIM(XID_WATER)
00293 ELSEIF (XTYPE==5) THEN
00294   CALL WRITE_TIME_DIM(XID_TOWN)
00295 ENDIF
00296 !
00297 KRESP = 0
00298 !
00299 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFX0_TIME_OL',1,ZHOOK_HANDLE)
00300 !
00301 CONTAINS
00302 !
00303 SUBROUTINE WRITE_TIME_DIM(PTAB)
00304 !
00305 INTEGER, DIMENSION(:), INTENT(IN) :: PTAB
00306 !
00307 INTEGER :: IVAR_ID
00308 INTEGER :: JRET, JJ       !loop index
00309 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00310 !
00311 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFX0_TIME_OL:WRITE_TIME_DIM',0,ZHOOK_HANDLE)
00312 !
00313 IF (PTAB(1).NE.0 .AND. XTYPE.NE.1) THEN
00314   !
00315   JRET = NF_INQ_VARID(PTAB(1),'time',IVAR_ID)
00316   IF (JRET.EQ.NF_NOERR) THEN
00317     JRET = NF_PUT_VARS_DOUBLE(PTAB(1),IVAR_ID,XSTARTW,1,1,PFIELD)
00318     CALL HANDLE_ERR(JRET,'time')
00319   ENDIF
00320   !
00321 ENDIF
00322 !  
00323 DO JJ=2,SIZE(PTAB)
00324   !
00325   IF (PTAB(JJ).NE.PTAB(JJ-1) .AND. PTAB(JJ).NE.0) THEN
00326     JRET = NF_INQ_VARID(PTAB(JJ),'time',IVAR_ID)
00327     IF (JRET.EQ.NF_NOERR) THEN
00328       JRET = NF_PUT_VARS_DOUBLE(PTAB(JJ),IVAR_ID,XSTARTW,1,1,PFIELD)
00329       CALL HANDLE_ERR(JRET,'time')
00330     ENDIF
00331   ENDIF
00332   ! 
00333 ENDDO
00334 !
00335 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFX0_TIME_OL:WRITE_TIME_DIM',1,ZHOOK_HANDLE)
00336 !
00337 END SUBROUTINE WRITE_TIME_DIM
00338 !
00339 END SUBROUTINE WRITE_SURFX0_TIME_OL
00340 !
00341 !     #############################################################
00342       SUBROUTINE WRITE_SURFX1_OL(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
00343 !     #############################################################
00344 !
00345 !!****  *WRITEX1* - routine to fill a real 1D array for the externalised surface 
00346 !  
00347 USE MODD_SURFEX_MPI, ONLY : NRANK, NPIO, NCOMM, NPROC, XTIME_NPIO_WRITE, &
00348                             XTIME_COMM_WRITE
00349 !
00350 USE MODD_IO_SURF_OL, ONLY: LMASK, NMASK, NMASK_IGN, XSTART, &
00351                            XSTRIDE, LPARTW, XSTARTW, XCOUNTW
00352 !
00353 USE MODI_IO_BUFF_n
00354 USE MODI_OL_FIND_FILE_WRITE
00355 !
00356 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00357 USE PARKIND1  ,ONLY : JPRB
00358 !
00359 IMPLICIT NONE
00360 !
00361 INCLUDE "netcdf.inc"
00362 !
00363 #ifndef NOMPI
00364 INCLUDE "mpif.h"
00365 #endif
00366 !
00367 !*      0.1   Declarations of arguments
00368 !
00369  CHARACTER(LEN=12),   INTENT(IN) :: HREC     ! name of the article to be read
00370 REAL, DIMENSION(:),  INTENT(IN) :: PFIELD   ! array containing the data field
00371 INTEGER,             INTENT(OUT):: KRESP    ! KRESP  : return-code if a problem appears
00372  CHARACTER(LEN=100),  INTENT(IN) :: HCOMMENT
00373  CHARACTER(LEN=1),    INTENT(IN) :: HDIR     ! type of field :
00374                                             ! 'H' : field with
00375                                             !       horizontal spatial dim.
00376                                             ! '-' : no horizontal dim.
00377 !*      0.2   Declarations of local variables
00378 !
00379  CHARACTER(LEN=100)    :: YNAME
00380 LOGICAL               :: GKNOWN
00381 INTEGER               :: IFILE_ID, IVAR_ID, JDIM, INDIMS
00382 INTEGER               :: JRET
00383 INTEGER               :: INFOMPI
00384 INTEGER, DIMENSION(4) :: IDIMIDS
00385 INTEGER, DIMENSION(2) :: IDIMLEN
00386 INTEGER,DIMENSION(5)  :: IRET
00387 DOUBLE PRECISION   :: XTIME0
00388 REAL, DIMENSION(:), ALLOCATABLE :: ZTAB1D
00389 REAL, DIMENSION(:), ALLOCATABLE :: ZWORK_IGN
00390 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00391 !
00392 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFX1_OL',0,ZHOOK_HANDLE)
00393 !
00394 INDIMS = 0
00395 IDIMLEN(:) = 0
00396 YNAME = ""
00397 IRET(:) = 0
00398 !
00399 KRESP=0
00400 !
00401 !$OMP SINGLE
00402 !
00403  CALL IO_BUFF_n(HREC,'W',GKNOWN)
00404 !
00405 !$OMP END SINGLE COPYPRIVATE(GKNOWN)
00406 !
00407 IF (GKNOWN .AND. LHOOK) CALL DR_HOOK("WRITE_SURF_OL:WRITE_SURFX1_OL",1,ZHOOK_HANDLE)
00408 IF (GKNOWN) RETURN
00409 !
00410 IF (NRANK==NPIO) THEN 
00411   !
00412 #ifndef NOMPI  
00413   XTIME0 = MPI_WTIME()
00414 #endif
00415   !  
00416 !$OMP SINGLE
00417   !    
00418   ! 0. find filename
00419   ! -----------------
00420   CALL OL_FIND_FILE_WRITE(HREC,IFILE_ID)
00421   !
00422   IF (IFILE_ID /= 0) THEN
00423     !
00424     ! 1. Find id of the variable
00425     !----------------------------
00426     IRET(1)=NF_INQ_VARID   (IFILE_ID,HREC,IVAR_ID)
00427     IRET(2)=NF_INQ_VARNDIMS(IFILE_ID,IVAR_ID,INDIMS)
00428     IRET(3)=NF_INQ_VARDIMID(IFILE_ID,IVAR_ID,IDIMIDS(1:INDIMS))
00429     DO JDIM=1,2
00430       JRET=NF_INQ_DIMLEN(IFILE_ID,IDIMIDS(JDIM),IDIMLEN(JDIM))
00431     ENDDO
00432     !
00433     IRET(4)=NF_INQ_DIMNAME(IFILE_ID,IDIMIDS(1),YNAME)
00434     !
00435     ! 3. Check for errors
00436     !--------------------
00437     DO JRET=1,4
00438       IF (IFILE_ID==0 .OR. IRET(JRET).NE.NF_NOERR) KRESP=1
00439     ENDDO
00440     !
00441   ENDIF
00442   ! 
00443 !$OMP END SINGLE COPYPRIVATE(IFILE_ID,IVAR_ID,YNAME,INDIMS,IDIMIDS,IDIMLEN,KRESP)
00444   !  
00445 #ifndef NOMPI  
00446   XTIME_NPIO_WRITE = XTIME_NPIO_WRITE + (MPI_WTIME() - XTIME0)
00447 #endif
00448   !  
00449 ENDIF
00450 !
00451 IF (NPROC>1) THEN
00452 #ifndef NOMPI        
00453   XTIME0 = MPI_WTIME()
00454 !$OMP SINGLE  
00455   CALL MPI_BCAST(IFILE_ID,KIND(IFILE_ID)/4,MPI_INTEGER,NPIO,NCOMM,INFOMPI)
00456 !$OMP END SINGLE COPYPRIVATE(IFILE_ID)
00457   XTIME_COMM_WRITE = XTIME_COMM_WRITE + (MPI_WTIME() - XTIME0)
00458 #endif
00459 ENDIF
00460 !
00461 IF (IFILE_ID/=0) THEN
00462   !
00463   IF (YNAME .EQ. 'Number_of_points') THEN
00464     CALL WRITE_DATAX1_OL(IDIMLEN(1),INDIMS)
00465   ELSE
00466    CALL WRITE_DATAX1_OL(IDIMLEN(1)*IDIMLEN(2),INDIMS)
00467   ENDIF
00468   !
00469 ENDIF
00470 !
00471 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFX1_OL',1,ZHOOK_HANDLE)
00472 !
00473 CONTAINS
00474 !
00475 SUBROUTINE WRITE_DATAX1_OL(KDIM,KNDIMS)
00476 !
00477 USE MODI_GATHER_AND_WRITE_MPI
00478 USE MODI_UNPACK_SAME_RANK
00479 USE MODI_HANDLE_ERR
00480 !
00481 IMPLICIT NONE
00482 !
00483 INTEGER, INTENT(IN) :: KDIM
00484 INTEGER, INTENT(IN) :: KNDIMS
00485 !
00486 REAL, DIMENSION(KDIM) :: ZTAB1D
00487 REAL, DIMENSION(KDIM) :: ZWORK_IGN
00488 !
00489 INTEGER,   DIMENSION(KNDIMS) :: ISTART
00490 INTEGER,   DIMENSION(KNDIMS) :: ICOUNT
00491 INTEGER,   DIMENSION(KNDIMS) :: ISTRIDE
00492 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00493 !
00494 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFX1_OL:WRITE_DATAX1_OL',0,ZHOOK_HANDLE)
00495 !
00496 IF(.NOT.ALLOCATED(NMASK_IGN))THEN
00497   IF (LMASK) THEN
00498     CALL GATHER_AND_WRITE_MPI(PFIELD,ZTAB1D,NMASK)
00499   ELSE 
00500     CALL GATHER_AND_WRITE_MPI(PFIELD,ZTAB1D)
00501   ENDIF
00502 ELSE
00503   !ign grid 
00504   IF (LMASK) THEN
00505     CALL GATHER_AND_WRITE_MPI(PFIELD,ZWORK_IGN(1:SIZE(NMASK_IGN)),NMASK)
00506   ELSE 
00507     CALL GATHER_AND_WRITE_MPI(PFIELD,ZWORK_IGN(1:SIZE(NMASK_IGN)))
00508   ENDIF
00509   CALL UNPACK_SAME_RANK(NMASK_IGN,ZWORK_IGN(1:SIZE(NMASK_IGN)),ZTAB1D)
00510 ENDIF
00511 !
00512 IF (NRANK==NPIO) THEN
00513   !
00514 #ifndef NOMPI  
00515   XTIME0 = MPI_WTIME()
00516 #endif
00517   !
00518 !$OMP SINGLE
00519   !
00520   IF  (LPARTW) THEN
00521     ! write partially a time-matrix. 
00522     ! Have to find which of the dimension is the time dimension
00523     DO  JDIM=1,KNDIMS
00524       JRET=NF_INQ_DIMNAME(IFILE_ID,IDIMIDS(JDIM),YNAME)
00525       IF ((INDEX(YNAME,'time') > 0).OR.(INDEX(YNAME,'TIME') >0) &
00526             .OR.(INDEX(YNAME,'Time')>0.)) THEN
00527         ISTART(JDIM)=XSTARTW
00528         ICOUNT(JDIM)=XCOUNTW
00529         ISTRIDE(JDIM)=XSTRIDE
00530       ELSE
00531         ISTART(JDIM)=1
00532         ICOUNT(JDIM)=IDIMLEN(JDIM)
00533         ISTRIDE(JDIM)=1
00534       ENDIF
00535     ENDDO
00536     IRET(5)=NF_PUT_VARS_DOUBLE(IFILE_ID,IVAR_ID,ISTART,ICOUNT,ISTRIDE,ZTAB1D)
00537   ELSE
00538     IRET(5)=NF_PUT_VAR_DOUBLE(IFILE_ID,IVAR_ID,ZTAB1D)
00539   ENDIF
00540   !
00541   CALL HANDLE_ERR(IRET(5),HREC)
00542   !
00543 !$OMP END SINGLE NOWAIT
00544   !
00545 #ifndef NOMPI  
00546   XTIME_NPIO_WRITE = XTIME_NPIO_WRITE + (MPI_WTIME() - XTIME0)
00547 #endif
00548   !  
00549 ENDIF
00550 !
00551 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFX1_OL:WRITE_DATAX1_OL',1,ZHOOK_HANDLE)
00552 !
00553 END SUBROUTINE WRITE_DATAX1_OL
00554 !
00555 END SUBROUTINE WRITE_SURFX1_OL
00556 !
00557 !     #############################################################
00558       SUBROUTINE WRITE_SURFX2_OL(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
00559 !     #############################################################
00560 !
00561 !!****  *WRITEX2* - routine to fill a real 2D array for the externalised surface 
00562 !
00563 USE MODD_SURFEX_MPI, ONLY : NRANK, NPIO, NCOMM, NPROC, XTIME_NPIO_WRITE, &
00564                             XTIME_COMM_WRITE
00565 !
00566 USE MODD_SURFEX_OMP, ONLY : PLOG_OMP
00567 !
00568 USE MODD_IO_SURF_OL, ONLY: LMASK, NMASK, NMASK_IGN, XSTART, XSTRIDE, &
00569                            LPARTW, XSTARTW, XCOUNTW
00570 !
00571 USE MODI_OL_FIND_FILE_WRITE
00572 !
00573 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00574 USE PARKIND1  ,ONLY : JPRB
00575 !
00576 IMPLICIT NONE
00577 !
00578 INCLUDE "netcdf.inc"
00579 !
00580 #ifndef NOMPI
00581 INCLUDE "mpif.h"
00582 #endif
00583 !
00584 !*      0.1   Declarations of arguments
00585 !
00586  CHARACTER(LEN=12),    INTENT(IN) :: HREC     ! name of the article to be read
00587 REAL, DIMENSION(:,:), INTENT(IN) :: PFIELD   ! array containing the data field
00588 INTEGER,              INTENT(OUT):: KRESP    ! KRESP  : return-code if a problem appears
00589  CHARACTER(LEN=100),   INTENT(IN) :: HCOMMENT
00590  CHARACTER(LEN=1),     INTENT(IN) :: HDIR     ! type of field :
00591                                              ! 'H' : field with
00592                                              !       horizontal spatial dim.
00593                                              ! '-' : no horizontal dim.
00594 !*      0.2   Declarations of local variables
00595 !
00596  CHARACTER(LEN=100)    :: YNAME
00597 INTEGER               :: IFILE_ID, IVAR_ID, JDIM, INDIMS
00598 INTEGER               :: JRET
00599 INTEGER               :: INFOMPI
00600 INTEGER, DIMENSION(4) :: IDIMIDS
00601 INTEGER, DIMENSION(4) :: IDIMLEN
00602 INTEGER, DIMENSION(5) :: IRET
00603 DOUBLE PRECISION      :: XTIME0
00604 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00605 !
00606 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFX2_OL',0,ZHOOK_HANDLE)
00607 !
00608 INDIMS = 0
00609 IDIMLEN(:) = 0
00610 YNAME = ""
00611 !
00612 KRESP=0
00613 !
00614 IF (NRANK==NPIO) THEN
00615   !
00616 #ifndef NOMPI  
00617   XTIME0 = MPI_WTIME()
00618 #endif
00619   !  
00620 !$OMP SINGLE
00621   !  
00622   ! 0. find filename
00623   ! -----------------
00624   CALL OL_FIND_FILE_WRITE(HREC,IFILE_ID)
00625   !
00626   IF ( IFILE_ID /= 0 ) THEN
00627     !
00628     ! 1. Find id of the variable
00629     !----------------------------
00630     !
00631     IRET(1)=NF_INQ_VARID   (IFILE_ID,HREC,IVAR_ID)
00632     IRET(2)=NF_INQ_VARNDIMS(IFILE_ID,IVAR_ID,INDIMS)  
00633     IRET(3)=NF_INQ_VARDIMID(IFILE_ID,IVAR_ID,IDIMIDS(1:INDIMS))  
00634     DO JDIM=1,INDIMS
00635       JRET=NF_INQ_DIMLEN(IFILE_ID,IDIMIDS(JDIM),IDIMLEN(JDIM))
00636       IF (JRET.NE.NF_NOERR) KRESP=1
00637     ENDDO
00638     !
00639     IRET(4)=NF_INQ_DIMNAME(IFILE_ID,IDIMIDS(1),YNAME)
00640     !  
00641   ENDIF
00642   !
00643   DO JRET=1,4
00644     IF (IFILE_ID==0 .OR. IRET(JRET).NE.NF_NOERR) KRESP=1
00645   ENDDO
00646   !
00647 !$OMP END SINGLE COPYPRIVATE(IFILE_ID,IVAR_ID,YNAME,INDIMS,IDIMIDS,IDIMLEN,KRESP)
00648   !
00649 #ifndef NOMPI  
00650   XTIME_NPIO_WRITE = XTIME_NPIO_WRITE + (MPI_WTIME() - XTIME0)
00651 #endif
00652   !  
00653 ENDIF
00654 !
00655 IF (NPROC>1) THEN
00656 #ifndef NOMPI        
00657   XTIME0 = MPI_WTIME()
00658 !$OMP SINGLE  
00659   CALL MPI_BCAST(IFILE_ID,KIND(IFILE_ID)/4,MPI_INTEGER,NPIO,NCOMM,INFOMPI)
00660 !$OMP END SINGLE COPYPRIVATE(IFILE_ID)
00661   XTIME_COMM_WRITE = XTIME_COMM_WRITE + (MPI_WTIME() - XTIME0)  
00662 #endif
00663 ENDIF
00664 !
00665 IF (IFILE_ID/=0) THEN
00666   !
00667   IF (YNAME .EQ. 'Number_of_points') THEN
00668     CALL WRITE_DATAX2_OL(IDIMLEN(1),IDIMLEN(2),INDIMS)
00669   ELSE
00670     CALL WRITE_DATAX2_OL(IDIMLEN(1)*IDIMLEN(2),IDIMLEN(3),INDIMS)
00671   ENDIF
00672   !
00673 ENDIF
00674 !
00675 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFX2_OL',1,ZHOOK_HANDLE)
00676 !
00677 CONTAINS
00678 !
00679 SUBROUTINE WRITE_DATAX2_OL(KDIM1,KDIM2,KNDIMS)
00680 !
00681 USE MODI_GATHER_AND_WRITE_MPI
00682 USE MODI_UNPACK_SAME_RANK
00683 USE MODI_HANDLE_ERR
00684 !
00685 IMPLICIT NONE
00686 !
00687 INTEGER, INTENT(IN) :: KDIM1
00688 INTEGER, INTENT(IN) :: KDIM2
00689 INTEGER, INTENT(IN) :: KNDIMS
00690 !
00691 REAL, DIMENSION(KDIM1,KDIM2) :: ZTAB2D    ! work array read in the file
00692 REAL, DIMENSION(KDIM1,KDIM2) :: ZWORK_IGN ! work array read in the file
00693 INTEGER,         DIMENSION(KNDIMS) :: ISTART
00694 INTEGER,         DIMENSION(KNDIMS) :: ISTRIDE
00695 INTEGER,         DIMENSION(KNDIMS) :: ICOUNT
00696 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00697 !
00698 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFX2_OL:WRITE_DATAX2_OL',0,ZHOOK_HANDLE)
00699 !
00700 IF(.NOT.ALLOCATED(NMASK_IGN))THEN
00701   IF (LMASK) THEN
00702     CALL GATHER_AND_WRITE_MPI(PFIELD,ZTAB2D,NMASK)
00703   ELSE 
00704     CALL GATHER_AND_WRITE_MPI(PFIELD,ZTAB2D)
00705   ENDIF
00706 ELSE
00707   !ign grid 
00708   IF (LMASK) THEN
00709     CALL GATHER_AND_WRITE_MPI(PFIELD,ZWORK_IGN(1:SIZE(NMASK_IGN),:),NMASK)
00710   ELSE 
00711     CALL GATHER_AND_WRITE_MPI(PFIELD,ZWORK_IGN(1:SIZE(NMASK_IGN),:))
00712   ENDIF
00713   CALL UNPACK_SAME_RANK(NMASK_IGN,ZWORK_IGN(1:SIZE(NMASK_IGN),:),ZTAB2D)
00714 ENDIF
00715 !
00716 IF (NRANK==NPIO) THEN
00717   !
00718 #ifndef NOMPI  
00719   XTIME0 = MPI_WTIME()
00720 #endif
00721   !   
00722 !$OMP SINGLE
00723   !   
00724   ! 2. Put variable
00725   !----------------------------
00726   IF (LPARTW) THEN
00727     ! write partially a time-matrix. 
00728     ! Have to find which of the dimension is the time dimension
00729     DO  JDIM=1,KNDIMS
00730       JRET=NF_INQ_DIMNAME(IFILE_ID,IDIMIDS(JDIM),YNAME)
00731       IF ((INDEX(YNAME,'time') > 0).OR.(INDEX(YNAME,'TIME') >0) &
00732          .OR.(INDEX(YNAME,'Time')>0.)) THEN  
00733         ISTART(JDIM)=XSTARTW
00734         ICOUNT(JDIM)=XCOUNTW
00735         ISTRIDE(JDIM)=XSTRIDE
00736       ELSE
00737         ISTART(JDIM)=1
00738         ICOUNT(JDIM)=IDIMLEN(JDIM)
00739         ISTRIDE(JDIM)=1
00740       ENDIF
00741     ENDDO
00742     IRET(5)=NF_PUT_VARS_DOUBLE(IFILE_ID,IVAR_ID,ISTART,ICOUNT,ISTRIDE,ZTAB2D)
00743   ELSE
00744     IRET(5)=NF_PUT_VAR_DOUBLE(IFILE_ID,IVAR_ID,ZTAB2D)
00745   ENDIF
00746   !    
00747   CALL HANDLE_ERR(IRET(5),HREC)  
00748   !
00749 !$OMP END SINGLE NOWAIT
00750   !
00751 #ifndef NOMPI  
00752   XTIME_NPIO_WRITE = XTIME_NPIO_WRITE + (MPI_WTIME() - XTIME0)
00753 #endif
00754   !  
00755 ENDIF
00756 !
00757 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFX2_OL:WRITE_DATAX2_OL',1,ZHOOK_HANDLE)
00758 !
00759 END SUBROUTINE WRITE_DATAX2_OL
00760 !
00761 END SUBROUTINE WRITE_SURFX2_OL
00762 
00763 !     #############################################################
00764       SUBROUTINE WRITE_SURFN1_OL(HREC,KFIELD,KRESP,HCOMMENT,HDIR)
00765 !     #############################################################
00766 !
00767 !!****  *WRITEN0* - routine to read an integer
00768 !
00769 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00770 USE PARKIND1  ,ONLY : JPRB
00771 !
00772 IMPLICIT NONE
00773 !
00774 !*      0.1   Declarations of arguments
00775 !
00776  CHARACTER(LEN=12),      INTENT(IN)  :: HREC     ! name of the article to be read
00777 INTEGER, DIMENSION(:),  INTENT(IN)  :: KFIELD   ! the integer scalar to be read
00778 INTEGER,                INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
00779  CHARACTER(LEN=100),     INTENT(IN)  :: HCOMMENT
00780  CHARACTER(LEN=1),       INTENT(IN) :: HDIR     ! type of field :
00781                                                ! 'H' : field with
00782                                                !       horizontal spatial dim.
00783                                                ! '-' : no horizontal dim.
00784 !*      0.2   Declarations of local variables
00785 !
00786 REAL, DIMENSION(SIZE(KFIELD)) :: ZFIELD 
00787 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00788 !
00789 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFN1_OL',0,ZHOOK_HANDLE)
00790 !
00791 ZFIELD=FLOAT(KFIELD)
00792  CALL WRITE_SURFX1_OL(HREC,ZFIELD,KRESP,HCOMMENT,HDIR)
00793 !
00794 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFN1_OL',1,ZHOOK_HANDLE)
00795 !
00796 END SUBROUTINE WRITE_SURFN1_OL
00797 !
00798 !     #############################################################
00799       SUBROUTINE WRITE_SURFL1_OL(HREC,OFIELD,KRESP,HCOMMENT,HDIR)
00800 !     #############################################################
00801 !
00802 !!****  *WRITEL1* - routine to read a logical array
00803 !    
00804 USE MODD_SURFEX_MPI, ONLY : NRANK, NPIO, XTIME_NPIO_WRITE
00805 !
00806 USE MODI_OL_FIND_FILE_WRITE
00807 USE MODI_HANDLE_ERR
00808 !
00809 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00810 USE PARKIND1  ,ONLY : JPRB
00811 !
00812 IMPLICIT NONE
00813 !
00814 INCLUDE "netcdf.inc"
00815 !
00816 #ifndef NOMPI
00817 INCLUDE "mpif.h"
00818 #endif
00819 !
00820 !*      0.1   Declarations of arguments
00821 !
00822  CHARACTER(LEN=*),      INTENT(IN) :: HREC     ! name of the article to be read
00823 LOGICAL, DIMENSION(:), INTENT(IN) :: OFIELD   ! array containing the data field
00824 INTEGER,               INTENT(OUT):: KRESP    ! KRESP  : return-code if a problem appears
00825  CHARACTER(LEN=100),    INTENT(IN) :: HCOMMENT
00826  CHARACTER(LEN=1),      INTENT(IN) :: HDIR     ! type of field :
00827                                               ! 'H' : field with
00828                                               !       horizontal spatial dim.
00829                                               ! '-' : no horizontal dim.
00830 !*      0.2   Declarations of local variables
00831 !
00832 INTEGER               :: IFILE_ID, IVAR_ID, JDIM, INDIMS
00833 INTEGER               :: JRET
00834 INTEGER, DIMENSION(4) :: IDIMIDS
00835 INTEGER, DIMENSION(1) :: IDIMLEN
00836 INTEGER, DIMENSION(4) :: IRET
00837 DOUBLE PRECISION      :: XTIME0
00838 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00839 !
00840 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFL1_OL',0,ZHOOK_HANDLE)
00841 !
00842 KRESP=0
00843 !
00844 IF ( NRANK==NPIO ) THEN
00845   !
00846 #ifndef NOMPI  
00847   XTIME0 = MPI_WTIME()
00848 #endif
00849 
00850   !
00851 !$OMP SINGLE
00852   !   
00853   ! 0. find filename
00854   ! -----------------
00855   CALL OL_FIND_FILE_WRITE(HREC,IFILE_ID)
00856   ! 
00857   IF (IFILE_ID /= 0) THEN
00858     !       
00859     ! 1. Find id of the variable
00860     !----------------------------
00861     IRET(1)=NF_INQ_VARID   (IFILE_ID,HREC,IVAR_ID)
00862     IRET(2)=NF_INQ_VARNDIMS(IFILE_ID,IVAR_ID,INDIMS)
00863     IRET(3)=NF_INQ_VARDIMID(IFILE_ID,IVAR_ID,IDIMIDS(1:INDIMS))
00864     DO JDIM=1,1
00865       JRET=NF_INQ_DIMLEN(IFILE_ID,IDIMIDS(JDIM),IDIMLEN(JDIM))
00866     ENDDO  
00867     !
00868     CALL WRITE_DATAL1_OL(IDIMLEN(1))
00869     !
00870   ENDIF
00871   !
00872   ! 3. Check for errors
00873   !--------------------
00874   DO JRET=1,4
00875     IF (IFILE_ID==0 .OR. IRET(JRET).NE.NF_NOERR) KRESP=1
00876   ENDDO
00877   !
00878 !$OMP END SINGLE
00879   !   
00880 #ifndef NOMPI  
00881   XTIME_NPIO_WRITE = XTIME_NPIO_WRITE + (MPI_WTIME() - XTIME0)
00882 #endif
00883   !
00884 ENDIF
00885 !
00886 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFL1_OL',1,ZHOOK_HANDLE)
00887 !
00888 CONTAINS
00889 !
00890 SUBROUTINE WRITE_DATAL1_OL(KDIM)
00891 !
00892 INTEGER, INTENT(IN) :: KDIM
00893 !
00894  CHARACTER(LEN=1), DIMENSION(KDIM) :: YTAB1D  ! work array read in the file
00895 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00896 !
00897 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFL1_OL:WRITE_DATAL1_OL',0,ZHOOK_HANDLE)
00898 !
00899 DO JRET=1,KDIM
00900   IF (OFIELD(JRET)) THEN
00901     YTAB1D(JRET) ='T'
00902   ELSE
00903     YTAB1D(JRET) ='F'
00904   ENDIF
00905 ENDDO  
00906 !
00907 ! 2. Put variable
00908 !-----------------
00909 IRET(4)=NF_PUT_VAR_TEXT(IFILE_ID,IVAR_ID,YTAB1D)
00910 !
00911  CALL HANDLE_ERR(IRET(4),HREC)
00912 !
00913 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFL1_OL:WRITE_DATAL1_OL',1,ZHOOK_HANDLE)
00914 END SUBROUTINE WRITE_DATAL1_OL
00915 !
00916 END SUBROUTINE WRITE_SURFL1_OL
00917 !
00918 !
00919 !     #############################################################
00920       SUBROUTINE WRITE_SURFT0_OL(HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
00921 !     #############################################################
00922 !
00923 !!****  *WRITET0* - routine to read a NETCDF  date_time scalar
00924 !
00925 USE MODD_TYPE_DATE_SURF
00926 !
00927 USE MODI_OL_FIND_FILE_WRITE
00928 !
00929 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00930 USE PARKIND1  ,ONLY : JPRB
00931 !
00932 IMPLICIT NONE
00933 !
00934 INCLUDE "netcdf.inc"
00935 !
00936 !*      0.1   Declarations of arguments
00937 !
00938  CHARACTER(LEN=12),  INTENT(IN)  :: HREC     ! name of the article to be read
00939 INTEGER,            INTENT(IN)  :: KYEAR    ! year
00940 INTEGER,            INTENT(IN)  :: KMONTH   ! month
00941 INTEGER,            INTENT(IN)  :: KDAY     ! day
00942 REAL,               INTENT(IN)  :: PTIME    ! time
00943 INTEGER,            INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
00944  CHARACTER(LEN=100), INTENT(IN)  :: HCOMMENT
00945 !
00946 !*      0.2   Declarations of local variables
00947 !
00948  CHARACTER(LEN=12) :: YRECFM    ! Name of the article to be written
00949 INTEGER :: IFILE_ID, IVAR_ID, JRET, JWRK
00950 INTEGER :: JLEN
00951 INTEGER,DIMENSION(3) :: ITDATE  ! work array read in the file
00952 INTEGER,DIMENSION(4) :: IRET
00953 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00954 !
00955 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFT0_OL',0,ZHOOK_HANDLE)
00956 !
00957 KRESP=0
00958 !
00959 DO JWRK=1,2
00960   !
00961   IF (JWRK == 1) THEN 
00962     YRECFM=TRIM(HREC)//'-TDATE'
00963     JLEN=3
00964   ELSE
00965     YRECFM=TRIM(HREC)//'-TIME'
00966     JLEN=1
00967   ENDIF
00968   ! 0. find filename
00969   ! -----------------
00970   CALL OL_FIND_FILE_WRITE(YRECFM,IFILE_ID)
00971   !
00972   IF (IFILE_ID /= 0) THEN
00973     !    
00974     ! 1. Find id of the variable
00975     !----------------------------
00976     IRET(1+JWRK*2)=NF_INQ_VARID   (IFILE_ID,YRECFM,IVAR_ID)
00977     IF (JWRK == 1) THEN 
00978       ITDATE(1)=KYEAR
00979       ITDATE(2)=KMONTH
00980       ITDATE(3)=KDAY
00981       IRET(JWRK)=NF_PUT_VAR_INT(IFILE_ID,IVAR_ID,ITDATE)
00982     ELSE
00983       JLEN=1
00984       IRET(JWRK)=NF_PUT_VAR_DOUBLE(IFILE_ID,IVAR_ID,PTIME)
00985     ENDIF
00986   ENDIF
00987 ENDDO
00988 !
00989 ! 3. Check for errors
00990 !--------------------
00991 DO JRET=1,4
00992   IF (IFILE_ID==0.OR.IRET(JRET).NE.NF_NOERR) KRESP=1
00993 ENDDO
00994 !
00995 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_OL:WRITE_SURFT0_OL',1,ZHOOK_HANDLE)
00996 !
00997 END SUBROUTINE WRITE_SURFT0_OL
00998 
00999 END MODULE MODE_WRITE_SURF_OL