PROGRAM testphys1d IMPLICIT NONE c======================================================================= c subject: c -------- c PROGRAM useful to run physical part of the venusian GCM in a 1D column c c Can be compiled with a command like (e.g. for 50 layers) c "makegcm -p venus -d 50 testphys1d" c A REVOIR POUR VENUS.... c It requires the files "testphys1d.def" "callphys.def" c and a file describing the sigma layers (e.g. "z2sig.def") c c author: Frederic Hourdin, R.Fournier,F.Forget (original Mars version) c ------- Sebastien Lebonnois (Venus version) c c======================================================================= c VENUS: revoir tous les include...... par rapport a calfis.F c voir aussi les arguments de calfis: clesphy0 c voir aussi dans les include de physiq.F les variables qui c doivent etre initialisees... #include "dimensions.h" #include "dimsoil.h" #include "comcstfi.h" #include "control.h" #include "comvert.h" #include "netcdf.inc" #include "comg1d.h" #include "logic.h" #include "clesphys.h" #include "iniprint.h" c -------------------------------------------------------------- c Declarations c -------------------------------------------------------------- c INTEGER unit ! unite de lecture de "testphys1d.def" INTEGER unitstart ! unite d'ecriture de "startphy.nc" 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 de meme ? cufi(1)=1.E+0 cvfi(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 CALL iniphysiq(1,llm,daysec,day0,dtphys, . lati,long,area,cufi,cvfi,rad,g,r,cpp) c Initialisation pour prendre en compte les vents en 1-D c ------------------------------------------------------ c vent geostrophique PRINT *,'composante vers l est du vent geostrophique (U) ?' READ(unit,*) gru PRINT *,'composante vers le nord du vent geostrophique (V) ?' READ(unit,*) grv c Initialisation des vents au premier pas de temps DO ilayer=1,nlayer u(ilayer)=gru v(ilayer)=grv ENDDO c calcul des pressions et altitudes en utilisant les niveaux sigma c ---------------------------------------------------------------- c Vertical Coordinates (hybrids) c """""""""""""""""""" CALL disvert c Calcul au milieu des couches : Vient de la version Mars c WARNING : le choix de placer le milieu des couches au niveau de c pression intermédiaire est arbitraire et pourrait etre modifié. c C'est fait de la meme facon dans disvert DO l = 1, llm aps(l) = 0.5 *( ap(l) +ap(l+1)) bps(l) = 0.5 *( bp(l) +bp(l+1)) ENDDO DO ilevel=1,nlevel plev(ilevel)=ap(ilevel)+psurf*bp(ilevel) ENDDO DO ilayer=1,nlayer play(ilayer)=aps(ilayer)+psurf*bps(ilayer) pk(ilayer) =cpp*(play(ilayer)/preff)**rcp c write(120,*) ilayer,plev(ilayer),play(ilayer) ENDDO c write(120,*) nlevel,plev(nlevel) c stop pks=cpp*(psurf/preff)**rcp c profil de temperature et altitude au premier appel c -------------------------------------------------- c modif par rapport a Mars: c on envoie dz/T=-log(play/psurf)*r/g dans profile tmp1(0)=0.0 tmp1(1)= -log(play(1)/psurf)*r/g DO ilayer=2,nlayer tmp1(ilayer)=-log(play(ilayer)/play(ilayer-1))*r/g ENDDO call profile(unit,nlayer+1,tmp1,tmp2) c file testphys1d.def closed in profile! print*," Pression Altitude Temperature" ilayer=1 tsurf(1)=tmp2(0) temp(1)=tmp2(1) zlay(1)=tmp2(1)*tmp1(1) print*," 0",tsurf(1) print*,ilayer,play(ilayer),zlay(ilayer),temp(ilayer) DO ilayer=2,nlayer temp(ilayer)=tmp2(ilayer) zlay(ilayer)=zlay(ilayer-1)+tmp2(ilayer)*tmp1(ilayer) print*,ilayer,play(ilayer),zlay(ilayer),temp(ilayer) ENDDO c temperature du sous-sol c ~~~~~~~~~~~~~~~~~~~~~~~ DO isoil=1,nsoil tsoil(isoil)=tsurf(1) ENDDO c Initialisation des traceurs c --------------------------- DO iq=1,nqtot DO ilayer=1,nlayer q(ilayer,iq) = 0. ENDDO ENDDO 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 "startphy.nc" 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"... clesphy0(1) = 0. clesphy0(2) = nbapp_rad clesphy0(3) = 0. ! cycle diurne clesphy0(4) = 1. ! soil_model clesphy0(5) = 1. ! new_oliq clesphy0(6) = 0. clesphy0(7) = 0. clesphy0(8) = 0. solsw(1) = 0. sollwdown(1)= 0. dlw(1) = 0. radsol(1) = 0. radpas = NINT(day_step/clesphy0(2)) soil_model = .true. new_oliq = .true. call phyredem("startphy.nc ",dtphys,radpas, . lati,long, . tsurf,tsoil,albedo, . solsw,sollwdown,dlw,radsol, . temp,q) 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. c toujours nulle dans le cas de Venus, pour l'instant... zls = 0.0 c write(103,*) 'Ls=',zls*180./pi c write(103,*) 'Lat=', lati(1) c write(103,*) 'RunEnd - Atmos. Temp. File' c write(103,*) 'RunEnd - Atmos. Temp. File' c write(104,*) 'Ls=',zls*180./pi c write(104,*) 'Lat=', lati(1) c write(104,*) 'RunEnd - Atmos. Temp. File' ENDIF c calcul du geopotentiel c ~~~~~~~~~~~~~~~~~~~~~ ! ADAPTATION GCM POUR CP(T) DO ilayer=1,nlayer s(ilayer)=(play(ilayer)/psurf)**rcp ENDDO phi(1)=cpp*temp(1)*(1.E+0-s(1)) DO ilayer=2,nlayer phi(ilayer)=phi(ilayer-1)+ & cpp*(temp(ilayer-1)/s(ilayer-1)+temp(ilayer)/s(ilayer))*0.5 & *(s(ilayer-1)-s(ilayer)) ENDDO c appel de la physique c -------------------- CALL physiq (1,llm,nqtot, , firstcall,lastcall, , day,time,dtphys, , plev,play,pk,phi,phisfi, , presnivs,clesphy0, , u,v,temp,q, , w, C - sorties s du,dv,dtemp,dq,dpsurf) c print*,"DT APRES PHYSIQ=",day,time c print*,dtemp c print*,temp c print*," " c stop c evolution du vent : modele 1D c ----------------------------- c la physique calcule les derivees temporelles de u et v. c Pas de coriolis DO ilayer=1,nlayer du(ilayer)=du(ilayer)+ (gru-u(ilayer))/1.e4 dv(ilayer)=dv(ilayer)+ (grv-v(ilayer))/1.e4 ENDDO c c call writeg1d(1,nlayer,du,"du","du") c call writeg1d(1,nlayer,dv,"dv","dv") 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 call writeg1d(1,nlayer,u,"u","Vent zonal") c call writeg1d(1,nlayer,v,"v","Vent meridien") 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 call writeg1d(1,nlayer,play,"press","Pressure") call writeg1d(1,nlayer,phi,"phi","Geopot") 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). CALL endg1d(1,nlayer,zlay/1000.,ndt) print*,"Temperature finale:" print*,temp c stabilite DO ilayer=1,nlayer zlay(ilayer) = phi(ilayer)/8870. !en km ENDDO DO ilayer=2,nlayer tmp1(ilayer) = . (temp(ilayer)-temp(ilayer-1))/(zlay(ilayer)-zlay(ilayer-1)) . + 8870./cpp ENDDO OPEN(11,file='profile.new') write (11,*) tsurf DO ilayer=1,nlayer write (11,*) zlay(ilayer),temp(ilayer),tmp1(ilayer) ENDDO c ======================================================== END c*********************************************************************** c*********************************************************************** #include "../dyn3d/disvert.F" #include "../dyn3d/abort_gcm.F" #include "../dyn3d/dump2d.F"