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

Last change on this file since 5182 was 5182, checked in by abarral, 10 days ago

(WIP) Replace REPROBUS CPP KEY by logical
properly name modules

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