SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/mode_write_surf_fa.F90
Go to the documentation of this file.
00001 MODULE MODE_WRITE_SURF_FA
00002 !
00003 INTERFACE WRITE_SURF0_FA
00004         MODULE PROCEDURE WRITE_SURFX0_FA
00005         MODULE PROCEDURE WRITE_SURFN0_FA
00006         MODULE PROCEDURE WRITE_SURFL0_FA
00007         MODULE PROCEDURE WRITE_SURFC0_FA
00008 END INTERFACE
00009 INTERFACE WRITE_SURFN_FA
00010         MODULE PROCEDURE WRITE_SURFX1_FA
00011         MODULE PROCEDURE WRITE_SURFN1_FA
00012         MODULE PROCEDURE WRITE_SURFL1_FA
00013         MODULE PROCEDURE WRITE_SURFX2_FA
00014 END INTERFACE
00015 INTERFACE WRITE_SURFT_FA
00016         MODULE PROCEDURE WRITE_SURFT0_FA
00017         MODULE PROCEDURE WRITE_SURFT2_FA
00018 END INTERFACE
00019 !
00020 CONTAINS
00021 !
00022 !     #############################################################
00023       SUBROUTINE WRITE_SURFX0_FA(HREC,PFIELD,KRESP,HCOMMENT)
00024 !     #############################################################
00025 !
00026 !!****  * - routine to write a real scalar
00027 !
00028 USE MODD_IO_SURF_FA, ONLY : NUNIT_FA, CMASK, LFANOCOMPACT
00029 !
00030 USE MODE_FASURFEX
00031 !
00032 USE MODI_IO_BUFF_n
00033 USE MODI_ERROR_WRITE_SURF_FA
00034 !
00035 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00036 USE PARKIND1  ,ONLY : JPRB
00037 !
00038 IMPLICIT NONE
00039 !
00040 !*      0.1   Declarations of arguments
00041 !
00042  CHARACTER(LEN=12),  INTENT(IN) :: HREC     ! name of the article to be read
00043 REAL,               INTENT(IN) :: PFIELD   ! the real scalar to be read
00044 INTEGER,            INTENT(OUT):: KRESP    ! KRESP  : return-code if a problem appears
00045  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! comment string
00046 !
00047 !*      0.2   Declarations of local variables
00048 !
00049 LOGICAL          :: GKNOWN
00050  CHARACTER(LEN=18):: YNAME                  ! Field Name
00051 INTEGER          :: INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL
00052 REAL(KIND=JPRB)  :: ZHOOK_HANDLE
00053 !
00054 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:ERROR_WRITE_SURF_FA:WRITE_SURFX0_FA',0,ZHOOK_HANDLE)
00055 !
00056 KRESP=0
00057 !
00058  CALL IO_BUFF_n(HREC,'W',GKNOWN)
00059 IF (GKNOWN .AND. LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFX0_FA',1,ZHOOK_HANDLE)
00060 IF (GKNOWN) RETURN
00061 !
00062 IF(LFANOCOMPACT)THEN
00063   CALL FAVEUR(KRESP,NUNIT_FA,INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00064   ! -- Pour ecrire sans compactage
00065   CALL FAGOTE(KRESP,NUNIT_FA,-1,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00066 ENDIF
00067 !
00068 YNAME=TRIM(CMASK)//TRIM(HREC)
00069  CALL  FAECR_R(KRESP,NUNIT_FA,YNAME,PFIELD)
00070 IF (KRESP/=0) THEN
00071   CALL ERROR_WRITE_SURF_FA(HREC,KRESP)
00072 ENDIF
00073 !
00074 IF(LFANOCOMPACT)THEN
00075   ! On remet la valeur par defaut 
00076   CALL FAGOTE(KRESP,NUNIT_FA,INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00077 ENDIF
00078 !
00079 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFX0_FA',1,ZHOOK_HANDLE)
00080 !
00081 END SUBROUTINE WRITE_SURFX0_FA
00082 !
00083 !     #############################################################
00084       SUBROUTINE WRITE_SURFN0_FA(HREC,KFIELD,KRESP,HCOMMENT)
00085 !     #############################################################
00086 !
00087 !!****  * - routine to write an integer
00088 !
00089 USE MODD_IO_SURF_FA, ONLY : NUNIT_FA, NMASK, CMASK, LFANOCOMPACT
00090 !
00091 USE MODE_FASURFEX
00092 !
00093 USE MODI_IO_BUFF_n
00094 USE MODI_ERROR_WRITE_SURF_FA
00095 !
00096 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00097 USE PARKIND1  ,ONLY : JPRB
00098 !
00099 IMPLICIT NONE
00100 !
00101 !*      0.1   Declarations of arguments
00102 !
00103  CHARACTER(LEN=12),  INTENT(IN) :: HREC     ! name of the article to be read
00104 INTEGER,            INTENT(IN) :: KFIELD   ! the integer to be read
00105 INTEGER,            INTENT(OUT):: KRESP    ! KRESP  : return-code if a problem appears
00106  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! comment string
00107 !
00108 !*      0.2   Declarations of local variables
00109 !
00110  CHARACTER(LEN=18):: YNAME                  ! Field Name
00111 LOGICAL          :: GKNOWN
00112 INTEGER          :: INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL
00113 REAL(KIND=JPRB)  :: ZHOOK_HANDLE
00114 !
00115 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFN0_FA',0,ZHOOK_HANDLE)
00116 !
00117 KRESP=0
00118 !
00119  CALL IO_BUFF_n(HREC,'W',GKNOWN)
00120 IF (GKNOWN .AND. LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFN0_FA',1,ZHOOK_HANDLE)
00121 IF (GKNOWN) RETURN
00122 !
00123 IF(LFANOCOMPACT)THEN
00124   CALL FAVEUR(KRESP,NUNIT_FA,INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00125   ! -- Pour ecrire sans compactage
00126   CALL FAGOTE(KRESP,NUNIT_FA,-1,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00127 ENDIF
00128 !
00129 YNAME=TRIM(CMASK)//TRIM(HREC)
00130  CALL  FAECR_I(KRESP,NUNIT_FA,YNAME,KFIELD)
00131 IF (KRESP/=0) THEN
00132   CALL ERROR_WRITE_SURF_FA(HREC,KRESP)
00133 ENDIF
00134 !
00135 IF(LFANOCOMPACT)THEN
00136   ! On remet la valeur par defaut 
00137   CALL FAGOTE(KRESP,NUNIT_FA,INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00138 ENDIF
00139 !
00140 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFN0_FA',1,ZHOOK_HANDLE)
00141 !
00142 END SUBROUTINE WRITE_SURFN0_FA
00143 !
00144 !     #############################################################
00145       SUBROUTINE WRITE_SURFL0_FA(HREC,OFIELD,KRESP,HCOMMENT)
00146 !     #############################################################
00147 !
00148 !!****  * - routine to write a logical
00149 !
00150 USE MODD_IO_SURF_FA, ONLY : NUNIT_FA, CMASK, LFANOCOMPACT
00151 !
00152 USE MODE_FASURFEX
00153 !
00154 USE MODI_IO_BUFF_n
00155 USE MODI_ERROR_WRITE_SURF_FA
00156 !
00157 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00158 USE PARKIND1  ,ONLY : JPRB
00159 !
00160 IMPLICIT NONE
00161 !
00162 !*      0.1   Declarations of arguments
00163 !
00164  CHARACTER(LEN=12),  INTENT(IN) :: HREC     ! name of the article to be read
00165 LOGICAL,            INTENT(IN) :: OFIELD   ! array containing the data field
00166 INTEGER,            INTENT(OUT):: KRESP    ! KRESP  : return-code if a problem appears
00167  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT ! comment string
00168 !
00169 !*      0.2   Declarations of local variables
00170 !
00171  CHARACTER(LEN=18):: YNAME ! Field Name
00172 LOGICAL          :: GKNOWN
00173 INTEGER          :: INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL
00174 REAL(KIND=JPRB)  :: ZHOOK_HANDLE
00175 !
00176 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFL0_FA',0,ZHOOK_HANDLE)
00177 !
00178 KRESP=0
00179 !
00180  CALL IO_BUFF_n(HREC,'W',GKNOWN)
00181 IF (GKNOWN .AND. LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFL0_FA',1,ZHOOK_HANDLE)
00182 IF (GKNOWN) RETURN
00183 !
00184 IF(LFANOCOMPACT)THEN
00185   CALL FAVEUR(KRESP,NUNIT_FA,INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00186   ! -- Pour ecrire sans compactage
00187   CALL FAGOTE(KRESP,NUNIT_FA,-1,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00188 ENDIF
00189 !
00190 YNAME=TRIM(CMASK)//TRIM(HREC)
00191  CALL  FAECR_L(KRESP,NUNIT_FA,YNAME,OFIELD)
00192 IF (KRESP/=0) THEN
00193   CALL ERROR_WRITE_SURF_FA(HREC,KRESP)
00194 ENDIF
00195 !
00196 IF(LFANOCOMPACT)THEN
00197   ! On remet la valeur par defaut 
00198   CALL FAGOTE(KRESP,NUNIT_FA,INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00199 ENDIF
00200 !
00201 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFL0_FA',1,ZHOOK_HANDLE)
00202 !
00203 END SUBROUTINE WRITE_SURFL0_FA
00204 !
00205 !     #############################################################
00206       SUBROUTINE WRITE_SURFC0_FA(HREC,HFIELD,KRESP,HCOMMENT)
00207 !     #############################################################
00208 !
00209 !!****  * - routine to write a character
00210 !
00211 USE MODD_IO_SURF_FA, ONLY : NUNIT_FA, CMASK, LFANOCOMPACT
00212 !
00213 USE MODE_FASURFEX
00214 !
00215 USE MODI_IO_BUFF_n
00216 USE MODI_ERROR_WRITE_SURF_FA
00217 !
00218 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00219 USE PARKIND1  ,ONLY : JPRB
00220 !
00221 IMPLICIT NONE
00222 !
00223 !*      0.1   Declarations of arguments
00224 !
00225  CHARACTER(LEN=12),  INTENT(IN)  :: HREC      ! name of the article to be read
00226  CHARACTER(LEN=40),  INTENT(IN)  :: HFIELD    ! the integer to be read
00227 INTEGER,            INTENT(OUT) :: KRESP     ! KRESP  : return-code if a problem appears
00228  CHARACTER(LEN=100), INTENT(IN)  :: HCOMMENT  ! comment string
00229 !
00230 !*      0.2   Declarations of local variables
00231 !
00232  CHARACTER,DIMENSION(40)  :: YFIELD
00233  CHARACTER(LEN=18)        :: YNAME ! Field Name
00234 LOGICAL                  :: GKNOWN
00235 INTEGER                  :: INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL
00236 REAL(KIND=JPRB)          :: ZHOOK_HANDLE
00237 !
00238 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFC0_FA',0,ZHOOK_HANDLE)
00239 !
00240 KRESP=0
00241 !
00242  CALL IO_BUFF_n(HREC,'W',GKNOWN)
00243 IF (GKNOWN .AND. LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFC0_FA',1,ZHOOK_HANDLE)
00244 IF (GKNOWN) RETURN
00245 !
00246 IF(LFANOCOMPACT)THEN
00247   CALL FAVEUR(KRESP,NUNIT_FA,INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00248   ! -- Pour ecrire sans compactage
00249   CALL FAGOTE(KRESP,NUNIT_FA,-1,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00250 ENDIF
00251 !
00252 READ(HFIELD,'(40A1)') YFIELD
00253 YNAME=TRIM(CMASK)//TRIM(HREC)
00254  CALL  FAECR_C(KRESP,NUNIT_FA,YNAME,40,YFIELD)
00255 IF (KRESP/=0) THEN
00256   CALL ERROR_WRITE_SURF_FA(HREC,KRESP)
00257 ENDIF
00258 !
00259 IF(LFANOCOMPACT)THEN
00260   ! On remet la valeur par defaut 
00261   CALL FAGOTE(KRESP,NUNIT_FA,INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00262 ENDIF
00263 !
00264 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFC0_FA',1,ZHOOK_HANDLE)
00265 !
00266 END SUBROUTINE WRITE_SURFC0_FA
00267 !
00268 !     #############################################################
00269       SUBROUTINE WRITE_SURFX1_FA(HREC,KL,PFIELD,KRESP,HCOMMENT,HDIR)
00270 !     #############################################################
00271 !
00272 !!****  * - routine to fill a write 1D array for the externalised surface 
00273 !
00274 USE MODD_SURFEX_MPI, ONLY : NRANK, NPIO, XTIME_NPIO_WRITE, WLOG_MPI
00275 !
00276 USE MODD_IO_SURF_FA, ONLY : NUNIT_FA, NMASK, NFULL, CMASK, &
00277                             LFANOCOMPACT 
00278 USE MODD_SURF_PAR,   ONLY : XUNDEF
00279 !
00280 USE MODI_IO_BUFF_n
00281 USE MODI_ERROR_WRITE_SURF_FA
00282 USE MODI_GATHER_AND_WRITE_MPI
00283 !
00284 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00285 USE PARKIND1  ,ONLY : JPRB
00286 !
00287 IMPLICIT NONE
00288 !
00289 #ifndef NOMPI
00290 INCLUDE "mpif.h"
00291 #endif
00292 !
00293 !*      0.1   Declarations of arguments
00294 !
00295  CHARACTER(LEN=12),   INTENT(IN) :: HREC     ! name of the article to be read
00296 INTEGER,             INTENT(IN) :: KL       ! number of points
00297 REAL, DIMENSION(KL), INTENT(IN) :: PFIELD   ! array containing the data field
00298 INTEGER,             INTENT(OUT):: KRESP    ! KRESP  : return-code if a problem appears
00299  CHARACTER(LEN=100),  INTENT(IN) :: HCOMMENT ! comment string
00300  CHARACTER(LEN=1),    INTENT(IN) :: HDIR     ! type of field :
00301                                             ! 'H' : field with
00302                                             !       horizontal spatial dim.
00303                                             ! '-' : no horizontal dim.
00304 !*      0.2   Declarations of local variables
00305 !
00306 LOGICAL                :: GKNOWN
00307 INTEGER                :: I,INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL
00308 REAL                   :: ZMEAN, ZCOUNT
00309 DOUBLE PRECISION       :: XTIME0
00310 REAL, DIMENSION(MAX(NFULL,SIZE(PFIELD))) :: ZWORK   ! work array read in the file
00311 REAL(KIND=JPRB)        :: ZHOOK_HANDLE
00312 !
00313 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFX1_FA',0,ZHOOK_HANDLE)
00314 !
00315 KRESP=0
00316 !
00317 !$OMP SINGLE
00318 !
00319  CALL IO_BUFF_n(HREC,'W',GKNOWN)
00320 !
00321 !$OMP END SINGLE COPYPRIVATE(GKNOWN)
00322 !
00323 IF (GKNOWN .AND. LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFX1_FA',1,ZHOOK_HANDLE)
00324 IF (GKNOWN) RETURN
00325 !
00326 IF(HDIR=='H')THEN
00327   CALL GATHER_AND_WRITE_MPI(PFIELD,ZWORK,NMASK)
00328 ELSE !no horizontal dim. case (not masked)
00329   ZWORK(1:KL)=PFIELD(1:KL)
00330   ZWORK(KL+1:NFULL)=SUM(PFIELD(1:KL))/REAL(KL)
00331 ENDIF
00332 !
00333 IF (NRANK==NPIO) THEN
00334   !
00335 #ifndef NOMPI  
00336   XTIME0 = MPI_WTIME()
00337 #endif
00338   !
00339 !$OMP SINGLE
00340   !   
00341   IF(LFANOCOMPACT)THEN
00342     CALL FAVEUR(KRESP,NUNIT_FA,INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00343     ! -- Pour ecrire sans compactage
00344     CALL FAGOTE(KRESP,NUNIT_FA,-1,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00345     CALL FAIENC(KRESP,NUNIT_FA,'S1D_',0,HREC,ZWORK,.FALSE.)
00346     IF (KRESP/=0) CALL ERROR_WRITE_SURF_FA(HREC,KRESP)
00347     ! On remet la valeur par defaut 
00348     CALL FAGOTE(KRESP,NUNIT_FA,INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00349   ELSE
00350     ZMEAN =0.0
00351     ZCOUNT=0.0
00352     DO I=1,NFULL
00353       IF(ZWORK(I)/=XUNDEF)THEN
00354         ZMEAN =ZMEAN+ZWORK(I)
00355         ZCOUNT=ZCOUNT+1.0
00356       ENDIF
00357     ENDDO
00358     IF (ZCOUNT.GT.0.0) ZMEAN=ZMEAN/ZCOUNT
00359     WHERE(ZWORK(:)==XUNDEF)ZWORK(:)=ZMEAN
00360     CALL FAIENC(KRESP,NUNIT_FA,'S1D_',0,HREC,ZWORK,.FALSE.)
00361     IF (KRESP/=0) CALL ERROR_WRITE_SURF_FA(HREC,KRESP)
00362   ENDIF
00363   !
00364 !$OMP END SINGLE COPYPRIVATE(KRESP)
00365   !    
00366 #ifndef NOMPI  
00367   XTIME_NPIO_WRITE = XTIME_NPIO_WRITE + (MPI_WTIME() - XTIME0)
00368 #endif
00369   !
00370 ENDIF
00371 !
00372 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFX1_FA',1,ZHOOK_HANDLE)
00373 !
00374 END SUBROUTINE WRITE_SURFX1_FA
00375 !
00376 !     #############################################################
00377       SUBROUTINE WRITE_SURFX2_FA(HREC,KL1,KL2,PFIELD,KRESP,HCOMMENT,HDIR)
00378 !     #############################################################
00379 !
00380 !!****  * - routine to fill a write 2D array for the externalised surface 
00381 !
00382 USE MODD_SURFEX_MPI, ONLY : NRANK, NPIO, XTIME_NPIO_WRITE
00383 !
00384 USE MODD_IO_SURF_FA, ONLY : NUNIT_FA, NMASK, NFULL, &
00385                             CMASK, LFANOCOMPACT
00386 USE MODD_SURF_PAR,   ONLY : XUNDEF
00387 !
00388 USE MODI_IO_BUFF_n
00389 USE MODI_ERROR_WRITE_SURF_FA
00390 USE MODI_GATHER_AND_WRITE_MPI
00391 !
00392 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00393 USE PARKIND1  ,ONLY : JPRB
00394 !
00395 IMPLICIT NONE
00396 !
00397 #ifndef NOMPI
00398 INCLUDE "mpif.h"
00399 #endif
00400 !
00401 !*      0.1   Declarations of arguments
00402 !
00403  CHARACTER(LEN=12),        INTENT(IN) :: HREC     ! name of the article to be read
00404 INTEGER,                  INTENT(IN) :: KL1      ! number of points
00405 INTEGER,                  INTENT(IN) :: KL2      ! 2nd dimension
00406 REAL, DIMENSION(KL1,KL2), INTENT(IN) :: PFIELD   ! array containing the data field
00407 INTEGER,                  INTENT(OUT):: KRESP    ! KRESP  : return-code if a problem appears
00408  CHARACTER(LEN=100),       INTENT(IN) :: HCOMMENT ! comment string
00409  CHARACTER(LEN=1),         INTENT(IN) :: HDIR     ! type of field :
00410                                                  ! 'H' : field with
00411                                                  !       horizontal spatial dim.
00412                                                  ! '-' : no horizontal dim.
00413 !*      0.2   Declarations of local variables
00414 ! 
00415  CHARACTER(LEN=4)  :: YSUFFIX
00416  CHARACTER(LEN=2)  :: YPATCH
00417 LOGICAL           :: GKNOWN
00418 INTEGER           :: I, JL ! loop counter
00419 INTEGER           :: INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL
00420 DOUBLE PRECISION  :: XTIME0
00421 REAL, DIMENSION(MAX(NFULL,SIZE(PFIELD,1)),SIZE(PFIELD,2)) :: ZWORK   ! work array read in the file
00422 REAL, DIMENSION(SIZE(PFIELD,2))       :: ZMEAN, ZCOUNT
00423 REAL(KIND=JPRB)   :: ZHOOK_HANDLE
00424 !
00425 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFX2_FA',0,ZHOOK_HANDLE)
00426 !
00427 KRESP=0
00428 !
00429 !$OMP SINGLE
00430 !
00431  CALL IO_BUFF_n(HREC,'W',GKNOWN)
00432 !
00433 !$OMP END SINGLE COPYPRIVATE(GKNOWN)
00434 !
00435 IF (GKNOWN .AND. LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFX2_FA',1,ZHOOK_HANDLE)
00436 IF (GKNOWN) RETURN
00437 !
00438  CALL GATHER_AND_WRITE_MPI(PFIELD,ZWORK,NMASK)
00439 !
00440 IF (NRANK==NPIO) THEN
00441   !
00442 #ifndef NOMPI
00443   XTIME0 = MPI_WTIME()
00444 #endif
00445   !    
00446 !$OMP SINGLE
00447   !   
00448   IF(LFANOCOMPACT)THEN
00449     CALL FAVEUR(KRESP,NUNIT_FA,INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00450     ! -- Pour ecrire sans compactage
00451     CALL FAGOTE(KRESP,NUNIT_FA,-1,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00452     DO JL=1,SIZE(ZWORK,2)
00453       WRITE(YPATCH,'(I2.2)')JL
00454       YSUFFIX='S'//YPATCH//'_'
00455       CALL FAIENC(KRESP,NUNIT_FA,YSUFFIX,0,HREC,ZWORK(:,JL),.FALSE.)
00456       IF (KRESP/=0) CALL ERROR_WRITE_SURF_FA(HREC,KRESP)
00457     END DO
00458     ! On remet la valeur par defaut 
00459     CALL FAGOTE(KRESP,NUNIT_FA,INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00460   ELSE
00461     ZMEAN (:)=0.0
00462     ZCOUNT(:)=0.0
00463     DO I=1,NFULL
00464       DO JL=1,SIZE(ZWORK,2)
00465         IF(ZWORK(I,JL)/=XUNDEF) THEN
00466           ZMEAN (JL)=ZMEAN(JL)+ZWORK(I,JL)
00467           ZCOUNT(JL)=ZCOUNT(JL)+1.0
00468         ENDIF
00469       ENDDO
00470     ENDDO
00471     WHERE(ZCOUNT(:)>0.0)ZMEAN(:)=ZMEAN(:)/ZCOUNT(:)        
00472     DO JL=1,SIZE(ZWORK,2)
00473       WHERE(ZWORK(:,JL)==XUNDEF)ZWORK(:,JL)=ZMEAN(JL)
00474       WRITE(YPATCH,'(I2.2)')JL
00475       YSUFFIX='S'//YPATCH//'_'
00476       CALL FAIENC(KRESP,NUNIT_FA,YSUFFIX,0,HREC,ZWORK(:,JL),.FALSE.)
00477       IF (KRESP/=0) CALL ERROR_WRITE_SURF_FA(HREC,KRESP)
00478     END DO
00479   ENDIF
00480   !
00481 !$OMP END SINGLE COPYPRIVATE(KRESP)
00482   !  
00483 #ifndef NOMPI
00484   XTIME_NPIO_WRITE = XTIME_NPIO_WRITE + (MPI_WTIME() - XTIME0)
00485 #endif
00486   !  
00487 ENDIF
00488 !
00489 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFX2_FA',1,ZHOOK_HANDLE)
00490 !
00491 END SUBROUTINE WRITE_SURFX2_FA
00492 !
00493 !     #############################################################
00494       SUBROUTINE WRITE_SURFN1_FA(HREC,KL,KFIELD,KRESP,HCOMMENT,HDIR)
00495 !     #############################################################
00496 !
00497 !!****  * - routine to write an integer array
00498 !
00499 USE MODD_SURFEX_MPI, ONLY : NRANK, NPIO, XTIME_NPIO_WRITE
00500 !
00501 USE MODD_IO_SURF_FA, ONLY : NUNIT_FA, NMASK, NFULL, CMASK, LFANOCOMPACT
00502 !
00503 USE MODE_FASURFEX
00504 !
00505 USE MODI_IO_BUFF_n
00506 USE MODI_ERROR_WRITE_SURF_FA
00507 USE MODI_GATHER_AND_WRITE_MPI
00508 !
00509 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00510 USE PARKIND1  ,ONLY : JPRB
00511 !
00512 IMPLICIT NONE
00513 !
00514 #ifndef NOMPI
00515 INCLUDE "mpif.h"
00516 #endif
00517 !
00518 !*      0.1   Declarations of arguments
00519 !
00520  CHARACTER(LEN=12),      INTENT(IN) :: HREC     ! name of the article to be read
00521 INTEGER,                INTENT(IN) :: KL       ! number of points
00522 INTEGER, DIMENSION(KL), INTENT(IN) :: KFIELD   ! array containing the data field
00523 INTEGER,                INTENT(OUT):: KRESP    ! KRESP  : return-code if a problem appears
00524  CHARACTER(LEN=100),     INTENT(IN) :: HCOMMENT ! comment string
00525  CHARACTER(LEN=1),       INTENT(IN) :: HDIR     ! type of field :
00526                                                ! 'H' : field with
00527                                                !       horizontal spatial dim.
00528                                                ! '-' : no horizontal dim.
00529 !*      0.2   Declarations of local variables
00530 ! 
00531  CHARACTER(LEN=18)         :: YNAME! Field Nam
00532 LOGICAL                   :: GKNOWN
00533 INTEGER                   :: INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL
00534 INTEGER, DIMENSION(MAX(NFULL,SIZE(KFIELD))) :: IWORK  ! work array read in the file
00535 DOUBLE PRECISION   :: XTIME0
00536 REAL(KIND=JPRB)           :: ZHOOK_HANDLE
00537 !
00538 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFN1_FA',0,ZHOOK_HANDLE)
00539 !
00540 KRESP = 0
00541 !
00542 !$OMP SINGLE
00543 !
00544  CALL IO_BUFF_n(HREC,'W',GKNOWN)
00545 !
00546 !$OMP END SINGLE COPYPRIVATE(GKNOWN)
00547 !
00548 IF (GKNOWN .AND. LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFN1_FA',1,ZHOOK_HANDLE)
00549 IF (GKNOWN) RETURN
00550 !
00551 IF (HDIR/='H' .OR. HREC=="-") THEN
00552   IWORK(1:KL) = KFIELD
00553 ELSE
00554   CALL GATHER_AND_WRITE_MPI(KFIELD,IWORK,NMASK)
00555 ENDIF
00556 !
00557 IF (NRANK==NPIO) THEN
00558   !
00559 #ifndef NOMPI
00560   XTIME0 = MPI_WTIME()
00561 #endif
00562   !    
00563 !$OMP SINGLE
00564   !  
00565   IF(LFANOCOMPACT)THEN
00566     CALL FAVEUR(KRESP,NUNIT_FA,INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00567     ! -- Pour ecrire sans compactage
00568     CALL FAGOTE(KRESP,NUNIT_FA,-1,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00569   ENDIF
00570   !
00571   YNAME=TRIM(CMASK)//TRIM(HREC)
00572   !
00573   CALL  FAECR_I_D(KRESP,NUNIT_FA,YNAME,KL,IWORK(1:KL))
00574   IF (KRESP/=0) CALL ERROR_WRITE_SURF_FA(HREC,KRESP)
00575   !
00576   IF(LFANOCOMPACT)THEN
00577     ! On remet la valeur par defaut 
00578     CALL FAGOTE(KRESP,NUNIT_FA,INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00579   ENDIF
00580   !
00581 !$OMP END SINGLE COPYPRIVATE(KRESP)
00582   !   
00583 #ifndef NOMPI
00584   XTIME_NPIO_WRITE = XTIME_NPIO_WRITE + (MPI_WTIME() - XTIME0)
00585 #endif
00586   !  
00587 ENDIF
00588 !
00589 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFN1_FA',1,ZHOOK_HANDLE)
00590 RETURN
00591 !
00592 END SUBROUTINE WRITE_SURFN1_FA
00593 !
00594 !     #############################################################
00595       SUBROUTINE WRITE_SURFL1_FA(HREC,KL,OFIELD,KRESP,HCOMMENT,HDIR)
00596 !     #############################################################
00597 !
00598 !!****  * - routine to write a logical array
00599 !
00600 USE MODD_SURFEX_MPI, ONLY : NRANK, NPIO, XTIME_NPIO_WRITE
00601 !
00602 USE MODD_IO_SURF_FA, ONLY : NUNIT_FA, CMASK, LFANOCOMPACT
00603 !
00604 USE MODE_FASURFEX
00605 !
00606 USE MODI_IO_BUFF_n
00607 USE MODI_ERROR_WRITE_SURF_FA
00608 !
00609 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00610 USE PARKIND1  ,ONLY : JPRB
00611 !
00612 IMPLICIT NONE
00613 !
00614 #ifndef NOMPI
00615 INCLUDE "mpif.h"
00616 #endif
00617 !
00618 !*      0.1   Declarations of arguments
00619 !
00620  CHARACTER(LEN=12),      INTENT(IN) :: HREC     ! name of the article to be read
00621 INTEGER,             INTENT(IN) :: KL       ! number of points
00622 LOGICAL, DIMENSION(KL), INTENT(IN) :: OFIELD   ! array containing the data field
00623 INTEGER,                INTENT(OUT):: KRESP    ! KRESP  : return-code if a problem appears
00624  CHARACTER(LEN=100),     INTENT(IN) :: HCOMMENT ! comment string
00625  CHARACTER(LEN=1),       INTENT(IN) :: HDIR     ! type of field :
00626                                                ! 'H' : field with
00627                                                !       horizontal spatial dim.
00628                                                ! '-' : no horizontal dim.
00629 !*      0.2   Declarations of local variables
00630 !
00631  CHARACTER(LEN=18):: YNAME ! Field Name
00632 LOGICAL          :: GKNOWN
00633 INTEGER          :: INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL
00634 DOUBLE PRECISION :: XTIME0
00635 REAL(KIND=JPRB)  :: ZHOOK_HANDLE
00636 !
00637 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFL1_FA',0,ZHOOK_HANDLE)
00638 !
00639 IF (NRANK==NPIO) THEN
00640   !
00641 #ifndef NOMPI
00642   XTIME0 = MPI_WTIME()
00643 #endif
00644   !  
00645   KRESP=0
00646   !
00647 !$OMP SINGLE
00648   !  
00649   CALL IO_BUFF_n(HREC,'W',GKNOWN)
00650   !
00651 !$OMP END SINGLE COPYPRIVATE(GKNOWN)
00652   ! 
00653   IF (GKNOWN .AND. LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFL1_FA',1,ZHOOK_HANDLE)
00654   IF (GKNOWN) RETURN
00655   !  
00656 !$OMP SINGLE
00657   !    
00658   IF(LFANOCOMPACT)THEN
00659     CALL FAVEUR(KRESP,NUNIT_FA,INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00660     ! -- Pour ecrire sans compactage
00661     CALL FAGOTE(KRESP,NUNIT_FA,-1,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00662   ENDIF
00663   !
00664   YNAME=TRIM(CMASK)//TRIM(HREC)
00665   CALL  FAECR_L_D(KRESP,NUNIT_FA,YNAME,KL,OFIELD)
00666   IF (KRESP/=0) CALL ERROR_WRITE_SURF_FA(HREC,KRESP)
00667   !
00668   IF(LFANOCOMPACT)THEN
00669     ! On remet la valeur par defaut 
00670     CALL FAGOTE(KRESP,NUNIT_FA,INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00671   ENDIF
00672   !
00673 !$OMP END SINGLE COPYPRIVATE(KRESP)
00674   !  
00675 #ifndef NOMPI
00676   XTIME_NPIO_WRITE = XTIME_NPIO_WRITE + (MPI_WTIME() - XTIME0)
00677 #endif
00678   !  
00679 ENDIF
00680 !
00681 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFL1_FA',1,ZHOOK_HANDLE)
00682 !
00683 END SUBROUTINE WRITE_SURFL1_FA
00684 !
00685 !     #############################################################
00686       SUBROUTINE WRITE_SURFT0_FA(HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
00687 !     #############################################################
00688 !
00689 !!****  * - routine to write a date
00690 !
00691 USE MODD_IO_SURF_FA, ONLY : CMASK, NUNIT_FA, LFANOCOMPACT
00692 !
00693 USE MODE_FASURFEX
00694 !
00695 USE MODI_IO_BUFF_n
00696 USE MODI_ERROR_WRITE_SURF_FA
00697 !
00698 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00699 USE PARKIND1  ,ONLY : JPRB
00700 !
00701 IMPLICIT NONE
00702 !
00703 !*      0.1   Declarations of arguments
00704 !
00705  CHARACTER(LEN=12),  INTENT(IN)  :: HREC     ! name of the article to be read
00706 INTEGER,            INTENT(IN)  :: KYEAR    ! year
00707 INTEGER,            INTENT(IN)  :: KMONTH   ! month
00708 INTEGER,            INTENT(IN)  :: KDAY     ! day
00709 REAL,               INTENT(IN)  :: PTIME    ! time
00710 INTEGER,            INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
00711  CHARACTER(LEN=100), INTENT(IN)  :: HCOMMENT ! comment string
00712 
00713 !*      0.2   Declarations of local variables
00714 !
00715  CHARACTER(LEN=18)     :: YNAME ! Field Name
00716 LOGICAL               :: GKNOWN
00717 INTEGER               :: IRET
00718 INTEGER               :: IHOUR, IMIN
00719 INTEGER               :: INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL
00720 INTEGER, DIMENSION(3) :: ITDATE
00721 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00722 !
00723 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFT0_FA',0,ZHOOK_HANDLE)
00724 !
00725 KRESP=0
00726 !
00727  CALL IO_BUFF_n(HREC,'W',GKNOWN)
00728 IF (GKNOWN .AND. LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFT0_FA',1,ZHOOK_HANDLE)
00729 IF (GKNOWN) RETURN
00730 !
00731 IF (HREC=='DTCUR') THEN
00732   IHOUR = NINT(PTIME)/3600
00733   IMIN  = NINT(PTIME)/60 - IHOUR * 60
00734   CALL FANDAR(IRET,NUNIT_FA,(/ KYEAR, KMONTH, KDAY, IHOUR, IMIN, 1, 0, 0, 0, 0, 0 /))
00735 END IF
00736 !
00737 ITDATE(1) = KYEAR
00738 ITDATE(2) = KMONTH
00739 ITDATE(3) = KDAY
00740 !
00741 IF(LFANOCOMPACT)THEN
00742   CALL FAVEUR(KRESP,NUNIT_FA,INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00743   ! -- Pour ecrire sans compactage
00744   CALL FAGOTE(KRESP,NUNIT_FA,-1,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00745 ENDIF
00746 !
00747 YNAME=TRIM(CMASK)//TRIM(HREC)//'%TDATE'
00748  CALL  FAECR_I_D(KRESP,NUNIT_FA,YNAME,3,ITDATE)
00749 IF (KRESP/=0) THEN
00750   CALL ERROR_WRITE_SURF_FA(HREC,KRESP)
00751 ENDIF
00752 !
00753 YNAME=TRIM(CMASK)//TRIM(HREC)//'%TIME'
00754  CALL  FAECR_R(KRESP,NUNIT_FA,YNAME,PTIME)
00755 IF (KRESP/=0) THEN
00756   CALL ERROR_WRITE_SURF_FA(HREC,KRESP)
00757 ENDIF
00758 !
00759 IF(LFANOCOMPACT)THEN
00760   ! On remet la valeur par defaut 
00761   CALL FAGOTE(KRESP,NUNIT_FA,INGRIB,INBPDG,INBCSP,ISTRON,IPUILA,IDMOPL)
00762 ENDIF
00763 !
00764 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFT0_FA',1,ZHOOK_HANDLE)
00765 !
00766 END SUBROUTINE WRITE_SURFT0_FA
00767 !
00768 !     #############################################################
00769       SUBROUTINE WRITE_SURFT2_FA(HREC,KL1,KL2,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
00770 !     #############################################################
00771 !
00772 !!****  * - routine to write a date
00773 !
00774 USE MODD_SURFEX_MPI, ONLY : NRANK, NPIO, XTIME_NPIO_WRITE
00775 !
00776 USE MODD_IO_SURF_FA, ONLY : NUNIT_FA, CMASK, NLUOUT
00777 !
00778 USE MODE_FASURFEX
00779 !
00780 USE MODI_IO_BUFF_n
00781 USE MODI_ABOR1_SFX
00782 USE MODI_ERROR_WRITE_SURF_FA
00783 !
00784 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00785 USE PARKIND1  ,ONLY : JPRB
00786 !
00787 IMPLICIT NONE
00788 !
00789 #ifndef NOMPI
00790 INCLUDE "mpif.h"
00791 #endif
00792 !
00793 !*      0.1   Declarations of arguments
00794 !
00795  CHARACTER(LEN=12),  INTENT(IN)  :: HREC     ! name of the article to be read
00796 INTEGER,                      INTENT(IN) :: KL1      ! number of points
00797 INTEGER,                      INTENT(IN) :: KL2      ! 2nd dimension
00798 INTEGER, DIMENSION(KL1,KL2), INTENT(IN)  :: KYEAR    ! year
00799 INTEGER, DIMENSION(KL1,KL2), INTENT(IN)  :: KMONTH   ! month
00800 INTEGER, DIMENSION(KL1,KL2), INTENT(IN)  :: KDAY     ! day
00801 REAL,    DIMENSION(KL1,KL2), INTENT(IN)  :: PTIME    ! time
00802 INTEGER,            INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
00803  CHARACTER(LEN=100), INTENT(IN)  :: HCOMMENT ! comment string
00804 
00805 !*      0.2   Declarations of local variables
00806 !
00807  CHARACTER(LEN=18):: YNAME ! Field Name
00808 LOGICAL          :: GKNOWN
00809 INTEGER, DIMENSION(3,SIZE(KYEAR,1),SIZE(KYEAR,2)) :: ITDATE
00810 DOUBLE PRECISION :: XTIME0
00811 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00812 !
00813 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFT2_FA',0,ZHOOK_HANDLE)
00814 !
00815 IF (NRANK==NPIO) THEN
00816   !
00817 #ifndef NOMPI
00818   XTIME0 = MPI_WTIME()
00819 #endif
00820   !  
00821   KRESP=0
00822   !
00823 !$OMP SINGLE
00824   !   
00825   CALL IO_BUFF_n(HREC,'W',GKNOWN)
00826   !
00827 !$OMP END SINGLE COPYPRIVATE(GKNOWN)
00828   !
00829   IF (GKNOWN .AND. LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFT2_FA',1,ZHOOK_HANDLE)
00830   IF (GKNOWN) RETURN
00831   !
00832 !$OMP SINGLE
00833   !  
00834   ITDATE(1,:,:) = KYEAR  (:,:)
00835   ITDATE(2,:,:) = KMONTH (:,:)
00836   ITDATE(3,:,:) = KDAY   (:,:)
00837   !
00838 !$OMP END SINGLE
00839   !   
00840   YNAME=TRIM(CMASK)//TRIM(HREC)
00841   WRITE(NLUOUT,*) ' WRITE_SURFT2_FA : time in 2 dimensions not yet implemented : YNAME=',YNAME,'ITDATE=',ITDATE
00842   CALL ABOR1_SFX('MODE_WRITE_SURF_FA:WRITE_SURFT2_FA: time in 2 dimensions not yet implemented')
00843   !
00844 #ifndef NOMPI
00845   XTIME_NPIO_WRITE = XTIME_NPIO_WRITE + (MPI_WTIME() - XTIME0)
00846 #endif
00847   !  
00848 ENDIF
00849 !
00850 IF (LHOOK) CALL DR_HOOK('MODE_WRITE_SURF_FA:WRITE_SURFT2_FA',1,ZHOOK_HANDLE)
00851 !
00852 END SUBROUTINE WRITE_SURFT2_FA
00853 !
00854 END MODULE MODE_WRITE_SURF_FA