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

Contents of /trunk/dyn3d/gcm.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 68 - (show annotations)
Wed Nov 14 16:59:30 2012 UTC (11 years, 6 months ago) by guez
Original Path: trunk/libf/dyn3d/gcm.f90
File size: 5594 byte(s)
Split "flincom.f90" into "flinclo.f90", "flinfindcood.f90",
"flininfo.f90" and "flinopen_nozoom.f90", in directory
"IOIPSL/Flincom".

Renamed "etat0_lim" to "ce0l", as in LMDZ.

Split "readsulfate.f" into "readsulfate.f90", "readsulfate_preind.f90"
and "getso4fromfile.f90".

In etat0, renamed variable q3d to q, as in "dynredem1". Replaced calls
to Flicom procedures by calls to NetCDF95.

In leapfrog, added call to writehist.

Extracted ASCII art from "grid_noro" into a file
"grid_noro.txt". Transformed explicit-shape local arrays into
automatic arrays, so that test on values of iim and jjm is no longer
needed. Test on weight:
          IF (weight(ii, jj) /= 0.) THEN
is useless. There is already a test before:
    if (any(weight == 0.)) stop "zero weight in grid_noro"

In "aeropt", replaced duplicated lines with different values of inu by
a loop on inu.

Removed arguments of "conf_phys". Corresponding variables are now
defined in "physiq", in a namelist. In "conf_phys", read a namelist
instead of using getin.

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

  ViewVC Help
Powered by ViewVC 1.1.21