|
SURFEX v7.3
General documentation of Surfex
|
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
1.8.0