GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: phylmd/climb_hq_mod.F90 Lines: 101 147 68.7 %
Date: 2023-06-30 12:51:15 Branches: 187 358 52.2 %

Line Branch Exec Source
1
MODULE climb_hq_mod
2
!
3
! Module to solve the verctical diffusion of "q" and "H";
4
! specific humidity and potential energi.
5
!
6
  USE dimphy
7
8
  IMPLICIT NONE
9
  SAVE
10
  PRIVATE
11
  PUBLIC :: climb_hq_down, climb_hq_up, d_h_col_vdf, f_h_bnd
12
13
  REAL, DIMENSION(:,:), ALLOCATABLE :: gamaq, gamah
14
  !$OMP THREADPRIVATE(gamaq,gamah)
15
  REAL, DIMENSION(:,:), ALLOCATABLE :: Ccoef_Q, Dcoef_Q
16
  !$OMP THREADPRIVATE(Ccoef_Q, Dcoef_Q)
17
  REAL, DIMENSION(:,:), ALLOCATABLE :: Ccoef_H, Dcoef_H
18
  !$OMP THREADPRIVATE(Ccoef_H, Dcoef_H)
19
  REAL, DIMENSION(:), ALLOCATABLE   :: Acoef_Q, Bcoef_Q
20
  !$OMP THREADPRIVATE(Acoef_Q, Bcoef_Q)
21
  REAL, DIMENSION(:), ALLOCATABLE   :: Acoef_H, Bcoef_H
22
  !$OMP THREADPRIVATE(Acoef_H, Bcoef_H)
23
  REAL, DIMENSION(:,:), ALLOCATABLE :: Kcoefhq
24
  !$OMP THREADPRIVATE(Kcoefhq)
25
  REAL, SAVE, DIMENSION(:,:), ALLOCATABLE :: h_old ! for diagnostics, h before solving diffusion
26
  !$OMP THREADPRIVATE(h_old)
27
  REAL, SAVE, DIMENSION(:), ALLOCATABLE :: d_h_col_vdf ! for diagnostics, vertical integral of enthalpy change
28
  !$OMP THREADPRIVATE(d_h_col_vdf)
29
  REAL, SAVE, DIMENSION(:), ALLOCATABLE :: f_h_bnd ! for diagnostics, enthalpy flux at surface
30
  !$OMP THREADPRIVATE(f_h_bnd)
31
32
CONTAINS
33
!
34
!****************************************************************************************
35
!
36
36408058
  SUBROUTINE climb_hq_down(knon, coefhq, paprs, pplay, &
37
       delp, temp, q, dtime, &
38
!!! nrlmd le 02/05/2011
39
       Ccoef_H_out, Ccoef_Q_out, Dcoef_H_out, Dcoef_Q_out, &
40
       Kcoef_hq_out, gama_q_out, gama_h_out, &
41
!!!
42
1152
       Acoef_H_out, Acoef_Q_out, Bcoef_H_out, Bcoef_Q_out)
43
44
! This routine calculates recursivly the coefficients C and D
45
! for the quantity X=[Q,H] in equation X(k) = C(k) + D(k)*X(k-1), where k is
46
! the index of the vertical layer.
47
!
48
! Input arguments
49
!****************************************************************************************
50
    INTEGER, INTENT(IN)                      :: knon
51
    REAL, DIMENSION(klon,klev), INTENT(IN)   :: coefhq
52
    REAL, DIMENSION(klon,klev), INTENT(IN)   :: pplay
53
    REAL, DIMENSION(klon,klev+1), INTENT(IN) :: paprs
54
    REAL, DIMENSION(klon,klev), INTENT(IN)   :: temp, delp  ! temperature
55
    REAL, DIMENSION(klon,klev), INTENT(IN)   :: q
56
    REAL, INTENT(IN)                         :: dtime
57
58
! Output arguments
59
!****************************************************************************************
60
    REAL, DIMENSION(klon), INTENT(OUT)       :: Acoef_H_out
61
    REAL, DIMENSION(klon), INTENT(OUT)       :: Acoef_Q_out
62
    REAL, DIMENSION(klon), INTENT(OUT)       :: Bcoef_H_out
63
    REAL, DIMENSION(klon), INTENT(OUT)       :: Bcoef_Q_out
64
65
!!! nrlmd le 02/05/2011
66
    REAL, DIMENSION(klon,klev), INTENT(OUT)  :: Ccoef_H_out
67
    REAL, DIMENSION(klon,klev), INTENT(OUT)  :: Ccoef_Q_out
68
    REAL, DIMENSION(klon,klev), INTENT(OUT)  :: Dcoef_H_out
69
    REAL, DIMENSION(klon,klev), INTENT(OUT)  :: Dcoef_Q_out
70
    REAL, DIMENSION(klon,klev), INTENT(OUT)  :: Kcoef_hq_out
71
    REAL, DIMENSION(klon,klev), INTENT(OUT)  :: gama_q_out
72
    REAL, DIMENSION(klon,klev), INTENT(OUT)  :: gama_h_out
73
!!!
74
75
! Local variables
76
!****************************************************************************************
77
    LOGICAL, SAVE                            :: first=.TRUE.
78
    !$OMP THREADPRIVATE(first)
79
! JLD now renamed h_old and declared in module
80
!    REAL, DIMENSION(klon,klev)               :: local_H
81
2304
    REAL, DIMENSION(klon)                    :: psref
82
    REAL                                     :: delz, pkh
83
    INTEGER                                  :: k, i, ierr
84
! Include
85
!****************************************************************************************
86
    INCLUDE "YOMCST.h"
87
    INCLUDE "compbl.h"
88
89
90
!****************************************************************************************
91
! 1)
92
! Allocation at first time step only
93
!
94
!****************************************************************************************
95
96
1152
    IF (first) THEN
97
1
       first=.FALSE.
98



2
       ALLOCATE(Ccoef_Q(klon,klev), STAT=ierr)
99
1
       IF ( ierr /= 0 )  PRINT*,' pb in allloc Ccoef_Q, ierr=', ierr
100
101



2
       ALLOCATE(Dcoef_Q(klon,klev), STAT=ierr)
102
1
       IF ( ierr /= 0 )  PRINT*,' pb in allloc Dcoef_Q, ierr=', ierr
103
104



2
       ALLOCATE(Ccoef_H(klon,klev), STAT=ierr)
105
1
       IF ( ierr /= 0 )  PRINT*,' pb in allloc Ccoef_H, ierr=', ierr
106
107



2
       ALLOCATE(Dcoef_H(klon,klev), STAT=ierr)
108
1
       IF ( ierr /= 0 )  PRINT*,' pb in allloc Dcoef_H, ierr=', ierr
109
110








1
       ALLOCATE(Acoef_Q(klon), Bcoef_Q(klon), Acoef_H(klon), Bcoef_H(klon), STAT=ierr)
111
1
       IF ( ierr /= 0 )  PRINT*,' pb in allloc Acoef_X and Bcoef_X, ierr=', ierr
112
113



2
       ALLOCATE(Kcoefhq(klon,klev), STAT=ierr)
114
1
       IF ( ierr /= 0 )  PRINT*,' pb in allloc Kcoefhq, ierr=', ierr
115
116



2
       ALLOCATE(gamaq(1:klon,2:klev), STAT=ierr)
117
1
       IF ( ierr /= 0 ) PRINT*,' pb in allloc gamaq, ierr=', ierr
118
119



2
       ALLOCATE(gamah(1:klon,2:klev), STAT=ierr)
120
1
       IF ( ierr /= 0 ) PRINT*,' pb in allloc gamah, ierr=', ierr
121
122



2
       ALLOCATE(h_old(klon,klev), STAT=ierr)
123
1
       IF ( ierr /= 0 )  PRINT*,' pb in allloc h_old, ierr=', ierr
124
125


1
       ALLOCATE(d_h_col_vdf(klon), STAT=ierr)
126
1
       IF ( ierr /= 0 )  PRINT*,' pb in allloc d_h_col_vdf, ierr=', ierr
127
128


1
       ALLOCATE(f_h_bnd(klon), STAT=ierr)
129
1
       IF ( ierr /= 0 )  PRINT*,' pb in allloc f_h_bnd, ierr=', ierr
130
    END IF
131
132
!****************************************************************************************
133
! 2)
134
! Definition of the coeficient K
135
!
136
!****************************************************************************************
137

44704512
    Kcoefhq(:,:) = 0.0
138
44928
    DO k = 2, klev
139
18011404
       DO i = 1, knon
140
          Kcoefhq(i,k) = &
141
               coefhq(i,k)*RG*RG*dtime /(pplay(i,k-1)-pplay(i,k)) &
142
43776
               *(paprs(i,k)*2/(temp(i,k)+temp(i,k-1))/RD)**2
143
       ENDDO
144
    ENDDO
145
146
!****************************************************************************************
147
! 3)
148
! Calculation of gama for "Q" and "H"
149
!
150
!****************************************************************************************
151
!   surface pressure is used as reference
152
1146240
    psref(:) = paprs(:,1)
153
154
!   definition of gama
155
1152
    IF (iflag_pbl == 1) THEN
156
       gamaq(:,:) = 0.0
157
       gamah(:,:) = -1.0e-03
158
       gamah(:,2) = -2.5e-03
159
160
! conversion de gama
161
       DO k = 2, klev
162
          DO i = 1, knon
163
             delz = RD * (temp(i,k-1)+temp(i,k)) / &
164
                    2.0 / RG / paprs(i,k) * (pplay(i,k-1)-pplay(i,k))
165
             pkh  = (psref(i)/paprs(i,k))**RKAPPA
166
167
! convertie gradient verticale d'humidite specifique en difference d'humidite specifique entre centre de couches
168
             gamaq(i,k) = gamaq(i,k) * delz
169
! convertie gradient verticale de temperature en difference de temperature potentielle entre centre de couches
170
             gamah(i,k) = gamah(i,k) * delz * RCPD * pkh
171
          ENDDO
172
       ENDDO
173
174
    ELSE
175

43558272
       gamaq(:,:) = 0.0
176

43558272
       gamah(:,:) = 0.0
177
    ENDIF
178
179
180
!****************************************************************************************
181
! 4)
182
! Calculte the coefficients C and D for specific humidity, q
183
!
184
!****************************************************************************************
185
186
    CALL calc_coef(knon, Kcoefhq(:,:), gamaq(:,:), delp(:,:), q(:,:), &
187
1152
         Ccoef_Q(:,:), Dcoef_Q(:,:), Acoef_Q, Bcoef_Q)
188
189
!****************************************************************************************
190
! 5)
191
! Calculte the coefficients C and D for potentiel entalpie, H
192
!
193
!****************************************************************************************
194

44704512
    h_old(:,:) = 0.0
195
196
46080
    DO k=1,klev
197
18485358
       DO i = 1, knon
198
          ! convertie la temperature en entalpie potentielle
199
          h_old(i,k) = RCPD * temp(i,k) * &
200
44928
               (psref(i)/pplay(i,k))**RKAPPA
201
       ENDDO
202
    ENDDO
203
204
    CALL calc_coef(knon, Kcoefhq(:,:), gamah(:,:), delp(:,:), h_old(:,:), &
205
1152
         Ccoef_H(:,:), Dcoef_H(:,:), Acoef_H, Bcoef_H)
206
207
!****************************************************************************************
208
! 6)
209
! Return the first layer in output variables
210
!
211
!****************************************************************************************
212
1146240
    Acoef_H_out = Acoef_H
213
1146240
    Bcoef_H_out = Bcoef_H
214
1146240
    Acoef_Q_out = Acoef_Q
215
1146240
    Bcoef_Q_out = Bcoef_Q
216
217
!****************************************************************************************
218
! 7)
219
! If Pbl is split, return also the other layers in output variables
220
!
221
!****************************************************************************************
222
!!! jyg le 07/02/2012
223
!!jyg       IF (mod(iflag_pbl_split,2) .eq.1) THEN
224
1152
       IF (mod(iflag_pbl_split,10) .ge.1) THEN
225
!!! nrlmd le 02/05/2011
226
    DO k= 1, klev
227
      DO i= 1, klon
228
        Ccoef_H_out(i,k) = Ccoef_H(i,k)
229
        Dcoef_H_out(i,k) = Dcoef_H(i,k)
230
        Ccoef_Q_out(i,k) = Ccoef_Q(i,k)
231
        Dcoef_Q_out(i,k) = Dcoef_Q(i,k)
232
        Kcoef_hq_out(i,k) = Kcoefhq(i,k)
233
          IF (k.eq.1) THEN
234
            gama_h_out(i,k)  = 0.
235
            gama_q_out(i,k)  = 0.
236
          ELSE
237
            gama_h_out(i,k)  = gamah(i,k)
238
            gama_q_out(i,k)  = gamaq(i,k)
239
          ENDIF
240
      ENDDO
241
    ENDDO
242
!!!
243
       ENDIF  ! (mod(iflag_pbl_split,2) .ge.1)
244
!!!
245
246
1152
  END SUBROUTINE climb_hq_down
247
!
248
!****************************************************************************************
249
!
250
2304
  SUBROUTINE calc_coef(knon, Kcoef, gama, delp, X, Ccoef, Dcoef, Acoef, Bcoef)
251
!
252
! Calculate the coefficients C and D in : X(k) = C(k) + D(k)*X(k-1)
253
! where X is H or Q, and k the vertical level k=1,klev
254
!
255
    INCLUDE "YOMCST.h"
256
! Input arguments
257
!****************************************************************************************
258
    INTEGER, INTENT(IN)                      :: knon
259
    REAL, DIMENSION(klon,klev), INTENT(IN)   :: Kcoef, delp
260
    REAL, DIMENSION(klon,klev), INTENT(IN)   :: X
261
    REAL, DIMENSION(klon,2:klev), INTENT(IN) :: gama
262
263
! Output arguments
264
!****************************************************************************************
265
    REAL, DIMENSION(klon), INTENT(OUT)       :: Acoef, Bcoef
266
    REAL, DIMENSION(klon,klev), INTENT(OUT)  :: Ccoef, Dcoef
267
268
! Local variables
269
!****************************************************************************************
270
    INTEGER                                  :: k, i
271
    REAL                                     :: buf
272
273
!****************************************************************************************
274
! Niveau au sommet, k=klev
275
!
276
!****************************************************************************************
277

89409024
    Ccoef(:,:) = 0.0
278

89409024
    Dcoef(:,:) = 0.0
279
280
947908
    DO i = 1, knon
281
945604
       buf = delp(i,klev) + Kcoef(i,klev)
282
283
945604
       Ccoef(i,klev) = (X(i,klev)*delp(i,klev) - Kcoef(i,klev)*gama(i,klev))/buf
284
947908
       Dcoef(i,klev) = Kcoef(i,klev)/buf
285
    END DO
286
287
288
!****************************************************************************************
289
! Niveau  (klev-1) <= k <= 2
290
!
291
!****************************************************************************************
292
293
87552
    DO k=(klev-1),2,-1
294
35074900
       DO i = 1, knon
295
34987348
          buf = delp(i,k) + Kcoef(i,k) + Kcoef(i,k+1)*(1.-Dcoef(i,k+1))
296
          Ccoef(i,k) = (X(i,k)*delp(i,k) + Kcoef(i,k+1)*Ccoef(i,k+1) + &
297
34987348
               Kcoef(i,k+1)*gama(i,k+1) - Kcoef(i,k)*gama(i,k))/buf
298
35072596
          Dcoef(i,k) = Kcoef(i,k)/buf
299
       END DO
300
    END DO
301
302
!****************************************************************************************
303
! Niveau k=1
304
!
305
!****************************************************************************************
306
307
947908
    DO i = 1, knon
308
945604
       buf = delp(i,1) + Kcoef(i,2)*(1.-Dcoef(i,2))
309
945604
       Acoef(i) = (X(i,1)*delp(i,1) + Kcoef(i,2)*(gama(i,2)+Ccoef(i,2)))/buf
310
2304
       Bcoef(i) = -1. * RG / buf
311
    END DO
312
313

36408058
  END SUBROUTINE calc_coef
314
!
315
!****************************************************************************************
316
!
317
1152
  SUBROUTINE climb_hq_up(knon, dtime, t_old, q_old, &
318
       flx_q1, flx_h1, paprs, pplay, &
319
!!! nrlmd le 02/05/2011
320
1152
       Acoef_H_in, Acoef_Q_in, Bcoef_H_in, Bcoef_Q_in, &
321
       Ccoef_H_in, Ccoef_Q_in, Dcoef_H_in, Dcoef_Q_in, &
322
       Kcoef_hq_in, gama_q_in, gama_h_in, &
323
!!!
324
1152
       flux_q, flux_h, d_q, d_t)
325
!
326
! This routine calculates the flux and tendency of the specific humidity q and
327
! the potential engergi H.
328
! The quantities q and H are calculated according to
329
! X(k) = C(k) + D(k)*X(k-1) for X=[q,H], where the coefficients
330
! C and D are known from before and k is index of the vertical layer.
331
!
332
333
! Input arguments
334
!****************************************************************************************
335
    INTEGER, INTENT(IN)                      :: knon
336
    REAL, INTENT(IN)                         :: dtime
337
    REAL, DIMENSION(klon,klev), INTENT(IN)   :: t_old, q_old
338
    REAL, DIMENSION(klon), INTENT(IN)        :: flx_q1, flx_h1
339
    REAL, DIMENSION(klon,klev+1), INTENT(IN) :: paprs
340
    REAL, DIMENSION(klon,klev), INTENT(IN)   :: pplay
341
342
!!! nrlmd le 02/05/2011
343
    REAL, DIMENSION(klon), INTENT(IN)        :: Acoef_H_in,Acoef_Q_in, Bcoef_H_in, Bcoef_Q_in
344
    REAL, DIMENSION(klon,klev), INTENT(IN)   :: Ccoef_H_in, Ccoef_Q_in, Dcoef_H_in, Dcoef_Q_in
345
    REAL, DIMENSION(klon,klev), INTENT(IN)   :: Kcoef_hq_in, gama_q_in, gama_h_in
346
!!!
347
348
! Output arguments
349
!****************************************************************************************
350
    REAL, DIMENSION(klon,klev), INTENT(OUT)  :: flux_q, flux_h, d_q, d_t
351
352
! Local variables
353
!****************************************************************************************
354
    LOGICAL, SAVE                            :: last=.FALSE.
355
2304
    REAL, DIMENSION(klon,klev)               :: h_new, q_new
356
2304
    REAL, DIMENSION(klon)                    :: psref
357
    INTEGER                                  :: k, i, ierr
358
359
! Include
360
!****************************************************************************************
361
    INCLUDE "YOMCST.h"
362
    INCLUDE "compbl.h"
363
364
!****************************************************************************************
365
! 1)
366
! Definition of some variables
367
1152
    REAL, DIMENSION(klon,klev)               :: d_h, zairm
368
!
369
!****************************************************************************************
370

44704512
    flux_q(:,:) = 0.0
371

44704512
    flux_h(:,:) = 0.0
372

44704512
    d_q(:,:)    = 0.0
373

44704512
    d_t(:,:)    = 0.0
374

44704512
    d_h(:,:)    = 0.0
375
1146240
    f_h_bnd(:)= 0.0
376
377
473954
    psref(1:knon) = paprs(1:knon,1)
378
379
!!! jyg le 07/02/2012
380
!!jyg       IF (mod(iflag_pbl_split,2) .eq.1) THEN
381
1152
       IF (mod(iflag_pbl_split,10) .ge.1) THEN
382
!!! nrlmd le 02/05/2011
383
    DO i = 1, knon
384
      Acoef_H(i)=Acoef_H_in(i)
385
      Acoef_Q(i)=Acoef_Q_in(i)
386
      Bcoef_H(i)=Bcoef_H_in(i)
387
      Bcoef_Q(i)=Bcoef_Q_in(i)
388
    ENDDO
389
    DO k = 1, klev
390
      DO i = 1, knon
391
        Ccoef_H(i,k)=Ccoef_H_in(i,k)
392
        Ccoef_Q(i,k)=Ccoef_Q_in(i,k)
393
        Dcoef_H(i,k)=Dcoef_H_in(i,k)
394
        Dcoef_Q(i,k)=Dcoef_Q_in(i,k)
395
        Kcoefhq(i,k)=Kcoef_hq_in(i,k)
396
          IF (k.gt.1) THEN
397
            gamah(i,k)=gama_h_in(i,k)
398
            gamaq(i,k)=gama_q_in(i,k)
399
          ENDIF
400
      ENDDO
401
    ENDDO
402
!!!
403
       ENDIF  ! (mod(iflag_pbl_split,2) .ge.1)
404
!!!
405
406
!****************************************************************************************
407
! 2)
408
! Calculation of Q and H
409
!
410
!****************************************************************************************
411
412
!- First layer
413
473954
    q_new(1:knon,1) = Acoef_Q(1:knon) + Bcoef_Q(1:knon)*flx_q1(1:knon)*dtime
414
473954
    h_new(1:knon,1) = Acoef_H(1:knon) + Bcoef_H(1:knon)*flx_h1(1:knon)*dtime
415
473954
    f_h_bnd(1:knon) = flx_h1(1:knon)
416
!- All the other layers
417
44928
    DO k = 2, klev
418
18011404
       DO i = 1, knon
419
17966476
          q_new(i,k) = Ccoef_Q(i,k) + Dcoef_Q(i,k)*q_new(i,k-1)
420
18010252
          h_new(i,k) = Ccoef_H(i,k) + Dcoef_H(i,k)*h_new(i,k-1)
421
       END DO
422
    END DO
423
!****************************************************************************************
424
! 3)
425
! Calculation of the flux for Q and H
426
!
427
!****************************************************************************************
428
429
!- The flux at first layer, k=1
430
473954
    flux_q(1:knon,1)=flx_q1(1:knon)
431
473954
    flux_h(1:knon,1)=flx_h1(1:knon)
432
433
!- The flux at all layers above surface
434
44928
    DO k = 2, klev
435
18011404
       DO i = 1, knon
436
          flux_q(i,k) = (Kcoefhq(i,k)/RG/dtime) * &
437
17966476
               (q_new(i,k)-q_new(i,k-1)+gamaq(i,k))
438
439
          flux_h(i,k) = (Kcoefhq(i,k)/RG/dtime) * &
440
18010252
               (h_new(i,k)-h_new(i,k-1)+gamah(i,k))
441
       END DO
442
    END DO
443
444
!****************************************************************************************
445
! 4)
446
! Calculation of tendency for Q and H
447
!
448
!****************************************************************************************
449
1146240
    d_h_col_vdf(:) = 0.0
450
46080
    DO k = 1, klev
451
18485358
       DO i = 1, knon
452
18439278
          d_t(i,k) = h_new(i,k)/(psref(i)/pplay(i,k))**RKAPPA/RCPD - t_old(i,k)
453
18439278
          d_q(i,k) = q_new(i,k) - q_old(i,k)
454
18439278
          d_h(i,k) = h_new(i,k) - h_old(i,k)
455
!JLD          d_t(i,k) = d_h(i,k)/(psref(i)/pplay(i,k))**RKAPPA/RCPD    !correction a venir
456
    ! layer air mass
457
18439278
          zairm(i, k) = (paprs(i,k)-paprs(i,k+1))/rg
458
18484206
          d_h_col_vdf(i) = d_h_col_vdf(i) + d_h(i,k)*zairm(i,k)
459
        END DO
460
    END DO
461
462
!****************************************************************************************
463
! Some deallocations
464
!
465
!****************************************************************************************
466
1152
    IF (last) THEN
467
       DEALLOCATE(Ccoef_Q, Dcoef_Q, Ccoef_H, Dcoef_H,stat=ierr)
468
       IF ( ierr /= 0 )  PRINT*,' pb in dealllocate Ccoef_Q, Dcoef_Q, Ccoef_H, Dcoef_H, ierr=', ierr
469
       DEALLOCATE(Acoef_Q, Bcoef_Q, Acoef_H, Bcoef_H,stat=ierr)
470
       IF ( ierr /= 0 )  PRINT*,' pb in dealllocate Acoef_Q, Bcoef_Q, Acoef_H, Bcoef_H, ierr=', ierr
471
       DEALLOCATE(gamaq, gamah,stat=ierr)
472
       IF ( ierr /= 0 )  PRINT*,' pb in dealllocate gamaq, gamah, ierr=', ierr
473
       DEALLOCATE(Kcoefhq,stat=ierr)
474
       IF ( ierr /= 0 )  PRINT*,' pb in dealllocate Kcoefhq, ierr=', ierr
475
       DEALLOCATE(h_old, d_h_col_vdf, f_h_bnd, stat=ierr)
476
       IF ( ierr /= 0 )  PRINT*,' pb in dealllocate h_old, d_h_col_vdf, f_h_bnd, ierr=', ierr
477
    END IF
478
945604
  END SUBROUTINE climb_hq_up
479
!
480
!****************************************************************************************
481
!
482
END MODULE climb_hq_mod
483
484
485
486
487
488