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