SURFEX v7.3
General documentation of Surfex
|
00001 ! ######### 00002 SUBROUTINE PREP_HOR_OCEAN_FIELD( HPROGRAM, & 00003 HFILE,HFILETYPE,KLUOUT,OUNIF, & 00004 HSURF,HNCVARNAME ) 00005 ! ####################################################### 00006 ! 00007 !!**** *PREP_HOR_OCEAN_FIELD* -reads, interpolates and prepares oceanic fields 00008 !! 00009 !! PURPOSE 00010 !! ------- 00011 !! 00012 !!** METHOD 00013 !! ------ 00014 !! 00015 !! REFERENCE 00016 !! --------- 00017 !! 00018 !! 00019 !! AUTHOR 00020 !! ------ 00021 !! C. Lebeaupin Brossier 00022 !! 00023 !! MODIFICATIONS 00024 !! ------------- 00025 !! Original 01/2008 00026 !! Modified 07/2012, P. Le Moigne : CMO1D phasing 00027 !!------------------------------------------------------------------ 00028 ! 00029 USE MODD_CSTS, ONLY : XTT 00030 USE MODD_SURF_PAR, ONLY : XUNDEF 00031 USE MODD_OCEAN_GRID_n , ONLY : NOCKMIN,NOCKMAX 00032 USE MODD_OCEAN_n, ONLY : XSEAT, XSEAS, XSEAU, XSEAV, LCURRENT 00033 USE MODD_PREP, ONLY : CINGRID_TYPE, CINTERP_TYPE, XLAT_OUT, XLON_OUT,& 00034 XX_OUT, XY_OUT 00035 USE MODD_SEAFLUX_GRID_n, ONLY : XLAT, XLON 00036 USE MODD_OCEAN_REL_n, ONLY : XSEAS_REL, XSEAT_REL, XSEAU_REL, XSEAV_REL 00037 ! 00038 USE MODI_PREP_OCEAN_UNIF 00039 USE MODI_PREP_OCEAN_NETCDF 00040 USE MODI_PREP_OCEAN_ASCLLV 00041 ! 00042 USE MODI_HOR_INTERPOL 00043 ! 00044 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00045 USE PARKIND1 ,ONLY : JPRB 00046 ! 00047 USE MODI_ABOR1_SFX 00048 IMPLICIT NONE 00049 ! 00050 !* 0.1 declarations of arguments 00051 ! 00052 CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes 00053 CHARACTER(LEN=28), INTENT(IN) :: HFILE ! file name 00054 CHARACTER(LEN=6), INTENT(IN) :: HFILETYPE ! file type 00055 INTEGER, INTENT(IN) :: KLUOUT ! logical unit of output listing 00056 LOGICAL, INTENT(IN) :: OUNIF ! flag for prescribed uniform field 00057 CHARACTER(LEN=7) :: HSURF ! type of field 00058 CHARACTER(LEN=28), INTENT(IN), OPTIONAL :: HNCVARNAME!var to read 00059 ! 00060 ! 00061 !* 0.2 declarations of local variables 00062 ! 00063 REAL, POINTER, DIMENSION(:,:,:) ::ZFIELDIN!field to interpolate horizontally 00064 REAL, POINTER, DIMENSION(:,:) ::ZFIELD !field to interpolate horizontally 00065 REAL, ALLOCATABLE, DIMENSION(:,:,:)::ZFIELDOUT!field interpolated horizontally 00066 ! 00067 INTEGER :: JLEV ! loop on oceanic vertical level 00068 INTEGER :: IK1 00069 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00070 !---------------------------------------------------------------------------- 00071 !* 1. Does the field exist? 00072 ! 00073 !* 2. Reading of input configuration (Grid and interpolation type) 00074 ! 00075 IF (LHOOK) CALL DR_HOOK('PREP_HOR_OCEAN_FIELD',0,ZHOOK_HANDLE) 00076 ! 00077 IF (OUNIF) THEN 00078 WRITE(KLUOUT,*) '*****warning*****: you ask for uniform oceanic variables' 00079 CALL PREP_OCEAN_UNIF(KLUOUT,HSURF,ZFIELDIN) 00080 ELSE IF (HFILETYPE=='NETCDF') THEN 00081 CALL PREP_OCEAN_NETCDF(HPROGRAM,HSURF,HFILE,HFILETYPE,KLUOUT,& 00082 HNCVARNAME,ZFIELDIN) 00083 ELSE IF (HFILETYPE=='ASCII') THEN 00084 WRITE(KLUOUT,*) 'PERSONAL LIB TEST FOR READING ',HFILETYPE,'file type' 00085 WRITE(KLUOUT,*) 'ASCII FILE MUST CONTAIN LAT,LON,DEPTH,T,S,U,V' 00086 CALL PREP_OCEAN_ASCLLV(HPROGRAM,HSURF,HFILE,KLUOUT,ZFIELDIN) 00087 ELSE 00088 CALL ABOR1_SFX('PREP_OCEAN_HOR_FIELD: data file type not supported : '//HFILETYPE) 00089 END IF 00090 ! 00091 !------------------------------------------------------------------------------- 00092 ! 00093 !* 3. Horizontal interpolation 00094 ! 00095 ALLOCATE(ZFIELDOUT (SIZE(XLAT),SIZE(ZFIELDIN,2),SIZE(ZFIELDIN,3)) ) 00096 ALLOCATE(ZFIELD(SIZE(ZFIELDIN,1),SIZE(ZFIELDIN,3))) 00097 ! 00098 DO JLEV=1,SIZE(ZFIELDIN,2) 00099 ZFIELD(:,:)=ZFIELDIN(:,JLEV,:) 00100 CALL HOR_INTERPOL(KLUOUT,ZFIELD,ZFIELDOUT(:,JLEV,:)) 00101 ENDDO 00102 ! 00103 !* 5. Return to historical variable 00104 ! 00105 IK1=NOCKMIN+1 00106 SELECT CASE (HSURF) 00107 CASE('TEMP_OC') 00108 ALLOCATE(XSEAT(SIZE(ZFIELDOUT,1),NOCKMIN:NOCKMAX)) 00109 ALLOCATE(XSEAT_REL(SIZE(ZFIELDOUT,1),NOCKMIN:NOCKMAX)) 00110 DO JLEV=IK1,NOCKMAX 00111 XSEAT(:,JLEV) = ZFIELDOUT(:,JLEV,1) 00112 !prevoir interpolation sur la grille verticale si niveau différents 00113 ENDDO 00114 XSEAT(:,NOCKMIN)=XSEAT(:,IK1) 00115 ! 00116 ! Relaxation Profile = initial profile for the steady regime 00117 ! Change it for seasonal cycle!! 00118 XSEAT_REL(:,:) = XSEAT(:,:) 00119 ! 00120 CASE('SALT_OC') 00121 ALLOCATE(XSEAS(SIZE(ZFIELDOUT,1),NOCKMIN:NOCKMAX)) 00122 ALLOCATE(XSEAS_REL(SIZE(ZFIELDOUT,1),NOCKMIN:NOCKMAX)) 00123 DO JLEV=IK1,NOCKMAX 00124 XSEAS(:,JLEV) = ZFIELDOUT(:,JLEV,1) 00125 ENDDO 00126 XSEAS(:,NOCKMIN)=XSEAS(:,IK1) 00127 ! 00128 ! Relaxation Profile = initial profile for the steady regime 00129 ! Change it for seasonal cycle!! 00130 XSEAS_REL(:,:) = XSEAS(:,:) 00131 ! 00132 CASE('UCUR_OC') 00133 ALLOCATE(XSEAU(SIZE(ZFIELDOUT,1),NOCKMIN:NOCKMAX)) 00134 ALLOCATE(XSEAU_REL(SIZE(ZFIELDOUT,1),NOCKMIN:NOCKMAX)) 00135 DO JLEV=IK1,NOCKMAX 00136 XSEAU(:,JLEV) = ZFIELDOUT(:,JLEV,1) 00137 ENDDO 00138 XSEAU(:,NOCKMIN)=XSEAU(:,IK1) 00139 ! 00140 IF (.NOT.LCURRENT) XSEAU(:,:)=0. 00141 ! 00142 XSEAU_REL(:,:) = XSEAU(:,:) 00143 ! 00144 CASE('VCUR_OC') 00145 ALLOCATE(XSEAV(SIZE(ZFIELDOUT,1),NOCKMIN:NOCKMAX)) 00146 ALLOCATE(XSEAV_REL(SIZE(ZFIELDOUT,1),NOCKMIN:NOCKMAX)) 00147 DO JLEV=IK1,NOCKMAX 00148 XSEAV(:,JLEV) = ZFIELDOUT(:,JLEV,1) 00149 ENDDO 00150 XSEAV(:,NOCKMIN)=XSEAV(:,IK1) 00151 ! 00152 IF (.NOT.LCURRENT) XSEAV(:,:)=0. 00153 ! 00154 XSEAV_REL(:,:) = XSEAV(:,:) 00155 ! 00156 END SELECT 00157 ! 00158 !------------------------------------------------------------------------------ 00159 ! 00160 !* 6. Deallocations 00161 ! 00162 DEALLOCATE(ZFIELD ) 00163 DEALLOCATE(ZFIELDOUT) 00164 IF (LHOOK) CALL DR_HOOK('PREP_HOR_OCEAN_FIELD',1,ZHOOK_HANDLE) 00165 ! 00166 END SUBROUTINE PREP_HOR_OCEAN_FIELD