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