1 |
SUBROUTINE fxyhyper ( yzoom, grossy, dzoomy,tauy , & |
module fxyhyper_m |
|
xzoom, grossx, dzoomx,taux , & |
|
|
rlatu,yprimu,rlatv,yprimv,rlatu1, yprimu1, rlatu2, yprimu2 , & |
|
|
rlonu,xprimu,rlonv,xprimv,rlonm025,xprimm025,rlonp025,xprimp025) |
|
2 |
|
|
|
! From dyn3d/fxyhyper.F,v 1.1.1.1 2004/05/19 12:53:06 |
|
|
|
|
|
use dimens_m |
|
|
use paramet_m |
|
3 |
IMPLICIT NONE |
IMPLICIT NONE |
|
! |
|
|
! Auteur : P. Le Van . |
|
|
! |
|
|
! d'apres formulations de R. Sadourny . |
|
|
! |
|
|
! |
|
|
! Ce spg calcule les latitudes( routine fyhyp ) et longitudes( fxhyp ) |
|
|
! par des fonctions a tangente hyperbolique . |
|
|
! |
|
|
! Il y a 3 parametres ,en plus des coordonnees du centre du zoom (xzoom |
|
|
! et yzoom ) : |
|
|
! |
|
|
! a) le grossissement du zoom : grossy ( en y ) et grossx ( en x ) |
|
|
! b) l' extension du zoom : dzoomy ( en y ) et dzoomx ( en x ) |
|
|
! c) la raideur de la transition du zoom : taux et tauy |
|
|
! |
|
|
! N.B : Il vaut mieux avoir : grossx * dzoomx < pi ( radians ) |
|
|
! ****** |
|
|
! et grossy * dzoomy < pi/2 ( radians ) |
|
|
! |
|
|
|
|
|
|
|
|
! ..... Arguments ... |
|
|
! |
|
|
REAL xzoom,yzoom,grossx,grossy,dzoomx,dzoomy,taux,tauy |
|
|
REAL rlatu(jjp1), yprimu(jjp1),rlatv(jjm), yprimv(jjm), & |
|
|
rlatu1(jjm), yprimu1(jjm), rlatu2(jjm), yprimu2(jjm) |
|
|
REAL rlonu(iip1),xprimu(iip1),rlonv(iip1),xprimv(iip1), & |
|
|
rlonm025(iip1),xprimm025(iip1), rlonp025(iip1),xprimp025(iip1) |
|
|
double precision dxmin, dxmax , dymin, dymax |
|
|
|
|
|
! .... var. locales ..... |
|
|
! |
|
|
INTEGER i,j |
|
|
! |
|
|
|
|
|
CALL fyhyp ( yzoom, grossy, dzoomy,tauy , & |
|
|
rlatu, yprimu,rlatv,yprimv,rlatu2,yprimu2,rlatu1,yprimu1 , & |
|
|
dymin,dymax ) |
|
|
|
|
|
CALL fxhyp(xzoom,grossx,dzoomx,taux,rlonm025,xprimm025,rlonv, & |
|
|
xprimv,rlonu,xprimu,rlonp025,xprimp025 , dxmin,dxmax ) |
|
|
|
|
|
|
|
|
DO i = 1, iip1 |
|
|
IF(rlonp025(i).LT.rlonv(i)) THEN |
|
|
print *, ' Attention ! rlonp025 < rlonv',i |
|
|
STOP |
|
|
ENDIF |
|
|
|
|
|
IF(rlonv(i).LT.rlonm025(i)) THEN |
|
|
print *, ' Attention ! rlonm025 > rlonv',i |
|
|
STOP |
|
|
ENDIF |
|
|
|
|
|
IF(rlonp025(i).GT.rlonu(i)) THEN |
|
|
print *, ' Attention ! rlonp025 > rlonu',i |
|
|
STOP |
|
|
ENDIF |
|
|
ENDDO |
|
|
|
|
|
print *, ' *** TEST DE COHERENCE OK POUR FX **** ' |
|
|
|
|
|
! |
|
|
DO j = 1, jjm |
|
|
! |
|
|
IF(rlatu1(j).LE.rlatu2(j)) THEN |
|
|
print *,'Attention ! rlatu1 < rlatu2 ',rlatu1(j), rlatu2(j),j |
|
|
STOP 13 |
|
|
ENDIF |
|
|
! |
|
|
IF(rlatu2(j).LE.rlatu(j+1)) THEN |
|
|
print *,'Attention ! rlatu2 < rlatup1 ',rlatu2(j),rlatu(j+1),j |
|
|
STOP 14 |
|
|
ENDIF |
|
|
! |
|
|
IF(rlatu(j).LE.rlatu1(j)) THEN |
|
|
print *,' Attention ! rlatu < rlatu1 ',rlatu(j),rlatu1(j),j |
|
|
STOP 15 |
|
|
ENDIF |
|
|
! |
|
|
IF(rlatv(j).LE.rlatu2(j)) THEN |
|
|
print *,' Attention ! rlatv < rlatu2 ',rlatv(j),rlatu2(j),j |
|
|
STOP 16 |
|
|
ENDIF |
|
|
! |
|
|
IF(rlatv(j).ge.rlatu1(j)) THEN |
|
|
print *,' Attention ! rlatv > rlatu1 ',rlatv(j),rlatu1(j),j |
|
|
STOP 17 |
|
|
ENDIF |
|
|
! |
|
|
IF(rlatv(j).ge.rlatu(j)) THEN |
|
|
print *, ' Attention ! rlatv > rlatu ',rlatv(j),rlatu(j),j |
|
|
STOP 18 |
|
|
ENDIF |
|
|
! |
|
|
ENDDO |
|
|
! |
|
|
print *, ' *** TEST DE COHERENCE OK POUR FY **** ' |
|
|
! |
|
|
print 18 |
|
|
print *, ' Latitudes ' |
|
|
print *, ' *********** ' |
|
|
print 18 |
|
|
print 3, dymin, dymax |
|
|
print *, ' Si cette derniere est trop lache , modifiez les parametres grossism , tau , dzoom pour Y et repasser ! ' |
|
|
! |
|
|
print 18 |
|
|
print *, ' Longitudes ' |
|
|
print *, ' ************ ' |
|
|
print 18 |
|
|
print 3, dxmin, dxmax |
|
|
print *, ' Si cette derniere est trop lache , modifiez les parametres grossism , tau , dzoom pour Y et repasser ! ' |
|
|
print 18 |
|
|
|
|
|
3 Format(1x, ' Au centre du zoom , la longueur de la maille est', & |
|
|
' d environ ',f0.2 ,' degres ', /, & |
|
|
' alors que la maille en dehors de la zone du zoom est ', & |
|
|
"d'environ", f0.2,' degres ' ) |
|
|
18 FORMAT(/) |
|
4 |
|
|
5 |
END SUBROUTINE fxyhyper |
contains |
6 |
|
|
7 |
|
SUBROUTINE fxyhyper(rlatu, yprimu, rlatv, yprimv, rlatu1, yprimu1, rlatu2, & |
8 |
|
yprimu2, rlonu, xprimu, rlonv, xprimv, rlonm025, xprimm025, rlonp025, & |
9 |
|
xprimp025) |
10 |
|
|
11 |
|
! From dyn3d/fxyhyper.F, version 1.1.1.1, 2004/05/19 12:53:06 |
12 |
|
|
13 |
|
USE dimens_m, ONLY: jjm |
14 |
|
use fxhyp_m, only: fxhyp |
15 |
|
use fyhyp_m, only: fyhyp |
16 |
|
USE paramet_m, ONLY: iip1 |
17 |
|
use serre, only: clat, grossismy, dzoomy, tauy, clon, grossismx, dzoomx, & |
18 |
|
taux |
19 |
|
|
20 |
|
! Auteur : P. Le Van d'après les formulations de R. Sadourny |
21 |
|
|
22 |
|
! f(x, y) à dérivée tangente hyperbolique |
23 |
|
|
24 |
|
! Cette procédure calcule les latitudes (routine fyhyp) et |
25 |
|
! longitudes (fxhyp) par des fonctions tangente hyperbolique. |
26 |
|
|
27 |
|
! Il y a trois paramètres, en plus des coordonnées du centre du |
28 |
|
! zoom (clon et clat) : |
29 |
|
|
30 |
|
! a) le grossissement du zoom : grossismy (en y) et grossismx (en x) |
31 |
|
! b) l'extension du zoom : dzoomy (en y) et dzoomx (en x) |
32 |
|
! c) la raideur de la transition du zoom : taux et tauy |
33 |
|
|
34 |
|
! Nota bene : il vaut mieux avoir : grossismx * dzoomx < pi (radians) |
35 |
|
! et grossismy * dzoomy < pi/2 (radians) |
36 |
|
|
37 |
|
REAL rlatu(:), yprimu(:) ! (jjm + 1) |
38 |
|
real rlatv(:), yprimv(:) ! (jjm) |
39 |
|
real rlatu1(:), yprimu1(:), rlatu2(:), yprimu2(:) ! (jjm) |
40 |
|
REAL rlonu(:), xprimu(:), rlonv(:), xprimv(:) ! (iim + 1) |
41 |
|
REAL rlonm025(:), xprimm025(:), rlonp025(:), xprimp025(:) ! (iim + 1) |
42 |
|
|
43 |
|
! Local: |
44 |
|
|
45 |
|
double precision dxmin, dxmax, dymin, dymax |
46 |
|
INTEGER i, j |
47 |
|
|
48 |
|
!---------------------------------------------------------- |
49 |
|
|
50 |
|
CALL fyhyp(clat, grossismy, dzoomy, tauy, rlatu, yprimu, rlatv, yprimv, & |
51 |
|
rlatu2, yprimu2, rlatu1, yprimu1, dymin, dymax) |
52 |
|
CALL fxhyp(clon, grossismx, dzoomx, taux, rlonm025, xprimm025, rlonv, & |
53 |
|
xprimv, rlonu, xprimu, rlonp025, xprimp025, dxmin, dxmax) |
54 |
|
|
55 |
|
DO i = 1, iip1 |
56 |
|
IF (rlonp025(i).LT.rlonv(i)) THEN |
57 |
|
print *, ' Attention ! rlonp025 < rlonv', i |
58 |
|
STOP 1 |
59 |
|
ENDIF |
60 |
|
|
61 |
|
IF (rlonv(i).LT.rlonm025(i)) THEN |
62 |
|
print *, ' Attention ! rlonm025 > rlonv', i |
63 |
|
STOP 1 |
64 |
|
ENDIF |
65 |
|
|
66 |
|
IF (rlonp025(i).GT.rlonu(i)) THEN |
67 |
|
print *, ' Attention ! rlonp025 > rlonu', i |
68 |
|
STOP 1 |
69 |
|
ENDIF |
70 |
|
ENDDO |
71 |
|
|
72 |
|
print *, 'Test de coherence ok pour fx' |
73 |
|
|
74 |
|
DO j = 1, jjm |
75 |
|
IF (rlatu1(j).LE.rlatu2(j)) THEN |
76 |
|
print *, 'Attention ! rlatu1 < rlatu2 ', rlatu1(j), rlatu2(j), j |
77 |
|
STOP 13 |
78 |
|
ENDIF |
79 |
|
|
80 |
|
IF (rlatu2(j).LE.rlatu(j+1)) THEN |
81 |
|
print *, 'Attention ! rlatu2 < rlatup1 ', rlatu2(j), rlatu(j+1), j |
82 |
|
STOP 14 |
83 |
|
ENDIF |
84 |
|
|
85 |
|
IF (rlatu(j).LE.rlatu1(j)) THEN |
86 |
|
print *, ' Attention ! rlatu < rlatu1 ', rlatu(j), rlatu1(j), j |
87 |
|
STOP 15 |
88 |
|
ENDIF |
89 |
|
|
90 |
|
IF (rlatv(j).LE.rlatu2(j)) THEN |
91 |
|
print *, ' Attention ! rlatv < rlatu2 ', rlatv(j), rlatu2(j), j |
92 |
|
STOP 16 |
93 |
|
ENDIF |
94 |
|
|
95 |
|
IF (rlatv(j).ge.rlatu1(j)) THEN |
96 |
|
print *, ' Attention ! rlatv > rlatu1 ', rlatv(j), rlatu1(j), j |
97 |
|
STOP 17 |
98 |
|
ENDIF |
99 |
|
|
100 |
|
IF (rlatv(j).ge.rlatu(j)) THEN |
101 |
|
print *, ' Attention ! rlatv > rlatu ', rlatv(j), rlatu(j), j |
102 |
|
STOP 18 |
103 |
|
ENDIF |
104 |
|
ENDDO |
105 |
|
|
106 |
|
print *, 'Test de coherence ok pour fy' |
107 |
|
|
108 |
|
print *, 'Latitudes' |
109 |
|
print 3, dymin, dymax |
110 |
|
print *, 'Si cette derniere est trop lache, modifiez les parametres' |
111 |
|
print *, 'grossism, tau, dzoom pour Y et repasser ! ' |
112 |
|
|
113 |
|
print *, ' Longitudes ' |
114 |
|
print 3, dxmin, dxmax |
115 |
|
print *, 'Si cette derniere est trop lache, modifiez les parametres' |
116 |
|
print *, 'grossism, tau, dzoom pour Y et repasser ! ' |
117 |
|
|
118 |
|
3 Format(1x, ' Au centre du zoom, la longueur de la maille est', & |
119 |
|
' d environ ', f0.2, ' degres ', /, & |
120 |
|
' alors que la maille en dehors de la zone du zoom est ', & |
121 |
|
"d'environ", f0.2, ' degres ') |
122 |
|
|
123 |
|
END SUBROUTINE fxyhyper |
124 |
|
|
125 |
|
end module fxyhyper_m |