81 type(paramset_t),
save :: pset
86 integer isec,hrs_obs_cutoff,min_obs_cutoff
87 integer sec_intvl,stat_miss_val,time_inc_betwn_succ_fld
88 integer perturb_num,num_ens_fcst
89 character*80 type_of_time_inc,stat_unit_time_key_succ
90 logical*1,
allocatable :: bmap(:)
92 integer,
allocatable :: mg(:)
94 integer,
parameter :: max_bytes=1000*1300000
95 integer,
parameter :: MAX_NUMBIT=16
96 integer,
parameter :: lugi=650
97 character*255 fl_nametbl,fl_gdss3
98 logical :: first_grbtbl
100 public num_pset,pset,nrecout,gribit2,grib_info_init,first_grbtbl,grib_info_finalize,read_grib2_head,read_grib2_sngle
101 real(8),
EXTERNAL :: timef
107 subroutine grib_info_init()
117 character(len=80) outfile
118 character(len=10) envvar
125 if(pset%grid_num==0) &
127 if(trim(pset%sub_center)==
'') &
128 pset%sub_center=
"ncep_emc"
129 if(trim(pset%version_no)==
'') &
130 pset%version_no=
"v2003"
131 if(trim(pset%local_table_vers_no)==
'') &
132 pset%local_table_vers_no=
"local_table_no"
133 if(trim(pset%sigreftime)==
'') &
134 pset%sigreftime=
"fcst"
135 if(trim(pset%prod_status)==
'') &
136 pset%prod_status=
"oper_test"
137 if(trim(pset%data_type)==
'') &
138 pset%data_type=
"fcst"
139 if(trim(pset%orig_center)==
'') &
140 pset%orig_center=
"nws_ncep"
141 if(trim(pset%time_range_unit)==
'') &
142 pset%time_range_unit=
"hour"
143 if(trim(pset%gen_proc_type)==
'') &
144 pset%gen_proc_type=
"fcst"
145 if(trim(pset%gen_proc)==
'') &
146 pset%gen_proc=
"gfs_avn"
147 if(trim(pset%packing_method)==
'') &
148 pset%packing_method=
"jpeg"
149 if(trim(pset%field_datatype)==
'') &
150 pset%field_datatype=
"flting_pnt"
151 if(trim(pset%comprs_type)==
'') &
152 pset%comprs_type=
"lossless"
153 if(trim(pset%type_ens_fcst)==
'') &
154 pset%type_ens_fcst=
"pos_pert_fcst"
155 if(trim(pset%type_derived_fcst)==
'') &
156 pset%type_derived_fcst=
"unweighted_mean_all_mem"
165 type_of_time_inc=
'same_start_time_fcst_fcst_time_inc'
166 stat_unit_time_key_succ=
'missing'
167 time_inc_betwn_succ_fld=0
171 if(first_grbtbl)
then
172 fl_nametbl=
'params_grib2_tbl_new'
173 call open_and_read_4dot2( fl_nametbl, ierr )
174 if ( ierr /= 0 )
then
175 print*,
'Couldnt open table file - return code was ',ierr
183 end subroutine grib_info_init
187 subroutine grib_info_finalize
195 call close_4dot2(ierr)
197 end subroutine grib_info_finalize
200 subroutine gribit2(post_fname)
203 use ctlblk_mod,
only : im,jm,im_jm,num_procs,me,ista,iend,jsta,jend,ifhr,sdat,ihrst,imin, &
204 mpi_comm_comp,ntlfld,fld_info,datapd,icnt,idsp
210 character(255),
intent(in) :: post_fname
213 integer i,j,k,n,nm,nprm,nlvl,fldlvl1,fldlvl2,cstart,cgrblen,ierr
215 integer fh, clength,lunout
216 integer idisc,icatg,iparm,itblinfo,ntrange,leng_time_range_stat
217 integer,
allocatable :: nfld_pe(:),snfld_pe(:),enfld_pe(:)
218 integer(4),
allocatable :: isdsp(:),iscnt(:),ircnt(:),irdsp(:)
219 integer status(MPI_STATUS_SIZE)
220 integer(kind=MPI_OFFSET_KIND) idisp
221 integer,
allocatable :: ista_pe(:),iend_pe(:)
222 integer,
allocatable :: jsta_pe(:),jend_pe(:)
223 integer,
allocatable :: grbmsglen(:)
224 real,
allocatable :: datafld(:,:)
225 real,
allocatable :: datafldtmp(:)
226 logical,
parameter :: debugprint = .false.
228 character(1),
dimension(:),
allocatable :: cgrib
229 real :: level_unit_conversion
234 allocate(cgrib(max_bytes))
242 nmod=mod(ntlfld,num_procs)
244 allocate(snfld_pe(num_procs),enfld_pe(num_procs),nfld_pe(num_procs))
247 snfld_pe(n)=nfpe*(n-1)+1
248 enfld_pe(n)=snfld_pe(n)+nfpe-1
251 snfld_pe(n)=nfpe*nmod+nf*(n-1-nmod)+1
252 enfld_pe(n)=snfld_pe(n)+nf-1
261 allocate(ista_pe(num_procs),iend_pe(num_procs))
262 call mpi_allgather(ista,1,mpi_integer,ista_pe,1, &
263 mpi_integer,mpi_comm_comp,ierr)
264 call mpi_allgather(iend,1,mpi_integer,iend_pe,1, &
265 mpi_integer,mpi_comm_comp,ierr)
267 allocate(jsta_pe(num_procs),jend_pe(num_procs))
268 call mpi_allgather(jsta,1,mpi_integer,jsta_pe,1, &
269 mpi_integer,mpi_comm_comp,ierr)
270 call mpi_allgather(jend,1,mpi_integer,jend_pe,1, &
271 mpi_integer,mpi_comm_comp,ierr)
278 allocate(bmap(im_jm))
284 if(num_procs==1)
then
287 allocate(datafld(im_jm,ntlfld) )
289 datafld=reshape(datapd,(/im_jm,ntlfld/))
301 call baopenw(lunout,trim(post_fname),ierr)
302 print*,
'write_grib2: opened ',lunout, &
303 'for grib2 data ',trim(post_fname), &
304 'return code is ',ierr
307 nprm=fld_info(i)%ifld
309 fldlvl1=fld_info(i+snfld_pe(me+1)-1)%lvl1
310 fldlvl2=fld_info(i+snfld_pe(me+1)-1)%lvl2
311 if(trim(pset%param(nprm)%table_info)==
'NCEP')
then
320 call search_for_4dot2_entry( &
321 pset%param(nprm)%pname, &
323 idisc, icatg, iparm, ierr)
325 write(6,
'(3(A,I4),A,A)')
' discipline ',idisc, &
326 ' category ',icatg, &
327 ' parameter ',iparm, &
328 ' for var ',trim(pset%param(nprm)%pname)
329 if(index(pset%param(nprm)%shortname,
'IFI_FLIGHT_LEVEL')>0)
then
330 level_unit_conversion=0.3048
332 level_unit_conversion=1
334 call gengrb2msg(idisc,icatg, iparm,nprm,nlvl,fldlvl1,fldlvl2, &
335 fld_info(i)%ntrange,fld_info(i)%tinvstat,datafld(:,i), &
336 cgrib,clength,level_unit_conversion)
338 call wryte(lunout, clength, cgrib)
340 print *,
'WRONG, could not find ',trim(pset%param(nprm)%pname), &
341 " in WMO and NCEP table!, ierr=", ierr
346 call baclose(lunout,ierr)
347 print *,
'finish one grib file'
354 allocate(iscnt(num_procs),isdsp(num_procs))
355 allocate(ircnt(num_procs),irdsp(num_procs))
358 iscnt(n)=(jend_pe(me+1)-jsta_pe(me+1)+1)*(iend_pe(me+1)-ista_pe(me+1)+1)*nfld_pe(n)
359 if(n<num_procs)isdsp(n+1)=isdsp(n)+iscnt(n)
364 ircnt(n)=(jend_pe(n)-jsta_pe(n)+1)*(iend_pe(n)-ista_pe(n)+1)*nfld_pe(me+1)
365 if(n<num_procs)irdsp(n+1)=irdsp(n)+ircnt(n)
369 allocate(datafldtmp(im_jm*nfld_pe(me+1)) )
370 allocate(datafld(im_jm,nfld_pe(me+1)) )
372 call mpi_alltoallv(datapd,iscnt,isdsp,mpi_real, &
373 datafldtmp,ircnt,irdsp,mpi_real,mpi_comm_comp,ierr)
380 do j=jsta_pe(n),jend_pe(n)
381 do i=ista_pe(n),iend_pe(n)
383 datafld((j-1)*im+i,k)=datafldtmp(nm)
389 deallocate(datafldtmp)
399 nprm=fld_info(i+snfld_pe(me+1)-1)%ifld
400 nlvl=fld_info(i+snfld_pe(me+1)-1)%lvl
401 fldlvl1=fld_info(i+snfld_pe(me+1)-1)%lvl1
402 fldlvl2=fld_info(i+snfld_pe(me+1)-1)%lvl2
403 ntrange=fld_info(i+snfld_pe(me+1)-1)%ntrange
404 leng_time_range_stat=fld_info(i+snfld_pe(me+1)-1)%tinvstat
405 if(trim(pset%param(nprm)%table_info)==
'NCEP')
then
414 call search_for_4dot2_entry( &
415 pset%param(nprm)%pname, &
417 idisc, icatg, iparm, ierr)
420 write(6,
'(3(A,I4),A,A)')
' discipline ',idisc, &
421 ' category ',icatg, &
422 ' parameter ',iparm, &
423 ' for var ',trim(pset%param(nprm)%pname)
428 if(index(pset%param(nprm)%shortname,
'IFI_FLIGHT_LEVEL')>0)
then
429 level_unit_conversion=0.3048
431 level_unit_conversion=1
433 call gengrb2msg(idisc,icatg, iparm,nprm,nlvl,fldlvl1,fldlvl2,ntrange, &
434 leng_time_range_stat,datafld(:,i),cgrib(cstart),clength, &
435 level_unit_conversion)
436 cstart=cstart+clength
440 print *,
'WRONG, could not find ',trim(pset%param(nprm)%pname), &
441 " in WMO and NCEP table!"
454 call mpi_barrier(mpi_comm_comp,ierr)
457 call mpi_file_open(mpi_comm_comp,trim(post_fname), &
458 mpi_mode_create+mpi_mode_wronly,mpi_info_null,fh,ierr)
462 allocate(grbmsglen(num_procs))
463 call mpi_allgather(cgrblen,1,mpi_integer,grbmsglen,1,mpi_integer, &
470 idisp=idisp+grbmsglen(n)
473 call mpi_file_write_at(fh,idisp,cgrib,cgrblen,mpi_character,status,ierr)
475 call mpi_file_close(fh,ierr)
479 deallocate(grbmsglen)
480 deallocate(iscnt,isdsp,ircnt,irdsp)
484 deallocate(datafld,bmap,mg)
485 deallocate(nfld_pe,snfld_pe,enfld_pe,jsta_pe,jend_pe)
488 end subroutine gribit2
493 subroutine gengrb2msg(idisc,icatg, iparm,nprm,nlvl,fldlvl1,fldlvl2,ntrange,tinvstat, &
494 datafld1,cgrib,lengrib,level_unit_conversion)
498 use ctlblk_mod,
only : im,jm,im_jm,ifhr,idat,sdat,ihrst,ifmin,imin,fld_info,spval, &
500 use gridspec_mod,
only: maptype
501 use grib2_all_tables_module,
only: g2sec0,g2sec1, &
502 g2sec4_temp0,g2sec4_temp8,g2sec4_temp44,g2sec4_temp48, &
503 g2sec5_temp0,g2sec5_temp2,g2sec5_temp3,g2sec5_temp40, &
504 get_g2_sec5packingmethod
508 integer,
intent(in) :: idisc,icatg, iparm,nprm,fldlvl1,fldlvl2,ntrange,tinvstat
509 integer,
intent(inout) :: nlvl
510 real,
dimension(:),
intent(in) :: datafld1
511 character(1),
intent(inout) :: cgrib(max_bytes)
512 integer,
intent(inout) :: lengrib
513 real,
intent(in) :: level_unit_conversion
515 integer,
parameter :: igdsmaxlen=200
517 integer,
parameter :: ipdstmplenmax=100
518 integer,
parameter :: ipdstmp4_0len=15
519 integer,
parameter :: ipdstmp4_1len=18
520 integer,
parameter :: ipdstmp4_8len=29
521 integer,
parameter :: ipdstmp4_11len=32
522 integer,
parameter :: ipdstmp4_12len=31
523 integer,
parameter :: ipdstmp4_44len=21
524 integer,
parameter :: ipdstmp4_48len=26
526 integer,
parameter :: idrstmplenmax=50
527 integer,
parameter :: idrstmp5_0len=5
528 integer,
parameter :: idrstmp5_2len=16
529 integer,
parameter :: idrstmp5_3len=18
530 integer,
parameter :: idrstmp5_40len=7
536 integer ipdstmpl(ipdstmplenmax)
538 integer idrstmpl(idrstmplenmax)
541 integer igdtlen,igdtn
543 integer ideflist(100)
544 integer idrsnum,numcoord,ipdsnum
545 integer scaled_val_fixed_sfc2,scale_fct_fixed_sfc1
546 integer scaled_val_fixed_sfc1,scale_fct_fixed_sfc2
547 character(80) fixed_sfc2_type
548 integer idec_scl,ibin_scl,ibmap,inumbits
550 integer igdstmpl(igdsmaxlen)
551 integer lat1,lon1,lat2,lon2,lad,ds1
555 integer ierr,ifhrorig,ihr_start
556 integer gefs1,gefs2,gefs3,gefs_status
557 character(len=4) cdum
558 integer perturb_num,num_ens_fcst,e1_type
564 if(trim(pset%gen_proc)==
'gefs')
then
565 call getenv(
'e1',cdum)
566 read(cdum,
'(I4)',iostat=gefs_status)gefs1
569 if(gefs_status /= 0) print *, &
570 "GEFS Run: Could not read e1 envir. var, User needs to set in script"
572 call getenv(
'e2',cdum)
573 read(cdum,
'(I4)',iostat=gefs_status)gefs2
576 if(gefs_status /= 0) print *, &
577 "GEFS Run: Could not read e2 envir. var, User needs to set in script"
581 call getenv(
'e3',cdum)
582 read(cdum,
'(I4)',iostat=gefs_status)gefs3
585 if(gefs_status /= 0) print *, &
586 "GEFS Run: Could not read e3 envir. var, User needs to set in script"
588 print*,
'GEFS env var ',e1_type,perturb_num,num_ens_fcst
591 print *,
"Processing for GEFS and default setting is tmpl4_1 and tmpl4_11"
592 if (trim(pset%param(nprm)%pdstmpl)==
'tmpl4_0')
then
593 pset%param(nprm)%pdstmpl=
'tmpl4_1'
594 elseif (trim(pset%param(nprm)%pdstmpl)==
'tmpl4_8')
then
595 pset%param(nprm)%pdstmpl=
'tmpl4_11'
602 call g2sec0(idisc,listsec0)
625 call g2sec1(pset%orig_center,pset%sub_center, &
626 pset%version_no,pset%local_table_vers_no,&
627 pset%sigreftime,nint(sdat(3)),nint(sdat(1)),nint(sdat(2)),ihrst,imin, &
628 isec,pset%prod_status,pset%data_type,listsec1)
631 if(trim(pset%gen_proc)==
'gefs')
then
634 if(e1_type==1.or.e1_type==2)
then
636 elseif(e1_type==3.or.e1_type==4)
then
639 print *,
"After g2sec1 call we need to set listsec1(2) = ",listsec1(2)
640 print *,
"After g2sec1 call we need to set listsec1(13) = ",listsec1(13)
645 call gribcreate(cgrib,max_bytes,listsec0,listsec1,ierr)
654 ldfgrd=(maptype==203.and.(trim(pset%param(nprm)%pname)==
'ugrd'.or. &
655 trim(pset%param(nprm)%pname)==
'vgrd'))
656 call getgds(ldfgrd,igdsmaxlen,igdtlen,igds,igdstmpl)
660 call addgrid(cgrib,max_bytes,igds,igdstmpl,igdtlen,ideflist,idefnum,ierr)
698 if(fldlvl1==0.and.fldlvl2==0)
then
700 if(
size(pset%param(nprm)%level)>1.and.
size(pset%param(nprm)%level)>=nlvl)
then
701 scaled_val_fixed_sfc1=nint(pset%param(nprm)%level(nlvl))
702 else if(
size(pset%param(nprm)%level)==1)
then
703 scaled_val_fixed_sfc1=nint(pset%param(nprm)%level(1))
705 scaled_val_fixed_sfc1=0
707 if(
size(pset%param(nprm)%scale_fact_fixed_sfc1)>1.and. &
708 size(pset%param(nprm)%scale_fact_fixed_sfc1)>=nlvl)
then
709 scale_fct_fixed_sfc1=pset%param(nprm)%scale_fact_fixed_sfc1(nlvl)
710 else if(
size(pset%param(nprm)%scale_fact_fixed_sfc1)==1)
then
711 scale_fct_fixed_sfc1=pset%param(nprm)%scale_fact_fixed_sfc1(1)
713 scale_fct_fixed_sfc1=0
718 scaled_val_fixed_sfc1=fldlvl1
719 scale_fct_fixed_sfc1=0
720 scaled_val_fixed_sfc2=fldlvl2
721 scale_fct_fixed_sfc2=0
724 fixed_sfc2_type=pset%param(nprm)%fixed_sfc2_type
725 if(
size(pset%param(nprm)%level2)>1.and.
size(pset%param(nprm)%level2)<nlvl)
then
729 if (
associated(pset%param(nprm)%level2))
then
730 if(
size(pset%param(nprm)%level2)>1.and.
size(pset%param(nprm)%level2)>=nlvl)
then
731 scaled_val_fixed_sfc2=nint(pset%param(nprm)%level2(nlvl))
732 else if(
size(pset%param(nprm)%level2)==1)
then
733 scaled_val_fixed_sfc2=nint(pset%param(nprm)%level2(1))
735 scaled_val_fixed_sfc2=0
738 scaled_val_fixed_sfc2=0
741 if(
size(pset%param(nprm)%scale_fact_fixed_sfc2)>1 .and. &
742 size(pset%param(nprm)%scale_fact_fixed_sfc2)>=nlvl)
then
743 scale_fct_fixed_sfc2=pset%param(nprm)%scale_fact_fixed_sfc2(nlvl)
744 else if(
size(pset%param(nprm)%scale_fact_fixed_sfc2)==1)
then
745 scale_fct_fixed_sfc2=pset%param(nprm)%scale_fact_fixed_sfc2(1)
747 scale_fct_fixed_sfc2=0
750 if(abs(level_unit_conversion-1)>1e-4)
then
753 scaled_val_fixed_sfc1=nint(scaled_val_fixed_sfc1*real(level_unit_conversion,kind=8))
754 scaled_val_fixed_sfc2=nint(scaled_val_fixed_sfc2*real(level_unit_conversion,kind=8))
758 ihr_start = ifhr-tinvstat
759 if(modelname==
'RAPR'.and.vtimeunits==
'FMIN')
then
761 ifhr = ifhr*60 + ifmin
762 ihr_start = max(0,ifhr-tinvstat)
765 pset%time_range_unit=
"minute"
767 ifhr = ifhr*60 + ifmin
768 ihr_start = max(0,ifhr-tinvstat*60)
777 if(trim(pset%param(nprm)%pdstmpl)==
'tmpl4_0')
then
779 ipdstmpllen=ipdstmp4_0len
780 call g2sec4_temp0(icatg,iparm,pset%gen_proc_type, &
781 pset%gen_proc,hrs_obs_cutoff,min_obs_cutoff, &
782 pset%time_range_unit,ifhr, &
783 pset%param(nprm)%fixed_sfc1_type, &
784 scale_fct_fixed_sfc1, &
785 scaled_val_fixed_sfc1, &
787 scale_fct_fixed_sfc2, &
788 scaled_val_fixed_sfc2, &
789 ipdstmpl(1:ipdstmpllen))
791 elseif(trim(pset%param(nprm)%pdstmpl)==
'tmpl4_1')
then
793 ipdstmpllen=ipdstmp4_1len
794 call g2sec4_temp1(icatg,iparm,pset%gen_proc_type, &
795 pset%gen_proc,hrs_obs_cutoff,min_obs_cutoff, &
796 pset%time_range_unit,ifhr, &
797 pset%param(nprm)%fixed_sfc1_type, &
798 scale_fct_fixed_sfc1, &
799 scaled_val_fixed_sfc1, &
801 scale_fct_fixed_sfc2, &
802 scaled_val_fixed_sfc2, &
803 pset%type_ens_fcst,perturb_num,num_ens_fcst, &
804 ipdstmpl(1:ipdstmpllen))
807 elseif(trim(pset%param(nprm)%pdstmpl)==
'tmpl4_8')
then
810 ipdstmpllen=ipdstmp4_8len
811 call g2sec4_temp8(icatg,iparm,pset%gen_proc_type, &
812 pset%gen_proc,hrs_obs_cutoff,min_obs_cutoff, &
813 pset%time_range_unit,ihr_start, &
814 pset%param(nprm)%fixed_sfc1_type, &
815 scale_fct_fixed_sfc1, &
816 scaled_val_fixed_sfc1, &
817 pset%param(nprm)%fixed_sfc2_type, &
818 scale_fct_fixed_sfc2, &
819 scaled_val_fixed_sfc2, &
820 idat(3),idat(1),idat(2),idat(4),idat(5), &
821 sec_intvl,ntrange,stat_miss_val, &
822 pset%param(nprm)%stats_proc,type_of_time_inc, &
823 pset%time_range_unit, tinvstat, &
824 stat_unit_time_key_succ,time_inc_betwn_succ_fld, &
825 ipdstmpl(1:ipdstmpllen))
828 elseif(trim(pset%param(nprm)%pdstmpl)==
'tmpl4_11')
then
830 ipdstmpllen=ipdstmp4_11len
831 call g2sec4_temp11(icatg,iparm,pset%gen_proc_type, &
832 pset%gen_proc,hrs_obs_cutoff,min_obs_cutoff, &
833 pset%time_range_unit,ifhr-tinvstat, &
834 pset%param(nprm)%fixed_sfc1_type, &
835 scale_fct_fixed_sfc1, &
836 scaled_val_fixed_sfc1, &
837 pset%param(nprm)%fixed_sfc2_type, &
838 scale_fct_fixed_sfc2, &
839 scaled_val_fixed_sfc2, &
840 pset%type_ens_fcst,perturb_num,num_ens_fcst, &
841 idat(3),idat(1),idat(2),idat(4),idat(5), &
842 sec_intvl,ntrange,stat_miss_val, &
843 pset%param(nprm)%stats_proc,type_of_time_inc, &
844 pset%time_range_unit, tinvstat, &
845 stat_unit_time_key_succ,time_inc_betwn_succ_fld, &
846 ipdstmpl(1:ipdstmpllen))
849 elseif(trim(pset%param(nprm)%pdstmpl)==
'tmpl4_12')
then
851 ipdstmpllen=ipdstmp4_12len
852 call g2sec4_temp12(icatg,iparm,pset%gen_proc_type, &
853 pset%gen_proc,hrs_obs_cutoff,min_obs_cutoff, &
854 pset%time_range_unit,ifhr-tinvstat, &
855 pset%param(nprm)%fixed_sfc1_type, &
856 scale_fct_fixed_sfc1, &
857 scaled_val_fixed_sfc1, &
859 scale_fct_fixed_sfc2, &
860 scaled_val_fixed_sfc2, &
861 pset%type_derived_fcst,num_ens_fcst, &
862 idat(3),idat(1),idat(2),idat(4),idat(5), &
863 sec_intvl,ntrange,stat_miss_val, &
864 pset%param(nprm)%stats_proc,type_of_time_inc, &
865 pset%time_range_unit, tinvstat, &
866 stat_unit_time_key_succ,time_inc_betwn_succ_fld, &
867 ipdstmpl(1:ipdstmpllen))
870 elseif(trim(pset%param(nprm)%pdstmpl)==
'tmpl4_44')
then
873 ipdstmpllen=ipdstmp4_44len
874 call g2sec4_temp44(icatg,iparm,pset%param(nprm)%aerosol_type, &
875 pset%param(nprm)%typ_intvl_size, &
876 pset%param(nprm)%scale_fact_1st_size, &
877 pset%param(nprm)%scale_val_1st_size, &
878 pset%param(nprm)%scale_fact_2nd_size, &
879 pset%param(nprm)%scale_val_2nd_size, &
880 pset%gen_proc_type, &
881 pset%gen_proc,hrs_obs_cutoff,min_obs_cutoff, &
882 pset%time_range_unit,ifhr, &
883 pset%param(nprm)%fixed_sfc1_type, &
884 scale_fct_fixed_sfc1, &
885 scaled_val_fixed_sfc1, &
886 pset%param(nprm)%fixed_sfc2_type, &
887 scale_fct_fixed_sfc2, &
888 scaled_val_fixed_sfc2, &
889 ipdstmpl(1:ipdstmpllen))
892 elseif(trim(pset%param(nprm)%pdstmpl)==
'tmpl4_48')
then
895 ipdstmpllen=ipdstmp4_48len
896 call g2sec4_temp48(icatg,iparm,pset%param(nprm)%aerosol_type, &
897 pset%param(nprm)%typ_intvl_size, &
898 pset%param(nprm)%scale_fact_1st_size, &
899 pset%param(nprm)%scale_val_1st_size, &
900 pset%param(nprm)%scale_fact_2nd_size, &
901 pset%param(nprm)%scale_val_2nd_size, &
902 pset%param(nprm)%typ_intvl_wvlen, &
903 pset%param(nprm)%scale_fact_1st_wvlen, &
904 pset%param(nprm)%scale_val_1st_wvlen, &
905 pset%param(nprm)%scale_fact_2nd_wvlen, &
906 pset%param(nprm)%scale_val_2nd_wvlen, &
907 pset%gen_proc_type, &
908 pset%gen_proc,hrs_obs_cutoff,min_obs_cutoff, &
909 pset%time_range_unit,ifhr, &
910 pset%param(nprm)%fixed_sfc1_type, &
911 scale_fct_fixed_sfc1, &
912 scaled_val_fixed_sfc1, &
913 pset%param(nprm)%fixed_sfc2_type, &
914 scale_fct_fixed_sfc2, &
915 scaled_val_fixed_sfc2, &
916 ipdstmpl(1:ipdstmpllen))
922 if(modelname==
'RAPR'.and.vtimeunits==
'FMIN')
then
934 call get_g2_sec5packingmethod(pset%packing_method,idrsnum,ierr)
935 if(maxval(datafld1)==minval(datafld1))
then
939 if(modelname==
'RAPR')
then
940 if((abs(maxval(datafld1)-minval(datafld1)) < 1.1) .and. (datafld1(1) > 500.0))
then
945 if(trim(pset%param(nprm)%shortname)==
'UGRD_ON_SPEC_HGT_LVL_ABOVE_GRND_10m'.or.&
946 trim(pset%param(nprm)%shortname)==
'VGRD_ON_SPEC_HGT_LVL_ABOVE_GRND_10m'.or.&
947 trim(pset%param(nprm)%shortname)==
'VWSH_ON_SPEC_HGT_LVL_ABOVE_GRND'.or.&
948 trim(pset%param(nprm)%shortname)==
'VUCSH_ON_SPEC_HGT_LVL_ABOVE_GRND_0-1km'.or.&
949 trim(pset%param(nprm)%shortname)==
'VVCSH_ON_SPEC_HGT_LVL_ABOVE_GRND_0-1km'.or.&
950 trim(pset%param(nprm)%shortname)==
'VUCSH_ON_SPEC_HGT_LVL_ABOVE_GRND_0-6km'.or.&
951 trim(pset%param(nprm)%shortname)==
'VVCSH_ON_SPEC_HGT_LVL_ABOVE_GRND_0-6km')
then
964 if(any(datafld1>=spval))
then
966 where(abs(datafld1)>=spval)bmap=.false.
969 if(
size(pset%param(nprm)%level)==
size(pset%param(nprm)%scale))
then
970 if(
size(pset%param(nprm)%level)==1) nlvl=1
972 fldscl=nint(pset%param(nprm)%scale(nlvl))
976 else if (
size(pset%param(nprm)%scale)==1)
then
977 fldscl=nint(pset%param(nprm)%scale(1))
981 if(trim(pset%param(nprm)%pname)==
'APCP' .or. &
982 trim(pset%param(nprm)%pname)==
'ACPCP' .or. &
983 trim(pset%param(nprm)%pname)==
'NCPCP')mxbit=22
984 if(mxbit>16)print*,
'increased MXBIT for ', pset%param(nprm)%pname,mxbit
985 call g2getbits(mxbit,ibmap,fldscl,
size(datafld1),bmap,datafld1,ibin_scl,idec_scl,inumbits)
987 if( idrsnum==40 )
then
988 idrstmplen=idrstmp5_40len
989 call g2sec5_temp40(idec_scl,ibin_scl,inumbits,pset%comprs_type,idrstmpl(1:idrstmplen))
990 elseif( idrsnum==2 )
then
991 idrstmplen=idrstmp5_2len
992 call g2sec5_temp2(idec_scl,ibin_scl,idrstmpl(1:idrstmplen))
993 elseif( idrsnum==3 )
then
994 idrstmplen=idrstmp5_3len
995 call g2sec5_temp3(idec_scl,ibin_scl,pset%order_of_sptdiff,idrstmpl(1:idrstmplen))
996 elseif( idrsnum==0 )
then
997 idrstmplen=idrstmp5_0len
998 call g2sec5_temp0(idec_scl,ibin_scl,inumbits,idrstmpl(1:idrstmplen))
1010 call addfield(cgrib,max_bytes,ipdsnum,ipdstmpl(1:ipdstmpllen), &
1011 ipdstmpllen,coordlist,numcoord,idrsnum,idrstmpl, &
1012 idrstmplen ,datafld1,im_jm,ibmap,bmap,ierr)
1019 call gribend(cgrib,max_bytes,lengrib,ierr)
1022 end subroutine gengrb2msg
1029 subroutine read_grib2_head(filenameG2,nx,ny,nz,rlonmin,rlatmax,rdx,rdy)
1035 character*256,
intent(in) :: filenameG2
1036 integer,
intent(out) :: nx,ny,nz
1037 real,
intent(out) :: rlonmin,rlatmax
1038 real*8,
intent(out) :: rdx,rdy
1041 type(gribfield) :: gfld
1042 logical :: expand=.true.
1044 character(len=1),
allocatable,
dimension(:) :: cgrib
1045 integer,
parameter :: msk1=32000
1046 integer :: lskip, lgrib,iseek
1048 integer :: icount , lengrib
1049 integer :: listsec0(3)
1050 integer :: listsec1(13)
1051 integer year, month, day, hour, minute, second, fcst
1052 integer :: numfields,numlocal,maxlocal,ierr
1053 integer :: grib_edition
1056 real :: scale_factor,scale_factor2
1059 integer :: nn,n,j,iret
1060 real :: fldmax,fldmin,sum
1075 call baopenr(ifile,trim(filenameg2),iret)
1079 call skgb(ifile,iseek,msk1,lskip,lgrib)
1081 if (lgrib.eq.0)
then
1085 if (lgrib.gt.currlen)
then
1086 if (
allocated(cgrib))
deallocate(cgrib)
1087 allocate(cgrib(lgrib))
1091 call baread(ifile,lskip,lgrib,lengrib,cgrib)
1092 if(lgrib.ne.lengrib)
then
1093 write(*,*)
'ERROR, read_grib2 lgrib ne lengrib', &
1100 call gb_info(cgrib,lengrib,listsec0,listsec1, &
1101 numfields,numlocal,maxlocal,ierr)
1103 write(6,*)
'Error querying GRIB2 message',ierr
1107 grib_edition=listsec0(2)
1108 if (grib_edition.ne.2)
then
1116 call gf_getfld(cgrib,lengrib,n,.false.,expand,gfld,ierr)
1117 year =gfld%idsect(6)
1118 month =gfld%idsect(7)
1120 hour =gfld%idsect(9)
1121 minute=gfld%idsect(10)
1122 second=gfld%idsect(11)
1123 write(*,*)
'year,month,day,hour,minute,second='
1124 write(*,*) year,month,day,hour,minute,second
1125 write(*,*)
'source center =',gfld%idsect(1)
1126 write(*,*)
'Indicator of model =',gfld%ipdtmpl(5)
1127 write(*,*)
'observation level (m)=',gfld%ipdtmpl(12)
1128 write(*,*)
'map projection=',gfld%igdtnum
1129 if (gfld%igdtnum.eq.0)
then
1131 nx = gfld%igdtmpl(8)
1132 ny = gfld%igdtmpl(9)
1134 rdx = gfld%igdtmpl(17)/scale_factor
1135 rdy = gfld%igdtmpl(18)/scale_factor
1136 rlatmax = gfld%igdtmpl(12)/scale_factor
1137 rlonmin = gfld%igdtmpl(13)/scale_factor
1141 else if (gfld%igdtnum.eq.1)
then
1142 nx = gfld%igdtmpl(8)
1143 ny = gfld%igdtmpl(9)
1145 rdx = gfld%igdtmpl(17)/scale_factor
1146 rdy = gfld%igdtmpl(18)/scale_factor
1147 rlatmax = gfld%igdtmpl(12)/scale_factor
1148 rlonmin = gfld%igdtmpl(13)/scale_factor
1152 else if (gfld%igdtnum.eq.30)
then
1153 nx = gfld%igdtmpl(8)
1154 ny = gfld%igdtmpl(9)
1156 rdx = gfld%igdtmpl(15)/scale_factor2
1157 rdy = gfld%igdtmpl(16)/scale_factor2
1158 rlatmax = gfld%igdtmpl(10)/scale_factor
1159 rlonmin = gfld%igdtmpl(11)/scale_factor
1164 write(*,*)
'unknown projection'
1170 CALL baclose(ifile,ierr)
1172 if (
allocated(cgrib))
deallocate(cgrib)
1175 end subroutine read_grib2_head
1179 subroutine read_grib2_sngle(filenameG2,ntot,height,var)
1185 character*256,
intent(in) :: filenameG2
1186 integer,
intent(in) :: ntot
1187 real,
intent(out) :: var(ntot)
1188 integer,
intent(out) :: height
1191 type(gribfield) :: gfld
1192 logical :: expand=.true.
1194 character(len=1),
allocatable,
dimension(:) :: cgrib
1195 integer,
parameter :: msk1=32000
1196 integer :: lskip, lgrib,iseek
1198 integer :: icount , lengrib
1199 integer :: listsec0(3)
1200 integer :: listsec1(13)
1201 integer year, month, day, hour, minute, second, fcst
1202 integer :: numfields,numlocal,maxlocal,ierr
1203 integer :: grib_edition
1206 real :: dx,dy,lat1,lon1,rtnum, nlat
1207 real :: ref_value,bin_scale_fac,dec_scale_fac,bit_number,field_type
1209 real :: scale_factor,scale_factor2
1212 integer :: nn,n,j,iret
1213 real :: fldmax,fldmin,sum
1228 call baopenr(ifile,trim(filenameg2),iret)
1232 call skgb(ifile,iseek,msk1,lskip,lgrib)
1234 if (lgrib.eq.0)
then
1238 if (lgrib.gt.currlen)
then
1239 if (
allocated(cgrib))
deallocate(cgrib)
1240 allocate(cgrib(lgrib))
1244 call baread(ifile,lskip,lgrib,lengrib,cgrib)
1245 if(lgrib.ne.lengrib)
then
1246 write(*,*)
'ERROR, read_grib2 lgrib ne lengrib', &
1254 call gb_info(cgrib,lengrib,listsec0,listsec1, &
1255 numfields,numlocal,maxlocal,ierr)
1257 write(6,*)
'Error querying GRIB2 message',ierr
1261 grib_edition=listsec0(2)
1262 if (grib_edition.ne.2)
then
1270 call gf_getfld(cgrib,lengrib,n,.false.,expand,gfld,ierr)
1271 year =gfld%idsect(6)
1272 month =gfld%idsect(7)
1274 hour =gfld%idsect(9)
1275 minute=gfld%idsect(10)
1276 second=gfld%idsect(11)
1283 height=gfld%ipdtmpl(12)
1284 if (gfld%igdtnum.eq.0)
then
1286 nx = gfld%igdtmpl(8)
1287 ny = gfld%igdtmpl(9)
1288 dx = gfld%igdtmpl(17)/scale_factor
1289 dy = gfld%igdtmpl(18)/scale_factor
1290 lat1 = gfld%igdtmpl(12)/scale_factor
1291 lon1 = gfld%igdtmpl(13)/scale_factor
1295 else if (gfld%igdtnum.eq.1)
then
1296 nx = gfld%igdtmpl(8)
1297 ny = gfld%igdtmpl(9)
1298 dx = gfld%igdtmpl(17)/scale_factor
1299 dy = gfld%igdtmpl(18)/scale_factor
1300 lat1 = gfld%igdtmpl(12)/scale_factor
1301 lon1 = gfld%igdtmpl(13)/scale_factor
1305 else if (gfld%igdtnum.eq.30)
then
1306 nx = gfld%igdtmpl(8)
1307 ny = gfld%igdtmpl(9)
1308 dx = gfld%igdtmpl(15)/scale_factor2
1309 dy = gfld%igdtmpl(16)/scale_factor2
1310 lat1 = gfld%igdtmpl(10)/scale_factor
1311 lon1 = gfld%igdtmpl(11)/scale_factor
1316 rtnum = gfld%idrtnum
1318 ref_value = gfld%idrtmpl(1)
1319 bin_scale_fac = gfld%idrtmpl(2)
1320 dec_scale_fac = gfld%idrtmpl(3)
1321 bit_number = gfld%idrtmpl(4)
1322 field_type = gfld%idrtmpl(5)
1323 bit_map = gfld%ibmap
1330 else if (gfld%igdtnum.eq.40)
then
1331 nx = gfld%igdtmpl(8)
1332 ny = gfld%igdtmpl(9)
1333 lat1 = gfld%igdtmpl(12)/scale_factor
1334 lon1 = gfld%igdtmpl(13)/scale_factor
1335 dx = gfld%igdtmpl(17)/scale_factor
1336 nlat = gfld%igdtmpl(18)
1337 write(*,*) gfld%igdtnum, nx, ny, lat1, lon1, dx, nlat
1339 write(*,*)
'unknown projection'
1344 num_fields:
do n = 1, numfields
1346 call gf_getfld(cgrib,lengrib,n,.true.,expand,gfld,ierr)
1348 write(*,*)
' ERROR extracting field gf_getfld = ',ierr
1357 if(ntot .ne. gfld%ngrdpts)
then
1358 write(*,*)
'Error, wrong dimension ',ntot, gfld%ngrdpts
1370 CALL baclose(ifile,ierr)
1371 if (
allocated(cgrib))
deallocate(cgrib)
1375 end subroutine read_grib2_sngle
1379 subroutine g2sec3tmpl40(nx,nY,lat1,lon1,lat2,lon2,lad,ds1,len3,igds,ifield3)
1382 integer(4),
intent(inout) :: nx,ny,lat1,lon1,lat2,lon2,lad,ds1,len3
1383 integer(4),
intent(inout) :: ifield3(len3),igds(5)
1419 end subroutine g2sec3tmpl40
1423 subroutine g2getbits(MXBIT,ibm,scl,len,bmap,g,ibs,ids,nbits)
1444 INTEGER,
INTENT(IN) :: MXBIT,IBM,LEN
1445 LOGICAL*1,
INTENT(IN) :: BMAP(LEN)
1446 REAL,
INTENT(IN) :: scl,G(LEN)
1447 INTEGER,
INTENT(OUT) :: IBS,IDS,NBITS
1452 real,
PARAMETER :: ALOG2=0.69314718056,hpeps=0.500001
1455 INTEGER :: I,I1,icnt,ipo,le,irange
1456 REAL :: GROUND,GMIN,GMAX,s,rmin,rmax,range,rr,rng2,po,rln2
1458 DATA rln2/0.69314718/
1467 gmax = max(gmax,g(i))
1468 gmin = min(gmin,g(i))
1483 gmax = max(gmax,g(i))
1484 gmin = min(gmin,g(i))
1501 IF ( range <= 1.e-30 )
THEN
1506 IF ( scl == 0.0 )
THEN
1509 ELSE IF ( scl > 0.0 )
THEN
1510 ipo = int(alog10( range ))
1512 if(ipo<0.and.ipo+scl<-20)
then
1513 print *,
'for small range,ipo=',ipo,
'ipo+scl=',ipo+scl,
'scl=',scl
1518 IF ( range < 1.00 ) ipo = ipo - 1
1519 po = float(ipo) - scl + 1.
1521 rr = range * 10. ** ( -po )
1522 nbits = int( alog( rr ) / rln2 ) + 1
1525 rng2 = range * 2. ** (-ibs)
1526 nbits = int( alog( rng2 ) / rln2 ) + 1
1532 IF(abs(gmin) >= 1.)
THEN
1533 ids = -int(alog10(abs(gmin)))
1534 ELSE IF (abs(gmin) < 1.0.AND.abs(gmin) > 0.0)
THEN
1535 ids = -int(alog10(abs(gmin)))+1
1540 nbits = min(nbits,mxbit)
1543 IF ( scl > 0.0 )
THEN
1550 gmax = max(gmax,g(i)*s)
1551 gmin = min(gmin,g(i)*s)
1567 gmax = max(gmax,g(i)*s)
1568 gmin = min(gmin,g(i)*s)
1578 if(gmax == gmin)
then
1581 ibs = nint(alog(range/(2.**nbits-0.5))/alog2+hpeps)
1589 END subroutine g2getbits
1593 subroutine getgds(ldfgrd,len3,ifield3len,igds,ifield3)
1597 use ctlblk_mod,
only : im,jm,gdsdegr,modelname
1598 use gridspec_mod,
only: dxval,dyval,cenlat,cenlon,latstart,lonstart,latlast, &
1599 & lonlast,maptype,standlon,latstartv,cenlatv,lonstartv, &
1600 cenlonv,truelat1,truelat2,latstart_r,lonstart_r, &
1605 logical,
intent(in) :: ldfgrd
1606 integer(4),
intent(in) :: len3
1607 integer(4),
intent(out) :: ifield3len
1608 integer(4),
intent(inout) :: ifield3(len3),igds(5)
1619 IF(maptype == 1)
THEN
1627 ifield3(10) = latstart
1628 ifield3(11) = lonstart
1631 if (modelname ==
'FV3R')
then
1635 ifield3(13) = truelat1
1636 ifield3(14) = standlon
1645 ifield3(19) = truelat1
1646 ifield3(20) = truelat2
1649 ELSE IF(maptype == 2)
THEN
1657 ifield3(10) = latstart
1658 ifield3(11) = lonstart
1660 ifield3(13) = truelat1
1661 ifield3(14) = standlon
1668 ELSE IF(maptype==3)
THEN
1676 ifield3(10) = latstart
1677 ifield3(11) = lonstart
1679 ifield3(13) = truelat1
1680 ifield3(14) = latlast
1681 ifield3(15) = lonlast
1688 ELSE IF(maptype == 203)
THEN
1697 if(.not.ldfgrd)
then
1700 ifield3(11) = 45000000
1702 ifield3(12) = latstart
1703 ifield3(13) = lonstart
1705 ifield3(15) = cenlat
1706 ifield3(16) = cenlon
1712 ELSE IF(maptype == 205 .OR. maptype == 6)
THEN
1721 if(.not.ldfgrd)
then
1724 ifield3(11) = 45000000
1726 ifield3(12) = latstart
1727 ifield3(13) = lonstart
1729 ifield3(15) = cenlat
1730 ifield3(16) = cenlon
1734 ifield3(20) = latlast
1735 ifield3(21) = lonlast
1738 ELSE IF(maptype == 207)
THEN
1747 if(.not.ldfgrd)
then
1750 ifield3(11) = 45000000
1752 ifield3(12) = latstart_r
1753 ifield3(13) = lonstart_r
1756 if(modelname==
'FV3R')
then
1760 ifield3(15) = latlast_r
1761 ifield3(16) = lonlast_r
1765 ifield3(20) = cenlat-90.*gdsdegr
1766 ifield3(21) = cenlon
1772 ELSE IF(maptype == 4 )
THEN
1782 ifield3(12) = latstart
1783 ifield3(13) = lonstart
1785 ifield3(15) = latlast
1786 ifield3(16) = lonlast
1787 ifield3(17) = nint(360./(im)*1000000.)
1788 ifield3(18) = nint(jm/2.0)
1789 if( latstart < latlast )
then
1796 ELSE IF(maptype == 0 )
THEN
1806 ifield3(12) = latstart
1807 ifield3(13) = lonstart
1809 ifield3(15) = latlast
1810 ifield3(16) = lonlast
1821 if( latstart < latlast )
then
1830 end subroutine getgds
1834 end module grib2_module