Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
! ######spl
! #####################################
SUBROUTINE BUDGET(PVARS,KBUDN,HBUVAR,YDDDH, YDLDDH, YDMDDH)
USE PARKIND1, ONLY : JPRB
USE YOMHOOK , ONLY : LHOOK, DR_HOOK
! #####################################
!
!! BUDGET - routine to call the BUDGET routine for AROME.
!!
!! BEWARE THIS ROUTINE iS DIFFERENT FROM THE MNH ROUTINE BUDGET
!! EVEN IF IT WEARS THE SAME NAME !!!
!!
!! PURPOSE
!! -------
! This routine is an interface for the add_ddh subroutine.
! It converts the selected field into klev reversed vertical
! levels and attributes to the selected field are created.
!
!!** METHOD
!! ------
!!
!! 1st step: substract previous step (sequential approach in MNH)
!! 2nd step: reverse levels
!! 3rd step: multiplication by conversion factor for r-> q
!! or Theta-> T
!!
!! 4rd step: call to add_ddh now that the field has an Aladin shape
!!
!!
!! EXTERNAL
!! --------
!! ADD_FIELD_3D
!! INVERT_VLEV
!!
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!! Module MODD_INTBUDGET:
!!
!! PVARS_M(nlon,1,nlev,13) !13 different budgets
!! VARMULT(:,:,13) ! allows to convert variables
!!
!! REFERENCE
!! ---------
!! "New data flow for diagnostics in Arome/Arpege"
!!
!! AUTHOR
!! ------
!! O.Riviere 17/07/08 * Meteo France *
!!
!!
!! MODIFICATIONS
!! -------------
!! F.Voitus 16/05/17 : Introduction of new DDH superstructure for budget
!!
!-------------------------------------------------------------------------------
!
USE MODDB_INTBUDGET,ONLY:TAB_VARMULT,TVARSM,CVARNAME,NLON
USE DDH_MIX, ONLY:NFLEVGDDH,NPROMADDH,ADD_FIELD_3D, &
& TYP_DDH, NEW_ADD_FIELD_3D ! reference is Arpege
USE OML_MOD, ONLY : OML_MY_THREAD
USE YOMLDDH, ONLY : TLDDH
USE YOMMDDH, ONLY : TMDDH
IMPLICIT NONE
!
!
!* 0.1 Declarations of arguments :
!
REAL, DIMENSION(:,:,:), INTENT(IN) :: PVARS ! source of the variable
INTEGER , INTENT(IN) :: KBUDN ! variable number
CHARACTER (LEN=*) , INTENT(IN) :: HBUVAR ! Identifier of the Budget
TYPE(TYP_DDH) , INTENT(INOUT) :: YDDDH
TYPE(TLDDH) , INTENT(IN) :: YDLDDH
TYPE(TMDDH) , INTENT(IN) :: YDMDDH
!* 0.2 Declaration of local variables:
REAL,DIMENSION(NPROMADDH,NFLEVGDDH):: ZVARS
LOGICAL :: LINST,LDDH
INTEGER::IINCR,JLON,JLEV,IFDIA,IOFF
CHARACTER (LEN=4) :: CLPROC
CHARACTER (LEN=11) :: CLDDH
REAL(KIND=JPRB) :: ZHOOK_HANDLE
IF (LHOOK) CALL DR_HOOK('BUDGET',0,ZHOOK_HANDLE)
IFDIA=SIZE(PVARS,1)
ZVARS(:,:)=0.
IF (SIZE(PVARS,3)==NFLEVGDDH+2) THEN
IOFF=1
ELSE
IOFF=0
ENDIF
CLPROC=HBUVAR(1:4)
IF (YDLDDH%LDDH_OMP) THEN
CLDDH='T'//YDDDH%YVARMULT(KBUDN)%CNAME//CLPROC
ELSE
CLDDH='T'//CVARNAME(KBUDN)//CLPROC
ENDIF
! depi not stored through call to budget but add_field
IF ((CLPROC=='DEPI').OR.(CLPROC=='CEDS')) THEN
IF (LHOOK) CALL DR_HOOK('BUDGET',1,ZHOOK_HANDLE)
RETURN
ENDIF
!1. Substraction of value at previous process and updates PVARSM
IF (YDLDDH%LDDH_OMP) THEN
IF (CLPROC=='INIF') THEN
DO JLEV=1,NFLEVGDDH
DO JLON=1,IFDIA
YDDDH%RVARSM(JLON,1,JLEV,KBUDN)=PVARS(JLON,1,JLEV+IOFF)
ZVARS(JLON,JLEV)=PVARS(JLON,1,JLEV+IOFF)
ENDDO
ENDDO
ELSE
DO JLEV=1,NFLEVGDDH
DO JLON=1,IFDIA
ZVARS(JLON,JLEV)=PVARS(JLON,1,JLEV+IOFF)-YDDDH%RVARSM(JLON,1,JLEV,KBUDN)
YDDDH%RVARSM(JLON,1,JLEV,KBUDN)=PVARS(JLON,1,JLEV+IOFF)
ENDDO
ENDDO
ENDIF
ELSE
IF (CLPROC=='INIF') THEN
DO JLEV=1,NFLEVGDDH
DO JLON=1,IFDIA
TVARSM(JLON,1,JLEV,KBUDN)=PVARS(JLON,1,JLEV+IOFF)
ZVARS(JLON,JLEV)=PVARS(JLON,1,JLEV+IOFF)
ENDDO
ENDDO
ELSE
DO JLEV=1,NFLEVGDDH
DO JLON=1,IFDIA
ZVARS(JLON,JLEV)=PVARS(JLON,1,JLEV+IOFF)-TVARSM(JLON,1,JLEV,KBUDN)
TVARSM(JLON,1,JLEV,KBUDN)=PVARS(JLON,1,JLEV+IOFF)
ENDDO
ENDDO
ENDIF
ENDIF
!2. Reverse levels MNH-> ALD
!IINCR=-1
!CALL INVERT_VLEV(1,NLON,NFLEVGDDH,IINCR,ZVARS,PVARS2)
!3. CONVERSION
! converting to desired budget variables
IF (YDLDDH%LDDH_OMP) THEN
ZVARS(:,:)=ZVARS(:,:)*YDDDH%YVARMULT(KBUDN)%RVAL(:,:)
ELSE
ZVARS(:,:)=ZVARS(:,:)*TAB_VARMULT(KBUDN)%VARMULT(:,:)
ENDIF
!4. CALL TO ADD_FIELD
LDDH=.TRUE.
LINST=.TRUE.
! saves ZVARS with NAME HBUVAR as a Tendency from AROME
! and it is an INSTantaneous field
IF (CLPROC/='INIF') THEN
IF (YDLDDH%LDDH_OMP) THEN
CALL NEW_ADD_FIELD_3D(YDMDDH,ZVARS,CLDDH,YDDDH)
ELSE
CALL ADD_FIELD_3D(YDLDDH,ZVARS,CLDDH,'T','AROME',LINST,LDDH)
ENDIF
ENDIF
IF (LHOOK) CALL DR_HOOK('BUDGET',1,ZHOOK_HANDLE)
END SUBROUTINE BUDGET