SURFEX v8.1
General documentation of Surfex
init_isba_landuse.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 !#############################################################
6 SUBROUTINE init_isba_landuse (DTCO, UG, U, IO, NK, NP, NPE, PMESH_SIZE, HPROGRAM)
7 !#############################################################
8 !
9 !!**** *INIT_ISBA_LANDUSE* - routine to initialize land use for ISBA field
10 !!
11 !! PURPOSE
12 !! -------
13 ! Extrapolation from existing surounding cells with same patch properties:
14 !! (1) IPTS=n interpol field with n pts
15 !! (2) IPTS=0 conserve cells mass
16 !! Case 2 : simple extrapolation based on the inside cell informations.
17 !! this is donne before conserving cell or global mass
18 !!
19 !!
20 !!** METHOD
21 !! ------
22 !!
23 !! EXTERNAL
24 !! --------
25 !!
26 !!
27 !! IMPLICIT ARGUMENTS
28 !! ------------------
29 !!
30 !! REFERENCE
31 !! ---------
32 !!
33 !!
34 !! AUTHOR
35 !! ------
36 !! B. Decharme *Meteo France*
37 !!
38 !! MODIFICATIONS
39 !! -------------
40 !! Original 07/2011
41 !!
42 !-------------------------------------------------------------------------------
43 !
44 !* 0. DECLARATIONS
45 ! ------------
46 !
49 USE modd_surf_atm_n, ONLY : surf_atm_t
52 !
54 USE modd_surf_par,ONLY : xundef
55 !
56 USE modd_surfex_mpi, ONLY : nproc, ncomm
57 !
58 USE modi_get_luout
59 USE modi_ini_var_from_patch
60 USE modi_conserv_global_mass
61 !
62 USE yomhook ,ONLY : lhook, dr_hook
63 USE parkind1 ,ONLY : jprb
64 !
65 IMPLICIT NONE
66 !
67 #ifdef SFX_MPI
68 include "mpif.h"
69 #endif
70 !
71 !* 0.1 Declarations of arguments
72 ! -------------------------
73 !
74 !
75 TYPE(data_cover_t), INTENT(INOUT) :: DTCO
76 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
77 TYPE(surf_atm_t), INTENT(INOUT) :: U
78 TYPE(isba_options_t), INTENT(INOUT) :: IO
79 TYPE(isba_nk_t), INTENT(INOUT) :: NK
80 TYPE(isba_np_t), INTENT(INOUT) :: NP
81 TYPE(isba_npe_t), INTENT(INOUT) :: NPE
82 !
83 REAL, DIMENSION(:), INTENT(IN) :: PMESH_SIZE
84 !
85  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! program calling surf. schemes
86 !
87 !
88 !* 0.2 Declarations of local variables
89 ! -------------------------------
90 !
91 TYPE(isba_pe_t), POINTER :: PEK
92 TYPE(isba_p_t), POINTER :: PK
93 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZDG ! Actual layer thicknesses
94 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZZDG_OLD ! Old layer thicknesses
95 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWG_OLD ! Old XWG
96 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWGI_OLD ! Old XWGI
97 !
98 INTEGER, DIMENSION(IO%NPATCH,0:NPROC-1) :: ICOUNT_ALL
99 INTEGER, DIMENSION(IO%NPATCH) :: ICOUNT
100 INTEGER :: ILUOUT, ISIZE, JP, ICPT
101 INTEGER :: JLAYER, JNBIOMASS, JNLITTER, JNLITTLEVS, JNSOILCARB
102 #ifdef SFX_MPI
103 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
104 #endif
105 INTEGER :: INFOMPI
106 REAL(KIND=JPRB) :: ZHOOK_HANDLE
107 !
108 !-------------------------------------------------------------------------------
109 !
110 IF (lhook) CALL dr_hook('INIT_ISBA_LANDUSE',0,zhook_handle)
111  CALL get_luout(hprogram,iluout)
112 !
113 !-------------------------------------------------------------------------------
114 !
115 icount(:) = 0
116 DO jp=1,io%NPATCH
117  pk => np%AL(jp)
118  IF (pk%NSIZE_P==0) THEN
119  icount(jp) = 1
120  ELSEIF(all(pk%XDG(:,io%NGROUND_LAYER)==pk%XDG_OLD(:,io%NGROUND_LAYER))) THEN
121  icount(jp) = 1
122  ENDIF
123 ENDDO
124 !
125 IF (nproc>1) THEN
126 #ifdef SFX_MPI
127  CALL mpi_allgather(icount,SIZE(icount)*kind(icount)/4,mpi_integer,&
128  icount_all,kind(icount_all)/4,mpi_integer,ncomm,infompi)
129 #endif
130 ELSE
131  icount_all(:,0) = icount
132 ENDIF
133 !
134 icpt = 0
135 DO jp = 1,io%NPATCH
136  ! all the values are the same
137  IF (all(icount_all(jp,:)/=0)) icpt = icpt + 1
138 ENDDO
139 !
140 IF ( icpt==io%NPATCH ) THEN
141  IF (lhook) CALL dr_hook('INIT_ISBA_LANDUSE',1,zhook_handle)
142  RETURN
143 ENDIF
144 !
145 !-------------------------------------------------------------------------------
146 ! Conserve mass in the cell
147 !-------------------------------------------------------------------------------
148 !
149  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'WR ', 0)
150 
151 IF (io%LGLACIER) &
152  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH, hprogram,iluout,'ICE_STO ', 0)
153 !
154 DO jlayer=1,SIZE(npe%AL(1)%XTG,2)
155  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH, hprogram,iluout,'TEMP GRO', 0, jlayer)
156 END DO
157 !
158 !
159  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH, hprogram,iluout,'ALBSNOW ', 0)
160 !
161 IF (npe%AL(1)%TSNOW%SCHEME=='1-L' .OR. npe%AL(1)%TSNOW%SCHEME=='3-L' .OR. npe%AL(1)%TSNOW%SCHEME=='CRO') THEN
162  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'EMISSNOW', 0)
163  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'TSSNOW ', 0)
164 ENDIF
165 !
166 DO jlayer=1,npe%AL(1)%TSNOW%NLAYER
167  !
168  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'WSNOW ', 0, jlayer)
169  !
170  IF (npe%AL(1)%TSNOW%SCHEME=='3-L' .OR. npe%AL(1)%TSNOW%SCHEME=='CRO') THEN
171  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'TEMPSNOW',0, jlayer)
172  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'HEATSNOW', 0, jlayer)
173  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'AGESNOW ', 0, jlayer)
174  ENDIF
175  !
176  IF (npe%AL(1)%TSNOW%SCHEME=='1-L') THEN
177  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'TSNOW ', 0, jlayer)
178  ENDIF
179  !
180  IF(npe%AL(1)%TSNOW%SCHEME=='CRO') THEN
181  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'GR1SNOW', 0, jlayer)
182  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'GR2SNOW', 0, jlayer)
183  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'HISTSNOW', 0, jlayer)
184  ENDIF
185  !
186 ENDDO
187 !
188 !-------------------------------------------------------------------------------
189 ! Conserve mass globaly because soil depth change
190 !-------------------------------------------------------------------------------
191 !
192 ALLOCATE(zzdg(SIZE(np%AL(1)%XDG,1),SIZE(np%AL(1)%XDG,2),io%NPATCH))
193 ALLOCATE(zzdg_old(SIZE(np%AL(1)%XDG,1),SIZE(np%AL(1)%XDG,2),io%NPATCH))
194 ALLOCATE(zwg_old(SIZE(np%AL(1)%XDG,1),SIZE(np%AL(1)%XDG,2),io%NPATCH))
195 ALLOCATE(zwgi_old(SIZE(np%AL(1)%XDG,1),SIZE(np%AL(1)%XDG,2),io%NPATCH))
196 !
197 DO jp = 1,io%NPATCH
198  pek => npe%AL(jp)
199  pk => np%AL(jp)
200 
201  isize = np%AL(jp)%NSIZE_P
202  zwg_old(1:isize,:,jp) =pek%XWG (:,:)
203  zwgi_old(1:isize,:,jp) =pek%XWGI (:,:)
204  zzdg(1:isize,1,jp) =pk%XDG (:,1)
205  zzdg_old(1:isize,1,jp) =pk%XDG_OLD(:,1)
206  IF(io%CISBA=='DIF')THEN
207  DO jlayer=2,io%NGROUND_LAYER
208  zzdg(1:isize,jlayer,jp) = pk%XDG (:,jlayer)-pk%XDG (:,jlayer-1)
209  zzdg_old(1:isize,jlayer,jp) = pk%XDG_OLD(:,jlayer)-pk%XDG_OLD(:,jlayer-1)
210  ENDDO
211  ELSE
212  zzdg(:,2,jp) = pk%XDG (:,2)
213  zzdg_old(:,2,jp) = pk%XDG_OLD(:,2)
214  IF(io%CISBA=='3-L' )THEN
215  zzdg(:,3,jp) = pk%XDG (:,3)-pk%XDG (:,2)
216  zzdg_old(:,3,jp) = pk%XDG_OLD(:,3)-pk%XDG_OLD(:,2)
217  ENDIF
218  ENDIF
219 ENDDO
220 !
221 WHERE(zzdg(:,:,:) >1.e+10)zzdg(:,:,:)=0.
222 WHERE(zzdg_old(:,:,:)>1.e+10)zzdg_old(:,:,:)=0.
223 !
224 DO jlayer=1,io%NGROUND_LAYER
225  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'WG ', 0, jlayer)
226  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'WGI ', 0, jlayer)
227 ENDDO
228 !
229 !
230  CALL conserv_global_mass(dtco, u, np, npe, pmesh_size, io%NPATCH,iluout,zzdg,zzdg_old,'WG ',zwg_old)
231  CALL conserv_global_mass(dtco, u, np, npe, pmesh_size,io%NPATCH,iluout,zzdg,zzdg_old,'WGI',zwgi_old)
232 !
233 DEALLOCATE(zwg_old,zzdg,zzdg_old,zwgi_old)
234 !
235 !-------------------------------------------------------------------------------
236 ! Extrapolation with 3 pts
237 !-------------------------------------------------------------------------------
238 !
239  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'RESA ', 3, jlayer)
240 !
241 DO jlayer=1,npe%AL(1)%TSNOW%NLAYER
242  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'RHOSNOW ', 3, jlayer)
243 ENDDO
244 !
245 IF (io%CPHOTO/='NON') THEN
246  !
247  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'AN ', 3)
248  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'ANDAY ', 3)
249  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'ANFM ', 3)
250  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'LE ', 3)
251  !
252  DO jnbiomass=1,io%NNBIOMASS
253  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'RESPBIOM', 3,jnbiomass)
254  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'BIOMASS ', 3,jnbiomass)
255  ENDDO
256  !
257  IF (io%CRESPSL=='CNT') THEN
258  !
259  DO jnlittlevs=1,io%NNLITTLEVS
260  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'LIGNINST',3,jnlittlevs)
261  DO jnlitter=1,io%NNLITTER
262  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'LITTER ',3,jnlitter,jnlittlevs)
263  ENDDO
264  ENDDO
265  !
266  DO jnsoilcarb=1,io%NNSOILCARB
267  CALL ini_var_from_patch(dtco, ug, u, np, npe, io%NPATCH,hprogram,iluout,'SOILCARB',3,jnsoilcarb)
268  ENDDO
269  !
270  ENDIF
271  !
272 ENDIF
273 !
274 !-------------------------------------------------------------------------------
275 !
276 IF (lhook) CALL dr_hook('INIT_ISBA_LANDUSE',1,zhook_handle)
277 !
278 END SUBROUTINE init_isba_landuse
subroutine init_isba_landuse(DTCO, UG, U, IO, NK, NP, NPE, PMESH_SIZE, HPROGRAM)
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
subroutine conserv_global_mass(DTCO, U, NP, NPE, PMESH_SIZE, KPAT
logical lhook
Definition: yomhook.F90:15
subroutine ini_var_from_patch(DTCO, UG, U, NP, NPE, KPATCH, HPROGRAM, KLUOUT, HNAME, KPTS, KLAYER, KLAYER2, PDE