GCC Code Coverage Report


Directory: ./
File: phys/interfoce_lim.f90
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 0 93 0.0%
Branches: 0 78 0.0%

Line Branch Exec Source
1 !
2 ! $Header$
3 !
4 SUBROUTINE interfoce_lim(itime, dtime, jour, &
5 knon, knindex, &
6 debut, &
7 lmt_sst_p, pctsrf_new_p)
8
9 USE mod_grid_phy_lmdz
10 USE mod_phys_lmdz_para
11 USE indice_sol_mod
12
13 IMPLICIT NONE
14
15 INCLUDE "netcdf.inc"
16
17 ! Cette routine sert d'interface entre le modele atmospherique et un fichier
18 ! de conditions aux limites
19 !
20 ! L. Fairhead 02/2000
21 !
22 ! input:
23 ! itime numero du pas de temps courant
24 ! dtime pas de temps de la physique (en s)
25 ! jour jour a lire dans l'annee
26 ! nisurf index de la surface a traiter (1 = sol continental)
27 ! knon nombre de points dans le domaine a traiter
28 ! knindex index des points de la surface a traiter
29 ! klon taille de la grille
30 ! debut logical: 1er appel a la physique (initialisation)
31 !
32 ! output:
33 ! lmt_sst_p SST lues dans le fichier de CL
34 ! pctsrf_new-p sous-maille fractionnelle
35 !
36
37
38 ! Parametres d'entree
39 !****************************************************************************************
40 INTEGER, INTENT(IN) :: itime
41 INTEGER, INTENT(IN) :: jour
42 INTEGER, INTENT(IN) :: knon
43 INTEGER, DIMENSION(klon_loc), INTENT(IN) :: knindex
44 REAL , INTENT(IN) :: dtime
45 LOGICAL, INTENT(IN) :: debut
46
47 ! Parametres de sortie
48 !****************************************************************************************
49 REAL, INTENT(OUT), DIMENSION(klon_loc) :: lmt_sst_p
50 REAL, INTENT(OUT), DIMENSION(klon_loc,nbsrf) :: pctsrf_new_p
51
52
53 ! Variables locales avec l'attribut SAVE
54 !****************************************************************************************
55 ! frequence de lecture des conditions limites (en pas de physique)
56 INTEGER,SAVE :: lmt_pas
57 !$OMP THREADPRIVATE(lmt_pas)
58 ! pour indiquer que le jour a lire est deja lu pour une surface precedente
59 LOGICAL,SAVE :: deja_lu
60 !$OMP THREADPRIVATE(deja_lu)
61 INTEGER,SAVE :: jour_lu
62 !$OMP THREADPRIVATE(jour_lu)
63 CHARACTER (len = 20),SAVE :: fich ='limit.nc'
64 !$OMP THREADPRIVATE(fich)
65 LOGICAL, SAVE :: newlmt = .TRUE.
66 !$OMP THREADPRIVATE(newlmt)
67 LOGICAL, SAVE :: check = .FALSE.
68 !$OMP THREADPRIVATE(check)
69 REAL, ALLOCATABLE , SAVE, DIMENSION(:) :: sst_lu_p
70 !$OMP THREADPRIVATE(sst_lu_p)
71 REAL, ALLOCATABLE , SAVE, DIMENSION(:,:) :: pct_tmp_p
72 !$OMP THREADPRIVATE(pct_tmp_p)
73
74 ! Variables locales
75 !****************************************************************************************
76 INTEGER :: nid, nvarid
77 INTEGER :: ii
78 INTEGER :: ierr
79 INTEGER, DIMENSION(2) :: start, epais
80 CHARACTER (len = 20) :: modname = 'interfoce_lim'
81 CHARACTER (len = 80) :: abort_message
82 REAL, DIMENSION(klon_glo,nbsrf) :: pctsrf_new
83 REAL, DIMENSION(klon_glo,nbsrf) :: pct_tmp
84 REAL, DIMENSION(klon_glo) :: sst_lu
85 REAL, DIMENSION(klon_glo) :: nat_lu
86 !
87 ! Fin declaration
88 !****************************************************************************************
89
90 !****************************************************************************************
91 ! Start calculation
92 !
93 !****************************************************************************************
94 IF (debut .AND. .NOT. ALLOCATED(sst_lu_p)) THEN
95 lmt_pas = NINT(86400./dtime * 1.0) ! pour une lecture une fois par jour
96 jour_lu = jour - 1
97 ALLOCATE(sst_lu_p(klon_loc))
98 ALLOCATE(pct_tmp_p(klon_loc,nbsrf))
99 ENDIF
100
101 IF ((jour - jour_lu) /= 0) deja_lu = .FALSE.
102
103 IF (check) WRITE(*,*) modname, ' :: jour, jour_lu, deja_lu', jour, jour_lu, deja_lu
104 IF (check) WRITE(*,*) modname, ' :: itime, lmt_pas ', itime, lmt_pas,dtime
105
106 !****************************************************************************************
107 ! Ouverture et lecture du fichier pour le master process si c'est le bon moment
108 !
109 !****************************************************************************************
110 ! Tester d'abord si c'est le moment de lire le fichier
111 IF (MOD(itime-1, lmt_pas) == 0 .AND. .NOT. deja_lu) THEN
112
113 !$OMP MASTER
114 IF (is_mpi_root) THEN
115
116 fich = TRIM(fich)
117 ierr = NF_OPEN (fich, NF_NOWRITE,nid)
118 IF (ierr.NE.NF_NOERR) THEN
119 abort_message = 'Pb d''ouverture du fichier de conditions aux limites'
120 CALL abort_physic(modname,abort_message,1)
121 ENDIF
122
123 ! La tranche de donnees a lire:
124
125 start(1) = 1
126 start(2) = jour
127 epais(1) = klon_glo
128 epais(2) = 1
129
130 IF (newlmt) THEN
131 !
132 ! Fraction "ocean"
133 !
134 ierr = NF_INQ_VARID(nid, 'FOCE', nvarid)
135 IF (ierr /= NF_NOERR) THEN
136 abort_message = 'Le champ <FOCE> est absent'
137 CALL abort_physic(modname,abort_message,1)
138 ENDIF
139 ierr = NF_GET_VARA_DOUBLE(nid,nvarid,start,epais,pct_tmp(1,is_oce))
140 IF (ierr /= NF_NOERR) THEN
141 abort_message = 'Lecture echouee pour <FOCE>'
142 CALL abort_physic(modname,abort_message,1)
143 ENDIF
144 !
145 ! Fraction "glace de mer"
146 !
147 ierr = NF_INQ_VARID(nid, 'FSIC', nvarid)
148 IF (ierr /= NF_NOERR) THEN
149 abort_message = 'Le champ <FSIC> est absent'
150 CALL abort_physic(modname,abort_message,1)
151 ENDIF
152 ierr = NF_GET_VARA_DOUBLE(nid,nvarid,start,epais,pct_tmp(1,is_sic))
153 IF (ierr /= NF_NOERR) THEN
154 abort_message = 'Lecture echouee pour <FSIC>'
155 CALL abort_physic(modname,abort_message,1)
156 ENDIF
157 !
158 ! Fraction "terre"
159 !
160 ierr = NF_INQ_VARID(nid, 'FTER', nvarid)
161 IF (ierr /= NF_NOERR) THEN
162 abort_message = 'Le champ <FTER> est absent'
163 CALL abort_physic(modname,abort_message,1)
164 ENDIF
165 ierr = NF_GET_VARA_DOUBLE(nid,nvarid,start,epais,pct_tmp(1,is_ter))
166 IF (ierr /= NF_NOERR) THEN
167 abort_message = 'Lecture echouee pour <FTER>'
168 CALL abort_physic(modname,abort_message,1)
169 ENDIF
170 !
171 ! Fraction "glacier terre"
172 !
173 ierr = NF_INQ_VARID(nid, 'FLIC', nvarid)
174 IF (ierr /= NF_NOERR) THEN
175 abort_message = 'Le champ <FLIC> est absent'
176 CALL abort_physic(modname,abort_message,1)
177 ENDIF
178 ierr = NF_GET_VARA_DOUBLE(nid,nvarid,start,epais,pct_tmp(1,is_lic))
179 IF (ierr /= NF_NOERR) THEN
180 abort_message = 'Lecture echouee pour <FLIC>'
181 CALL abort_physic(modname,abort_message,1)
182 ENDIF
183 !
184 ELSE ! on en est toujours a rnatur
185 !
186 ierr = NF_INQ_VARID(nid, 'NAT', nvarid)
187 IF (ierr /= NF_NOERR) THEN
188 abort_message = 'Le champ <NAT> est absent'
189 CALL abort_physic(modname,abort_message,1)
190 ENDIF
191 ierr = NF_GET_VARA_DOUBLE(nid,nvarid,start,epais, nat_lu)
192 IF (ierr /= NF_NOERR) THEN
193 abort_message = 'Lecture echouee pour <NAT>'
194 CALL abort_physic(modname,abort_message,1)
195 ENDIF
196 !
197 ! Remplissage des fractions de surface
198 ! nat = 0, 1, 2, 3 pour ocean, terre, glacier, seaice
199 !
200 pct_tmp = 0.0
201 DO ii = 1, klon_glo
202 pct_tmp(ii,NINT(nat_lu(ii)) + 1) = 1.
203 ENDDO
204
205 !
206 ! On se retrouve avec ocean en 1 et terre en 2 alors qu'on veut le contraire
207 !
208 pctsrf_new = pct_tmp
209 pctsrf_new (:,2)= pct_tmp (:,1)
210 pctsrf_new (:,1)= pct_tmp (:,2)
211 pct_tmp = pctsrf_new
212 ENDIF ! fin test sur newlmt
213 !
214 ! Lecture SST
215 !
216 ierr = NF_INQ_VARID(nid, 'SST', nvarid)
217 IF (ierr /= NF_NOERR) THEN
218 abort_message = 'Le champ <SST> est absent'
219 CALL abort_physic(modname,abort_message,1)
220 ENDIF
221 ierr = NF_GET_VARA_DOUBLE(nid,nvarid,start,epais, sst_lu)
222 IF (ierr /= NF_NOERR) THEN
223 abort_message = 'Lecture echouee pour <SST>'
224 CALL abort_physic(modname,abort_message,1)
225 ENDIF
226
227 !****************************************************************************************
228 ! Fin de lecture, fermeture de fichier
229 !
230 !****************************************************************************************
231 ierr = NF_CLOSE(nid)
232 ENDIF ! is_mpi_root
233
234 !$OMP END MASTER
235 !$OMP BARRIER
236
237
238 !****************************************************************************************
239 ! Distribue les variables sur tous les processus
240 !
241 !****************************************************************************************
242 CALL Scatter(sst_lu,sst_lu_p)
243 CALL Scatter(pct_tmp(:,is_oce),pct_tmp_p(:,is_oce))
244 CALL Scatter(pct_tmp(:,is_sic),pct_tmp_p(:,is_sic))
245 deja_lu = .TRUE.
246 jour_lu = jour
247 ENDIF
248
249 !****************************************************************************************
250 ! Recopie des variables dans les champs de sortie
251 !
252 !****************************************************************************************
253 lmt_sst_p = 999999999.
254
255 DO ii = 1, knon
256 lmt_sst_p(ii) = sst_lu_p(knindex(ii))
257 ENDDO
258
259 DO ii=1,klon_loc
260 pctsrf_new_p(ii,is_oce)=pct_tmp_p(ii,is_oce)
261 pctsrf_new_p(ii,is_sic)=pct_tmp_p(ii,is_sic)
262 ENDDO
263
264
265 END SUBROUTINE interfoce_lim
266