PROGRAM testphys1d ! to use 'getin' USE ioipsl_getincom IMPLICIT NONE c======================================================================= c subject: c -------- c PROGRAM useful to run physical part of the martian GCM in a 1D column c c Can be compiled with a command like (e.g. for 25 layers) c "makegcm -p mars -d 25 testphys1d" c It requires the files "testphys1d.def" "callphys.def" c and a 'run.def' file (containing a "INCLUDEDEF=callphys.def" line) c and a file describing the sigma layers (e.g. "z2sig.def") c c author: Frederic Hourdin, R.Fournier,F.Forget c ------- c c update: 12/06/2003 including chemistry (S. Lebonnois) c and water ice (F. Montmessin) c c======================================================================= #include "dimensions.h" #include "dimphys.h" #include "dimradmars.h" #include "comgeomfi.h" #include "surfdat.h" #include "comsoil.h" #include "comdiurn.h" #include "callkeys.h" #include "comcstfi.h" #include "planete.h" #include "comsaison.h" #include "yomaer.h" #include "control.h" #include "comvert.h" #include "netcdf.inc" #include "comg1d.h" #include "logic.h" #include "advtrac.h" c -------------------------------------------------------------- c Declarations c -------------------------------------------------------------- c INTEGER unitstart ! unite d'ecriture de "startfi" INTEGER nlayer,nlevel,nsoil,ndt INTEGER ilayer,ilevel,isoil,idt,iq LOGICAl firstcall,lastcall c INTEGER day0 ! date initial (sol ; =0 a Ls=0) REAL day ! date durant le run REAL time ! time (0 area(1)=1.E+0 c le geopotentiel au sol est inutile en 1D car tout est controle c par la pression de surface ---> phisfi(1)=0.E+0 c "inifis" reproduit un certain nombre d'initialisations deja faites c + lecture des clefs de callphys.def c + calcul de la frequence d'appel au rayonnement c + calcul des sinus et cosinus des longitude latitude !Mars possible matter with dtphys in input and include!!! CALL inifis(1,llm,day0,daysec,dtphys, . lati,long,area,rad,g,r,cpp) c Initialisation pour prendre en compte les vents en 1-D c ------------------------------------------------------ ptif=2.E+0*omeg*sinlat(1) c vent geostrophique gru=10. ! default value for gru PRINT *,'zonal eastward component of the geostrophic wind (m/s) ?' call getin("u",gru) write(*,*) " u = ",gru grv=0. !default value for grv PRINT *,'meridional northward component of the geostrophic', &' wind (m/s) ?' call getin("v",grv) write(*,*) " v = ",grv c Initialisation des vents au premier pas de temps DO ilayer=1,nlayer u(ilayer)=gru v(ilayer)=grv ENDDO c energie cinetique turbulente DO ilevel=1,nlevel q2(ilevel)=0.E+0 ENDDO c glace de CO2 au sol c ------------------- co2ice=0.E+0 ! default value for co2ice PRINT *,'Initial CO2 ice on the surface (kg.m-2)' call getin("co2ice",co2ice) write(*,*) " co2ice = ",co2ice c c emissivite c ---------- emis=emissiv IF (co2ice.eq.1.E+0) THEN emis=emisice(1) ! northern hemisphere IF(lati(1).LT.0) emis=emisice(2) ! southern hemisphere ENDIF c calcul des pressions et altitudes en utilisant les niveaux sigma c ---------------------------------------------------------------- c Vertical Coordinates c """""""""""""""""""" hybrid=.true. PRINT *,'Hybrid coordinates ?' call getin("hybrid",hybrid) write(*,*) " hybrid = ", hybrid CALL disvert DO ilevel=1,nlevel plev(ilevel)=ap(ilevel)+psurf*bp(ilevel) ENDDO DO ilayer=1,nlayer play(ilayer)=aps(ilayer)+psurf*bps(ilayer) ENDDO DO ilayer=1,nlayer zlay(ilayer)=-200.E+0 *r*log(play(ilayer)/plev(1)) & /g ENDDO c profil de temperature au premier appel c -------------------------------------- pks=psurf**rcp c altitude en km dans profile: on divise zlay par 1000 tmp1(0)=0.E+0 DO ilayer=1,nlayer tmp1(ilayer)=zlay(ilayer)/1000.E+0 ENDDO call profile(nlayer+1,tmp1,tmp2) tsurf=tmp2(0) DO ilayer=1,nlayer temp(ilayer)=tmp2(ilayer) ENDDO ! Initialize soil properties and temperature ! ------------------------------------------ volcapa=1.e6 ! volumetric heat capacity DO isoil=1,nsoil inertiedat(1,isoil)=inertiedat(1,1) ! soil thermal inertia tsoil(isoil)=tsurf ! soil temperature ENDDO ! Initialize depths ! ----------------- do isoil=0,nsoil-1 mlayer(isoil)=2.e-4*(2.**(isoil-0.5)) ! mid-layer depth enddo do isoil=1,nsoil layer(isoil)=2.e-4*(2.**(isoil-1)) ! layer depth enddo c Initialisation des traceurs c --------------------------- if (photochem.or.callthermos) then write(*,*) 'Especes chimiques initialisees' ! thermo=0: initialisation pour toutes les couches thermo=0 call inichim_newstart(q,psurf,sig,nqmx,lati,long,area, $ thermo,qsurf) endif watercaptag(ngridmx)=.false. c Initialisation pour les sorties GRADS dans "g1d.dat" et "g1d.ctl" c ---------------------------------------------------------------- c (effectuee avec "writeg1d" a partir de "physiq.F" c ou tout autre subroutine physique, y compris celle ci). g1d_nlayer=nlayer g1d_nomfich='g1d.dat' g1d_unitfich=40 g1d_nomctl='g1d.ctl' g1d_unitctl=41 g1d_premier=.true. g2d_premier=.true. c Ecriture de "startfi" c -------------------- c (Ce fichier sera aussitot relu au premier c appel de "physiq", mais il est necessaire pour passer c les variables purement physiques a "physiq"... call physdem1("startfi.nc",long,lati,nsoilmx,nqmx, . dtphys,float(day0),time,tsurf, . tsoil,co2ice,emis,q2,qsurf,area,albedodat, . inertiedat,zmea,zstd,zsig,zgam,zthe) c======================================================================= c BOUCLE TEMPORELLE DU MODELE 1D c======================================================================= c firstcall=.true. lastcall=.false. DO idt=1,ndt c IF (idt.eq.ndt) lastcall=.true. IF (idt.eq.ndt-day_step-1) then !test lastcall=.true. call solarlong(day*1.0,zls) write(103,*) 'Ls=',zls*180./pi write(103,*) 'Lat=', lati(1)*180./pi write(103,*) 'Tau=', tauvis/700*psurf write(103,*) 'RunEnd - Atmos. Temp. File' write(103,*) 'RunEnd - Atmos. Temp. File' write(104,*) 'Ls=',zls*180./pi write(104,*) 'Lat=', lati(1) write(104,*) 'Tau=', tauvis/700*psurf write(104,*) 'RunEnd - Atmos. Temp. File' ENDIF c calcul du geopotentiel c ~~~~~~~~~~~~~~~~~~~~~ DO ilayer=1,nlayer s(ilayer)=(aps(ilayer)/psurf+bps(ilayer))**rcp h(ilayer)=cpp*temp(ilayer)/(pks*s(ilayer)) ENDDO phi(1)=pks*h(1)*(1.E+0-s(1)) DO ilayer=2,nlayer phi(ilayer)=phi(ilayer-1)+ & pks*(h(ilayer-1)+h(ilayer))*.5E+0 & *(s(ilayer-1)-s(ilayer)) ENDDO c appel de la physique c -------------------- ! write(*,*) "testphys1d avant q", q(1,:) CALL physiq (1,llm,nqmx, , firstcall,lastcall, , day,time,dtphys, , plev,play,phi, , u, v,temp, q, , w, C - sorties s du, dv, dtemp, dq,dpsurf,tracerdyn) ! write(*,*) "testphys1d apres q", q(1,:) c evolution du vent : modele 1D c ----------------------------- c la physique calcule les derivees temporelles de u et v. c on y rajoute betement un effet Coriolis. c c DO ilayer=1,nlayer c du(ilayer)=du(ilayer)+ptif*(v(ilayer)-grv) c dv(ilayer)=dv(ilayer)+ptif*(-u(ilayer)+gru) c ENDDO c Pour certain test : pas de coriolis a l'equateur c if(lati(1).eq.0.) then DO ilayer=1,nlayer du(ilayer)=du(ilayer)+ (gru-u(ilayer))/1.e4 dv(ilayer)=dv(ilayer)+ (grv-v(ilayer))/1.e4 ENDDO c end if c c c Calcul du temps au pas de temps suivant c --------------------------------------- firstcall=.false. time=time+dtphys/daysec IF (time.gt.1.E+0) then time=time-1.E+0 day=day+1 ENDIF c calcul des vitesses et temperature au pas de temps suivant c ---------------------------------------------------------- DO ilayer=1,nlayer u(ilayer)=u(ilayer)+dtphys*du(ilayer) v(ilayer)=v(ilayer)+dtphys*dv(ilayer) temp(ilayer)=temp(ilayer)+dtphys*dtemp(ilayer) ENDDO c calcul des pressions au pas de temps suivant c ---------------------------------------------------------- psurf=psurf+dtphys*dpsurf ! evolution de la pression de surface DO ilevel=1,nlevel plev(ilevel)=ap(ilevel)+psurf*bp(ilevel) ENDDO DO ilayer=1,nlayer play(ilayer)=aps(ilayer)+psurf*bps(ilayer) ENDDO ! increment tracer values DO iq = 1, nqmx DO ilayer=1,nlayer q(ilayer,iq)=q(ilayer,iq)+dtphys*dq(ilayer,iq) ENDDO ENDDO ENDDO ! fin de la boucle temporelle c ======================================================== c GESTION DES SORTIE c ======================================================== c fermeture pour conclure les sorties format grads dans "g1d.dat" c et "g1d.ctl" (effectuee avec "writeg1d" a partir de "physiq.F" c ou tout autre subroutine physique, y compris celle ci). c CALL endg1d(1,nlayer,zphi/(g*1000.),ndt) CALL endg1d(1,nlayer,zlay/1000.,ndt) c ======================================================== END c*********************************************************************** c*********************************************************************** c Subroutines Bidons utilise seulement en 3D, mais c necessaire a la compilation de testphys1d en 1-D subroutine gr_fi_dyn RETURN END c*********************************************************************** c*********************************************************************** #include "../dyn3d/disvert.F"