/[lmdze]/trunk/Sources/dyn3d/gcm.f
ViewVC logotype

Contents of /trunk/Sources/dyn3d/gcm.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 55 - (show annotations)
Mon Dec 12 13:25:01 2011 UTC (12 years, 4 months ago) by guez
Original Path: trunk/libf/dyn3d/gcm.f90
File size: 5422 byte(s)
-- In procedure "bilan_dyn", replaced average of "zvq" by integral of
"zvq", following a comment of Francis Codron :

Le calcul actuel donne des unités peu pratiques : transports de
chaleur en K m / s par exemple. C'est bien pour les sorties à 2
dimensions, latitude et pression, car alors le transport ne dépend pas
de l'espacement des niveaux, mieux pour comparer ou tracer en latitude
et pression. Par contre, quand on somme sur la verticale, on
préfèrerait avoir des transports d'énergie en watts, ou au moins an K
kg / s (à multiplier par "Cp" ou "L"). On doit pouvoir recalculer le
transport intégré à partir des fichiers de sortie, mais c'est embêtant
(calcul de "cv").

-- Gathered files in directory Dissipation.

1 PROGRAM gcm
2
3 ! Authors: P. Le Van, L. Fairhead, F. Hourdin
4 ! From "gcm.F", version 1.4, 2006/04/04 15:05:16
5
6 ! General circulation model of LMD. Avec coordonnée verticale
7 ! hybride, avec nouveaux opérateurs de dissipation "*" ("gradiv2",
8 ! "divgrad2", "nxgraro2"). Possibilité de choisir le schéma pour
9 ! l'advection de "q", en modifiant "iadv" dans "traceur.def".
10
11 use clesphys2, only: read_clesphys2
12 use com_io_dyn, only: histid, histvid, histaveid
13 use comconst, only: daysec, cpp, dtvr, g, rad, r
14 use comgeom, only: rlatu, aire_2d, cu_2d, cv_2d, rlonv
15 use comgeomphy, only: airephy, cuphy, cvphy, rlatd, rlond
16 use conf_gcm_m, only: day_step, iperiod, anneeref, dayref, iecri, iphysiq, &
17 nday, raz_date, periodav, conf_gcm
18 use dimens_m, only: iim, jjm, llm, nqmx
19 use dimphy, only: klon
20 use dynetat0_m, only: dynetat0, day_ini
21 use dynredem0_m, only: dynredem0
22 use grid_change, only: dyn_phy, init_dyn_phy
23 use iniadvtrac_m, only: iniadvtrac
24 use inidissip_m, only: inidissip
25 use inifilr_m, only: inifilr
26 use inigeom_m, only: inigeom
27 use initdynav_m, only: initdynav
28 use inithist_m, only: inithist
29 USE calendar, only: ioconf_calendar
30 use histcom, only: histclo
31 use leapfrog_m, only: leapfrog
32 use logic, only: iflag_phys
33 use suphec_m, only: suphec
34 use temps, only: day_ref, annee_ref, day_end, itau_dyn
35 use tracstoke, only: istdyn, istphy
36 use yoethf_m, only: yoethf
37
38 IMPLICIT NONE
39
40 REAL zdtvr ! time step for dynamics, in s
41
42 ! Variables dynamiques :
43 REAL ucov(iim + 1, jjm + 1, llm), vcov(iim + 1, jjm, llm) ! vent covariant
44 REAL teta(iim + 1, jjm + 1, llm) ! température potentielle
45 REAL q(iim + 1, jjm + 1, llm, nqmx) ! champs advectés
46 REAL ps(iim + 1, jjm + 1) ! pression au sol (Pa)
47 REAL masse(iim + 1, jjm + 1, llm) ! masse d'air
48 REAL phis(iim + 1, jjm + 1) ! géopotentiel au sol
49
50 ! Variables pour le fichier histoire :
51 REAL time_0 ! time in day, as a fraction of day, in [0, 1[
52
53 ! Calendrier :
54 LOGICAL:: true_calendar = .false. ! default value
55
56 logical mask_v(iim + 1, jjm)
57 ! (mask for points in the "v" grid, first index is for longitude,
58 ! second index is for latitude)
59
60 namelist /main_nml/true_calendar
61
62 !------------------------------------------------------------
63
64 print *, "Enter namelist 'main_nml'."
65 read (unit=*, nml=main_nml)
66 write(unit=*, nml=main_nml)
67
68 ! Choix du calendrier :
69 if (true_calendar) then
70 call ioconf_calendar('gregorian')
71 else
72 call ioconf_calendar('360d')
73 endif
74
75 ! Lecture des fichiers "gcm.def" ou "run.def" :
76 call read_clesphys2
77 CALL conf_gcm
78
79 ! Initialisation des traceurs
80 ! Choix du schéma pour l'advection dans le fichier "traceur.def" ou via INCA
81 call iniadvtrac
82
83 ! Lecture du fichier "start.nc" :
84 CALL dynetat0(vcov, ucov, teta, q, masse, ps, phis, time_0)
85
86 ! On remet le calendrier à zero si demandé :
87 if (annee_ref /= anneeref .or. day_ref /= dayref) then
88 print *, 'Attention : les dates initiales lues dans le fichier ' // &
89 '"start" ne correspondent pas à celles lues dans "gcm.def".'
90 if (raz_date) then
91 print *, 'On réinitialise à la date lue dans "gcm.def".'
92 annee_ref = anneeref
93 day_ref = dayref
94 day_ini = dayref
95 itau_dyn = 0
96 time_0 = 0.
97 else
98 print *, 'On garde les dates du fichier "start".'
99 endif
100 ELSE
101 raz_date = .false.
102 endif
103
104 ! On recalcule éventuellement le pas de temps :
105 zdtvr = daysec / REAL(day_step)
106 IF (dtvr /= zdtvr) THEN
107 print *, 'Warning: the time steps in the ".def" file and in ' // &
108 '"start.nc" are different'
109 print *, 'dtvr (from "start.nc") = ', dtvr
110 print *, 'zdtvr (from ".def") = ', zdtvr
111 print *, 'Using the value from the ".def" file.'
112 dtvr = zdtvr
113 ENDIF
114
115 CALL iniconst
116 CALL inigeom ! initialisation de la géometrie
117 CALL inifilr ! initialisation du filtre
118 CALL inidissip
119 call init_dyn_phy
120
121 ! Initialisation de la physique :
122 IF (iflag_phys == 1) THEN
123 rlatd(1)=rlatu(1)
124 rlatd(2:klon-1) = pack(spread(rlatu(2:jjm), 1, iim), .true.)
125 rlatd(klon)= rlatu(jjm + 1)
126
127 rlond(1)=0.
128 rlond(2:klon-1) = pack(spread(rlonv(:iim), 2, jjm - 1), .true.)
129 rlond(klon)= 0.
130
131 cuphy = pack(cu_2d, dyn_phy)
132
133 ! Construct a mask for points in the "v" grid:
134 mask_v = .true.
135 mask_v(2:, 1) = .false.
136 mask_v(iim + 1, 2:) = .false.
137
138 cvphy(:klon - 1) = pack(cv_2d, mask_v)
139 cvphy(klon) = cv_2d(1, jjm)
140 ! (that value of "cv_2d" is used twice in "cvphy")
141
142 airephy = pack(aire_2d, dyn_phy)
143 CALL suphec
144 call yoethf
145 ENDIF
146
147 ! Initialisation des entrées-sorties :
148 day_end = day_ini + nday
149 print *, "day_ini = ", day_ini
150 print *, "day_end = ", day_end
151
152 CALL dynredem0("restart.nc", day_end, phis)
153 CALL inithist(day_ref, annee_ref, zdtvr, nqmx, histid, histvid, &
154 t_ops = iecri * daysec, t_wrt = iecri * daysec)
155 CALL initdynav(day_ref, annee_ref, zdtvr, nqmx, histaveid, &
156 t_ops = iperiod * zdtvr, t_wrt = periodav * daysec)
157
158 ! Choix des fréquences de stockage pour le hors-ligne :
159 istdyn = day_step / 4 ! stockage toutes les 6 h = 1 jour / 4
160 istphy = istdyn / iphysiq
161
162 ! Intégration temporelle du modèle :
163 CALL leapfrog(ucov, vcov, teta, ps, masse, phis, q, time_0)
164
165 call histclo
166 print *, 'Simulation finished'
167 print *, 'Everything is cool'
168
169 END PROGRAM gcm

  ViewVC Help
Powered by ViewVC 1.1.21