SURFEX v8.1
General documentation of Surfex
make_mask_topd_to_isba.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 !-----------------------------------------------------------------
6 ! #######################
7  SUBROUTINE make_mask_topd_to_isba (HGRID, PGRID_PAR, KI)
8 ! #######################
9 !
10 !!**** *MAKE_MASK_TOPD_TO_ISBA(*
11 !!
12 !! PURPOSE
13 !! -------
14 !
15 ! Create a mask for each catchment.
16 !
17 !
18 !!** METHOD
19 !! ------
20 !
21 !! EXTERNAL
22 !! --------
23 !!
24 !! none
25 !!
26 !! IMPLICIT ARGUMENTS
27 !! ------------------
28 !!
29 !! REFERENCE
30 !! ---------
31 
32 !! AUTHOR
33 !! ------
34 !!
35 !! L. Labatut & K. Chancibault * CNRM *
36 !!
37 !! MODIFICATIONS
38 !! -------------
39 !!
40 !! Original 16/03/2005
41 !! 03/2014 (E. Artinian) manages the option CGRID='IGN'
42 !! 07/2015 (E. Artinian) corrections for option CGRID='IGN'
43 !-------------------------------------------------------------------------------
44 !
45 !* 0. DECLARATIONS
46 ! ------------
47 !
48 USE modd_topodyn, ONLY: nncat, nnyc, xy0, xdxt, nnxc,&
50 USE modd_coupling_topd, ONLY: nmaskt
51 USE modd_surf_par, ONLY : xundef, nundef
52 !
53 USE modi_get_luout
54 USE modi_abor1_sfx
55 USE modi_write_file_map
56 !
57 USE yomhook ,ONLY : lhook, dr_hook
58 USE parkind1 ,ONLY : jprb
59 !
60 IMPLICIT NONE
61 !
62 !* 0.1 declarations of arguments
63 !
64  CHARACTER(LEN=*), INTENT(IN) :: HGRID
65 REAL, DIMENSION(:), INTENT(IN) :: PGRID_PAR
66 !
67 INTEGER, INTENT(IN) :: KI ! Grid dimensions
68 !
69 !* 0.2 declarations of local variables
70 !
71  CHARACTER(LEN=30) :: YVAR ! name of results file
72 INTEGER :: JCAT, JJ, JI, IDX ! loop control
73 INTEGER :: II,ILINE ! work integer variables
74 INTEGER :: IDXM ! indexes of Isba grid meshes and nodes
75 INTEGER :: ILUOUT ! unit
76 REAL :: ZXT, ZYT ! catchment grid nodes Lambert II coordinates
77 REAL, DIMENSION(MAX(1,KI-1)) :: ZX1, ZX2, ZX3, ZX4, ZY1, ZY2, ZY3, ZY4 ! Isba mesh Lambert II coordinates
78 REAL :: ZXA, ZXB, ZYA, ZYB
79 REAL, DIMENSION(NNCAT,NMESHT):: ZWRK
80 REAL(KIND=JPRB) :: ZHOOK_HANDLE
81 !-------------------------------------------------------------------------------
82 IF (lhook) CALL dr_hook('MAKE_MASK_TOPD_TO_ISBA',0,zhook_handle)
83 !
84  CALL get_luout('OFFLIN',iluout)
85 !
86 DO idxm=1,max(ki-1,1)
87  CALL init_4points(idxm,zx1(idxm),zx2(idxm),zx3(idxm),zx4(idxm),&
88  zy1(idxm),zy2(idxm),zy3(idxm),zy4(idxm))
89 ENDDO
90 !
91 !WRITE(*,*) 'Y0=', XY0(1), XY0(2)
92 !WRITE(*,*) 'X0=', XX0(1), XX0(2)
93 !WRITE(*,*) 'X et Y isba=', XXI(1), XXI(180), XYI(1), XYI(180)
94 !loop on catchments
95 DO jcat=1,nncat
96  !
97  DO jj=1,nnyc(jcat) ! number of topographic points on the y axis
98  !
99  zyt = xy0(jcat) + (jj-1) * xdxt(jcat)
100  zyt = zyt + 0.5 * xdxt(jcat)
101  !
102  DO ji=1,nnxc(jcat)
103  !
104  zxt = xx0(jcat) + (ji-1) * xdxt(jcat)
105  zxt = zxt + 0.5 * xdxt(jcat)
106  !
107  idx = (jj-1) * nnxc(jcat) + ji ! index of the point among all in the catchment
108  !
109  !* on vérifie que le pixel du MNT appartient au BV
110  IF ( xtopd(jcat,idx).NE.xnul(jcat) ) THEN
111  !* calcule des coordonées X et Y inf et sup de la maille ISBA considérée
112  CALL get_coord(zxt,zyt,zx1(1),zx2(1),zx3(1),zx4(1),zy1(1),zy2(1),zy3(1),zy4(1),zxa,zya,zxb,zyb)
113  !* si on se trouve sur le premier pixel du MNT ou si le pixel du MNT n'est pas
114  !dans la maille Isba considérée (qui est celle dans laquelle se trouve le pixel précédent)
115  IF (zxt.LT.zxa.OR.zxt.GE.zxb.OR.zyt.LT.zya.OR.zyt.GE.zyb) THEN
116  !* on repart de la première maille de la grille Isba
117  idxm = 1
118  CALL get_coord(zxt,zyt,zx1(idxm),zx2(idxm),zx3(idxm),zx4(idxm),&
119  zy1(idxm),zy2(idxm),zy3(idxm),zy4(idxm),zxa,zya,zxb,zyb)
120  !* on parcours les mailles de la grille Isba, jusqu'à ce qu'on trouve la maille à laquelle appartient le pixel du MNT
121  DO WHILE (zxt.LT.zxa.OR.zxt.GE.zxb.OR.zyt.LT.zya.OR.zyt.GE.zyb)
122  idxm = idxm + 1
123  IF (idxm.GE.ki) THEN
124  WRITE(*,*) 'ZXT', zxt,'ZYT',zyt
125  WRITE(*,*) 'indices Isba:',idxm,'>=',ki
126  CALL abor1_sfx("MAKE_MASK_TOPD_TO_ISBA: PROBLEM")
127  ENDIF
128  CALL get_coord(zxt,zyt,zx1(idxm),zx2(idxm),zx3(idxm),zx4(idxm),&
129  zy1(idxm),zy2(idxm),zy3(idxm),zy4(idxm),zxa,zya,zxb,zyb)
130  ENDDO
131  ENDIF
132  IF (nline(jcat,idx)/=0) nmaskt(jcat,nline(jcat,idx)) = idxm
133  ENDIF
134  ENDDO
135  ENDDO
136  !
137 ENDDO
138 !
139 yvar='.mask_topd'
140 WHERE (nmaskt(:,:)/=nundef)
141  zwrk(:,:)=REAL(nmaskt)
142 ELSEWHERE
143  zwrk(:,:)=xundef
144 ENDWHERE
145  CALL write_file_map(zwrk,yvar)
146 !CALL WRITE_FILE_MAP(REAL(NMASKT),YVAR)
147 !
148 IF (lhook) CALL dr_hook('MAKE_MASK_TOPD_TO_ISBA',1,zhook_handle)
149 !
150 CONTAINS
151 !
152 SUBROUTINE init_4points(KDXM,PX1,PX2,PX3,PX4,PY1,PY2,PY3,PY4)
153 !
154 USE modd_coupling_topd, ONLY: nimax, xxi, xyi
156 !
157 INTEGER, INTENT(IN) :: KDXM
158 REAL, INTENT(OUT) :: PX1, PX2, PX3, PX4
159 REAL, INTENT(OUT) :: PY1, PY2, PY3, PY4
160 REAL, DIMENSION(KI) :: ZDX, ZDY
161 !
162 INTEGER :: ILINE, II, IDXN
163 REAL(KIND=JPRB) :: ZHOOK_HANDLE
164 !
165 IF (lhook) CALL dr_hook('MAKE_MASK_TOPD_TO_ISBA:INIT_4POINTS',0,zhook_handle)
166 !
167 IF (hgrid=='IGN') THEN
168  CALL get_gridtype_ign(pgrid_par,pdx=zdx,pdy=zdy)
169  idxn=kdxm
170  !on va juste retourner les quatre coins de la maille, les XXI et XYI etant les coordonees du centre
171  !on se contente de verifier si la maille TOP est dans la maille SURFEX
172  !la grille est reguliere dans les deux sens mais pas forcement rectangulaire
173  px1=xxi(idxn)-zdx(idxn)/2.0
174  px2=xxi(idxn)+zdx(idxn)/2.0
175  px3=xxi(idxn)-zdx(idxn)/2.0
176  px4=xxi(idxn)+zdx(idxn)/2.0
177  py1=xyi(idxn)-zdy(idxn)/2.0
178  py2=xyi(idxn)-zdy(idxn)/2.0
179  py3=xyi(idxn)+zdy(idxn)/2.0
180  py4=xyi(idxn)+zdy(idxn)/2.0
181 ELSE
182  iline = int(kdxm/(nimax))+1 ! number of the current line
183  ii = kdxm-((iline-1)*nimax) ! index of point in the line
184  idxn = (iline-1)*(nimax+1)+ii ! indice du point dans la grille isba
185 !
186  px1 = xxi(idxn) ! coordonnée X du point courant
187  px2 = xxi(idxn+1) ! coordonnée X du point suivant
188  px3 = xxi(idxn+(nimax+1)) ! coordonnée X du point aligné sur la ligne suivante
189  px4 = xxi(idxn+1+(nimax+1)) ! coordonnée X du point suivant sur la ligne suivante
190 !
191  py1 = xyi(idxn) ! coordonnée Y du point courant
192  py2 = xyi(idxn+1) ! coordonnée Y du point suivant
193  py3 = xyi(idxn+(nimax+1)) ! coordonnée Y du point aligné sur la ligne suivante
194  py4 = xyi(idxn+1+(nimax+1)) ! coordonnée Y du point suivant sur la ligne suivante
195 ENDIF
196 !
197 IF (lhook) CALL dr_hook('MAKE_MASK_TOPD_TO_ISBA:INIT_4POINTS',1,zhook_handle)
198 !
199 END SUBROUTINE init_4points
200 !
201 SUBROUTINE get_coord(PXT,PYT,PX1,PX2,PX3,PX4,PY1,PY2,PY3,PY4,&
202  PXA,PYA,PXB,PYB)
203 !
204 REAL, INTENT(IN) :: PXT, PYT
205 REAL, INTENT(IN) :: PX1, PX2, PX3, PX4
206 REAL, INTENT(IN) :: PY1, PY2, PY3, PY4
207 REAL, INTENT(OUT) :: PXA, PYA, PXB, PYB
208 REAL :: ZFA, ZFB
209 REAL(KIND=JPRB) :: ZHOOK_HANDLE
210 !
211 IF (lhook) CALL dr_hook('MAKE_MASK_TOPD_TO_ISBA:GET_COORD',0,zhook_handle)
212 !
213 IF((px3-px1).EQ.0.0) THEN
214  pxa = px1
215 ELSE
216  CALL get_line_param(px1,py1,px3,py3,zfa,zfb)
217  pxa = (pyt-zfb)/zfa
218 ENDIF
219 !
220 IF ((px4-px2).EQ.0.0) THEN
221  pxb = px2
222 ELSE
223  CALL get_line_param(px2,py2,px4,py4,zfa,zfb)
224  pxb = (pyt-zfb)/zfa
225 ENDIF
226 !
227 IF ((py2-py1).EQ.0.0) THEN
228  pya = py2
229 ELSE
230  CALL get_line_param(px1,py1,px2,py2,zfa,zfb)
231  pya = zfa*pxt+zfb
232 ENDIF
233 !
234 IF ((py4-py3).EQ.0.0) THEN
235  pyb = py4
236 ELSE
237  CALL get_line_param(px3,py3,px4,py4,zfa,zfb)
238  pyb = zfa*pxt+zfb
239 ENDIF
240 !
241 IF (lhook) CALL dr_hook('MAKE_MASK_TOPD_TO_ISBA:GET_COORD',1,zhook_handle)
242 !
243 END SUBROUTINE get_coord
244 !
245 SUBROUTINE get_line_param(PX1,PY1,PX2,PY2,PFA,PFB)
246 !
247 REAL, INTENT(IN) :: PX1, PX2, PY1, PY2
248 REAL, INTENT (OUT) :: PFA, PFB
249 REAL(KIND=JPRB) :: ZHOOK_HANDLE
250 !
251 IF (lhook) CALL dr_hook('MAKE_MASK_TOPD_TO_ISBA:GET_LINE_PARAM',0,zhook_handle)
252 !
253 pfa = (py2 - py1) / (px2 - px1) ! slope
254 pfb = py1 - pfa * px1 ! offset
255 !
256 IF (lhook) CALL dr_hook('MAKE_MASK_TOPD_TO_ISBA:GET_LINE_PARAM',1,zhook_handle)
257 !
258 END SUBROUTINE get_line_param
259 !
260 END SUBROUTINE make_mask_topd_to_isba
real, dimension(:,:), allocatable xtopd
subroutine get_gridtype_ign(PGRID_PAR, KLAMBERT, KL, PX, PY, PDX, PDY, KDIMX, KDIMY, PXALL, PYALL)
real, dimension(:), allocatable xx0
real, dimension(:), allocatable xyi
integer, dimension(:,:), allocatable nline
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
subroutine get_line_param(PX1, PY1, PX2, PY2, PFA, PFB)
integer nmesht
integer, parameter jprb
Definition: parkind1.F90:32
real, dimension(:), allocatable xdxt
subroutine make_mask_topd_to_isba(HGRID, PGRID_PAR, KI)
integer, parameter nundef
integer, dimension(:), allocatable nnyc
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
real, dimension(:), allocatable xnul
real, dimension(:), allocatable xxi
logical lhook
Definition: yomhook.F90:15
integer, dimension(:), allocatable nnxc
subroutine get_coord(PIN, PDIN, POUT, KSIZE)
real, dimension(:), allocatable xy0
subroutine write_file_map(PVAR, HVAR)
subroutine init_4points(KDXM, PX1, PX2, PX3, PX4, PY1, PY2, PY3, PY4)
integer, dimension(:,:), allocatable nmaskt