source: trunk/mesoscale/LMDZ.MARS/libf_gcm/phymars/testphys1d.F @ 57

Last change on this file since 57 was 57, checked in by aslmd, 14 years ago

mineur LMD_MM_MARS: ajout du GCM ancienne physique, systeme maintenant complet sur SVN (ne manque que la base de donnees d'etats initiaux)

File size: 15.6 KB
Line 
1
2      PROGRAM testphys1d
3      IMPLICIT NONE
4
5c=======================================================================
6c   subject:
7c   --------
8c   PROGRAM useful to run physical part of the martian GCM in a 1D column
9c       
10c Can be compiled with a command like (e.g. for 25 layers)
11c  "makegcm -p mars -d 25 testphys1d"
12c It requires the files "testphys1d.def" "callphys.def"
13c      and a file describing the sigma layers (e.g. "z2sig.def")
14c
15c   author: Frederic Hourdin, R.Fournier,F.Forget
16c   -------
17c   
18c   update: 12/06/2003 including chemistry (S. Lebonnois)
19c                            and water ice (F. Montmessin)
20c
21c=======================================================================
22
23#include "dimensions.h"
24#include "dimphys.h"
25#include "dimradmars.h"
26#include "comgeomfi.h"
27#include "surfdat.h"
28#include "comdiurn.h"
29#include "callkeys.h"
30#include "comcstfi.h"
31#include "planete.h"
32#include "comsaison.h"
33#include "yomaer.h"
34#include "aerdust.h"
35#include "control.h"
36#include "comvert.h"
37#include "netcdf.inc"
38#include "comg1d.h"
39#include "watercap.h"
40#include "fisice.h"
41#include "logic.h"
42
43c --------------------------------------------------------------
44c  Declarations
45c --------------------------------------------------------------
46c
47      INTEGER unit           ! unite de lecture de "testphys1d.def"
48      INTEGER unitstart      ! unite d'ecriture de "startfi"
49      INTEGER nlayer,nlevel,nsoil,ndt
50      INTEGER ilayer,ilevel,isoil,idt,iq
51      LOGICAl firstcall,lastcall
52c
53      INTEGER day0          ! date initial (sol ; =0 a Ls=0)
54      REAL day           ! date durant le run
55      REAL time             ! time (0<time<1 ; time=0.5 a midi)
56      REAL play(nlayermx)   ! Pressure at the middle of the layers (Pa)
57      REAL plev(nlayermx+1) ! intermediate pressure levels (pa)
58      REAL psurf,tsurf     
59      REAL u(nlayermx),v(nlayermx)  ! zonal, meridional wind
60      REAL gru,grv   ! prescribed "geostrophic" background wind
61      REAL temp(nlayermx)   ! temperature at the middle of the layers
62      REAL q(nlayermx,nqmx) ! tracer mixing ratio (e.g. kg/kg)
63      REAL qsurf(nqmx)      ! tracer surface budget (e.g. kg.m-2)
64      REAL tsoil(nsoilmx)   ! subsurface soik temperature (K)
65      REAL co2ice           ! co2ice layer (kg.m-2)
66      REAL emis             ! surface layer
67      REAL q2(nlayermx+1)   ! Turbulent Kinetic Energy
68      REAL zlay(nlayermx)   ! altitude estimee dans les couches (km)
69
70c    Physical and dynamical tandencies (e.g.  m.s-2, K/s, Pa/s)
71      REAL du(nlayermx),dv(nlayermx),dtemp(nlayermx)
72      REAL dudyn(nlayermx),dvdyn(nlayermx),dtempdyn(nlayermx)
73      REAL dpsurf   
74      REAL dq(nlayermx,nqmx)
75      REAL dqdyn(nlayermx,nqmx)
76
77c   Various intermediate variables
78      INTEGER thermo
79      REAL zls
80      REAL phi(nlayermx),h(nlayermx),s(nlayermx)
81      REAL pks, ptif, w(nlayermx)
82      REAL qtotinit, mqtot(nqmx),qtot
83      INTEGER ierr, aslun
84      REAL tmp1(0:nlayermx),tmp2(0:nlayermx)
85      Logical  tracerdyn
86
87      character*2 str2
88
89c=======================================================================
90
91c=======================================================================
92c INITIALISATION
93c=======================================================================
94
95c ------------------------------------------------------
96c  Constantes prescrites ICI
97c ------------------------------------------------------
98
99      pi=2.E+0*asin(1.E+0)
100
101c     Constante de la Planete Mars
102c     ----------------------------
103      rad=3397200.               ! rayon de mars (m)  ~3397200 m
104      daysec=88775.              ! duree du sol (s)  ~88775 s
105      omeg=4.*asin(1.)/(daysec)  ! vitesse de rotation (rad.s-1)
106      g=3.72                     ! gravite (m.s-2) ~3.72 
107      mugaz=43.49                ! Masse molaire de l'atm (g.mol-1) ~43.49
108      rcp=.256793                ! = r/cp  ~0.256793
109      r= 8.314511E+0 *1000.E+0/mugaz
110      cpp= r/rcp
111      year_day = 669           ! duree de l'annee (sols) ~668.6
112      periheli = 206.66          ! dist.min. soleil-mars (Mkm) ~206.66
113      aphelie = 249.22           ! dist.max. soleil-mars (Mkm) ~249.22
114      peri_day =  485.           ! date du perihelie (sols depuis printemps)
115      obliquit = 25.2           ! Obliquite de la planete (deg) ~25.2         
116 
117c     Parametres Couche limite et Turbulence
118c     --------------------------------------
119      z0 =  1.e-2                ! surface roughness (m) ~0.01
120      emin_turb = 1.e-6          ! energie minimale ~1.e-8
121      lmixmin = 30               ! longueur de melange ~100
122 
123c     propriete optiques des calottes et emissivite du sol
124c     ----------------------------------------------------
125      emissiv= 0.95              ! Emissivite du sol martien ~.95
126      emisice(1)=0.95            ! Emissivite calotte nord
127      emisice(2)=0.95            ! Emissivite calotte sud 
128      albedice(1)=0.5           ! Albedo calotte nord
129      albedice(2)=0.5            ! Albedo calotte sud
130      iceradius(1) = 100.e-6     ! mean scat radius of CO2 snow (north)
131      iceradius(2) = 100.e-6     ! mean scat radius of CO2 snow (south)
132      dtemisice(1) = 2.          ! time scale for snow metamorphism (north)
133      dtemisice(2) = 2.          ! time scale for snow metamorphism (south
134      hybrid=.false.
135
136c ------------------------------------------------------
137c  Lecture des parametres dans "testphys1d.def"
138c ------------------------------------------------------
139
140c   Opening parameters file "testphys1d.def"
141c   ---------------------------------------
142      unit =97
143      OPEN(unit,file='testphys1d.def',status='old',form='formatted'
144     .     ,iostat=ierr)
145
146      IF(ierr.ne.0) THEN
147        write(*,*) 'Problem to open "testphys1d.def'
148        write(*,*) 'Is it there ?'
149        stop
150      END IF
151
152c  Date et heure locale du debut du run
153c  ------------------------------------
154c    Date (en sols depuis le solstice de printemps) du debut du run
155      day0 = 0
156      PRINT *,'date de depart ?'
157      READ(unit,*) day0
158      day=float(day0)
159      PRINT *,day0
160c  Heure de demarrage
161      PRINT *,'heure de debut de simulation (entre 0 et 24) ?'
162      READ(unit,*) time
163      time=time/24.E+0
164
165c  Discretisation (Definition de la grille et des pas de temps)
166c  --------------
167c
168      nlayer=nlayermx
169      nlevel=nlayer+1
170      nsoil=nsoilmx
171      PRINT *,'nombre de pas de temps par jour ?'
172      READ(unit,*) day_step
173      print*,day_step
174
175      PRINT *,'nombre de jours simules ?'
176      READ(unit,*) ndt
177      print*,ndt
178
179      ndt=ndt*day_step     
180      dtphys=daysec/day_step 
181c Pression de surface sur la planete
182c ------------------------------------
183c
184      PRINT *,'pression au sol'
185      READ(unit,*) psurf
186      PRINT *,psurf
187c Pression de reference
188      pa=20.
189      preff=610.     
190 
191c Proprietes des poussiere aerosol
192c --------------------------------
193      print *,'epaisseur optique dans le visible ?'
194      READ(unit,*) tauvis
195      print *,tauvis
196 
197c  latitude/longitude
198c  ------------------
199      PRINT *,'latitude en degres ?'
200      READ(unit,*) lati(1)
201      PRINT *,lati(1)
202      lati(1)=lati(1)*pi/180.E+0
203      long(1)=0.E+0
204      long(1)=long(1)*pi/180.E+0
205
206c  Initialisation albedo / inertie du sol
207c  --------------------------------------
208c
209      PRINT *,'Albedo du sol nu ?'
210      READ(unit,*) albedodat(1)
211      PRINT *,albedodat(1)
212
213      PRINT *,'Inertie thermique du sol ?'
214      READ(unit,*) inertiedat(1)
215      PRINT *,inertiedat(1)
216c
217c  pour le schema d'ondes de gravite
218c  ---------------------------------
219c
220      zmea(1)=0.E+0
221      zstd(1)=0.E+0
222      zsig(1)=0.E+0
223      zgam(1)=0.E+0
224      zthe(1)=0.E+0
225
226
227
228c   Initialisation speciales "physiq"
229c   ---------------------------------
230c   la surface de chaque maille est inutile en 1D --->
231      area(1)=1.E+0
232
233c   le geopotentiel au sol est inutile en 1D car tout est controle
234c   par la pression de surface --->
235      phisfi(1)=0.E+0
236
237c  "inifis" reproduit un certain nombre d'initialisations deja faites
238c  + lecture des clefs de callphys.def
239c  + calcul de la frequence d'appel au rayonnement
240c  + calcul des sinus et cosinus des longitude latitude
241
242!Mars possible matter with dtphys in input and include!!!
243      CALL inifis(1,llm,day0,daysec,dtphys,
244     .            lati,long,area,rad,g,r,cpp)
245c   Initialisation pour prendre en compte les vents en 1-D
246c   ------------------------------------------------------
247      ptif=2.E+0*omeg*sinlat(1)
248 
249c    vent geostrophique
250      PRINT *,'composante vers l est du vent geostrophique (U) ?'
251      READ(unit,*) gru
252      PRINT *,'composante vers le nord du vent geostrophique (V) ?'
253      READ(unit,*) grv
254
255c     Initialisation des vents  au premier pas de temps
256      DO ilayer=1,nlayer
257         u(ilayer)=gru
258         v(ilayer)=grv
259      ENDDO
260
261c     energie cinetique turbulente
262      DO ilevel=1,nlevel
263         q2(ilevel)=0.E+0
264      ENDDO
265
266c  glace de CO2 au sol
267c  -------------------
268      co2ice=0.E+0
269      PRINT *,'co2ice (kg.m-2)'
270      READ(unit,*) co2ice
271
272c
273c  emissivite
274c  ----------
275      emis=emissiv
276      IF (co2ice.eq.1.E+0) THEN
277         emis=emisice(1)
278         IF(lati(1).LT.0) emis=emisice(2)
279      ENDIF
280
281 
282
283c  calcul des pressions et altitudes en utilisant les niveaux sigma
284c  ----------------------------------------------------------------
285
286c    Vertical Coordinates
287c    """"""""""""""""""""
288      PRINT *,'Hybrid coordinates ?'
289      READ(unit,*) hybrid
290      PRINT *,'Hybrid =', hybrid
291
292      CALL  disvert
293
294      DO ilevel=1,nlevel
295        plev(ilevel)=ap(ilevel)+psurf*bp(ilevel)
296      ENDDO
297
298      DO ilayer=1,nlayer
299        play(ilayer)=aps(ilayer)+psurf*bps(ilayer)
300      ENDDO
301
302      DO ilayer=1,nlayer
303        zlay(ilayer)=-200.E+0 *r*log(play(ilayer)/plev(1))
304     &   /g
305      ENDDO
306
307
308c  profil de temperature au premier appel
309c  --------------------------------------
310      pks=psurf**rcp
311
312c altitude en km dans profile: on divise zlay par 1000
313      tmp1(0)=0.E+0
314      DO ilayer=1,nlayer
315        tmp1(ilayer)=zlay(ilayer)/1000.E+0
316      ENDDO
317      call profile(unit,nlayer+1,tmp1,tmp2)
318
319      tsurf=tmp2(0)
320      DO ilayer=1,nlayer
321        temp(ilayer)=tmp2(ilayer)
322      ENDDO
323     
324
325
326c     temperature du sous-sol
327c     ~~~~~~~~~~~~~~~~~~~~~~~
328      DO isoil=1,nsoil
329         tsoil(isoil)=tsurf
330      ENDDO
331
332c    Initialisation des traceurs
333c    ---------------------------
334
335      DO iq=1,nqmx
336        DO ilayer=1,nlayer
337           q(ilayer,iq) = 0.
338        ENDDO
339      ENDDO
340
341      if (photochem.or.callthermos) then
342         write(*,*) 'Especes chimiques initialisees'
343         ! thermo=0: initialisation pour toutes les couches
344         thermo=0
345         call inichim_newstart(q,psurf,sig,nqmx,lati,long,area,
346     $   thermo)
347      endif
348      watercaptag(ngridmx)=.false.
349     
350      DO iq=1,nqmx-1
351        qsurf(iq) = 0.
352      ENDDO
353
354
355c    Initialisation pour les sorties GRADS dans "g1d.dat" et "g1d.ctl"
356c    ----------------------------------------------------------------
357c    (effectuee avec "writeg1d" a partir de "physiq.F"
358c    ou tout autre subroutine physique, y compris celle ci).
359
360        g1d_nlayer=nlayer
361        g1d_nomfich='g1d.dat'
362        g1d_unitfich=40
363        g1d_nomctl='g1d.ctl'
364        g1d_unitctl=41
365        g1d_premier=.true.
366        g2d_premier=.true.
367
368c  Ecriture de "startfi"
369c  --------------------
370c  (Ce fichier sera aussitot relu au premier
371c   appel de "physiq", mais il est necessaire pour passer
372c   les variables purement physiques a "physiq"...
373
374      call physdem1("startfi.nc",long,lati,nsoilmx,nqmx,
375     .              dtphys,float(day0),
376     .              time,tsurf,tsoil,co2ice,emis,q2,qsurf,
377     .              area,albedodat,inertiedat,zmea,zstd,zsig,zgam,zthe)
378c=======================================================================
379c  BOUCLE TEMPORELLE DU MODELE 1D
380c=======================================================================
381c
382      firstcall=.true.
383      lastcall=.false.
384
385      DO idt=1,ndt
386c        IF (idt.eq.ndt) lastcall=.true.
387        IF (idt.eq.ndt-day_step-1) then       !test
388         lastcall=.true.
389         call solarlong(day*1.0,zls)
390         write(103,*) 'Ls=',zls*180./pi
391         write(103,*) 'Lat=', lati(1)*180./pi
392         write(103,*) 'Tau=', tauvis/700*psurf
393         write(103,*) 'RunEnd - Atmos. Temp. File'
394         write(103,*) 'RunEnd - Atmos. Temp. File'
395         write(104,*) 'Ls=',zls*180./pi
396         write(104,*) 'Lat=', lati(1)
397         write(104,*) 'Tau=', tauvis/700*psurf
398         write(104,*) 'RunEnd - Atmos. Temp. File'
399        ENDIF
400
401c    calcul du geopotentiel
402c     ~~~~~~~~~~~~~~~~~~~~~
403      DO ilayer=1,nlayer
404        s(ilayer)=(aps(ilayer)/psurf+bps(ilayer))**rcp
405        h(ilayer)=cpp*temp(ilayer)/(pks*s(ilayer))
406      ENDDO
407      phi(1)=pks*h(1)*(1.E+0-s(1))
408      DO ilayer=2,nlayer
409         phi(ilayer)=phi(ilayer-1)+
410     &               pks*(h(ilayer-1)+h(ilayer))*.5E+0
411     &                  *(s(ilayer-1)-s(ilayer))
412
413      ENDDO
414
415c       appel de la physique
416c       --------------------
417
418      CALL physiq (1,llm,nqmx,
419     ,     firstcall,lastcall,
420     ,     day,time,dtphys,
421     ,     plev,play,phi,
422     ,     u, v,temp, q, 
423     ,     w,
424C - sorties
425     s     du, dv, dtemp, dq,dpsurf,tracerdyn)
426
427c       evolution du vent : modele 1D
428c       -----------------------------
429 
430c       la physique calcule les derivees temporelles de u et v.
431c       on y rajoute betement un effet Coriolis.
432c
433c       DO ilayer=1,nlayer
434c          du(ilayer)=du(ilayer)+ptif*(v(ilayer)-grv)
435c          dv(ilayer)=dv(ilayer)+ptif*(-u(ilayer)+gru)
436c       ENDDO
437
438c       Pour certain test : pas de coriolis a l'equateur
439c       if(lati(1).eq.0.) then
440          DO ilayer=1,nlayer
441             du(ilayer)=du(ilayer)+ (gru-u(ilayer))/1.e4
442             dv(ilayer)=dv(ilayer)+ (grv-v(ilayer))/1.e4
443          ENDDO
444c       end if
445c     
446c
447c       Calcul du temps au pas de temps suivant
448c       ---------------------------------------
449        firstcall=.false.
450        time=time+dtphys/daysec
451        IF (time.gt.1.E+0) then
452            time=time-1.E+0
453            day=day+1
454        ENDIF
455
456c       calcul des vitesses et temperature au pas de temps suivant
457c       ----------------------------------------------------------
458
459        DO ilayer=1,nlayer
460           u(ilayer)=u(ilayer)+dtphys*du(ilayer)
461           v(ilayer)=v(ilayer)+dtphys*dv(ilayer)
462           temp(ilayer)=temp(ilayer)+dtphys*dtemp(ilayer)
463        ENDDO
464
465c       calcul des pressions au pas de temps suivant
466c       ----------------------------------------------------------
467
468           psurf=psurf+dtphys*dpsurf   ! evolution de la pression de surface
469           DO ilevel=1,nlevel
470             plev(ilevel)=ap(ilevel)+psurf*bp(ilevel)
471           ENDDO
472           DO ilayer=1,nlayer
473             play(ilayer)=aps(ilayer)+psurf*bps(ilayer)
474           ENDDO
475
476      ENDDO   ! fin de la boucle temporelle
477
478c    ========================================================
479c    GESTION DES SORTIE
480c    ========================================================
481
482c    fermeture pour conclure les sorties format grads dans "g1d.dat"
483c    et "g1d.ctl" (effectuee avec "writeg1d" a partir de "physiq.F"
484c    ou tout autre subroutine physique, y compris celle ci).
485
486c        CALL endg1d(1,nlayer,zphi/(g*1000.),ndt)
487        CALL endg1d(1,nlayer,zlay/1000.,ndt)
488
489c    ========================================================
490      END
491 
492c***********************************************************************
493c***********************************************************************
494c     Subroutines Bidons utilise seulement en 3D, mais
495c     necessaire a la compilation de testphys1d en 1-D
496
497      subroutine gr_fi_dyn
498      RETURN
499      END
500 
501      subroutine iniwrite
502      RETURN
503      END
504 
505c***********************************************************************
506c***********************************************************************
507
508#include "../dyn3d/disvert.F"
Note: See TracBrowser for help on using the repository browser.