SURFEX v7.3
General documentation of Surfex
|
00001 ! ############################################################################### 00002 SUBROUTINE ASSIM_INLAND_WATER_n(YPROGRAM,KI,PTS_O,PITM,HTEST) 00003 00004 ! ############################################################################### 00005 ! 00006 !!**** *ASSIM_INLAND_WATER_n * - Chooses the surface assimilation schemes for INLAND_WATER parts 00007 !! 00008 !! PURPOSE 00009 !! ------- 00010 !! 00011 !!** METHOD 00012 !! ------ 00013 !! 00014 !! REFERENCE 00015 !! --------- 00016 !! 00017 !! 00018 !! AUTHOR 00019 !! ------ 00020 !! T. Aspelien 00021 !! 00022 !! MODIFICATIONS 00023 !! ------------- 00024 !! Original 04/2012 00025 !!-------------------------------------------------------------------- 00026 ! 00027 USE MODD_SURF_PAR, ONLY : XUNDEF 00028 USE MODD_ASSIM, ONLY : LPRINT,LEXTRAP_WATER,LWATERTG2 00029 USE MODN_IO_OFFLINE, ONLY : CPREPFILE,CPGDFILE 00030 ! 00031 USE MODD_SURF_ATM_n, ONLY : CWATER,NR_WATER 00032 USE MODD_SURF_ATM_GRID_n,ONLY : XLAT, XLON 00033 ! 00034 #ifdef LFI 00035 USE MODD_IO_SURF_LFI, ONLY : CFILEIN_LFI, CFILE_LFI,CFILEOUT_LFI 00036 #endif 00037 ! 00038 USE YOMHOOK, ONLY : LHOOK,DR_HOOK 00039 USE PARKIND1, ONLY : JPRB 00040 ! 00041 USE MODI_ABOR1_SFX 00042 USE MODI_INIT_IO_SURF_n 00043 USE MODI_READ_SURF 00044 USE MODI_END_IO_SURF_n 00045 USE MODI_IO_BUFF_CLEAN_n 00046 USE MODI_OI_HOR_EXTRAPOL_SURF 00047 USE MODI_FLAG_UPDATE 00048 USE MODI_WRITE_SURF 00049 ! 00050 IMPLICIT NONE 00051 ! 00052 !* 0.1 declarations of arguments 00053 ! 00054 CHARACTER(LEN=6), INTENT(IN) :: YPROGRAM ! program calling surf. schemes 00055 INTEGER, INTENT(IN) :: KI 00056 REAL,DIMENSION(KI), INTENT(IN) :: PTS_O 00057 REAL,DIMENSION(KI), INTENT(IN) :: PITM 00058 CHARACTER(LEN=2), INTENT(IN) :: HTEST ! must be equal to 'OK' 00059 ! 00060 !* 0.2 declarations of local variables 00061 ! 00062 !------------------------------------------------------------------------------------- 00063 ! 00064 CHARACTER(LEN=10) :: YVAR ! Name of the prognostic variable (in LFI file) 00065 CHARACTER(LEN=100) :: YPREFIX ! Prefix of the prognostic variable (in LFI file) 00066 INTEGER :: IRESP,I 00067 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00068 REAL, DIMENSION(KI) :: ZLSTINC 00069 REAL, DIMENSION(KI) :: ZLST 00070 REAL, DIMENSION(KI) :: ZTP 00071 REAL,ALLOCATABLE,DIMENSION(:) :: ZLON 00072 REAL,ALLOCATABLE,DIMENSION(:) :: ZLAT 00073 REAL,ALLOCATABLE,DIMENSION(:) :: ZALT 00074 REAL,ALLOCATABLE,DIMENSION(:) :: ZLST_IN 00075 LOGICAL,ALLOCATABLE,DIMENSION(:) :: OINTERP_LST 00076 00077 IF (LHOOK) CALL DR_HOOK('ASSIM_INLAND_WATER_N',0,ZHOOK_HANDLE) 00078 00079 IF (HTEST/='OK') THEN 00080 CALL ABOR1_SFX('ASSIM_INLAND_WATER_n: FATAL ERROR DURING ARGUMENT TRANSFER') 00081 END IF 00082 00083 WRITE(*,*) 'UPDATING LST FOR INLAND_WATER: ',TRIM(CWATER) 00084 00085 IF ( LEXTRAP_WATER ) THEN 00086 ALLOCATE(ZALT(KI)) 00087 00088 #ifdef LFI 00089 CFILEIN_LFI = CPGDFILE ! PGD file orography 00090 CFILE_LFI=CFILEIN_LFI 00091 #endif 00092 00093 CALL INIT_IO_SURF_n(YPROGRAM,'WATER ','SURF ','READ ') 00094 ! 00095 ! Read orography 00096 ! 00097 CALL READ_SURF(YPROGRAM,'ZS', ZALT, IRESP) 00098 CALL END_IO_SURF_n(YPROGRAM) 00099 CALL IO_BUFF_CLEAN_n 00100 00101 ALLOCATE(OINTERP_LST(KI)) 00102 ALLOCATE(ZLON(KI)) 00103 ALLOCATE(ZLAT(KI)) 00104 ALLOCATE(ZLST_IN(KI)) 00105 00106 ! Set longitudes/latitudes for water point 00107 DO I=1,KI 00108 ZLON(I)=XLON(NR_WATER(I)) 00109 ZLAT(I)=XLAT(NR_WATER(I)) 00110 ENDDO 00111 OINTERP_LST(:) = .FALSE. 00112 ENDIF 00113 00114 ! 00115 !------------------------------------------------------------ 00116 ! READ PREP FILE 00117 !------------------------------------------------------------ 00118 ! 00119 ! File handling definition 00120 ! 00121 #ifdef LFI 00122 CFILEIN_LFI = CPREPFILE ! input PREP file (surface fields) 00123 CFILE_LFI=CFILEIN_LFI 00124 #endif 00125 ! 00126 ! Read grid dimension for allocation 00127 ! 00128 CALL INIT_IO_SURF_n(YPROGRAM,'WATER ','SURF ','READ ') 00129 ! 00130 ! Read prognostic variables 00131 ! 00132 CALL READ_SURF(YPROGRAM,'TS_WATER', ZLST, IRESP) 00133 IF (LWATERTG2) THEN 00134 CALL READ_SURF(YPROGRAM,'TG2', ZTP, IRESP) 00135 ENDIF 00136 CALL END_IO_SURF_n(YPROGRAM) 00137 CALL IO_BUFF_CLEAN_n 00138 00139 ZLSTINC(:) = 0.0 00140 ZLSTINC(:) = ZLST(:) 00141 00142 ! 00143 !* ZLST updated 00144 ! 00145 DO I=1,KI 00146 IF ( LWATERTG2 ) THEN 00147 ! 00148 !* ZLST updated from LAND values of climatological TS 00149 ! 00150 IF (ZTP(I)/=XUNDEF .AND. PITM(I) > 0.5 ) THEN 00151 ZLST(I) = ZTP(I) 00152 ELSE 00153 ! Keep ZLST or do extrapolation from neighbour points 00154 IF ( LEXTRAP_WATER ) THEN 00155 OINTERP_LST(I) = .TRUE. 00156 ZLST(I) = XUNDEF 00157 ENDIF 00158 ENDIF 00159 00160 ELSE 00161 ! 00162 !* ZLST updated from from CANARI analysis 00163 ! 00164 IF ( PITM(I) < 0.5 ) THEN 00165 ZLST(I) = PTS_O(I) 00166 ELSE 00167 ! Keep ZLST or do extrapolation from neighbour points 00168 IF ( LEXTRAP_WATER ) THEN 00169 OINTERP_LST(I) = .TRUE. 00170 ZLST(I) = XUNDEF 00171 ENDIF 00172 ENDIF 00173 ENDIF 00174 ENDDO 00175 00176 IF ( LEXTRAP_WATER ) THEN 00177 ! 00178 !* Extrapolation 00179 ! 00180 ZLST_IN = ZLST 00181 CALL OI_HOR_EXTRAPOL_SURF(KI,ZLAT,ZLON,ZLST_IN,ZLAT,ZLON,ZLST,OINTERP_LST,ZALT) 00182 00183 ! 00184 !* Print values produced by OI_HO_EXTRAPOL_SURF 00185 ! 00186 IF (LPRINT) THEN 00187 DO I=1,KI 00188 IF (OINTERP_LST(I)) THEN 00189 PRINT *,'Lake surface temperature set to ',ZLST(I),'from nearest neighbour at I=',NR_WATER(I) 00190 ENDIF 00191 ENDDO 00192 ENDIF 00193 00194 DEALLOCATE(OINTERP_LST) 00195 DEALLOCATE(ZLON) 00196 DEALLOCATE(ZLAT) 00197 DEALLOCATE(ZALT) 00198 DEALLOCATE(ZLST_IN) 00199 ENDIF 00200 00201 ! Sum the increments 00202 ZLSTINC(:) = ZLST(:) - ZLSTINC(:) 00203 00204 WRITE(*,*) 'Mean LST increments over inland water ',SUM(ZLSTINC)/KI 00205 00206 ! Write updated LST field 00207 WRITE(*,*) 'WRITING UPDATED LST' 00208 ! 00209 #ifdef LFI 00210 CFILEOUT_LFI=CPREPFILE 00211 #endif 00212 ! 00213 CALL FLAG_UPDATE(.FALSE.,.TRUE.,.FALSE.,.FALSE.) 00214 CALL INIT_IO_SURF_n(YPROGRAM,'WATER ','SURF ','WRITE') 00215 00216 YVAR='TS_WATER' 00217 YPREFIX='X_Y_TS_WATER (K) ' 00218 CALL WRITE_SURF(YPROGRAM,YVAR,ZLST,IRESP,HCOMMENT=YPREFIX) 00219 00220 CALL END_IO_SURF_n(YPROGRAM) 00221 CALL IO_BUFF_CLEAN_n 00222 00223 IF (LHOOK) CALL DR_HOOK('ASSIM_INLAND_WATER_N',1,ZHOOK_HANDLE) 00224 ! 00225 !------------------------------------------------------------------------------------- 00226 ! 00227 END SUBROUTINE ASSIM_INLAND_WATER_n