SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/OFFLIN/assim_sean.F90
Go to the documentation of this file.
00001 !     ###############################################################################
00002 SUBROUTINE ASSIM_SEA_n(YPROGRAM,KI,PTS_IN,PITM,HTEST)
00003 
00004 !     ###############################################################################
00005 !
00006 !!****  *ASSIM_SEA_n * - Chooses the surface assimilation schemes for SEA tile
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_ASSIM,          ONLY : LPRINT,LAESST,LEXTRAP_SEA
00028 USE MODD_SURF_PAR,       ONLY : XUNDEF
00029 !
00030 USE MODD_SURF_ATM_n,     ONLY : CSEA,NR_SEA
00031 USE MODD_SURF_ATM_GRID_n,ONLY : XLAT, XLON
00032 USE MODN_IO_OFFLINE,     ONLY : CPGDFILE,CPREPFILE
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_IO_BUFF_CLEAN_n
00045 USE MODI_OI_HOR_EXTRAPOL_SURF
00046 USE MODI_FLAG_UPDATE
00047 USE MODI_WRITE_SURF
00048 USE MODI_END_IO_SURF_n
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_IN
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 REAL(KIND=JPRB)             :: ZHOOK_HANDLE
00065  CHARACTER(LEN=10)           :: YVAR    ! Name of the prognostic variable (in LFI file)
00066  CHARACTER(LEN=100)          :: YPREFIX ! Prefix of the prognostic variable  (in LFI file)
00067 INTEGER                     :: IRESP,I
00068 REAL                        :: ZFMAX,ZFMIN,ZFMEAN
00069 REAL, DIMENSION (KI)        :: ZT2INC
00070 REAL, DIMENSION (KI)        :: ZTCLS
00071 REAL, DIMENSION (KI)        :: ZSST
00072 REAL, DIMENSION (KI)        :: PSST
00073 REAL, DIMENSION (KI)        :: PTS
00074 REAL, DIMENSION (KI)        :: ZSSTINC
00075 REAL,ALLOCATABLE,DIMENSION(:)    :: PLON
00076 REAL,ALLOCATABLE,DIMENSION(:)    :: PLAT
00077 REAL,ALLOCATABLE,DIMENSION(:)    :: ZALT
00078 LOGICAL,ALLOCATABLE,DIMENSION(:) :: OINTERP_SST
00079 
00080 IF (LHOOK) CALL DR_HOOK('ASSIM_SEA_N',0,ZHOOK_HANDLE)
00081 
00082 IF (HTEST/='OK') THEN
00083   CALL ABOR1_SFX('ASSIM_SEA_n: FATAL ERROR DURING ARGUMENT TRANSFER')
00084 END IF
00085 
00086 WRITE(*,*) 'UPDATING SST FOR SCHEME: ',TRIM(CSEA)
00087 
00088 IF ( LEXTRAP_SEA ) THEN
00089   ALLOCATE(ZALT(KI))
00090 
00091 #ifdef LFI
00092   CFILEIN_LFI = CPGDFILE        ! input PGD file (orography)
00093   CFILE_LFI=CFILEIN_LFI
00094 #endif
00095   CALL INIT_IO_SURF_n(YPROGRAM,'SEA   ','SURF  ','READ ')
00096   !
00097   !  Read orography
00098   !
00099   CALL READ_SURF(YPROGRAM,'ZS',        ZALT,  IRESP)
00100   CALL END_IO_SURF_n(YPROGRAM)
00101   CALL IO_BUFF_CLEAN_n
00102 
00103   ALLOCATE(OINTERP_SST(KI))
00104   ALLOCATE(PLON(KI))
00105   ALLOCATE(PLAT(KI))
00106 
00107   ! Set longitudes/latitudes for sea point
00108   DO I=1,KI
00109     PLON(I)=XLON(NR_SEA(I))
00110     PLAT(I)=XLAT(NR_SEA(I))
00111   ENDDO
00112 
00113   OINTERP_SST(:) = .FALSE.
00114 ENDIF
00115 
00116 !
00117 !------------------------------------------------------------
00118 ! READ PREP FILE
00119 !------------------------------------------------------------
00120 !
00121 !   File handling definition
00122 !
00123 #ifdef LFI
00124 CFILEIN_LFI = CPREPFILE        ! input PREP file (surface fields)
00125 CFILE_LFI=CFILEIN_LFI
00126 #endif
00127 !
00128 !   Read grid dimension for allocation
00129 !
00130  CALL INIT_IO_SURF_n(YPROGRAM,'SEA   ','SURF  ','READ ')
00131 !
00132 !  Read prognostic variables
00133 !
00134  CALL READ_SURF(YPROGRAM,'TG1',       PTS,   IRESP)
00135  CALL READ_SURF(YPROGRAM,'SST',       PSST,  IRESP)
00136  CALL END_IO_SURF_n(YPROGRAM)
00137  CALL IO_BUFF_CLEAN_n
00138 
00139 ! Read SST from file or set it to input SST
00140 IF ( .NOT. LAESST ) THEN
00141 
00142   ! Set SST to input
00143   ZSST(:) = PTS_IN(:)
00144 ELSE
00145 
00146   ! SST analysed in CANARI 
00147   ZSST(:)    = XUNDEF
00148   WHERE (PITM(:)< 0.5 .AND. PTS(:)==XUNDEF )
00149      ZSST(:) = PTS_IN(:)   ! set SST analysis from CANARI
00150   END WHERE
00151   !
00152   ZFMIN = MINVAL(ZSST)
00153   ZFMAX = MAXVAL(ZSST)
00154   ZFMEAN = SUM(ZSST)/FLOAT(KI)
00155   WRITE(*,*) '  SST analysis from CANARI '
00156   WRITE(*,'("  ZSST            - min, mean, max: ",3E13.4)') ZFMIN, ZFMEAN, ZFMAX
00157 ENDIF
00158 
00159 ZSSTINC(:) = PSST(:)
00160 
00161 !*     PSST updated at all sea points with ZSST where ZSST is available
00162 
00163 DO I=1,KI
00164   IF (ZSST(I)/=XUNDEF) THEN
00165     PSST(I) = ZSST(I)
00166   ELSE
00167     IF ( LEXTRAP_SEA ) THEN
00168       OINTERP_SST(I) = .TRUE.
00169     PSST(I) = XUNDEF
00170   ENDIF
00171   ENDIF
00172 ENDDO
00173 
00174 IF ( LEXTRAP_SEA ) THEN
00175   !
00176   !*     Extrapolation
00177   !
00178   ZSST(:) = PSST(:)
00179   CALL OI_HOR_EXTRAPOL_SURF(KI,PLAT,PLON,ZSST,PLAT,PLON,PSST,OINTERP_SST,ZALT)
00180 
00181   !
00182   !*     Print values produced by OI_HO_EXTRAPOL_SURF
00183   !
00184   IF (LPRINT) THEN
00185     DO I=1,KI
00186       IF (OINTERP_SST(I)) THEN
00187         PRINT *,'Sea surface temperature set to ',PSST(I),'from nearest neighbour at I=',NR_SEA(I)
00188       ENDIF
00189     ENDDO
00190   ENDIF
00191 
00192   DEALLOCATE(OINTERP_SST)
00193   DEALLOCATE(PLON)
00194   DEALLOCATE(PLAT)
00195   DEALLOCATE(ZALT)
00196 ENDIF
00197 
00198 ! Sum the increments
00199   ZSSTINC(:) = PSST(:) - ZSSTINC(:)
00200 
00201 WRITE(*,*) 'Mean SST increments over SEA   ',SUM(ZSSTINC)/KI
00202 
00203 ! Write updated SST field
00204 WRITE(*,*) 'WRITING UPDATED SST'
00205 !
00206 #ifdef LFI
00207 CFILEOUT_LFI=CPREPFILE
00208 #endif
00209  CALL FLAG_UPDATE(.FALSE.,.TRUE.,.FALSE.,.FALSE.)
00210  CALL INIT_IO_SURF_n(YPROGRAM,'SEA   ','SURF  ','WRITE')
00211 
00212 YVAR='SST'
00213 YPREFIX='X_Y_SST (K)                                       '
00214  CALL WRITE_SURF(YPROGRAM,YVAR,PSST,IRESP,HCOMMENT=YPREFIX)
00215 
00216  CALL END_IO_SURF_n(YPROGRAM)
00217  CALL IO_BUFF_CLEAN_n
00218 
00219 IF (LHOOK) CALL DR_HOOK('ASSIM_SEA_N',1,ZHOOK_HANDLE)
00220 !
00221 !-------------------------------------------------------------------------------------
00222 !
00223 END SUBROUTINE ASSIM_SEA_n