source: LMDZ6/branches/Amaury_dev/libf/phylmd/dyn1d/lmdz_scm.F90 @ 5466

Last change on this file since 5466 was 5228, checked in by abarral, 4 months ago

Merge r5212 r5213

File size: 43.3 KB
Line 
1MODULE lmdz_scm
2  PRIVATE  ! -- We'd love to put IMPLICIT NONE;  here...
3  PUBLIC scm
4CONTAINS
5  SUBROUTINE scm
6    USE ioipsl, ONLY: ju2ymds, ymds2ju, ioconf_calendar, getin
7    USE phys_state_var_mod, ONLY: phys_state_var_init, phys_state_var_end, &
8            clwcon, detr_therm, &
9            qsol, fevap, z0m, z0h, agesno, &
10            du_gwd_rando, du_gwd_front, entr_therm, f0, fm_therm, &
11            falb_dir, falb_dif, &
12            ftsol, beta_aridity, pbl_tke, pctsrf, radsol, rain_fall, snow_fall, ratqs, &
13            rnebcon, rugoro, sig1, w01, solaire_etat0, sollw, sollwdown, &
14            solsw, solswfdiff, t_ancien, q_ancien, u_ancien, v_ancien, &
15            wake_delta_pbl_TKE, delta_tsurf, wake_fip, wake_pe, &
16            wake_deltaq, wake_deltat, wake_s, awake_s, wake_dens, &
17            awake_dens, cv_gen, wake_cstar, &
18            zgam, zmax0, zmea, zpic, zsig, &
19            zstd, zthe, zval, ale_bl, ale_bl_trig, alp_bl, &
20            ql_ancien, qs_ancien, qbs_ancien, cf_ancien, rvc_ancien, &
21            prlw_ancien, prsw_ancien, prbsw_ancien, prw_ancien, &
22            u10m, v10m, ale_wake, ale_bl_stat, ratqs_inter_
23
24    USE dimphy
25    USE surface_data, ONLY: type_ocean, ok_veget
26    USE pbl_surface_mod, ONLY: ftsoil, pbl_surface_init, &
27            pbl_surface_final
28    USE fonte_neige_mod, ONLY: fonte_neige_init, fonte_neige_final
29
30    USE lmdz_infotrac
31    USE control_mod
32    USE indice_sol_mod
33    USE phyaqua_mod
34    USE mod_1D_cases_read_std
35    USE lmdz_print_control, ONLY: lunout, prt_level
36    USE iniphysiq_mod, ONLY: iniphysiq
37    USE mod_const_mpi, ONLY: comm_lmdz
38    USE physiq_mod, ONLY: physiq
39    USE comvert_mod, ONLY: presnivs, ap, bp, dpres, nivsig, nivsigs, pa, &
40            preff, aps, bps, pseudoalt, scaleheight
41    USE temps_mod, ONLY: annee_ref, calend, day_end, day_ini, day_ref, &
42            itau_dyn, itau_phy, start_time, year_len
43    USE phys_cal_mod, ONLY: year_len_phys_cal_mod => year_len
44  USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm
45    USE lmdz_1dutils, ONLY: fq_sat, conf_unicol, dyn1deta0, dyn1dredem, disvert0
46
47    USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_OUTPUTPHYSSCM
48    USE lmdz_clesphys
49    USE lmdz_flux_arp, ONLY: fsens, flat, betaevap, ust, tg, ok_flux_surf, ok_prescr_ust, ok_prescr_beta, ok_forc_tsurf
50    USE lmdz_compbl, ONLY: iflag_pbl, iflag_pbl_split, iflag_order2_sollw, ifl_pbltree
51    USE lmdz_fcs_gcssold, ONLY: imp_fcg_gcssold, ts_fcg_gcssold, Tp_fcg_gcssold, Tp_ini_gcssold, xTurb_fcg_gcssold
52    USE lmdz_tsoilnudge, ONLY: nudge_tsoil, isoil_nudge, Tsoil_nudge, tau_soil_nudge
53    USE lmdz_yomcst
54    USE lmdz_compar1d
55    USE lmdz_date_cas, ONLY: year_ini_cas, mth_ini_cas, day_deb, heure_ini_cas, pdt_cas, day_ju_ini_cas
56  USE lmdz_conf_gcm, ONLY: conf_gcm
57
58
59    INCLUDE "dimsoil.h"
60
61    !=====================================================================
62    ! DECLARATIONS
63    !=====================================================================
64
65    !---------------------------------------------------------------------
66    !  Arguments d' initialisations de la physique (USER DEFINE)
67    !---------------------------------------------------------------------
68
69    INTEGER, parameter :: ngrid = 1
70    REAL :: zcufi = 1.
71    REAL :: zcvfi = 1.
72    REAL :: fnday
73    REAL :: day, daytime
74    REAL :: day1
75    REAL :: heure
76    INTEGER :: jour
77    INTEGER :: mois
78    INTEGER :: an
79
80    !---------------------------------------------------------------------
81    !  Declarations related to forcing and initial profiles
82    !---------------------------------------------------------------------
83
84    INTEGER :: kmax = llm
85    INTEGER llm700, nq1, nq2
86    INTEGER, PARAMETER :: nlev_max = 1000, nqmx = 1000
87    REAL timestep, frac
88    REAL height(nlev_max), tttprof(nlev_max), qtprof(nlev_max)
89    real  uprof(nlev_max), vprof(nlev_max), e12prof(nlev_max)
90    real  ugprof(nlev_max), vgprof(nlev_max), wfls(nlev_max)
91    real  dqtdxls(nlev_max), dqtdyls(nlev_max)
92    real  dqtdtls(nlev_max), thlpcar(nlev_max)
93    real  qprof(nlev_max, nqmx)
94
95    !        INTEGER :: forcing_type
96    LOGICAL :: forcing_les = .FALSE.
97    LOGICAL :: forcing_armcu = .FALSE.
98    LOGICAL :: forcing_rico = .FALSE.
99    LOGICAL :: forcing_radconv = .FALSE.
100    LOGICAL :: forcing_toga = .FALSE.
101    LOGICAL :: forcing_twpice = .FALSE.
102    LOGICAL :: forcing_amma = .FALSE.
103    LOGICAL :: forcing_dice = .FALSE.
104    LOGICAL :: forcing_gabls4 = .FALSE.
105
106    LOGICAL :: forcing_GCM2SCM = .FALSE.
107    LOGICAL :: forcing_GCSSold = .FALSE.
108    LOGICAL :: forcing_sandu = .FALSE.
109    LOGICAL :: forcing_astex = .FALSE.
110    LOGICAL :: forcing_fire = .FALSE.
111    LOGICAL :: forcing_case = .FALSE.
112    LOGICAL :: forcing_case2 = .FALSE.
113    LOGICAL :: forcing_SCM = .FALSE.
114
115    !flag forcings
116    LOGICAL :: nudge_wind = .TRUE.
117    LOGICAL :: nudge_thermo = .FALSE.
118    LOGICAL :: cptadvw = .TRUE.
119
120
121    !=====================================================================
122    ! DECLARATIONS FOR EACH CASE
123    !=====================================================================
124
125    INCLUDE "1D_decl_cases.h"
126
127    !---------------------------------------------------------------------
128    !  Declarations related to nudging
129    !---------------------------------------------------------------------
130    INTEGER :: nudge_max
131    parameter (nudge_max = 9)
132    INTEGER :: inudge_RHT = 1
133    INTEGER :: inudge_UV = 2
134    LOGICAL :: nudge(nudge_max)
135    REAL :: t_targ(llm)
136    REAL :: rh_targ(llm)
137    REAL :: u_targ(llm)
138    REAL :: v_targ(llm)
139
140    !---------------------------------------------------------------------
141    !  Declarations related to vertical discretization:
142    !---------------------------------------------------------------------
143    REAL :: pzero = 1.e5
144    REAL :: play (llm), zlay (llm), sig_s(llm), plev(llm + 1)
145    REAL :: playd(llm), zlayd(llm), ap_amma(llm + 1), bp_amma(llm + 1)
146
147    !---------------------------------------------------------------------
148    !  Declarations related to variables
149    !---------------------------------------------------------------------
150
151    REAL :: phi(llm)
152    REAL :: teta(llm), tetal(llm), temp(llm), u(llm), v(llm), w(llm)
153    REAL rot(1, llm) ! relative vorticity, in s-1
154    REAL :: rlat_rad(1), rlon_rad(1)
155    REAL :: omega(llm), omega2(llm), rho(llm + 1)
156    REAL :: ug(llm), vg(llm), fcoriolis
157    REAL :: sfdt, cfdt
158    REAL :: du_phys(llm), dv_phys(llm), dt_phys(llm)
159    REAL :: w_adv(llm), z_adv(llm)
160    REAL :: d_t_vert_adv(llm), d_u_vert_adv(llm), d_v_vert_adv(llm)
161    REAL :: dt_cooling(llm), d_t_adv(llm), d_t_nudge(llm)
162    REAL :: d_u_nudge(llm), d_v_nudge(llm)
163    !      REAL :: d_u_adv(llm),d_v_adv(llm)
164    REAL :: d_u_age(llm), d_v_age(llm)
165    REAL :: alpha
166    REAL :: ttt
167
168    REAL, ALLOCATABLE, DIMENSION(:, :) :: q
169    REAL, ALLOCATABLE, DIMENSION(:, :) :: dq
170    REAL, ALLOCATABLE, DIMENSION(:, :) :: d_q_vert_adv
171    REAL, ALLOCATABLE, DIMENSION(:, :) :: d_q_adv
172    REAL, ALLOCATABLE, DIMENSION(:, :) :: d_q_nudge
173    !      REAL, ALLOCATABLE, DIMENSION(:):: d_th_adv
174
175    !---------------------------------------------------------------------
176    !  Initialization of surface variables
177    !---------------------------------------------------------------------
178    REAL :: run_off_lic_0(1)
179    REAL :: fder(1), snsrf(1, nbsrf), qsurfsrf(1, nbsrf)
180    REAL :: tsoil(1, nsoilmx, nbsrf)
181    !     REAL :: agesno(1,nbsrf)
182
183    !---------------------------------------------------------------------
184    !  Call to phyredem
185    !---------------------------------------------------------------------
186    LOGICAL :: ok_writedem = .TRUE.
187    REAL :: sollw_in = 0.
188    REAL :: solsw_in = 0.
189
190    !---------------------------------------------------------------------
191    !  Call to physiq
192    !---------------------------------------------------------------------
193    LOGICAL :: firstcall = .TRUE.
194    LOGICAL :: lastcall = .FALSE.
195    REAL :: phis(1) = 0.0
196    REAL :: dpsrf(1)
197
198    !---------------------------------------------------------------------
199    !  Initializations of boundary conditions
200    !---------------------------------------------------------------------
201    REAL, ALLOCATABLE :: phy_nat (:)  ! 0=ocean libre,1=land,2=glacier,3=banquise
202    REAL, ALLOCATABLE :: phy_alb (:)  ! Albedo land only (old value condsurf_jyg=0.3)
203    REAL, ALLOCATABLE :: phy_sst (:)  ! SST (will not be used; cf read_tsurf1d.F)
204    REAL, ALLOCATABLE :: phy_bil (:)  ! Ne sert que pour les slab_ocean
205    REAL, ALLOCATABLE :: phy_rug (:) ! Longueur rugosite utilisee sur land only
206    REAL, ALLOCATABLE :: phy_ice (:) ! Fraction de glace
207    REAL, ALLOCATABLE :: phy_fter(:) ! Fraction de terre
208    REAL, ALLOCATABLE :: phy_foce(:) ! Fraction de ocean
209    REAL, ALLOCATABLE :: phy_fsic(:) ! Fraction de glace
210    REAL, ALLOCATABLE :: phy_flic(:) ! Fraction de glace
211
212    !---------------------------------------------------------------------
213    !  Fichiers et d'autres variables
214    !---------------------------------------------------------------------
215    INTEGER :: k, l, i, it = 1, mxcalc
216    INTEGER :: nsrf
217    INTEGER jcode
218    INTEGER read_climoz
219
220    INTEGER :: it_end ! iteration number of the last call
221    !Al1,plev,play,phi,phis,presnivs,
222    INTEGER ecrit_slab_oc !1=ecrit,-1=lit,0=no file
223    data ecrit_slab_oc/-1/
224
225    !     if flag_inhib_forcing = 0, tendencies of forcing are added
226    !                           <> 0, tendencies of forcing are not added
227    INTEGER :: flag_inhib_forcing = 0
228
229    PRINT*, 'VOUS ENTREZ DANS LE 1D FORMAT STANDARD'
230
231    !=====================================================================
232    ! INITIALIZATIONS
233    !=====================================================================
234    du_phys(:) = 0.
235    dv_phys(:) = 0.
236    dt_phys(:) = 0.
237    d_t_vert_adv(:) = 0.
238    d_u_vert_adv(:) = 0.
239    d_v_vert_adv(:) = 0.
240    dt_cooling(:) = 0.
241    d_t_adv(:) = 0.
242    d_t_nudge(:) = 0.
243    d_u_nudge(:) = 0.
244    d_v_nudge(:) = 0.
245    d_u_adv(:) = 0.
246    d_v_adv(:) = 0.
247    d_u_age(:) = 0.
248    d_v_age(:) = 0.
249
250
251    ! Initialization of Common turb_forcing
252    dtime_frcg = 0.
253    Turb_fcg_gcssold = .FALSE.
254    hthturb_gcssold = 0.
255    hqturb_gcssold = 0.
256
257
258
259
260    !---------------------------------------------------------------------
261    ! OPTIONS OF THE 1D SIMULATION (lmdz1d.def => unicol.def)
262    !---------------------------------------------------------------------
263    CALL conf_unicol
264    !Al1 moves this gcssold var from common fcg_gcssold to
265    Turb_fcg_gcssold = xTurb_fcg_gcssold
266    ! --------------------------------------------------------------------
267    close(1)
268    WRITE(*, *) 'lmdz1d.def lu => unicol.def'
269
270    forcing_SCM = .TRUE.
271    year_ini_cas = 1997
272    ! It is possible that those parameters are run twice.
273    ! A REVOIR : LIRE PEUT ETRE AN MOIS JOUR DIRECETEMENT
274
275    CALL getin('anneeref', year_ini_cas)
276    CALL getin('dayref', day_deb)
277    mth_ini_cas = 1 ! pour le moment on compte depuis le debut de l'annee
278    CALL getin('time_ini', heure_ini_cas)
279
280    PRINT*, 'NATURE DE LA SURFACE ', nat_surf
281
282    ! Initialization of the LOGICAL switch for nudging
283
284    jcode = iflag_nudge
285    DO i = 1, nudge_max
286      nudge(i) = mod(jcode, 10) >= 1
287      jcode = jcode / 10
288    enddo
289    !-----------------------------------------------------------------------
290    !  Definition of the run
291    !-----------------------------------------------------------------------
292
293    CALL conf_gcm(99, .TRUE.)
294
295    !-----------------------------------------------------------------------
296    allocate(phy_nat (year_len))  ! 0=ocean libre,1=land,2=glacier,3=banquise
297    phy_nat(:) = 0.0
298    allocate(phy_alb (year_len))  ! Albedo land only (old value condsurf_jyg=0.3)
299    allocate(phy_sst (year_len))  ! SST (will not be used; cf read_tsurf1d.F)
300    allocate(phy_bil (year_len))  ! Ne sert que pour les slab_ocean
301    phy_bil(:) = 1.0
302    allocate(phy_rug (year_len)) ! Longueur rugosite utilisee sur land only
303    allocate(phy_ice (year_len)) ! Fraction de glace
304    phy_ice(:) = 0.0
305    allocate(phy_fter(year_len)) ! Fraction de terre
306    phy_fter(:) = 0.0
307    allocate(phy_foce(year_len)) ! Fraction de ocean
308    phy_foce(:) = 0.0
309    allocate(phy_fsic(year_len)) ! Fraction de glace
310    phy_fsic(:) = 0.0
311    allocate(phy_flic(year_len)) ! Fraction de glace
312    phy_flic(:) = 0.0
313
314
315    !-----------------------------------------------------------------------
316    !   Choix du calendrier
317    !   -------------------
318
319    !      calend = 'earth_365d'
320    IF (calend == 'earth_360d') THEN
321      CALL ioconf_calendar('360_day')
322      WRITE(*, *)'CALENDRIER CHOISI: Terrestre a 360 jours/an'
323    ELSE IF (calend == 'earth_365d') THEN
324      CALL ioconf_calendar('noleap')
325      WRITE(*, *)'CALENDRIER CHOISI: Terrestre a 365 jours/an'
326    ELSE IF (calend == 'earth_366d') THEN
327      CALL ioconf_calendar('all_leap')
328      WRITE(*, *)'CALENDRIER CHOISI: Terrestre bissextile'
329    ELSE IF (calend == 'gregorian') THEN
330      stop 'gregorian calend should not be used by normal user'
331      CALL ioconf_calendar('gregorian') ! not to be used by normal users
332      WRITE(*, *)'CALENDRIER CHOISI: Gregorien'
333    else
334      write (*, *) 'ERROR : unknown calendar ', calend
335      stop 'calend should be 360d,earth_365d,earth_366d,gregorian'
336    endif
337    !-----------------------------------------------------------------------
338
339    !c Date :
340    !      La date est supposee donnee sous la forme [annee, numero du jour dans
341    !      l annee] ; l heure est donnee dans time_ini, lu dans lmdz1d.def.
342    !      On appelle ymds2ju pour convertir [annee, jour] en [jour Julien].
343    !      Le numero du jour est dans "day". L heure est traitee separement.
344    !      La date complete est dans "daytime" (l'unite est le jour).
345
346    IF (nday>0) THEN
347      fnday = nday
348    else
349      fnday = -nday / float(day_step)
350    endif
351    PRINT *, 'fnday=', fnday
352    !     start_time doit etre en FRACTION DE JOUR
353    start_time = time_ini / 24.
354
355    annee_ref = anneeref
356    mois = 1
357    day_ref = dayref
358    heure = 0.
359    itau_dyn = 0
360    itau_phy = 0
361    CALL ymds2ju(annee_ref, mois, day_ref, heure, day)
362    day_ini = int(day)
363    day_end = day_ini + int(fnday)
364
365    ! Convert the initial date to Julian day
366    day_ini_cas = day_deb
367    PRINT*, 'time case', year_ini_cas, mth_ini_cas, day_ini_cas
368    CALL ymds2ju                                                         &
369            (year_ini_cas, mth_ini_cas, day_ini_cas, heure_ini_cas * 3600            &
370            , day_ju_ini_cas)
371    PRINT*, 'time case 2', day_ini_cas, day_ju_ini_cas
372    daytime = day + heure_ini_cas / 24. ! 1st day and initial time of the simulation
373
374    ! Print out the actual date of the beginning of the simulation :
375    CALL ju2ymds(daytime, year_print, month_print, day_print, sec_print)
376    PRINT *, ' Time of beginning : ', &
377            year_print, month_print, day_print, sec_print
378
379    !---------------------------------------------------------------------
380    ! Initialization of dimensions, geometry and initial state
381    !---------------------------------------------------------------------
382    !     CALL init_phys_lmdz(1,1,llm,1,(/1/)) ! job now done via iniphysiq
383    !     but we still need to initialize dimphy module (klon,klev,etc.)  here.
384    CALL init_dimphy1D(1, llm)
385    CALL suphel
386    CALL init_infotrac
387
388    IF (nqtot>nqmx) STOP 'Augmenter nqmx dans lmdz1d.F'
389    allocate(q(llm, nqtot)) ; q(:, :) = 0.
390    allocate(dq(llm, nqtot))
391    allocate(d_q_vert_adv(llm, nqtot))
392    allocate(d_q_adv(llm, nqtot))
393    allocate(d_q_nudge(llm, nqtot))
394    !      allocate(d_th_adv(llm))
395
396    q(:, :) = 0.
397    dq(:, :) = 0.
398    d_q_vert_adv(:, :) = 0.
399    d_q_adv(:, :) = 0.
400    d_q_nudge(:, :) = 0.
401
402    !   No ozone climatology need be read in this pre-initialization
403    !          (phys_state_var_init is called again in physiq)
404    read_climoz = 0
405    nsw = 6
406
407    CALL phys_state_var_init(read_climoz)
408
409    IF (ngrid/=klon) THEN
410      PRINT*, 'stop in inifis'
411      PRINT*, 'Probleme de dimensions :'
412      PRINT*, 'ngrid = ', ngrid
413      PRINT*, 'klon  = ', klon
414      stop
415    endif
416    !!!=====================================================================
417    !!! Feedback forcing values for Gateaux differentiation (al1)
418    !!!=====================================================================
419    !!
420    qsol = qsolinp
421    qsurf = fq_sat(tsurf, psurf / 100.)
422    beta_aridity(:, :) = beta_surf
423    day1 = day_ini
424    time = daytime - day
425    ts_toga(1) = tsurf ! needed by read_tsurf1d.F
426    rho(1) = psurf / (rd * tsurf * (1. + (rv / rd - 1.) * qsurf))
427
428    !! mpl et jyg le 22/08/2012 :
429    !!  pour que les cas a flux de surface imposes marchent
430    IF(.NOT.ok_flux_surf.OR.max(abs(wtsurf), abs(wqsurf))>0.) THEN
431      fsens = -wtsurf * rcpd * rho(1)
432      flat = -wqsurf * rlvtt * rho(1)
433      PRINT *, 'Flux: ok_flux wtsurf wqsurf', ok_flux_surf, wtsurf, wqsurf
434    ENDIF
435    PRINT*, 'Flux sol ', fsens, flat
436
437    ! Vertical discretization and pressure levels at half and mid levels:
438
439    pa = 5e4
440    !!      preff= 1.01325e5
441    preff = psurf
442    IF (ok_old_disvert) THEN
443      CALL disvert0(pa, preff, ap, bp, dpres, presnivs, nivsigs, nivsig)
444      PRINT *, 'On utilise disvert0'
445      aps(1:llm) = 0.5 * (ap(1:llm) + ap(2:llm + 1))
446      bps(1:llm) = 0.5 * (bp(1:llm) + bp(2:llm + 1))
447      scaleheight = 8.
448      pseudoalt(1:llm) = -scaleheight * log(presnivs(1:llm) / preff)
449    ELSE
450      CALL disvert()
451      PRINT *, 'On utilise disvert'
452      !       Nouvelle version disvert permettant d imposer ap,bp (modif L.Guez) MPL 18092012
453      !       Dans ce cas, on lit ap,bp dans le fichier hybrid.txt
454    ENDIF
455
456    sig_s = presnivs / preff
457    plev = ap + bp * psurf
458    play = 0.5 * (plev(1:llm) + plev(2:llm + 1))
459    zlay = -rd * 300. * log(play / psurf) / rg ! moved after reading profiles.
460
461    IF (forcing_type == 59) THEN
462      ! pour forcing_sandu, on cherche l'indice le plus proche de 700hpa#3000m
463      WRITE(*, *) '***********************'
464      DO l = 1, llm
465        WRITE(*, *) 'l,play(l),presnivs(l): ', l, play(l), presnivs(l)
466        IF (trouve_700 .AND. play(l)<=70000) THEN
467          llm700 = l
468          PRINT *, 'llm700,play=', llm700, play(l) / 100.
469          trouve_700 = .FALSE.
470        endif
471      enddo
472      WRITE(*, *) '***********************'
473    ENDIF
474
475    !=====================================================================
476    ! EVENTUALLY, READ FORCING DATA :
477    !=====================================================================
478
479    INCLUDE "1D_read_forc_cases.h"
480  PRINT*, 'A d_t_adv ', d_t_adv(1:20)*86400
481
482  IF (forcing_GCM2SCM) THEN
483  write (*, *) 'forcing_GCM2SCM not yet implemented'
484  stop 'in initialization'
485  ENDIF ! forcing_GCM2SCM
486
487
488  !=====================================================================
489  ! Initialisation de la physique :
490  !=====================================================================
491
492  !  Rq: conf_phys.F90 lit tous les flags de physiq.def; conf_phys appele depuis physiq.F
493
494  ! day_step, iphysiq lus dans gcm.def ci-dessus
495  ! timestep: calcule ci-dessous from rday et day_step
496  ! ngrid=1
497  ! llm: defini dans .../modipsl/modeles/LMDZ4/libf/grid/dimension
498  ! rday: defini dans suphel.F (86400.)
499  ! day_ini: lu dans run.def (dayref)
500  ! rlat_rad,rlon-rad: transformes en radian de rlat,rlon lus dans lmdz1d.def (en degres)
501  ! airefi,zcufi,zcvfi initialises au debut de ce programme
502  ! rday,ra,rg,rd,rcpd declares dans YOMCST.h et calcules dans suphel.F
503
504
505  day_step = float(nsplit_phys)*day_step/float(iphysiq)
506  write (*, *) 'Time step divided by nsplit_phys (=', nsplit_phys, ')'
507  timestep = rday/day_step
508  dtime_frcg = timestep
509
510  zcufi = airefi
511  zcvfi = airefi
512
513  rlat_rad(1) = xlat*rpi/180.
514  rlon_rad(1) = xlon*rpi/180.
515
516  ! iniphysiq will CALL iniaqua who needs year_len from phys_cal_mod
517  year_len_phys_cal_mod = year_len
518
519  ! Ehouarn: iniphysiq requires arrays related to (3D) dynamics grid,
520  ! e.g. for cell boundaries, which are meaningless in 1D; so pad these
521  ! with '0.' when necessary
522
523  CALL iniphysiq(iim, jjm, llm, &
524        1, comm_lmdz, &
525        rday, day_ini, timestep, &
526        (/rlat_rad(1), 0./), (/0./), &
527        (/0., 0./), (/rlon_rad(1), 0./), &
528        (/ (/airefi, 0./), (/0., 0./) /), &
529        (/zcufi, 0., 0., 0./), &
530        (/zcvfi, 0./), &
531        ra, rg, rd,rcpd, 1)
532  PRINT*, 'apres iniphysiq'
533
534  ! 2 PARAMETRES QUI DEVRAIENT ETRE LUS DANS run.def MAIS NE LE SONT PAS ICI:
535  co2_ppm = 330.0
536  solaire = 1370.0
537
538  ! Ecriture du startphy avant le premier appel a la physique.
539  ! On le met juste avant pour avoir acces a tous les champs
540
541  IF (ok_writedem) THEN
542  !--------------------------------------------------------------------------
543  ! pbl_surface_init (called here) and pbl_surface_final (called by phyredem)
544  ! need : qsol fder snow qsurf evap rugos agesno ftsoil
545  !--------------------------------------------------------------------------
546
547  type_ocean = "force"
548  run_off_lic_0(1) = restart_runoff
549  CALL fonte_neige_init(run_off_lic_0)
550
551  fder = 0.
552  snsrf(1, :) = snowmass ! masse de neige des sous surface
553  qsurfsrf(1, :) = qsurf ! humidite de l'air des sous surface
554  fevap = 0.
555  z0m(1, :) = rugos     ! couverture de neige des sous surface
556  z0h(1, :) = rugosh    ! couverture de neige des sous surface
557  agesno = xagesno
558  tsoil(:, :, :) = tsurf
559  !------ AMMA 2e run avec modele sol et rayonnement actif (MPL 23052012)
560  !       tsoil(1,1,1)=299.18
561  !       tsoil(1,2,1)=300.08
562  !       tsoil(1,3,1)=301.88
563  !       tsoil(1,4,1)=305.48
564  !       tsoil(1,5,1)=308.00
565  !       tsoil(1,6,1)=308.00
566  !       tsoil(1,7,1)=308.00
567  !       tsoil(1,8,1)=308.00
568  !       tsoil(1,9,1)=308.00
569  !       tsoil(1,10,1)=308.00
570  !       tsoil(1,11,1)=308.00
571  !-----------------------------------------------------------------------
572  CALL pbl_surface_init(fder, snsrf, qsurfsrf, tsoil)
573
574  !------------------ prepare limit conditions for limit.nc -----------------
575  !--   Ocean force
576
577  PRINT*, 'avant phyredem'
578  pctsrf(1, :) = 0.
579  IF (nat_surf==0.) THEN
580  pctsrf(1, is_oce) = 1.
581  pctsrf(1, is_ter) = 0.
582  pctsrf(1, is_lic) = 0.
583  pctsrf(1, is_sic) = 0.
584  ELSE IF (nat_surf == 1) THEN
585  pctsrf(1, is_oce) = 0.
586  pctsrf(1, is_ter) = 1.
587  pctsrf(1, is_lic) = 0.
588  pctsrf(1, is_sic) = 0.
589  ELSE IF (nat_surf == 2) THEN
590  pctsrf(1, is_oce) = 0.
591  pctsrf(1, is_ter) = 0.
592  pctsrf(1, is_lic) = 1.
593  pctsrf(1, is_sic) = 0.
594  ELSE IF (nat_surf == 3) THEN
595  pctsrf(1, is_oce) = 0.
596  pctsrf(1, is_ter) = 0.
597  pctsrf(1, is_lic) = 0.
598  pctsrf(1, is_sic) = 1.
599
600end if
601
602
603        PRINT*, 'nat_surf,pctsrf(1,is_oce),pctsrf(1,is_ter)', nat_surf         &
604        , pctsrf(1, is_oce), pctsrf(1, is_ter)
605
606                zmasq = pctsrf(1, is_ter)+pctsrf(1, is_lic)
607                zpic = zpicinp
608                ftsol = tsurf
609                falb_dir= albedo
610                falb_dif = albedo
611                rugoro = rugos
612        t_ancien(1, :)= temp(:)
613                q_ancien(1, :)= q(:, 1)
614                ql_ancien = 0.
615                qs_ancien = 0.
616                prlw_ancien = 0.
617        prsw_ancien = 0.
618        prw_ancien = 0.
619        IF ( ok_bs ) THEN
620           qbs_ancien = 0.
621           prbsw_ancien = 0.
622        END IF
623        IF ( ok_ice_supersat ) THEN
624          cf_ancien = 0.
625          rvc_ancien = 0.
626        END IF
627        !jyg<
628        ! Etienne: comment those lines since now the TKE is inialized in 1D_read_forc_cases
629        !!      pbl_tke(:,:,:)=1.e-8
630        !        pbl_tke(:,:,:)=0.
631        !        pbl_tke(:,2,:)=1.e-2
632        !>jyg
633        rain_fall = 0.
634        snow_fall = 0.
635        solsw = 0.
636        solswfdiff= 0.
637        sollw = 0.
638        sollwdown = rsigma*tsurf**4
639        radsol = 0.
640        rnebcon= 0.
641        ratqs = 0.
642        clwcon = 0.
643                zmax0 = 0.
644                zmea = zsurf
645                zstd= 0.
646        zsig = 0.
647        zgam = 0.
648                zval = 0.
649                zthe = 0.
650                sig1= 0.
651        w01 = 0.
652
653        wake_deltaq = 0.
654                wake_deltat = 0.
655                wake_delta_pbl_TKE(:, :, :) = 0.
656        delta_tsurf = 0.
657        wake_fip = 0.
658                wake_pe = 0.
659                wake_s = 0.
660                awake_s = 0.
661                wake_dens = 0.
662                awake_dens = 0.
663                cv_gen = 0.
664                wake_cstar = 0.
665                ale_bl = 0.
666                ale_bl_trig = 0.
667                alp_bl = 0.
668                IF (ALLOCATED(du_gwd_rando)) du_gwd_rando = 0.
669                IF (ALLOCATED(du_gwd_front)) du_gwd_front = 0.
670                entr_therm = 0.
671                detr_therm = 0.
672        f0 = 0.
673        fm_therm = 0.
674        u_ancien(1, :)= u(:)
675                v_ancien(1, :)= v(:)
676
677        u10m = 0.
678        v10m = 0.
679        ale_wake = 0.
680        ale_bl_stat = 0.
681        ratqs_inter_(:, :)= 0.002
682
683        !------------------------------------------------------------------------
684        ! Make file containing restart for the physics (startphy.nc)
685
686        ! NB: List of the variables to be written by phyredem (via put_field):
687        ! rlon,rlat,zmasq,pctsrf(:,is_ter),pctsrf(:,is_lic),pctsrf(:,is_oce)
688        ! pctsrf(:,is_sic),ftsol(:,nsrf),tsoil(:,isoil,nsrf),qsurf(:,nsrf)
689        ! qsol,falb_dir(:,nsrf),falb_dif(:,nsrf),evap(:,nsrf),snow(:,nsrf)
690        ! radsol,solsw,solswfdiff,sollw, sollwdown,fder,rain_fall,snow_fall,frugs(:,nsrf)
691        ! agesno(:,nsrf),zmea,zstd,zsig,zgam,zthe,zpic,zval,rugoro
692                ! t_ancien,q_ancien,,frugs(:,is_oce),clwcon(:,1),rnebcon(:,1),ratqs(:,1)
693                ! run_off_lic_0,pbl_tke(:,1:klev,nsrf), zmax0,f0,sig1,w01
694                ! wake_deltat,wake_deltaq,wake_s,awake_s,wake_dens,awake_dens,cv_gen,wake_cstar,
695                ! wake_fip,wake_delta_pbl_tke(:,1:klev,nsrf)
696
697                ! NB2: The content of the startphy.nc file depends on some flags defined in
698                ! the ".def" files. However, since conf_phys is not called in lmdz1d.F90, these flags have
699                ! to be set at some arbitratry convenient values.
700                !------------------------------------------------------------------------
701                !Al1 =============== restart option ======================================
702                iflag_physiq = 0
703                CALL getin('iflag_physiq', iflag_physiq)
704
705                IF (.NOT.restart) THEN
706        iflag_pbl = 5
707        CALL phyredem ("startphy.nc")
708        else
709        ! (desallocations)
710        PRINT*, 'callin surf final'
711        CALL pbl_surface_final(fder, snsrf, qsurfsrf, tsoil)
712                PRINT*, 'after surf final'
713                CALL fonte_neige_final(run_off_lic_0)
714                endif
715
716                ok_writedem = .FALSE.
717                PRINT*,'apres phyredem'
718
719                endif ! ok_writedem
720
721                !------------------------------------------------------------------------
722                ! Make file containing boundary conditions (limit.nc) **Al1->restartdyn***
723                ! --------------------------------------------------
724                ! NB: List of the variables to be written in limit.nc
725                !     (by writelim.F, SUBROUTINE of 1DUTILS.h):
726                !        phy_nat,phy_alb,phy_sst,phy_bil,phy_rug,phy_ice,
727        !        phy_fter,phy_foce,phy_flic,phy_fsic)
728                !------------------------------------------------------------------------
729                DO i = 1, year_len
730                phy_nat(i)  = nat_surf
731                phy_alb(i)  = albedo
732        phy_sst(i)  = tsurf ! read_tsurf1d will be used instead
733        phy_rug(i)  = rugos
734        phy_fter(i) = pctsrf(1, is_ter)
735                phy_foce(i) = pctsrf(1, is_oce)
736                phy_fsic(i) = pctsrf(1, is_sic)
737                phy_flic(i) = pctsrf(1, is_lic)
738        enddo
739
740        ! fabrication de limit.nc
741        CALL writelim (1, phy_nat, phy_alb, phy_sst, phy_bil,phy_rug, &
742        phy_ice, phy_fter, phy_foce, phy_flic,phy_fsic)
743
744
745                CALL phys_state_var_end
746                !Al1
747                IF (restart) THEN
748                PRINT*, 'CALL to restart dyn 1d'
749                Call dyn1deta0("start1dyn.nc", plev, play, phi, phis,presnivs, &
750                u, v, temp, q,omega2)
751
752                PRINT*, 'fnday,annee_ref,day_ref,day_ini', &
753                fnday, annee_ref,day_ref, day_ini
754                !**      CALL ymds2ju(annee_ref,mois,day_ini,heure,day)
755                day = day_ini
756                day_end = day_ini + nday
757                daytime = day + time_ini/24. ! 1st day and initial time of the simulation
758
759                ! Print out the actual date of the beginning of the simulation :
760                CALL ju2ymds(daytime, an, mois, jour, heure)
761        PRINT *, ' Time of beginning : y m d h', an, mois,jour, heure/3600.
762
763        day = int(daytime)
764                time = daytime-day
765
766                PRINT*,'****** intialised fields from restart1dyn *******'
767                PRINT*, 'plev,play,phi,phis,presnivs,u,v,temp,q,omega2'
768                PRINT*,'temp(1),q(1,1),u(1),v(1),plev(1),phis :'
769                PRINT*, temp(1), q(1, 1), u(1), v(1), plev(1), phis(1)
770                ! raz for safety
771                DO l = 1, llm
772                d_q_vert_adv(l, 1) = 0.
773                enddo
774                endif
775                !======================  end restart =================================
776                IF (ecrit_slab_oc==1) THEN
777        open(97, file = 'div_slab.dat', STATUS = 'UNKNOWN')
778                elseif (ecrit_slab_oc==0) THEN
779                open(97, file = 'div_slab.dat', STATUS = 'OLD')
780                endif
781
782                !=====================================================================
783                IF (CPPKEY_OUTPUTPHYSSCM) THEN
784                CALL iophys_ini(timestep)
785        END IF
786
787        !=====================================================================
788        ! START OF THE TEMPORAL LOOP :
789        !=====================================================================
790
791        it_end = nint(fnday*day_step)
792                DO while(it<=it_end)
793
794                IF (prt_level>=1) THEN
795        PRINT*, 'XXXXXXXXXXXXXXXXXXX ITAP,day,time=', &
796        it, day, time, it_end, day_step
797        PRINT*,'PAS DE TEMPS ', timestep
798        endif
799        IF (it==it_end) lastcall = .True.
800
801        !---------------------------------------------------------------------
802        ! Interpolation of forcings in time and onto model levels
803        !---------------------------------------------------------------------
804
805        INCLUDE "1D_interp_cases.h"
806
807                !---------------------------------------------------------------------
808                !  Geopotential :
809                !---------------------------------------------------------------------
810                phis(1)= zsurf*RG
811        !        phi(1)=phis(1)+RD*temp(1)*(plev(1)-play(1))/(.5*(plev(1)+play(1)))
812
813        ! Calculate geopotential from the ground surface since phi and phis are added in physiq_mod
814        phi(1)= RD*temp(1)*(plev(1)-play(1))/(.5*(plev(1)+play(1)))
815
816                DO l = 1, llm-1
817                phi(l+1)= phi(l)+RD*(temp(l)+temp(l+1))*                           &
818        (play(l)-play(l+1))/(play(l)+play(l+1))
819                enddo
820
821                !---------------------------------------------------------------------
822                !  Vertical advection
823                !---------------------------------------------------------------------
824
825                IF (forc_w+forc_omega > 0) THEN
826
827                IF (forc_w == 1) THEN
828                w_adv = w_mod_cas
829                z_adv = phi/RG
830                ELSE
831                w_adv = omega
832                z_adv =play
833        ENDIF
834
835        teta = temp*(pzero/play)**rkappa
836        DO l = 2, llm-1
837        ! vertical tendencies computed as d X / d t = -W  d X / d z
838        d_u_vert_adv(l)= -w_adv(l)*(u(l+1)-u(l-1))/(z_adv(l+1)-z_adv(l-1))
839                d_v_vert_adv(l)= -w_adv(l)*(v(l+1)-v(l-1))/(z_adv(l+1)-z_adv(l-1))
840                        ! d theta / dt = -W d theta / d z, transformed into d temp / d t dividing by (pzero/play(l))**rkappa
841                        d_t_vert_adv(l)= -w_adv(l)*(teta(l+1)-teta(l-1))/(z_adv(l+1)-z_adv(l-1)) / (pzero/play(l))**rkappa
842                d_q_vert_adv(l, 1)= -w_adv(l)*(q(l+1, 1)-q(l-1, 1))/(z_adv(l+1)-z_adv(l-1))
843                        enddo
844                        d_u_adv(:)= d_u_adv(:)+d_u_vert_adv(:)
845                        d_v_adv(:)= d_v_adv(:)+d_v_vert_adv(:)
846                        d_t_adv(:)= d_t_adv(:)+d_t_vert_adv(:)
847                        d_q_adv(:, 1)= d_q_adv(:, 1)+d_q_vert_adv(:, 1)
848
849                ENDIF
850
851                !---------------------------------------------------------------------
852                ! Listing output for debug prt_level>=1
853                !---------------------------------------------------------------------
854                IF (prt_level>=1) THEN
855                PRINT *, ' avant physiq : -------- day time ', day, time
856                        WRITE(*, *) 'firstcall,lastcall,phis', &
857                firstcall, lastcall, phis
858                end if
859                        IF (prt_level>=5) THEN
860                WRITE(*, '(a10,2a4,4a13)') 'BEFOR1 IT=', 'it', 'l', &
861                'presniv', 'plev','play', 'phi'
862                WRITE(*, '(a10,2i4,4f13.2)') ('BEFOR1 IT= ', it, l, &
863                presnivs(l), plev(l), play(l), phi(l), l = 1, llm)
864                        WRITE(*, '(a11,2a4,a11,6a8)') 'BEFOR2', 'it', 'l', &
865                        'presniv', 'u','v', 'temp', 'q1', 'q2', 'omega2'
866                        WRITE(*, '(a11,2i4,f11.2,5f8.2,e10.2)') ('BEFOR2 IT= ', it, l, &
867                presnivs(l), u(l), v(l), temp(l), q(l, 1), q(l, 2), omega2(l), l = 1, llm)
868                        endif
869
870                        !---------------------------------------------------------------------
871                        !   Call physiq :
872                        !---------------------------------------------------------------------
873                        CALL physiq(ngrid, llm, &
874                        firstcall, lastcall, timestep, &
875                        plev, play, phi, phis, presnivs, &
876                        u, v, rot, temp, q,omega2, &
877                        du_phys, dv_phys, dt_phys, dq,dpsrf)
878                        firstcall = .FALSE.
879
880                        !---------------------------------------------------------------------
881                        ! Listing output for debug
882                        !---------------------------------------------------------------------
883                        IF (prt_level>=5) THEN
884                        WRITE(*, '(a11,2a4,4a13)') 'AFTER1 IT=', 'it', 'l', &
885                        'presniv', 'plev','play', 'phi'
886                        WRITE(*, '(a11,2i4,4f13.2)') ('AFTER1 it= ', it, l, &
887                presnivs(l), plev(l), play(l), phi(l), l = 1, llm)
888                        WRITE(*, '(a11,2a4,a11,6a8)') 'AFTER2', 'it', 'l', &
889                        'presniv', 'u','v', 'temp', 'q1', 'q2', 'omega2'
890                        WRITE(*, '(a11,2i4,f11.2,5f8.2,e10.2)') ('AFTER2 it= ', it, l, &
891                        presnivs(l), u(l), v(l), temp(l), q(l, 1), q(l, 2), omega2(l), l = 1, llm)
892                        WRITE(*, '(a11,2a4,a11,5a8)') 'AFTER3', 'it', 'l', &
893        'presniv', 'du_phys','dv_phys', 'dt_phys', 'dq1', 'dq2'
894        WRITE(*, '(a11,2i4,f11.2,5f8.2)') ('AFTER3 it= ', it, l, &
895        presnivs(l), 86400*du_phys(l), 86400*dv_phys(l), &
896        86400*dt_phys(l), 86400*dq(l, 1), dq(l, 2), l = 1, llm)
897                WRITE(*, *) 'dpsrf', dpsrf
898                endif
899                !---------------------------------------------------------------------
900                !   Add physical tendencies :
901                !---------------------------------------------------------------------
902
903                fcoriolis= 2.*sin(rpi*xlat/180.)*romega
904
905                IF (prt_level >= 5) PRINT*, 'fcoriolis, xlat,mxcalc ', &
906        fcoriolis, xlat, mxcalc
907
908        !---------------------------------------------------------------------
909        ! Geostrophic forcing
910        !---------------------------------------------------------------------
911
912        IF (forc_geo == 0) THEN
913        d_u_age(1:mxcalc)= 0.
914        d_v_age(1:mxcalc)= 0.
915        ELSE
916        sfdt = sin(0.5*fcoriolis*timestep)
917                cfdt = cos(0.5*fcoriolis*timestep)
918
919        d_u_age(1:mxcalc)= -2.*sfdt/timestep*                                &
920        (sfdt*(u(1:mxcalc)-ug(1:mxcalc)) -                          &
921                cfdt*(v(1:mxcalc)-vg(1:mxcalc)))
922                !!     : fcoriolis*(v(1:mxcalc)-vg(1:mxcalc))
923
924                d_v_age(1:mxcalc)= -2.*sfdt/timestep*                                 &
925        (cfdt*(u(1:mxcalc)-ug(1:mxcalc)) +                           &
926                sfdt*(v(1:mxcalc)-vg(1:mxcalc)))
927                !!     : -fcoriolis*(u(1:mxcalc)-ug(1:mxcalc))
928                ENDIF
929
930                !---------------------------------------------------------------------
931                !  Nudging
932                !  EV: rewrite the section to account for a time- and height-varying
933                !  nudging
934                !---------------------------------------------------------------------
935                d_t_nudge(:) = 0.
936        d_u_nudge(:) = 0.
937        d_v_nudge(:) = 0.
938        d_q_nudge(:, :) = 0.
939
940        DO l = 1, llm
941
942                IF (nudging_u < 0) THEN
943
944                d_u_nudge(l)=(u_nudg_mod_cas(l)-u(l))*invtau_u_nudg_mod_cas(l)
945
946                ELSE
947
948                IF (play(l) < p_nudging_u .AND. nint(nudging_u) /= 0) &
949                d_u_nudge(l)=(u_nudg_mod_cas(l)-u(l))/nudging_u
950
951        ENDIF
952
953
954        IF (nudging_v < 0) THEN
955
956        d_v_nudge(l)=(v_nudg_mod_cas(l)-v(l))*invtau_v_nudg_mod_cas(l)
957
958                ELSE
959
960
961                IF (play(l) < p_nudging_v .AND. nint(nudging_v) /= 0) &
962        d_v_nudge(l)=(v_nudg_mod_cas(l)-v(l))/nudging_v
963
964        ENDIF
965
966
967        IF (nudging_t < 0) THEN
968
969        d_t_nudge(l)=(temp_nudg_mod_cas(l)-temp(l))*invtau_temp_nudg_mod_cas(l)
970
971                ELSE
972
973
974                IF (play(l) < p_nudging_t .AND. nint(nudging_t) /= 0) &
975                d_t_nudge(l)=(temp_nudg_mod_cas(l)-temp(l))/nudging_t
976
977                ENDIF
978
979
980                IF (nudging_qv < 0) THEN
981
982        d_q_nudge(l, 1)=(qv_nudg_mod_cas(l)-q(l, 1))*invtau_qv_nudg_mod_cas(l)
983
984                ELSE
985
986                IF (play(l) < p_nudging_qv .AND. nint(nudging_qv) /= 0) &
987                d_q_nudge(l, 1)=(qv_nudg_mod_cas(l)-q(l, 1))/nudging_qv
988
989        ENDIF
990
991        ENDDO
992
993        !---------------------------------------------------------------------
994        !  Optional outputs
995        !---------------------------------------------------------------------
996
997                IF (CPPKEY_OUTPUTPHYSSCM) THEN
998                CALL iophys_ecrit('w_adv', klev, 'w_adv', 'K/day', w_adv)
999                CALL iophys_ecrit('z_adv', klev, 'z_adv', 'K/day', z_adv)
1000                CALL iophys_ecrit('dtadv', klev, 'dtadv', 'K/day', 86400*d_t_adv)
1001        CALL iophys_ecrit('dtdyn', klev, 'dtdyn', 'K/day', 86400*d_t_vert_adv)
1002                CALL iophys_ecrit('qv', klev, 'qv', 'g/kg', 1000*q(:, 1))
1003                CALL iophys_ecrit('qvnud', klev, 'qvnud', 'g/kg', 1000*u_nudg_mod_cas)
1004                CALL iophys_ecrit('u', klev, 'u', 'm/s', u)
1005                CALL iophys_ecrit('unud', klev, 'unud', 'm/s', u_nudg_mod_cas)
1006        CALL iophys_ecrit('v', klev, 'v', 'm/s', v)
1007                CALL iophys_ecrit('vnud', klev, 'vnud', 'm/s', v_nudg_mod_cas)
1008                CALL iophys_ecrit('temp', klev, 'temp', 'K', temp)
1009                CALL iophys_ecrit('tempnud', klev, 'temp_nudg_mod_cas', 'K', temp_nudg_mod_cas)
1010                CALL iophys_ecrit('dtnud', klev, 'dtnud', 'K/day', 86400*d_t_nudge)
1011        CALL iophys_ecrit('dqnud', klev, 'dqnud', 'K/day', 1000*86400*d_q_nudge(:, 1))
1012                END IF
1013
1014                IF (flag_inhib_forcing == 0) then ! if tendency of forcings should be added
1015
1016        u(1:mxcalc)= u(1:mxcalc) + timestep*(&
1017        du_phys(1:mxcalc)                                       &
1018        +d_u_age(1:mxcalc)+d_u_adv(1:mxcalc)                       &
1019        +d_u_nudge(1:mxcalc))
1020        v(1:mxcalc)= v(1:mxcalc) + timestep*(&
1021        dv_phys(1:mxcalc)                                       &
1022        +d_v_age(1:mxcalc)+d_v_adv(1:mxcalc)                       &
1023        +d_v_nudge(1:mxcalc))
1024                q(1:mxcalc, :)= q(1:mxcalc, :)+timestep*(&
1025        dq(1:mxcalc, :)                                        &
1026        +d_q_adv(1:mxcalc, :)                                   &
1027        +d_q_nudge(1:mxcalc, :))
1028
1029                IF (prt_level>=3) THEN
1030                PRINT *, &
1031                'physiq-> temp(1),dt_phys(1),d_t_adv(1),dt_cooling(1) ', &
1032                temp(1), dt_phys(1), d_t_adv(1), dt_cooling(1)
1033                PRINT*, 'dv_phys=', dv_phys
1034                PRINT* , 'd_v_age=', d_v_age
1035                PRINT*, 'd_v_adv=',d_v_adv
1036                PRINT*, 'd_v_nudge=', d_v_nudge
1037                PRINT*, v
1038                PRINT*, vg
1039                endif
1040
1041                temp(1:mxcalc)= temp(1:mxcalc)+timestep*(&
1042        dt_phys(1:mxcalc)                                       &
1043        +d_t_adv(1:mxcalc)                                       &
1044        +d_t_nudge(1:mxcalc)                                     &
1045        +dt_cooling(1:mxcalc))  ! Taux de chauffage ou refroid.
1046
1047
1048        !=======================================================================
1049        !! CONSERVE EN ATTENDANT QUE LE CAS EN QUESTION FONCTIONNE EN STD !!
1050        !=======================================================================
1051
1052        teta = temp*(pzero/play)**rkappa
1053
1054        !---------------------------------------------------------------------
1055        !   Nudge soil temperature if requested
1056        !---------------------------------------------------------------------
1057
1058        IF (nudge_tsoil .AND. .NOT. lastcall) THEN
1059        ftsoil(1, isoil_nudge, :) = ftsoil(1, isoil_nudge, :)                     &
1060        -timestep/tau_soil_nudge*(ftsoil(1, isoil_nudge, :)-Tsoil_nudge)
1061                ENDIF
1062
1063                !---------------------------------------------------------------------
1064                !   Add large-scale tendencies (advection, etc) :
1065                !---------------------------------------------------------------------
1066
1067                !cc nrlmd
1068                !cc        tmpvar=teta
1069                !cc        CALL advect_vert(llm,omega,timestep,tmpvar,plev)
1070                !cc
1071        !cc        teta(1:mxcalc)=tmpvar(1:mxcalc)
1072                !cc        tmpvar(:)=q(:,1)
1073                !cc        CALL advect_vert(llm,omega,timestep,tmpvar,plev)
1074                !cc        q(1:mxcalc,1)=tmpvar(1:mxcalc)
1075                !cc        tmpvar(:)=q(:,2)
1076                !cc        CALL advect_vert(llm,omega,timestep,tmpvar,plev)
1077                !cc        q(1:mxcalc,2)=tmpvar(1:mxcalc)
1078
1079                END IF ! end if tendency of tendency should be added
1080
1081                !---------------------------------------------------------------------
1082                !   Air temperature :
1083                !---------------------------------------------------------------------
1084                IF (lastcall) THEN
1085                PRINT*, 'Pas de temps final ', it
1086                CALL ju2ymds(daytime, an, mois, jour, heure)
1087                PRINT*, 'a la date : a m j h', an, mois, jour, heure/3600.
1088        endif
1089
1090        !  incremente day time
1091        daytime = daytime+1./day_step
1092        day = int(daytime+0.1/day_step)
1093                !        time = max(daytime-day,0.0)
1094                !Al1&jyg: correction de bug
1095                !cc        time = real(mod(it,day_step))/day_step
1096                time = time_ini/24.+real(mod(it, day_step))/day_step
1097                it = it+1
1098
1099                enddo
1100
1101                IF (ecrit_slab_oc/=-1) close(97)
1102
1103        !Al1 Call to 1D equivalent of dynredem (an,mois,jour,heure ?)
1104        ! ---------------------------------------------------------------------------
1105        CALL dyn1dredem("restart1dyn.nc", &
1106        plev, play, phi, phis,presnivs, &
1107        u, v, temp, q,omega2)
1108
1109        CALL abort_gcm ('lmdz1d   ', 'The End  ', 0)
1110
1111END SUBROUTINE scm
1112END MODULE lmdz_scm
Note: See TracBrowser for help on using the repository browser.