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