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