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