SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/OFFLIN/read_surf_atm.F90
Go to the documentation of this file.
00001 !     #########
00002 SUBROUTINE READ_SURF_ATM     (HPROGRAM, PFIELD, KFORC_STEP, KNB, KINIT)  
00003 !**************************************************************************
00004 !
00005 !!    PURPOSE
00006 !!    -------
00007 !         Read in the ascii file the atmospheric forcing for the actual time
00008 !         step KFORC_STEP, and for the next one.
00009 !         The two time step are needed for the time interpolation of the
00010 !         forcing.
00011 !         If the end of the file  is reached, set the two step to the last
00012 !         values.
00013 !         Return undef value if the variable is not present
00014 !!
00015 !!**  METHOD
00016 !!    ------
00017 !!
00018 !!    EXTERNAL
00019 !!    --------
00020 !!
00021 !!    IMPLICIT ARGUMENTS
00022 !!    ------------------
00023 !!
00024 !!    REFERENCE
00025 !!    ---------
00026 !!
00027 !!
00028 !!    AUTHOR
00029 !!    ------
00030 !!      A. Lemonsu  *Meteo France*      
00031 !!
00032 !!    MODIFICATIONS
00033 !!    -------------
00034 !!      Original     03/2008
00035 !         
00036 USE MODD_SURFEX_MPI, ONLY : NRANK, NPIO, NINDEX, XTIME_COMM_READ, XTIME_NPIO_READ
00037 !
00038 USE MODD_SURF_PAR,   ONLY : XUNDEF
00039 USE MODD_IO_SURF_OL, ONLY : XSTART,XCOUNT,XSTRIDE,LPARTR
00040 USE MODD_IO_SURF_ASC,ONLY : NNI_FORC
00041 !
00042 USE MODD_ARCH, ONLY : LITTLE_ENDIAN_ARCH
00043 !
00044 USE MODE_CHAR2REAL
00045 !
00046 USE MODI_ABOR1_SFX
00047 USE MODI_READ_AND_SEND_MPI
00048 USE MODI_GATHER_AND_WRITE_MPI
00049 !
00050 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00051 USE PARKIND1  ,ONLY : JPRB
00052 !
00053 IMPLICIT NONE
00054 !
00055 #ifndef NOMPI
00056 INCLUDE 'mpif.h'
00057 #endif
00058 !
00059 ! global variables
00060 REAL, DIMENSION(:,:),INTENT(INOUT) :: PFIELD
00061 INTEGER,INTENT(IN)               :: KFORC_STEP
00062 INTEGER,INTENT(IN)               :: KNB 
00063 INTEGER,INTENT(IN)               :: KINIT
00064  CHARACTER(LEN=6)    ,INTENT(IN)  :: HPROGRAM
00065 
00066 ! local variables
00067 INTEGER                          :: I, INI, J, I1
00068  CHARACTER(LEN=4), DIMENSION(:), ALLOCATABLE  :: YF
00069  CHARACTER(LEN=4) :: YWORK
00070 DOUBLE PRECISION :: XTIME0
00071 REAL*4                            :: ZWORK4
00072 REAL, DIMENSION(:,:), ALLOCATABLE :: ZFIELD
00073 REAL                              :: ZWORK
00074 LOGICAL                          :: GSWAP              ! T: swap has been done
00075 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00076 !
00077 IF (LHOOK) CALL DR_HOOK('READ_SURF_ATM',0,ZHOOK_HANDLE)
00078 !
00079 IF (NRANK==NPIO) THEN
00080   INI = SIZE(NINDEX)
00081   ALLOCATE(ZFIELD(INI,SIZE(PFIELD,2)))
00082   IF (HPROGRAM == 'BINARY') THEN
00083     ALLOCATE(YF(INI))
00084   ENDIF
00085 ELSE
00086   ALLOCATE(ZFIELD(0,0)) 
00087   ALLOCATE(YF(0))
00088 ENDIF
00089 !
00090  CALL GATHER_AND_WRITE_MPI(PFIELD,ZFIELD)
00091 !
00092 IF (NRANK==NPIO) THEN
00093   !
00094 #ifndef NOMPI
00095   XTIME0 = MPI_WTIME() 
00096 #endif 
00097   !  
00098   IF (HPROGRAM == 'ASCII ') THEN
00099     !
00100     IF (KFORC_STEP .EQ. 1) THEN
00101       I1 = 1
00102       REWIND(KINIT)
00103     ELSE
00104       I1 = 2
00105       ZFIELD(:,1) = ZFIELD(:,KNB)
00106     ENDIF
00107     DO I=I1,KNB
00108       IF (NNI_FORC==1) THEN
00109         READ(UNIT=KINIT,FMT=*) ZWORK
00110         ZFIELD(:,I) = ZWORK
00111       ELSE
00112         READ(UNIT=KINIT,FMT=*) ZFIELD(:,I)
00113       END IF
00114     ENDDO
00115     !
00116   ELSE IF (HPROGRAM == 'BINARY') THEN
00117     !
00118     IF (KFORC_STEP .EQ. 1) THEN    
00119       I1 = 1
00120       GSWAP = .FALSE.
00121     ELSE
00122       I1 = 2
00123       ZFIELD(:,1) = ZFIELD(:,KNB)
00124     ENDIF
00125     DO I=I1,KNB
00126       IF (NNI_FORC==1) THEN
00127         READ(UNIT=KINIT,REC=KFORC_STEP+I-1) YWORK
00128         YF(:) = YWORK
00129       ELSE
00130         READ(UNIT=KINIT,REC=KFORC_STEP+I-1) YF(:)
00131       END IF
00132       ZFIELD(:,I) = YF(:)
00133       IF (     ANY(ABS(ZFIELD(:,I))>0. .AND. ABS(ZFIELD(:,I))<1.E-30) &
00134           .OR. ANY(ABS(ZFIELD(:,I))>1.E6)                       ) THEN  
00135         CALL ABOR1_SFX('READ_SURF_ATM: SWAP SET IN YOUR PARAMS_CONFIG FILE SEEMS '//&
00136           'INAPPROPRIATE - VERIFY  ')  
00137       END IF  
00138     ENDDO
00139     !
00140   ENDIF
00141   !
00142 #ifndef NOMPI
00143   XTIME_NPIO_READ = XTIME_NPIO_READ + (MPI_WTIME() - XTIME0)
00144 #endif
00145   !  
00146 ENDIF
00147 !
00148  CALL READ_AND_SEND_MPI(ZFIELD,PFIELD)
00149 !
00150 DEALLOCATE(ZFIELD)
00151 IF (HPROGRAM=='BINARY') THEN
00152   DEALLOCATE(YF)
00153 ENDIF
00154 !
00155 LPARTR=.FALSE.
00156 !
00157 IF (LHOOK) CALL DR_HOOK('READ_SURF_ATM',1,ZHOOK_HANDLE)
00158 
00159 END SUBROUTINE READ_SURF_ATM