LMDZ
limit_slab.F90
Go to the documentation of this file.
1 ! $Id: limit_slab.F90 2344 2015-08-21 07:23:13Z emillour $
2 
3 SUBROUTINE limit_slab(itime, dtime, jour, lmt_bils, diff_sst, diff_siv)
4 
5  USE dimphy
6  USE mod_grid_phy_lmdz, ONLY: klon_glo
8  USE netcdf
10 
11  IMPLICIT NONE
12 
13  include "clesphys.h"
14 
15 ! In- and ouput arguments
16 !****************************************************************************************
17  INTEGER, INTENT(IN) :: itime ! numero du pas de temps courant
18  INTEGER, INTENT(IN) :: jour ! jour a lire dans l'annee
19  REAL , INTENT(IN) :: dtime ! pas de temps de la physique (en s)
20  REAL, DIMENSION(klon), INTENT(OUT) :: lmt_bils, diff_sst, diff_siv
21 
22 ! Locals variables with attribute SAVE
23 !****************************************************************************************
24  REAL, DIMENSION(:), ALLOCATABLE, SAVE :: bils_save, diff_sst_save
25  REAL, DIMENSION(:), ALLOCATABLE, SAVE :: diff_siv_save
26 !$OMP THREADPRIVATE(bils_save, diff_sst_save, diff_siv_save)
27 
28 ! Locals variables
29 !****************************************************************************************
30  INTEGER :: lmt_pas
31  INTEGER :: nvarid, nid, ierr, i
32  INTEGER, DIMENSION(2) :: start, epais
33  REAL, DIMENSION(klon_glo):: bils_glo, sst_l_glo, sst_lp1_glo, diff_sst_glo
34  REAL, DIMENSION(klon_glo):: siv_l_glo, siv_lp1_glo, diff_siv_glo
35  CHARACTER (len = 20) :: modname = 'limit_slab'
36  LOGICAL :: read_bils,read_sst,read_siv
37 
38 ! End declaration
39 !****************************************************************************************
40 
41  ! calculate number of time steps for one day
42  lmt_pas = nint(86400./dtime)
43 
44  ! F. Codron 5/14: add defaults for bils, diff_sst (0)
45  IF (mod(itime-1, lmt_pas) == 0) THEN ! time to read
46  !$OMP MASTER ! Only master thread
47  IF (is_mpi_root) THEN ! Only master processus
48  print*,'in limit_slab time to read, itime=',itime
49  read_bils=.true.
50  read_sst=.true.
51  read_siv=.true.
52 
53  ierr = nf90_open('limit_slab.nc', nf90_nowrite, nid)
54  IF (ierr /= nf90_noerr) THEN
55  read_bils=.false.
56  read_sst=.false.
57  read_siv=.false.
58  ELSE ! read file
59 
60  ! La tranche de donnees a lire:
61  start(1) = 1
62  start(2) = jour
63  epais(1) = klon_glo
64  epais(2) = 1
65 
66 !****************************************************************************************
67 ! 2) Read bils and SST/ ice volume tendency
68 !
69 !****************************************************************************************
70 !
71 ! Read bils_glo
72  ierr = nf90_inq_varid(nid, 'BILS_OCE', nvarid)
73  IF (ierr /= nf90_noerr) THEN
74  read_bils=.false.
75  ELSE
76  ierr = nf90_get_var(nid,nvarid,bils_glo,start,epais)
77  IF (ierr /= nf90_noerr) read_bils=.false.
78  END IF
79 ! Read sst_glo for this day
80  ierr = nf90_inq_varid(nid, 'SST', nvarid)
81  IF (ierr /= nf90_noerr) THEN
82  read_sst=.false.
83  ELSE
84  ierr = nf90_get_var(nid,nvarid,sst_l_glo,start,epais)
85  IF (ierr /= nf90_noerr) read_sst=.false.
86 ! Read sst_glo for one day ahead
87  start(2) = jour + 1
88  IF (start(2) > 360) start(2)=1
89  ierr = nf90_get_var(nid,nvarid,sst_lp1_glo,start,epais)
90  IF (ierr /= nf90_noerr) read_sst=.false.
91  END IF
92 
93 ! Read siv_glo for this day
94  ierr = nf90_inq_varid(nid, 'SICV', nvarid)
95  IF (ierr /= nf90_noerr) THEN
96  read_siv=.false.
97  ELSE
98  start(2) = jour
99  ierr = nf90_get_var(nid,nvarid,siv_l_glo,start,epais)
100  IF (ierr /= nf90_noerr) read_siv=.false.
101 ! Read siv_glo for one day ahead
102  start(2) = jour + 1
103  IF (start(2) > 360) start(2)=1
104  ierr = nf90_get_var(nid,nvarid,siv_lp1_glo,start,epais)
105  IF (ierr /= nf90_noerr) read_siv=.false.
106  END IF
107 
108 !****************************************************************************************
109 ! 5) Close file and distribute variables to all processus
110 !
111 !****************************************************************************************
112  ierr = nf90_close(nid)
113  IF (ierr /= nf90_noerr) CALL abort_physic(modname,'Pb when closing file', 1)
114  END IF ! Read File
115  IF (read_sst) THEN
116 ! Calculate difference in temperature between this day and one ahead
117  DO i=1, klon_glo
118  diff_sst_glo(i) = sst_lp1_glo(i) - sst_l_glo(i)
119  END DO
120  END IF !read_sst
121  IF (read_siv) THEN
122 ! Calculate difference in temperature between this day and one ahead
123  DO i=1, klon_glo
124  diff_siv_glo(i) = siv_lp1_glo(i) - siv_l_glo(i)
125  END DO
126  END IF !read_siv
127  ENDIF ! is_mpi_root
128 
129 !$OMP END MASTER
130 
131  IF (.NOT. ALLOCATED(bils_save)) THEN
132  ALLOCATE(bils_save(klon), diff_sst_save(klon), diff_siv_save(klon), stat=ierr)
133  IF (ierr /= 0) CALL abort_physic('limit_slab', 'pb in allocation',1)
134  END IF
135 
136 ! Give default values if needed
137  IF (read_bils) THEN
138  CALL scatter(bils_glo, bils_save)
139  ELSE
140  bils_save(:)=0.
141  END IF
142  IF (read_sst) THEN
143  CALL scatter(diff_sst_glo, diff_sst_save)
144  ELSE
145  diff_sst_save(:)=0.
146  END IF
147  IF (read_siv) THEN
148  CALL scatter(diff_siv_glo, diff_siv_save)
149  ELSE
150  diff_siv_save(:)=0.
151  END IF
152 
153  ENDIF ! time to read
154 
155  lmt_bils(:) = bils_save(:)
156  diff_sst(:) = diff_sst_save(:)
157  diff_siv(:) = diff_siv_save(:)
158 
159 
160 END SUBROUTINE limit_slab
integer, save klon
Definition: dimphy.F90:3
integer, save klon_glo
subroutine limit_slab(itime, dtime, jour, lmt_bils, diff_sst, diff_siv)
Definition: limit_slab.F90:4
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
Definition: calcul_STDlev.h:26
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
subroutine abort_physic(modname, message, ierr)
Definition: abort_physic.F90:3
Definition: dimphy.F90:1