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

Annotation of /trunk/dyn3d/gcm.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 61 - (hide annotations)
Fri Apr 20 14:58:43 2012 UTC (12 years ago) by guez
Original Path: trunk/libf/dyn3d/gcm.f90
File size: 5594 byte(s)
No more included file in LMDZE, not even "netcdf.inc".

Created a variable containing the list of common source files in
GNUmakefile. So we now also see clearly files that are specific to
each program.

Split module "histcom". Assembled resulting files in directory
"Histcom".

Removed aliasing in calls to "laplacien".

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

  ViewVC Help
Powered by ViewVC 1.1.21