/[lmdze]/trunk/dyn3d/Guide/guide.f
ViewVC logotype

Contents of /trunk/dyn3d/Guide/guide.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 254 - (show annotations)
Mon Feb 5 10:39:38 2018 UTC (6 years, 3 months ago) by guez
File size: 4506 byte(s)
Move Sources/* to root directory.
1 MODULE guide_m
2
3 ! From dyn3d/guide.F, version 1.3, 2005/05/25 13:10:09
4 ! and dyn3d/guide.h, version 1.1.1.1, 2004/05/19 12:53:06
5
6 IMPLICIT NONE
7
8 CONTAINS
9
10 SUBROUTINE guide(itau, ucov, vcov, teta, q, ps)
11
12 ! Author: F. Hourdin
13
14 USE comconst, ONLY: cpp, kappa
15 USE conf_gcm_m, ONLY: day_step
16 use conf_guide_m, only: guide_u, guide_v, guide_t, guide_q, ini_anal, &
17 alpha_u, alpha_v, alpha_t, alpha_q
18 USE dimens_m, ONLY: iim, jjm, llm
19 USE disvert_m, ONLY: ap, bp, preff
20 USE exner_hyb_m, ONLY: exner_hyb
21 USE q_sat_m, ONLY: q_sat
22 use read_reanalyse_m, only: read_reanalyse
23 use writefield_m, only: writefield
24
25 INTEGER, INTENT(IN):: itau
26 REAL, intent(inout):: ucov(:, :, :) ! (iim + 1, jjm + 1, llm) vent covariant
27 REAL, intent(inout):: vcov(:, :, :) ! (iim + 1, jjm, llm) ! vent covariant
28
29 REAL, intent(inout):: teta(:, :, :) ! (iim + 1, jjm + 1, llm)
30 ! température potentielle
31
32 REAL, intent(inout):: q(:, :, :) ! (iim + 1, jjm + 1, llm)
33 REAL, intent(in):: ps(:, :) ! (iim + 1, jjm + 1) pression au sol
34
35 ! Local:
36
37 ! Variables dynamiques pour les réanalyses
38
39 REAL, save:: ucovrea1(iim + 1, jjm + 1, llm), vcovrea1(iim + 1, jjm, llm)
40 ! vents covariants r\'eanalyses
41
42 REAL, save:: tetarea1(iim + 1, jjm + 1, llm)
43 ! potential temperture from reanalysis
44
45 REAL, save:: qrea1(iim + 1, jjm + 1, llm)
46
47 REAL, save:: ucovrea2(iim + 1, jjm + 1, llm), vcovrea2(iim + 1, jjm, llm)
48 ! vents covariants reanalyses
49
50 REAL, save:: tetarea2(iim + 1, jjm + 1, llm)
51 ! potential temperture from reanalysis
52
53 REAL, save:: qrea2(iim + 1, jjm + 1, llm)
54
55 INTEGER l
56 REAL tau
57
58 ! TEST SUR QSAT
59 REAL p(iim + 1, jjm + 1, llm + 1)
60 real pk(iim + 1, jjm + 1, llm), pks(iim + 1, jjm + 1)
61 REAL qsat(iim + 1, jjm + 1, llm)
62
63 !-----------------------------------------------------------------------
64
65 IF (itau == 0) THEN
66 ! Lecture du premier état des réanalyses :
67 CALL read_reanalyse(ps, ucovrea2, vcovrea2, tetarea2, qrea2)
68 qrea2 = max(qrea2, 0.1)
69
70 if (ini_anal) then
71 IF (guide_u) ucov = ucovrea2
72 IF (guide_v) vcov = vcovrea2
73 IF (guide_t) teta = tetarea2
74
75 IF (guide_q) then
76 ! Calcul de l'humidité saturante :
77 forall (l = 1: llm + 1) p(:, :, l) = ap(l) + bp(l) * ps
78 CALL exner_hyb(ps, p, pks, pk)
79 q = q_sat(pk * teta / cpp, preff * (pk / cpp)**(1. / kappa)) &
80 * qrea2 * 0.01
81 end IF
82 end if
83 END IF
84
85 ! Importation des vents, pression et temp\'erature r\'eels :
86
87 ! Nudging fields are given 4 times per day:
88 IF (mod(itau, day_step / 4) == 0) THEN
89 vcovrea1 = vcovrea2
90 ucovrea1 = ucovrea2
91 tetarea1 = tetarea2
92 qrea1 = qrea2
93
94 CALL read_reanalyse(ps, ucovrea2, vcovrea2, tetarea2, qrea2)
95 qrea2 = max(qrea2, 0.1)
96
97 if (guide_u) then
98 CALL writefield("ucov", ucov)
99 CALL writefield("ucovrea2", ucovrea2)
100 end if
101
102 if (guide_t) then
103 CALL writefield("teta", teta)
104 CALL writefield("tetarea2", tetarea2)
105 end if
106
107 if (guide_q) then
108 CALL writefield("qrea2", qrea2)
109 CALL writefield("q", q)
110 end if
111 END IF
112
113 ! Guidage
114
115 tau = mod(real(itau) / real(day_step / 4), 1.)
116
117 ! x_gcm = a * x_gcm + (1 - a) * x_reanalyses
118
119 IF (guide_u) forall (l = 1: llm) ucov(:, :, l) = (1. - alpha_u) &
120 * ucov(:, :, l) + alpha_u * ((1. - tau) * ucovrea1(:, :, l) + tau &
121 * ucovrea2(:, :, l))
122
123 IF (guide_v) forall (l = 1: llm) vcov(:, :, l) = (1. - alpha_v) &
124 * vcov(:, :, l) + alpha_v * ((1. - tau) * vcovrea1(:, :, l) + tau &
125 * vcovrea2(:, :, l))
126
127 IF (guide_t) forall (l = 1: llm) teta(:, :, l) = (1. - alpha_t) &
128 * teta(:, :, l) + alpha_t * ((1. - tau) * tetarea1(:, :, l) + tau &
129 * tetarea2(:, :, l))
130
131 IF (guide_q) THEN
132 ! Calcul de l'humidité saturante :
133 forall (l = 1: llm + 1) p(:, :, l) = ap(l) + bp(l) * ps
134 CALL exner_hyb(ps, p, pks, pk)
135 qsat = q_sat(pk * teta / cpp, preff * (pk / cpp)**(1. / kappa))
136
137 ! humidité relative en % -> humidité spécifique
138 forall (l = 1: llm) q(:, :, l) = (1. - alpha_q) * q(:, :, l) &
139 + alpha_q * (qsat(:, :, l) * ((1. - tau) * qrea1(:, :, l) &
140 + tau * qrea2(:, :, l)) * 0.01)
141 END IF
142
143 END SUBROUTINE guide
144
145 END MODULE guide_m

  ViewVC Help
Powered by ViewVC 1.1.21