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

Annotation of /trunk/dyn3d/gcm.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 55 - (hide annotations)
Mon Dec 12 13:25:01 2011 UTC (12 years, 5 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 guez 3 PROGRAM gcm
2    
3 guez 36 ! Authors: P. Le Van, L. Fairhead, F. Hourdin
4     ! From "gcm.F", version 1.4, 2006/04/04 15:05:16
5 guez 3
6 guez 38 ! 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 guez 26 use clesphys2, only: read_clesphys2
12     use com_io_dyn, only: histid, histvid, histaveid
13 guez 39 use comconst, only: daysec, cpp, dtvr, g, rad, r
14 guez 26 use comgeom, only: rlatu, aire_2d, cu_2d, cv_2d, rlonv
15 guez 37 use comgeomphy, only: airephy, cuphy, cvphy, rlatd, rlond
16 guez 3 use conf_gcm_m, only: day_step, iperiod, anneeref, dayref, iecri, iphysiq, &
17     nday, raz_date, periodav, conf_gcm
18 guez 26 use dimens_m, only: iim, jjm, llm, nqmx
19     use dimphy, only: klon
20 guez 25 use dynetat0_m, only: dynetat0, day_ini
21 guez 26 use dynredem0_m, only: dynredem0
22 guez 3 use grid_change, only: dyn_phy, init_dyn_phy
23 guez 18 use iniadvtrac_m, only: iniadvtrac
24 guez 26 use inidissip_m, only: inidissip
25 guez 54 use inifilr_m, only: inifilr
26 guez 26 use inigeom_m, only: inigeom
27     use initdynav_m, only: initdynav
28     use inithist_m, only: inithist
29 guez 30 USE calendar, only: ioconf_calendar
30     use histcom, only: histclo
31 guez 3 use leapfrog_m, only: leapfrog
32 guez 26 use logic, only: iflag_phys
33 guez 37 use suphec_m, only: suphec
34 guez 26 use temps, only: day_ref, annee_ref, day_end, itau_dyn
35     use tracstoke, only: istdyn, istphy
36 guez 38 use yoethf_m, only: yoethf
37 guez 3
38     IMPLICIT NONE
39    
40     REAL zdtvr ! time step for dynamics, in s
41    
42     ! Variables dynamiques :
43 guez 55 REAL ucov(iim + 1, jjm + 1, llm), vcov(iim + 1, jjm, llm) ! vent covariant
44 guez 43 REAL teta(iim + 1, jjm + 1, llm) ! température potentielle
45 guez 40 REAL q(iim + 1, jjm + 1, llm, nqmx) ! champs advectés
46 guez 39 REAL ps(iim + 1, jjm + 1) ! pression au sol (Pa)
47 guez 55 REAL masse(iim + 1, jjm + 1, llm) ! masse d'air
48 guez 7 REAL phis(iim + 1, jjm + 1) ! géopotentiel au sol
49 guez 3
50     ! Variables pour le fichier histoire :
51 guez 25 REAL time_0 ! time in day, as a fraction of day, in [0, 1[
52 guez 3
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 guez 13 call read_clesphys2
77     CALL conf_gcm
78 guez 3
79     ! Initialisation des traceurs
80     ! Choix du schéma pour l'advection dans le fichier "traceur.def" ou via INCA
81 guez 23 call iniadvtrac
82 guez 3
83     ! Lecture du fichier "start.nc" :
84     CALL dynetat0(vcov, ucov, teta, q, masse, ps, phis, time_0)
85    
86 guez 36 ! On remet le calendrier à zero si demandé :
87 guez 3 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 guez 15 if (raz_date) then
91 guez 3 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 guez 15 else
98     print *, 'On garde les dates du fichier "start".'
99 guez 3 endif
100     ELSE
101 guez 15 raz_date = .false.
102 guez 3 endif
103    
104 guez 36 ! On recalcule éventuellement le pas de temps :
105 guez 3 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 guez 33
115 guez 36 CALL iniconst
116     CALL inigeom ! initialisation de la géometrie
117     CALL inifilr ! initialisation du filtre
118 guez 27 CALL inidissip
119 guez 3 call init_dyn_phy
120    
121     ! Initialisation de la physique :
122     IF (iflag_phys == 1) THEN
123 guez 37 rlatd(1)=rlatu(1)
124     rlatd(2:klon-1) = pack(spread(rlatu(2:jjm), 1, iim), .true.)
125     rlatd(klon)= rlatu(jjm + 1)
126 guez 3
127 guez 37 rlond(1)=0.
128     rlond(2:klon-1) = pack(spread(rlonv(:iim), 2, jjm - 1), .true.)
129     rlond(klon)= 0.
130 guez 3
131 guez 37 cuphy = pack(cu_2d, dyn_phy)
132 guez 3
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 guez 37 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 guez 3
142 guez 37 airephy = pack(aire_2d, dyn_phy)
143     CALL suphec
144 guez 38 call yoethf
145 guez 3 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 guez 5 CALL dynredem0("restart.nc", day_end, phis)
153 guez 3 CALL inithist(day_ref, annee_ref, zdtvr, nqmx, histid, histvid, &
154 guez 27 t_ops = iecri * daysec, t_wrt = iecri * daysec)
155 guez 3 CALL initdynav(day_ref, annee_ref, zdtvr, nqmx, histaveid, &
156 guez 27 t_ops = iperiod * zdtvr, t_wrt = periodav * daysec)
157 guez 3
158     ! Choix des fréquences de stockage pour le hors-ligne :
159 guez 36 istdyn = day_step / 4 ! stockage toutes les 6 h = 1 jour / 4
160 guez 3 istphy = istdyn / iphysiq
161    
162     ! Intégration temporelle du modèle :
163 guez 23 CALL leapfrog(ucov, vcov, teta, ps, masse, phis, q, time_0)
164 guez 3
165 guez 10 call histclo
166     print *, 'Simulation finished'
167     print *, 'Everything is cool'
168    
169 guez 3 END PROGRAM gcm

  ViewVC Help
Powered by ViewVC 1.1.21