source: trunk/LMDZ.GENERIC/libf/phystd/physiq_mod.F90 @ 1877

Last change on this file since 1877 was 1877, checked in by aslmd, 7 years ago

addition of the omega velocity in physiq_mod (awaiting improvements by JL)

  • Property svn:executable set to *
File size: 91.9 KB
Line 
1      module physiq_mod
2     
3      implicit none
4     
5      contains
6     
7      subroutine physiq(ngrid,nlayer,nq,   &
8                  nametrac,                &
9                  firstcall,lastcall,      &
10                  pday,ptime,ptimestep,    &
11                  pplev,pplay,pphi,        &
12                  pu,pv,pt,pq,             &
13                  flxw,                    &
14                  pdu,pdv,pdt,pdq,pdpsrf)
15 
16      use radinc_h, only : L_NSPECTI,L_NSPECTV,naerkind
17      use watercommon_h, only : RLVTT, Psat_water,epsi
18      use gases_h, only: gnom, gfrac
19      use radcommon_h, only: sigma, glat, grav, BWNV
20      use radii_mod, only: h2o_reffrad, co2_reffrad
21      use aerosol_mod, only: iaero_co2, iaero_h2o
22      use surfdat_h, only: phisfi, zmea, zstd, zsig, zgam, zthe, &
23                           dryness, watercaptag
24      use comdiurn_h, only: coslat, sinlat, coslon, sinlon
25      use comsaison_h, only: mu0, fract, dist_star, declin, right_ascen
26      use comsoil_h, only: nsoilmx, layer, mlayer, inertiedat
27      use geometry_mod, only: latitude, longitude, cell_area
28      USE comgeomfi_h, only: totarea, totarea_planet
29      USE tracer_h, only: noms, mmol, radius, rho_q, qext, &
30                          alpha_lift, alpha_devil, qextrhor, &
31                          igcm_h2o_ice, igcm_h2o_vap, igcm_dustbin, &
32                          igcm_co2_ice
33      use time_phylmdz_mod, only: ecritphy, iphysiq, nday
34      use phyetat0_mod, only: phyetat0
35      use phyredem, only: physdem0, physdem1
36      use slab_ice_h, only: capcalocean, capcalseaice,capcalsno, &
37                            noceanmx
38      use ocean_slab_mod, only :ocean_slab_init, ocean_slab_ice, &
39                                ini_surf_heat_transp_mod, &
40                                ocean_slab_get_vars,ocean_slab_final
41      use surf_heat_transp_mod,only :init_masquv
42      use planetwide_mod, only: planetwide_minval,planetwide_maxval,planetwide_sumval
43      use mod_phys_lmdz_para, only : is_master
44      use planete_mod, only: apoastr, periastr, year_day, peri_day, &
45                            obliquit, nres, z0
46      use comcstfi_mod, only: pi, g, rcp, r, rad, mugaz, cpp
47      use time_phylmdz_mod, only: daysec
48      use callkeys_mod
49      use conc_mod
50      use phys_state_var_mod
51      use turb_mod, only : q2,sensibFlux,turb_resolved
52#ifndef MESOSCALE
53      use vertical_layers_mod, only: presnivs, pseudoalt
54      use mod_phys_lmdz_omp_data, ONLY: is_omp_master
55#else
56      use comm_wrf, only : comm_HR_SW, comm_HR_LW, &
57                           comm_CLOUDFRAC,comm_TOTCLOUDFRAC,&
58                           comm_RAIN,comm_SNOW,comm_ALBEQ,&
59                           comm_FLUXTOP_DN,comm_FLUXABS_SW,&
60                           comm_FLUXTOP_LW,comm_FLUXSURF_SW,&
61                           comm_FLUXSURF_LW,comm_FLXGRD,&
62                           comm_LSCEZ,comm_H2OICE_REFF
63#endif
64
65#ifdef CPP_XIOS     
66      use xios_output_mod, only: initialize_xios_output, &
67                                 update_xios_timestep, &
68                                 send_xios_field
69      use wxios, only: wxios_context_init, xios_context_finalize
70#endif
71
72      implicit none
73
74
75!==================================================================
76!     
77!     Purpose
78!     -------
79!     Central subroutine for all the physics parameterisations in the
80!     universal model. Originally adapted from the Mars LMDZ model.
81!
82!     The model can be run without or with tracer transport
83!     depending on the value of "tracer" in file "callphys.def".
84!
85!
86!   It includes:
87!
88!      I. Initialization :
89!         I.1 Firstcall initializations.
90!         I.2 Initialization for every call to physiq.
91!
92!      II. Compute radiative transfer tendencies (longwave and shortwave) :
93!         II.a Option 1 : Call correlated-k radiative transfer scheme.
94!         II.b Option 2 : Call Newtonian cooling scheme.
95!         II.c Option 3 : Atmosphere has no radiative effect.
96!
97!      III. Vertical diffusion (turbulent mixing) :
98!
99!      IV. Dry Convective adjustment :
100!
101!      V. Condensation and sublimation of gases (currently just CO2).
102!
103!      VI. Tracers
104!         VI.1. Water and water ice.
105!         VI.2  Photochemistry
106!         VI.3. Aerosols and particles.
107!         VI.4. Updates (pressure variations, surface budget).
108!         VI.5. Slab Ocean.
109!         VI.6. Surface Tracer Update.
110!
111!      VII. Surface and sub-surface soil temperature.
112!
113!      VIII. Perform diagnostics and write output files.
114!
115!
116!   arguments
117!   ---------
118!
119!   INPUT
120!   -----
121!
122!    ngrid                 Size of the horizontal grid.
123!    nlayer                Number of vertical layers.
124!    nq                    Number of advected fields.
125!    nametrac              Name of corresponding advected fields.
126!
127!    firstcall             True at the first call.
128!    lastcall              True at the last call.
129!
130!    pday                  Number of days counted from the North. Spring equinoxe.
131!    ptime                 Universal time (0<ptime<1): ptime=0.5 at 12:00 UT.
132!    ptimestep             timestep (s).
133!
134!    pplay(ngrid,nlayer)   Pressure at the middle of the layers (Pa).
135!    pplev(ngrid,nlayer+1) Intermediate pressure levels (Pa).
136!    pphi(ngrid,nlayer)    Geopotential at the middle of the layers (m2.s-2).
137!
138!    pu(ngrid,nlayer)      u, zonal component of the wind (ms-1).
139!    pv(ngrid,nlayer)      v, meridional component of the wind (ms-1).
140!
141!    pt(ngrid,nlayer)      Temperature (K).
142!
143!    pq(ngrid,nlayer,nq)   Advected fields.
144!
145!    pudyn(ngrid,nlayer)    \
146!    pvdyn(ngrid,nlayer)     \ Dynamical temporal derivative for the
147!    ptdyn(ngrid,nlayer)     / corresponding variables.
148!    pqdyn(ngrid,nlayer,nq) /
149!    flxw(ngrid,nlayer)      vertical mass flux (kg/s) at layer lower boundary
150!
151!   OUTPUT
152!   ------
153!
154!    pdu(ngrid,nlayer)        \
155!    pdv(ngrid,nlayer)         \  Temporal derivative of the corresponding
156!    pdt(ngrid,nlayer)         /  variables due to physical processes.
157!    pdq(ngrid,nlayer)        /
158!    pdpsrf(ngrid)             /
159!
160!
161!     Authors
162!     -------
163!           Frederic Hourdin        15/10/93
164!           Francois Forget        1994
165!           Christophe Hourdin        02/1997
166!           Subroutine completely rewritten by F. Forget (01/2000)
167!           Water ice clouds: Franck Montmessin (update 06/2003)
168!           Radiatively active tracers: J.-B. Madeleine (10/2008-06/2009)
169!           New correlated-k radiative scheme: R. Wordsworth (2009)
170!           Many specifically Martian subroutines removed: R. Wordsworth (2009)       
171!           Improved water cycle: R. Wordsworth / B. Charnay (2010)
172!           To F90: R. Wordsworth (2010)
173!           New turbulent diffusion scheme: J. Leconte (2012)
174!           Loops converted to F90 matrix format: J. Leconte (2012)
175!           No more ngridmx/nqmx, F90 commons and adaptation to parallel: A. Spiga (2012)
176!           Purge of the code : M. Turbet (2015)
177!           Photochemical core developped by F. Lefevre: B. Charnay (2017)
178!==================================================================
179
180
181!    0.  Declarations :
182!    ------------------
183
184include "netcdf.inc"
185
186! Arguments :
187! -----------
188
189!   INPUTS:
190!   -------
191
192      integer,intent(in) :: ngrid             ! Number of atmospheric columns.
193      integer,intent(in) :: nlayer            ! Number of atmospheric layers.
194      integer,intent(in) :: nq                ! Number of tracers.
195      character*20,intent(in) :: nametrac(nq) ! Names of the tracers taken from dynamics.
196     
197      logical,intent(in) :: firstcall ! Signals first call to physics.
198      logical,intent(in) :: lastcall  ! Signals last call to physics.
199     
200      real,intent(in) :: pday                  ! Number of elapsed sols since reference Ls=0.
201      real,intent(in) :: ptime                 ! "Universal time", given as fraction of sol (e.g.: 0.5 for noon).
202      real,intent(in) :: ptimestep             ! Physics timestep (s).
203      real,intent(in) :: pplev(ngrid,nlayer+1) ! Inter-layer pressure (Pa).
204      real,intent(in) :: pplay(ngrid,nlayer)   ! Mid-layer pressure (Pa).
205      real,intent(in) :: pphi(ngrid,nlayer)    ! Geopotential at mid-layer (m2s-2).
206      real,intent(in) :: pu(ngrid,nlayer)      ! Zonal wind component (m/s).
207      real,intent(in) :: pv(ngrid,nlayer)      ! Meridional wind component (m/s).
208      real,intent(in) :: pt(ngrid,nlayer)      ! Temperature (K).
209      real,intent(in) :: pq(ngrid,nlayer,nq)   ! Tracers (kg/kg_of_air).
210      real,intent(in) :: flxw(ngrid,nlayer)    ! Vertical mass flux (ks/s) at lower boundary of layer
211
212!   OUTPUTS:
213!   --------
214
215!     Physical tendencies :
216
217      real,intent(out) :: pdu(ngrid,nlayer)    ! Zonal wind tendencies (m/s/s).
218      real,intent(out) :: pdv(ngrid,nlayer)    ! Meridional wind tendencies (m/s/s).
219      real,intent(out) :: pdt(ngrid,nlayer)    ! Temperature tendencies (K/s).
220      real,intent(out) :: pdq(ngrid,nlayer,nq) ! Tracer tendencies (kg/kg_of_air/s).
221      real,intent(out) :: pdpsrf(ngrid)        ! Surface pressure tendency (Pa/s).
222
223! Local saved variables:
224! ----------------------
225      integer,save :: day_ini                                      ! Initial date of the run (sol since Ls=0).
226      integer,save :: icount                                       ! Counter of calls to physiq during the run.
227!$OMP THREADPRIVATE(day_ini,icount)
228
229! Local variables :
230! -----------------
231
232!     Aerosol (dust or ice) extinction optical depth  at reference wavelength
233!     for the "naerkind" optically active aerosols:
234
235      real aerosol(ngrid,nlayer,naerkind) ! Aerosols.
236      real zh(ngrid,nlayer)               ! Potential temperature (K).
237      real pw(ngrid,nlayer)               ! Vertical velocity (m/s). (NOTE : >0 WHEN DOWNWARDS !!)
238      real omega(ngrid,nlayer)            ! omega velocity (Pa/s, >0 when downward)
239
240      integer l,ig,ierr,iq,nw,isoil
241     
242      real zls                       ! Solar longitude (radians).
243      real zlss                      ! Sub solar point longitude (radians).
244      real zday                      ! Date (time since Ls=0, calculated in sols).
245      real zzlay(ngrid,nlayer)       ! Altitude at the middle of the atmospheric layers.
246      real zzlev(ngrid,nlayer+1)     ! Altitude at the atmospheric layer boundaries.
247
248! TENDENCIES due to various processes :
249
250      ! For Surface Temperature : (K/s)
251      real zdtsurf(ngrid)     ! Cumulated tendencies.
252      real zdtsurfmr(ngrid)   ! Mass_redistribution routine.
253      real zdtsurfc(ngrid)    ! Condense_co2 routine.
254      real zdtsdif(ngrid)     ! Turbdiff/vdifc routines.
255      real zdtsurf_hyd(ngrid) ! Hydrol routine.
256           
257      ! For Atmospheric Temperatures : (K/s)   
258      real dtlscale(ngrid,nlayer)                             ! Largescale routine.
259      real zdtc(ngrid,nlayer)                                 ! Condense_co2 routine.
260      real zdtdif(ngrid,nlayer)                                      ! Turbdiff/vdifc routines.
261      real zdtmr(ngrid,nlayer)                                ! Mass_redistribution routine.
262      real zdtrain(ngrid,nlayer)                              ! Rain routine.
263      real dtmoist(ngrid,nlayer)                              ! Moistadj routine.
264      real dt_ekman(ngrid,noceanmx), dt_hdiff(ngrid,noceanmx) ! Slab_ocean routine.
265      real zdtsw1(ngrid,nlayer), zdtlw1(ngrid,nlayer)         ! Callcorrk routine.
266                             
267      ! For Surface Tracers : (kg/m2/s)
268      real dqsurf(ngrid,nq)                 ! Cumulated tendencies.
269      real zdqsurfc(ngrid)                  ! Condense_co2 routine.
270      real zdqsdif(ngrid,nq)                ! Turbdiff/vdifc routines.
271      real zdqssed(ngrid,nq)                ! Callsedim routine.
272      real zdqsurfmr(ngrid,nq)              ! Mass_redistribution routine.
273      real zdqsrain(ngrid), zdqssnow(ngrid) ! Rain routine.
274      real dqs_hyd(ngrid,nq)                ! Hydrol routine.
275      real reevap_precip(ngrid)             ! re-evaporation flux of precipitation (integrated over the atmospheric column)
276                 
277      ! For Tracers : (kg/kg_of_air/s)
278      real zdqc(ngrid,nlayer,nq)      ! Condense_co2 routine.
279      real zdqadj(ngrid,nlayer,nq)    ! Convadj routine.
280      real zdqdif(ngrid,nlayer,nq)    ! Turbdiff/vdifc routines.
281      real zdqevap(ngrid,nlayer)      ! Turbdiff routine.
282      real zdqsed(ngrid,nlayer,nq)    ! Callsedim routine.
283      real zdqmr(ngrid,nlayer,nq)     ! Mass_redistribution routine.
284      real zdqrain(ngrid,nlayer,nq)   ! Rain routine.
285      real dqmoist(ngrid,nlayer,nq)   ! Moistadj routine.
286      real dqvaplscale(ngrid,nlayer)  ! Largescale routine.
287      real dqcldlscale(ngrid,nlayer)  ! Largescale routine.
288      REAL zdqchim(ngrid,nlayer,nq)   ! Calchim_asis routine
289      REAL zdqschim(ngrid,nq)         ! Calchim_asis routine
290
291      REAL array_zero1(ngrid)
292      REAL array_zero2(ngrid,nlayer)
293                       
294      ! For Winds : (m/s/s)
295      real zdvadj(ngrid,nlayer),zduadj(ngrid,nlayer) ! Convadj routine.
296      real zdumr(ngrid,nlayer),zdvmr(ngrid,nlayer)   ! Mass_redistribution routine.
297      real zdvdif(ngrid,nlayer),zdudif(ngrid,nlayer) ! Turbdiff/vdifc routines.
298      real zdhdif(ngrid,nlayer)                      ! Turbdiff/vdifc routines.
299      real zdhadj(ngrid,nlayer)                      ! Convadj routine.
300     
301      ! For Pressure and Mass :
302      real zdmassmr(ngrid,nlayer) ! Atmospheric Mass tendency for mass_redistribution (kg_of_air/m2/s).
303      real zdmassmr_col(ngrid)    ! Atmospheric Column Mass tendency for mass_redistribution (kg_of_air/m2/s).
304      real zdpsrfmr(ngrid)        ! Pressure tendency for mass_redistribution routine (Pa/s).
305
306     
307   
308! Local variables for LOCAL CALCULATIONS:
309! ---------------------------------------
310      real zflubid(ngrid)
311      real zplanck(ngrid),zpopsk(ngrid,nlayer)
312      real ztim1,ztim2,ztim3, z1,z2
313      real ztime_fin
314      real zdh(ngrid,nlayer)
315      real gmplanet
316      real taux(ngrid),tauy(ngrid)
317
318
319! local variables for DIAGNOSTICS : (diagfi & stat)
320! -------------------------------------------------
321      real ps(ngrid)                                     ! Surface Pressure.
322      real zt(ngrid,nlayer)                              ! Atmospheric Temperature.
323      real zu(ngrid,nlayer),zv(ngrid,nlayer)             ! Zonal and Meridional Winds.
324      real zq(ngrid,nlayer,nq)                           ! Atmospheric Tracers.
325      real zdtadj(ngrid,nlayer)                          ! Convadj Diagnostic.
326      real zdtdyn(ngrid,nlayer)                          ! Dynamical Heating (K/s).
327      real zdudyn(ngrid,nlayer)                          ! Dynamical Zonal Wind tendency (m.s-2).
328
329      real reff(ngrid,nlayer)                       ! Effective dust radius (used if doubleq=T).
330      real vmr(ngrid,nlayer)                        ! volume mixing ratio
331      real time_phys
332     
333      real ISR,ASR,OLR,GND,DYN,GSR,Ts1,Ts2,Ts3,TsS ! for Diagnostic.
334     
335      real qcol(ngrid,nq) ! Tracer Column Mass (kg/m2).
336
337!     included by RW for H2O Manabe scheme
338      real rneb_man(ngrid,nlayer) ! H2O cloud fraction (moistadj).
339      real rneb_lsc(ngrid,nlayer) ! H2O cloud fraction (large scale).
340
341
342!     to test energy conservation (RW+JL)
343      real mass(ngrid,nlayer),massarea(ngrid,nlayer)
344      real dEtot, dEtots, AtmToSurf_TurbFlux
345      real,save :: dEtotSW, dEtotsSW, dEtotLW, dEtotsLW
346!$OMP THREADPRIVATE(dEtotSW, dEtotsSW, dEtotLW, dEtotsLW)
347      real dEzRadsw(ngrid,nlayer),dEzRadlw(ngrid,nlayer),dEzdiff(ngrid,nlayer)
348      real dEdiffs(ngrid),dEdiff(ngrid)
349      real madjdE(ngrid), lscaledE(ngrid),madjdEz(ngrid,nlayer), lscaledEz(ngrid,nlayer)
350     
351!JL12 conservation test for mean flow kinetic energy has been disabled temporarily
352
353      real dtmoist_max,dtmoist_min     
354      real dItot, dItot_tmp, dVtot, dVtot_tmp
355
356
357      real h2otot                      ! Total Amount of water. For diagnostic.
358      real icesrf,liqsrf,icecol,vapcol ! Total Amounts of water (ice,liq,vap). For diagnostic.
359      real dWtot, dWtot_tmp, dWtots, dWtots_tmp
360      logical,save :: watertest
361!$OMP THREADPRIVATE(watertest)
362
363      real qsat(ngrid,nlayer) ! Water Vapor Volume Mixing Ratio at saturation (kg/kg_of_air).
364      real RH(ngrid,nlayer)   ! Relative humidity.
365      real H2Omaxcol(ngrid)   ! Maximum possible H2O column amount (at 100% saturation) (kg/m2).
366      real psat_tmp
367     
368      logical clearsky ! For double radiative transfer call. By BC
369     
370      ! For Clear Sky Case.
371      real fluxsurf_lw1(ngrid), fluxsurf_sw1(ngrid), fluxsurfabs_sw1(ngrid)  ! For SW/LW flux.
372      real fluxtop_lw1(ngrid), fluxabs_sw1(ngrid)                            ! For SW/LW flux.
373      real albedo_equivalent1(ngrid)                                         ! For Equivalent albedo calculation.
374      real tau_col1(ngrid)                                                   ! For aerosol optical depth diagnostic.
375      real OLR_nu1(ngrid,L_NSPECTI), OSR_nu1(ngrid,L_NSPECTV)                ! For Outgoing Radiation diagnostics.
376      real tf, ntf
377
378      real nconsMAX, vdifcncons(ngrid), cadjncons(ngrid) ! Vdfic water conservation test. By RW
379
380      real muvar(ngrid,nlayer+1) ! For Runaway Greenhouse 1D study. By RW
381
382      real reffcol(ngrid,naerkind)
383
384!     Sourceevol for 'accelerated ice evolution'. By RW
385      real delta_ice,ice_tot
386      integer num_run
387      logical,save :: ice_update
388
389
390      real :: tsurf2(ngrid)
391      real :: flux_o(ngrid),flux_g(ngrid),fluxgrdocean(ngrid)
392      real :: flux_sens_lat(ngrid)
393      real :: qsurfint(ngrid,nq)
394
395
396!==================================================================================================
397
398! -----------------
399! I. INITIALISATION
400! -----------------
401
402! --------------------------------
403! I.1   First Call Initialisation.
404! --------------------------------
405      if (firstcall) then
406        ! Allocate saved arrays.
407        call phys_state_var_init(nq)
408
409!        Variables set to 0
410!        ~~~~~~~~~~~~~~~~~~
411         dtrad(:,:) = 0.0
412         fluxrad(:) = 0.0
413         tau_col(:) = 0.0
414         zdtsw(:,:) = 0.0
415         zdtlw(:,:) = 0.0
416
417
418!        Initialize aerosol indexes.
419!        ~~~~~~~~~~~~~~~~~~~~~~~~~~~
420         call iniaerosol()
421
422     
423!        Initialize tracer names, indexes and properties.
424!        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
425         IF (.NOT.ALLOCATED(noms)) ALLOCATE(noms(nq)) ! (because noms is an argument of physdem1 whether or not tracer is on)
426         if (tracer) then
427            call initracer(ngrid,nq,nametrac)
428            if(photochem) then
429              call ini_conc_mod(ngrid,nlayer)
430            endif
431         endif
432
433#ifdef CPP_XIOS
434        ! Initialize XIOS context
435        write(*,*) "physiq: call wxios_context_init"
436        CALL wxios_context_init
437#endif
438
439!        Read 'startfi.nc' file.
440!        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
441#ifndef MESOSCALE
442         call phyetat0(startphy_file,                                 &
443                       ngrid,nlayer,"startfi.nc",0,0,nsoilmx,nq,      &
444                       day_ini,time_phys,tsurf,tsoil,emis,q2,qsurf,   &
445                       cloudfrac,totcloudfrac,hice,                   &
446                       rnat,pctsrf_sic,tslab, tsea_ice,sea_ice)
447#else
448      emis(:)=0.0
449      q2(:,:)=0.0
450      qsurf(:,:)=0.0
451      day_ini = pday
452#endif
453
454#ifndef MESOSCALE
455         if (.not.startphy_file) then
456           ! additionnal "academic" initialization of physics
457           if (is_master) write(*,*) "Physiq: initializing tsurf(:) to pt(:,1) !!"
458           tsurf(:)=pt(:,1)
459           if (is_master) write(*,*) "Physiq: initializing tsoil(:) to pt(:,1) !!"
460           do isoil=1,nsoilmx
461             tsoil(1:ngrid,isoil)=tsurf(1:ngrid)
462           enddo
463           if (is_master) write(*,*) "Physiq: initializing day_ini to pdat !"
464           day_ini=pday
465         endif
466#endif
467
468         if (pday.ne.day_ini) then
469           write(*,*) "ERROR in physiq.F90:"
470           write(*,*) "bad synchronization between physics and dynamics"
471           write(*,*) "dynamics day: ",pday
472           write(*,*) "physics day:  ",day_ini
473           stop
474         endif
475
476         write (*,*) 'In physiq day_ini =', day_ini
477
478!        Initialize albedo calculation.
479!        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
480         albedo(:,:)=0.0
481          albedo_bareground(:)=0.0
482          albedo_snow_SPECTV(:)=0.0
483          albedo_co2_ice_SPECTV(:)=0.0
484         call surfini(ngrid,nq,qsurf,albedo,albedo_bareground,albedo_snow_SPECTV,albedo_co2_ice_SPECTV)
485         
486!        Initialize orbital calculation.
487!        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
488         call iniorbit(apoastr,periastr,year_day,peri_day,obliquit)
489
490
491         if(tlocked)then
492            print*,'Planet is tidally locked at resonance n=',nres
493            print*,'Make sure you have the right rotation rate!!!'
494         endif
495
496!        Initialize oceanic variables.
497!        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
498
499         if (ok_slab_ocean)then
500
501           call ocean_slab_init(ngrid,ptimestep, tslab, &
502                                sea_ice, pctsrf_sic)
503
504           call ini_surf_heat_transp_mod()
505           
506           knindex(:) = 0
507
508           do ig=1,ngrid
509              zmasq(ig)=1
510              knindex(ig) = ig
511              if (nint(rnat(ig)).eq.0) then
512                 zmasq(ig)=0
513              endif
514           enddo
515
516           CALL init_masquv(ngrid,zmasq)
517
518         endif ! end of 'ok_slab_ocean'.
519
520
521!        Initialize soil.
522!        ~~~~~~~~~~~~~~~~
523         if (callsoil) then
524         
525            call soil(ngrid,nsoilmx,firstcall,lastcall,inertiedat, &
526                      ptimestep,tsurf,tsoil,capcal,fluxgrd)
527
528            if (ok_slab_ocean) then
529               do ig=1,ngrid
530                  if (nint(rnat(ig)).eq.2) then
531                     capcal(ig)=capcalocean
532                     if (pctsrf_sic(ig).gt.0.5) then
533                        capcal(ig)=capcalseaice
534                        if (qsurf(ig,igcm_h2o_ice).gt.0.) then
535                           capcal(ig)=capcalsno
536                        endif
537                     endif
538                  endif
539               enddo
540            endif ! end of 'ok_slab_ocean'.
541
542         else ! else of 'callsoil'.
543         
544            print*,'WARNING! Thermal conduction in the soil turned off'
545            capcal(:)=1.e6
546            fluxgrd(:)=intheat
547            print*,'Flux from ground = ',intheat,' W m^-2'
548           
549         endif ! end of 'callsoil'.
550         
551         icount=1
552
553!        Decide whether to update ice at end of run.
554!        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
555         ice_update=.false.
556         if(sourceevol)then
557!$OMP MASTER
558            open(128,file='num_run',form='formatted', &
559                     status="old",iostat=ierr)
560            if (ierr.ne.0) then
561               write(*,*) "physiq: Error! No num_run file!"
562               write(*,*) " (which is needed for sourceevol option)"
563               stop
564            endif
565            read(128,*) num_run
566            close(128)
567!$OMP END MASTER
568!$OMP BARRIER
569       
570            if(num_run.ne.0.and.mod(num_run,2).eq.0)then
571               print*,'Updating ice at end of this year!'
572               ice_update=.true.
573               ice_min(:)=1.e4
574            endif
575           
576         endif ! end of 'sourceevol'.
577
578
579         ! Here is defined the type of the surface : Continent or Ocean.
580         ! BC2014 : This is now already done in newstart.
581         ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
582         if (.not.ok_slab_ocean) then
583         
584           rnat(:)=1.
585           do ig=1,ngrid
586              if(inertiedat(ig,1).gt.1.E4)then
587                 rnat(ig)=0
588              endif
589           enddo
590
591           print*,'WARNING! Surface type currently decided by surface inertia'
592           print*,'This should be improved e.g. in newstart.F'
593           
594         endif ! end of 'ok_slab_ocean'.
595
596
597!        Initialize surface history variable.
598!        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
599         qsurf_hist(:,:)=qsurf(:,:)
600
601!        Initialize variable for dynamical heating and zonal wind tendency diagnostic
602!        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
603         ztprevious(:,:)=pt(:,:)
604         zuprevious(:,:)=pu(:,:)
605
606!        Set temperature just above condensation temperature (for Early Mars)
607!        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
608         if(nearco2cond) then
609            write(*,*)' WARNING! Starting at Tcond+1K'
610            do l=1, nlayer
611               do ig=1,ngrid
612                  pdt(ig,l)= ((-3167.8)/(log(.01*pplay(ig,l))-23.23)+4     &
613                      -pt(ig,l)) / ptimestep
614               enddo
615            enddo
616         endif
617
618         if(meanOLR)then         
619            call system('rm -f rad_bal.out') ! to record global radiative balance.           
620            call system('rm -f tem_bal.out') ! to record global mean/max/min temperatures.           
621            call system('rm -f h2o_bal.out') ! to record global hydrological balance.
622         endif
623
624
625         watertest=.false.       
626         if(water)then ! Initialize variables for water cycle
627           
628            if(enertest)then
629               watertest = .true.
630            endif
631
632            if(ice_update)then
633               ice_initial(:)=qsurf(:,igcm_h2o_ice)
634            endif
635
636         endif
637         
638         call su_watercycle ! even if we don't have a water cycle, we might
639                            ! need epsi for the wvp definitions in callcorrk.F
640#ifndef MESOSCALE
641         if (ngrid.ne.1) then ! Note : no need to create a restart file in 1d.
642            call physdem0("restartfi.nc",longitude,latitude,nsoilmx,ngrid,nlayer,nq, &
643                          ptimestep,pday+nday,time_phys,cell_area,          &
644                          albedo_bareground,inertiedat,zmea,zstd,zsig,zgam,zthe)
645         endif
646#endif         
647         
648         ! XIOS outputs
649#ifdef CPP_XIOS
650
651         write(*,*) "physiq: call initialize_xios_output"
652         call initialize_xios_output(pday,ptime,ptimestep,daysec, &
653                                     presnivs,pseudoalt)
654#endif
655         write(*,*) "physiq: end of firstcall"
656      endif ! end of 'firstcall'
657
658! ------------------------------------------------------
659! I.2   Initializations done at every physical timestep:
660! ------------------------------------------------------
661
662#ifdef CPP_XIOS     
663      ! update XIOS time/calendar
664      call update_xios_timestep
665#endif     
666
667      ! Initialize various variables
668      ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
669     
670      if ( .not.nearco2cond ) then
671         pdt(1:ngrid,1:nlayer) = 0.0
672      endif     
673      zdtsurf(1:ngrid)      = 0.0
674      pdq(1:ngrid,1:nlayer,1:nq) = 0.0
675      dqsurf(1:ngrid,1:nq)= 0.0
676      pdu(1:ngrid,1:nlayer) = 0.0
677      pdv(1:ngrid,1:nlayer) = 0.0
678      pdpsrf(1:ngrid)       = 0.0
679      zflubid(1:ngrid)      = 0.0     
680      flux_sens_lat(1:ngrid) = 0.0
681      taux(1:ngrid) = 0.0
682      tauy(1:ngrid) = 0.0
683
684      zday=pday+ptime ! Compute time, in sols (and fraction thereof).
685
686      ! Compute Stellar Longitude (Ls), and orbital parameters.
687      ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
688      if (season) then
689         call stellarlong(zday,zls)
690      else
691         call stellarlong(float(day_ini),zls)
692      end if
693
694      call orbite(zls,dist_star,declin,right_ascen)
695     
696      if (tlocked) then
697              zlss=Mod(-(2.*pi*(zday/year_day)*nres - right_ascen),2.*pi)
698      elseif (diurnal) then
699              zlss=-2.*pi*(zday-.5)
700      else if(diurnal .eqv. .false.) then
701              zlss=9999.
702      endif
703
704
705      ! Compute variations of g with latitude (oblate case).
706      ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
707      if (oblate .eqv. .false.) then     
708         glat(:) = g         
709      else if (flatten .eq. 0.0 .or. J2 .eq. 0.0 .or. Rmean .eq. 0.0 .or. MassPlanet .eq. 0.0) then     
710         print*,'I need values for flatten, J2, Rmean and MassPlanet to compute glat (else set oblate=.false.)'
711         call abort
712      else
713         gmplanet = MassPlanet*grav*1e24
714         do ig=1,ngrid
715            glat(ig)= gmplanet/(Rmean**2) * (1.D0 + 0.75 *J2 - 2.0*flatten/3. + (2.*flatten - 15./4.* J2) * cos(2. * (pi/2. - latitude(ig))))
716         end do
717      endif
718
719      ! Compute geopotential between layers.
720      ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
721      zzlay(1:ngrid,1:nlayer)=pphi(1:ngrid,1:nlayer)
722      do l=1,nlayer         
723         zzlay(1:ngrid,l)= zzlay(1:ngrid,l)/glat(1:ngrid)
724      enddo
725
726      zzlev(1:ngrid,1)=0.
727      zzlev(1:ngrid,nlayer+1)=1.e7 ! Dummy top of last layer above 10000 km...
728
729      do l=2,nlayer
730         do ig=1,ngrid
731            z1=(pplay(ig,l-1)+pplev(ig,l))/(pplay(ig,l-1)-pplev(ig,l))
732            z2=(pplev(ig,l)+pplay(ig,l))/(pplev(ig,l)-pplay(ig,l))
733            zzlev(ig,l)=(z1*zzlay(ig,l-1)+z2*zzlay(ig,l))/(z1+z2)
734         enddo
735      enddo     
736
737      ! Compute potential temperature
738      ! Note : Potential temperature calculation may not be the same in physiq and dynamic...
739      ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
740      do l=1,nlayer         
741         do ig=1,ngrid
742            zpopsk(ig,l)=(pplay(ig,l)/pplev(ig,1))**rcp
743            zh(ig,l)=pt(ig,l)/zpopsk(ig,l)
744            mass(ig,l)  = (pplev(ig,l) - pplev(ig,l+1))/glat(ig)
745            massarea(ig,l)=mass(ig,l)*cell_area(ig)
746         enddo
747      enddo
748
749     ! Compute vertical velocity (m/s) from vertical mass flux
750     ! w = F / (rho*area) and rho = P/(r*T)
751     ! But first linearly interpolate mass flux to mid-layers
752      do l=1,nlayer-1
753         pw(1:ngrid,l)=0.5*(flxw(1:ngrid,l)+flxw(1:ngrid,l+1))
754      enddo
755      pw(1:ngrid,nlayer)=0.5*flxw(1:ngrid,nlayer) ! since flxw(nlayer+1)=0
756      do l=1,nlayer
757         pw(1:ngrid,l)=(pw(1:ngrid,l)*r*pt(1:ngrid,l)) /  &
758                       (pplay(1:ngrid,l)*cell_area(1:ngrid))
759      enddo
760      ! omega in Pa/s
761      do l=1,nlayer-1
762         omega(1:ngrid,l)=0.5*(flxw(1:ngrid,l)+flxw(1:ngrid,l+1))
763      enddo
764      omega(1:ngrid,nlayer)=0.5*flxw(1:ngrid,nlayer) ! since flxw(nlayer+1)=0
765      do l=1,nlayer
766         omega(1:ngrid,l)=g*omega(1:ngrid,l)/cell_area(1:ngrid)
767      enddo
768
769      ! ----------------------------------------------------------------
770      ! Compute mean mass, cp, and R
771      ! --------------------------------
772
773      if(photochem) then
774         call concentrations(ngrid,nlayer,nq,pplay,pt,pdt,pq,pdq,ptimestep)
775      endif
776
777!---------------------------------
778! II. Compute radiative tendencies
779!---------------------------------
780
781      if (callrad) then
782         if( mod(icount-1,iradia).eq.0.or.lastcall) then
783
784          ! Compute local stellar zenith angles
785          ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
786            if (tlocked) then
787            ! JL14 corrects tidally resonant (and inclined) cases. nres=omega_rot/omega_orb
788               ztim1=SIN(declin)
789               ztim2=COS(declin)*COS(zlss)
790               ztim3=COS(declin)*SIN(zlss)
791
792               call stelang(ngrid,sinlon,coslon,sinlat,coslat,    &
793                            ztim1,ztim2,ztim3,mu0,fract, flatten)
794
795            elseif (diurnal) then
796               ztim1=SIN(declin)
797               ztim2=COS(declin)*COS(2.*pi*(zday-.5))
798               ztim3=-COS(declin)*SIN(2.*pi*(zday-.5))
799
800               call stelang(ngrid,sinlon,coslon,sinlat,coslat,    &
801                            ztim1,ztim2,ztim3,mu0,fract, flatten)
802            else if(diurnal .eqv. .false.) then
803
804               call mucorr(ngrid,declin,latitude,mu0,fract,10000.,rad,flatten)
805               ! WARNING: this function appears not to work in 1D
806
807            endif
808           
809            ! Eclipse incoming sunlight (e.g. Saturn ring shadowing).       
810            if(rings_shadow) then
811                call call_rings(ngrid, ptime, pday, diurnal)
812            endif   
813
814
815            if (corrk) then
816           
817! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
818! II.a Call correlated-k radiative transfer scheme
819! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
820               if(kastprof)then
821                  print*,'kastprof should not = true here'
822                  call abort
823               endif
824               if(water) then
825                  muvar(1:ngrid,1:nlayer)=mugaz/(1.e0+(1.e0/epsi-1.e0)*pq(1:ngrid,1:nlayer,igcm_h2o_vap))
826                  muvar(1:ngrid,nlayer+1)=mugaz/(1.e0+(1.e0/epsi-1.e0)*pq(1:ngrid,nlayer,igcm_h2o_vap))
827                  ! take into account water effect on mean molecular weight
828               else
829                  muvar(1:ngrid,1:nlayer+1)=mugaz
830               endif
831     
832
833               if(ok_slab_ocean) then
834                  tsurf2(:)=tsurf(:)
835                  do ig=1,ngrid
836                     if (nint(rnat(ig))==0) then
837                        tsurf(ig)=((1.-pctsrf_sic(ig))*tslab(ig,1)**4+pctsrf_sic(ig)*tsea_ice(ig)**4)**0.25
838                     endif
839                  enddo
840               endif !(ok_slab_ocean)
841               
842               ! standard callcorrk
843               clearsky=.false.
844               call callcorrk(ngrid,nlayer,pq,nq,qsurf,                           &
845                              albedo,albedo_equivalent,emis,mu0,pplev,pplay,pt,   &
846                              tsurf,fract,dist_star,aerosol,muvar,                &
847                              zdtlw,zdtsw,fluxsurf_lw,fluxsurf_sw,                &
848                              fluxsurfabs_sw,fluxtop_lw,                          &
849                              fluxabs_sw,fluxtop_dn,OLR_nu,OSR_nu,                &
850                              tau_col,cloudfrac,totcloudfrac,                     &
851                              clearsky,firstcall,lastcall)     
852
853                ! Option to call scheme once more for clear regions 
854               if(CLFvarying)then
855
856                  ! ---> PROBLEMS WITH ALLOCATED ARRAYS : temporary solution in callcorrk: do not deallocate if CLFvarying ...
857                  clearsky=.true.
858                  call callcorrk(ngrid,nlayer,pq,nq,qsurf,                           &
859                                 albedo,albedo_equivalent1,emis,mu0,pplev,pplay,pt,   &
860                                 tsurf,fract,dist_star,aerosol,muvar,                &
861                                 zdtlw1,zdtsw1,fluxsurf_lw1,fluxsurf_sw1,            &
862                                 fluxsurfabs_sw1,fluxtop_lw1,                        &
863                                 fluxabs_sw1,fluxtop_dn,OLR_nu1,OSR_nu1,             &
864                                 tau_col1,cloudfrac,totcloudfrac,                    &
865                                 clearsky,firstcall,lastcall)
866                  clearsky = .false.  ! just in case.     
867
868                  ! Sum the fluxes and heating rates from cloudy/clear cases
869                  do ig=1,ngrid
870                     tf=totcloudfrac(ig)
871                     ntf=1.-tf                   
872                     fluxsurf_lw(ig)       = ntf*fluxsurf_lw1(ig)       + tf*fluxsurf_lw(ig)
873                     fluxsurf_sw(ig)       = ntf*fluxsurf_sw1(ig)       + tf*fluxsurf_sw(ig)
874                     albedo_equivalent(ig) = ntf*albedo_equivalent1(ig) + tf*albedo_equivalent(ig)
875                     fluxsurfabs_sw(ig)    = ntf*fluxsurfabs_sw1(ig)    + tf*fluxsurfabs_sw(ig)
876                     fluxtop_lw(ig)        = ntf*fluxtop_lw1(ig)        + tf*fluxtop_lw(ig)
877                     fluxabs_sw(ig)        = ntf*fluxabs_sw1(ig)        + tf*fluxabs_sw(ig)
878                     tau_col(ig)           = ntf*tau_col1(ig)           + tf*tau_col(ig)
879                   
880                     zdtlw(ig,1:nlayer) = ntf*zdtlw1(ig,1:nlayer) + tf*zdtlw(ig,1:nlayer)
881                     zdtsw(ig,1:nlayer) = ntf*zdtsw1(ig,1:nlayer) + tf*zdtsw(ig,1:nlayer)
882
883                     OSR_nu(ig,1:L_NSPECTV) = ntf*OSR_nu1(ig,1:L_NSPECTV) + tf*OSR_nu(ig,1:L_NSPECTV)                       
884                     OLR_nu(ig,1:L_NSPECTI) = ntf*OLR_nu1(ig,1:L_NSPECTI) + tf*OLR_nu(ig,1:L_NSPECTI)                       
885                  enddo                               
886
887               endif ! end of CLFvarying.
888
889               if(ok_slab_ocean) then
890                  tsurf(:)=tsurf2(:)
891               endif
892
893
894               ! Radiative flux from the sky absorbed by the surface (W.m-2).
895               GSR=0.0
896               fluxrad_sky(1:ngrid)=emis(1:ngrid)*fluxsurf_lw(1:ngrid)+fluxsurfabs_sw(1:ngrid)
897
898                            !if(noradsurf)then ! no lower surface; SW flux just disappears
899                            !   GSR = SUM(fluxsurf_sw(1:ngrid)*cell_area(1:ngrid))/totarea
900                            !   fluxrad_sky(1:ngrid)=emis(1:ngrid)*fluxsurf_lw(1:ngrid)
901                            !   print*,'SW lost in deep atmosphere = ',GSR,' W m^-2'
902                            !endif
903
904               ! Net atmospheric radiative heating rate (K.s-1)
905               dtrad(1:ngrid,1:nlayer)=zdtsw(1:ngrid,1:nlayer)+zdtlw(1:ngrid,1:nlayer)
906               
907               ! Late initialization of the Ice Spectral Albedo. We needed the visible bands to do that !
908               if (firstcall .and. albedo_spectral_mode) then
909                  call spectral_albedo_calc(albedo_snow_SPECTV)
910               endif
911
912            elseif(newtonian)then
913           
914! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
915! II.b Call Newtonian cooling scheme
916! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
917               call newtrelax(ngrid,nlayer,mu0,sinlat,zpopsk,pt,pplay,pplev,dtrad,firstcall)
918
919               zdtsurf(1:ngrid) = +(pt(1:ngrid,1)-tsurf(1:ngrid))/ptimestep
920               ! e.g. surface becomes proxy for 1st atmospheric layer ?
921
922            else
923           
924! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
925! II.c Atmosphere has no radiative effect
926! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
927               fluxtop_dn(1:ngrid)  = fract(1:ngrid)*mu0(1:ngrid)*Fat1AU/dist_star**2
928               if(ngrid.eq.1)then ! / by 4 globally in 1D case...
929                  fluxtop_dn(1)  = fract(1)*Fat1AU/dist_star**2/2.0
930               endif
931               fluxsurf_sw(1:ngrid) = fluxtop_dn(1:ngrid)
932               print*,'------------WARNING---WARNING------------' ! by MT2015.
933               print*,'You are in corrk=false mode, '
934               print*,'and the surface albedo is taken equal to the first visible spectral value'               
935               
936               fluxsurfabs_sw(1:ngrid) = fluxtop_dn(1:ngrid)*(1.-albedo(1:ngrid,1))
937               fluxrad_sky(1:ngrid)    = fluxsurfabs_sw(1:ngrid)
938               fluxtop_lw(1:ngrid)  = emis(1:ngrid)*sigma*tsurf(1:ngrid)**4
939
940               dtrad(1:ngrid,1:nlayer)=0.0 ! no atmospheric radiative heating
941
942            endif ! end of corrk
943
944         endif ! of if(mod(icount-1,iradia).eq.0)
945       
946
947         ! Transformation of the radiative tendencies
948         ! ------------------------------------------
949         zplanck(1:ngrid)=tsurf(1:ngrid)*tsurf(1:ngrid)
950         zplanck(1:ngrid)=emis(1:ngrid)*sigma*zplanck(1:ngrid)*zplanck(1:ngrid)
951         fluxrad(1:ngrid)=fluxrad_sky(1:ngrid)-zplanck(1:ngrid)
952         pdt(1:ngrid,1:nlayer)=pdt(1:ngrid,1:nlayer)+dtrad(1:ngrid,1:nlayer)
953         
954         ! Test of energy conservation
955         !----------------------------
956         if(enertest)then
957            call planetwide_sumval(cpp*massarea(:,:)*zdtsw(:,:)/totarea_planet,dEtotSW)
958            call planetwide_sumval(cpp*massarea(:,:)*zdtlw(:,:)/totarea_planet,dEtotLW)
959            !call planetwide_sumval(fluxsurf_sw(:)*(1.-albedo_equivalent(:))*cell_area(:)/totarea_planet,dEtotsSW) !JL13 carefull, albedo can have changed since the last time we called corrk
960            call planetwide_sumval(fluxsurfabs_sw(:)*cell_area(:)/totarea_planet,dEtotsSW) !JL13 carefull, albedo can have changed since the last time we called corrk
961            call planetwide_sumval((fluxsurf_lw(:)*emis(:)-zplanck(:))*cell_area(:)/totarea_planet,dEtotsLW)
962            dEzRadsw(:,:)=cpp*mass(:,:)*zdtsw(:,:)
963            dEzRadlw(:,:)=cpp*mass(:,:)*zdtlw(:,:)
964            if (is_master) then
965               print*,'---------------------------------------------------------------'
966               print*,'In corrk SW atmospheric heating       =',dEtotSW,' W m-2'
967               print*,'In corrk LW atmospheric heating       =',dEtotLW,' W m-2'
968               print*,'atmospheric net rad heating (SW+LW)   =',dEtotLW+dEtotSW,' W m-2'
969               print*,'In corrk SW surface heating           =',dEtotsSW,' W m-2'
970               print*,'In corrk LW surface heating           =',dEtotsLW,' W m-2'
971               print*,'surface net rad heating (SW+LW)       =',dEtotsLW+dEtotsSW,' W m-2'
972            endif
973         endif ! end of 'enertest'
974
975      endif ! of if (callrad)
976
977
978
979!  --------------------------------------------
980!  III. Vertical diffusion (turbulent mixing) :
981!  --------------------------------------------
982
983      if (calldifv) then
984     
985         zflubid(1:ngrid)=fluxrad(1:ngrid)+fluxgrd(1:ngrid)
986
987         ! JL12 the following if test is temporarily there to allow us to compare the old vdifc with turbdiff.
988         if (UseTurbDiff) then
989         
990            call turbdiff(ngrid,nlayer,nq,rnat,                  &
991                          ptimestep,capcal,lwrite,               &
992                          pplay,pplev,zzlay,zzlev,z0,            &
993                          pu,pv,pt,zpopsk,pq,tsurf,emis,qsurf,   &
994                          pdt,pdq,zflubid,                       &
995                          zdudif,zdvdif,zdtdif,zdtsdif,          &
996                          sensibFlux,q2,zdqdif,zdqevap,zdqsdif,  &
997                          taux,tauy,lastcall)
998
999         else
1000         
1001            zdh(1:ngrid,1:nlayer)=pdt(1:ngrid,1:nlayer)/zpopsk(1:ngrid,1:nlayer)
1002 
1003            call vdifc(ngrid,nlayer,nq,rnat,zpopsk,           &
1004                       ptimestep,capcal,lwrite,               &
1005                       pplay,pplev,zzlay,zzlev,z0,            &
1006                       pu,pv,zh,pq,tsurf,emis,qsurf,          &
1007                       zdh,pdq,zflubid,                       &
1008                       zdudif,zdvdif,zdhdif,zdtsdif,          &
1009                       sensibFlux,q2,zdqdif,zdqsdif,          &
1010                       taux,tauy,lastcall)
1011
1012            zdtdif(1:ngrid,1:nlayer)=zdhdif(1:ngrid,1:nlayer)*zpopsk(1:ngrid,1:nlayer) ! for diagnostic only
1013            zdqevap(1:ngrid,1:nlayer)=0.
1014
1015         end if !end of 'UseTurbDiff'
1016
1017         !!! this is always done, except for turbulence-resolving simulations
1018         if (.not. turb_resolved) then
1019           pdv(1:ngrid,1:nlayer)=pdv(1:ngrid,1:nlayer)+zdvdif(1:ngrid,1:nlayer)
1020           pdu(1:ngrid,1:nlayer)=pdu(1:ngrid,1:nlayer)+zdudif(1:ngrid,1:nlayer)
1021           pdt(1:ngrid,1:nlayer)=pdt(1:ngrid,1:nlayer)+zdtdif(1:ngrid,1:nlayer)
1022           zdtsurf(1:ngrid)=zdtsurf(1:ngrid)+zdtsdif(1:ngrid)
1023         endif
1024
1025         if(ok_slab_ocean)then
1026            flux_sens_lat(1:ngrid)=(zdtsdif(1:ngrid)*capcal(1:ngrid)-fluxrad(1:ngrid))
1027         endif
1028
1029
1030         if (tracer) then
1031           pdq(1:ngrid,1:nlayer,1:nq)=pdq(1:ngrid,1:nlayer,1:nq)+ zdqdif(1:ngrid,1:nlayer,1:nq)
1032           dqsurf(1:ngrid,1:nq)=dqsurf(1:ngrid,1:nq) + zdqsdif(1:ngrid,1:nq)
1033         end if ! of if (tracer)
1034
1035
1036         ! test energy conservation
1037         !-------------------------
1038         if(enertest)then
1039         
1040            dEzdiff(:,:)=cpp*mass(:,:)*zdtdif(:,:)
1041            do ig = 1, ngrid
1042               dEdiff(ig)=SUM(dEzdiff (ig,:))+ sensibFlux(ig)! subtract flux to the ground
1043               dEzdiff(ig,1)= dEzdiff(ig,1)+ sensibFlux(ig)! subtract flux to the ground
1044            enddo
1045           
1046            call planetwide_sumval(dEdiff(:)*cell_area(:)/totarea_planet,dEtot)
1047            dEdiffs(:)=capcal(:)*zdtsdif(:)-zflubid(:)-sensibFlux(:)
1048            call planetwide_sumval(dEdiffs(:)*cell_area(:)/totarea_planet,dEtots)
1049            call planetwide_sumval(sensibFlux(:)*cell_area(:)/totarea_planet,AtmToSurf_TurbFlux)
1050           
1051            if (is_master) then
1052           
1053               if (UseTurbDiff) then
1054                         print*,'In TurbDiff sensible flux (atm=>surf) =',AtmToSurf_TurbFlux,' W m-2'
1055                         print*,'In TurbDiff non-cons atm nrj change   =',dEtot,' W m-2'
1056                  print*,'In TurbDiff (correc rad+latent heat) surf nrj change =',dEtots,' W m-2'
1057               else
1058                         print*,'In vdifc sensible flux (atm=>surf)    =',AtmToSurf_TurbFlux,' W m-2'
1059                         print*,'In vdifc non-cons atm nrj change      =',dEtot,' W m-2'
1060                         print*,'In vdifc (correc rad+latent heat) surf nrj change =',dEtots,' W m-2'
1061               end if
1062            endif ! end of 'is_master'
1063           
1064         ! JL12 : note that the black body radiative flux emitted by the surface has been updated by the implicit scheme but not given back elsewhere.
1065         endif ! end of 'enertest'
1066
1067
1068         ! Test water conservation.
1069         if(watertest.and.water)then
1070         
1071            call planetwide_sumval(massarea(:,:)*zdqdif(:,:,igcm_h2o_vap)*ptimestep/totarea_planet,dWtot_tmp)
1072            call planetwide_sumval(zdqsdif(:,igcm_h2o_vap)*cell_area(:)*ptimestep/totarea_planet,dWtots_tmp)
1073            do ig = 1, ngrid
1074               vdifcncons(ig)=SUM(mass(ig,:)*zdqdif(ig,:,igcm_h2o_vap))
1075            enddo
1076            call planetwide_sumval(massarea(:,:)*zdqdif(:,:,igcm_h2o_ice)*ptimestep/totarea_planet,dWtot)
1077            call planetwide_sumval(zdqsdif(:,igcm_h2o_ice)*cell_area(:)*ptimestep/totarea_planet,dWtots)
1078            dWtot = dWtot + dWtot_tmp
1079            dWtots = dWtots + dWtots_tmp
1080            do ig = 1, ngrid
1081               vdifcncons(ig)=vdifcncons(ig) + SUM(mass(ig,:)*zdqdif(ig,:,igcm_h2o_ice))
1082            enddo           
1083            call planetwide_maxval(vdifcncons(:),nconsMAX)
1084
1085            if (is_master) then
1086               print*,'---------------------------------------------------------------'
1087               print*,'In difv atmospheric water change        =',dWtot,' kg m-2'
1088               print*,'In difv surface water change            =',dWtots,' kg m-2'
1089               print*,'In difv non-cons factor                 =',dWtot+dWtots,' kg m-2'
1090               print*,'In difv MAX non-cons factor             =',nconsMAX,' kg m-2 s-1'
1091            endif
1092
1093         endif ! end of 'watertest'
1094         !-------------------------
1095
1096      else ! calldifv
1097
1098         if(.not.newtonian)then
1099
1100            zdtsurf(1:ngrid) = zdtsurf(1:ngrid) + (fluxrad(1:ngrid) + fluxgrd(1:ngrid))/capcal(1:ngrid)
1101
1102         endif
1103
1104      endif ! end of 'calldifv'
1105
1106
1107!----------------------------------
1108!   IV. Dry convective adjustment :
1109!----------------------------------
1110
1111      if(calladj) then
1112
1113         zdh(1:ngrid,1:nlayer) = pdt(1:ngrid,1:nlayer)/zpopsk(1:ngrid,1:nlayer)
1114         zduadj(1:ngrid,1:nlayer)=0.0
1115         zdvadj(1:ngrid,1:nlayer)=0.0
1116         zdhadj(1:ngrid,1:nlayer)=0.0
1117
1118
1119         call convadj(ngrid,nlayer,nq,ptimestep,            &
1120                      pplay,pplev,zpopsk,                   &
1121                      pu,pv,zh,pq,                          &
1122                      pdu,pdv,zdh,pdq,                      &
1123                      zduadj,zdvadj,zdhadj,                 &
1124                      zdqadj)
1125
1126         pdu(1:ngrid,1:nlayer) = pdu(1:ngrid,1:nlayer) + zduadj(1:ngrid,1:nlayer)
1127         pdv(1:ngrid,1:nlayer) = pdv(1:ngrid,1:nlayer) + zdvadj(1:ngrid,1:nlayer)
1128         pdt(1:ngrid,1:nlayer)    = pdt(1:ngrid,1:nlayer) + zdhadj(1:ngrid,1:nlayer)*zpopsk(1:ngrid,1:nlayer)
1129         zdtadj(1:ngrid,1:nlayer) = zdhadj(1:ngrid,1:nlayer)*zpopsk(1:ngrid,1:nlayer) ! for diagnostic only
1130
1131         if(tracer) then
1132            pdq(1:ngrid,1:nlayer,1:nq) = pdq(1:ngrid,1:nlayer,1:nq) + zdqadj(1:ngrid,1:nlayer,1:nq)
1133         end if
1134
1135         ! Test energy conservation
1136         if(enertest)then
1137            call planetwide_sumval(cpp*massarea(:,:)*zdtadj(:,:)/totarea_planet,dEtot)
1138            if (is_master) print*,'In convadj atmospheric energy change  =',dEtot,' W m-2'
1139         endif
1140
1141         ! Test water conservation
1142         if(watertest)then
1143            call planetwide_sumval(massarea(:,:)*zdqadj(:,:,igcm_h2o_vap)*ptimestep/totarea_planet,dWtot_tmp)
1144            do ig = 1, ngrid
1145               cadjncons(ig)=SUM(mass(ig,:)*zdqadj(ig,:,igcm_h2o_vap))
1146            enddo
1147            call planetwide_sumval(massarea(:,:)*zdqadj(:,:,igcm_h2o_ice)*ptimestep/totarea_planet,dWtot)
1148            dWtot = dWtot + dWtot_tmp
1149            do ig = 1, ngrid
1150               cadjncons(ig)=cadjncons(ig) + SUM(mass(ig,:)*zdqadj(ig,:,igcm_h2o_ice))
1151            enddo           
1152            call planetwide_maxval(cadjncons(:),nconsMAX)
1153
1154            if (is_master) then
1155               print*,'In convadj atmospheric water change     =',dWtot,' kg m-2'
1156               print*,'In convadj MAX non-cons factor          =',nconsMAX,' kg m-2 s-1'
1157            endif
1158           
1159         endif ! end of 'watertest'
1160         
1161      endif ! end of 'calladj'
1162
1163!-----------------------------------------------
1164!   V. Carbon dioxide condensation-sublimation :
1165!-----------------------------------------------
1166
1167      if (co2cond) then
1168     
1169         if (.not.tracer) then
1170            print*,'We need a CO2 ice tracer to condense CO2'
1171            call abort
1172         endif
1173         call condense_co2(ngrid,nlayer,nq,ptimestep,                    &
1174                           capcal,pplay,pplev,tsurf,pt,                  &
1175                           pdt,zdtsurf,pq,pdq,                           &
1176                           qsurf,zdqsurfc,albedo,emis,                   &
1177                           albedo_bareground,albedo_co2_ice_SPECTV,      &
1178                           zdtc,zdtsurfc,pdpsrf,zdqc)
1179
1180         pdt(1:ngrid,1:nlayer) = pdt(1:ngrid,1:nlayer)+zdtc(1:ngrid,1:nlayer)
1181         zdtsurf(1:ngrid)      = zdtsurf(1:ngrid) + zdtsurfc(1:ngrid)
1182
1183         pdq(1:ngrid,1:nlayer,1:nq)   = pdq(1:ngrid,1:nlayer,1:nq)+ zdqc(1:ngrid,1:nlayer,1:nq)
1184         dqsurf(1:ngrid,igcm_co2_ice) = dqsurf(1:ngrid,igcm_co2_ice) + zdqsurfc(1:ngrid)
1185
1186         ! test energy conservation
1187         if(enertest)then
1188            call planetwide_sumval(cpp*massarea(:,:)*zdtc(:,:)/totarea_planet,dEtot)
1189            call planetwide_sumval(capcal(:)*zdtsurfc(:)*cell_area(:)/totarea_planet,dEtots)
1190            if (is_master) then
1191               print*,'In co2cloud atmospheric energy change   =',dEtot,' W m-2'
1192               print*,'In co2cloud surface energy change       =',dEtots,' W m-2'
1193            endif
1194         endif
1195
1196      endif  ! end of 'co2cond'
1197
1198
1199!---------------------------------------------
1200!   VI. Specific parameterizations for tracers
1201!---------------------------------------------
1202
1203      if (tracer) then
1204     
1205  ! ---------------------
1206  !   VI.1. Water and ice
1207  ! ---------------------
1208         if (water) then
1209
1210            ! Water ice condensation in the atmosphere
1211            if(watercond.and.(RLVTT.gt.1.e-8))then
1212
1213               dqmoist(1:ngrid,1:nlayer,1:nq)=0.
1214               dtmoist(1:ngrid,1:nlayer)=0.
1215               
1216               ! Moist Convective Adjustment.
1217               ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1218               call moistadj(ngrid,nlayer,nq,pt,pq,pdq,pplev,pplay,dtmoist,dqmoist,ptimestep,rneb_man)
1219
1220               pdq(1:ngrid,1:nlayer,igcm_h2o_vap) = pdq(1:ngrid,1:nlayer,igcm_h2o_vap)     &
1221                                                  + dqmoist(1:ngrid,1:nlayer,igcm_h2o_vap)
1222               pdq(1:ngrid,1:nlayer,igcm_h2o_ice) = pdq(1:ngrid,1:nlayer,igcm_h2o_ice)     &
1223                                                  + dqmoist(1:ngrid,1:nlayer,igcm_h2o_ice)
1224               pdt(1:ngrid,1:nlayer) = pdt(1:ngrid,1:nlayer)+dtmoist(1:ngrid,1:nlayer)
1225
1226               ! Test energy conservation.
1227               if(enertest)then
1228               
1229                  call planetwide_sumval(cpp*massarea(:,:)*dtmoist(:,:)/totarea_planet,dEtot)
1230                  call planetwide_maxval(dtmoist(:,:),dtmoist_max)
1231                  call planetwide_minval(dtmoist(:,:),dtmoist_min)
1232                  madjdEz(:,:)=cpp*mass(:,:)*dtmoist(:,:)
1233                  do ig=1,ngrid
1234                     madjdE(ig) = cpp*SUM(mass(:,:)*dtmoist(:,:))
1235                  enddo
1236                 
1237                  if (is_master) then
1238                     print*,'In moistadj atmospheric energy change   =',dEtot,' W m-2'
1239                     print*,'In moistadj MAX atmospheric energy change   =',dtmoist_max*ptimestep,'K/step'
1240                     print*,'In moistadj MIN atmospheric energy change   =',dtmoist_min*ptimestep,'K/step'
1241                  endif
1242                 
1243                  call planetwide_sumval(massarea(:,:)*dqmoist(:,:,igcm_h2o_vap)*ptimestep/totarea_planet+        &
1244                                           massarea(:,:)*dqmoist(:,:,igcm_h2o_ice)*ptimestep/totarea_planet,dWtot)
1245                  if (is_master) print*,'In moistadj atmospheric water change    =',dWtot,' kg m-2'
1246                 
1247               endif ! end of 'enertest'
1248               
1249
1250               ! Large scale condensation/evaporation.
1251               ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1252               call largescale(ngrid,nlayer,nq,ptimestep,pplev,pplay,pt,pq,pdt,pdq,dtlscale,dqvaplscale,dqcldlscale,rneb_lsc)
1253
1254               pdt(1:ngrid,1:nlayer) = pdt(1:ngrid,1:nlayer)+dtlscale(1:ngrid,1:nlayer)
1255               pdq(1:ngrid,1:nlayer,igcm_h2o_vap) = pdq(1:ngrid,1:nlayer,igcm_h2o_vap)+dqvaplscale(1:ngrid,1:nlayer)
1256               pdq(1:ngrid,1:nlayer,igcm_h2o_ice) = pdq(1:ngrid,1:nlayer,igcm_h2o_ice)+dqcldlscale(1:ngrid,1:nlayer)
1257
1258               ! Test energy conservation.
1259               if(enertest)then
1260                  lscaledEz(:,:) = cpp*mass(:,:)*dtlscale(:,:)
1261                  do ig=1,ngrid
1262                     lscaledE(ig) = cpp*SUM(mass(:,:)*dtlscale(:,:))
1263                  enddo
1264                  call planetwide_sumval(cpp*massarea(:,:)*dtlscale(:,:)/totarea_planet,dEtot)
1265
1266                  if (is_master) print*,'In largescale atmospheric energy change =',dEtot,' W m-2'
1267
1268                  ! Test water conservation.
1269                  call planetwide_sumval(massarea(:,:)*dqvaplscale(:,:)*ptimestep/totarea_planet+        &
1270                                           SUM(massarea(:,:)*dqcldlscale(:,:))*ptimestep/totarea_planet,dWtot)
1271                       
1272                  if (is_master) print*,'In largescale atmospheric water change  =',dWtot,' kg m-2'
1273               endif ! end of 'enertest'
1274
1275               ! Compute cloud fraction.
1276               do l = 1, nlayer
1277                  do ig=1,ngrid
1278                     cloudfrac(ig,l)=MAX(rneb_lsc(ig,l),rneb_man(ig,l))
1279                  enddo
1280               enddo
1281
1282            endif ! end of 'watercond'
1283           
1284            ! Water ice / liquid precipitation.
1285            ! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1286            if(waterrain)then
1287
1288               zdqrain(1:ngrid,1:nlayer,1:nq) = 0.0
1289               zdqsrain(1:ngrid)    = 0.0
1290               zdqssnow(1:ngrid)    = 0.0
1291
1292               call rain(ngrid,nlayer,nq,ptimestep,pplev,pplay,pt,pdt,pq,pdq,            &
1293                         zdtrain,zdqrain,zdqsrain,zdqssnow,reevap_precip,cloudfrac)
1294
1295               pdq(1:ngrid,1:nlayer,igcm_h2o_vap) = pdq(1:ngrid,1:nlayer,igcm_h2o_vap) &
1296                                                  + zdqrain(1:ngrid,1:nlayer,igcm_h2o_vap)
1297               pdq(1:ngrid,1:nlayer,igcm_h2o_ice) = pdq(1:ngrid,1:nlayer,igcm_h2o_ice) &
1298                                                  + zdqrain(1:ngrid,1:nlayer,igcm_h2o_ice)
1299               pdt(1:ngrid,1:nlayer) = pdt(1:ngrid,1:nlayer)+zdtrain(1:ngrid,1:nlayer)
1300               
1301               dqsurf(1:ngrid,igcm_h2o_vap) = dqsurf(1:ngrid,igcm_h2o_vap)+zdqsrain(1:ngrid)
1302               dqsurf(1:ngrid,igcm_h2o_ice) = dqsurf(1:ngrid,igcm_h2o_ice)+zdqssnow(1:ngrid)
1303
1304               ! Test energy conservation.
1305               if(enertest)then
1306               
1307                  call planetwide_sumval(cpp*massarea(:,:)*zdtrain(:,:)/totarea_planet,dEtot)
1308                  if (is_master) print*,'In rain atmospheric T energy change       =',dEtot,' W m-2'
1309                  call planetwide_sumval(massarea(:,:)*zdqrain(:,:,igcm_h2o_ice)/totarea_planet*RLVTT/cpp,dItot_tmp)
1310                  call planetwide_sumval(cell_area(:)*zdqssnow(:)/totarea_planet*RLVTT/cpp,dItot)
1311                  dItot = dItot + dItot_tmp
1312                  call planetwide_sumval(massarea(:,:)*zdqrain(:,:,igcm_h2o_vap)*ptimestep/totarea_planet,dVtot_tmp)
1313                  call planetwide_sumval(cell_area(:)*zdqsrain(:)/totarea_planet*RLVTT/cpp,dVtot)
1314                  dVtot = dVtot + dVtot_tmp
1315                  dEtot = dItot + dVtot
1316                 
1317                  if (is_master) then
1318                     print*,'In rain dItot =',dItot,' W m-2'
1319                     print*,'In rain dVtot =',dVtot,' W m-2'
1320                     print*,'In rain atmospheric L energy change       =',dEtot,' W m-2'
1321                  endif
1322
1323                  ! Test water conservation
1324                  call planetwide_sumval(massarea(:,:)*zdqrain(:,:,igcm_h2o_vap)*ptimestep/totarea_planet+        &
1325                          massarea(:,:)*zdqrain(:,:,igcm_h2o_ice)*ptimestep/totarea_planet,dWtot)
1326                  call planetwide_sumval((zdqsrain(:)+zdqssnow(:))*cell_area(:)*ptimestep/totarea_planet,dWtots)
1327                 
1328                  if (is_master) then
1329                          print*,'In rain atmospheric water change        =',dWtot,' kg m-2'
1330                          print*,'In rain surface water change            =',dWtots,' kg m-2'
1331                          print*,'In rain non-cons factor                 =',dWtot+dWtots,' kg m-2'
1332                  endif
1333                 
1334               endif ! end of 'enertest'
1335
1336            end if ! enf of 'waterrain'
1337           
1338         end if ! end of 'water'
1339
1340 ! -------------------------
1341  !   VI.2. Photochemistry
1342  ! -------------------------
1343
1344         IF (photochem) then
1345
1346             DO ig=1,ngrid
1347               array_zero1(ig)=0.0
1348               DO l=1,nlayer
1349                 array_zero2(ig,l)=0.
1350               ENDDO
1351             ENDDO
1352
1353            call calchim_asis(ngrid,nlayer,nq,                          &
1354                        ptimestep,pplay,pplev,pt,pdt,dist_star,mu0,     &
1355                        fract,zzlev,zzlay,zday,pq,pdq,zdqchim,zdqschim, &
1356                        array_zero1,array_zero1,                        &
1357                        pu,pdu,pv,pdv,array_zero2,array_zero2)
1358
1359           ! increment values of tracers:
1360           DO iq=1,nq ! loop on all tracers; tendencies for non-chemistry
1361                      ! tracers is zero anyways
1362             DO l=1,nlayer
1363               DO ig=1,ngrid
1364                 pdq(ig,l,iq)=pdq(ig,l,iq)+zdqchim(ig,l,iq)
1365               ENDDO
1366             ENDDO
1367           ENDDO ! of DO iq=1,nq
1368
1369
1370           ! increment surface values of tracers:
1371           DO iq=1,nq ! loop on all tracers; tendencies for non-chemistry
1372                      ! tracers is zero anyways
1373             DO ig=1,ngrid
1374!               dqsurf(ig,iq)=dqsurf(ig,iq)+zdqschim(ig,iq)
1375             ENDDO
1376           ENDDO ! of DO iq=1,nq
1377
1378         END IF  ! of IF (photochem)
1379
1380
1381
1382  ! -------------------------
1383  !   VI.3. Aerosol particles
1384  ! -------------------------
1385
1386         ! Sedimentation.
1387         if (sedimentation) then
1388       
1389            zdqsed(1:ngrid,1:nlayer,1:nq) = 0.0
1390            zdqssed(1:ngrid,1:nq)  = 0.0
1391
1392            if(watertest)then
1393           
1394               iq=igcm_h2o_ice
1395               call planetwide_sumval(massarea(:,:)*pq(:,:,iq)*ptimestep/totarea_planet,dWtot)
1396               call planetwide_sumval(massarea(:,:)*pdq(:,:,iq)*ptimestep/totarea_planet,dWtots)
1397               if (is_master) then
1398                        print*,'Before sedim pq  =',dWtot,' kg m-2'
1399                  print*,'Before sedim pdq =',dWtots,' kg m-2'
1400               endif
1401            endif
1402           
1403            call callsedim(ngrid,nlayer,ptimestep,           &
1404                          pplev,zzlev,pt,pdt,pq,pdq,        &
1405                          zdqsed,zdqssed,nq)
1406
1407            if(watertest)then
1408               iq=igcm_h2o_ice
1409               call planetwide_sumval(massarea(:,:)*pq(:,:,iq)*ptimestep/totarea_planet,dWtot)
1410               call planetwide_sumval(massarea(:,:)*pdq(:,:,iq)*ptimestep/totarea_planet,dWtots)
1411               if (is_master) then
1412                        print*,'After sedim pq  =',dWtot,' kg m-2'
1413                        print*,'After sedim pdq =',dWtots,' kg m-2'
1414                 endif
1415            endif
1416
1417            ! Whether it falls as rain or snow depends only on the surface temperature
1418            pdq(1:ngrid,1:nlayer,1:nq) = pdq(1:ngrid,1:nlayer,1:nq) + zdqsed(1:ngrid,1:nlayer,1:nq)
1419            dqsurf(1:ngrid,1:nq) = dqsurf(1:ngrid,1:nq) + zdqssed(1:ngrid,1:nq)
1420
1421            ! Test water conservation
1422            if(watertest)then
1423               call planetwide_sumval(massarea(:,:)*(zdqsed(:,:,igcm_h2o_vap)+zdqsed(:,:,igcm_h2o_ice))*ptimestep/totarea_planet,dWtot)
1424               call planetwide_sumval((zdqssed(:,igcm_h2o_vap)+zdqssed(:,igcm_h2o_ice))*cell_area(:)*ptimestep/totarea_planet,dWtots)
1425               if (is_master) then
1426                        print*,'In sedim atmospheric ice change         =',dWtot,' kg m-2'
1427                        print*,'In sedim surface ice change             =',dWtots,' kg m-2'
1428                        print*,'In sedim non-cons factor                =',dWtot+dWtots,' kg m-2'
1429               endif
1430            endif
1431
1432         end if ! end of 'sedimentation'
1433
1434
1435  ! ---------------
1436  !   VI.4. Updates
1437  ! ---------------
1438
1439         ! Updating Atmospheric Mass and Tracers budgets.
1440         if(mass_redistrib) then
1441
1442            zdmassmr(1:ngrid,1:nlayer) = mass(1:ngrid,1:nlayer) *     &
1443               (   zdqevap(1:ngrid,1:nlayer)                          &
1444                 + zdqrain(1:ngrid,1:nlayer,igcm_h2o_vap)             &
1445                 + dqmoist(1:ngrid,1:nlayer,igcm_h2o_vap)             &
1446                 + dqvaplscale(1:ngrid,1:nlayer) )
1447
1448            do ig = 1, ngrid
1449               zdmassmr_col(ig)=SUM(zdmassmr(ig,1:nlayer))
1450            enddo
1451           
1452            call writediagfi(ngrid,"mass_evap","mass gain"," ",3,zdmassmr)
1453            call writediagfi(ngrid,"mass_evap_col","mass gain col"," ",2,zdmassmr_col)
1454            call writediagfi(ngrid,"mass","mass","kg/m2",3,mass)
1455
1456            call mass_redistribution(ngrid,nlayer,nq,ptimestep,                     &
1457                                     rnat,capcal,pplay,pplev,pt,tsurf,pq,qsurf,     &
1458                                     pu,pv,pdt,zdtsurf,pdq,pdu,pdv,zdmassmr,        &
1459                                     zdtmr,zdtsurfmr,zdpsrfmr,zdumr,zdvmr,zdqmr,zdqsurfmr)
1460         
1461            pdq(1:ngrid,1:nlayer,1:nq) = pdq(1:ngrid,1:nlayer,1:nq) + zdqmr(1:ngrid,1:nlayer,1:nq)
1462            dqsurf(1:ngrid,1:nq)       = dqsurf(1:ngrid,1:nq) + zdqsurfmr(1:ngrid,1:nq)
1463            pdt(1:ngrid,1:nlayer)      = pdt(1:ngrid,1:nlayer) + zdtmr(1:ngrid,1:nlayer)
1464            pdu(1:ngrid,1:nlayer)      = pdu(1:ngrid,1:nlayer) + zdumr(1:ngrid,1:nlayer)
1465            pdv(1:ngrid,1:nlayer)      = pdv(1:ngrid,1:nlayer) + zdvmr(1:ngrid,1:nlayer)
1466            pdpsrf(1:ngrid)            = pdpsrf(1:ngrid) + zdpsrfmr(1:ngrid)
1467            zdtsurf(1:ngrid)           = zdtsurf(1:ngrid) + zdtsurfmr(1:ngrid)
1468           
1469         endif
1470
1471  ! ------------------
1472  !   VI.5. Slab Ocean
1473  ! ------------------
1474
1475         if (ok_slab_ocean)then
1476
1477            do ig=1,ngrid
1478               qsurfint(:,igcm_h2o_ice)=qsurf(:,igcm_h2o_ice)
1479            enddo
1480
1481            call ocean_slab_ice(ptimestep,                          &
1482                                ngrid, knindex, tsea_ice, fluxrad,  &
1483                                zdqssnow, qsurf(:,igcm_h2o_ice),    &
1484                              - zdqsdif(:,igcm_h2o_vap),            &
1485                                flux_sens_lat,tsea_ice, pctsrf_sic, &
1486                                taux,tauy,icount)
1487
1488
1489            call ocean_slab_get_vars(ngrid,tslab,      &
1490                                     sea_ice, flux_o,  &
1491                                     flux_g, dt_hdiff, &
1492                                     dt_ekman)
1493   
1494            do ig=1,ngrid
1495               if (nint(rnat(ig)).eq.1)then
1496                  tslab(ig,1) = 0.
1497                  tslab(ig,2) = 0.
1498                  tsea_ice(ig) = 0.
1499                  sea_ice(ig) = 0.
1500                  pctsrf_sic(ig) = 0.
1501                  qsurf(ig,igcm_h2o_ice) = qsurfint(ig,igcm_h2o_ice)
1502               endif
1503            enddo
1504
1505         endif ! end of 'ok_slab_ocean'
1506
1507  ! -----------------------------
1508  !   VI.6. Surface Tracer Update
1509  ! -----------------------------
1510
1511         if(hydrology)then
1512           
1513            call hydrol(ngrid,nq,ptimestep,rnat,tsurf,qsurf,dqsurf,dqs_hyd, &
1514                        capcal,albedo,albedo_bareground,                    &
1515                        albedo_snow_SPECTV,albedo_co2_ice_SPECTV,           &
1516                        mu0,zdtsurf,zdtsurf_hyd,hice,pctsrf_sic,            &
1517                        sea_ice)
1518
1519            zdtsurf(1:ngrid)     = zdtsurf(1:ngrid) + zdtsurf_hyd(1:ngrid)
1520            dqsurf(1:ngrid,1:nq) = dqsurf(1:ngrid,1:nq) + dqs_hyd(1:ngrid,1:nq)
1521           
1522            qsurf(1:ngrid,1:nq) = qsurf(1:ngrid,1:nq) + ptimestep*dqsurf(1:ngrid,1:nq)
1523
1524            ! Test energy conservation
1525            if(enertest)then
1526               call planetwide_sumval(cell_area(:)*capcal(:)*zdtsurf_hyd(:)/totarea_planet,dEtots)
1527               if (is_master) print*,'In hydrol surface energy change     =',dEtots,' W m-2'
1528            endif
1529
1530            ! test water conservation
1531            if(watertest)then
1532               call planetwide_sumval(dqs_hyd(:,igcm_h2o_ice)*cell_area(:)*ptimestep/totarea_planet,dWtots)
1533               if (is_master) print*,'In hydrol surface ice change            =',dWtots,' kg m-2'
1534                  call planetwide_sumval(dqs_hyd(:,igcm_h2o_vap)*cell_area(:)*ptimestep/totarea_planet,dWtots)
1535               if (is_master) then
1536                  print*,'In hydrol surface water change          =',dWtots,' kg m-2'
1537                  print*,'---------------------------------------------------------------'
1538               endif
1539            endif
1540
1541         else ! of if (hydrology)
1542
1543            qsurf(1:ngrid,1:nq) = qsurf(1:ngrid,1:nq) + ptimestep*dqsurf(1:ngrid,1:nq)
1544
1545         end if ! of if (hydrology)
1546
1547         ! Add qsurf to qsurf_hist, which is what we save in diagfi.nc. At the same time, we set the water
1548         ! content of ocean gridpoints back to zero, in order to avoid rounding errors in vdifc, rain.
1549         qsurf_hist(:,:) = qsurf(:,:)
1550
1551         if(ice_update)then
1552            ice_min(1:ngrid)=min(ice_min(1:ngrid),qsurf(1:ngrid,igcm_h2o_ice))
1553         endif
1554
1555      endif! end of if 'tracer'
1556
1557
1558!------------------------------------------------
1559!   VII. Surface and sub-surface soil temperature
1560!------------------------------------------------
1561
1562
1563      ! Increment surface temperature
1564      if(ok_slab_ocean)then
1565         do ig=1,ngrid
1566           if (nint(rnat(ig)).eq.0)then
1567             zdtsurf(ig)= (tslab(ig,1)              &
1568             + pctsrf_sic(ig)*(tsea_ice(ig)-tslab(ig,1))-tsurf(ig))/ptimestep
1569           endif
1570           tsurf(ig)=tsurf(ig)+ptimestep*zdtsurf(ig)
1571         enddo
1572   
1573      else
1574        tsurf(1:ngrid)=tsurf(1:ngrid)+ptimestep*zdtsurf(1:ngrid)
1575      endif ! end of 'ok_slab_ocean'
1576
1577
1578      ! Compute soil temperatures and subsurface heat flux.
1579      if (callsoil) then
1580         call soil(ngrid,nsoilmx,.false.,lastcall,inertiedat,   &
1581                   ptimestep,tsurf,tsoil,capcal,fluxgrd)     
1582      endif
1583
1584
1585      if (ok_slab_ocean) then
1586     
1587         do ig=1,ngrid
1588         
1589            fluxgrdocean(ig)=fluxgrd(ig)
1590            if (nint(rnat(ig)).eq.0) then
1591               capcal(ig)=capcalocean
1592               fluxgrd(ig)=0.
1593               fluxgrdocean(ig)=pctsrf_sic(ig)*flux_g(ig)+(1-pctsrf_sic(ig))*(dt_hdiff(ig,1)+dt_ekman(ig,1))
1594               do iq=1,nsoilmx
1595                  tsoil(ig,iq)=tsurf(ig)
1596               enddo
1597               if (pctsrf_sic(ig).gt.0.5) then
1598                  capcal(ig)=capcalseaice
1599                  if (qsurf(ig,igcm_h2o_ice).gt.0.) then
1600                     capcal(ig)=capcalsno
1601                  endif
1602               endif               
1603            endif
1604           
1605         enddo
1606         
1607      endif !end of 'ok_slab_ocean'
1608
1609
1610      ! Test energy conservation
1611      if(enertest)then
1612         call planetwide_sumval(cell_area(:)*capcal(:)*zdtsurf(:)/totarea_planet,dEtots)         
1613         if (is_master) print*,'Surface energy change                 =',dEtots,' W m-2'
1614      endif
1615
1616
1617!---------------------------------------------------
1618!   VIII. Perform diagnostics and write output files
1619!---------------------------------------------------
1620
1621      ! Note : For output only: the actual model integration is performed in the dynamics.
1622
1623
1624 
1625      ! Temperature, zonal and meridional winds.
1626      zt(1:ngrid,1:nlayer) = pt(1:ngrid,1:nlayer) + pdt(1:ngrid,1:nlayer)*ptimestep
1627      zu(1:ngrid,1:nlayer) = pu(1:ngrid,1:nlayer) + pdu(1:ngrid,1:nlayer)*ptimestep
1628      zv(1:ngrid,1:nlayer) = pv(1:ngrid,1:nlayer) + pdv(1:ngrid,1:nlayer)*ptimestep
1629
1630      ! Diagnostic.
1631      zdtdyn(1:ngrid,1:nlayer)     = (pt(1:ngrid,1:nlayer)-ztprevious(1:ngrid,1:nlayer)) / ptimestep
1632      ztprevious(1:ngrid,1:nlayer) = zt(1:ngrid,1:nlayer)
1633
1634      zdudyn(1:ngrid,1:nlayer)     = (pu(1:ngrid,1:nlayer)-zuprevious(1:ngrid,1:nlayer)) / ptimestep
1635      zuprevious(1:ngrid,1:nlayer) = zu(1:ngrid,1:nlayer)
1636
1637      if(firstcall)then
1638         zdtdyn(1:ngrid,1:nlayer)=0.0
1639         zdudyn(1:ngrid,1:nlayer)=0.0
1640      endif
1641
1642      ! Dynamical heating diagnostic.
1643      do ig=1,ngrid
1644         fluxdyn(ig)= SUM(zdtdyn(ig,:) *mass(ig,:))*cpp
1645      enddo
1646
1647      ! Tracers.
1648      zq(1:ngrid,1:nlayer,1:nq) = pq(1:ngrid,1:nlayer,1:nq) + pdq(1:ngrid,1:nlayer,1:nq)*ptimestep
1649
1650      ! Surface pressure.
1651      ps(1:ngrid) = pplev(1:ngrid,1) + pdpsrf(1:ngrid)*ptimestep
1652
1653
1654
1655      ! Surface and soil temperature information
1656      call planetwide_sumval(cell_area(:)*tsurf(:)/totarea_planet,Ts1)
1657      call planetwide_minval(tsurf(:),Ts2)
1658      call planetwide_maxval(tsurf(:),Ts3)
1659      if(callsoil)then
1660         TsS = SUM(cell_area(:)*tsoil(:,nsoilmx))/totarea        ! mean temperature at bottom soil layer
1661         if (is_master) then
1662            print*,'          ave[Tsurf]             min[Tsurf]             max[Tsurf]             ave[Tdeep]'
1663            print*,Ts1,Ts2,Ts3,TsS
1664         end if
1665      else
1666         if (is_master) then
1667            print*,'          ave[Tsurf]             min[Tsurf]             max[Tsurf]'
1668            print*,Ts1,Ts2,Ts3
1669         endif
1670      end if
1671
1672
1673      ! Check the energy balance of the simulation during the run
1674      if(corrk)then
1675
1676         call planetwide_sumval(cell_area(:)*fluxtop_dn(:)/totarea_planet,ISR)
1677         call planetwide_sumval(cell_area(:)*fluxabs_sw(:)/totarea_planet,ASR)
1678         call planetwide_sumval(cell_area(:)*fluxtop_lw(:)/totarea_planet,OLR)
1679         call planetwide_sumval(cell_area(:)*fluxgrd(:)/totarea_planet,GND)
1680         call planetwide_sumval(cell_area(:)*fluxdyn(:)/totarea_planet,DYN)
1681         do ig=1,ngrid
1682            if(fluxtop_dn(ig).lt.0.0)then
1683               print*,'fluxtop_dn has gone crazy'
1684               print*,'fluxtop_dn=',fluxtop_dn(ig)
1685               print*,'tau_col=',tau_col(ig)
1686               print*,'aerosol=',aerosol(ig,:,:)
1687               print*,'temp=   ',pt(ig,:)
1688               print*,'pplay=  ',pplay(ig,:)
1689               call abort
1690            endif
1691         end do
1692                     
1693         if(ngrid.eq.1)then
1694            DYN=0.0
1695         endif
1696         
1697         if (is_master) then
1698            print*,'  ISR            ASR            OLR            GND            DYN [W m^-2]'
1699            print*, ISR,ASR,OLR,GND,DYN
1700         endif
1701
1702         if(enertest .and. is_master)then
1703            print*,'SW flux/heating difference SW++ - ASR = ',dEtotSW+dEtotsSW-ASR,' W m-2'
1704            print*,'LW flux/heating difference LW++ - OLR = ',dEtotLW+dEtotsLW+OLR,' W m-2'
1705            print*,'LW energy balance LW++ + ASR = ',dEtotLW+dEtotsLW+ASR,' W m-2'
1706         endif
1707
1708         if(meanOLR .and. is_master)then
1709            if((ngrid.gt.1) .or. (mod(icount-1,ecritphy).eq.0))then
1710               ! to record global radiative balance
1711               open(92,file="rad_bal.out",form='formatted',position='append')
1712               write(92,*) zday,ISR,ASR,OLR
1713               close(92)
1714               open(93,file="tem_bal.out",form='formatted',position='append')
1715               if(callsoil)then
1716                         write(93,*) zday,Ts1,Ts2,Ts3,TsS
1717               else
1718                  write(93,*) zday,Ts1,Ts2,Ts3
1719               endif
1720               close(93)
1721            endif
1722         endif
1723
1724      endif ! end of 'corrk'
1725
1726
1727      ! Diagnostic to test radiative-convective timescales in code.
1728      if(testradtimes)then
1729         open(38,file="tau_phys.out",form='formatted',position='append')
1730         ig=1
1731         do l=1,nlayer
1732            write(38,*) -1./pdt(ig,l),pt(ig,l),pplay(ig,l)
1733         enddo
1734         close(38)
1735         print*,'As testradtimes enabled,'
1736         print*,'exiting physics on first call'
1737         call abort
1738      endif
1739
1740
1741      ! Compute column amounts (kg m-2) if tracers are enabled.
1742      if(tracer)then
1743         qcol(1:ngrid,1:nq)=0.0
1744         do iq=1,nq
1745            do ig=1,ngrid
1746               qcol(ig,iq) = SUM( zq(ig,1:nlayer,iq) * mass(ig,1:nlayer))
1747            enddo
1748         enddo
1749
1750         ! Generalised for arbitrary aerosols now. By LK
1751         reffcol(1:ngrid,1:naerkind)=0.0
1752         if(co2cond.and.(iaero_co2.ne.0))then
1753            call co2_reffrad(ngrid,nlayer,nq,zq,reffrad(1,1,iaero_co2))
1754            do ig=1,ngrid
1755               reffcol(ig,iaero_co2) = SUM(zq(ig,1:nlayer,igcm_co2_ice)*reffrad(ig,1:nlayer,iaero_co2)*mass(ig,1:nlayer))
1756            enddo
1757         endif
1758         if(water.and.(iaero_h2o.ne.0))then
1759            call h2o_reffrad(ngrid,nlayer,zq(1,1,igcm_h2o_ice),zt, &
1760                             reffrad(1,1,iaero_h2o),nueffrad(1,1,iaero_h2o))
1761            do ig=1,ngrid
1762               reffcol(ig,iaero_h2o) = SUM(zq(ig,1:nlayer,igcm_h2o_ice)*reffrad(ig,1:nlayer,iaero_h2o)*mass(ig,1:nlayer))
1763            enddo
1764         endif
1765
1766      endif ! end of 'tracer'
1767
1768
1769      ! Test for water conservation.
1770      if(water)then
1771
1772         call planetwide_sumval(cell_area(:)*qsurf_hist(:,igcm_h2o_ice)/totarea_planet,icesrf)
1773         call planetwide_sumval(cell_area(:)*qsurf_hist(:,igcm_h2o_vap)/totarea_planet,liqsrf)
1774         call planetwide_sumval(cell_area(:)*qcol(:,igcm_h2o_ice)/totarea_planet,icecol)
1775         call planetwide_sumval(cell_area(:)*qcol(:,igcm_h2o_vap)/totarea_planet,vapcol)
1776
1777         h2otot = icesrf + liqsrf + icecol + vapcol
1778         
1779         if (is_master) then
1780            print*,' Total water amount [kg m^-2]: ',h2otot
1781            print*,' Surface ice    Surface liq.   Atmos. con.     Atmos. vap. [kg m^-2] '
1782            print*, icesrf,liqsrf,icecol,vapcol
1783         endif
1784
1785         if(meanOLR .and. is_master)then
1786            if((ngrid.gt.1) .or. (mod(icount-1,ecritphy).eq.0))then
1787               ! to record global water balance
1788               open(98,file="h2o_bal.out",form='formatted',position='append')
1789               write(98,*) zday,icesrf,liqsrf,icecol,vapcol
1790               close(98)
1791            endif
1792         endif
1793
1794      endif
1795
1796
1797      ! Calculate RH (Relative Humidity) for diagnostic.
1798      if(water)then
1799     
1800         do l = 1, nlayer
1801            do ig=1,ngrid
1802               call Psat_water(zt(ig,l),pplay(ig,l),psat_tmp,qsat(ig,l))
1803               RH(ig,l) = zq(ig,l,igcm_h2o_vap) / qsat(ig,l)
1804            enddo
1805         enddo
1806
1807         ! Compute maximum possible H2O column amount (100% saturation).
1808         do ig=1,ngrid
1809            H2Omaxcol(ig) = SUM( qsat(ig,:) * mass(ig,:))
1810         enddo
1811
1812      endif ! end of 'water'
1813
1814
1815      if (is_master) print*,'--> Ls =',zls*180./pi
1816     
1817     
1818!----------------------------------------------------------------------
1819!        Writing NetCDF file  "RESTARTFI" at the end of the run
1820!----------------------------------------------------------------------
1821
1822!        Note: 'restartfi' is stored just before dynamics are stored
1823!              in 'restart'. Between now and the writting of 'restart',
1824!              there will have been the itau=itau+1 instruction and
1825!              a reset of 'time' (lastacll = .true. when itau+1= itaufin)
1826!              thus we store for time=time+dtvr
1827
1828
1829
1830      if(lastcall) then
1831         ztime_fin = ptime + ptimestep/(float(iphysiq)*daysec)
1832
1833         ! Update surface ice distribution to iterate to steady state if requested
1834         if(ice_update)then
1835
1836            do ig=1,ngrid
1837
1838               delta_ice = (qsurf(ig,igcm_h2o_ice)-ice_initial(ig))
1839               
1840               ! add multiple years of evolution
1841               qsurf_hist(ig,igcm_h2o_ice) = qsurf_hist(ig,igcm_h2o_ice) + delta_ice*icetstep
1842
1843               ! if ice has gone -ve, set to zero
1844               if(qsurf_hist(ig,igcm_h2o_ice).lt.0.0)then
1845                  qsurf_hist(ig,igcm_h2o_ice) = 0.0
1846               endif
1847
1848               ! if ice is seasonal, set to zero (NEW)
1849               if(ice_min(ig).lt.0.01)then
1850                  qsurf_hist(ig,igcm_h2o_ice) = 0.0
1851               endif
1852
1853            enddo
1854
1855            ! enforce ice conservation
1856            ice_tot= SUM(qsurf_hist(:,igcm_h2o_ice)*cell_area(:) )/SUM(cell_area(:))
1857            qsurf_hist(:,igcm_h2o_ice) = qsurf_hist(:,igcm_h2o_ice)*(icesrf/ice_tot)
1858
1859         endif
1860#ifndef MESOSCALE
1861         
1862         if (ngrid.ne.1) then
1863            write(*,*)'PHYSIQ: for physdem ztime_fin =',ztime_fin
1864           
1865            call physdem1("restartfi.nc",nsoilmx,ngrid,nlayer,nq, &
1866                          ptimestep,ztime_fin,                    &
1867                          tsurf,tsoil,emis,q2,qsurf_hist,         &
1868                          cloudfrac,totcloudfrac,hice,            &
1869                          rnat,pctsrf_sic,tslab,tsea_ice,sea_ice)
1870         endif
1871#endif
1872         if(ok_slab_ocean) then
1873            call ocean_slab_final!(tslab, seaice)
1874         end if
1875
1876    endif ! end of 'lastcall'
1877
1878
1879!-----------------------------------
1880!        Saving statistics :
1881!-----------------------------------
1882
1883!    Note :("stats" stores and accumulates 8 key variables in file "stats.nc"
1884!           which can later be used to make the statistic files of the run:
1885!           "stats")          only possible in 3D runs !!!
1886
1887         
1888      if (callstats) then
1889
1890         call wstats(ngrid,"ps","Surface pressure","Pa",2,ps)
1891         call wstats(ngrid,"tsurf","Surface temperature","K",2,tsurf)
1892         call wstats(ngrid,"fluxsurf_lw",                               &
1893                     "Thermal IR radiative flux to surface","W.m-2",2,  &
1894                     fluxsurf_lw)
1895         call wstats(ngrid,"fluxtop_lw",                                &
1896                     "Thermal IR radiative flux to space","W.m-2",2,    &
1897                     fluxtop_lw)
1898                     
1899!            call wstats(ngrid,"fluxsurf_sw",                               &
1900!                        "Solar radiative flux to surface","W.m-2",2,       &
1901!                         fluxsurf_sw_tot)                     
1902!            call wstats(ngrid,"fluxtop_sw",                                &
1903!                        "Solar radiative flux to space","W.m-2",2,         &
1904!                        fluxtop_sw_tot)
1905
1906
1907         call wstats(ngrid,"ISR","incoming stellar rad.","W m-2",2,fluxtop_dn)
1908         call wstats(ngrid,"ASR","absorbed stellar rad.","W m-2",2,fluxabs_sw)
1909         call wstats(ngrid,"OLR","outgoing longwave rad.","W m-2",2,fluxtop_lw)
1910         !call wstats(ngrid,"ALB","Surface albedo"," ",2,albedo_equivalent)
1911         !call wstats(ngrid,"ALB_1st","First Band Surface albedo"," ",2,albedo(:,1))
1912         call wstats(ngrid,"p","Pressure","Pa",3,pplay)
1913         call wstats(ngrid,"temp","Atmospheric temperature","K",3,zt)
1914         call wstats(ngrid,"u","Zonal (East-West) wind","m.s-1",3,zu)
1915         call wstats(ngrid,"v","Meridional (North-South) wind","m.s-1",3,zv)
1916         call wstats(ngrid,"w","Vertical (down-up) wind","m.s-1",3,pw)
1917         call wstats(ngrid,"q2","Boundary layer eddy kinetic energy","m2.s-2",3,q2)
1918
1919         if (tracer) then
1920            do iq=1,nq
1921               call wstats(ngrid,noms(iq),noms(iq),'kg/kg',3,zq(1,1,iq))
1922               call wstats(ngrid,trim(noms(iq))//'_surf',trim(noms(iq))//'_surf',  &
1923                           'kg m^-2',2,qsurf(1,iq) )
1924               call wstats(ngrid,trim(noms(iq))//'_col',trim(noms(iq))//'_col',    &
1925                          'kg m^-2',2,qcol(1,iq) )
1926                         
1927!              call wstats(ngrid,trim(noms(iq))//'_reff',                          &
1928!                          trim(noms(iq))//'_reff',                                   &
1929!                          'm',3,reffrad(1,1,iq))
1930
1931            end do
1932           
1933            if (water) then
1934               vmr=zq(1:ngrid,1:nlayer,igcm_h2o_vap)*mugaz/mmol(igcm_h2o_vap)
1935               call wstats(ngrid,"vmr_h2ovapor",                             &
1936                           "H2O vapour volume mixing ratio","mol/mol",       &
1937                           3,vmr)
1938            endif
1939
1940         endif ! end of 'tracer'
1941
1942         if(watercond.and.CLFvarying)then
1943            call wstats(ngrid,"rneb_man","H2O cloud fraction (conv)"," ",3,rneb_man)
1944            call wstats(ngrid,"rneb_lsc","H2O cloud fraction (large scale)"," ",3,rneb_lsc)
1945            call wstats(ngrid,"CLF","H2O cloud fraction"," ",3,cloudfrac)
1946            call wstats(ngrid,"CLFt","H2O column cloud fraction"," ",2,totcloudfrac)
1947            call wstats(ngrid,"RH","relative humidity"," ",3,RH)
1948         endif
1949
1950         if (ok_slab_ocean) then
1951            call wstats(ngrid,"dt_hdiff1","dt_hdiff1","K/s",2,dt_hdiff(:,1))
1952            call wstats(ngrid,"dt_hdiff2","dt_hdiff2","K/s",2,dt_hdiff(:,2))
1953            call wstats(ngrid,"dt_ekman1","dt_ekman1","K/s",2,dt_ekman(:,1))
1954            call wstats(ngrid,"dt_ekman2","dt_ekman2","K/s",2,dt_ekman(:,2))
1955            call wstats(ngrid,"tslab1","tslab1","K",2,tslab(:,1))
1956            call wstats(ngrid,"tslab2","tslab2","K",2,tslab(:,2))
1957            call wstats(ngrid,"pctsrf_sic","pct ice/sea","",2,pctsrf_sic)
1958            call wstats(ngrid,"tsea_ice","tsea_ice","K",2,tsea_ice)
1959            call wstats(ngrid,"sea_ice","sea ice","kg/m2",2,sea_ice)
1960            call wstats(ngrid,"rnat","nature of the surface","",2,rnat)
1961         endif
1962
1963         if(lastcall) then
1964            write (*,*) "Writing stats..."
1965            call mkstats(ierr)
1966         endif
1967         
1968      endif ! end of 'callstats'
1969
1970#ifndef MESOSCALE
1971       
1972!-----------------------------------------------------------------------------------------------------
1973!           OUTPUT in netcdf file "DIAGFI.NC", containing any variable for diagnostic
1974!
1975!             Note 1 : output with  period "ecritphy", set in "run.def"
1976!
1977!             Note 2 : writediagfi can also be called from any other subroutine for any variable,
1978!                      but its preferable to keep all the calls in one place ...
1979!-----------------------------------------------------------------------------------------------------
1980
1981      call writediagfi(ngrid,"Ls","solar longitude","deg",0,zls*180./pi)
1982      call writediagfi(ngrid,"Lss","sub solar longitude","deg",0,zlss*180./pi)
1983      call writediagfi(ngrid,"RA","right ascension","deg",0,right_ascen*180./pi)
1984      call writediagfi(ngrid,"Declin","solar declination","deg",0,declin*180./pi)
1985      call writediagfi(ngrid,"tsurf","Surface temperature","K",2,tsurf)
1986      call writediagfi(ngrid,"ps","Surface pressure","Pa",2,ps)
1987      call writediagfi(ngrid,"temp","temperature","K",3,zt)
1988      call writediagfi(ngrid,"teta","potential temperature","K",3,zh)
1989      call writediagfi(ngrid,"u","Zonal wind","m.s-1",3,zu)
1990      call writediagfi(ngrid,"v","Meridional wind","m.s-1",3,zv)
1991      call writediagfi(ngrid,"w","Vertical wind","m.s-1",3,pw)
1992      call writediagfi(ngrid,"p","Pressure","Pa",3,pplay)
1993
1994!     Subsurface temperatures
1995!        call writediagsoil(ngrid,"tsurf","Surface temperature","K",2,tsurf)
1996!        call writediagsoil(ngrid,"temp","temperature","K",3,tsoil)
1997
1998      ! Oceanic layers
1999      if(ok_slab_ocean) then
2000         call writediagfi(ngrid,"pctsrf_sic","pct ice/sea","",2,pctsrf_sic)
2001         call writediagfi(ngrid,"tsea_ice","tsea_ice","K",2,tsea_ice)
2002         call writediagfi(ngrid,"sea_ice","sea ice","kg/m2",2,sea_ice)
2003         call writediagfi(ngrid,"tslab1","tslab1","K",2,tslab(:,1))
2004         call writediagfi(ngrid,"tslab2","tslab2","K",2,tslab(:,2))
2005         call writediagfi(ngrid,"dt_hdiff1","dt_hdiff1","K/s",2,dt_hdiff(:,1))
2006         call writediagfi(ngrid,"dt_hdiff2","dt_hdiff2","K/s",2,dt_hdiff(:,2))
2007         call writediagfi(ngrid,"dt_ekman1","dt_ekman1","K/s",2,dt_ekman(:,1))
2008         call writediagfi(ngrid,"dt_ekman2","dt_ekman2","K/s",2,dt_ekman(:,2))
2009         call writediagfi(ngrid,"rnat","nature of the surface","",2,rnat)
2010         call writediagfi(ngrid,"sensibFlux","sensible heat flux","w.m^-2",2,sensibFlux)
2011         call writediagfi(ngrid,"latentFlux","latent heat flux","w.m^-2",2,zdqsdif(:,igcm_h2o_vap)*RLVTT)
2012      endif
2013     
2014
2015      ! Total energy balance diagnostics
2016      if(callrad.and.(.not.newtonian))then
2017     
2018         !call writediagfi(ngrid,"ALB","Surface albedo"," ",2,albedo_equivalent)
2019         !call writediagfi(ngrid,"ALB_1st","First Band Surface albedo"," ",2,albedo(:,1))
2020         call writediagfi(ngrid,"ISR","incoming stellar rad.","W m-2",2,fluxtop_dn)
2021         call writediagfi(ngrid,"ASR","absorbed stellar rad.","W m-2",2,fluxabs_sw)
2022         call writediagfi(ngrid,"OLR","outgoing longwave rad.","W m-2",2,fluxtop_lw)
2023         call writediagfi(ngrid,"shad","rings"," ", 2, fract)
2024         
2025!           call writediagfi(ngrid,"ASRcs","absorbed stellar rad (cs).","W m-2",2,fluxabs_sw1)
2026!           call writediagfi(ngrid,"OLRcs","outgoing longwave rad (cs).","W m-2",2,fluxtop_lw1)
2027!           call writediagfi(ngrid,"fluxsurfsw","sw surface flux.","W m-2",2,fluxsurf_sw)
2028!           call writediagfi(ngrid,"fluxsurflw","lw back radiation.","W m-2",2,fluxsurf_lw)
2029!           call writediagfi(ngrid,"fluxsurfswcs","sw surface flux (cs).","W m-2",2,fluxsurf_sw1)
2030!           call writediagfi(ngrid,"fluxsurflwcs","lw back radiation (cs).","W m-2",2,fluxsurf_lw1)
2031
2032         if(ok_slab_ocean) then
2033            call writediagfi(ngrid,"GND","heat flux from ground","W m-2",2,fluxgrdocean)
2034         else
2035            call writediagfi(ngrid,"GND","heat flux from ground","W m-2",2,fluxgrd)
2036         endif
2037         
2038         call writediagfi(ngrid,"DYN","dynamical heat input","W m-2",2,fluxdyn)
2039         
2040      endif ! end of 'callrad'
2041       
2042      if(enertest) then
2043     
2044         if (calldifv) then
2045         
2046            call writediagfi(ngrid,"q2","turbulent kinetic energy","J.kg^-1",3,q2)
2047            call writediagfi(ngrid,"sensibFlux","sensible heat flux","w.m^-2",2,sensibFlux)
2048           
2049!             call writediagfi(ngrid,"dEzdiff","turbulent diffusion heating (-sensible flux)","w.m^-2",3,dEzdiff)
2050!             call writediagfi(ngrid,"dEdiff","integrated turbulent diffusion heating (-sensible flux)","w.m^-2",2,dEdiff)
2051!             call writediagfi(ngrid,"dEdiffs","In TurbDiff (correc rad+latent heat) surf nrj change","w.m^-2",2,dEdiffs)
2052             
2053         endif
2054         
2055         if (corrk) then
2056            call writediagfi(ngrid,"dEzradsw","radiative heating","w.m^-2",3,dEzradsw)
2057            call writediagfi(ngrid,"dEzradlw","radiative heating","w.m^-2",3,dEzradlw)
2058         endif
2059         
2060         if(watercond) then
2061
2062            call writediagfi(ngrid,"lscaledE","heat from largescale","W m-2",2,lscaledE)
2063            call writediagfi(ngrid,"madjdE","heat from moistadj","W m-2",2,madjdE)
2064            call writediagfi(ngrid,"qsatatm","atm qsat"," ",3,qsat)
2065             
2066!             call writediagfi(ngrid,"lscaledEz","heat from largescale","W m-2",3,lscaledEz)
2067!             call writediagfi(ngrid,"madjdEz","heat from moistadj","W m-2",3,madjdEz)             
2068!             call writediagfi(ngrid,"h2o_max_col","maximum H2O column amount","kg.m^-2",2,H2Omaxcol)
2069
2070         endif
2071         
2072      endif ! end of 'enertest'
2073
2074
2075        ! Temporary inclusions for heating diagnostics.
2076        !call writediagfi(ngrid,"zdtsw","SW heating","T s-1",3,zdtsw)
2077        !call writediagfi(ngrid,"zdtlw","LW heating","T s-1",3,zdtlw)
2078        !call writediagfi(ngrid,"dtrad","radiative heating","K s-1",3,dtrad)
2079        ! call writediagfi(ngrid,"zdtdyn","Dyn. heating","T s-1",3,zdtdyn)
2080       
2081        ! For Debugging.
2082        !call writediagfi(ngrid,'rnat','Terrain type',' ',2,real(rnat))
2083        !call writediagfi(ngrid,'pphi','Geopotential',' ',3,pphi)
2084       
2085
2086      ! Output aerosols.
2087      if (igcm_co2_ice.ne.0.and.iaero_co2.ne.0) &
2088         call writediagfi(ngrid,'CO2ice_reff','CO2ice_reff','m',3,reffrad(1,1,iaero_co2))
2089      if (igcm_h2o_ice.ne.0.and.iaero_h2o.ne.0) &
2090         call writediagfi(ngrid,'H2Oice_reff','H2Oice_reff','m',3,reffrad(:,:,iaero_h2o))
2091      if (igcm_co2_ice.ne.0.and.iaero_co2.ne.0) &
2092         call writediagfi(ngrid,'CO2ice_reffcol','CO2ice_reffcol','um kg m^-2',2,reffcol(1,iaero_co2))
2093      if (igcm_h2o_ice.ne.0.and.iaero_h2o.ne.0) &
2094         call writediagfi(ngrid,'H2Oice_reffcol','H2Oice_reffcol','um kg m^-2',2,reffcol(1,iaero_h2o))
2095
2096      ! Output tracers.
2097      if (tracer) then
2098     
2099         do iq=1,nq
2100            call writediagfi(ngrid,noms(iq),noms(iq),'kg/kg',3,zq(1,1,iq))
2101            call writediagfi(ngrid,trim(noms(iq))//'_surf',trim(noms(iq))//'_surf',  &
2102                             'kg m^-2',2,qsurf_hist(1,iq) )
2103            call writediagfi(ngrid,trim(noms(iq))//'_col',trim(noms(iq))//'_col',    &
2104                            'kg m^-2',2,qcol(1,iq) )
2105                         
2106!          call writediagfi(ngrid,trim(noms(iq))//'_surf',trim(noms(iq))//'_surf',  &
2107!                          'kg m^-2',2,qsurf(1,iq) )                         
2108
2109            if(watercond.or.CLFvarying)then
2110               call writediagfi(ngrid,"rneb_man","H2O cloud fraction (conv)"," ",3,rneb_man)
2111               call writediagfi(ngrid,"rneb_lsc","H2O cloud fraction (large scale)"," ",3,rneb_lsc)
2112               call writediagfi(ngrid,"CLF","H2O cloud fraction"," ",3,cloudfrac)
2113               call writediagfi(ngrid,"CLFt","H2O column cloud fraction"," ",2,totcloudfrac)
2114               call writediagfi(ngrid,"RH","relative humidity"," ",3,RH)
2115            endif
2116
2117            if(waterrain)then
2118               call writediagfi(ngrid,"rain","rainfall","kg m-2 s-1",2,zdqsrain)
2119               call writediagfi(ngrid,"snow","snowfall","kg m-2 s-1",2,zdqssnow)
2120               call writediagfi(ngrid,"reevap","reevaporation of precipitation","kg m-2 s-1",2,reevap_precip)
2121            endif
2122
2123            if((hydrology).and.(.not.ok_slab_ocean))then
2124               call writediagfi(ngrid,"hice","oceanic ice height","m",2,hice)
2125            endif
2126
2127            if(ice_update)then
2128               call writediagfi(ngrid,"ice_min","min annual ice","m",2,ice_min)
2129               call writediagfi(ngrid,"ice_ini","initial annual ice","m",2,ice_initial)
2130            endif
2131
2132            do ig=1,ngrid
2133               if(tau_col(ig).gt.1.e3)then
2134                  print*,'WARNING: tau_col=',tau_col(ig)
2135                  print*,'at ig=',ig,'in PHYSIQ'
2136               endif         
2137            end do
2138
2139            call writediagfi(ngrid,"tau_col","Total aerosol optical depth","[]",2,tau_col)
2140
2141         enddo ! end of 'nq' loop
2142         
2143       endif ! end of 'tracer'
2144
2145
2146      ! Output spectrum.
2147      if(specOLR.and.corrk)then     
2148         call writediagspecIR(ngrid,"OLR3D","OLR(lon,lat,band)","W/m^2/cm^-1",3,OLR_nu)
2149         call writediagspecVI(ngrid,"OSR3D","OSR(lon,lat,band)","W/m^2/cm^-1",3,OSR_nu)
2150      endif
2151
2152#else
2153      comm_HR_SW(1:ngrid,1:nlayer) = zdtsw(1:ngrid,1:nlayer)
2154      comm_HR_LW(1:ngrid,1:nlayer) = zdtlw(1:ngrid,1:nlayer)
2155      comm_CLOUDFRAC(1:ngrid,1:nlayer)=cloudfrac(1:ngrid,1:nlayer)
2156      comm_TOTCLOUDFRAC(1:ngrid)=totcloudfrac(1:ngrid)
2157      comm_RAIN(1:ngrid,1:nlayer)=zdqrain(1:ngrid,1:nlayer,igcm_h2o_vap)
2158      comm_SNOW(1:ngrid,1:nlayer)=zdqrain(1:ngrid,1:nlayer,igcm_h2o_ice)
2159      comm_ALBEQ(1:ngrid)=albedo_equivalent(1:ngrid)
2160      comm_FLUXTOP_DN(1:ngrid)=fluxtop_dn(1:ngrid)
2161      comm_FLUXABS_SW(1:ngrid)=fluxabs_sw(1:ngrid)
2162      comm_FLUXTOP_LW(1:ngrid)=fluxtop_lw(1:ngrid)
2163      comm_FLUXSURF_SW(1:ngrid)=fluxsurf_sw(1:ngrid)
2164      comm_FLUXSURF_LW(1:ngrid)=fluxsurf_lw(1:ngrid)
2165      comm_FLXGRD(1:ngrid)=fluxgrd(1:ngrid)
2166      comm_LSCEZ(1:ngrid,1:nlayer)=lscaledEz(1:ngrid,1:nlayer)
2167      comm_H2OICE_REFF(1:ngrid,1:nlayer)=reffrad(1:ngrid,1:nlayer,iaero_h2o)
2168      sensibFlux(1:ngrid) = zflubid(1:ngrid) - capcal(1:ngrid)*zdtsdif(1:ngrid) !!! ????
2169#endif
2170
2171! XIOS outputs
2172#ifdef CPP_XIOS     
2173      ! Send fields to XIOS: (NB these fields must also be defined as
2174      ! <field id="..." /> in context_lmdz_physics.xml to be correctly used)
2175      CALL send_xios_field("ls",zls)
2176     
2177      CALL send_xios_field("ps",ps)
2178      CALL send_xios_field("area",cell_area)
2179
2180      CALL send_xios_field("temperature",zt)
2181      CALL send_xios_field("u",zu)
2182      CALL send_xios_field("v",zv)
2183      CALL send_xios_field("omega",omega)
2184
2185      CALL send_xios_field("ISR",fluxtop_dn)
2186      CALL send_xios_field("OLR",fluxtop_lw)
2187
2188      if (lastcall.and.is_omp_master) then
2189        write(*,*) "physiq: call xios_context_finalize"
2190        call xios_context_finalize
2191      endif
2192#endif
2193
2194      icount=icount+1
2195
2196    end subroutine physiq
2197   
2198    end module physiq_mod
Note: See TracBrowser for help on using the repository browser.