source: LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/traclmdz_mod.F90 @ 1376

Last change on this file since 1376 was 1376, checked in by musat, 14 years ago

Output all tracers defined in .def in hist files with dynamic
declaration of LMDZ atmospheric tracers' output levels
Add 6 pseudo-water tracers with and without transport by boundary layer
IM

File size: 18.3 KB
Line 
1!$Id $
2!
3MODULE traclmdz_mod
4!
5! In this module all tracers specific to LMDZ are treated. This module is used
6! only if running without any other chemestry model as INCA or REPROBUS. 
7!
8
9  REAL,DIMENSION(:,:),ALLOCATABLE,SAVE :: masktr   ! Masque reservoir de sol traceur
10!$OMP THREADPRIVATE(masktr)                        ! Masque de l'echange avec la surface (1 = reservoir) ou (possible >= 1 )
11  REAL,DIMENSION(:,:),ALLOCATABLE,SAVE :: fshtr    ! Flux surfacique dans le reservoir de sol
12!$OMP THREADPRIVATE(fshtr)
13  REAL,DIMENSION(:),ALLOCATABLE,SAVE   :: hsoltr   ! Epaisseur equivalente du reservoir de sol
14!$OMP THREADPRIVATE(hsoltr)
15!
16!Radioelements:
17!--------------
18!
19  REAL,DIMENSION(:),ALLOCATABLE,SAVE   :: tautr    ! Constante de decroissance radioactive
20!$OMP THREADPRIVATE(tautr)
21  REAL,DIMENSION(:),ALLOCATABLE,SAVE   :: vdeptr   ! Vitesse de depot sec dans la couche Brownienne
22!$OMP THREADPRIVATE(vdeptr)
23  REAL,DIMENSION(:),ALLOCATABLE,SAVE   :: scavtr   ! Coefficient de lessivage
24!$OMP THREADPRIVATE(scavtr)
25  REAL,DIMENSION(:,:),ALLOCATABLE,SAVE :: srcbe    ! Production du beryllium7 dans l atmosphere (U/s/kgA)
26!$OMP THREADPRIVATE(srcbe)
27
28  LOGICAL,DIMENSION(:),ALLOCATABLE,SAVE :: radio    ! radio(it)   = true  => decroisssance radioactive
29!$OMP THREADPRIVATE(radio) 
30
31  REAL,DIMENSION(:,:),ALLOCATABLE,SAVE :: trs     ! Conc. radon ds le sol
32!$OMP THREADPRIVATE(trs)
33
34  INTEGER,SAVE :: id_be       ! Activation et position du traceur Be7 [ id_be=0 -> desactive ]
35!$OMP THREADPRIVATE(id_be)
36
37!IM ajout traceurs RR
38  INTEGER,SAVE :: id_dry !traceur dry intrusions
39!$OMP THREADPRIVATE(id_dry)
40  INTEGER,SAVE :: id_pcsat, id_pcocsat, id_pcq ! traceurs pseudo-vapeur CL qsat, qsat_oc, q
41!$OMP THREADPRIVATE(id_pcsat, id_pcocsat, id_pcq)
42  INTEGER,SAVE :: id_pcs0, id_pcos0, id_pcq0 ! traceurs pseudo-vapeur CL qsat, qsat_oc, q
43!                                            ! qui ne sont pas transportes par la convection
44!$OMP THREADPRIVATE(id_pcs0, id_pcos0, id_pcq0)
45
46  LOGICAL,SAVE :: rnpb=.TRUE. ! Presence du couple Rn222, Pb210
47!$OMP THREADPRIVATE(rnpb)
48
49
50CONTAINS
51
52  SUBROUTINE traclmdz_from_restart(trs_in)
53    ! This subroutine initialize the module saved variable trs with values from restart file (startphy.nc).
54    ! This subroutine is called from phyetat0 after the field trs_in has been read.
55   
56    USE dimphy
57    USE infotrac
58    IMPLICIT NONE
59   
60    ! Input argument
61    REAL,DIMENSION(klon,nbtr), INTENT(IN) :: trs_in
62   
63    ! Local variables
64    INTEGER :: ierr
65   
66    ! Allocate restart variables trs
67    ALLOCATE( trs(klon,nbtr), stat=ierr)
68    IF (ierr /= 0) CALL abort_gcm('traclmdz_from_restart', 'pb in allocation 1',1)
69   
70    ! Initialize trs with values read from restart file
71    trs(:,:) = trs_in(:,:)
72   
73  END SUBROUTINE traclmdz_from_restart
74
75
76  SUBROUTINE traclmdz_init(pctsrf, ftsol, tr_seri, t_seri, pplay, sh, aerosol, lessivage)
77    ! This subroutine allocates and initialize module variables and control variables.
78    USE dimphy
79    USE infotrac
80    USE carbon_cycle_mod, ONLY : carbon_cycle_init, carbon_cycle_tr, carbon_cycle_cpl
81
82    IMPLICIT NONE
83
84    INCLUDE "indicesol.h"
85
86! Input variables
87    REAL,DIMENSION(klon,nbsrf),INTENT(IN)     :: pctsrf ! Pourcentage de sol f(nature du sol)
88    REAL,DIMENSION(klon,nbsrf),INTENT(IN)     :: ftsol  ! Temperature du sol (surf)(Kelvin)
89!IM traceurs RR   REAL,DIMENSION(klon,klev,nbtr),INTENT(IN) :: tr_seri! Concentration Traceur [U/KgA] 
90    REAL,DIMENSION(klon,klev,nbtr),INTENT(INOUT) :: tr_seri! Concentration Traceur [U/KgA] 
91    REAL,DIMENSION(klon,klev),INTENT(IN)   :: t_seri  ! Temperature
92    REAL,DIMENSION(klon,klev),INTENT(IN)   :: pplay   ! pression pour le mileu de chaque couche (en Pa)
93    REAL,DIMENSION(klon,klev),INTENT(IN)   :: sh      ! humidite specifique
94
95! Output variables
96    LOGICAL,DIMENSION(nbtr), INTENT(OUT) :: aerosol
97    LOGICAL,INTENT(OUT)                  :: lessivage
98       
99! Local variables   
100    INTEGER :: ierr, it, iiq, i, k
101    REAL,DIMENSION(klon,klev)      :: qsat   ! pression de la vapeur a saturation
102   
103! --------------------------------------------
104! Allocation
105! --------------------------------------------
106
107    ALLOCATE( scavtr(nbtr), stat=ierr)
108    IF (ierr /= 0) CALL abort_gcm('traclmdz_init', 'pb in allocation 9',1)
109    scavtr(:)=1.
110   
111    ALLOCATE( radio(nbtr), stat=ierr)
112    IF (ierr /= 0) CALL abort_gcm('traclmdz_init', 'pb in allocation 11',1)
113    radio(:) = .false.    ! Par defaut pas decroissance radioactive
114   
115    ALLOCATE( masktr(klon,nbtr), stat=ierr)
116    IF (ierr /= 0) CALL abort_gcm('traclmdz_init', 'pb in allocation 2',1)
117   
118    ALLOCATE( fshtr(klon,nbtr), stat=ierr)
119    IF (ierr /= 0) CALL abort_gcm('traclmdz_init', 'pb in allocation 3',1)
120   
121    ALLOCATE( hsoltr(nbtr), stat=ierr)
122    IF (ierr /= 0) CALL abort_gcm('traclmdz_init', 'pb in allocation 4',1)
123   
124    ALLOCATE( tautr(nbtr), stat=ierr)
125    IF (ierr /= 0) CALL abort_gcm('traclmdz_init', 'pb in allocation 5',1)
126    tautr(:)  = 0.
127   
128    ALLOCATE( vdeptr(nbtr), stat=ierr)
129    IF (ierr /= 0) CALL abort_gcm('traclmdz_init', 'pb in allocation 6',1)
130    vdeptr(:) = 0.
131
132
133    lessivage  = .TRUE.
134    aerosol(:) = .FALSE.  ! Tous les traceurs sont des gaz par defaut
135   
136!
137! Recherche des traceurs connus : Be7, CO2,...
138! --------------------------------------------
139    id_be=0
140    DO it=1,nbtr
141       iiq=niadv(it+2)
142       IF ( tname(iiq) == "BE" .OR. tname(iiq) == "Be" .OR.  &
143            tname(iiq) == "BE7" .OR. tname(iiq) == "Be7" ) THEN 
144          ! Recherche du Beryllium 7
145          id_be=it
146          ALLOCATE( srcbe(klon,klev) )
147          radio(id_be) = .TRUE.
148          aerosol(id_be) = .TRUE. ! le Be est un aerosol
149          CALL init_be(pctsrf,masktr(:,id_be),tautr(id_be),vdeptr(id_be),scavtr(id_be),srcbe)
150          WRITE(*,*) 'Initialisation srcBe: OK'
151       END IF   
152    END DO
153
154    id_dry=0
155
156    DO it=1,nbtr
157       iiq=niadv(it+2)
158       IF ( tname(iiq) == "dry" .OR. tname(iiq) == "Dry" ) THEN
159        id_dry=it
160       END IF   
161    END DO 
162
163    id_pcsat=0
164    DO it=1,nbtr
165       iiq=niadv(it+2)
166       IF ( tname(iiq) == "pcsat" .OR. tname(iiq) == "Pcsat" ) THEN
167        id_pcsat=it
168      END IF
169    END DO
170
171    id_pcocsat=0
172    DO it=1,nbtr
173       iiq=niadv(it+2)
174       IF ( tname(iiq) == "pcocsat" .OR. tname(iiq) == "Pcocsat" ) THEN
175        id_pcocsat=it
176       END IF
177    END DO
178
179    id_pcq=0
180    DO it=1,nbtr
181       iiq=niadv(it+2)
182       IF ( tname(iiq) == "pcq" .OR. tname(iiq) == "Pcq" ) THEN
183        id_pcq=it
184       END IF
185    END DO
186
187    id_pcs0=0
188    DO it=1,nbtr
189       iiq=niadv(it+2)
190       IF ( tname(iiq) == "pcs0" .OR. tname(iiq) == "Pcs0" ) THEN
191        id_pcs0=it
192      END IF
193    END DO
194
195    id_pcos0=0
196    DO it=1,nbtr
197       iiq=niadv(it+2)
198       IF ( tname(iiq) == "pcos0" .OR. tname(iiq) == "Pcos0" ) THEN
199        id_pcos0=it
200       END IF
201    END DO
202
203    id_pcq0=0
204    DO it=1,nbtr
205       iiq=niadv(it+2)
206       IF ( tname(iiq) == "pcq0" .OR. tname(iiq) == "Pcq0" ) THEN
207        id_pcq0=it
208       END IF
209    END DO
210
211!
212! Valeurs specifiques pour les traceurs Rn222 et Pb210
213! ----------------------------------------------
214    IF (rnpb) THEN
215       
216       radio(1)= .TRUE.
217       radio(2)= .TRUE.
218       pbl_flg(1) = 0 ! au lieu de clsol=true ! CL au sol calcule
219       pbl_flg(2) = 0 ! au lieu de clsol=true
220       
221       aerosol(2) = .TRUE. ! le Pb est un aerosol
222       
223       CALL initrrnpb (ftsol,pctsrf,masktr,fshtr,hsoltr,tautr,vdeptr,scavtr)
224    END IF
225
226!
227! Initialisation de module carbon_cycle_mod
228! ----------------------------------------------
229    IF (carbon_cycle_tr .OR. carbon_cycle_cpl) THEN
230       CALL carbon_cycle_init(tr_seri, aerosol, radio)
231    END IF
232
233!IM initialisation traceurs pseudo-vapeurs
234    call q_sat(klon*klev,t_seri,pplay,qsat)
235    IF ( id_pcsat /= 0 ) THEN
236     DO k = 1, klev
237      DO i = 1, klon
238       IF ( pplay(i,k).GE.85000.) THEN
239        tr_seri(i,k,id_pcsat) = qsat(i,k)
240       ELSE
241        tr_seri(i,k,id_pcsat) = 100.
242       END IF
243      END DO
244     END DO
245    END IF
246
247    IF ( id_pcocsat /= 0 ) THEN
248     DO k = 1, klev
249      DO i = 1, klon
250       IF ( pplay(i,k).GE.85000.) THEN
251        IF ( pctsrf (i, is_oce) > 0. ) THEN
252         tr_seri(i,k,id_pcocsat) = qsat(i,k)
253        ELSE
254         tr_seri(i,k,id_pcocsat) = 100.
255        END IF
256       END IF
257      END DO
258     END DO
259    END IF
260
261    IF ( id_pcq /= 0 ) THEN
262     DO k = 1, klev
263      DO i = 1, klon
264       IF ( pplay(i,k).GE.85000.) THEN
265        tr_seri(i,k,id_pcq) = sh(i,k)
266       ELSE
267        tr_seri(i,k,id_pcq) = 100.
268       END IF
269      END DO
270     END DO
271    END IF
272
273    IF ( id_pcs0 /= 0 ) THEN
274     DO k = 1, klev
275      DO i = 1, klon
276       IF ( pplay(i,k).GE.85000.) THEN
277        tr_seri(i,k,id_pcs0) = qsat(i,k)
278       ELSE
279        tr_seri(i,k,id_pcs0) = 100.
280       END IF
281      END DO
282     END DO
283    END IF
284
285    IF ( id_pcos0 /= 0 ) THEN
286     DO k = 1, klev
287      DO i = 1, klon
288       IF ( pplay(i,k).GE.85000.) THEN
289        IF ( pctsrf (i, is_oce) > 0. ) THEN
290         tr_seri(i,k,id_pcos0) = qsat(i,k)
291        ELSE
292         tr_seri(i,k,id_pcos0) = 100.
293        END IF
294       END IF
295      END DO
296     END DO
297    END IF
298
299    IF ( id_pcq0 /= 0 ) THEN
300     DO k = 1, klev
301      DO i = 1, klon
302       IF ( pplay(i,k).GE.85000.) THEN
303        tr_seri(i,k,id_pcq0) = sh(i,k)
304       ELSE
305        tr_seri(i,k,id_pcq0) = 100.
306       END IF
307      END DO
308     END DO
309    END IF
310 
311  END SUBROUTINE traclmdz_init
312
313  SUBROUTINE traclmdz(                           &
314       nstep,    pdtphys,      t_seri,           &
315       paprs,    pplay,        cdragh,  coefh,   &
316       yu1,      yv1,          ftsol,   pctsrf,  &
317       xlat,     couchelimite, sh,               &
318       tr_seri,  source,       solsym,  d_tr_cl)
319   
320    USE dimphy
321    USE infotrac
322    USE carbon_cycle_mod, ONLY : carbon_cycle, carbon_cycle_tr, carbon_cycle_cpl
323   
324    IMPLICIT NONE
325   
326    INCLUDE "YOMCST.h"
327    INCLUDE "indicesol.h"
328
329!==========================================================================
330!                   -- DESCRIPTION DES ARGUMENTS --
331!==========================================================================
332
333! Input arguments
334!
335!Configuration grille,temps:
336    INTEGER,INTENT(IN) :: nstep      ! nombre d'appels de la physiq
337    REAL,INTENT(IN)    :: pdtphys    ! Pas d'integration pour la physique (seconde) 
338    REAL,DIMENSION(klon),INTENT(IN) :: xlat    ! latitudes pour chaque point
339
340!
341!Physique:
342!--------
343    REAL,DIMENSION(klon,klev),INTENT(IN)   :: t_seri  ! Temperature
344    REAL,DIMENSION(klon,klev+1),INTENT(IN) :: paprs   ! pression pour chaque inter-couche (en Pa)
345    REAL,DIMENSION(klon,klev),INTENT(IN)   :: pplay   ! pression pour le mileu de chaque couche (en Pa)
346
347
348!Couche limite:
349!--------------
350!
351    REAL,DIMENSION(klon,klev),INTENT(IN) :: cdragh     ! coeff drag pour T et Q
352    REAL,DIMENSION(klon,klev),INTENT(IN) :: coefh      ! coeff melange CL (m**2/s)
353    REAL,DIMENSION(klon),INTENT(IN)      :: yu1        ! vents au premier niveau
354    REAL,DIMENSION(klon),INTENT(IN)      :: yv1        ! vents au premier niveau
355    LOGICAL,INTENT(IN)                   :: couchelimite
356!IM traceurs RR
357    REAL,DIMENSION(klon,klev),INTENT(IN)   :: sh      ! humidite specifique
358
359! Arguments necessaires pour les sources et puits de traceur:
360    REAL,DIMENSION(klon,nbsrf),INTENT(IN) :: ftsol  ! Temperature du sol (surf)(Kelvin)
361    REAL,DIMENSION(klon,nbsrf),INTENT(IN) :: pctsrf ! Pourcentage de sol f(nature du sol)
362
363
364! InOutput argument
365    REAL,DIMENSION(klon,klev,nbtr),INTENT(INOUT)  :: tr_seri ! Concentration Traceur [U/KgA] 
366
367! Output argument
368    CHARACTER(len=8),DIMENSION(nbtr), INTENT(OUT) :: solsym
369    REAL,DIMENSION(klon,nbtr), INTENT(OUT)        :: source  ! a voir lorsque le flux de surface est prescrit
370    REAL,DIMENSION(klon,klev,nbtr), INTENT(OUT)   :: d_tr_cl ! Td couche limite/traceur
371
372!=======================================================================================
373!                        -- VARIABLES LOCALES TRACEURS --
374!=======================================================================================
375
376    INTEGER :: i, k, it
377
378    REAL,DIMENSION(klon)           :: d_trs    ! Td dans le reservoir
379    REAL,DIMENSION(klon,klev)      :: delp     ! epaisseur de couche (Pa)
380   
381    REAL,DIMENSION(klon,klev,nbtr) :: d_tr_dec ! Td radioactive
382    REAL                           :: zrho      ! Masse Volumique de l'air KgA/m3
383
384!IM traceurs RR
385    REAL,DIMENSION(klon,klev)      :: qsat   ! pression de la vapeur a saturation
386    REAL :: amn, amx
387!
388!=================================================================
389!  Ajout de la production en  Be7 (Beryllium) srcbe U/s/kgA
390!=================================================================
391!
392    IF ( id_be /= 0 ) THEN
393       DO k = 1, klev
394          DO i = 1, klon
395             tr_seri(i,k,id_be) = tr_seri(i,k,id_be)+srcbe(i,k)*pdtphys
396          END DO
397       END DO
398       WRITE(*,*) 'Ajout srcBe dans tr_seri: OK'
399    END IF
400 
401!IM ajout traceurs RR
402    call q_sat(klon*klev,t_seri,pplay,qsat)
403   
404    IF ( id_pcsat /= 0 ) THEN
405     DO k = 1, klev
406      DO i = 1, klon
407       IF ( pplay(i,k).GE.85000.) THEN
408        tr_seri(i,k,id_pcsat) = qsat(i,k)
409       END IF
410      END DO
411     END DO
412    END IF
413
414    IF ( id_pcocsat /= 0 ) THEN
415     DO k = 1, klev
416      DO i = 1, klon
417       IF ( pplay(i,k).GE.85000.) THEN
418        IF ( pctsrf (i, is_oce) > 0. ) THEN
419         tr_seri(i,k,id_pcocsat) = qsat(i,k)
420        END IF
421       END IF
422      END DO
423     END DO
424    END IF
425
426    IF ( id_pcq /= 0 ) THEN
427     DO k = 1, klev
428      DO i = 1, klon
429       IF ( pplay(i,k).GE.85000.) THEN
430        tr_seri(i,k,id_pcq) = sh(i,k)
431       END IF
432      END DO
433     END DO
434    END IF
435
436    IF ( id_pcs0 /= 0 ) THEN
437     DO k = 1, klev
438      DO i = 1, klon
439       IF ( pplay(i,k).GE.85000.) THEN
440        tr_seri(i,k,id_pcs0) = qsat(i,k)
441       END IF
442      END DO
443     END DO
444    END IF
445
446    IF ( id_pcos0 /= 0 ) THEN
447     DO k = 1, klev
448      DO i = 1, klon
449       IF ( pplay(i,k).GE.85000.) THEN
450        IF ( pctsrf (i, is_oce) > 0. ) THEN
451         tr_seri(i,k,id_pcos0) = qsat(i,k)
452        END IF
453       END IF
454      END DO
455     END DO
456    END IF
457
458    IF ( id_pcq0 /= 0 ) THEN
459     DO k = 1, klev
460      DO i = 1, klon
461       IF ( pplay(i,k).GE.85000.) THEN
462        tr_seri(i,k,id_pcq0) = sh(i,k)
463       END IF
464      END DO
465     END DO
466    END IF
467
468    DO it=1,nbtr
469       WRITE(solsym(it),'(i2)') it
470    END DO
471!======================================================================
472!     -- Calcul de l'effet de la couche limite --
473!======================================================================
474
475    IF (couchelimite) THEN             
476       source(:,:) = 0.0
477
478       IF (id_be /=0) THEN
479          DO i=1, klon
480             zrho = pplay(i,1)/t_seri(i,1)/RD
481             source(i,id_be) = - vdeptr(id_be)*tr_seri(i,1,id_be)*zrho
482          END DO
483       END IF
484
485    END IF
486   
487
488    DO k = 1, klev
489       DO i = 1, klon
490          delp(i,k) = paprs(i,k)-paprs(i,k+1)
491       END DO
492    END DO
493   
494    DO it=1, nbtr
495       IF (couchelimite .AND. pbl_flg(it) == 0 ) THEN ! couche limite avec quantite dans le sol calculee
496          CALL cltracrn(it, pdtphys, yu1, yv1,     &
497               cdragh, coefh,t_seri,ftsol,pctsrf,  &
498               tr_seri(:,:,it),trs(:,it),          &
499               paprs, pplay, delp,                 &
500               masktr(:,it),fshtr(:,it),hsoltr(it),&
501               tautr(it),vdeptr(it),               &
502               xlat,d_tr_cl(:,:,it),d_trs)
503         
504          DO k = 1, klev
505             DO i = 1, klon
506                tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr_cl(i,k,it)
507             END DO
508          END DO
509       
510          ! Traceur dans le reservoir sol
511          DO i = 1, klon
512             trs(i,it) = trs(i,it) + d_trs(i)
513          END DO
514       END IF
515    END DO
516         
517!IM traceurs RR
518    IF ( id_pcsat /= 0 ) THEN
519     DO k = 1, klev
520      DO i = 1, klon
521       IF ( pplay(i,k).LT.85000.) THEN
522        tr_seri(i,k,id_pcsat) = MIN (qsat(i,k), tr_seri(i,k,id_pcsat))
523       END IF
524      END DO
525     END DO
526    END IF
527
528    IF ( id_pcocsat /= 0 ) THEN
529     DO k = 1, klev
530      DO i = 1, klon
531       IF ( pplay(i,k).LT.85000.) THEN
532        tr_seri(i,k,id_pcocsat) = MIN (qsat(i,k), tr_seri(i,k,id_pcocsat))
533       END IF
534      END DO
535     END DO
536    END IF
537
538    IF ( id_pcq /= 0 ) THEN
539     DO k = 1, klev
540      DO i = 1, klon
541       IF ( pplay(i,k).LT.85000.) THEN
542        tr_seri(i,k,id_pcq) = MIN (qsat(i,k), tr_seri(i,k,id_pcq))
543       END IF
544      END DO 
545     END DO 
546    END IF 
547
548    IF ( id_pcs0 /= 0 ) THEN
549     DO k = 1, klev
550      DO i = 1, klon
551       IF ( pplay(i,k).LT.85000.) THEN
552        tr_seri(i,k,id_pcs0) = MIN (qsat(i,k), tr_seri(i,k,id_pcs0))
553       END IF
554      END DO
555     END DO
556    END IF
557
558    IF ( id_pcos0 /= 0 ) THEN
559     DO k = 1, klev
560      DO i = 1, klon
561       IF ( pplay(i,k).LT.85000.) THEN
562        tr_seri(i,k,id_pcos0) = MIN (qsat(i,k), tr_seri(i,k,id_pcos0))
563       END IF
564      END DO
565     END DO
566    END IF
567
568    IF ( id_pcq0 /= 0 ) THEN
569     DO k = 1, klev
570      DO i = 1, klon
571       IF ( pplay(i,k).LT.85000.) THEN
572        tr_seri(i,k,id_pcq0) = MIN (qsat(i,k), tr_seri(i,k,id_pcq0))
573       END IF
574      END DO
575     END DO
576    END IF
577!======================================================================
578!   Calcul de l'effet du puits radioactif
579!======================================================================
580    CALL radio_decay (radio,rnpb,pdtphys,tautr,tr_seri,d_tr_dec)
581 
582    DO it=1,nbtr
583       IF(radio(it)) then     
584          DO k = 1, klev
585             DO i = 1, klon
586                tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr_dec(i,k,it)
587             END DO
588          END DO
589          CALL minmaxqfi(tr_seri(:,:,it),0.,1.e33,'puits rn it='//solsym(it))
590       END IF
591    END DO
592
593!======================================================================
594!   Calcul de cycle de carbon
595!======================================================================
596    IF (carbon_cycle_tr .OR. carbon_cycle_cpl) THEN
597       CALL carbon_cycle(nstep, pdtphys, pctsrf, tr_seri)
598    END IF
599
600  END SUBROUTINE traclmdz
601
602
603  SUBROUTINE traclmdz_to_restart(trs_out)
604    ! This subroutine is called from phyredem.F where the module
605    ! variable trs is written to restart file (restartphy.nc)
606    USE dimphy
607    USE infotrac
608   
609    IMPLICIT NONE
610   
611    REAL,DIMENSION(klon,nbtr), INTENT(OUT) :: trs_out
612    INTEGER :: ierr
613
614    IF ( ALLOCATED(trs) ) THEN
615       trs_out(:,:) = trs(:,:)
616    ELSE
617       ! No previous allocate of trs. This is the case for create_etat0_limit.
618       trs_out(:,:) = 0.0
619    END IF
620   
621  END SUBROUTINE traclmdz_to_restart
622 
623
624END MODULE traclmdz_mod
Note: See TracBrowser for help on using the repository browser.