source: trunk/LMDZ.MARS/libf/dyn3d/dynetat0.F @ 937

Last change on this file since 937 was 791, checked in by emillour, 12 years ago

Mars GCM:

Adapted code so that it can run fractions of days: e.g. if "nday=1.5" in

run.def, then run a sol and a half, "nday=0.75" to run three quarters of
a sol... Of course the fraction should correspond to a number of complete
dynamics/physics cycles. The fraction of the sol that a (re)start.nc
file corresponds to is (read)written as 'Time' in the file.

EM

File size: 12.7 KB
Line 
1      SUBROUTINE dynetat0(fichnom,nq,vcov,ucov,
2     .                    teta,q,masse,ps,phis,time)
3     
4      use netcdf
5     
6      IMPLICIT NONE
7
8c=======================================================================
9c
10c   Auteur:  P. Le Van / L.Fairhead
11c   -------
12c
13c   objet:
14c   ------
15c
16c   Lecture de l'etat initial
17c
18c   Modifs: Oct.2008 read in tracers by name. Ehouarn Millour
19c           Aug.2010 use NetCDF90 to load variables (enables using
20c                    r4 or r8 restarts independently of having compiled
21c                    the GCM in r4 or r8)
22c
23c=======================================================================
24c-----------------------------------------------------------------------
25c   Declarations:
26c   -------------
27
28#include "dimensions.h"
29#include "paramet.h"
30#include "temps.h"
31#include "comconst.h"
32#include "comvert.h"
33#include "comgeom2.h"
34#include "ener.h"
35#include "description.h"
36#include "serre.h"
37#include "logic.h"
38#include"advtrac.h"
39
40c   Arguments:
41c   ----------
42
43      CHARACTER*(*) fichnom
44      INTEGER nq
45      REAL vcov(iip1,jjm,llm),ucov(iip1,jjp1,llm),teta(iip1,jjp1,llm)
46      REAL q(iip1,jjp1,llm,nq)
47      REAL masse(iip1,jjp1,llm)
48      REAL ps(iip1,jjp1),phis(iip1,jjp1)
49
50      REAL time ! fraction of day the fields correspond to
51
52c   Variables
53c
54      REAL traceur(iip1,jjp1,llm) ! to temporarily store a tracer
55      INTEGER length,iq,i,j,l
56      PARAMETER (length = 100)
57      REAL tab_cntrl(length) ! tableau des parametres du run
58      INTEGER ierr, nid, nvarid, nqold
59      CHARACTER  str3*3,yes*1
60
61c-----------------------------------------------------------------------
62
63c  Ouverture NetCDF du fichier etat initial
64
65      ierr=nf90_open(fichnom,NF90_NOWRITE,nid)
66      IF (ierr.NE.nf90_noerr) THEN
67        write(6,*)' Pb d''ouverture du fichier ',trim(fichnom)
68        write(*,*)trim(nf90_strerror(ierr))
69        CALL ABORT
70      ENDIF
71
72c
73      ierr=nf90_inq_varid(nid,"controle",nvarid)
74      IF (ierr .NE. nf90_noerr) THEN
75         PRINT*, "dynetat0: Le champ <controle> est absent"
76         write(*,*)trim(nf90_strerror(ierr))
77         CALL abort
78      ENDIF
79      ierr=nf90_get_var(nid,nvarid,tab_cntrl)
80      IF (ierr .NE. nf90_noerr) THEN
81         PRINT*, "dynetat0: Lecture echoue pour <controle>"
82         write(*,*)trim(nf90_strerror(ierr))
83         CALL abort
84      ENDIF
85
86      im         = tab_cntrl(1)
87      jm         = tab_cntrl(2)
88      lllm       = tab_cntrl(3)
89      day_ini    = tab_cntrl(4)
90      rad        = tab_cntrl(5)
91      omeg       = tab_cntrl(6)
92      g          = tab_cntrl(7)
93      cpp        = tab_cntrl(8)
94      kappa      = tab_cntrl(9)
95      daysec     = tab_cntrl(10)
96      dtvr       = tab_cntrl(11)
97      etot0      = tab_cntrl(12)
98      ptot0      = tab_cntrl(13)
99      ztot0      = tab_cntrl(14)
100      stot0      = tab_cntrl(15)
101      ang0       = tab_cntrl(16)
102      pa         = tab_cntrl(17)
103      preff      = tab_cntrl(18)
104c
105      clon       = tab_cntrl(19)
106      clat       = tab_cntrl(20)
107      grossismx  = tab_cntrl(21)
108      grossismy  = tab_cntrl(22)
109c
110      IF ( tab_cntrl(23).EQ.1. )  THEN
111        fxyhypb  = . TRUE .
112        dzoomx   = tab_cntrl(24)
113        dzoomy   = tab_cntrl(25)
114        taux     = tab_cntrl(27)
115        tauy     = tab_cntrl(28)
116      ELSE
117        fxyhypb = . FALSE .
118        ysinus  = . FALSE .
119        IF( tab_cntrl(26).EQ.1. ) ysinus = . TRUE.
120      ENDIF
121c   .................................................................
122c
123c
124      PRINT*,'dynetat0: rad,omeg,g,cpp,kappa',rad,omeg,g,cpp,kappa
125 
126      IF(   im.ne.iim           )  THEN
127          PRINT 1,im,iim
128          STOP
129      ELSE  IF( jm.ne.jjm       )  THEN
130          PRINT 2,jm,jjm
131          STOP
132      ELSE  IF( lllm.ne.llm     )  THEN
133          PRINT 3,lllm,llm
134          STOP
135      ENDIF
136
137      ierr=nf90_inq_varid(nid,"rlonu",nvarid)
138      IF (ierr .NE. nf90_noerr) THEN
139         PRINT*, "dynetat0: Le champ <rlonu> est absent"
140         write(*,*)trim(nf90_strerror(ierr))
141         CALL abort
142      ENDIF
143      ierr=nf90_get_var(nid,nvarid,rlonu)
144      IF (ierr .NE. nf90_noerr) THEN
145         PRINT*, "dynetat0: Lecture echouee pour <rlonu>"
146         write(*,*)trim(nf90_strerror(ierr))
147         CALL abort
148      ENDIF
149
150      ierr=nf90_inq_varid(nid,"rlatu",nvarid)
151      IF (ierr .NE. nf90_noerr) THEN
152         PRINT*, "dynetat0: Le champ <rlatu> est absent"
153         write(*,*)trim(nf90_strerror(ierr))
154         CALL abort
155      ENDIF
156      ierr=nf90_get_var(nid,nvarid,rlatu)
157      IF (ierr .NE. nf90_noerr) THEN
158         PRINT*, "dynetat0: Lecture echouee pour <rlatu>"
159         write(*,*)trim(nf90_strerror(ierr))
160         CALL abort
161      ENDIF
162
163      ierr=nf90_inq_varid(nid,"rlonv",nvarid)
164      IF (ierr .NE. nf90_noerr) THEN
165         PRINT*, "dynetat0: Le champ <rlonv> est absent"
166         write(*,*)trim(nf90_strerror(ierr))
167         CALL abort
168      ENDIF
169      ierr=nf90_get_var(nid,nvarid,rlonv)
170      IF (ierr .NE. nf90_noerr) THEN
171         PRINT*, "dynetat0: Lecture echouee pour <rlonv>"
172         write(*,*)trim(nf90_strerror(ierr))
173         CALL abort
174      ENDIF
175
176      ierr=nf90_inq_varid(nid,"rlatv",nvarid)
177      IF (ierr .NE. nf90_noerr) THEN
178         PRINT*, "dynetat0: Le champ <rlatv> est absent"
179         write(*,*)trim(nf90_strerror(ierr))
180         CALL abort
181      ENDIF
182      ierr=nf90_get_var(nid,nvarid,rlatv)
183      IF (ierr .NE. nf90_noerr) THEN
184         PRINT*, "dynetat0: Lecture echouee pour rlatv"
185         write(*,*)trim(nf90_strerror(ierr))
186         CALL abort
187      ENDIF
188
189      ierr=nf90_inq_varid(nid,"cu",nvarid)
190      IF (ierr .NE. nf90_noerr) THEN
191         PRINT*, "dynetat0: Le champ <cu> est absent"
192         write(*,*)trim(nf90_strerror(ierr))
193         CALL abort
194      ENDIF
195      ierr=nf90_get_var(nid,nvarid,cu)
196      IF (ierr .NE. nf90_noerr) THEN
197         PRINT*, "dynetat0: Lecture echouee pour <cu>"
198         write(*,*)trim(nf90_strerror(ierr))
199         CALL abort
200      ENDIF
201
202      ierr=nf90_inq_varid(nid,"cv",nvarid)
203      IF (ierr .NE. nf90_noerr) THEN
204         PRINT*, "dynetat0: Le champ <cv> est absent"
205         write(*,*)trim(nf90_strerror(ierr))
206         CALL abort
207      ENDIF
208      ierr=nf90_get_var(nid,nvarid,cv)
209      IF (ierr .NE. nf90_noerr) THEN
210         PRINT*, "dynetat0: Lecture echouee pour <cv>"
211         write(*,*)trim(nf90_strerror(ierr))
212         CALL abort
213      ENDIF
214
215      ierr=nf90_inq_varid(nid,"aire",nvarid)
216      IF (ierr .NE. nf90_noerr) THEN
217         PRINT*, "dynetat0: Le champ <aire> est absent"
218         write(*,*)trim(nf90_strerror(ierr))
219         CALL abort
220      ENDIF
221      ierr=nf90_get_var(nid,nvarid,aire)
222      IF (ierr .NE. nf90_noerr) THEN
223         PRINT*, "dynetat0: Lecture echouee pour <aire>"
224         write(*,*)trim(nf90_strerror(ierr))
225         CALL abort
226      ENDIF
227
228      ierr=nf90_inq_varid(nid,"phisinit",nvarid)
229      IF (ierr .NE. nf90_noerr) THEN
230         PRINT*, "dynetat0: Le champ <phisinit> est absent"
231         write(*,*)trim(nf90_strerror(ierr))
232         CALL abort
233      ENDIF
234      ierr=nf90_get_var(nid,nvarid,phis)
235      IF (ierr .NE. nf90_noerr) THEN
236         PRINT*, "dynetat0: Lecture echouee pour <phisinit>"
237         write(*,*)trim(nf90_strerror(ierr))
238         CALL abort
239      ENDIF
240
241      ierr=nf90_inq_varid(nid,"Time",nvarid)
242      IF (ierr .NE. nf90_noerr) THEN
243             ierr=nf90_inq_varid(nid,"temps", nvarid)
244                 IF (ierr .NE. nf90_noerr) THEN
245           PRINT*, "dynetat0: <Time> or <temps> absent"
246           write(*,*)trim(nf90_strerror(ierr))
247           CALL abort
248         ENDIF
249      ENDIF
250      ierr=nf90_get_var(nid,nvarid,time)
251      IF (ierr .NE. nf90_noerr) THEN
252         PRINT*, "dynetat0: Lecture echouee <Time>/<temps>"
253         write(*,*)trim(nf90_strerror(ierr))
254         CALL abort
255      ENDIF
256
257      ierr=nf90_inq_varid(nid,"ucov",nvarid)
258      IF (ierr .NE. nf90_noerr) THEN
259         PRINT*, "dynetat0: Le champ <ucov> est absent"
260         write(*,*)trim(nf90_strerror(ierr))
261         CALL abort
262      ENDIF
263      ierr=nf90_get_var(nid,nvarid,ucov)
264      IF (ierr .NE. nf90_noerr) THEN
265         PRINT*, "dynetat0: Lecture echouee pour <ucov>"
266         write(*,*)trim(nf90_strerror(ierr))
267         CALL abort
268      ENDIF
269 
270      ierr=nf90_inq_varid(nid,"vcov",nvarid)
271      IF (ierr .NE. nf90_noerr) THEN
272         PRINT*, "dynetat0: Le champ <vcov> est absent"
273         write(*,*)trim(nf90_strerror(ierr))
274         CALL abort
275      ENDIF
276      ierr=nf90_get_var(nid,nvarid,vcov)
277      IF (ierr .NE. nf90_noerr) THEN
278         PRINT*, "dynetat0: Lecture echouee pour <vcov>"
279         write(*,*)trim(nf90_strerror(ierr))
280         CALL abort
281      ENDIF
282
283      ierr=nf90_inq_varid(nid,"teta",nvarid)
284      IF (ierr .NE. nf90_noerr) THEN
285         PRINT*, "dynetat0: Le champ <teta> est absent"
286         write(*,*)trim(nf90_strerror(ierr))
287         CALL abort
288      ENDIF
289      ierr=nf90_get_var(nid,nvarid,teta)
290      IF (ierr .NE. nf90_noerr) THEN
291         PRINT*, "dynetat0: Lecture echouee pour <teta>"
292         write(*,*)trim(nf90_strerror(ierr))
293         CALL abort
294      ENDIF
295
296
297      IF(nq.GE.1) THEN
298        write(*,*) 'dynetat0: loading tracers'
299         IF(nq.GT.99) THEN
300            PRINT*, "Trop de traceurs"
301            CALL abort
302         ENDIF
303         nqold=nq
304         DO iq=1,nq
305!           str3(1:1)='q'
306!           WRITE(str3(2:3),'(i2.2)') iq
307!           ierr =  NF_INQ_VARID (nid, str3, nvarid)
308! NB: tracers are now read in using their name ('tnom' from advtrac.h)
309!           write(*,*) "  loading tracer:",trim(tnom(iq))
310           ierr=nf90_inq_varid(nid,tnom(iq),nvarid)
311           IF (ierr .NE. nf90_noerr) THEN
312!              PRINT*, "dynetat0: Le champ <"//str3//"> est absent"
313              PRINT*, "dynetat0: Le champ <"//trim(tnom(iq))//
314     &                "> est absent"
315              PRINT*, "          Il est donc initialise a zero"
316              CALL initial0(ijp1llm,q(1,1,1,iq))
317              nqold=min(iq-1,nqold)
318           ELSE
319           !ierr=nf90_get_var(nid,nvarid,q(1,1,1,iq))
320           ierr=nf90_get_var(nid,nvarid,traceur)
321             IF (ierr .NE. nf90_noerr) THEN
322!                 PRINT*, "dynetat0: Lecture echouee pour "//str3
323               PRINT*, "dynetat0: Lecture echouee pour "//trim(tnom(iq))
324               CALL abort
325             ENDIF
326             q(:,:,:,iq)=traceur(:,:,:)
327           ENDIF
328         ENDDO
329         if ((nqold.lt.nq).and.(nqold.ge.1)) then   
330c        case when new tracer are added in addition to old ones
331             write(*,*)'tracers 1 to ', nqold,'were already present'
332             write(*,*)'tracers ', nqold+1,' to ', nqmx,'are new'
333!             yes=' '
334!            do while ((yes.ne.'y').and.(yes.ne.'n'))
335!             write(*,*) 'Would you like to reindex tracer # 1 ->',nqold
336!             write(*,*) 'to #',nqmx-nqold+1,'->', nqmx,'   (y or n) ?'
337!             read(*,fmt='(a)') yes
338!            end do
339!            if (yes.eq.'y') then
340!              write(*,*) 'OK, let s reindex the tracers'
341!              do l=1,llm
342!                do j=1,jjp1
343!                  do i=1,iip1
344!                    do iq=nqmx,nqmx-nqold+1,-1
345!                       q(i,j,l,iq)=q(i,j,l,iq-nqmx+nqold)   
346!                    end do
347!                    do iq=nqmx-nqold,1,-1
348!                       q(i,j,l,iq)= 0.
349!                    end do
350!                  end do
351!                end do
352!              end do
353!            end if
354         end if
355      ENDIF
356
357      ierr=nf90_inq_varid(nid,"masse",nvarid)
358      IF (ierr .NE. nf90_noerr) THEN
359         PRINT*, "dynetat0: Le champ <masse> est absent"
360         write(*,*)trim(nf90_strerror(ierr))
361         CALL abort
362      ENDIF
363      ierr=nf90_get_var(nid,nvarid,masse)
364      IF (ierr .NE. nf90_noerr) THEN
365         PRINT*, "dynetat0: Lecture echouee pour <masse>"
366         write(*,*)trim(nf90_strerror(ierr))
367         CALL abort
368      ENDIF
369
370      ierr=nf90_inq_varid(nid,"ps",nvarid)
371      IF (ierr .NE. nf90_noerr) THEN
372         PRINT*, "dynetat0: Le champ <ps> est absent"
373         write(*,*)trim(nf90_strerror(ierr))
374         CALL abort
375      ENDIF
376      ierr=nf90_get_var(nid,nvarid,ps)
377      IF (ierr .NE. nf90_noerr) THEN
378         PRINT*, "dynetat0: Lecture echouee pour <ps>"
379         write(*,*)trim(nf90_strerror(ierr))
380         CALL abort
381      ENDIF
382
383      ierr=nf90_close(nid)
384
385      ! day_ini=day_ini+INT(time) ! obsolete stuff ; 0<time<1 anyways
386      ! time=time-INT(time)
387
388  1   FORMAT(//10x,'la valeur de im =',i4,2x,'lue sur le fichier de dem
389     *arrage est differente de la valeur parametree iim =',i4//)
390   2  FORMAT(//10x,'la valeur de jm =',i4,2x,'lue sur le fichier de dem
391     *arrage est differente de la valeur parametree jjm =',i4//)
392   3  FORMAT(//10x,'la valeur de lmax =',i4,2x,'lue sur le fichier dema
393     *rrage est differente de la valeur parametree llm =',i4//)
394   4  FORMAT(//10x,'la valeur de dtrv =',i4,2x,'lue sur le fichier dema
395     *rrage est differente de la valeur  dtinteg =',i4//)
396
397      RETURN
398      END
Note: See TracBrowser for help on using the repository browser.