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

Annotation of /trunk/dyn3d/gcm.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 68 - (hide 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 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     CALL inigeom ! initialisation de la géometrie
122     CALL inifilr ! initialisation du filtre
123 guez 27 CALL inidissip
124 guez 3 call init_dyn_phy
125    
126     ! Initialisation de la physique :
127     IF (iflag_phys == 1) THEN
128 guez 37 rlatd(1)=rlatu(1)
129     rlatd(2:klon-1) = pack(spread(rlatu(2:jjm), 1, iim), .true.)
130     rlatd(klon)= rlatu(jjm + 1)
131 guez 3
132 guez 37 rlond(1)=0.
133     rlond(2:klon-1) = pack(spread(rlonv(:iim), 2, jjm - 1), .true.)
134     rlond(klon)= 0.
135 guez 3
136 guez 37 cuphy = pack(cu_2d, dyn_phy)
137 guez 3
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 guez 37 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 guez 3
147 guez 37 airephy = pack(aire_2d, dyn_phy)
148     CALL suphec
149 guez 38 call yoethf
150 guez 3 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 guez 5 CALL dynredem0("restart.nc", day_end, phis)
158 guez 56 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 guez 57 call init_dynzon(dt_app = dtvr * iperiod)
163 guez 3
164     ! Choix des fréquences de stockage pour le hors-ligne :
165 guez 36 istdyn = day_step / 4 ! stockage toutes les 6 h = 1 jour / 4
166 guez 3 istphy = istdyn / iphysiq
167    
168     ! Intégration temporelle du modèle :
169 guez 23 CALL leapfrog(ucov, vcov, teta, ps, masse, phis, q, time_0)
170 guez 3
171 guez 68 close(unit_nml)
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