1 SUBROUTINE eggx_n(PI,PRA,KROTEQ,PLONR,PLATR,PBETA,PLON1,PLAT1,PLON2,PLAT2,&
2 & PLON0,PLAT0,PRPK,KULOUT,KSOTRP,KGIVO,&
3 & PGELAM,PGELAT,PGM,PGNORX,PGNORY,KDLSA,&
4 & KDLSUR,KDGSA,KDGEN,KDLUN,KDLUX,KDGUN,KDGUX,&
5 & PDELX,PDELY,PLONC,PLATC)
125 USE eggpack ,ONLY : lola,
xy,
nbpts,
pgn,
delta,
error,
domi,
param_proj,
makdo,&
132 INTEGER(KIND=JPIM),
INTENT(INOUT) :: KROTEQ
133 INTEGER(KIND=JPIM),
INTENT(IN) :: KULOUT
134 INTEGER(KIND=JPIM),
INTENT(INOUT) :: KSOTRP
135 INTEGER(KIND=JPIM),
INTENT(INOUT) :: KGIVO
136 INTEGER(KIND=JPIM),
INTENT(INOUT) :: KDLSA
137 INTEGER(KIND=JPIM),
INTENT(INOUT) :: KDLSUR
138 INTEGER(KIND=JPIM),
INTENT(INOUT) :: KDGSA
139 INTEGER(KIND=JPIM),
INTENT(INOUT) :: KDGEN
140 INTEGER(KIND=JPIM),
INTENT(IN) :: KDLUN
141 INTEGER(KIND=JPIM),
INTENT(IN) :: KDLUX
142 INTEGER(KIND=JPIM),
INTENT(IN) :: KDGUN
143 INTEGER(KIND=JPIM),
INTENT(IN) :: KDGUX
144 REAL(KIND=JPRB) ,
INTENT(IN) :: PI
145 REAL(KIND=JPRB) ,
INTENT(IN) :: PRA
146 REAL(KIND=JPRB) ,
INTENT(INOUT) :: PLONR
147 REAL(KIND=JPRB) ,
INTENT(INOUT) :: PLATR
148 REAL(KIND=JPRB) ,
INTENT(INOUT) :: PBETA
149 REAL(KIND=JPRB) ,
INTENT(INOUT) :: PLON1
150 REAL(KIND=JPRB) ,
INTENT(INOUT) :: PLAT1
151 REAL(KIND=JPRB) ,
INTENT(INOUT) :: PLON2
152 REAL(KIND=JPRB) ,
INTENT(INOUT) :: PLAT2
153 REAL(KIND=JPRB) ,
INTENT(INOUT) :: PLON0
154 REAL(KIND=JPRB) ,
INTENT(INOUT) :: PLAT0
155 REAL(KIND=JPRB) ,
INTENT(INOUT) :: PRPK
156 REAL(KIND=JPRB) ,
INTENT(OUT) :: PGELAM(kdlsa:kdlsur,kdgsa:kdgen)
157 REAL(KIND=JPRB) ,
INTENT(OUT) :: PGELAT(kdlsa:kdlsur,kdgsa:kdgen)
158 REAL(KIND=JPRB) ,
INTENT(OUT) :: PGM(kdlsa:kdlsur,kdgsa:kdgen)
159 REAL(KIND=JPRB) ,
INTENT(OUT) :: PGNORX(kdlsa:kdlsur,kdgsa:kdgen)
160 REAL(KIND=JPRB) ,
INTENT(OUT) :: PGNORY(kdlsa:kdlsur,kdgsa:kdgen)
161 REAL(KIND=JPRB) ,
INTENT(INOUT) :: PDELX
162 REAL(KIND=JPRB) ,
INTENT(INOUT) :: PDELY
163 REAL(KIND=JPRB) ,
INTENT(INOUT) :: PLONC
164 REAL(KIND=JPRB) ,
INTENT(INOUT) :: PLATC
168 type(
lola) :: yl_tlkres, yl_tlcent, yl_tlsw_lola, yl_tlne_lola
169 type(
lola),
ALLOCATABLE :: yl_tlgrid_lola(:,:)
170 type(
xy) :: yl_tlsw_xy , yl_tlne_xy, yl_tlcent_xy
171 type(
nbpts) :: yl_tlnb_pts
172 type(
pgn),
ALLOCATABLE :: yl_tlgrid_pgn(:,:)
173 type(
delta) :: yl_tldel
174 type(
error) :: yl_tlerr
175 type(
domi) :: yl_tlgrid_info
177 REAL(KIND=JPRB) :: ZGRID_MF(kdlux-kdlun+1,kdgux-kdgun+1)
178 REAL(KIND=JPRB) :: ZRTD
179 REAL(KIND=JPRB) :: ZPI, ZRA
180 REAL(KIND=JPRB) :: ZHOOK_HANDLE
181 REAL(KIND=JPRB) :: ZEPS
188 #include "abor1.intfb.h" 196 IF (int(pi*100._jprb) == 314)
THEN 200 zpi=asin(1.0_jprb)*2.0_jprb
203 zeps=epsilon(1.0_jprb)*100.0_jprb
204 zrtd = 180.0_jprb/zpi
211 WRITE(kulout,*)
'********* INFO of Input data in EGGX_N **************' 212 WRITE(kulout,*)
'PLON0 (rd) = ',plon0,
'PLON0 (dg) = ',plon0*zrtd
213 WRITE(kulout,*)
'PLAT0 (rd) = ',plat0,
'PLAT0 (dg) = ',plat0*zrtd
214 WRITE(kulout,*)
'PLONC (rd) = ',plonc,
'PLONC (dg) = ',plonc*zrtd
215 WRITE(kulout,*)
'PLATC (rd) = ',platc,
'PLATC (dg) = ',platc*zrtd
216 WRITE(kulout,*)
'PLON1 (rd) = ',plon1,
'PLON1 (dg) = ',plon1*zrtd
217 WRITE(kulout,*)
'PLAT1 (rd) = ',plat1,
'PLAT1 (dg) = ',plat1*zrtd
218 WRITE(kulout,*)
'PLON2 (rd) = ',plon2,
'PLON2 (dg) = ',plon2*zrtd
219 WRITE(kulout,*)
'PLAT2 (rd) = ',plat2,
'PLAT2 (dg) = ',plat2*zrtd
220 WRITE(kulout,*)
'PDELX = ',pdelx
221 WRITE(kulout,*)
'PDELY = ',pdely
222 WRITE(kulout,*)
'KROTEQ = ',kroteq
223 WRITE(kulout,*)
'****************************************************' 226 WRITE(kulout,*)
'KROTEQ < 0 : New Eggx domain' 228 llmrt = (kroteq == -2)
229 IF (.NOT.llmrt) kroteq = -1
230 WRITE(kulout,*)
'KROTEQ = ',kroteq,
'LLMRT = ',llmrt
231 IF (llmrt .AND. (abs(plat0) >= zeps))
THEN 232 WRITE(kulout,*)
'EGGX_N: PLAT0=',plat0,&
233 &
' MUST BE EQUAL ZERO IF LLMRT IS TRUE!' 234 CALL abor1(
'EGGX_N: LLMRT & PLAT0 INCONSISTENT')
241 yl_tlkres%LON = plon0*zrtd
242 yl_tlkres%LAT = plat0*zrtd
243 yl_tlcent%LON = plonc*zrtd
244 yl_tlcent%LAT = platc*zrtd
249 yl_tlnb_pts%ONX = kdlux-kdlun+1
250 yl_tlnb_pts%ONY = kdgux-kdgun+1
251 ALLOCATE(yl_tlgrid_lola(kdlux-kdlun+1,kdgux-kdgun+1))
252 ALLOCATE(yl_tlgrid_pgn(kdlux-kdlun+1,kdgux-kdgun+1))
253 CALL makdo(yl_tlkres,yl_tlcent,yl_tldel,yl_tlnb_pts,yl_tlgrid_lola,&
254 & zgrid_mf,yl_tlgrid_pgn,yl_tlgrid_info,yl_tlerr,.true.,.true.,&
255 & zpi,zra,kulout,llmrt)
256 plon1 = yl_tlgrid_lola(1,1)%LON
257 plat1 = yl_tlgrid_lola(1,1)%LAT
258 plon2 = yl_tlgrid_lola(yl_tlnb_pts%ONX,yl_tlnb_pts%ONY)%LON
259 plat2 = yl_tlgrid_lola(yl_tlnb_pts%ONX,yl_tlnb_pts%ONY)%LAT
260 plon0 = yl_tlkres%LON
261 plat0 = yl_tlkres%LAT
262 plonc = yl_tlcent%LON
263 platc = yl_tlcent%LAT
264 prpk = yl_tlgrid_info%INFO_PROJ%KL
265 pgelam(kdlun:kdlux,kdgun:kdgux) = yl_tlgrid_lola(1:yl_tlnb_pts%ONX,1:yl_tlnb_pts%ONY)%LON
266 pgelat(kdlun:kdlux,kdgun:kdgux) = yl_tlgrid_lola(1:yl_tlnb_pts%ONX,1:yl_tlnb_pts%ONY)%LAT
267 pgm(kdlun:kdlux,kdgun:kdgux) = zgrid_mf(1:yl_tlnb_pts%ONX,1:yl_tlnb_pts%ONY)
268 pgnorx(kdlun:kdlux,kdgun:kdgux) = yl_tlgrid_pgn(1:yl_tlnb_pts%ONX,1:yl_tlnb_pts%ONY)%ONX
269 pgnory(kdlun:kdlux,kdgun:kdgux) = yl_tlgrid_pgn(1:yl_tlnb_pts%ONX,1:yl_tlnb_pts%ONY)%ONY
270 DEALLOCATE(yl_tlgrid_lola)
271 DEALLOCATE(yl_tlgrid_pgn)
277 WRITE(kulout,*)
'EGGX_N: NROTEQ=',kroteq,&
278 &
' IS NOT VALID VALUE, IT MUST BE ZERO!' 279 CALL abor1(
'EGGX_N: UNSUPPORTED NROTEQ')
280 ELSEIF (pbeta /= 0.0_jprb .AND. prpk == 0.0_jprb)
THEN 281 WRITE(kulout,*)
'EGGX_N: ROTATED DOMAIN IN MERCATOR PROJECTION NOT& 282 & SUPPORTED (EBETA HAS TO BE 0)' 283 CALL abor1(
'EGGX_N: UNSUPPORTED EBETA')
284 ELSEIF ( abs(prpk-abs(sin(plat0))) > 1.e-7 )
THEN 285 WRITE(kulout,*)
'EGGX_N: YOU SEEM TO HAVE A SECANT CASE OF PROJECTION' 286 WRITE(kulout,*)
' ERPK=',prpk,
' SIN(ELAT0)=',sin(plat0)
287 CALL abor1(
'EGGX_N: UNSUPPORTED SECANT PROJECTION')
289 WRITE(kulout,*)
'KROTEQ = 0 : Old Eggx domain' 294 IF(ksotrp/=0 .OR. kgivo/=0 .OR. prpk==10._jprb)
THEN 295 WRITE(kulout,*)
'Call old EGGX to handle cases when corners may change' 296 WRITE(kulout,*)
'KSOTRP = ',ksotrp,
' KGIVO = ',kgivo,
' PRPK = ',prpk
297 CALL eggx(
REAL(ZPI,JPRB),
REAL(ZRA,JPRB),KROTEQ,PLONR,PLATR,PBETA,PLON1,PLAT1,PLON2,PLAT2,&
298 & PLON0,PLAT0,PRPK,KULOUT,KSOTRP,KGIVO,&
299 & PGELAM,PGELAT,PGM,PGNORX,PGNORY,KDLSA,KDLSUR,KDGSA,KDGEN,&
300 & KDLUN,KDLUX,KDGUN,KDGUX,PDELX,PDELY)
304 WRITE(kulout,*)
'COMPUTATION OF CENTER' 305 yl_tlkres%LON = plon0*zrtd
306 yl_tlkres%LAT = plat0*zrtd
309 yl_tlsw_lola%LON = plon1
310 yl_tlsw_lola%LAT = plat1
311 yl_tlne_lola%LON = plon2
312 yl_tlne_lola%LAT = plat2
317 yl_tlcent_xy%X = (yl_tlsw_xy%X+yl_tlne_xy%X)*0.5_jprb
318 yl_tlcent_xy%Y = (yl_tlsw_xy%Y+yl_tlne_xy%Y)*0.5_jprb
320 plonc = yl_tlcent%LON
321 platc = yl_tlcent%LAT
328 IF(ksotrp==0 .AND. kgivo==0 .AND. prpk/=10._jprb)
THEN 332 WRITE(kulout,*) .AND..AND.
'KSOTRP==0 KGIVO==0 PRPK/=10' 333 WRITE(kulout,*)
'COMPUTATION OF RESOLUTION AND USE OF MAKDO' 334 WRITE(kulout,*)
'because cadre is in old style but domain may be created' 335 WRITE(kulout,*)
'by new eggx (may be not supported by old eggx)' 336 IF ((kdlux-kdlun) == 0)
THEN 339 pdelx = abs(yl_tlne_xy%X-yl_tlsw_xy%X)/
REAL(kdlux-kdlun,
jprb)
341 IF ((kdgux-kdgun) == 0)
THEN 344 pdely = abs(yl_tlne_xy%Y-yl_tlsw_xy%Y)/
REAL(kdgux-kdgun,
jprb)
346 yl_tlcent%LON = plonc*zrtd
347 yl_tlcent%LAT = platc*zrtd
352 yl_tlnb_pts%ONX = kdlux-kdlun+1
353 yl_tlnb_pts%ONY = kdgux-kdgun+1
354 ALLOCATE(yl_tlgrid_lola(kdlux-kdlun+1,kdgux-kdgun+1))
355 ALLOCATE(yl_tlgrid_pgn(kdlux-kdlun+1,kdgux-kdgun+1))
356 CALL makdo(yl_tlkres,yl_tlcent,yl_tldel,yl_tlnb_pts,yl_tlgrid_lola,&
357 & zgrid_mf,yl_tlgrid_pgn,yl_tlgrid_info,yl_tlerr,.true.,.true.,&
358 & zpi,zra,kulout,.false.)
359 plon1 = yl_tlgrid_lola(1,1)%LON
360 plat1 = yl_tlgrid_lola(1,1)%LAT
361 plon2 = yl_tlgrid_lola(yl_tlnb_pts%ONX,yl_tlnb_pts%ONY)%LON
362 plat2 = yl_tlgrid_lola(yl_tlnb_pts%ONX,yl_tlnb_pts%ONY)%LAT
363 plon0 = yl_tlkres%LON
364 plat0 = yl_tlkres%LAT
365 plonc = yl_tlcent%LON
366 platc = yl_tlcent%LAT
367 prpk = yl_tlgrid_info%INFO_PROJ%KL
368 pgelam(kdlun:kdlux,kdgun:kdgux) = yl_tlgrid_lola(1:yl_tlnb_pts%ONX,1:yl_tlnb_pts%ONY)%LON
369 pgelat(kdlun:kdlux,kdgun:kdgux) = yl_tlgrid_lola(1:yl_tlnb_pts%ONX,1:yl_tlnb_pts%ONY)%LAT
370 pgm(kdlun:kdlux,kdgun:kdgux) = zgrid_mf(1:yl_tlnb_pts%ONX,1:yl_tlnb_pts%ONY)
371 pgnorx(kdlun:kdlux,kdgun:kdgux) = yl_tlgrid_pgn(1:yl_tlnb_pts%ONX,1:yl_tlnb_pts%ONY)%ONX
372 pgnory(kdlun:kdlux,kdgun:kdgux) = yl_tlgrid_pgn(1:yl_tlnb_pts%ONX,1:yl_tlnb_pts%ONY)%ONY
373 DEALLOCATE(yl_tlgrid_lola)
374 DEALLOCATE(yl_tlgrid_pgn)
376 WRITE(kulout,*)
'SWX = ',yl_tlsw_xy%X,
'NEX = ',yl_tlne_xy%X,
'CEX = ',yl_tlcent_xy%X
377 WRITE(kulout,*)
'SWY = ',yl_tlsw_xy%Y,
'NEY = ',yl_tlne_xy%Y,
'CEY = ',yl_tlcent_xy%Y
380 WRITE(kulout,*)
'********* INFO before Return out of EGGX_N *********' 381 WRITE(kulout,*)
'PLON0 (rd) = ',plon0,
'PLON0 (dg) = ',plon0*zrtd
382 WRITE(kulout,*)
'PLAT0 (rd) = ',plat0,
'PLAT0 (dg) = ',plat0*zrtd
383 WRITE(kulout,*)
'PLONC (rd) = ',plonc,
'PLONC (dg) = ',plonc*zrtd
384 WRITE(kulout,*)
'PLATC (rd) = ',platc,
'PLATC (dg) = ',platc*zrtd
385 WRITE(kulout,*)
'PLON1 (rd) = ',plon1,
'PLON1 (dg) = ',plon1*zrtd
386 WRITE(kulout,*)
'PLAT1 (rd) = ',plat1,
'PLAT1 (dg) = ',plat1*zrtd
387 WRITE(kulout,*)
'PGELAM(KDLUN,KDGUN):SW (rd) = ',pgelam(kdlun,kdgun)
388 WRITE(kulout,*)
'PGELAM(KDLUN,KDGUN):SW (dg) = ',pgelam(kdlun,kdgun)*zrtd
389 WRITE(kulout,*)
'PGELAT(KDLUN,KDGUN):SW (rd) = ',pgelat(kdlun,kdgun)
390 WRITE(kulout,*)
'PGELAT(KDLUN,KDGUN):SW (dg) = ',pgelat(kdlun,kdgun)*zrtd
391 WRITE(kulout,*)
'PLON2 (rd) = ',plon2,
'PLON2 (dg) = ',plon2*zrtd
392 WRITE(kulout,*)
'PLAT2 (rd) = ',plat2,
'PLAT2 (dg) = ',plat2*zrtd
393 WRITE(kulout,*)
'PGELAM(KDLUX,KDGUX):NE (rd) = ',pgelam(kdlux,kdgux)
394 WRITE(kulout,*)
'PGELAM(KDLUX,KDGUX):NE (dg) = ',pgelam(kdlux,kdgux)*zrtd
395 WRITE(kulout,*)
'PGELAT(KDLUX,KDGUX):NE (rd) = ',pgelat(kdlux,kdgux)
396 WRITE(kulout,*)
'PGELAT(KDLUX,KDGUX):NE (dg) = ',pgelat(kdlux,kdgux)*zrtd
397 WRITE(kulout,*)
'PRPK = ',prpk
398 WRITE(kulout,*)
'PGM(KDLUN,KDGUN) (SW) = ',pgm(kdlun,kdgun)
399 WRITE(kulout,*)
'PGNORX(KDLUN,KDGUN) (SW) = ',pgnorx(kdlun,kdgun)
400 WRITE(kulout,*)
'PGNORY(KDLUN,KDGUN) (SW) = ',pgnory(kdlun,kdgun)
401 WRITE(kulout,*)
'PDELX = ',pdelx
402 WRITE(kulout,*)
'PDELY = ',pdely
403 WRITE(kulout,*)
'****************************************************'
type(param_proj) function ref_datas(REF_COORD, RA, TOZERO_COORD, LRT)
subroutine makdo(YD_REF_COORD, YD_CENTER_COORD, YD_PDEL, YD_NB_PTS, YD_GRID_COORD, P_GRID_MF, YD_GRID_PGN, YD_GRID_INFO, YD_ERR_CODE, LD_LIP, LD_AUTO_STOP, PI, P_RA, KOUT, LD_LMRT)
subroutine eggx_n(PI, PRA, KROTEQ, PLONR, PLATR, PBETA, PLON1, PLAT1, PLON2, PLAT2, PLON0, PLAT0, PRPK, KULOUT, KSOTRP, KGIVO, PGELAM, PGELAT, PGM, PGNORX, PGNORY, KDLSA, KDLSUR, KDGSA, KDGEN, KDLUN, KDLUX, KDGUN, KDGUX, PDELX, PDELY, PLONC, PLATC)
subroutine eggx(PRPI, PRA, KROTEQ, PLONR, PLATR, PBETA, PLON1, PLAT1, PLON2, PLAT2, PLON0, PLAT0, PRPK, KULOUT, KSOTRP, KGIV0, PGELAM, PGELAT, PGM, PGNORX, PGNORY, KDLSA, KDLSUR, KDGSA, KDGEN, KDLUN, KDLUX, KDGUN, KDGUX, PDELX, PDELY)