SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/TOPD/make_mask_topd_to_isba.F90
Go to the documentation of this file.
00001 !-----------------------------------------------------------------
00002 !     #######################
00003     SUBROUTINE MAKE_MASK_TOPD_TO_ISBA(KI)
00004 !     #######################
00005 !
00006 !!****  *MAKE_MASK_TOPD_TO_ISBA(*  
00007 !!
00008 !!    PURPOSE
00009 !!    -------
00010 !
00011 !     Create a mask for each catchment. 
00012 !         
00013 !     
00014 !!**  METHOD
00015 !!    ------
00016 !
00017 !!    EXTERNAL
00018 !!    --------
00019 !!
00020 !!    none
00021 !!
00022 !!    IMPLICIT ARGUMENTS
00023 !!    ------------------ 
00024 !!                     
00025 !!    REFERENCE
00026 !!    ---------
00027      
00028 !!    AUTHOR
00029 !!    ------
00030 !!
00031 !!      L. Labatut & K. Chancibault     * CNRM *
00032 !!
00033 !!    MODIFICATIONS
00034 !!    -------------
00035 !!
00036 !!      Original   16/03/2005
00037 !-------------------------------------------------------------------------------
00038 !
00039 !*       0.     DECLARATIONS
00040 !               ------------
00041 !
00042 USE MODD_TOPODYN,       ONLY: NNCAT, NNYC, XY0, XDXT, NNXC,&
00043                                 XX0, XTOPD, XNUL, NLINE, NMESHT
00044 USE MODD_COUPLING_TOPD, ONLY: NMASKT
00045 USE MODD_SURF_PAR,        ONLY : XUNDEF, NUNDEF
00046 !
00047 USE MODI_GET_LUOUT
00048 USE MODI_ABOR1_SFX
00049 USE MODI_WRITE_FILE_MAP
00050 !
00051 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00052 USE PARKIND1  ,ONLY : JPRB
00053 !
00054 IMPLICIT NONE
00055 !
00056 !*      0.1    declarations of arguments
00057 !
00058 INTEGER, INTENT(IN) :: KI    ! Grid dimensions
00059 !
00060 !*      0.2    declarations of local variables
00061 !
00062  CHARACTER(LEN=30)  :: YVAR        ! name of results file
00063 INTEGER            :: JCAT, JJ, JI, IDX     ! loop control  
00064 INTEGER            :: II,ILINE ! work integer variables
00065 INTEGER            :: IDXM     ! indexes of Isba grid meshes and nodes
00066 INTEGER            :: ILUOUT   ! unit
00067 REAL               :: ZXT, ZYT ! catchment grid nodes Lambert II coordinates 
00068 REAL               :: ZX1, ZX2, ZX3, ZX4, ZY1, ZY2, ZY3, ZY4  ! Isba mesh Lambert II coordinates
00069 REAL               :: ZXA, ZXB, ZYA, ZYB
00070 REAL, DIMENSION(NNCAT,NMESHT):: ZWRK
00071 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00072 !-------------------------------------------------------------------------------
00073 IF (LHOOK) CALL DR_HOOK('MAKE_MASK_TOPD_TO_ISBA',0,ZHOOK_HANDLE)
00074 !
00075  CALL GET_LUOUT('OFFLIN',ILUOUT)
00076 !  
00077 !WRITE(*,*) 'Y0=', XY0(1), XY0(2)
00078 !WRITE(*,*) 'X0=', XX0(1), XX0(2)
00079 !WRITE(*,*) 'X et Y isba=', XXI(1), XXI(180), XYI(1), XYI(180)
00080 !loop on catchments
00081 DO JCAT=1,NNCAT
00082   !
00083   IDXM  = 1
00084   CALL INIT_4POINTS(IDXM,ZX1,ZX2,ZX3,ZX4,ZY1,ZY2,ZY3,ZY4)
00085   !
00086   DO JJ=1,NNYC(JCAT)   ! number of topographic points on the y axis
00087     !
00088     ZYT = XY0(JCAT) + (JJ-1) * XDXT(JCAT)
00089     ZYT = ZYT + 0.5 * XDXT(JCAT)
00090     !
00091     DO JI=1,NNXC(JCAT)
00092       !
00093       ZXT = XX0(JCAT) + (JI-1) * XDXT(JCAT)
00094       ZXT = ZXT + 0.5 * XDXT(JCAT)
00095       !
00096       IDX = (JJ-1) * NNXC(JCAT) + JI   ! index of the point among all in the catchment
00097       !
00098       !* on vérifie que le pixel du MNT appartient au BV
00099       IF ( XTOPD(JCAT,IDX).NE.XNUL(JCAT) ) THEN
00100         !* calcule des coordonées X et Y inf et sup de la maille ISBA considérée
00101         CALL GET_COORD(ZXT,ZYT,ZX1,ZX2,ZX3,ZX4,ZY1,ZY2,ZY3,ZY4,ZXA,ZYA,ZXB,ZYB)
00102         !* si on se trouve sur le premier pixel du MNT ou si le pixel du MNT n'est pas 
00103         !dans la maille Isba considérée (qui est celle dans laquelle se trouve le pixel précédent)
00104         IF (ZXT.LT.ZXA.OR.ZXT.GE.ZXB.OR.ZYT.LT.ZYA.OR.ZYT.GE.ZYB) THEN
00105           !* on repart de la première maille de la grille Isba
00106           IDXM = 1
00107           CALL INIT_4POINTS(IDXM,ZX1,ZX2,ZX3,ZX4,ZY1,ZY2,ZY3,ZY4)
00108           CALL GET_COORD(ZXT,ZYT,ZX1,ZX2,ZX3,ZX4,ZY1,ZY2,ZY3,ZY4,ZXA,ZYA,ZXB,ZYB)
00109           !* on parcours les mailles de la grille Isba, jusqu'à ce qu'on trouve la maille à laquelle appartient le pixel du MNT
00110           DO WHILE (ZXT.LT.ZXA.OR.ZXT.GE.ZXB.OR.ZYT.LT.ZYA.OR.ZYT.GE.ZYB)
00111             IDXM = IDXM + 1
00112             IF (IDXM.GE.KI) THEN
00113               WRITE(*,*) 'ZXT', ZXT,'ZYT',ZYT
00114               WRITE(*,*) 'indices Isba:',IDXM,'>=',KI
00115               CALL ABOR1_SFX("MAKE_MASK_TOPD_TO_ISBA: PROBLEM")
00116             ENDIF
00117             CALL INIT_4POINTS(IDXM,ZX1,ZX2,ZX3,ZX4,ZY1,ZY2,ZY3,ZY4)
00118             CALL GET_COORD(ZXT,ZYT,ZX1,ZX2,ZX3,ZX4,ZY1,ZY2,ZY3,ZY4,ZXA,ZYA,ZXB,ZYB)
00119           ENDDO
00120         ENDIF
00121         IF (NLINE(JCAT,IDX)/=0) NMASKT(JCAT,NLINE(JCAT,IDX)) = IDXM
00122       ENDIF
00123     ENDDO
00124   ENDDO
00125 ENDDO
00126 !
00127 YVAR='.mask_topd'
00128 WHERE (NMASKT(:,:)/=NUNDEF)
00129   ZWRK(:,:)=REAL(NMASKT)
00130 ELSEWHERE
00131   ZWRK(:,:)=XUNDEF
00132 ENDWHERE
00133  CALL WRITE_FILE_MAP(ZWRK,YVAR)
00134 !CALL WRITE_FILE_MAP(REAL(NMASKT),YVAR)
00135 !
00136 IF (LHOOK) CALL DR_HOOK('MAKE_MASK_TOPD_TO_ISBA',1,ZHOOK_HANDLE)
00137 !
00138 CONTAINS
00139 !
00140 SUBROUTINE INIT_4POINTS(KDXM,PX1,PX2,PX3,PX4,PY1,PY2,PY3,PY4)
00141 !
00142 USE MODD_COUPLING_TOPD, ONLY: NIMAX, XXI, XYI
00143 !
00144 INTEGER, INTENT(IN) :: KDXM
00145 REAL, INTENT(OUT) :: PX1, PX2, PX3, PX4
00146 REAL, INTENT(OUT) :: PY1, PY2, PY3, PY4
00147 !
00148 INTEGER :: ILINE, II, IDXN
00149 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00150 !
00151 IF (LHOOK) CALL DR_HOOK('MAKE_MASK_TOPD_TO_ISBA:INIT_4POINTS',0,ZHOOK_HANDLE)
00152 !
00153 ILINE = INT(KDXM/(NIMAX))+1      ! number of the current line
00154 II    = KDXM-((ILINE-1)*NIMAX)   ! index of point in the line
00155 IDXN  = (ILINE-1)*(NIMAX+1)+II   ! indice du point dans la grille isba
00156 !
00157 PX1 = XXI(IDXN)              ! coordonnée X du point courant
00158 PX2 = XXI(IDXN+1)            ! coordonnée X du point suivant
00159 PX3 = XXI(IDXN+(NIMAX+1))    ! coordonnée X du point aligné sur la ligne suivante 
00160 PX4 = XXI(IDXN+1+(NIMAX+1))  ! coordonnée X du point suivant sur la ligne suivante
00161 !
00162 PY1 = XYI(IDXN)              ! coordonnée Y du point courant
00163 PY2 = XYI(IDXN+1)            ! coordonnée Y du point suivant
00164 PY3 = XYI(IDXN+(NIMAX+1))    ! coordonnée Y du point aligné sur la ligne suivante
00165 PY4 = XYI(IDXN+1+(NIMAX+1))  ! coordonnée Y du point suivant sur la ligne suivante
00166 !
00167 IF (LHOOK) CALL DR_HOOK('MAKE_MASK_TOPD_TO_ISBA:INIT_4POINTS',1,ZHOOK_HANDLE)
00168 !
00169 END SUBROUTINE INIT_4POINTS
00170 !
00171 SUBROUTINE GET_COORD(PXT,PYT,PX1,PX2,PX3,PX4,PY1,PY2,PY3,PY4,&
00172                      PXA,PYA,PXB,PYB)
00173 !
00174 REAL, INTENT(IN) :: PXT, PYT
00175 REAL, INTENT(IN) :: PX1, PX2, PX3, PX4
00176 REAL, INTENT(IN) :: PY1, PY2, PY3, PY4
00177 REAL, INTENT(OUT) :: PXA, PYA, PXB, PYB
00178 REAL :: ZFA, ZFB
00179 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00180 !
00181 IF (LHOOK) CALL DR_HOOK('MAKE_MASK_TOPD_TO_ISBA:GET_COORD',0,ZHOOK_HANDLE)
00182 !
00183 IF((PX3-PX1).EQ.0.0) THEN
00184   PXA = PX1
00185 ELSE
00186   CALL GET_LINE_PARAM(PX1,PY1,PX3,PY3,ZFA,ZFB)
00187   PXA = (ZYT-ZFB)/ZFA
00188 ENDIF
00189 !
00190 IF ((PX4-PX2).EQ.0.0) THEN
00191   PXB = PX2
00192 ELSE
00193   CALL GET_LINE_PARAM(PX2,PY2,PX4,PY4,ZFA,ZFB)
00194   PXB = (ZYT-ZFB)/ZFA
00195 ENDIF
00196 !
00197 IF ((PY2-PY1).EQ.0.0) THEN
00198   PYA = PY2
00199 ELSE
00200   CALL GET_LINE_PARAM(PX1,PY1,PX2,PY2,ZFA,ZFB)
00201   PYA = ZFA*ZXT+ZFB
00202 ENDIF
00203 !
00204 IF ((PY4-PY3).EQ.0.0) THEN
00205   PYB = PY4
00206 ELSE
00207   CALL GET_LINE_PARAM(PX3,PY3,PX4,PY4,ZFA,ZFB)
00208   PYB = ZFA*ZXT+ZFB
00209 ENDIF
00210 !
00211 IF (LHOOK) CALL DR_HOOK('MAKE_MASK_TOPD_TO_ISBA:GET_COORD',1,ZHOOK_HANDLE)
00212 !
00213 END SUBROUTINE GET_COORD
00214 !
00215 SUBROUTINE GET_LINE_PARAM(PX1,PY1,PX2,PY2,PFA,PFB)
00216 !
00217 REAL, INTENT(IN) :: PX1, PX2, PY1, PY2
00218 REAL, INTENT (OUT) :: PFA, PFB
00219 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00220 !
00221 IF (LHOOK) CALL DR_HOOK('MAKE_MASK_TOPD_TO_ISBA:GET_LINE_PARAM',0,ZHOOK_HANDLE)
00222 !
00223 PFA = (PY2 - PY1) / (PX2 - PX1)  ! slope
00224 PFB = PY1 - PFA * PX1 ! offset
00225 !
00226 IF (LHOOK) CALL DR_HOOK('MAKE_MASK_TOPD_TO_ISBA:GET_LINE_PARAM',1,ZHOOK_HANDLE)
00227 !
00228 END SUBROUTINE GET_LINE_PARAM
00229 !
00230 END SUBROUTINE MAKE_MASK_TOPD_TO_ISBA