SUBROUTINE physiq( $ ngrid,nlayer,nq $ ,firstcall,lastcall $ ,pday,ptime,ptimestep $ ,pplev,pplay,pphi $ ,pu,pv,pt,pq $ ,pw $ ,pdu,pdv,pdt,pdq,pdpsrf,tracerdyn) use tracer_mod, only: noms, mmol, igcm_co2, igcm_n2, & igcm_co, igcm_o, igcm_h2o_vap, igcm_h2o_ice, & igcm_ccn_mass, igcm_ccn_number, & igcm_dust_mass, igcm_dust_number, igcm_h2o2, & nuice_ref, rho_ice, rho_dust, ref_r0 use comsoil_h, only: inertiedat, ! soil thermal inertia & tsoil, nsoilmx ! number of subsurface layers use comgeomfi_h, only: long, lati, area, & sinlon, coslon, sinlat, coslat use surfdat_h, only: phisfi, albedodat, zmea, zstd, zsig, zgam, & zthe, z0, albedo_h2o_ice, & frost_albedo_threshold, & tsurf, co2ice, emis, & capcal, fluxgrd, qsurf use comsaison_h, only: dist_sol, declin, mu0, fract use slope_mod, only: theta_sl, psi_sl use conc_mod, only: rnew, cpnew, mmean use control_mod, only: iphysiq, day_step, ecritstart use dimradmars_mod, only: tauscaling, aerosol, & dtrad, fluxrad_sky, fluxrad, albedo, & naerkind use turb_mod, only: q2, wstar, ustar, sensibFlux, & zmax_th, hfmax_th, turb_resolved use planete_h, only: aphelie, periheli, year_day, peri_day, & obliquit USE comcstfi_h, only: r, cpp, mugaz, g, rcp, pi, rad, daysec use param_v4_h, only: nreact,n_avog, & fill_data_thermos, allocate_param_thermos use iono_h, only: allocate_param_iono #ifdef MESOSCALE use comsoil_h, only: mlayer,layer use surfdat_h, only: z0_default use comm_wrf #else use phyredem, only: physdem0, physdem1 use eofdump_mod, only: eofdump #endif IMPLICIT NONE c======================================================================= c c subject: c -------- c c Organisation of the physical parametrisations of the LMD c martian atmospheric general circulation model. c c The GCM can be run without or with tracer transport c depending on the value of Logical "tracer" in file "callphys.def" c Tracers may be water vapor, ice OR chemical species OR dust particles c c SEE comments in initracer.F about numbering of tracer species... c c It includes: c c 1. Initialization: c 1.1 First call initializations c 1.2 Initialization for every call to physiq c 1.2.5 Compute mean mass and cp, R and thermal conduction coeff. c 2. Compute radiative transfer tendencies c (longwave and shortwave) for CO2 and aerosols. c 3. Gravity wave and subgrid scale topography drag : c 4. Vertical diffusion (turbulent mixing): c 5. Convective adjustment c 6. Condensation and sublimation of carbon dioxide. c 7. TRACERS : c 7a. water and water ice c 7b. call for photochemistry when tracers are chemical species c 7c. other scheme for tracer (dust) transport (lifting, sedimentation) c 7d. updates (CO2 pressure variations, surface budget) c 8. Contribution to tendencies due to thermosphere c 9. Surface and sub-surface temperature calculations c 10. Write outputs : c - "startfi", "histfi" (if it's time) c - Saving statistics (if "callstats = .true.") c - Dumping eof (if "calleofdump = .true.") c - Output any needed variables in "diagfi" c 11. Diagnostic: mass conservation of tracers c c author: c ------- c Frederic Hourdin 15/10/93 c Francois Forget 1994 c Christophe Hourdin 02/1997 c Subroutine completly rewritten by F.Forget (01/2000) c Introduction of the photochemical module: S. Lebonnois (11/2002) c Introduction of the thermosphere module: M. Angelats i Coll (2002) c Water ice clouds: Franck Montmessin (update 06/2003) c Radiatively active tracers: J.-B. Madeleine (10/2008-06/2009) c Nb: See callradite.F for more information. c Mesoscale lines: Aymeric Spiga (2007 - 2011) -- check MESOSCALE flags c jul 2011 malv+fgg: Modified calls to NIR heating routine and 15 um cooling parameterization c c arguments: c ---------- c c input: c ------ c ecri period (in dynamical timestep) to write output c ngrid Size of the horizontal grid. c All internal loops are performed on that grid. c nlayer Number of vertical layers. c nq Number of advected fields c firstcall True at the first call c lastcall True at the last call c pday Number of days counted from the North. Spring c equinoxe. c ptime Universal time (0 example : hfmax_th, zmax_th !state real HR_SW ikj misc 1 - h "HR_SW" "HEATING RATE SW" "K/s" comm_HR_SW(1:ngrid,1:nlayer) = zdtsw(1:ngrid,1:nlayer) !state real HR_LW ikj misc 1 - h "HR_LW" "HEATING RATE LW" "K/s" comm_HR_LW(1:ngrid,1:nlayer) = zdtlw(1:ngrid,1:nlayer) !state real SWDOWNZ ij misc 1 - h "SWDOWNZ" "DOWNWARD SW FLUX AT SURFACE" "W m-2" comm_SWDOWNZ(1:ngrid) = fluxsurf_sw_tot(1:ngrid) !state real TAU_DUST ij misc 1 - h "TAU_DUST" "REFERENCE VISIBLE DUST OPACITY" "" comm_TAU_DUST(1:ngrid) = tauref(1:ngrid) !state real RDUST ikj misc 1 - h "RDUST" "DUST RADIUS" "m" comm_RDUST(1:ngrid,1:nlayer) = rdust(1:ngrid,1:nlayer) !state real QSURFDUST ij misc 1 - h "QSURFDUST" "DUST MASS AT SURFACE" "kg m-2" IF (igcm_dust_mass .ne. 0) THEN comm_QSURFDUST(1:ngrid) = qsurf(1:ngrid,igcm_dust_mass) ELSE comm_QSURFDUST(1:ngrid) = 0. ENDIF !state real MTOT ij misc 1 - h "MTOT" "TOTAL MASS WATER VAPOR in pmic" "pmic" comm_MTOT(1:ngrid) = mtot(1:ngrid) * 1.e6 / rho_ice !state real ICETOT ij misc 1 - h "ICETOT" "TOTAL MASS WATER ICE" "kg m-2" comm_ICETOT(1:ngrid) = icetot(1:ngrid) * 1.e6 / rho_ice !state real VMR_ICE ikj misc 1 - h "VMR_ICE" "VOL. MIXING RATIO ICE" "ppm" IF (igcm_h2o_ice .ne. 0) THEN comm_VMR_ICE(1:ngrid,1:nlayer) = 1.e6 . * zq(1:ngrid,1:nlayer,igcm_h2o_ice) . * mmean(1:ngrid,1:nlayer) / mmol(igcm_h2o_ice) ELSE comm_VMR_ICE(1:ngrid,1:nlayer) = 0. ENDIF !state real TAU_ICE ij misc 1 - h "TAU_ICE" "CLOUD OD at 825 cm-1 TES" "" comm_TAU_ICE(1:ngrid) = taucloudtes(1:ngrid) !state real RICE ikj misc 1 - h "RICE" "ICE RADIUS" "m" comm_RICE(1:ngrid,1:nlayer) = rice(1:ngrid,1:nlayer) !! calculate sensible heat flux in W/m2 for outputs !! -- the one computed in vdifc is not the real one !! -- vdifc must have been called if (.not.callrichsl) then sensibFlux(1:ngrid) = zflubid(1:ngrid) . - capcal(1:ngrid)*zdtsdif(1:ngrid) else sensibFlux(1:ngrid) = & (pplay(1:ngrid,1)/(r*pt(1:ngrid,1)))*cpp & *sqrt(pu(1:ngrid,1)*pu(1:ngrid,1)+pv(1:ngrid,1)*pv(1:ngrid,1) & +(log(1.+0.7*wstar(1:ngrid) + 2.3*wstar(1:ngrid)**2))**2) & *zcdh(1:ngrid)*(tsurf(1:ngrid)-zh(1:ngrid,1)) endif #else #ifndef MESOINI c ========================================================== c WRITEDIAGFI: Outputs in netcdf file "DIAGFI", containing c any variable for diagnostic (output with period c "ecritphy", set in "run.def") c ========================================================== c WRITEDIAGFI can ALSO be called from any other subroutines c for any variables !! c call WRITEDIAGFI(ngrid,"emis","Surface emissivity","w.m-1",2, c & emis) c call WRITEDIAGFI(ngrid,"pplay","Pressure","Pa",3,zplay) c call WRITEDIAGFI(ngrid,"pplev","Pressure","Pa",3,zplev) call WRITEDIAGFI(ngrid,"tsurf","Surface temperature","K",2, & tsurf) call WRITEDIAGFI(ngrid,"ps","surface pressure","Pa",2,ps) call WRITEDIAGFI(ngrid,"co2ice","co2 ice thickness" & ,"kg.m-2",2,co2ice) call WRITEDIAGFI(ngrid,"temp7","temperature in layer 7", & "K",2,zt(1,7)) call WRITEDIAGFI(ngrid,"fluxsurf_lw","fluxsurf_lw","W.m-2",2, & fluxsurf_lw) call WRITEDIAGFI(ngrid,"fluxsurf_sw","fluxsurf_sw","W.m-2",2, & fluxsurf_sw_tot) call WRITEDIAGFI(ngrid,"fluxtop_lw","fluxtop_lw","W.m-2",2, & fluxtop_lw) call WRITEDIAGFI(ngrid,"fluxtop_sw","fluxtop_sw","W.m-2",2, & fluxtop_sw_tot) call WRITEDIAGFI(ngrid,"temp","temperature","K",3,zt) call WRITEDIAGFI(ngrid,"u","Zonal wind","m.s-1",3,zu) call WRITEDIAGFI(ngrid,"v","Meridional wind","m.s-1",3,zv) call WRITEDIAGFI(ngrid,"w","Vertical wind","m.s-1",3,pw) call WRITEDIAGFI(ngrid,"rho","density","none",3,rho) c call WRITEDIAGFI(ngrid,"q2","q2","kg.m-3",3,q2) c call WRITEDIAGFI(ngrid,'Teta','T potentielle','K',3,zh) call WRITEDIAGFI(ngrid,"pressure","Pressure","Pa",3,zplay) c call WRITEDIAGFI(ngrid,"ssurf","Surface stress","N.m-2",2, c & zstress) c call WRITEDIAGFI(ngrid,'sw_htrt','sw heat. rate', c & 'w.m-2',3,zdtsw) c call WRITEDIAGFI(ngrid,'lw_htrt','lw heat. rate', c & 'w.m-2',3,zdtlw) if (.not.activice) then CALL WRITEDIAGFI(ngrid,'tauTESap', & 'tau abs 825 cm-1', & '',2,tauTES) else CALL WRITEDIAGFI(ngrid,'tauTES', & 'tau abs 825 cm-1', & '',2,taucloudtes) endif #else !!! this is to ensure correct initialisation of mesoscale model call WRITEDIAGFI(ngrid,"tsurf","Surface temperature","K",2, & tsurf) call WRITEDIAGFI(ngrid,"ps","surface pressure","Pa",2,ps) call WRITEDIAGFI(ngrid,"co2ice","co2 ice thickness","kg.m-2",2, & co2ice) call WRITEDIAGFI(ngrid,"temp","temperature","K",3,zt) call WRITEDIAGFI(ngrid,"u","Zonal wind","m.s-1",3,zu) call WRITEDIAGFI(ngrid,"v","Meridional wind","m.s-1",3,zv) call WRITEDIAGFI(ngrid,"emis","Surface emissivity","w.m-1",2, & emis) call WRITEDIAGFI(ngrid,"tsoil","Soil temperature", & "K",3,tsoil) call WRITEDIAGFI(ngrid,"inertiedat","Soil inertia", & "K",3,inertiedat) #endif c ---------------------------------------------------------- c Outputs of the CO2 cycle c ---------------------------------------------------------- if (tracer.and.(igcm_co2.ne.0)) then ! call WRITEDIAGFI(ngrid,"co2_l1","co2 mix. ratio in 1st layer", ! & "kg/kg",2,zq(1,1,igcm_co2)) call WRITEDIAGFI(ngrid,"co2","co2 mass mixing ratio", & "kg/kg",3,zq(1,1,igcm_co2)) ! Compute co2 column co2col(:)=0 do l=1,nlayer do ig=1,ngrid co2col(ig)=co2col(ig)+ & zq(ig,l,igcm_co2)*(zplev(ig,l)-zplev(ig,l+1))/g enddo enddo call WRITEDIAGFI(ngrid,"co2col","CO2 column","kg.m-2",2, & co2col) endif ! of if (tracer.and.(igcm_co2.ne.0)) c ---------------------------------------------------------- c Outputs of the water cycle c ---------------------------------------------------------- if (tracer) then if (water) then #ifdef MESOINI !!!! waterice = q01, voir readmeteo.F90 call WRITEDIAGFI(ngrid,'q01',noms(igcm_h2o_ice), & 'kg/kg',3, & zq(1:ngrid,1:nlayer,igcm_h2o_ice)) !!!! watervapor = q02, voir readmeteo.F90 call WRITEDIAGFI(ngrid,'q02',noms(igcm_h2o_vap), & 'kg/kg',3, & zq(1:ngrid,1:nlayer,igcm_h2o_vap)) !!!! surface waterice qsurf02 (voir readmeteo) call WRITEDIAGFI(ngrid,'qsurf02','surface tracer', & 'kg.m-2',2, & qsurf(1:ngrid,igcm_h2o_ice)) #endif CALL WRITEDIAGFI(ngrid,'mtot', & 'total mass of water vapor', & 'kg/m2',2,mtot) CALL WRITEDIAGFI(ngrid,'icetot', & 'total mass of water ice', & 'kg/m2',2,icetot) vmr=zq(1:ngrid,1:nlayer,igcm_h2o_ice) & *mmean(1:ngrid,1:nlayer)/mmol(igcm_h2o_ice) call WRITEDIAGFI(ngrid,'vmr_h2oice','h2o ice vmr', & 'mol/mol',3,vmr) vmr=zq(1:ngrid,1:nlayer,igcm_h2o_vap) & *mmean(1:ngrid,1:nlayer)/mmol(igcm_h2o_vap) call WRITEDIAGFI(ngrid,'vmr_h2ovap','h2o vap vmr', & 'mol/mol',3,vmr) CALL WRITEDIAGFI(ngrid,'reffice', & 'Mean reff', & 'm',2,rave) if (scavenging) then CALL WRITEDIAGFI(ngrid,"Nccntot", & "condensation nuclei","Nbr/m2", & 2,Nccntot) CALL WRITEDIAGFI(ngrid,"Mccntot", & "mass condensation nuclei","kg/m2", & 2,Mccntot) endif call WRITEDIAGFI(ngrid,'rice','Ice particle size', & 'm',3,rice) call WRITEDIAGFI(ngrid,'h2o_ice_s', & 'surface h2o_ice', & 'kg.m-2',2,qsurf(1,igcm_h2o_ice)) CALL WRITEDIAGFI(ngrid,'albedo', & 'albedo', & '',2,albedo(1,1)) if (tifeedback) then call WRITEDIAGSOIL(ngrid,"soiltemp", & "Soil temperature","K", & 3,tsoil) call WRITEDIAGSOIL(ngrid,'soilti', & 'Soil Thermal Inertia', & 'J.s-1/2.m-2.K-1',3,inertiesoil) endif endif !(water) if (water.and..not.photochem) then iq=nq c write(str2(1:2),'(i2.2)') iq c call WRITEDIAGFI(ngrid,'dqs'//str2,'dqscloud', c & 'kg.m-2',2,zdqscloud(1,iq)) c call WRITEDIAGFI(ngrid,'dqch'//str2,'var chim', c & 'kg/kg',3,zdqchim(1,1,iq)) c call WRITEDIAGFI(ngrid,'dqd'//str2,'var dif', c & 'kg/kg',3,zdqdif(1,1,iq)) c call WRITEDIAGFI(ngrid,'dqa'//str2,'var adj', c & 'kg/kg',3,zdqadj(1,1,iq)) c call WRITEDIAGFI(ngrid,'dqc'//str2,'var c', c & 'kg/kg',3,zdqc(1,1,iq)) endif !(water.and..not.photochem) endif c ---------------------------------------------------------- c Outputs of the dust cycle c ---------------------------------------------------------- call WRITEDIAGFI(ngrid,'tauref', & 'Dust ref opt depth','NU',2,tauref) if (tracer.and.(dustbin.ne.0)) then call WRITEDIAGFI(ngrid,'tau','taudust','SI',2,tau(1,1)) #ifndef MESOINI if (doubleq) then c call WRITEDIAGFI(ngrid,'qsurf','qsurf', c & 'kg.m-2',2,qsurf(1,igcm_dust_mass)) c call WRITEDIAGFI(ngrid,'Nsurf','N particles', c & 'N.m-2',2,qsurf(1,igcm_dust_number)) c call WRITEDIAGFI(ngrid,'dqsdev','ddevil lift', c & 'kg.m-2.s-1',2,zdqsdev(1,1)) c call WRITEDIAGFI(ngrid,'dqssed','sedimentation', c & 'kg.m-2.s-1',2,zdqssed(1,1)) c call WRITEDIAGFI(ngrid,'dqsdif','diffusion', c & 'kg.m-2.s-1',2,zdqsdif(1,1)) c call WRITEDIAGFI(ngrid,'sedice','sedimented ice', c & 'kg.m-2.s-1',2,zdqssed(:,igcm_h2o_ice)) c call WRITEDIAGFI(ngrid,'subice','sublimated ice', c & 'kg.m-2.s-1',2,zdqsdif(:,igcm_h2o_ice)) call WRITEDIAGFI(ngrid,'dqsdust', & 'deposited surface dust mass', & 'kg.m-2.s-1',2,dqdustsurf) call WRITEDIAGFI(ngrid,'dqndust', & 'deposited surface dust number', & 'number.m-2.s-1',2,dndustsurf) call WRITEDIAGFI(ngrid,'reffdust','reffdust', & 'm',3,rdust*ref_r0) call WRITEDIAGFI(ngrid,'dustq','Dust mass mr', & 'kg/kg',3,qdust) call WRITEDIAGFI(ngrid,'dustN','Dust number', & 'part/kg',3,ndust) c call WRITEDIAGFI(ngrid,"tauscaling", c & "dust conversion factor"," ",2,tauscaling) else do iq=1,dustbin write(str2(1:2),'(i2.2)') iq call WRITEDIAGFI(ngrid,'q'//str2,'mix. ratio', & 'kg/kg',3,zq(1,1,iq)) call WRITEDIAGFI(ngrid,'qsurf'//str2,'qsurf', & 'kg.m-2',2,qsurf(1,iq)) end do endif ! (doubleq) if (scavenging) then call WRITEDIAGFI(ngrid,'ccnq','CCN mass mr', & 'kg/kg',3,qccn) call WRITEDIAGFI(ngrid,'ccnN','CCN number', & 'part/kg',3,nccn) endif ! (scavenging) c if (submicron) then c call WRITEDIAGFI(ngrid,'dustsubm','subm mass mr', c & 'kg/kg',3,pq(1,1,igcm_dust_submicron)) c endif ! (submicron) #else ! !!! to initialize mesoscale we need scaled variables ! !!! because this must correspond to starting point for tracers ! call WRITEDIAGFI(ngrid,'dustq','Dust mass mr', ! & 'kg/kg',3,pq(1:ngrid,1:nlayer,igcm_dust_mass)) ! call WRITEDIAGFI(ngrid,'dustN','Dust number', ! & 'part/kg',3,pq(1:ngrid,1:nlayer,igcm_dust_number)) ! call WRITEDIAGFI(ngrid,'ccn','Nuclei mass mr', ! & 'kg/kg',3,pq(1:ngrid,1:nlayer,igcm_ccn_mass)) ! call WRITEDIAGFI(ngrid,'ccnN','Nuclei number', ! & 'part/kg',3,pq(1:ngrid,1:nlayer,igcm_ccn_number)) if (freedust) then call WRITEDIAGFI(ngrid,'dustq','Dust mass mr', & 'kg/kg',3,qdust) call WRITEDIAGFI(ngrid,'dustN','Dust number', & 'part/kg',3,ndust) call WRITEDIAGFI(ngrid,'ccn','CCN mass mr', & 'kg/kg',3,qccn) call WRITEDIAGFI(ngrid,'ccnN','CCN number', & 'part/kg',3,nccn) else call WRITEDIAGFI(ngrid,'dustq','Dust mass mr', & 'kg/kg',3,pq(1,1,igcm_dust_mass)) call WRITEDIAGFI(ngrid,'dustN','Dust number', & 'part/kg',3,pq(1,1,igcm_dust_number)) call WRITEDIAGFI(ngrid,'ccn','Nuclei mass mr', & 'kg/kg',3,pq(1,1,igcm_ccn_mass)) call WRITEDIAGFI(ngrid,'ccnN','Nuclei number', & 'part/kg',3,pq(1,1,igcm_ccn_number)) endif #endif end if ! (tracer.and.(dustbin.ne.0)) c ---------------------------------------------------------- c Thermospheric outputs c ---------------------------------------------------------- if(callthermos) then call WRITEDIAGFI(ngrid,"q15um","15 um cooling","K/s", $ 3,zdtnlte) call WRITEDIAGFI(ngrid,"quv","UV heating","K/s", $ 3,zdteuv) call WRITEDIAGFI(ngrid,"cond","Thermal conduction","K/s", $ 3,zdtconduc) call WRITEDIAGFI(ngrid,"qnir","NIR heating","K/s", $ 3,zdtnirco2) if (thermochem.or.photochem) then do iq=1,nq if (noms(iq) .ne. "dust_mass" .and. $ noms(iq) .ne. "dust_number" .and. $ noms(iq) .ne. "ccn_mass" .and. $ noms(iq) .ne. "ccn_number" .and. $ noms(iq) .ne. "h2o_vap" .and. $ noms(iq) .ne. "h2o_ice") then vmr(1:ngrid,1:nlayer)=zq(1:ngrid,1:nlayer,iq) & *mmean(1:ngrid,1:nlayer)/mmol(iq) rhopart(1:ngrid,1:nlayer)=zq(1:ngrid,1:nlayer,iq) & *rho(1:ngrid,1:nlayer)*n_avog/ & (1000*mmol(iq)) call writediagfi(ngrid,"rho_"//trim(noms(iq)), $ "Number density","cm-3",3,rhopart) if ((noms(iq).eq."o") .or. (noms(iq).eq."co2").or. $ (noms(iq).eq."o3")) then call writediagfi(ngrid,"vmr_"//trim(noms(iq)), $ "Volume mixing ratio","mol/mol",3,vmr) end if do ig = 1,ngrid colden(ig,iq) = 0. end do do l=1,nlayer do ig=1,ngrid colden(ig,iq) = colden(ig,iq) + zq(ig,l,iq) $ *(zplev(ig,l)-zplev(ig,l+1)) $ *6.022e22/(mmol(iq)*g) end do end do call writediagfi(ngrid,"c_"//trim(noms(iq)), $ "column","mol cm-2",2,colden(1,iq)) end if ! of if (noms(iq) .ne. "dust_mass" ...) end do ! of do iq=1,nq end if ! of if (thermochem.or.photochem) endif !(callthermos) c ---------------------------------------------------------- c ---------------------------------------------------------- c PBL OUTPUS c ---------------------------------------------------------- c ---------------------------------------------------------- c ---------------------------------------------------------- c Outputs of thermals c ---------------------------------------------------------- if (calltherm) then ! call WRITEDIAGFI(ngrid,'dtke', ! & 'tendance tke thermiques','m**2/s**2', ! & 3,dtke_th) ! call WRITEDIAGFI(ngrid,'d_u_ajs', ! & 'tendance u thermiques','m/s', ! & 3,pdu_th*ptimestep) ! call WRITEDIAGFI(ngrid,'d_v_ajs', ! & 'tendance v thermiques','m/s', ! & 3,pdv_th*ptimestep) ! if (tracer) then ! if (nq .eq. 2) then ! call WRITEDIAGFI(ngrid,'deltaq_th', ! & 'delta q thermiques','kg/kg', ! & 3,ptimestep*pdq_th(:,:,2)) ! endif ! endif call WRITEDIAGFI(ngrid,'zmax_th', & 'hauteur du thermique','m', & 2,zmax_th) call WRITEDIAGFI(ngrid,'hfmax_th', & 'maximum TH heat flux','K.m/s', & 2,hfmax_th) call WRITEDIAGFI(ngrid,'wstar', & 'maximum TH vertical velocity','m/s', & 2,wstar) endif c ---------------------------------------------------------- c ---------------------------------------------------------- c END OF PBL OUTPUS c ---------------------------------------------------------- c ---------------------------------------------------------- c ---------------------------------------------------------- c Output in netcdf file "diagsoil.nc" for subterranean c variables (output every "ecritphy", as for writediagfi) c ---------------------------------------------------------- ! Write soil temperature ! call writediagsoil(ngrid,"soiltemp","Soil temperature","K", ! & 3,tsoil) ! Write surface temperature ! call writediagsoil(ngrid,"tsurf","Surface temperature","K", ! & 2,tsurf) c ========================================================== c END OF WRITEDIAGFI c ========================================================== #endif ! of ifdef MESOSCALE ELSE ! if(ngrid.eq.1) #ifndef MESOSCALE write(*,'("Ls =",f11.6," tauref(",f4.0," Pa) =",f9.6)') & zls*180./pi,odpref,tauref c ---------------------------------------------------------------------- c Output in grads file "g1d" (ONLY when using testphys1d) c (output at every X physical timestep) c ---------------------------------------------------------------------- c c CALL writeg1d(ngrid,1,fluxsurf_lw,'Fs_ir','W.m-2') c CALL writeg1d(ngrid,1,tsurf,'tsurf','K') c CALL writeg1d(ngrid,1,ps,'ps','Pa') c CALL writeg1d(ngrid,nlayer,zt,'T','K') c CALL writeg1d(ngrid,nlayer,pu,'u','m.s-1') c CALL writeg1d(ngrid,nlayer,pv,'v','m.s-1') c CALL writeg1d(ngrid,nlayer,pw,'w','m.s-1') ! THERMALS STUFF 1D if(calltherm) then call WRITEDIAGFI(ngrid,'lmax_th', & 'hauteur du thermique','point', & 0,lmax_th_out) call WRITEDIAGFI(ngrid,'zmax_th', & 'hauteur du thermique','m', & 0,zmax_th) call WRITEDIAGFI(ngrid,'hfmax_th', & 'maximum TH heat flux','K.m/s', & 0,hfmax_th) call WRITEDIAGFI(ngrid,'wstar', & 'maximum TH vertical velocity','m/s', & 0,wstar) co2col(:)=0. if (tracer) then do l=1,nlayer do ig=1,ngrid co2col(ig)=co2col(ig)+ & zq(ig,l,1)*(zplev(ig,l)-zplev(ig,l+1))/g enddo enddo end if call WRITEDIAGFI(ngrid,'co2col','integrated co2 mass' & & ,'kg/m-2',0,co2col) endif ! of if (calltherm) call WRITEDIAGFI(ngrid,'w','vertical velocity' & & ,'m/s',1,pw) call WRITEDIAGFI(ngrid,"q2","q2","kg.m-3",1,q2) call WRITEDIAGFI(ngrid,"tsurf","Surface temperature","K",0, & tsurf) call WRITEDIAGFI(ngrid,"u","u wind","m/s",1,zu) call WRITEDIAGFI(ngrid,"v","v wind","m/s",1,zv) call WRITEDIAGFI(ngrid,"pplay","Pressure","Pa",1,zplay) call WRITEDIAGFI(ngrid,"pplev","Pressure","Pa",1,zplev) call WRITEDIAGFI(ngrid,"rho","rho","kg.m-3",1,rho) ! call WRITEDIAGFI(ngrid,"dtrad","rad. heat. rate", & ! & "K.s-1",1,dtrad/zpopsk) ! call WRITEDIAGFI(ngrid,'sw_htrt','sw heat. rate', ! & 'w.m-2',1,zdtsw/zpopsk) ! call WRITEDIAGFI(ngrid,'lw_htrt','lw heat. rate', ! & 'w.m-2',1,zdtlw/zpopsk) call WRITEDIAGFI(ngrid,"co2ice","co2 ice thickness" & ,"kg.m-2",0,co2ice) ! or output in diagfi.nc (for testphys1d) call WRITEDIAGFI(ngrid,'ps','Surface pressure','Pa',0,ps) call WRITEDIAGFI(ngrid,'temp','Temperature', & 'K',1,zt) if(tracer) then c CALL writeg1d(ngrid,1,tau,'tau','SI') do iq=1,nq c CALL writeg1d(ngrid,nlayer,zq(1,1,iq),noms(iq),'kg/kg') call WRITEDIAGFI(ngrid,trim(noms(iq)), & trim(noms(iq)),'kg/kg',1,zq(1,1,iq)) end do if (doubleq) then call WRITEDIAGFI(ngrid,'rdust','rdust', & 'm',1,rdust) endif if (water.AND.tifeedback) then call WRITEDIAGFI(ngrid,"soiltemp", & "Soil temperature","K", & 1,tsoil) call WRITEDIAGFI(ngrid,'soilti', & 'Soil Thermal Inertia', & 'J.s-1/2.m-2.K-1',1,inertiesoil) endif end if cccccccccccccccccc scavenging & water outputs 1D TN ccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc IF (water) THEN if (.not.activice) then tauTES=0 do l=1,nlayer Qabsice = min( & max(0.4e6*rice(1,l)*(1.+nuice_ref)-0.05 ,0.),1.2 & ) opTES(1,l)= 0.75 * Qabsice * & zq(1,l,igcm_h2o_ice) * & (zplev(1,l) - zplev(1,l+1)) / g & / (rho_ice * rice(1,l) * (1.+nuice_ref)) tauTES=tauTES+ opTES(1,l) enddo CALL WRITEDIAGFI(ngrid,'tauTESap', & 'tau abs 825 cm-1', & '',0,tauTES) else CALL WRITEDIAGFI(ngrid,'tauTES', & 'tau abs 825 cm-1', & '',0,taucloudtes) endif mtot = 0 icetot = 0 h2otot = qsurf(1,igcm_h2o_ice) do l=1,nlayer mtot = mtot + zq(1,l,igcm_h2o_vap) & * (zplev(1,l) - zplev(1,l+1)) / g icetot = icetot + zq(1,l,igcm_h2o_ice) & * (zplev(1,l) - zplev(1,l+1)) / g end do h2otot = h2otot+mtot+icetot CALL WRITEDIAGFI(ngrid,'h2otot', & 'h2otot', & 'kg/m2',0,h2otot) CALL WRITEDIAGFI(ngrid,'mtot', & 'mtot', & 'kg/m2',0,mtot) CALL WRITEDIAGFI(ngrid,'icetot', & 'icetot', & 'kg/m2',0,icetot) if (scavenging) then rave = 0 do l=1,nlayer cccc Column integrated effective ice radius cccc is weighted by total ice surface area (BETTER) rave = rave + tauscaling(1) * & zq(1,l,igcm_ccn_number) * & (zplev(1,l) - zplev(1,l+1)) / g * & rice(1,l) * rice(1,l)* (1.+nuice_ref) enddo rave=icetot*0.75/max(rave*pi*rho_ice,1.e-30) ! surface weight Nccntot= 0 call watersat(ngrid*nlayer,zt,zplay,zqsat) do l=1,nlayer Nccntot = Nccntot + & zq(1,l,igcm_ccn_number)*tauscaling(1) & *(zplev(1,l) - zplev(1,l+1)) / g satu(1,l) = zq(1,l,igcm_h2o_vap)/zqsat(1,l) satu(1,l) = (max(satu(1,l),float(1))-1) ! & * zq(1,l,igcm_h2o_vap) * ! & (zplev(1,l) - zplev(1,l+1)) / g enddo call WRITEDIAGFI(ngrid,"satu","vap in satu","kg/kg",1, & satu) CALL WRITEDIAGFI(ngrid,'Nccntot', & 'Nccntot', & 'nbr/m2',0,Nccntot) call WRITEDIAGFI(ngrid,'zdqsed_dustq' & ,'sedimentation q','kg.m-2.s-1',1,zdqsed(1,:,igcm_dust_mass)) call WRITEDIAGFI(ngrid,'zdqsed_dustN' &,'sedimentation N','Nbr.m-2.s-1',1, & zdqsed(1,:,igcm_dust_number)) else ! of if (scavenging) cccc Column integrated effective ice radius cccc is weighted by total ice mass (LESS GOOD) rave = 0 do l=1,nlayer rave = rave + zq(1,l,igcm_h2o_ice) & * (zplev(1,l) - zplev(1,l+1)) / g & * rice(1,l) * (1.+nuice_ref) enddo rave=max(rave/max(icetot,1.e-30),1.e-30) ! mass weight endif ! of if (scavenging) CALL WRITEDIAGFI(ngrid,'reffice', & 'reffice', & 'm',0,rave) do iq=1,nq call WRITEDIAGFI(ngrid,trim(noms(iq))//'_s', & trim(noms(iq))//'_s','kg/kg',0,qsurf(1,iq)) end do call WRITEDIAGFI(ngrid,'zdqcloud_ice','cloud ice', & 'kg.m-2.s-1',1,zdqcloud(1,:,igcm_h2o_ice)) call WRITEDIAGFI(ngrid,'zdqcloud_vap','cloud vap', & 'kg.m-2.s-1',1,zdqcloud(1,:,igcm_h2o_vap)) call WRITEDIAGFI(ngrid,'zdqcloud','cloud ice', & 'kg.m-2.s-1',1,zdqcloud(1,:,igcm_h2o_ice) & +zdqcloud(1,:,igcm_h2o_vap)) call WRITEDIAGFI(ngrid,"rice","ice radius","m",1, & rice) ENDIF ! of IF (water) ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc zlocal(1)=-log(zplay(1,1)/zplev(1,1))* Rnew(1,1)*zt(1,1)/g do l=2,nlayer-1 tmean=zt(1,l) if(zt(1,l).ne.zt(1,l-1)) & tmean=(zt(1,l)-zt(1,l-1))/log(zt(1,l)/zt(1,l-1)) zlocal(l)= zlocal(l-1) & -log(zplay(1,l)/zplay(1,l-1))*rnew(1,l)*tmean/g enddo zlocal(nlayer)= zlocal(nlayer-1)- & log(zplay(1,nlayer)/zplay(1,nlayer-1))* & rnew(1,nlayer)*tmean/g #endif END IF ! if(ngrid.ne.1) icount=icount+1 RETURN END