6 ILUOUT, PZDG, PZDG_OLD, HNAME, PFIELD_OLD)
48 USE modi_get_surf_mask_n
70 REAL,
DIMENSION(:),
INTENT(IN) :: PMESH_SIZE
71 INTEGER,
INTENT(IN) :: KPATCH
73 INTEGER,
INTENT(IN ) :: ILUOUT
74 REAL,
DIMENSION(:,:,:),
INTENT(IN ) :: PFIELD_OLD,PZDG,PZDG_OLD
75 CHARACTER(LEN=3),
INTENT(IN) :: HNAME
82 REAL,
DIMENSION(U%NSIZE_NATURE,SIZE(NPE%AL(1)%XWG,2),KPATCH) :: ZFIELD0
83 REAL,
DIMENSION(U%NSIZE_NATURE) :: ZFIELD,ZFIELD_OLD, ZFRAC_NAT
84 INTEGER,
DIMENSION(SIZE(U%XNATURE)) :: IMASK
85 INTEGER :: INI, IPATCH, IFULL, ILEV
86 INTEGER :: JLEV, JP, JJ
87 REAL :: ZRATIO_TOT, ZWORK1,ZWORK2
89 REAL,
DIMENSION(:),
ALLOCATABLE :: ZFIELD_TOT, ZFIELD_OLD_TOT, ZFRAC_NAT_TOT
92 REAL(KIND=JPRB) :: ZHOOK_HANDLE
96 IF (
lhook)
CALL dr_hook(
'CONSERV_GLOBAL_MASS',0,zhook_handle)
98 IF (trim(hname)==
"WG")
THEN 100 zfield0(:,:,jp) = npe%AL(jp)%XWG(:,:)
102 ELSEIF (trim(hname)==
"WGI")
THEN 104 zfield0(:,:,jp) = npe%AL(jp)%XWGI(:,:)
110 ifull =
SIZE(u%XNATURE )
113 CALL get_surf_mask_n(dtco, u,
'NATURE',ifull,imask,u%NSIZE_FULL,iluout)
115 zfrac_nat(:)=zfrac_nat(:)*pmesh_size(:)
125 zfield(imask) = zfield(imask) + zfield0(jj,jlev,jp)*pzdg(jj
138 zwork1=zwork1+zfield(jj)*zfrac_nat(jj)
139 zwork2=zwork2+zfield_old(jj)*zfrac_nat(jj)
143 ALLOCATE(zfield_tot(u%NDIM_FULL),zfield_old_tot(u%NDIM_FULL),zfrac_nat_tot
145 ALLOCATE(zfield_tot(0),zfield_old_tot(0),zfrac_nat_tot(0))
152 IF (zfield_tot(jj)/=
xundef)
THEN 153 zwork1=zwork1+zfield_tot(jj)*zfrac_nat_tot(jj)
154 zwork2=zwork2+zfield_old_tot(jj)*zfrac_nat_tot(jj)
159 CALL mpi_bcast(zwork1,kind(zwork1)/4,mpi_real,
npio,
ncomm,infompi)
160 CALL mpi_bcast(zwork2,kind(zwork2)/4,mpi_real,
npio,
ncomm,infompi)
162 DEALLOCATE(zfield_tot,zfield_old_tot,zfrac_nat_tot)
166 zratio_tot = zwork1/zwork2
169 WHERE(zfield0(:,:,:)/=
xundef) zfield0(:,:,:)= zfield0(:,:,:) * zratio_tot
171 IF (trim(hname)==
"WG")
THEN 173 npe%AL(jp)%XWG(:,:) = zfield0(:,:,jp)
175 ELSEIF (trim(hname)==
"WGI")
THEN 177 npe%AL(jp)%XWGI(:,:) = zfield0(:,:,jp)
183 IF (
lhook)
CALL dr_hook(
'CONSERV_GLOBAL_MASS',1,zhook_handle)
subroutine get_surf_mask_n(DTCO, U, HTYPE, KDIM, KMASK, KLU, KLUOUT)
subroutine conserv_global_mass(DTCO, U, NP, NPE, PMESH_SIZE, KPAT