1 |
|
|
! |
2 |
|
|
! $Header: /home/cvsroot/LMDZ4/libf/phylmd/geo2atm.F90,v 1.1 2008-12-05 17:56:40 lsce Exp $ |
3 |
|
|
! |
4 |
|
|
SUBROUTINE geo2atm(im, jm, px, py, pz, plon, plat, pu, pv, pr) |
5 |
|
|
USE dimphy |
6 |
|
|
USE mod_phys_lmdz_para |
7 |
|
|
USE mod_grid_phy_lmdz, only: grid_type, unstructured, regular_lonlat |
8 |
|
|
IMPLICIT NONE |
9 |
|
|
INCLUDE 'YOMCST.h' |
10 |
|
|
CHARACTER (len = 6) :: clmodnam |
11 |
|
|
CHARACTER (len = 20) :: modname = 'geo2atm' |
12 |
|
|
CHARACTER (len = 80) :: abort_message |
13 |
|
|
|
14 |
|
|
! Change wind coordinates from cartesian geocentric to local spherical |
15 |
|
|
! NB! Fonctionne probablement uniquement en MPI seul (sans OpenMP) |
16 |
|
|
! |
17 |
|
|
! Geocentric : |
18 |
|
|
! axe x is eastward : crosses (0N,90E) point. |
19 |
|
|
! axe y crosses (0N,180E) point. |
20 |
|
|
! axe z is 'up' : crosses north pole. |
21 |
|
|
! |
22 |
|
|
! NB! Aux poles, fonctionne probablement uniquement en MPI seul (sans OpenMP) |
23 |
|
|
|
24 |
|
|
INTEGER, INTENT (IN) :: im, jm |
25 |
|
|
REAL, DIMENSION (im,jm), INTENT(IN) :: px, py, pz |
26 |
|
|
REAL, DIMENSION (im,jm), INTENT(IN) :: plon, plat |
27 |
|
|
REAL, DIMENSION (im,jm), INTENT(OUT) :: pu, pv, pr |
28 |
|
|
|
29 |
|
|
REAL :: rad,reps |
30 |
|
|
|
31 |
|
|
|
32 |
|
|
rad = rpi / 180.0E0 |
33 |
|
|
reps = 1.0e-5 |
34 |
|
|
|
35 |
|
|
pu(:,:) = & |
36 |
|
|
- px(:,:) * SIN(rad * plon(:,:)) & |
37 |
|
|
+ py(:,:) * COS(rad * plon(:,:)) |
38 |
|
|
|
39 |
|
|
pv(:,:) = & |
40 |
|
|
- px(:,:) * SIN(rad * plat(:,:)) * COS(rad * plon(:,:)) & |
41 |
|
|
- py(:,:) * SIN(rad * plat(:,:)) * SIN(rad * plon(:,:)) & |
42 |
|
|
+ pz(:,:) * COS(rad * plat(:,:)) |
43 |
|
|
|
44 |
|
|
pr(:,:) = & |
45 |
|
|
+ px(:,:) * COS(rad * plat(:,:)) * COS(rad * plon(:,:)) & |
46 |
|
|
+ py(:,:) * COS(rad * plat(:,:)) * SIN(rad * plon(:,:)) & |
47 |
|
|
+ pz(:,:) * SIN(rad * plat(:,:)) |
48 |
|
|
|
49 |
|
|
IF (grid_type==regular_lonlat) THEN |
50 |
|
|
! Value at North Pole |
51 |
|
|
IF (is_north_pole_dyn) THEN |
52 |
|
|
pu(:, 1) = -px (1,1) |
53 |
|
|
pv(:, 1) = -py (1,1) |
54 |
|
|
pr(:, 1) = 0.0 |
55 |
|
|
ENDIF |
56 |
|
|
|
57 |
|
|
! Value at South Pole |
58 |
|
|
IF (is_south_pole_dyn) THEN |
59 |
|
|
pu(:,jm) = -px (1,jm) |
60 |
|
|
pv(:,jm) = -py (1,jm) |
61 |
|
|
pr(:,jm) = 0.0 |
62 |
|
|
ENDIF |
63 |
|
|
|
64 |
|
|
ELSE IF (grid_type==unstructured) THEN |
65 |
|
|
! Pole nord pour Dynamico |
66 |
|
|
WHERE ( plat(:,:) >= 90.0-reps ) |
67 |
|
|
pu(:,:) = py(:,:) |
68 |
|
|
pv(:,:) = -px(:,:) |
69 |
|
|
pr(:,:) = 0.0e0 |
70 |
|
|
END WHERE |
71 |
|
|
|
72 |
|
|
ELSE |
73 |
|
|
abort_message='Problem: unknown grid type' |
74 |
|
|
CALL abort_physic(modname,abort_message,1) |
75 |
|
|
END IF |
76 |
|
|
|
77 |
|
|
|
78 |
|
|
|
79 |
|
|
|
80 |
|
|
END SUBROUTINE geo2atm |