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

Last change on this file since 5218 was 5186, checked in by abarral, 3 months ago

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