SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
vertical_grid_nat.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 vertical_grid_nat(PDG1,PT1,PDG2,PT2)
6 !##########################################
7 !
8 USE modd_surf_par, ONLY : xundef
9 !
10 USE yomhook ,ONLY : lhook, dr_hook
11 USE parkind1 ,ONLY : jprb
12 !
13 IMPLICIT NONE
14 !
15 !* 0.1 Declaration of dummy arguments
16 !
17 REAL, DIMENSION(:,:), INTENT(IN) :: pdg1 ! input vertical grid
18 REAL, DIMENSION(:,:), INTENT(IN) :: pt1 ! input temperatures
19 REAL, DIMENSION(:,:), INTENT(IN) :: pdg2 ! output vertical grid
20 REAL, DIMENSION(:,:), INTENT(OUT) :: pt2 ! output temperatures
21 !
22 !* 0.2 Declaration of local variables
23 !
24 REAL, DIMENSION(SIZE(PDG1,1),SIZE(PDG1,2)) :: zdzg1
25 REAL, DIMENSION(SIZE(PDG2,1),SIZE(PDG2,2)) :: zsum
26 !
27 REAL, DIMENSION(SIZE(PDG1,1),SIZE(PDG1,2),SIZE(PDG2,2)) :: zwght
28 REAL, DIMENSION(SIZE(PDG1,1),SIZE(PDG1,2)) :: zsum_wght
29 !
30 REAL :: zwork
31 !
32 INTEGER :: ini, inl1, inl2
33 INTEGER :: jl1, jl2, ji ! loop counter
34 !
35 REAL(KIND=JPRB) :: zhook_handle
36 !-----------------------------------------------------------------------------
37 IF (lhook) CALL dr_hook('VERTICAL_GRID_NAT',0,zhook_handle)
38 !
39 ini =SIZE(pt1,1)
40 inl1=SIZE(pt1,2)
41 inl2=SIZE(pt2,2)
42 !
43 pt2(:,:) = 0.0
44 zsum(:,:) = 0.0
45 zsum_wght(:,:) = 0.0
46 zwght(:,:,:) = 0.0
47 !
48 zdzg1(:,1)=pdg1(:,1)
49 DO jl1=2,inl1
50  zdzg1(:,jl1)=pdg1(:,jl1)-pdg1(:,jl1-1)
51 END DO
52 !
53 DO jl2=1,inl2
54  DO jl1=1,inl1
55  DO ji=1,ini
56 !
57  IF(pt1(ji,jl1)/=xundef)THEN
58 !
59  zwght(ji,jl1,jl2)=min(zdzg1(ji,jl1),max(0.0,pdg2(ji,jl2)-pdg1(ji,jl1)+zdzg1(ji,jl1)))
60  zwght(ji,jl1,jl2)=max(0.0,zwght(ji,jl1,jl2)-zsum_wght(ji,jl1))
61 !
62  pt2(ji,jl2)=pt2(ji,jl2)+zwght(ji,jl1,jl2)*pt1(ji,jl1)
63  zsum(ji,jl2)=zsum(ji,jl2)+zwght(ji,jl1,jl2)
64 !
65  zsum_wght(ji,jl1)=zsum_wght(ji,jl1)+zwght(ji,jl1,jl2)
66 !
67  ENDIF
68 !
69  END DO
70  END DO
71 END DO
72 !
73 WHERE(zsum(:,:)>0.0)
74  pt2(:,:)=pt2(:,:)/zsum(:,:)
75 ELSEWHERE
76  pt2(:,:)=xundef
77 ENDWHERE
78 !
79 !SIMPLE EXTRAPOLATION
80 !
81 DO jl2=2,inl2
82  DO ji=1,ini
83  IF(pt2(ji,1)/=xundef.AND.pt2(ji,jl2)==xundef)THEN
84  pt2(ji,jl2)=pt2(ji,jl2-1)
85  ENDIF
86  END DO
87 END DO
88 !
89 IF (lhook) CALL dr_hook('VERTICAL_GRID_NAT',1,zhook_handle)
90 !-----------------------------------------------------------------------------
91 END SUBROUTINE vertical_grid_nat
subroutine vertical_grid_nat(PDG1, PT1, PDG2, PT2)