SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
conserv_global_mass.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  SUBROUTINE conserv_global_mass (DTCO, IG, I, U, &
6  iluout,pzdg,pzdg_old,pfield,pfield_old)
7 !!
8 !!**** *CONSERV_GLOBAL_MASS* - routine to conserve global 3D mass (LAND USE case)
9 !!
10 !! PURPOSE
11 !! -------
12 !!
13 !! METHOD
14 !! ------
15 !!
16 !! EXTERNAL
17 !! --------
18 !!
19 !! IMPLICIT ARGUMENTS
20 !! ------------------
21 !!
22 !! REFERENCE
23 !! ---------
24 !!
25 !! AUTHOR
26 !! ------
27 !!
28 !! R. Alkama Meteo-France
29 !!
30 !! MODIFICATION
31 !! ------------
32 !! Original 07/2011
33 !!
34 !!
35 !!* 0. DECLARATION
36 ! -----------
37 !
38 !
39 !
41 USE modd_isba_grid_n, ONLY : isba_grid_t
42 USE modd_isba_n, ONLY : isba_t
43 USE modd_surf_atm_n, ONLY : surf_atm_t
44 !
45 USE modd_surf_par, ONLY : xundef
46 !
48 USE modi_get_surf_mask_n
49 !
50 USE yomhook ,ONLY : lhook, dr_hook
51 USE parkind1 ,ONLY : jprb
52 !
53 IMPLICIT NONE
54 !
55 !* 0.1 Declaration of arguments
56 ! ------------------------
57 !
58 !
59 TYPE(data_cover_t), INTENT(INOUT) :: dtco
60 TYPE(isba_grid_t), INTENT(INOUT) :: ig
61 TYPE(isba_t), INTENT(INOUT) :: i
62 TYPE(surf_atm_t), INTENT(INOUT) :: u
63 !
64 INTEGER, INTENT(IN ) :: iluout
65 REAL, DIMENSION(:,:,:), INTENT(IN ) :: pfield_old,pzdg,pzdg_old
66 REAL, DIMENSION(:,:,:), INTENT(INOUT) :: pfield
67 !
68 !* 0.2 Declaration of local variables
69 ! ------------------------------
70 !
71 REAL, DIMENSION(SIZE(PFIELD,1)) :: zfield,zfield_old, zfrac_nat
72 INTEGER, DIMENSION(SIZE(U%XNATURE)) :: imask ! mask for packing from complete field to nature field
73 INTEGER :: ini, ipatch, ifull, ilev
74 INTEGER :: jlev, jpatch, jj ! loop counter
75 REAL :: zratio_tot, zwork1,zwork2
76 !
77 REAL(KIND=JPRB) :: zhook_handle
78 !
79 !-------------------------------------------------------------------------------
80 !
81 IF (lhook) CALL dr_hook('CONSERV_GLOBAL_MASS',0,zhook_handle)
82 !
83 ini = SIZE(pfield,1)
84 ilev = SIZE(pfield,2)
85 ipatch = SIZE(pfield,3)
86 ifull = SIZE(u%XNATURE )
87 !
88 zfrac_nat = 1.
89  CALL get_surf_mask_n(dtco, u, &
90  'NATURE',ifull,imask,u%NSIZE_FULL,iluout)
91  CALL pack_same_rank(imask,u%XNATURE,zfrac_nat)
92 zfrac_nat(:)=zfrac_nat(:)*ig%XMESH_SIZE(:)
93 !
94 zfield(:) =0.0
95 zfield_old(:)=0.0
96 DO jpatch=1,ipatch
97  DO jlev=1,ilev
98  DO jj=1,ini
99  zfield(jj) = zfield(jj) + pfield(jj,jlev,jpatch)*pzdg(jj,jlev,jpatch)*i%XPATCH(jj,jpatch)
100  zfield_old(jj)= zfield_old(jj) + pfield_old(jj,jlev,jpatch)*pzdg_old(jj,jlev,jpatch)*i%XPATCH_OLD(jj,jpatch)
101  ENDDO
102  ENDDO
103 ENDDO
104 !
105 zwork1=0.0
106 zwork2=0.0
107 zratio_tot = 1.0
108 !
109 DO jj=1,ini
110  zwork1=zwork1+zfield(jj)*zfrac_nat(jj)
111  zwork2=zwork2+zfield_old(jj)*zfrac_nat(jj)
112 ENDDO
113 !
114 IF(zwork2/= 0.)THEN
115  zratio_tot = zwork1/zwork2
116 ENDIF
117 !
118 WHERE(pfield(:,:,:)/=xundef) pfield(:,:,:)= pfield(:,:,:) * zratio_tot
119 !
120 !-------------------------------------------------------------------------------
121 !
122 IF (lhook) CALL dr_hook('CONSERV_GLOBAL_MASS',1,zhook_handle)
123 !
124 !-------------------------------------------------------------------------------
125 !
126 END SUBROUTINE conserv_global_mass
subroutine conserv_global_mass(DTCO, IG, I, U, ILUOUT, PZDG, PZDG_OLD, PFIELD, PFIELD_OLD)
subroutine get_surf_mask_n(DTCO, U, HTYPE, KDIM, KMASK, KLU, KLUOUT)