SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/OFFLIN/assim_inland_watern.F90
Go to the documentation of this file.
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