SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/hor_interpol_conf_proj.F90
Go to the documentation of this file.
00001 !     #########
00002 SUBROUTINE HOR_INTERPOL_CONF_PROJ(KLUOUT,PFIELDIN,PFIELDOUT)
00003 !     #################################################################################
00004 !!
00005 !!    PURPOSE
00006 !!    -------
00007 !!
00008 !!    METHOD
00009 !!    ------
00010 !!   
00011 !!    EXTERNAL
00012 !!    --------
00013 !!
00014 !!    IMPLICIT ARGUMENTS
00015 !!    ------------------
00016 !!
00017 !!    REFERENCE
00018 !!    ---------
00019 !!
00020 !!    AUTHOR
00021 !!    ------
00022 !!
00023 !!    MODIFICATION
00024 !!    ------------
00025 !!
00026 !!    02/04/12 M. Tomasini  Add an index in the second dimension of the ISBA 
00027 !!                          array variables for BILIN interpolation routine to 
00028 !!                          not bug in case 2D (this is not the more beautiful
00029 !!                          method; the BILIN routine should better be adapted)
00030 !!                          Search  ! Ajout MT
00031 !-------------------------------------------------------------------------------
00032 !
00033 !
00034 USE MODD_PREP,           ONLY : XLAT_OUT, XLON_OUT, LINTERP
00035 USE MODD_GRID_CONF_PROJ, ONLY : XX, XY, NX, NY, XLAT0, XLON0, XLATORI, &
00036                                   XLONORI, XRPK, XBETA  
00037 USE MODD_SURF_PAR,   ONLY : XUNDEF
00038 !
00039 USE MODE_GRIDTYPE_CONF_PROJ
00040 USE MODI_BILIN
00041 !
00042 !
00043 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00044 USE PARKIND1  ,ONLY : JPRB
00045 !
00046 IMPLICIT NONE
00047 !
00048 !*      0.1    declarations of arguments
00049 !
00050 INTEGER,            INTENT(IN)  :: KLUOUT    ! logical unit of output listing
00051 REAL, DIMENSION(:,:), INTENT(IN)  :: PFIELDIN  ! field to interpolate horizontally
00052 REAL, DIMENSION(:,:), INTENT(OUT) :: PFIELDOUT ! interpolated field
00053 !
00054 !*      0.2    declarations of local variables
00055 !
00056 REAL, DIMENSION(:), ALLOCATABLE :: ZX,ZY        !   coordinate of the output field
00057 REAL, DIMENSION(:), ALLOCATABLE :: ZX_DUPLIQUE  ! X coordinate of the output field  ! Ajout MT
00058 REAL, DIMENSION(:), ALLOCATABLE :: ZY_DUPLIQUE  ! Y coordinate of the output field  ! Ajout MT
00059 REAL, DIMENSION(:), ALLOCATABLE :: ZXY_DUPLIQUE ! Y coordinate of the  input field  ! Ajout MT 
00060 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZFIELDIN           ! input field
00061 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZFIELDIN_DUPLIQUE  ! input field               ! Ajout MT
00062 REAL, DIMENSION(:,:),   ALLOCATABLE :: ZFIELDOUT_DUPLIQUE ! interpolated output field ! Ajout MT
00063 !
00064 INTEGER                           :: INO      ! output number of points
00065 INTEGER                         :: JI,JJ,JL     ! loop index
00066 !
00067 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00068 !
00069 LOGICAL, DIMENSION(:), ALLOCATABLE :: GINTERP_DUPLIQUE ! .true. where physical value is needed ! Ajout MT
00070 !-------------------------------------------------------------------------------------
00071 !
00072 !*      1.    Allocations
00073 !
00074 IF (LHOOK) CALL DR_HOOK('HOR_INTERPOL_CONF_PROJ',0,ZHOOK_HANDLE)
00075 INO = SIZE(XLAT_OUT)
00076 !
00077 ALLOCATE(ZX      (INO))
00078 ALLOCATE(ZY      (INO))
00079 !
00080 IF (NY==1) THEN                         ! Ajout MT
00081    ALLOCATE(ZXY_DUPLIQUE(2),ZFIELDIN_DUPLIQUE(NX,2,SIZE(PFIELDIN,2))) 
00082    ALLOCATE(ZX_DUPLIQUE(2*INO),ZY_DUPLIQUE(2*INO),ZFIELDOUT_DUPLIQUE(2*INO,SIZE(PFIELDIN,2)))    
00083    ALLOCATE(GINTERP_DUPLIQUE(SIZE(ZFIELDOUT_DUPLIQUE,1)))    
00084 END IF
00085 !
00086 !*      2.    Transformation of latitudes/longitudes into metric coordinates of output grid
00087 !
00088  CALL XY_CONF_PROJ(XLAT0,XLON0,XRPK,XBETA,XLATORI,XLONORI, &
00089                     ZX,ZY,XLAT_OUT,XLON_OUT          )  
00090 !
00091 !*      3.    Put input field on its squared grid
00092 !
00093 ALLOCATE(ZFIELDIN(NX,NY,SIZE(PFIELDIN,2)))
00094 !
00095 DO JJ=1,NY
00096   DO JI=1,NX
00097     ZFIELDIN(JI,JJ,:) = PFIELDIN(JI+NX*(JJ-1),:)
00098   END DO
00099 END DO
00100 !
00101 IF (NY==1) THEN                  ! Ajout MT
00102    ZFIELDIN_DUPLIQUE(:,1,:)=ZFIELDIN(:,1,:)
00103    ZFIELDIN_DUPLIQUE(:,2,:)=ZFIELDIN(:,1,:)
00104    ZXY_DUPLIQUE(1)=XY(1)
00105    ZXY_DUPLIQUE(2)=XY(1)+10000.
00106    ZX_DUPLIQUE(1:INO)      =ZX(:)
00107    ZX_DUPLIQUE(INO+1:2*INO)=ZX(:)
00108    ZY_DUPLIQUE(1:INO)      =ZY(:)
00109    ZY_DUPLIQUE(INO+1:2*INO)=ZY(:)+10000.
00110    GINTERP_DUPLIQUE(1:INO)      =LINTERP(1:INO)
00111    GINTERP_DUPLIQUE(INO+1:2*INO)=LINTERP(1:INO)
00112 END IF
00113 !
00114 !*      4.    Interpolation with bilinear
00115 !
00116 IF (NY==1) THEN                  ! Ajout MT
00117    DO JL=1,SIZE(PFIELDIN,2)
00118        CALL BILIN(KLUOUT,XX,ZXY_DUPLIQUE,ZFIELDIN_DUPLIQUE(:,:,JL), &
00119              ZX_DUPLIQUE,ZY_DUPLIQUE,ZFIELDOUT_DUPLIQUE(:,JL),GINTERP_DUPLIQUE)
00120 
00121        PFIELDOUT(1:INO,JL)=ZFIELDOUT_DUPLIQUE(1:INO,JL)
00122    END DO
00123 ELSE
00124    DO JL=1,SIZE(PFIELDIN,2)
00125       CALL BILIN(KLUOUT,XX,XY,ZFIELDIN(:,:,JL),ZX,ZY,PFIELDOUT(:,JL),LINTERP)
00126    END DO
00127 END IF
00128 !
00129 !
00130 !*      5.    Deallocations
00131 !
00132 !
00133 DEALLOCATE(ZX,ZY)
00134 DEALLOCATE(ZFIELDIN)
00135 IF (NY==1) DEALLOCATE(ZXY_DUPLIQUE,ZX_DUPLIQUE,ZY_DUPLIQUE,       &
00136                ZFIELDIN_DUPLIQUE,ZFIELDOUT_DUPLIQUE,GINTERP_DUPLIQUE) ! Ajout MT
00137 !
00138 IF (LHOOK) CALL DR_HOOK('HOR_INTERPOL_CONF_PROJ',1,ZHOOK_HANDLE)
00139 !
00140 !-------------------------------------------------------------------------------------
00141 END SUBROUTINE HOR_INTERPOL_CONF_PROJ