LMDZ
dynetat0.f90
Go to the documentation of this file.
1 SUBROUTINE dynetat0(fichnom,vcov,ucov,teta,q,masse,ps,phis,time)
2 !
3 !-------------------------------------------------------------------------------
4 ! Authors: P. Le Van , L.Fairhead
5 !-------------------------------------------------------------------------------
6 ! Purpose: Initial state reading.
7 !-------------------------------------------------------------------------------
8  USE infotrac
9  USE netcdf, ONLY: nf90_open, nf90_nowrite, nf90_inq_varid, nf90_noerr, &
10  nf90_close, nf90_get_var
11  USE control_mod, ONLY: planet_type
12  USE assert_eq_m, ONLY: assert_eq
13  IMPLICIT NONE
14  include "dimensions.h"
15  include "paramet.h"
16  include "temps.h"
17  include "comconst.h"
18  include "comvert.h"
19  include "comgeom2.h"
20  include "ener.h"
21  include "description.h"
22  include "serre.h"
23  include "logic.h"
24  include "iniprint.h"
25 !===============================================================================
26 ! Arguments:
27  CHARACTER(LEN=*), INTENT(IN) :: fichnom !--- FILE NAME
28  REAL, INTENT(OUT) :: vcov(iip1,jjm, llm) !--- V COVARIANT WIND
29  REAL, INTENT(OUT) :: ucov(iip1,jjp1,llm) !--- U COVARIANT WIND
30  REAL, INTENT(OUT) :: teta(iip1,jjp1,llm) !--- POTENTIAL TEMP.
31  REAL, INTENT(OUT) :: q(iip1,jjp1,llm,nqtot) !--- TRACERS
32  REAL, INTENT(OUT) :: masse(iip1,jjp1,llm) !--- MASS PER CELL
33  REAL, INTENT(OUT) :: ps(iip1,jjp1) !--- GROUND PRESSURE
34  REAL, INTENT(OUT) :: phis(iip1,jjp1) !--- GEOPOTENTIAL
35 !===============================================================================
36 ! Local variables:
37  CHARACTER(LEN=256) :: msg, var, modname
38  INTEGER, PARAMETER :: length=100
39  INTEGER :: iq, fID, vID, idecal!, iml, jml, lml, nqt
40  REAL :: time, tab_cntrl(length) !--- RUN PARAMS TABLE
41 !-------------------------------------------------------------------------------
42  modname="dynetat0"
43 
44 !--- Initial state file opening
45  var=fichnom
46  CALL err(nf90_open(var,nf90_nowrite,fid),"open",var)
47  CALL get_var1("controle",tab_cntrl)
48 
49 !!! AS: idecal is a hack to be able to read planeto starts...
50 !!! .... while keeping everything OK for LMDZ EARTH
51  IF(planet_type=="generic") THEN
52  WRITE(lunout,*)'NOTE NOTE NOTE : Planeto-like start files'
53  idecal = 4
54  annee_ref = 2000
55  ELSE
56  WRITE(lunout,*)'NOTE NOTE NOTE : Earth-like start files'
57  idecal = 5
58  annee_ref = tab_cntrl(5)
59  END IF
60  im = tab_cntrl(1)
61  jm = tab_cntrl(2)
62  lllm = tab_cntrl(3)
63  day_ref = tab_cntrl(4)
64  rad = tab_cntrl(idecal+1)
65  omeg = tab_cntrl(idecal+2)
66  g = tab_cntrl(idecal+3)
67  cpp = tab_cntrl(idecal+4)
68  kappa = tab_cntrl(idecal+5)
69  daysec = tab_cntrl(idecal+6)
70  dtvr = tab_cntrl(idecal+7)
71  etot0 = tab_cntrl(idecal+8)
72  ptot0 = tab_cntrl(idecal+9)
73  ztot0 = tab_cntrl(idecal+10)
74  stot0 = tab_cntrl(idecal+11)
75  ang0 = tab_cntrl(idecal+12)
76  pa = tab_cntrl(idecal+13)
77  preff = tab_cntrl(idecal+14)
78 !
79  clon = tab_cntrl(idecal+15)
80  clat = tab_cntrl(idecal+16)
81  grossismx = tab_cntrl(idecal+17)
82  grossismy = tab_cntrl(idecal+18)
83 !
84  IF ( tab_cntrl(idecal+19)==1. ) THEN
85  fxyhypb = .true.
86 ! dzoomx = tab_cntrl(25)
87 ! dzoomy = tab_cntrl(26)
88 ! taux = tab_cntrl(28)
89 ! tauy = tab_cntrl(29)
90  ELSE
91  fxyhypb = .false.
92  ysinus = tab_cntrl(idecal+22)==1.
93  END IF
94 
95  day_ini = tab_cntrl(30)
96  itau_dyn = tab_cntrl(31)
97  start_time = tab_cntrl(32)
98 
99 !-------------------------------------------------------------------------------
100  WRITE(lunout,*)trim(modname)//': rad,omeg,g,cpp,kappa',rad,omeg,g,cpp,kappa
101  CALL check_dim(im,iim,'im','im')
102  CALL check_dim(jm,jjm,'jm','jm')
103  CALL check_dim(lllm,llm,'lm','lllm')
104  CALL get_var1("rlonu",rlonu)
105  CALL get_var1("rlatu",rlatu)
106  CALL get_var1("rlonv",rlonv)
107  CALL get_var1("rlatv",rlatv)
108  CALL get_var2("cu" ,cu)
109  CALL get_var2("cv" ,cv)
110  CALL get_var2("aire" ,aire)
111  var="temps"
112  IF(nf90_inq_varid(fid,var,vid)/=nf90_noerr) THEN
113  WRITE(lunout,*)trim(modname)//": missing field <temps>"
114  WRITE(lunout,*)trim(modname)//": trying with <Time>"; var="Time"
115  CALL err(nf90_inq_varid(fid,var,vid),"inq",var)
116  END IF
117  CALL err(nf90_get_var(fid,vid,time),"get",var)
118  CALL get_var2("phisinit",phis)
119  CALL get_var3("ucov",ucov)
120  CALL get_var3("vcov",vcov)
121  CALL get_var3("teta",teta)
122  CALL get_var3("masse",masse)
123  CALL get_var2("ps",ps)
124 
125 !--- Tracers
126  DO iq=1,nqtot
127  var=tname(iq)
128  IF(nf90_inq_varid(fid,var,vid)==nf90_noerr) THEN
129  CALL err(nf90_get_var(fid,vid,q(:,:,:,iq)),"get",var); cycle
130  END IF
131  WRITE(lunout,*)trim(modname)//": Tracer <"//trim(var)//"> is missing"
132  WRITE(lunout,*)" It is hence initialized to zero"
133  q(:,:,:,iq)=0.
134  !--- CRisi: for isotops, theoretical initialization using very simplified
135  ! Rayleigh distillation las.
136  IF(ok_isotopes.AND.iso_num(iq)>0) THEN
137  IF(zone_num(iq)==0) q(:,:,:,iq)=q(:,:,:,iqpere(iq))*tnat(iso_num(iq)) &
138  & *(q(:,:,:,iqpere(iq))/30.e-3)**(alpha_ideal(iso_num(iq))-1)
139  IF(zone_num(iq)==1) q(:,:,:,iq)=q(:,:,:,iqiso(iso_indnum(iq),phase_num(iq)))
140  END IF
141  END DO
142 
143  CALL err(nf90_close(fid),"close",fichnom)
144  day_ini=day_ini+int(time)
145  time=time-int(time)
146 
147 
148  CONTAINS
149 
150 
151 SUBROUTINE check_dim(n1,n2,str1,str2)
152  INTEGER, INTENT(IN) :: n1, n2
153  CHARACTER(LEN=*), INTENT(IN) :: str1, str2
154  CHARACTER(LEN=256) :: s1, s2
155  IF(n1/=n2) THEN
156  s1='value of '//trim(str1)//' ='
157  s2=' read in starting file differs from parametrized '//trim(str2)//' ='
158  WRITE(msg,'(10x,a,i4,2x,a,i4)'),s1,n1,s2,n2
159  CALL abort_gcm(trim(modname),trim(msg),1)
160  END IF
161 END SUBROUTINE check_dim
162 
163 
164 SUBROUTINE get_var1(var,v)
165  CHARACTER(LEN=*), INTENT(IN) :: var
166  REAL, INTENT(OUT) :: v(:)
167  CALL err(nf90_inq_varid(fid,var,vid),"inq",var)
168  CALL err(nf90_get_var(fid,vid,v),"get",var)
169 END SUBROUTINE get_var1
170 
171 
172 SUBROUTINE get_var2(var,v)
173  CHARACTER(LEN=*), INTENT(IN) :: var
174  REAL, INTENT(OUT) :: v(:,:)
175  CALL err(nf90_inq_varid(fid,var,vid),"inq",var)
176  CALL err(nf90_get_var(fid,vid,v),"get",var)
177 END SUBROUTINE get_var2
178 
179 
180 SUBROUTINE get_var3(var,v)
181  CHARACTER(LEN=*), INTENT(IN) :: var
182  REAL, INTENT(OUT) :: v(:,:,:)
183  CALL err(nf90_inq_varid(fid,var,vid),"inq",var)
184  CALL err(nf90_get_var(fid,vid,v),"get",var)
185 END SUBROUTINE get_var3
186 
187 
188 SUBROUTINE err(ierr,typ,nam)
189  INTEGER, INTENT(IN) :: ierr !--- NetCDF ERROR CODE
190  CHARACTER(LEN=*), INTENT(IN) :: typ !--- TYPE OF OPERATION
191  CHARACTER(LEN=*), INTENT(IN) :: nam !--- FIELD/FILE NAME
192  IF(ierr==nf90_noerr) RETURN
193  SELECT CASE(typ)
194  CASE('inq'); msg="Field <"//trim(nam)//"> is missing"
195  CASE('get'); msg="Reading failed for <"//trim(nam)//">"
196  CASE('open'); msg="File opening failed for <"//trim(nam)//">"
197  CASE('close'); msg="File closing failed for <"//trim(nam)//">"
198  END SELECT
199  CALL abort_gcm(trim(modname),trim(msg),ierr)
200 END SUBROUTINE err
201 
202 END SUBROUTINE dynetat0
!$Id && itau_dyn
Definition: temps.h:15
!$Header!c!c!c include serre h!c REAL && grossismx
Definition: serre.h:8
subroutine dynetat0(fichnom, vcov, ucov, teta, q, masse, ps, phis, time)
Definition: dynetat0.f90:2
!$Id mode_top_bound COMMON comconstr g
Definition: comconst.h:7
real, dimension(niso_possibles), save tnat
Definition: infotrac.F90:47
!$Id preff
Definition: comvert.h:8
subroutine get_var1(var, v)
Definition: dynetat0.f90:165
!$Id mode_top_bound COMMON comconstr kappa
Definition: comconst.h:7
!$Header!c!c!c include serre h!c REAL clon
Definition: serre.h:8
!$Id mode_top_bound COMMON comconstr omeg dissip_zref ihf INTEGER im
Definition: comconst.h:7
!$Id jm
Definition: comconst.h:7
integer, dimension(:), allocatable, save phase_num
Definition: infotrac.F90:53
character(len=10), save planet_type
Definition: control_mod.F90:32
subroutine abort_gcm(modname, message, ierr)
Definition: abort_gcm.F:7
!$Id Turb_fcg_gcssold get_uvd hqturb_gcssold endif!large scale llm day day1 day day1 *dt_toga endif!time annee_ref dt_toga u_toga vq_toga w_prof vq_prof llm day day1 day day1 *dt_dice endif!time annee_ref dt_dice swup_dice vg_dice omega_dice tg_prof vg_profd w_profd omega_profd!do llm!print llm l llm
!$Header!CDK comgeom COMMON comgeom aire
Definition: comgeom.h:25
!$Header!CDK comgeom COMMON comgeom rlatu
Definition: comgeom.h:25
integer, save nqtot
Definition: infotrac.F90:6
integer, dimension(:,:), allocatable, save iqiso
Definition: infotrac.F90:49
!$Id && day_ini
Definition: temps.h:15
subroutine err(ierr, typ, nam)
Definition: dynetat0.f90:189
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
Definition: calcul_STDlev.h:26
!$Id etot0
Definition: ener.h:11
subroutine get_var3(var, v)
Definition: dynetat0.f90:181
!$Id mode_top_bound COMMON comconstr rad
Definition: comconst.h:7
subroutine get_var2(var, v)
Definition: dynetat0.f90:173
!$Id day_ref
Definition: temps.h:15
!$Id fxyhypb
Definition: logic.h:10
!$Header jjp1
Definition: paramet.h:14
integer, dimension(:), allocatable, save zone_num
Definition: infotrac.F90:52
!$Id mode_top_bound COMMON comconstr cpp
Definition: comconst.h:7
!$Id mode_top_bound COMMON comconstr daysec
Definition: comconst.h:7
!$Header!CDK comgeom COMMON comgeom rlonu
Definition: comgeom.h:25
!$Id ztot0
Definition: ener.h:11
!$Header!CDK comgeom COMMON comgeom rlatv
Definition: comgeom.h:25
character(len=20), dimension(:), allocatable, save tname
Definition: infotrac.F90:18
!$Id && pa
Definition: comvert.h:8
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
!$Id!Parameters for parameters that control the rate of approach!to quasi equilibrium noff nlm real tlcrit real entp real sigd real coeffs real dtmax real cu real betad real damp real delta COMMON cvparam nlm tlcrit sigd coeffs cu
Definition: cvparam.h:12
!$Id lllm
Definition: comconst.h:7
!$Header!c!c!c include serre h!c REAL grossismy
Definition: serre.h:8
!$Id mode_top_bound COMMON comconstr dtvr
Definition: comconst.h:7
real, dimension(niso_possibles), save alpha_ideal
Definition: infotrac.F90:47
c c zjulian c cym CALL iim cym klev iim
Definition: ini_bilKP_ave.h:24
!$Id stot0
Definition: ener.h:11
!$Header!c!c!c include serre h!c REAL clat
Definition: serre.h:8
logical, save ok_isotopes
Definition: infotrac.F90:44
integer, dimension(:), allocatable, save iqpere
Definition: infotrac.F90:33
!$Header!CDK comgeom COMMON comgeom cv
Definition: comgeom.h:25
integer, dimension(:), allocatable, save iso_num
Definition: infotrac.F90:50
!$Id start_time
Definition: temps.h:15
!$Id ptot0
Definition: ener.h:11
integer, dimension(:), allocatable, save iso_indnum
Definition: infotrac.F90:51
!$Id annee_ref
Definition: temps.h:15
!$Header!gestion des impressions de sorties et de débogage la sortie standard prt_level COMMON comprint lunout
Definition: iniprint.h:7
subroutine check_dim(n1, n2, str1, str2)
Definition: dynetat0.f90:152
!$Header!CDK comgeom COMMON comgeom rlonv
Definition: comgeom.h:25