SURFEX v8.1
General documentation of Surfex
fadcpl.F90
Go to the documentation of this file.
1 SUBROUTINE fadcpl_fort &
2 & (fa, krep, krang, cdnoma, kvalco, klonga, &
3 & pchamp, ldcosp, ldundf, pundf)
4 USE fa_mod, ONLY : fa_com, jpniil
5 USE parkind1, ONLY : jprb
6 USE yomhook , ONLY : lhook, dr_hook
9 USE grib_api
10 IMPLICIT NONE
11 TYPE(fa_com) :: FA
12 INTEGER (KIND=JPLIKB) KREP, KRANG, KLONGA
13 !
14 INTEGER (KIND=JPLIKB) KVALCO(*)
15 REAL (KIND=JPDBLR) PCHAMP(*)
16 REAL (KIND=JPDBLR) PUNDF
17 !
18 LOGICAL LDCOSP, LDUNDF
19 !
20 CHARACTER CDNOMA*(*)
21 !
22 !
23 REAL (KIND=JPDBLR) :: Z1, Z2, Z3, Z4
24 INTEGER (KIND=JPLIKB) IRANGC
25 INTEGER (KIND=JPLIKB) INLATI, INXLON, IDLUXG, IDGUXG, IDZONL, IDZONG
26 INTEGER (KIND=JPLIKB) ILCHAM
27 INTEGER (KIND=JPLIKB) ICPLSIZE, INBITS
28 INTEGER (KIND=JPLIKB) ILAT, ILON, IPACK
29 INTEGER (KIND=JPLIKB) ILAT1, ILAT2, ILAT3, ILAT4
30 INTEGER (KIND=JPLIKB) ILON1, ILON2, ILON3, ILON4
31 INTEGER (KIND=JPLIKB) ILATMIN, ILATMAX, ILONMIN, ILONMAX
32 INTEGER (KIND=JPLIKB) INIMES, INUMER
33 !
34 CHARACTER(LEN=FA%JPLMES) CLMESS
35 CHARACTER(LEN=FA%JPLSPX) CLNSPR
36 LOGICAL :: LLFATA
37 !
38 REAL (KIND=JPDBLR) :: ZUNDF, ZMULTI
39 INTEGER (KIND=JPLIKM) :: ILGRIB, IGRIBH, IRET
40 INTEGER (KIND=JPLIKB) :: INOD, INOV
41 CHARACTER, ALLOCATABLE :: CLGRIB (:)
42 !
43 REAL(KIND=JPRB) :: ZHOOK_HANDLE
44 
45 IF (lhook) CALL dr_hook('FADCPL_MT',0,zhook_handle)
46 
47 IF (ldcosp) THEN
48  krep=-200
49  GOTO 1001
50 ENDIF
51 
52 krep=0
53 
54 irangc=fa%FICHIER(krang)%NUCADR
55 inlati=fa%CADRE(irangc)%NLATIT
56 inxlon=fa%CADRE(irangc)%NXLOPA
57 
58 ilcham = inlati * inxlon
59 idluxg = fa%CADRE(irangc)%NLOPAR (4) ! lon
60 idguxg = fa%CADRE(irangc)%NLOPAR (6) ! lat
61 idzonl = fa%CADRE(irangc)%NLOPAR (7)
62 idzong = fa%CADRE(irangc)%NLOPAR (8)
63 
64 icplsize = kvalco(3)
65 inbits = kvalco(4)
66 
67 ilonmin=idzonl+icplsize
68 ilonmax=idluxg-icplsize-idzonl+1
69 ilatmin=idzong+icplsize
70 ilatmax=idguxg-icplsize-idzong+1
71 
72 
73 ilgrib = (klonga-3)*8
74 
75 ALLOCATE (clgrib(ilgrib))
76 clgrib = transfer(kvalco(5:klonga), clgrib)
77 CALL grib_new_from_message_char (igribh, clgrib, status=iret)
78 DEALLOCATE (clgrib)
79 IF (iret /= grib_success) THEN
80  krep=-1000-iret
81  GOTO 1001
82 ENDIF
83 
84 CALL igrib_get_value (igribh, 'FMULTI', zmulti)
85 CALL igrib_get_value (igribh, 'numberOfValues', inov)
86 CALL igrib_get_value (igribh, 'numberOfDataPoints', inod)
87 CALL igrib_get_value (igribh, 'values', pchamp(1:ilcham))
88 CALL igrib_get_value (igribh, 'missingValue', zundf)
89 CALL igrib_release (igribh)
90 
91 
92 ! Basic check on dimensions
93 
94 IF ((inod < ilcham) .OR. &
95  & (inov < (ilcham-(ilatmax-ilatmin-1)*(ilonmax-ilonmin-1)))) THEN
96  krep=-93
97  GOTO 1001
98 ELSEIF ((inod > ilcham) .OR. &
99  & (inov > (ilcham-(ilatmax-ilatmin-1)*(ilonmax-ilonmin-1)))) THEN
100  krep=-94
101  GOTO 1001
102 ENDIF
103 
104 ! Apply scaling factor
105 
106 IF (zmulti /= real(1._4, jpdblr)) THEN
107  pchamp(1:ilcham) = pchamp(1:ilcham) / zmulti
108  zundf = zundf / zmulti
109 ENDIF
110 
111 DO ilat = ilatmin+1, ilatmax-1
112  DO ilon = ilonmin+1, ilonmax-1
113 
114  IF (ldundf) THEN
115  pchamp((ilat-1)*inxlon+ilon) = pundf
116  ELSE
117  ilat1=ilat
118  ilon1=ilonmin
119 
120  ilat2=ilat
121  ilon2=ilonmax
122 
123  ilat3=ilatmin
124  ilon3=ilon
125 
126  ilat4=ilatmax
127  ilon4=ilon
128 
129  z1 = 1.0_jprb / (ilon-ilon1)
130  z2 = 1.0_jprb / (ilon2-ilon)
131  z3 = 1.0_jprb / (ilat-ilat3)
132  z4 = 1.0_jprb / (ilat4-ilat)
133 
134  pchamp((ilat-1)*inxlon+ilon) = &
135  & (z1*pchamp((ilat1-1)*inxlon+ilon1) &
136  & +z2*pchamp((ilat2-1)*inxlon+ilon2) &
137  & +z3*pchamp((ilat3-1)*inxlon+ilon3) &
138  & +z4*pchamp((ilat4-1)*inxlon+ilon4)) &
139  & /(z1+z2+z3+z4)
140  ENDIF
141 
142  ENDDO
143 ENDDO
144 
145 1001 CONTINUE
146 
147 llfata=llmoer(krep,krang)
148 
149 IF (fa%LFAMOP.OR.llfata) THEN
150  inimes=2
151  clnspr='FADCPL'
152  inumer=jpniil
153 
154  WRITE (unit=clmess,fmt="('KREP=',I4,', KRANG=',I4,', CDPREF=''',A,'''')") &
155 & krep, krang, cdnoma
156  CALL faipar_fort &
157 & (fa,inumer,inimes,krep,.false.,clmess, &
158 & clnspr, '',.false.)
159 ENDIF
160 
161 !
162 IF (lhook) CALL dr_hook('FADCPL_MT',1,zhook_handle)
163 
164 CONTAINS
165 
166 #include "facom2.llmoer.h"
167 
168 END SUBROUTINE
169 
170 
171 
172 
173 
174 
175 
176 
177 
178 
179 
180 
181 
subroutine fadcpl_fort(FA, KREP, KRANG, CDNOMA, KVALCO, KLONGA, PCHAMP, LDCOSP, LDUNDF, PUNDF)
Definition: fadcpl.F90:4
Definition: fa_mod.F90:1
integer, parameter jprb
Definition: parkind1.F90:32
subroutine, public igrib_release(KHANDLE)
integer, parameter jpdblr
logical lhook
Definition: yomhook.F90:15
subroutine faipar_fort(FA, KNUMER, KNIMES, KCODE, LDFATA, CDMESS, CDNSPR, CDACTI, LDRLFI)
Definition: faipar.F90:6
integer(kind=jplikb), parameter jpniil
Definition: fa_mod.F90:31
real8 real
Definition: privpub.h:396