source: LMDZ5/trunk/libf/dyn3dmem/dynetat0_loc.f90 @ 2597

Last change on this file since 2597 was 2597, checked in by Ehouarn Millour, 8 years ago

Cleanup in the dynamics: get rid of comconst.h, make it a module comconst_mod.
EM

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
File size: 8.6 KB
Line 
1SUBROUTINE dynetat0_loc(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 parallel_lmdz
9  USE infotrac
10  USE netcdf, ONLY: NF90_OPEN,  NF90_INQUIRE_DIMENSION, NF90_INQ_VARID,        &
11      NF90_NOWRITE, NF90_CLOSE, NF90_INQUIRE_VARIABLE,  NF90_GET_VAR, NF90_NoErr
12  USE control_mod, ONLY: planet_type
13  USE assert_eq_m, ONLY: assert_eq
14  USE comconst_mod, ONLY: cpp, daysec, dtvr, g, im, jm, kappa, lllm, &
15                          omeg, rad
16  IMPLICIT NONE
17  include "dimensions.h"
18  include "paramet.h"
19  include "temps.h"
20  include "comvert.h"
21  include "comgeom.h"
22  include "ener.h"
23  include "description.h"
24  include "serre.h"
25  include "logic.h"
26  include "iniprint.h"
27!===============================================================================
28! Arguments:
29  CHARACTER(LEN=*), INTENT(IN) :: fichnom          !--- FILE NAME
30  REAL, INTENT(OUT) ::  vcov(ijb_v:ije_v,llm)      !--- V COVARIANT WIND
31  REAL, INTENT(OUT) ::  ucov(ijb_u:ije_u,llm)      !--- U COVARIANT WIND
32  REAL, INTENT(OUT) ::  teta(ijb_u:ije_u,llm)      !--- POTENTIAL TEMP.
33  REAL, INTENT(OUT) ::     q(ijb_u:ije_u,llm,nqtot)!--- TRACERS
34  REAL, INTENT(OUT) :: masse(ijb_u:ije_u,llm)      !--- MASS PER CELL
35  REAL, INTENT(OUT) ::    ps(ijb_u:ije_u)          !--- GROUND PRESSURE
36  REAL, INTENT(OUT) ::  phis(ijb_u:ije_u)          !--- GEOPOTENTIAL
37!===============================================================================
38! Local variables:
39  CHARACTER(LEN=256) :: msg, var, modname
40  INTEGER, PARAMETER :: length=100
41  INTEGER :: iq, fID, vID, idecal, ierr
42  REAL    :: time, tab_cntrl(length)               !--- RUN PARAMS TABLE
43  REAL,             ALLOCATABLE :: vcov_glo(:,:),masse_glo(:,:),   ps_glo(:)
44  REAL,             ALLOCATABLE :: ucov_glo(:,:),    q_glo(:,:), phis_glo(:)
45  REAL,             ALLOCATABLE :: teta_glo(:,:)
46!-------------------------------------------------------------------------------
47  modname="dynetat0_loc"
48
49!--- Initial state file opening
50  var=fichnom
51  CALL err(NF90_OPEN(var,NF90_NOWRITE,fID),"open",var)
52  CALL get_var1("controle",tab_cntrl)
53
54!!! AS: idecal is a hack to be able to read planeto starts...
55!!!     .... while keeping everything OK for LMDZ EARTH
56  IF(planet_type=="generic") THEN
57    WRITE(lunout,*)'NOTE NOTE NOTE : Planeto-like start files'
58    idecal = 4
59    annee_ref  = 2000
60  ELSE
61    WRITE(lunout,*)'NOTE NOTE NOTE : Earth-like start files'
62    idecal = 5
63    annee_ref  = tab_cntrl(5)
64  END IF
65  im         = tab_cntrl(1)
66  jm         = tab_cntrl(2)
67  lllm       = tab_cntrl(3)
68  day_ref    = tab_cntrl(4)
69  rad        = tab_cntrl(idecal+1)
70  omeg       = tab_cntrl(idecal+2)
71  g          = tab_cntrl(idecal+3)
72  cpp        = tab_cntrl(idecal+4)
73  kappa      = tab_cntrl(idecal+5)
74  daysec     = tab_cntrl(idecal+6)
75  dtvr       = tab_cntrl(idecal+7)
76  etot0      = tab_cntrl(idecal+8)
77  ptot0      = tab_cntrl(idecal+9)
78  ztot0      = tab_cntrl(idecal+10)
79  stot0      = tab_cntrl(idecal+11)
80  ang0       = tab_cntrl(idecal+12)
81  pa         = tab_cntrl(idecal+13)
82  preff      = tab_cntrl(idecal+14)
83!
84  clon       = tab_cntrl(idecal+15)
85  clat       = tab_cntrl(idecal+16)
86  grossismx  = tab_cntrl(idecal+17)
87  grossismy  = tab_cntrl(idecal+18)
88!
89  IF ( tab_cntrl(idecal+19)==1. )  THEN
90    fxyhypb  = .TRUE.
91!   dzoomx   = tab_cntrl(25)
92!   dzoomy   = tab_cntrl(26)
93!   taux     = tab_cntrl(28)
94!   tauy     = tab_cntrl(29)
95  ELSE
96    fxyhypb = .FALSE.
97    ysinus  = tab_cntrl(idecal+22)==1.
98  END IF
99
100  day_ini    = tab_cntrl(30)
101  itau_dyn   = tab_cntrl(31)
102!  start_time = tab_cntrl(32)   ????
103
104!-------------------------------------------------------------------------------
105  WRITE(lunout,*)TRIM(modname)//': rad,omeg,g,cpp,kappa',rad,omeg,g,cpp,kappa
106  CALL check_dim(im,iim,'im','im')
107  CALL check_dim(jm,jjm,'jm','jm')
108  CALL check_dim(lllm,llm,'lm','lllm')
109  CALL get_var1("rlonu",rlonu)
110  CALL get_var1("rlatu",rlatu)
111  CALL get_var1("rlonv",rlonv)
112  CALL get_var1("rlatv",rlatv)
113  CALL get_var1("cu"  ,cu)
114  CALL get_var1("cv"  ,cv)
115  CALL get_var1("aire",aire)
116
117  var="temps"
118  IF(NF90_INQ_VARID(fID,var,vID)/=NF90_NoErr) THEN
119    WRITE(lunout,*)TRIM(modname)//": missing field <temps>"
120    WRITE(lunout,*)TRIM(modname)//": trying with <Time>"; var="Time"
121    CALL err(NF90_INQ_VARID(fID,var,vID),"inq",var)
122  END IF
123  CALL err(NF90_GET_VAR(fID,vID,time),"get",var)
124
125  ALLOCATE(phis_glo(ip1jmp1))
126  CALL get_var1("phisinit",phis_glo)
127  phis (ijb_u:ije_u)  =phis_glo(ijb_u:ije_u);    DEALLOCATE(phis_glo)
128
129  ALLOCATE(ucov_glo(ip1jmp1,llm))
130  CALL get_var2("ucov",ucov_glo)
131  ucov (ijb_u:ije_u,:)=ucov_glo(ijb_u:ije_u,:);  DEALLOCATE(ucov_glo)
132
133  ALLOCATE(vcov_glo(ip1jm,llm))
134  CALL get_var2("vcov",vcov_glo)
135  vcov (ijb_v:ije_v,:)=vcov_glo(ijb_v:ije_v,:);  DEALLOCATE(vcov_glo)
136
137  ALLOCATE(teta_glo(ip1jmp1,llm))
138  CALL get_var2("teta",teta_glo)
139  teta (ijb_u:ije_u,:)=teta_glo(ijb_u:ije_u,:);  DEALLOCATE(teta_glo)
140
141  ALLOCATE(masse_glo(ip1jmp1,llm))
142  CALL get_var2("masse",masse_glo)
143  masse(ijb_u:ije_u,:)=masse_glo(ijb_u:ije_u,:); DEALLOCATE(masse_glo)
144 
145  ALLOCATE(ps_glo(ip1jmp1))
146  CALL get_var1("ps",ps_glo)
147  ps   (ijb_u:ije_u)  =   ps_glo(ijb_u:ije_u);   DEALLOCATE(ps_glo)
148
149!--- Tracers
150  ALLOCATE(q_glo(ip1jmp1,llm))
151  DO iq=1,nqtot
152    var=tname(iq)
153    IF(NF90_INQ_VARID(fID,var,vID)==NF90_NoErr) THEN
154      CALL get_var2(var,q_glo); q(ijb_u:ije_u,:,iq)=q_glo(ijb_u:ije_u,:); CYCLE
155    END IF
156    WRITE(lunout,*)TRIM(modname)//": Tracer <"//TRIM(var)//"> is missing"
157    WRITE(lunout,*)"         It is hence initialized to zero"
158    q(ijb_u:ije_u,:,iq)=0.
159   !--- CRisi: for isotops, theoretical initialization using very simplified
160   !           Rayleigh distillation las.
161    IF(ok_isotopes.AND.iso_num(iq)>0) THEN
162      IF(zone_num(iq)==0) q(:,:,iq)=q(:,:,iqpere(iq))*tnat(iso_num(iq))        &
163     &           *(q(:,:,iqpere(iq))/30.e-3)**(alpha_ideal(iso_num(iq))-1)
164      IF(zone_num(iq)==1) q(:,:,iq)=q(:,:,iqiso(iso_indnum(iq),phase_num(iq)))
165    END IF
166  END DO
167  DEALLOCATE(q_glo)
168  CALL err(NF90_CLOSE(fID),"close",fichnom)
169  day_ini=day_ini+INT(time)
170  time=time-INT(time)
171
172
173  CONTAINS
174
175
176SUBROUTINE check_dim(n1,n2,str1,str2)
177  INTEGER,          INTENT(IN) :: n1, n2
178  CHARACTER(LEN=*), INTENT(IN) :: str1, str2
179  CHARACTER(LEN=256) :: s1, s2
180  IF(n1/=n2) THEN
181    s1='value of '//TRIM(str1)//' ='
182    s2=' read in starting file differs from parametrized '//TRIM(str2)//' ='
183    WRITE(msg,'(10x,a,i4,2x,a,i4)'),s1,n1,s2,n2
184    CALL ABORT_gcm(TRIM(modname),TRIM(msg),1)
185  END IF
186END SUBROUTINE check_dim
187
188
189SUBROUTINE get_var1(var,v)
190  CHARACTER(LEN=*), INTENT(IN)  :: var
191  REAL,             INTENT(OUT) :: v(:)
192  REAL,             ALLOCATABLE :: w2(:,:), w3(:,:,:)
193  INTEGER :: nn(3), dids(3), k, nd, ntot
194
195  CALL err(NF90_INQ_VARID(fID,var,vID),"inq",var)
196  ierr=NF90_INQUIRE_VARIABLE(fID,vID,ndims=nd)
197  IF(nd==1) THEN
198    CALL err(NF90_GET_VAR(fID,vID,v),"get",var); RETURN
199  END IF
200  ierr=NF90_INQUIRE_VARIABLE(fID,vID,dimids=dids)
201  DO k=1,nd; ierr=NF90_INQUIRE_DIMENSION(fID,dids(k),len=nn(k)); END DO
202  ntot=PRODUCT(nn(1:nd))
203  SELECT CASE(nd)
204    CASE(2); ALLOCATE(w2(nn(1),nn(2)))
205      CALL err(NF90_GET_VAR(fID,vID,w2),"get",var)
206      v=RESHAPE(w2,[ntot]); DEALLOCATE(w2)
207    CASE(3); ALLOCATE(w3(nn(1),nn(2),nn(3)))
208      CALL err(NF90_GET_VAR(fID,vID,w3),"get",var)
209      v=RESHAPE(w3,[ntot]); DEALLOCATE(w3)
210  END SELECT
211END SUBROUTINE get_var1
212
213
214SUBROUTINE get_var2(var,v)
215  CHARACTER(LEN=*), INTENT(IN)  :: var
216  REAL,             INTENT(OUT) :: v(:,:)
217  REAL,             ALLOCATABLE :: w4(:,:,:,:)
218  INTEGER :: nn(4), dids(4), k, nd
219  CALL err(NF90_INQ_VARID(fID,var,vID),"inq",var)
220  ierr=NF90_INQUIRE_VARIABLE(fID,vID,dimids=dids,ndims=nd)
221  DO k=1,nd; ierr=NF90_INQUIRE_DIMENSION(fID,dids(k),len=nn(k)); END DO
222  ALLOCATE(w4(nn(1),nn(2),nn(3),nn(4)))
223  CALL err(NF90_GET_VAR(fID,vID,w4),"get",var)
224  v=RESHAPE(w4,[nn(1)*nn(2),nn(3)]); DEALLOCATE(w4)
225END SUBROUTINE get_var2
226
227
228SUBROUTINE err(ierr,typ,nam)
229  INTEGER,          INTENT(IN) :: ierr   !--- NetCDF ERROR CODE
230  CHARACTER(LEN=*), INTENT(IN) :: typ    !--- TYPE OF OPERATION
231  CHARACTER(LEN=*), INTENT(IN) :: nam    !--- FIELD/FILE NAME
232  IF(ierr==NF90_NoERR) RETURN
233  SELECT CASE(typ)
234    CASE('inq');   msg="Field <"//TRIM(nam)//"> is missing"
235    CASE('get');   msg="Reading failed for <"//TRIM(nam)//">"
236    CASE('open');  msg="File opening failed for <"//TRIM(nam)//">"
237    CASE('close'); msg="File closing failed for <"//TRIM(nam)//">"
238  END SELECT
239  CALL ABORT_gcm(TRIM(modname),TRIM(msg),ierr)
240END SUBROUTINE err
241
242END SUBROUTINE dynetat0_loc
Note: See TracBrowser for help on using the repository browser.