84 integer isec,hrs_obs_cutoff,min_obs_cutoff
85 integer sec_intvl,stat_miss_val,time_inc_betwn_succ_fld
86 integer perturb_num,num_ens_fcst
87 character*80 type_of_time_inc,stat_unit_time_key_succ
88 logical*1,
allocatable :: bmap(:)
90 integer,
allocatable :: mg(:)
92 integer,
parameter :: max_bytes=1000*1300000
93 integer,
parameter :: max_numbit=16
94 integer,
parameter :: lugi=650
95 character*255 fl_nametbl,fl_gdss3
96 logical :: first_grbtbl
98 public num_pset,pset,nrecout,gribit2,grib_info_init,first_grbtbl,grib_info_finalize,read_grib2_head,read_grib2_sngle
99 real(8),
EXTERNAL :: timef
105 subroutine grib_info_init()
115 character(len=80) outfile
116 character(len=10) envvar
123 if(pset%grid_num==0) &
125 if(trim(pset%sub_center)==
'') &
126 pset%sub_center=
"ncep_emc"
127 if(trim(pset%version_no)==
'') &
128 pset%version_no=
"v2003"
129 if(trim(pset%local_table_vers_no)==
'') &
130 pset%local_table_vers_no=
"local_table_no"
131 if(trim(pset%sigreftime)==
'') &
132 pset%sigreftime=
"fcst"
133 if(trim(pset%prod_status)==
'') &
134 pset%prod_status=
"oper_test"
135 if(trim(pset%data_type)==
'') &
136 pset%data_type=
"fcst"
137 if(trim(pset%orig_center)==
'') &
138 pset%orig_center=
"nws_ncep"
139 if(trim(pset%time_range_unit)==
'') &
140 pset%time_range_unit=
"hour"
141 if(trim(pset%gen_proc_type)==
'') &
142 pset%gen_proc_type=
"fcst"
143 if(trim(pset%gen_proc)==
'') &
144 pset%gen_proc=
"gfs_avn"
145 if(trim(pset%packing_method)==
'') &
146 pset%packing_method=
"jpeg"
147 if(trim(pset%field_datatype)==
'') &
148 pset%field_datatype=
"flting_pnt"
149 if(trim(pset%comprs_type)==
'') &
150 pset%comprs_type=
"lossless"
151 if(trim(pset%type_ens_fcst)==
'') &
152 pset%type_ens_fcst=
"pos_pert_fcst"
153 if(trim(pset%type_derived_fcst)==
'') &
154 pset%type_derived_fcst=
"unweighted_mean_all_mem"
163 type_of_time_inc=
'same_start_time_fcst_fcst_time_inc'
164 stat_unit_time_key_succ=
'missing'
165 time_inc_betwn_succ_fld=0
169 if(first_grbtbl)
then
170 fl_nametbl=
'params_grib2_tbl_new'
171 call open_and_read_4dot2( fl_nametbl, ierr )
172 if ( ierr /= 0 )
then
173 print*,
'Couldnt open table file - return code was ',ierr
181 end subroutine grib_info_init
185 subroutine grib_info_finalize
193 call close_4dot2(ierr)
195 end subroutine grib_info_finalize
198 subroutine gribit2(post_fname)
201 use ctlblk_mod
, only : im,jm,im_jm,num_procs,me,ista,iend,jsta,jend,ifhr,sdat,ihrst,imin, &
202 mpi_comm_comp,ntlfld,fld_info,datapd,icnt,idsp
208 character(255),
intent(in) :: post_fname
211 integer i,j,k,n,nm,nprm,nlvl,fldlvl1,fldlvl2,cstart,cgrblen,ierr
213 integer fh, clength,lunout
214 integer idisc,icatg,iparm,itblinfo,ntrange,leng_time_range_stat
215 integer,
allocatable :: nfld_pe(:),snfld_pe(:),enfld_pe(:)
216 integer(4),
allocatable :: isdsp(:),iscnt(:),ircnt(:),irdsp(:)
217 integer status(mpi_status_size)
218 integer(kind=MPI_OFFSET_KIND) idisp
219 integer,
allocatable :: ista_pe(:),iend_pe(:)
220 integer,
allocatable :: jsta_pe(:),jend_pe(:)
221 integer,
allocatable :: grbmsglen(:)
222 real,
allocatable :: datafld(:,:)
223 real,
allocatable :: datafldtmp(:)
224 logical,
parameter :: debugprint = .false.
226 character(1),
dimension(:),
allocatable :: cgrib
231 allocate(cgrib(max_bytes))
239 nmod=mod(ntlfld,num_procs)
241 allocate(snfld_pe(num_procs),enfld_pe(num_procs),nfld_pe(num_procs))
244 snfld_pe(n)=nfpe*(n-1)+1
245 enfld_pe(n)=snfld_pe(n)+nfpe-1
248 snfld_pe(n)=nfpe*nmod+nf*(n-1-nmod)+1
249 enfld_pe(n)=snfld_pe(n)+nf-1
258 allocate(ista_pe(num_procs),iend_pe(num_procs))
259 call mpi_allgather(ista,1,mpi_integer,ista_pe,1, &
260 mpi_integer,mpi_comm_comp,ierr)
261 call mpi_allgather(iend,1,mpi_integer,iend_pe,1, &
262 mpi_integer,mpi_comm_comp,ierr)
264 allocate(jsta_pe(num_procs),jend_pe(num_procs))
265 call mpi_allgather(jsta,1,mpi_integer,jsta_pe,1, &
266 mpi_integer,mpi_comm_comp,ierr)
267 call mpi_allgather(jend,1,mpi_integer,jend_pe,1, &
268 mpi_integer,mpi_comm_comp,ierr)
275 allocate(bmap(im_jm))
281 if(num_procs==1)
then
284 allocate(datafld(im_jm,ntlfld) )
286 datafld=reshape(datapd,(/im_jm,ntlfld/))
298 call baopenw(lunout,trim(post_fname),ierr)
299 print*,
'write_grib2: opened ',lunout, &
300 'for grib2 data ',trim(post_fname), &
301 'return code is ',ierr
304 nprm=fld_info(i)%ifld
306 fldlvl1=fld_info(i+snfld_pe(me+1)-1)%lvl1
307 fldlvl2=fld_info(i+snfld_pe(me+1)-1)%lvl2
308 if(trim(pset%param(nprm)%table_info)==
'NCEP')
then
317 call search_for_4dot2_entry( &
318 pset%param(nprm)%pname, &
320 idisc, icatg, iparm, ierr)
322 write(6,
'(3(A,I4),A,A)')
' discipline ',idisc, &
323 ' category ',icatg, &
324 ' parameter ',iparm, &
325 ' for var ',trim(pset%param(nprm)%pname)
327 call gengrb2msg(idisc,icatg, iparm,nprm,nlvl,fldlvl1,fldlvl2, &
328 fld_info(i)%ntrange,fld_info(i)%tinvstat,datafld(:,i), &
331 call wryte(lunout, clength, cgrib)
333 print *,
'WRONG, could not find ',trim(pset%param(nprm)%pname), &
334 " in WMO and NCEP table!, ierr=", ierr
339 call baclose(lunout,ierr)
340 print *,
'finish one grib file'
347 allocate(iscnt(num_procs),isdsp(num_procs))
348 allocate(ircnt(num_procs),irdsp(num_procs))
351 iscnt(n)=(jend_pe(me+1)-jsta_pe(me+1)+1)*(iend_pe(me+1)-ista_pe(me+1)+1)*nfld_pe(n)
352 if(n<num_procs)isdsp(n+1)=isdsp(n)+iscnt(n)
357 ircnt(n)=(jend_pe(n)-jsta_pe(n)+1)*(iend_pe(n)-ista_pe(n)+1)*nfld_pe(me+1)
358 if(n<num_procs)irdsp(n+1)=irdsp(n)+ircnt(n)
362 allocate(datafldtmp(im_jm*nfld_pe(me+1)) )
363 allocate(datafld(im_jm,nfld_pe(me+1)) )
365 call mpi_alltoallv(datapd,iscnt,isdsp,mpi_real, &
366 datafldtmp,ircnt,irdsp,mpi_real,mpi_comm_comp,ierr)
373 do j=jsta_pe(n),jend_pe(n)
374 do i=ista_pe(n),iend_pe(n)
376 datafld((j-1)*im+i,k)=datafldtmp(nm)
382 deallocate(datafldtmp)
392 nprm=fld_info(i+snfld_pe(me+1)-1)%ifld
393 nlvl=fld_info(i+snfld_pe(me+1)-1)%lvl
394 fldlvl1=fld_info(i+snfld_pe(me+1)-1)%lvl1
395 fldlvl2=fld_info(i+snfld_pe(me+1)-1)%lvl2
396 ntrange=fld_info(i+snfld_pe(me+1)-1)%ntrange
397 leng_time_range_stat=fld_info(i+snfld_pe(me+1)-1)%tinvstat
398 if(trim(pset%param(nprm)%table_info)==
'NCEP')
then
407 call search_for_4dot2_entry( &
408 pset%param(nprm)%pname, &
410 idisc, icatg, iparm, ierr)
413 write(6,
'(3(A,I4),A,A)')
' discipline ',idisc, &
414 ' category ',icatg, &
415 ' parameter ',iparm, &
416 ' for var ',trim(pset%param(nprm)%pname)
421 call gengrb2msg(idisc,icatg, iparm,nprm,nlvl,fldlvl1,fldlvl2,ntrange, &
422 leng_time_range_stat,datafld(:,i),cgrib(cstart),clength)
423 cstart=cstart+clength
427 print *,
'WRONG, could not find ',trim(pset%param(nprm)%pname), &
428 " in WMO and NCEP table!"
441 call mpi_barrier(mpi_comm_comp,ierr)
444 call mpi_file_open(mpi_comm_comp,trim(post_fname), &
445 mpi_mode_create+mpi_mode_wronly,mpi_info_null,fh,ierr)
449 allocate(grbmsglen(num_procs))
450 call mpi_allgather(cgrblen,1,mpi_integer,grbmsglen,1,mpi_integer, &
457 idisp=idisp+grbmsglen(n)
460 call mpi_file_write_at(fh,idisp,cgrib,cgrblen,mpi_character,status,ierr)
462 call mpi_file_close(fh,ierr)
466 deallocate(grbmsglen)
467 deallocate(iscnt,isdsp,ircnt,irdsp)
471 deallocate(datafld,bmap,mg)
472 deallocate(nfld_pe,snfld_pe,enfld_pe,jsta_pe,jend_pe)
475 end subroutine gribit2
480 subroutine gengrb2msg(idisc,icatg, iparm,nprm,nlvl,fldlvl1,fldlvl2,ntrange,tinvstat, &
481 datafld1,cgrib,lengrib)
485 use ctlblk_mod
, only : im,jm,im_jm,ifhr,idat,sdat,ihrst,ifmin,imin,fld_info,spval, &
487 use gridspec_mod
, only: maptype
488 use grib2_all_tables_module
, only: g2sec0,g2sec1, &
489 g2sec4_temp0,g2sec4_temp8,g2sec4_temp44,g2sec4_temp48, &
490 g2sec5_temp0,g2sec5_temp2,g2sec5_temp3,g2sec5_temp40, &
491 get_g2_sec5packingmethod
495 integer,
intent(in) :: idisc,icatg, iparm,nprm,fldlvl1,fldlvl2,ntrange,tinvstat
496 integer,
intent(inout) :: nlvl
497 real,
dimension(:),
intent(in) :: datafld1
498 character(1),
intent(inout) :: cgrib(max_bytes)
499 integer,
intent(inout) :: lengrib
501 integer,
parameter :: igdsmaxlen=200
503 integer,
parameter :: ipdstmplenmax=100
504 integer,
parameter :: ipdstmp4_0len=15
505 integer,
parameter :: ipdstmp4_1len=18
506 integer,
parameter :: ipdstmp4_8len=29
507 integer,
parameter :: ipdstmp4_11len=32
508 integer,
parameter :: ipdstmp4_12len=31
509 integer,
parameter :: ipdstmp4_44len=21
510 integer,
parameter :: ipdstmp4_48len=26
512 integer,
parameter :: idrstmplenmax=50
513 integer,
parameter :: idrstmp5_0len=5
514 integer,
parameter :: idrstmp5_2len=16
515 integer,
parameter :: idrstmp5_3len=18
516 integer,
parameter :: idrstmp5_40len=7
522 integer ipdstmpl(ipdstmplenmax)
524 integer idrstmpl(idrstmplenmax)
527 integer igdtlen,igdtn
529 integer ideflist(100)
530 integer idrsnum,numcoord,ipdsnum
531 integer scaled_val_fixed_sfc2,scale_fct_fixed_sfc1
532 integer scaled_val_fixed_sfc1,scale_fct_fixed_sfc2
533 character(80) fixed_sfc2_type
534 integer idec_scl,ibin_scl,ibmap,inumbits
536 integer igdstmpl(igdsmaxlen)
537 integer lat1,lon1,lat2,lon2,lad,ds1
541 integer ierr,ifhrorig,ihr_start
542 integer gefs1,gefs2,gefs3,gefs_status
543 character(len=4) cdum
544 integer perturb_num,num_ens_fcst,e1_type
550 if(trim(pset%gen_proc)==
'gefs')
then
551 call getenv(
'e1',cdum)
552 read(cdum,
'(I4)',iostat=gefs_status)gefs1
555 if(gefs_status /= 0) print *, &
556 "GEFS Run: Could not read e1 envir. var, User needs to set in script"
558 call getenv(
'e2',cdum)
559 read(cdum,
'(I4)',iostat=gefs_status)gefs2
562 if(gefs_status /= 0) print *, &
563 "GEFS Run: Could not read e2 envir. var, User needs to set in script"
567 call getenv(
'e3',cdum)
568 read(cdum,
'(I4)',iostat=gefs_status)gefs3
571 if(gefs_status /= 0) print *, &
572 "GEFS Run: Could not read e3 envir. var, User needs to set in script"
574 print*,
'GEFS env var ',e1_type,perturb_num,num_ens_fcst
577 print *,
"Processing for GEFS and default setting is tmpl4_1 and tmpl4_11"
578 if (trim(pset%param(nprm)%pdstmpl)==
'tmpl4_0')
then
579 pset%param(nprm)%pdstmpl=
'tmpl4_1'
580 elseif (trim(pset%param(nprm)%pdstmpl)==
'tmpl4_8')
then
581 pset%param(nprm)%pdstmpl=
'tmpl4_11'
588 call g2sec0(idisc,listsec0)
611 call g2sec1(pset%orig_center,pset%sub_center, &
612 pset%version_no,pset%local_table_vers_no,&
613 pset%sigreftime,nint(sdat(3)),nint(sdat(1)),nint(sdat(2)),ihrst,imin, &
614 isec,pset%prod_status,pset%data_type,listsec1)
617 if(trim(pset%gen_proc)==
'gefs')
then
620 if(e1_type==1.or.e1_type==2)
then
622 elseif(e1_type==3.or.e1_type==4)
then
625 print *,
"After g2sec1 call we need to set listsec1(2) = ",listsec1(2)
626 print *,
"After g2sec1 call we need to set listsec1(13) = ",listsec1(13)
631 call gribcreate(cgrib,max_bytes,listsec0,listsec1,ierr)
640 ldfgrd=(maptype==203.and.(trim(pset%param(nprm)%pname)==
'ugrd'.or. &
641 trim(pset%param(nprm)%pname)==
'vgrd'))
642 call getgds(ldfgrd,igdsmaxlen,igdtlen,igds,igdstmpl)
646 call addgrid(cgrib,max_bytes,igds,igdstmpl,igdtlen,ideflist,idefnum,ierr)
684 if(fldlvl1==0.and.fldlvl2==0)
then
686 if(
size(pset%param(nprm)%level)>1.and.
size(pset%param(nprm)%level)>=nlvl)
then
687 scaled_val_fixed_sfc1=nint(pset%param(nprm)%level(nlvl))
688 else if(
size(pset%param(nprm)%level)==1)
then
689 scaled_val_fixed_sfc1=nint(pset%param(nprm)%level(1))
691 scaled_val_fixed_sfc1=0
693 if(
size(pset%param(nprm)%scale_fact_fixed_sfc1)>1.and. &
694 size(pset%param(nprm)%scale_fact_fixed_sfc1)>=nlvl)
then
695 scale_fct_fixed_sfc1=pset%param(nprm)%scale_fact_fixed_sfc1(nlvl)
696 else if(
size(pset%param(nprm)%scale_fact_fixed_sfc1)==1)
then
697 scale_fct_fixed_sfc1=pset%param(nprm)%scale_fact_fixed_sfc1(1)
699 scale_fct_fixed_sfc1=0
704 scaled_val_fixed_sfc1=fldlvl1
705 scale_fct_fixed_sfc1=0
706 scaled_val_fixed_sfc2=fldlvl2
707 scale_fct_fixed_sfc2=0
710 fixed_sfc2_type=pset%param(nprm)%fixed_sfc2_type
711 if(
size(pset%param(nprm)%level2)>1.and.
size(pset%param(nprm)%level2)<nlvl)
then
715 if (
associated(pset%param(nprm)%level2))
then
716 if(
size(pset%param(nprm)%level2)>1.and.
size(pset%param(nprm)%level2)>=nlvl)
then
717 scaled_val_fixed_sfc2=nint(pset%param(nprm)%level2(nlvl))
718 else if(
size(pset%param(nprm)%level2)==1)
then
719 scaled_val_fixed_sfc2=nint(pset%param(nprm)%level2(1))
721 scaled_val_fixed_sfc2=0
724 scaled_val_fixed_sfc2=0
727 if(
size(pset%param(nprm)%scale_fact_fixed_sfc2)>1 .and. &
728 size(pset%param(nprm)%scale_fact_fixed_sfc2)>=nlvl)
then
729 scale_fct_fixed_sfc2=pset%param(nprm)%scale_fact_fixed_sfc2(nlvl)
730 else if(
size(pset%param(nprm)%scale_fact_fixed_sfc2)==1)
then
731 scale_fct_fixed_sfc2=pset%param(nprm)%scale_fact_fixed_sfc2(1)
733 scale_fct_fixed_sfc2=0
736 ihr_start = ifhr-tinvstat
737 if(modelname==
'RAPR'.and.vtimeunits==
'FMIN')
then
739 ifhr = ifhr*60 + ifmin
740 ihr_start = max(0,ifhr-tinvstat)
743 pset%time_range_unit=
"minute"
745 ifhr = ifhr*60 + ifmin
746 ihr_start = max(0,ifhr-tinvstat*60)
755 if(trim(pset%param(nprm)%pdstmpl)==
'tmpl4_0')
then
757 ipdstmpllen=ipdstmp4_0len
758 call g2sec4_temp0(icatg,iparm,pset%gen_proc_type, &
759 pset%gen_proc,hrs_obs_cutoff,min_obs_cutoff, &
760 pset%time_range_unit,ifhr, &
761 pset%param(nprm)%fixed_sfc1_type, &
762 scale_fct_fixed_sfc1, &
763 scaled_val_fixed_sfc1, &
765 scale_fct_fixed_sfc2, &
766 scaled_val_fixed_sfc2, &
767 ipdstmpl(1:ipdstmpllen))
769 elseif(trim(pset%param(nprm)%pdstmpl)==
'tmpl4_1')
then
771 ipdstmpllen=ipdstmp4_1len
772 call g2sec4_temp1(icatg,iparm,pset%gen_proc_type, &
773 pset%gen_proc,hrs_obs_cutoff,min_obs_cutoff, &
774 pset%time_range_unit,ifhr, &
775 pset%param(nprm)%fixed_sfc1_type, &
776 scale_fct_fixed_sfc1, &
777 scaled_val_fixed_sfc1, &
779 scale_fct_fixed_sfc2, &
780 scaled_val_fixed_sfc2, &
781 pset%type_ens_fcst,perturb_num,num_ens_fcst, &
782 ipdstmpl(1:ipdstmpllen))
785 elseif(trim(pset%param(nprm)%pdstmpl)==
'tmpl4_8')
then
788 ipdstmpllen=ipdstmp4_8len
789 call g2sec4_temp8(icatg,iparm,pset%gen_proc_type, &
790 pset%gen_proc,hrs_obs_cutoff,min_obs_cutoff, &
791 pset%time_range_unit,ihr_start, &
792 pset%param(nprm)%fixed_sfc1_type, &
793 scale_fct_fixed_sfc1, &
794 scaled_val_fixed_sfc1, &
795 pset%param(nprm)%fixed_sfc2_type, &
796 scale_fct_fixed_sfc2, &
797 scaled_val_fixed_sfc2, &
798 idat(3),idat(1),idat(2),idat(4),idat(5), &
799 sec_intvl,ntrange,stat_miss_val, &
800 pset%param(nprm)%stats_proc,type_of_time_inc, &
801 pset%time_range_unit, tinvstat, &
802 stat_unit_time_key_succ,time_inc_betwn_succ_fld, &
803 ipdstmpl(1:ipdstmpllen))
806 elseif(trim(pset%param(nprm)%pdstmpl)==
'tmpl4_11')
then
808 ipdstmpllen=ipdstmp4_11len
809 call g2sec4_temp11(icatg,iparm,pset%gen_proc_type, &
810 pset%gen_proc,hrs_obs_cutoff,min_obs_cutoff, &
811 pset%time_range_unit,ifhr-tinvstat, &
812 pset%param(nprm)%fixed_sfc1_type, &
813 scale_fct_fixed_sfc1, &
814 scaled_val_fixed_sfc1, &
815 pset%param(nprm)%fixed_sfc2_type, &
816 scale_fct_fixed_sfc2, &
817 scaled_val_fixed_sfc2, &
818 pset%type_ens_fcst,perturb_num,num_ens_fcst, &
819 idat(3),idat(1),idat(2),idat(4),idat(5), &
820 sec_intvl,ntrange,stat_miss_val, &
821 pset%param(nprm)%stats_proc,type_of_time_inc, &
822 pset%time_range_unit, tinvstat, &
823 stat_unit_time_key_succ,time_inc_betwn_succ_fld, &
824 ipdstmpl(1:ipdstmpllen))
827 elseif(trim(pset%param(nprm)%pdstmpl)==
'tmpl4_12')
then
829 ipdstmpllen=ipdstmp4_12len
830 call g2sec4_temp12(icatg,iparm,pset%gen_proc_type, &
831 pset%gen_proc,hrs_obs_cutoff,min_obs_cutoff, &
832 pset%time_range_unit,ifhr-tinvstat, &
833 pset%param(nprm)%fixed_sfc1_type, &
834 scale_fct_fixed_sfc1, &
835 scaled_val_fixed_sfc1, &
837 scale_fct_fixed_sfc2, &
838 scaled_val_fixed_sfc2, &
839 pset%type_derived_fcst,num_ens_fcst, &
840 idat(3),idat(1),idat(2),idat(4),idat(5), &
841 sec_intvl,ntrange,stat_miss_val, &
842 pset%param(nprm)%stats_proc,type_of_time_inc, &
843 pset%time_range_unit, tinvstat, &
844 stat_unit_time_key_succ,time_inc_betwn_succ_fld, &
845 ipdstmpl(1:ipdstmpllen))
848 elseif(trim(pset%param(nprm)%pdstmpl)==
'tmpl4_44')
then
851 ipdstmpllen=ipdstmp4_44len
852 call g2sec4_temp44(icatg,iparm,pset%param(nprm)%aerosol_type, &
853 pset%param(nprm)%typ_intvl_size, &
854 pset%param(nprm)%scale_fact_1st_size, &
855 pset%param(nprm)%scale_val_1st_size, &
856 pset%param(nprm)%scale_fact_2nd_size, &
857 pset%param(nprm)%scale_val_2nd_size, &
858 pset%gen_proc_type, &
859 pset%gen_proc,hrs_obs_cutoff,min_obs_cutoff, &
860 pset%time_range_unit,ifhr, &
861 pset%param(nprm)%fixed_sfc1_type, &
862 scale_fct_fixed_sfc1, &
863 scaled_val_fixed_sfc1, &
864 pset%param(nprm)%fixed_sfc2_type, &
865 scale_fct_fixed_sfc2, &
866 scaled_val_fixed_sfc2, &
867 ipdstmpl(1:ipdstmpllen))
870 elseif(trim(pset%param(nprm)%pdstmpl)==
'tmpl4_48')
then
873 ipdstmpllen=ipdstmp4_48len
874 call g2sec4_temp48(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%param(nprm)%typ_intvl_wvlen, &
881 pset%param(nprm)%scale_fact_1st_wvlen, &
882 pset%param(nprm)%scale_val_1st_wvlen, &
883 pset%param(nprm)%scale_fact_2nd_wvlen, &
884 pset%param(nprm)%scale_val_2nd_wvlen, &
885 pset%gen_proc_type, &
886 pset%gen_proc,hrs_obs_cutoff,min_obs_cutoff, &
887 pset%time_range_unit,ifhr, &
888 pset%param(nprm)%fixed_sfc1_type, &
889 scale_fct_fixed_sfc1, &
890 scaled_val_fixed_sfc1, &
891 pset%param(nprm)%fixed_sfc2_type, &
892 scale_fct_fixed_sfc2, &
893 scaled_val_fixed_sfc2, &
894 ipdstmpl(1:ipdstmpllen))
900 if(modelname==
'RAPR'.and.vtimeunits==
'FMIN')
then
912 call get_g2_sec5packingmethod(pset%packing_method,idrsnum,ierr)
913 if(maxval(datafld1)==minval(datafld1))
then
917 if(modelname==
'RAPR')
then
918 if((abs(maxval(datafld1)-minval(datafld1)) < 1.1) .and. (datafld1(1) > 500.0))
then
923 if(trim(pset%param(nprm)%shortname)==
'UGRD_ON_SPEC_HGT_LVL_ABOVE_GRND_10m'.or.&
924 trim(pset%param(nprm)%shortname)==
'VGRD_ON_SPEC_HGT_LVL_ABOVE_GRND_10m'.or.&
925 trim(pset%param(nprm)%shortname)==
'VWSH_ON_SPEC_HGT_LVL_ABOVE_GRND'.or.&
926 trim(pset%param(nprm)%shortname)==
'VUCSH_ON_SPEC_HGT_LVL_ABOVE_GRND_0-1km'.or.&
927 trim(pset%param(nprm)%shortname)==
'VVCSH_ON_SPEC_HGT_LVL_ABOVE_GRND_0-1km'.or.&
928 trim(pset%param(nprm)%shortname)==
'VUCSH_ON_SPEC_HGT_LVL_ABOVE_GRND_0-6km'.or.&
929 trim(pset%param(nprm)%shortname)==
'VVCSH_ON_SPEC_HGT_LVL_ABOVE_GRND_0-6km')
then
942 if(any(datafld1>=spval))
then
944 where(abs(datafld1)>=spval)bmap=.false.
947 if(
size(pset%param(nprm)%level)==
size(pset%param(nprm)%scale))
then
948 if(
size(pset%param(nprm)%level)==1) nlvl=1
950 fldscl=nint(pset%param(nprm)%scale(nlvl))
954 else if (
size(pset%param(nprm)%scale)==1)
then
955 fldscl=nint(pset%param(nprm)%scale(1))
959 if(trim(pset%param(nprm)%pname)==
'APCP' .or. &
960 trim(pset%param(nprm)%pname)==
'ACPCP' .or. &
961 trim(pset%param(nprm)%pname)==
'NCPCP')mxbit=22
962 if(mxbit>16)print*,
'increased MXBIT for ', pset%param(nprm)%pname,mxbit
963 call g2getbits(mxbit,ibmap,fldscl,
size(datafld1),bmap,datafld1,ibin_scl,idec_scl,inumbits)
965 if( idrsnum==40 )
then
966 idrstmplen=idrstmp5_40len
967 call g2sec5_temp40(idec_scl,ibin_scl,inumbits,pset%comprs_type,idrstmpl(1:idrstmplen))
968 elseif( idrsnum==2 )
then
969 idrstmplen=idrstmp5_2len
970 call g2sec5_temp2(idec_scl,ibin_scl,idrstmpl(1:idrstmplen))
971 elseif( idrsnum==3 )
then
972 idrstmplen=idrstmp5_3len
973 call g2sec5_temp3(idec_scl,ibin_scl,pset%order_of_sptdiff,idrstmpl(1:idrstmplen))
974 elseif( idrsnum==0 )
then
975 idrstmplen=idrstmp5_0len
976 call g2sec5_temp0(idec_scl,ibin_scl,inumbits,idrstmpl(1:idrstmplen))
988 call addfield(cgrib,max_bytes,ipdsnum,ipdstmpl(1:ipdstmpllen), &
989 ipdstmpllen,coordlist,numcoord,idrsnum,idrstmpl, &
990 idrstmplen ,datafld1,im_jm,ibmap,bmap,ierr)
997 call gribend(cgrib,max_bytes,lengrib,ierr)
1000 end subroutine gengrb2msg
1007 subroutine read_grib2_head(filenameG2,nx,ny,nz,rlonmin,rlatmax,rdx,rdy)
1013 character*256,
intent(in) :: filenameg2
1014 integer,
intent(out) :: nx,ny,nz
1015 real,
intent(out) :: rlonmin,rlatmax
1016 real*8,
intent(out) :: rdx,rdy
1019 type(gribfield
) :: gfld
1020 logical :: expand=.true.
1022 character(len=1),
allocatable,
dimension(:) :: cgrib
1023 integer,
parameter :: msk1=32000
1024 integer :: lskip, lgrib,iseek
1026 integer :: icount , lengrib
1027 integer :: listsec0(3)
1028 integer :: listsec1(13)
1029 integer year, month, day, hour, minute, second, fcst
1030 integer :: numfields,numlocal,maxlocal,ierr
1031 integer :: grib_edition
1034 real :: scale_factor,scale_factor2
1037 integer :: nn,n,j,iret
1038 real :: fldmax,fldmin,sum
1053 call baopenr(ifile,trim(filenameg2),iret)
1057 call skgb(ifile,iseek,msk1,lskip,lgrib)
1059 if (lgrib.eq.0)
then
1063 if (lgrib.gt.currlen)
then
1064 if (
allocated(cgrib))
deallocate(cgrib)
1065 allocate(cgrib(lgrib))
1069 call baread(ifile,lskip,lgrib,lengrib,cgrib)
1070 if(lgrib.ne.lengrib)
then
1071 write(*,*)
'ERROR, read_grib2 lgrib ne lengrib', &
1078 call gb_info(cgrib,lengrib,listsec0,listsec1, &
1079 numfields,numlocal,maxlocal,ierr)
1081 write(6,*)
'Error querying GRIB2 message',ierr
1085 grib_edition=listsec0(2)
1086 if (grib_edition.ne.2)
then
1094 call gf_getfld(cgrib,lengrib,n,.false.,expand,gfld,ierr)
1095 year =gfld%idsect(6)
1096 month =gfld%idsect(7)
1098 hour =gfld%idsect(9)
1099 minute=gfld%idsect(10)
1100 second=gfld%idsect(11)
1101 write(*,*)
'year,month,day,hour,minute,second='
1102 write(*,*) year,month,day,hour,minute,second
1103 write(*,*)
'source center =',gfld%idsect(1)
1104 write(*,*)
'Indicator of model =',gfld%ipdtmpl(5)
1105 write(*,*)
'observation level (m)=',gfld%ipdtmpl(12)
1106 write(*,*)
'map projection=',gfld%igdtnum
1107 if (gfld%igdtnum.eq.0)
then
1109 nx = gfld%igdtmpl(8)
1110 ny = gfld%igdtmpl(9)
1112 rdx = gfld%igdtmpl(17)/scale_factor
1113 rdy = gfld%igdtmpl(18)/scale_factor
1114 rlatmax = gfld%igdtmpl(12)/scale_factor
1115 rlonmin = gfld%igdtmpl(13)/scale_factor
1119 else if (gfld%igdtnum.eq.1)
then
1120 nx = gfld%igdtmpl(8)
1121 ny = gfld%igdtmpl(9)
1123 rdx = gfld%igdtmpl(17)/scale_factor
1124 rdy = gfld%igdtmpl(18)/scale_factor
1125 rlatmax = gfld%igdtmpl(12)/scale_factor
1126 rlonmin = gfld%igdtmpl(13)/scale_factor
1130 else if (gfld%igdtnum.eq.30)
then
1131 nx = gfld%igdtmpl(8)
1132 ny = gfld%igdtmpl(9)
1134 rdx = gfld%igdtmpl(15)/scale_factor2
1135 rdy = gfld%igdtmpl(16)/scale_factor2
1136 rlatmax = gfld%igdtmpl(10)/scale_factor
1137 rlonmin = gfld%igdtmpl(11)/scale_factor
1142 write(*,*)
'unknown projection'
1148 CALL baclose(ifile,ierr)
1150 if (
allocated(cgrib))
deallocate(cgrib)
1153 end subroutine read_grib2_head
1157 subroutine read_grib2_sngle(filenameG2,ntot,height,var)
1163 character*256,
intent(in) :: filenameg2
1164 integer,
intent(in) :: ntot
1165 real,
intent(out) :: var(ntot)
1166 integer,
intent(out) :: height
1169 type(gribfield
) :: gfld
1170 logical :: expand=.true.
1172 character(len=1),
allocatable,
dimension(:) :: cgrib
1173 integer,
parameter :: msk1=32000
1174 integer :: lskip, lgrib,iseek
1176 integer :: icount , lengrib
1177 integer :: listsec0(3)
1178 integer :: listsec1(13)
1179 integer year, month, day, hour, minute, second, fcst
1180 integer :: numfields,numlocal,maxlocal,ierr
1181 integer :: grib_edition
1184 real :: dx,dy,lat1,lon1,rtnum
1185 real :: ref_value,bin_scale_fac,dec_scale_fac,bit_number,field_type
1187 real :: scale_factor,scale_factor2
1190 integer :: nn,n,j,iret
1191 real :: fldmax,fldmin,sum
1206 call baopenr(ifile,trim(filenameg2),iret)
1210 call skgb(ifile,iseek,msk1,lskip,lgrib)
1212 if (lgrib.eq.0)
then
1216 if (lgrib.gt.currlen)
then
1217 if (
allocated(cgrib))
deallocate(cgrib)
1218 allocate(cgrib(lgrib))
1222 call baread(ifile,lskip,lgrib,lengrib,cgrib)
1223 if(lgrib.ne.lengrib)
then
1224 write(*,*)
'ERROR, read_grib2 lgrib ne lengrib', &
1232 call gb_info(cgrib,lengrib,listsec0,listsec1, &
1233 numfields,numlocal,maxlocal,ierr)
1235 write(6,*)
'Error querying GRIB2 message',ierr
1239 grib_edition=listsec0(2)
1240 if (grib_edition.ne.2)
then
1248 call gf_getfld(cgrib,lengrib,n,.false.,expand,gfld,ierr)
1249 year =gfld%idsect(6)
1250 month =gfld%idsect(7)
1252 hour =gfld%idsect(9)
1253 minute=gfld%idsect(10)
1254 second=gfld%idsect(11)
1261 height=gfld%ipdtmpl(12)
1262 if (gfld%igdtnum.eq.0)
then
1264 nx = gfld%igdtmpl(8)
1265 ny = gfld%igdtmpl(9)
1266 dx = gfld%igdtmpl(17)/scale_factor
1267 dy = gfld%igdtmpl(18)/scale_factor
1268 lat1 = gfld%igdtmpl(12)/scale_factor
1269 lon1 = gfld%igdtmpl(13)/scale_factor
1273 else if (gfld%igdtnum.eq.1)
then
1274 nx = gfld%igdtmpl(8)
1275 ny = gfld%igdtmpl(9)
1276 dx = gfld%igdtmpl(17)/scale_factor
1277 dy = gfld%igdtmpl(18)/scale_factor
1278 lat1 = gfld%igdtmpl(12)/scale_factor
1279 lon1 = gfld%igdtmpl(13)/scale_factor
1283 else if (gfld%igdtnum.eq.30)
then
1284 nx = gfld%igdtmpl(8)
1285 ny = gfld%igdtmpl(9)
1286 dx = gfld%igdtmpl(15)/scale_factor2
1287 dy = gfld%igdtmpl(16)/scale_factor2
1288 lat1 = gfld%igdtmpl(10)/scale_factor
1289 lon1 = gfld%igdtmpl(11)/scale_factor
1294 rtnum = gfld%idrtnum
1296 ref_value = gfld%idrtmpl(1)
1297 bin_scale_fac = gfld%idrtmpl(2)
1298 dec_scale_fac = gfld%idrtmpl(3)
1299 bit_number = gfld%idrtmpl(4)
1300 field_type = gfld%idrtmpl(5)
1301 bit_map = gfld%ibmap
1309 write(*,*)
'unknown projection'
1314 num_fields:
do n = 1, numfields
1316 call gf_getfld(cgrib,lengrib,n,.true.,expand,gfld,ierr)
1318 write(*,*)
' ERROR extracting field gf_getfld = ',ierr
1327 if(ntot .ne. gfld%ngrdpts)
then
1328 write(*,*)
'Error, wrong dimension ',ntot, gfld%ngrdpts
1340 CALL baclose(ifile,ierr)
1341 if (
allocated(cgrib))
deallocate(cgrib)
1345 end subroutine read_grib2_sngle
1349 subroutine g2sec3tmpl40(nx,nY,lat1,lon1,lat2,lon2,lad,ds1,len3,igds,ifield3)
1352 integer(4),
intent(inout) :: nx,ny,lat1,lon1,lat2,lon2,lad,ds1,len3
1353 integer(4),
intent(inout) :: ifield3(len3),igds(5)
1389 end subroutine g2sec3tmpl40
1393 subroutine g2getbits(MXBIT,ibm,scl,len,bmap,g,ibs,ids,nbits)
1414 INTEGER,
INTENT(IN) :: mxbit,ibm,len
1415 LOGICAL*1,
INTENT(IN) :: bmap(len)
1416 REAL,
INTENT(IN) :: scl,g(len)
1417 INTEGER,
INTENT(OUT) :: ibs,ids,nbits
1422 real,
PARAMETER :: alog2=0.69314718056,hpeps=0.500001
1425 INTEGER :: i,i1,icnt,ipo,le,irange
1426 REAL :: ground,gmin,gmax,s,rmin,rmax,range,rr,rng2,po,rln2
1428 DATA rln2/0.69314718/
1437 gmax = max(gmax,g(i))
1438 gmin = min(gmin,g(i))
1453 gmax = max(gmax,g(i))
1454 gmin = min(gmin,g(i))
1471 IF ( range <= 1.e-30 )
THEN
1476 IF ( scl == 0.0 )
THEN
1479 ELSE IF ( scl > 0.0 )
THEN
1480 ipo = int(alog10( range ))
1482 if(ipo<0.and.ipo+scl<-20)
then
1483 print *,
'for small range,ipo=',ipo,
'ipo+scl=',ipo+scl,
'scl=',scl
1488 IF ( range < 1.00 ) ipo = ipo - 1
1489 po = float(ipo) - scl + 1.
1491 rr = range * 10. ** ( -po )
1492 nbits = int( alog( rr ) / rln2 ) + 1
1495 rng2 = range * 2. ** (-ibs)
1496 nbits = int( alog( rng2 ) / rln2 ) + 1
1502 IF(abs(gmin) >= 1.)
THEN
1503 ids = -int(alog10(abs(gmin)))
1504 ELSE IF (abs(gmin) < 1.0.AND.abs(gmin) > 0.0)
THEN
1505 ids = -int(alog10(abs(gmin)))+1
1510 nbits = min(nbits,mxbit)
1513 IF ( scl > 0.0 )
THEN
1520 gmax = max(gmax,g(i)*s)
1521 gmin = min(gmin,g(i)*s)
1537 gmax = max(gmax,g(i)*s)
1538 gmin = min(gmin,g(i)*s)
1548 if(gmax == gmin)
then
1551 ibs = nint(alog(range/(2.**nbits-0.5))/alog2+hpeps)
1559 END subroutine g2getbits
1563 subroutine getgds(ldfgrd,len3,ifield3len,igds,ifield3)
1567 use ctlblk_mod
, only : im,jm,gdsdegr,modelname
1568 use gridspec_mod
, only: dxval,dyval,cenlat,cenlon,latstart,lonstart,latlast, &
1569 & lonlast,maptype,standlon,latstartv,cenlatv,lonstartv, &
1570 cenlonv,truelat1,truelat2,latstart_r,lonstart_r, &
1575 logical,
intent(in) :: ldfgrd
1576 integer(4),
intent(in) :: len3
1577 integer(4),
intent(out) :: ifield3len
1578 integer(4),
intent(inout) :: ifield3(len3),igds(5)
1589 IF(maptype == 1)
THEN
1597 ifield3(10) = latstart
1598 ifield3(11) = lonstart
1601 if (modelname ==
'FV3R')
then
1605 ifield3(13) = truelat1
1606 ifield3(14) = standlon
1615 ifield3(19) = truelat1
1616 ifield3(20) = truelat2
1619 ELSE IF(maptype == 2)
THEN
1627 ifield3(10) = latstart
1628 ifield3(11) = lonstart
1630 ifield3(13) = truelat1
1631 ifield3(14) = standlon
1638 ELSE IF(maptype==3)
THEN
1646 ifield3(10) = latstart
1647 ifield3(11) = lonstart
1649 ifield3(13) = truelat1
1650 ifield3(14) = latlast
1651 ifield3(15) = lonlast
1658 ELSE IF(maptype == 203)
THEN
1667 if(.not.ldfgrd)
then
1670 ifield3(11) = 45000000
1672 ifield3(12) = latstart
1673 ifield3(13) = lonstart
1675 ifield3(15) = cenlat
1676 ifield3(16) = cenlon
1682 ELSE IF(maptype == 205 .OR. maptype == 6)
THEN
1691 if(.not.ldfgrd)
then
1694 ifield3(11) = 45000000
1696 ifield3(12) = latstart
1697 ifield3(13) = lonstart
1699 ifield3(15) = cenlat
1700 ifield3(16) = cenlon
1704 ifield3(20) = latlast
1705 ifield3(21) = lonlast
1708 ELSE IF(maptype == 207)
THEN
1717 if(.not.ldfgrd)
then
1720 ifield3(11) = 45000000
1722 ifield3(12) = latstart_r
1723 ifield3(13) = lonstart_r
1726 if(modelname==
'FV3R')
then
1730 ifield3(15) = latlast_r
1731 ifield3(16) = lonlast_r
1735 ifield3(20) = cenlat-90.*gdsdegr
1736 ifield3(21) = cenlon
1742 ELSE IF(maptype == 4 )
THEN
1752 ifield3(12) = latstart
1753 ifield3(13) = lonstart
1755 ifield3(15) = latlast
1756 ifield3(16) = lonlast
1757 ifield3(17) = nint(360./(im)*1000000.)
1758 ifield3(18) = nint(jm/2.0)
1759 if( latstart < latlast )
then
1766 ELSE IF(maptype == 0 )
THEN
1776 ifield3(12) = latstart
1777 ifield3(13) = lonstart
1779 ifield3(15) = latlast
1780 ifield3(16) = lonlast
1782 ifield3(17) = abs(lonlast-lonstart)/(im-1)
1787 ifield3(18) = abs(latlast-latstart)/(jm-1)
1789 if( latstart < latlast )
then
1798 end subroutine getgds