2 & (fa, krep, krang, cdpref, knivau, cdsuff, &
3 & pchamp, ldcosp, kgribh, ldundf, &
32 INTEGER (KIND=JPLIKB) KREP, KRANG, KNIVAU, KLOCSN
34 INTEGER (KIND=JPLIKM) KGRIBH
35 REAL (KIND=JPDBLR),
TARGET :: PCHAMP(*)
36 REAL (KIND=JPDBLR) PUNDF, ZUNDF
38 LOGICAL LDCOSP, LDUNDF, LLCOSP, LLUNDF
40 CHARACTER CDPREF*(*), CDSUFF*(*)
42 REAL (KIND=JPDBLR),
PARAMETER :: RPI = 2.0_jpdblr * asin(1.0_jpdblr)
44 type(
facadr),
POINTER :: ylcadr
45 type(
fafich),
POINTER :: ylfich
46 INTEGER (KIND=JPLIKB) :: IRANGC, INIMES, INUMER
47 INTEGER (KIND=JPLIKB) INGRIB, INBITS
48 CHARACTER(LEN=FA%JPLSPX) CLNSPR
49 CHARACTER(LEN=FA%JPXNOM) CLACTI
50 CHARACTER(LEN=FA%JPLMES) CLMESS
51 CHARACTER(LEN=FA%JPXNOM) CLNOMA
52 LOGICAL LLMLAM, LLLTLN, LLFATA, LLMGLO
53 INTEGER (KIND=JPLIKB) :: ILNOMA
54 INTEGER (KIND=JPLIKB) :: INGRIB_GP, INGRIB_SP
55 REAL (KIND=JPDBLR) :: ZMULTI
62 REAL (KIND=JPRB) :: ZHOOK_HANDLE
72 ylfich => fa%FICHIER(krang)
73 irangc = ylfich%NUCADR
74 ylcadr => fa%CADRE(irangc)
76 llmlam = ylcadr%LIMLAM
77 llltln = ylcadr%SINLAT(2) < 0 .AND. llmlam
78 llmglo = (.NOT. llmlam) .AND. (.NOT. llltln)
83 inumer = ylfich%NULOGI
86 ingrib = ylfich%NFGRIB
87 ingrib_gp = falgra_gp(ingrib)
88 ingrib_sp = falgra_sp(ingrib)
97 llgrib1 = falgra_ed(ingrib) == 1
145 llfata=llmoer(krep,krang)
147 IF (fa%LFAMOP.OR.llfata)
THEN 152 WRITE (unit=clmess,fmt=
'(''KREP='',I5,'', KRANG='',I4, & 153 & '', CDPREF='''''',A,'''''', KNIVAU='',I6, & 154 & '', CDSUFF='''''',A,'''''', LLCOSP= '',L1)') &
155 & krep, krang, cdpref(1:len_trim(cdpref)), knivau, &
156 & cdsuff(1:len_trim(cdsuff)), llcosp
159 & (fa, inumer,inimes,krep,.false.,clmess, &
160 & clnspr,clacti,.false.)
167 SUBROUTINE stru (CDS, CDU)
168 CHARACTER (LEN=*) :: CDS, CDU
169 INTEGER (KIND=JPLIKB) :: J
175 DO j = 1, len_trim(cds)
176 IF (cds(j:j) ==
' ')
THEN 185 #include "facom2.llmoer.h" 190 CHARACTER(LEN=FA%JPXNOM) CLPREF, CLSUFF, CLNOMU
191 INTEGER(KIND=JPLIKB) INIVAU, IPARAM, IDPROC
192 INTEGER(KIND=JPLIKB) IMULTM, IMULTE
193 REAL (KIND=JPDBLR) ZLBASE, ZLMULT, ZLEVEL
205 IF (ylfich%CMODEL /=
'')
THEN 208 IF (idproc == 255)
THEN 209 WRITE (fa%NULOUT,
'(" FACGRM: Model `",A,"'' is not & 210 &declared in `faModelName.def''")')
trim(ylfich%CMODEL)
214 CALL fanfan_fort (fa, krep, inumer, cdpref, knivau, cdsuff, clnoma, ilnoma)
215 CALL faquin_fort (fa, krep, inumer, clpref, inivau, clsuff, clnoma, ilnoma)
218 CALL stru (clpref, clnomu)
220 CALL stru (clsuff, clnomu)
224 zlevel = zlmult * inivau + zlbase
227 CALL stru (clnoma, clnomu)
237 IF (iparam == 255)
THEN 238 WRITE (fa%NULOUT,
'(" FACGRM: Field `",A,"'' is not & 239 &declared in `faFieldName.def''")')
trim(clnoma)
244 zmulti =
REAL (IMULTM, JPDBLR) * 10._JPDBLR ** IMULTE
271 REAL (KIND=JPDBLR) :: ZDELX, ZDELY, ZRPK
272 INTEGER (KIND=JPLIKB) :: ILONS, ILATS
274 ilats = ylcadr%NLATIT
275 ilons = ylcadr%NXLOPA
276 zdelx = ylcadr%SINLAT (7)
277 zdely = ylcadr%SINLAT (8)
278 zrpk = ylcadr%SINLAT (2)
280 IF (0._jpdblr < zrpk .AND. zrpk < 1._jpdblr)
THEN 286 ELSEIF (zrpk == 0._jpdblr)
THEN 292 ELSEIF (zrpk == 1._jpdblr)
THEN 300 CALL igrib_set_value (kgribh,
"biFourierResolutionParameterN", ylcadr%NSMAX)
301 CALL igrib_set_value (kgribh,
"biFourierResolutionParameterM", ylcadr%NMSMAX)
306 CALL igrib_set_value (kgribh,
'LuxInMetres', zdelx * (ylcadr%NLOPAR (4)-1))
307 CALL igrib_set_value (kgribh,
'LuyInMetres', zdely * (ylcadr%NLOPAR (6)-1))
309 CALL igrib_set_value (kgribh,
'LcxInMetres', zdelx * max(1, ylcadr%NLOPAR (7)-1))
310 CALL igrib_set_value (kgribh,
'LcyInMetres', zdely * max(1, ylcadr%NLOPAR (8)-1))
320 INTEGER (KIND=JPLIKB) :: ILONS, ILATS
321 REAL (KIND=JPDBLR) :: ZLONW, ZLATS, ZLONE, ZLATN, ZLOND, ZLATD
323 ilats = ylcadr%NLATIT
324 ilons = ylcadr%NXLOPA
331 zlond = modulo(zlone-zlonw, 360._jpdblr) / (ilons-1)
332 zlatd = (zlatn-zlats)/(ilats-1)
336 CALL igrib_set_value (kgribh,
'longitudeOfFirstGridPointInDegrees', zlonw)
337 CALL igrib_set_value (kgribh,
'latitudeOfLastGridPointInDegrees', zlats)
338 CALL igrib_set_value (kgribh,
'longitudeOfLastGridPointInDegrees', zlone)
339 CALL igrib_set_value (kgribh,
'latitudeOfFirstGridPointInDegrees', zlatn)
349 REAL (KIND=JPDBLR) :: ZRPK, ZDELX, ZDELY
350 INTEGER (KIND=JPLIKB) :: ILONS, ILATS
352 CHARACTER (LEN=4) :: CLEXT
354 ilats = ylcadr%NLATIT
355 ilons = ylcadr%NXLOPA
356 zrpk = ylcadr%SINLAT (2)
357 zdelx = ylcadr%SINLAT (7)
358 zdely = ylcadr%SINLAT (8)
366 IF (0._jpdblr < zrpk .AND. zrpk < 1._jpdblr)
THEN 382 ELSEIF (zrpk == 0._jpdblr)
THEN 398 ELSEIF (zrpk == 1._jpdblr)
THEN 428 REAL (KIND=JPDBLR) :: ZRPK
430 zrpk = ylcadr%SINLAT (2)
432 IF (0._jpdblr < zrpk .AND. zrpk < 1._jpdblr)
THEN 438 CALL igrib_set_value (kgribh,
'latitudeOfSouthernPoleInDegrees', 0._jpdblr)
439 CALL igrib_set_value (kgribh,
'longitudeOfSouthernPoleInDegrees', 0._jpdblr)
445 IF (ylcadr%SINLAT (4) > 0)
THEN 451 ELSEIF (zrpk == 0._jpdblr)
THEN 460 CALL igrib_set_value (kgribh,
'orientationOfTheGridInDegrees', 0._jpdblr)
462 ELSEIF (zrpk == 1._jpdblr)
THEN 472 IF (ylcadr%SINLAT (4) > 0)
THEN 484 REAL (KIND=JPDBLR),
INTENT (IN) :: PLON
485 lonrad2deg = modulo(180._jpdblr/rpi * plon, 360._jpdblr)
489 REAL (KIND=JPDBLR),
INTENT (IN) :: PLAT
495 INTEGER (KIND=JPLIKB) :: ILATS, IDGNH, ILONS
496 INTEGER (KIND=JPLIKB),
ALLOCATABLE :: ILOENG (:)
497 REAL (KIND=JPDBLR) :: ZNLAT, ZSLAT, ZVAL, ZLOCEN, ZMUCEN, ZSTRET
498 CHARACTER (LEN=32),
PARAMETER :: CLGGGRIDTYPES (0:1,0:1,0:1) = &
500 & (/
'regular_gg ',
'reduced_gg ', &
501 &
'regular_stretched_gg ',
'reduced_stretched_gg ', &
502 &
'regular_rotated_gg ',
'reduced_rotated_gg ', &
503 &
'regular_stretched_rotated_gg ',
'reduced_stretched_rotated_gg ' /), &
507 istr = min(ylcadr%NTYPTR, 1)
508 irot = max(ylcadr%NTYPTR-1, 0)
510 zmucen = ylcadr%SSLAPO
511 zlocen = sign(acos(ylcadr%SCLOPO), ylcadr%SSLOPO)
512 zstret = ylcadr%SCODIL
517 ilats = ylcadr%NLATIT
518 ilons = ylcadr%NXLOPA
519 idgnh = (ilats+1) / 2
520 znlat = asin(ylcadr%SINLAT (1))
523 ALLOCATE (iloeng(ilats))
527 iloeng(i) = ylcadr%NLOPAR (i)
529 iloeng(i) = ylcadr%NLOPAR (ilats-i+1)
533 IF (any(iloeng /= iloeng(1)))
THEN 558 zval=360._jpdblr-360._jpdblr/
REAL(ilons,
jpdblr)
560 CALL igrib_set_value(kgribh,
'numberOfParallelsBetweenAPoleAndTheEquator',idgnh)
576 REAL (KIND=JPDBLR) :: ZLOCEN, ZMUCEN, ZSTRET
577 CHARACTER (LEN=32),
PARAMETER :: CLSHGRIDTYPES (0:1,0:1) = &
579 & (/
'sh ',
'stretched_sh ', &
580 &
'rotated_sh ',
'stretched_rotated_sh ' /), &
584 istr = min(ylcadr%NTYPTR, 1)
585 irot = max(ylcadr%NTYPTR-1, 0)
587 zmucen = ylcadr%SSLAPO
588 zlocen = sign(acos(ylcadr%SCLOPO), ylcadr%SSLOPO)
589 zstret = ylcadr%SCODIL
593 ismax = ylcadr%MTRONC
611 REAL (KIND=JPDBLR),
ALLOCATABLE :: ZVERT (:)
612 INTEGER (KIND=JPLIKB) :: IFLEVG
614 IF (cdpref ==
'S')
THEN 615 iflevg = ylcadr%NNIVER
616 ALLOCATE (zvert(2*(iflevg+1)))
617 zvert(1:iflevg+1) = ylcadr%SFOHYB (1,0:iflevg) * ylcadr%SPREFE
618 zvert(iflevg+2:2*(iflevg+1)) = ylcadr%SFOHYB (2,0:iflevg)
629 INTEGER (KIND=JPLIKB) :: IDATEF (22)
630 INTEGER (KIND=JPLIKB) :: ITRI
633 idatef(1:fa%JPLDAT) = ylfich%MADATE(:)
634 idatef(fa%JPLDAT+1:fa%JPLDAT*2) = ylfich%MADATX(:)
646 CALL igrib_set_value (kgribh,
'second',idatef(14)-60*(idatef(5)+60*idatef(4)))
653 IF (itri /= 0 .AND. istcum == 0)
THEN 656 ELSEIF (itri /= 0 .AND. istcum == 1)
THEN 659 ELSEIF (itri == 0)
THEN 671 REAL (KIND=JPDBLR),
TARGET,
ALLOCATABLE :: ZCHAMT (:)
672 REAL (KIND=JPDBLR),
TARGET,
ALLOCATABLE :: ZCHAMS (:)
673 REAL (KIND=JPDBLR),
POINTER :: ZCHAMP (:)
676 INTEGER (KIND=JPLIKB) :: ISMAX, IISMAX
677 INTEGER (KIND=JPLIKB) :: JN, IDX, JLON, JLAT, ILCHAM, ISTRF, ICUNDF
678 INTEGER (KIND=JPLIKB) :: IDECOPT
679 INTEGER (KIND=JPLIKB) :: INBITSMAX, IMAXIPREC
680 REAL (KIND=JPDBLR) :: ZUNDF, ZRNG, ZMIN, ZMAX
693 ilcham = ylcadr%NSFLAM
695 ilcham=(1+ylcadr%MTRONC)*(2+ylcadr%MTRONC)
698 ilcham = ylcadr%NVAPDG
705 ALLOCATE (zchams(ilcham))
706 zchams = pchamp(1:ilcham) * zmulti
707 zundf = zundf * zmulti
708 zchamp => zchams(1:ilcham)
710 zchamp => pchamp(1:ilcham)
720 icundf =
count(zchamp == zundf)
722 llhsdf = icundf < ilcham
730 inbits = min(ylfich%NBFCSP, inbitsmax)
734 IF (inbits == inbitsmax)
THEN 735 istrf = ylcadr%MTRONC
737 istrf = ylfich%NSTROF
754 istrf = ylfich%NSTROF
760 IF (inbits == inbitsmax)
THEN 762 iismax = ylcadr%MTRONC
763 CALL igrib_set_value (kgribh,
"biFourierResolutionSubSetParameterN", ismax)
764 CALL igrib_set_value (kgribh,
"biFourierResolutionSubSetParameterM", iismax)
767 CALL igrib_set_value (kgribh,
"biFourierResolutionSubSetParameterN", istrf)
768 CALL igrib_set_value (kgribh,
"biFourierResolutionSubSetParameterM", istrf)
782 inbits = min(ylfich%NBFPDG, inbitsmax)
784 IF (inbits == inbitsmax)
THEN 801 IF (inbits > 30)
THEN 807 CALL igrib_set_value (kgribh,
'packingType',
'grid_complex_spatial_differencing')
821 IF (.NOT. llgrib1)
THEN 828 ALLOCATE (zchamt(ilcham))
830 DO jlat = 1, ylcadr%NLATIT
831 DO jlon = 1, ylcadr%NXLOPA
832 jn = jlon+ylcadr%NXLOPA*(jlat-1)
833 idx = jlon+ylcadr%NXLOPA*(ylcadr%NLATIT-jlat)
834 zchamt(idx) = zchamp(jn)
849 IF (
ALLOCATED (zchams))
DEALLOCATE (zchams)
static const char * trim(const char *name, int *n)
integer, parameter jplikb
integer, save ngrib2_glo_sh
subroutine facgrm_fort(FA, KREP, KRANG, CDPREF, KNIVAU, CDSUFF, PCHAMP, LDCOSP, KGRIBH, LDUNDF, PUNDF, KLOCSN)
subroutine fagrib_api_hgeom_latlon
integer, save ngrib2_lam_bf
integer, save ngrib1_latlon
subroutine fagrib_api_hgeom
real(kind=jpdblr) function latrad2deg(PLAT)
subroutine fagrib_api_set_values
subroutine fanfan_fort(FA, KREP, KNUMER, CDPREF, KNIVAU, CDSUFF, CDNOMA, KLNOMA)
integer(kind=jplikb), parameter nundef
subroutine fagrib_api_vgeom
subroutine fagrib_api_hgeom_glo_sh
integer, save ngrib2_lam_gp
subroutine fagrib_api_hgeom_lam_gp
subroutine, public igrib_clone(KHANDLE1, KHANDLE2)
subroutine faigra_fort(FA)
integer, parameter jpdbld
subroutine fagrib_api_hgeom_lam_bf
subroutine fagrib_api_set_param
subroutine fagrib_api_date
integer, parameter jpdblr
integer, save ngrib2_glo_gp
subroutine fagrib_set_local_section
subroutine faquin_fort(FA, KREP, KNUMER, CDPREF, KNIVAU, CDSUFF, CDNOMA, KLNOMA)
subroutine fagrib_api_hgeom_glo_gp
integer, save ngrib2_latlon
real(kind=jpdblr) function lonrad2deg(PLON)
logical, save lgrib2_lam_ex
subroutine stru(CDS, CDU)
subroutine faipar_fort(FA, KNUMER, KNIMES, KCODE, LDFATA, CDMESS, CDNSPR, CDACTI, LDRLFI)
integer(kind=jplikb), parameter jpniil
subroutine fagrib_api_hgeom_lam_pr