52 integer,
parameter :: grads_vars_limit = 1000
53 integer,
parameter :: num_item_list = 17
54 integer,
parameter :: num_item_list_atom = 17
55 integer,
parameter :: num_item_list_land = 11
56 integer,
parameter :: num_item_list_ocean = 9
57 logical :: data_available(num_item_list_atom,3)
58 character(len=H_SHORT) :: item_list_atom (num_item_list_atom)
59 character(len=H_SHORT) :: item_list_land (num_item_list_land)
60 character(len=H_SHORT) :: item_list_ocean(num_item_list_ocean)
61 data item_list_atom /
'lon',
'lat',
'plev',
'U',
'V',
'T',
'HGT',
'QV',
'RH',
'MSLP',
'PSFC',
'U10',
'V10',
'T2',
'Q2',
'RH2',
'TOPO' /
62 data item_list_land /
'lsmask',
'lon',
'lat',
'lon_sfc',
'lat_sfc',
'llev', &
63 'STEMP',
'SMOISVC',
'SMOISDS',
'SKINT',
'TOPO' /
64 data item_list_ocean /
'lsmask',
'lon',
'lat',
'lon_sfc',
'lat_sfc',
'lon_sst',
'lat_sst',
'SKINT',
'SST'/
66 integer,
parameter :: ia_lon = 1
67 integer,
parameter :: ia_lat = 2
68 integer,
parameter :: ia_p = 3
69 integer,
parameter :: ia_u = 4
70 integer,
parameter :: ia_v = 5
71 integer,
parameter :: ia_t = 6
72 integer,
parameter :: ia_hgt = 7
73 integer,
parameter :: ia_qv = 8
74 integer,
parameter :: ia_rh = 9
75 integer,
parameter :: ia_slp = 10
76 integer,
parameter :: ia_ps = 11
77 integer,
parameter :: ia_u10 = 12
78 integer,
parameter :: ia_v10 = 13
79 integer,
parameter :: ia_t2 = 14
80 integer,
parameter :: ia_q2 = 15
81 integer,
parameter :: ia_rh2 = 16
82 integer,
parameter :: ia_topo = 17
84 integer,
parameter :: il_lsmask = 1
85 integer,
parameter :: il_lon = 2
86 integer,
parameter :: il_lat = 3
87 integer,
parameter :: il_lon_sfc = 4
88 integer,
parameter :: il_lat_sfc = 5
89 integer,
parameter :: il_lz = 6
90 integer,
parameter :: il_stemp = 7
91 integer,
parameter :: il_smoisvc = 8
92 integer,
parameter :: il_smoisds = 9
93 integer,
parameter :: il_skint = 10
94 integer,
parameter :: il_topo = 11
96 integer,
parameter :: io_lsmask = 1
97 integer,
parameter :: io_lon = 2
98 integer,
parameter :: io_lat = 3
99 integer,
parameter :: io_lon_sfc = 4
100 integer,
parameter :: io_lat_sfc = 5
101 integer,
parameter :: io_lon_sst = 6
102 integer,
parameter :: io_lat_sst = 7
103 integer,
parameter :: io_skint = 8
104 integer,
parameter :: io_sst = 9
107 integer,
parameter :: lvars_limit = 1000
108 real(RP),
parameter :: large_number_one = 9.999e+15_rp
111 character(len=H_SHORT) :: upper_qv_type =
"ZERO" 115 character(len=H_SHORT) :: grads_item (num_item_list,3)
116 character(len=H_LONG) :: grads_dtype (num_item_list,3)
117 character(len=H_LONG) :: grads_fname (num_item_list,3)
118 character(len=H_SHORT) :: grads_fendian (num_item_list,3)
119 character(len=H_SHORT) :: grads_yrev (num_item_list,3)
120 real(RP) :: grads_swpoint (num_item_list,3)
121 real(RP) :: grads_dd (num_item_list,3)
122 integer :: grads_lnum (num_item_list,3)
123 real(RP) :: grads_lvars (lvars_limit,num_item_list,3)
124 integer :: grads_startrec(num_item_list,3)
125 integer :: grads_totalrec(num_item_list,3)
126 integer :: grads_knum (num_item_list,3)
127 real(SP) :: grads_missval (num_item_list,3)
129 real(SP),
allocatable :: gdata2d(:,:)
130 real(SP),
allocatable :: gdata3d(:,:,:)
131 real(SP),
allocatable :: gland2d(:,:)
132 real(SP),
allocatable :: gland3d(:,:,:)
133 real(SP),
allocatable :: gsst2d (:,:)
135 integer :: io_fid_grads_nml = -1
136 integer :: io_fid_grads_data = -1
140 integer :: outer_nx = -1
141 integer :: outer_ny = -1
142 integer :: outer_nz = -1
143 integer :: outer_nl = -1
145 integer :: outer_nx_sfc = -1
146 integer :: outer_ny_sfc = -1
148 integer :: outer_nx_sst = -1
149 integer :: outer_ny_sst = -1
151 namelist / nml_grads_grid / &
161 character(len=H_SHORT) :: item
163 character(len=H_SHORT) :: dtype
164 character(len=H_LONG) :: fname
168 real(RP) :: lvars(lvars_limit) = large_number_one
172 character(len=H_SHORT) :: fendian=
'big' 173 character(len=H_SHORT) :: yrev=
'off' 185 integer,
intent(out) :: dims(6)
186 character(len=H_LONG),
intent(in) :: basename
189 namelist / param_mkinit_real_grads / &
198 if(
io_l )
write(
io_fid_log,*)
'+++ Real Case/Atom Input File Type: GrADS format' 202 read(
io_fid_conf,nml=param_mkinit_real_grads,iostat=ierr)
205 if(
io_l )
write(
io_fid_log,*)
'xxx Not appropriate names in namelist PARAM_MKINIT_REAL_GrADS. Check!' 211 if ( len_trim(basename) == 0 )
then 213 'xxx "BASENAME_ORG" is not specified in "PARAM_MKINIT_REAL_ATMOS"!',trim(basename)
219 open( io_fid_grads_nml, &
220 file = trim(basename), &
221 form =
'formatted', &
225 if ( ierr /= 0 )
then 226 if(
io_l )
write(
io_fid_log,*)
'xxx Input file is not found! ', trim(basename)
230 read(io_fid_grads_nml,nml=nml_grads_grid,iostat=ierr)
232 if(
io_l )
write(
io_fid_log,*)
'xxx Not appropriate names in nml_grads_grid in ', trim(basename),
'. Check!' 246 allocate( gdata2d( dims(2), dims(3) ) )
247 allocate( gdata3d( dims(2), dims(3), dims(1) ) )
253 grads_swpoint(:,1), &
256 grads_lvars(:,:,1), &
257 grads_startrec(:,1), &
258 grads_totalrec(:,1), &
261 grads_fendian(:,1), &
262 grads_missval(:,1), &
263 data_available(:,1), &
265 num_item_list_atom, &
269 do ielem = 1, num_item_list_atom
270 item = item_list_atom(ielem)
272 select case(trim(item))
274 if (.not. data_available(ia_qv,1))
then 275 if (.not.data_available(ia_rh,1))
then 276 if(
io_l )
write(
io_fid_log,*)
'xxx Not found in grads namelist! : QV and RH' 283 if (.not. data_available(ia_qv,1))
then 284 if(data_available(ia_rh,1))
then 285 if ((.not. data_available(ia_t,1)).or.(.not. data_available(ia_p,1)))
then 286 if(
io_l )
write(
io_fid_log,*)
'xxx Temperature and pressure are required to convert from RH to QV ! ' 292 if(
io_l )
write(
io_fid_log,*)
'xxx Not found in grads namelist! : QV and RH' 296 case(
'MSLP',
'PSFC',
'U10',
'V10',
'T2')
297 if (.not. data_available(ielem,1))
then 298 if (
io_l)
write(
io_fid_log,*)
'warning: ',trim(item),
' is not found & will be estimated.' 302 if ( .not. data_available(ia_q2,1) )
then 303 if (
io_l)
write(
io_fid_log,*)
'warning: Q2 is not found & will be estimated.' 307 if ( data_available(ia_q2,1) )
then 310 if ( data_available(ia_rh2,1) )
then 311 if ((.not. data_available(ia_t2,1)).or.(.not. data_available(ia_ps,1)))
then 312 if (
io_l)
write(
io_fid_log,*)
'warning: T2 and PSFC are required to convert from RH2 to Q2 !' 313 if (
io_l)
write(
io_fid_log,*)
' Q2 will be copied from data at above level.' 314 data_available(ia_rh2,1) = .false.
318 if (
io_l)
write(
io_fid_log,*)
'warning: Q2 and RH2 are not found, Q2 will be estimated.' 323 if ( .not. data_available(ielem,1) )
then 324 if (
io_l)
write(
io_fid_log,*)
'warning: ',trim(item),
' is not found & not used.' 328 if ( .not. data_available(ielem,1) )
then 329 if(
io_l )
write(
io_fid_log,*)
'xxx Not found in grads namelist! : ',trim(item_list_atom(ielem))
343 if(
io_l )
write(
io_fid_log,*)
'+++ ScaleLib/IO[realinput]/Categ[AtomOpenGrADS]' 372 psat => atmos_saturation_psat_liq
376 real(RP),
intent(out) :: velz_org(:,:,:)
377 real(RP),
intent(out) :: velx_org(:,:,:)
378 real(RP),
intent(out) :: vely_org(:,:,:)
379 real(RP),
intent(out) :: pres_org(:,:,:)
380 real(RP),
intent(out) :: temp_org(:,:,:)
381 real(RP),
intent(out) :: qtrc_org(:,:,:,:)
382 real(RP),
intent(out) :: lon_org(:,:)
383 real(RP),
intent(out) :: lat_org(:,:)
384 real(RP),
intent(out) :: cz_org(:,:,:)
385 character(len=*),
intent(in) :: basename_num
386 integer,
intent(in) :: dims(6)
387 integer,
intent(in) :: nt
389 real(RP) :: rhprs_org(dims(1)+2,dims(2),dims(3))
390 real(RP) :: pott(dims(2),dims(3))
396 character(len=H_LONG) :: gfile
398 integer :: QA_outer = 1
399 real(RP) :: p_sat, qm, rhsfc
401 integer :: i, j, k, ielem
405 if(
io_l )
write(
io_fid_log,*)
'+++ ScaleLib/IO[realinput]/Categ[AtomInputGrADS]' 410 loop_inputatomgrads :
do ielem = 1, num_item_list_atom
412 if ( .not. data_available(ielem,1) ) cycle
414 item = grads_item(ielem,1)
415 dtype = grads_dtype(ielem,1)
416 fname = grads_fname(ielem,1)
417 lnum = grads_lnum(ielem,1)
419 if ( dims(1) < grads_knum(ielem,1) )
then 420 write(*,*)
'xxx "knum" must be less than or equal to outer_nz. knum:',knum,
'> outer_nz:',dims(1),trim(item)
422 else if ( grads_knum(ielem,1) > 0 )
then 423 knum = grads_knum(ielem,1)
428 select case (trim(dtype))
430 swpoint = grads_swpoint(ielem,1)
431 dd = grads_dd(ielem,1)
432 if( (abs(swpoint-large_number_one)<eps).or.(abs(dd-large_number_one)<eps) )
then 433 write(*,*)
'xxx "swpoint" is required in grads namelist! ',swpoint
434 write(*,*)
'xxx "dd" is required in grads namelist! ',dd
439 write(*,*)
'xxx "lnum" is required in grads namelist for levels data! ' 443 lvars(k)=grads_lvars(k,ielem,1)
445 if(abs(lvars(1)-large_number_one)<eps)
then 446 write(*,*)
'xxx "lvars" must be specified in grads namelist for levels data! ' 450 startrec = grads_startrec(ielem,1)
451 totalrec = grads_totalrec(ielem,1)
452 fendian = grads_fendian(ielem,1)
453 yrev = grads_yrev(ielem,1)
454 if( (startrec<0).or.(totalrec<0) )
then 455 write(*,*)
'xxx "startrec" is required in grads namelist! ',startrec
456 write(*,*)
'xxx "totalrec" is required in grads namelist! ',totalrec
460 if(io_fid_grads_data < 0)
then 463 gfile=trim(fname)//trim(basename_num)//
'.grd' 464 if( len_trim(fname)==0 )
then 465 write(*,*)
'xxx "fname" is required in grads namelist for map data! ',trim(fname)
471 select case (trim(item))
473 if ( trim(dtype) ==
"linear" )
then 476 lon_org(i,j) =
real(swpoint+real(i-1)*dd, kind=RP) * D2R
479 else if ( trim(dtype) ==
"map" )
then 480 call read_grads_file_2d(io_fid_grads_data,gfile,dims(2),dims(3),1,1,item,startrec,totalrec,yrev,gdata2d)
481 lon_org(:,:) =
real(gdata2D(:,:), kind=RP) * D2R
484 if ( trim(dtype) ==
"linear" )
then 487 lat_org(i,j) =
real(swpoint+real(j-1)*dd, kind=RP) * D2R
490 else if ( trim(dtype) ==
"map" )
then 491 call read_grads_file_2d(io_fid_grads_data,gfile,dims(2),dims(3),1,1,item,startrec,totalrec,yrev,gdata2d)
492 lat_org(:,:) =
real(gdata2D(:,:), kind=RP) * D2R
495 if(dims(1)/=knum)
then 496 write(*,*)
'xxx "knum" must be equal to outer_nz for plev. knum:',knum,
'> outer_nz:',dims(1)
499 if ( trim(dtype) ==
"levels" )
then 500 if(dims(1)/=lnum)
then 501 write(*,*)
'xxx lnum must be same as the outer_nz for plev! ',dims(1),lnum
507 pres_org(k+2,i,j) =
real(lvars(k), kind=
rp)
511 else if ( trim(dtype) ==
"map" )
then 512 call read_grads_file_3d(io_fid_grads_data,gfile,dims(2),dims(3),dims(1),nt,item,startrec,totalrec,yrev,gdata3d)
516 pres_org(k+2,i,j) =
real(gdata3D(i,j,k), kind=
rp)
522 if ( trim(dtype) ==
"map" )
then 523 call read_grads_file_3d(io_fid_grads_data,gfile,dims(2),dims(3),knum,nt,item,startrec,totalrec,yrev,gdata3d)
526 velx_org(1:2,i,j) = 0.0_rp
528 velx_org(k+2,i,j) =
real(gdata3D(i,j,k), kind=
rp)
531 do k = knum+1, dims(1)
532 velx_org(k+2,i,j) = velx_org(knum+2,i,j)
539 if ( trim(dtype) ==
"map" )
then 540 call read_grads_file_3d(io_fid_grads_data,gfile,dims(2),dims(3),knum,nt,item,startrec,totalrec,yrev,gdata3d)
543 vely_org(1:2,i,j) = 0.0_rp
545 vely_org(k+2,i,j) =
real(gdata3D(i,j,k), kind=
rp)
548 do k = knum+1, dims(1)
549 vely_org(k+2,i,j) = vely_org(knum+2,i,j)
556 if ( trim(dtype) ==
"map" )
then 557 call read_grads_file_3d(io_fid_grads_data,gfile,dims(2),dims(3),knum,nt,item,startrec,totalrec,yrev,gdata3d)
561 temp_org(k+2,i,j) =
real(gdata3D(i,j,k), kind=
rp)
564 do k = knum+1, dims(1)
565 temp_org(k+2,i,j) = temp_org(knum+2,i,j)
572 if(dims(1)/=knum)
then 573 write(*,*)
'xxx The number of levels for HGT must be same as plevs! knum:',knum,
'> outer_nz:',dims(1)
576 if ( trim(dtype) ==
"map" )
then 577 call read_grads_file_3d(io_fid_grads_data,gfile,dims(2),dims(3),dims(1),nt,item,startrec,totalrec,yrev,gdata3d)
581 cz_org(k+2,i,j) =
real(gdata3D(i,j,k), kind=
rp)
583 cz_org(1,i,j) = 0.0_rp
588 if ( trim(dtype) ==
"map" )
then 589 call read_grads_file_3d(io_fid_grads_data,gfile,dims(2),dims(3),knum,nt,item,startrec,totalrec,yrev,gdata3d)
593 qtrc_org(k+2,i,j,qa_outer) =
real(gdata3D(i,j,k), kind=
rp)
595 qtrc_org(1:2,i,j,qa_outer) = qtrc_org(3,i,j,qa_outer)
598 if( dims(1)>knum )
then 599 select case ( upper_qv_type )
603 do k = knum+1, dims(1)
604 qtrc_org(k+2,i,j,qa_outer) = qtrc_org(knum+2,i,j,qa_outer)
611 write(*,*)
'xxx upper_qv_type in PARAM_MKINIT_REAL_GrADS is invalid! ', upper_qv_type
617 if (data_available(ia_qv,1)) cycle
618 if ( trim(dtype) ==
"map" )
then 619 call read_grads_file_3d(io_fid_grads_data,gfile,dims(2),dims(3),knum,nt,item,startrec,totalrec,yrev,gdata3d)
623 rhprs_org(k+2,i,j) =
real(gdata3D(i,j,k), kind=RP) / 100.0_RP
624 call psat( p_sat, temp_org(k+2,i,j) )
625 qm = epsvap * rhprs_org(k+2,i,j) * p_sat &
626 / ( pres_org(k+2,i,j) - rhprs_org(k+2,i,j) * p_sat )
627 qtrc_org(k+2,i,j,qa_outer) = qm / ( 1.0_rp + qm )
629 qtrc_org(1:2,i,j,qa_outer) = qtrc_org(3,i,j,qa_outer)
632 if( dims(3)>knum )
then 633 select case ( upper_qv_type )
637 do k = knum+1, dims(1)
638 rhprs_org(k+2,i,j) = rhprs_org(knum+2,i,j)
639 call psat( p_sat, temp_org(k+2,i,j) )
640 qm = epsvap * rhprs_org(k+2,i,j) * p_sat &
641 / ( pres_org(k+2,i,j) - rhprs_org(k+2,i,j) * p_sat )
642 qtrc_org(k+2,i,j,qa_outer) = qm / ( 1.0_rp + qm )
643 qtrc_org(k+2,i,j,qa_outer) = min(qtrc_org(k+2,i,j,qa_outer),qtrc_org(k+1,i,j,qa_outer))
650 write(*,*)
'xxx upper_qv_type in PARAM_MKINIT_REAL_GrADS is invalid! ', upper_qv_type
656 if ( trim(dtype) ==
"map" )
then 657 call read_grads_file_2d(io_fid_grads_data,gfile,dims(2),dims(3),1,nt,item,startrec,totalrec,yrev,gdata2d)
660 pres_org(1,i,j) =
real(gdata2D(i,j), kind=
rp)
665 if ( trim(dtype) ==
"map" )
then 666 call read_grads_file_2d(io_fid_grads_data,gfile,dims(2),dims(3),1,nt,item,startrec,totalrec,yrev,gdata2d)
669 pres_org(2,i,j) =
real(gdata2D(i,j), kind=
rp)
674 if ( trim(dtype) ==
"map" )
then 675 call read_grads_file_2d(io_fid_grads_data,gfile,dims(2),dims(3),1,nt,item,startrec,totalrec,yrev,gdata2d)
678 velx_org(2,i,j) =
real(gdata2D(i,j), kind=
rp)
683 if ( trim(dtype) ==
"map" )
then 684 call read_grads_file_2d(io_fid_grads_data,gfile,dims(2),dims(3),1,nt,item,startrec,totalrec,yrev,gdata2d)
687 vely_org(2,i,j) =
real(gdata2D(i,j), kind=
rp)
692 if ( trim(dtype) ==
"map" )
then 693 call read_grads_file_2d(io_fid_grads_data,gfile,dims(2),dims(3),1,nt,item,startrec,totalrec,yrev,gdata2d)
696 temp_org(2,i,j) =
real(gdata2D(i,j), kind=
rp)
701 if ( trim(dtype) ==
"map" )
then 702 call read_grads_file_2d(io_fid_grads_data,gfile,dims(2),dims(3),1,nt,item,startrec,totalrec,yrev,gdata2d)
705 qtrc_org(2,i,j,qa_outer) =
real(gdata2D(i,j), kind=
rp)
710 if (data_available(ia_q2,1)) cycle
711 if ( trim(dtype) ==
"map" )
then 712 call read_grads_file_2d(io_fid_grads_data,gfile,dims(2),dims(3),1,nt,item,startrec,totalrec,yrev,gdata2d)
715 rhsfc =
real(gdata2D(i,j), kind=RP) / 100.0_RP
716 call psat( p_sat, temp_org(2,i,j) )
717 qm = epsvap * rhsfc * p_sat &
718 / ( pres_org(2,i,j) - rhsfc * p_sat )
719 qtrc_org(2,i,j,qa_outer) = qm / ( 1.0_rp + qm )
724 if ( trim(dtype) ==
"map" )
then 725 call read_grads_file_2d(io_fid_grads_data,gfile,dims(2),dims(3),1,nt,item,startrec,totalrec,yrev,gdata2d)
728 cz_org(2,i,j) =
real(gdata2D(i,j), kind=
rp)
733 enddo loop_inputatomgrads
739 if ( data_available(ia_t2,1) .and. data_available(ia_ps,1) )
then 742 pott(i,j) = temp_org(2,i,j) * (p00/pres_org(2,i,j))**rovcp
748 pott(i,j) = temp_org(3,i,j) * (p00/pres_org(3,i,j))**rovcp
753 if ( .not. data_available(ia_t2,1) )
then 754 if ( data_available(ia_ps,1) )
then 757 temp_org(2,i,j) = pott(i,j) * (pres_org(2,i,j)/p00)**rovcp
761 if ( data_available(ia_topo,1) )
then 764 temp_org(2,i,j) = temp_org(3,i,j) &
765 + laps * (cz_org(3,i,j)-cz_org(2,i,j))
771 temp_org(2,i,j) = temp_org(3,i,j)
778 if ( .not. data_available(ia_ps,1) )
then 781 pres_org(2,i,j) = p00 * (temp_org(2,i,j)/pott(i,j))**cpovr
786 if ( data_available(ia_slp,1) )
then 789 temp_org(1,i,j) = pott(i,j) * (pres_org(1,i,j)/p00)**rovcp
793 if ( data_available(ia_t2,1) .and. data_available(ia_topo,1) )
then 796 temp_org(1,i,j) = temp_org(2,i,j) + laps * cz_org(2,i,j)
802 temp_org(1,i,j) = temp_org(3,i,j) + laps * cz_org(3,i,j)
808 pres_org(1,i,j) = p00 * (temp_org(1,i,j)/pott(i,j))**cpovr
813 if ( .not. data_available(ia_topo,1) )
then 817 cz_org(2,i,j) = max( 0.0_rp, &
819 * (
log(pres_org(2,i,j)/pres_org(1,i,j)) ) &
820 / (
log(pres_org(3,i,j)/pres_org(1,i,j)) ) )
833 if( pres_org(k,i,j)>pres_org(2,i,j) )
then 835 velx_org(k,i,j)=velx_org(2,i,j)
836 vely_org(k,i,j)=vely_org(2,i,j)
837 temp_org(k,i,j)=temp_org(2,i,j)
838 qtrc_org(k,i,j,:)=qtrc_org(2,i,j,:)
839 cz_org(k,i,j)=cz_org(2,i,j)
874 use_file_landwater, &
878 integer,
intent(out) :: ldims(3)
879 logical,
intent(out) :: use_waterratio
880 logical,
intent(in) :: use_file_landwater
881 character(len=*),
intent(in) :: basename
889 if(
io_l )
write(
io_fid_log,*)
'+++ Real Case/Land Input File Type: GrADS format' 892 use_waterratio = .false.
894 if ( len_trim(basename) == 0 )
then 896 'xxx "BASEMAAME" is not specified in "PARAM_MKINIT_REAL_ATOMS"!',trim(basename)
902 open( io_fid_grads_nml, &
903 file = trim(basename), &
904 form =
'formatted', &
908 if ( ierr /= 0 )
then 909 if(
io_l )
write(
io_fid_log,*)
'xxx Input file is not found! ', trim(basename)
913 read(io_fid_grads_nml,nml=nml_grads_grid,iostat=ierr)
915 if(
io_l )
write(
io_fid_log,*)
'xxx Not appropriate names in nml_grads_grid in ', trim(basename),
'. Check!' 922 if(outer_nx_sfc > 0)
then 923 ldims(2) = outer_nx_sfc
926 outer_nx_sfc = outer_nx
928 if(outer_ny_sfc > 0)
then 929 ldims(3) = outer_ny_sfc
932 outer_ny_sfc = outer_ny
935 allocate( gland2d( ldims(2), ldims(3) ) )
936 allocate( gland3d( ldims(2), ldims(3), ldims(1) ) )
942 grads_swpoint(:,2), &
945 grads_lvars(:,:,2), &
946 grads_startrec(:,2), &
947 grads_totalrec(:,2), &
950 grads_fendian(:,2), &
951 grads_missval(:,2), &
952 data_available(:,2), &
954 num_item_list_land, &
958 do ielem = 1, num_item_list_land
959 item = item_list_land(ielem)
961 select case(trim(item))
962 case(
'TOPO',
'lsmask')
963 if ( .not. data_available(ielem,2) )
then 964 if (
io_l)
write(
io_fid_log,*)
'warning: ',trim(item),
' is not found & not used.' 967 case(
'lon',
'lat',
'lon_sfc',
'lat_sfc')
969 case(
'SMOISVC',
'SMOISDS')
970 if ( use_file_landwater )
then 971 if (.not. data_available(il_smoisvc,2) .and. .not. data_available(il_smoisds,2))
then 972 if(
io_l )
write(
io_fid_log,*)
'xxx Not found in grads namelist! : ',trim(item_list_land(ielem))
975 use_waterratio = data_available(il_smoisds,2)
980 if ( .not. data_available(ielem,2) )
then 981 if(
io_l )
write(
io_fid_log,*)
'xxx Not found in grads namelist! : ',trim(item_list_land(ielem))
1003 use_file_landwater, &
1012 real(RP),
intent(out) :: tg_org (:,:,:)
1013 real(RP),
intent(out) :: strg_org (:,:,:)
1014 real(RP),
intent(out) :: smds_org (:,:,:)
1015 real(RP),
intent(out) :: lst_org (:,:)
1016 real(RP),
intent(out) :: llon_org (:,:)
1017 real(RP),
intent(out) :: llat_org (:,:)
1018 real(RP),
intent(out) :: lz_org (:)
1019 real(RP),
intent(out) :: topo_org(:,:)
1020 real(RP),
intent(out) :: lmask_org(:,:)
1022 character(len=*),
intent(in) :: basename_num
1023 integer,
intent(in) :: ldims(3)
1024 logical,
intent(in) :: use_file_landwater
1025 integer,
intent(in) :: nt
1029 character(len=H_LONG) :: gfile
1031 real(RP) :: qvsat, qm
1033 integer :: i, j, k, ielem, n
1038 if(
io_l )
write(
io_fid_log,*)
'+++ ScaleLib/IO[realinput]/Categ[LandInputGrADS]' 1041 loop_inputlandgrads :
do ielem = 1, num_item_list_land
1043 item = item_list_land(ielem)
1045 dtype = grads_dtype(ielem,2)
1046 fname = grads_fname(ielem,2)
1047 lnum = grads_lnum(ielem,2)
1048 missval = grads_missval(ielem,2)
1050 if ( grads_knum(ielem,2) > 0 )
then 1051 knum = grads_knum(ielem,2)
1056 select case (trim(dtype))
1058 swpoint = grads_swpoint(ielem,2)
1059 dd = grads_dd(ielem,2)
1060 if( (abs(swpoint-large_number_one)<eps).or.(abs(dd-large_number_one)<eps) )
then 1061 write(*,*)
'xxx "swpoint" is required in grads namelist! ',swpoint
1062 write(*,*)
'xxx "dd" is required in grads namelist! ',dd
1067 write(*,*)
'xxx "lnum" in grads namelist is required for levels data! ' 1071 lvars(k)=grads_lvars(k,ielem,2)
1073 if(abs(lvars(1)-large_number_one)<eps)
then 1074 write(*,*)
'xxx "lvars" must be specified in grads namelist for levels data!',(lvars(k),k=1,lnum)
1078 startrec = grads_startrec(ielem,2)
1079 totalrec = grads_totalrec(ielem,2)
1080 fendian = grads_fendian(ielem,2)
1081 yrev = grads_yrev(ielem,2)
1082 if( (startrec<0).or.(totalrec<0) )
then 1083 write(*,*)
'xxx "startrec" is required in grads namelist! ',startrec
1084 write(*,*)
'xxx "totalrec" is required in grads namelist! ',totalrec
1088 if(io_fid_grads_data < 0)
then 1091 gfile=trim(fname)//trim(basename_num)//
'.grd' 1092 if( len_trim(fname)==0 )
then 1093 write(*,*)
'xxx "fname" is required in grads namelist for map data! ',trim(fname)
1099 select case (trim(item))
1101 if ( data_available(il_lsmask,2) )
then 1102 if ( trim(dtype) ==
"map" )
then 1103 call read_grads_file_2d(io_fid_grads_data,gfile,ldims(2),ldims(3),1,1,item,startrec,totalrec,yrev,gland2d)
1104 lmask_org(:,:) =
real(gland2D(:,:), kind=
rp)
1110 if ( .not. data_available(il_lon_sfc,2) )
then 1111 if ( ldims(2).ne.outer_nx .or. ldims(3).ne.outer_ny )
then 1112 write(*,*)
'xxx namelist of "lon_sfc" is not found in grads namelist!' 1113 write(*,*)
'xxx dimension is different: outer_nx and outer_nx_sfc! ', outer_nx, ldims(2)
1114 write(*,*)
' : outer_ny and outer_ny_sfc! ', outer_ny, ldims(3)
1117 if ( trim(dtype) ==
"linear" )
then 1120 llon_org(i,j) =
real(swpoint+real(i-1)*dd, kind=RP) * D2R
1123 else if ( trim(dtype) ==
"map" )
then 1124 call read_grads_file_2d(io_fid_grads_data,gfile,ldims(2),ldims(3),1,1,item,startrec,totalrec,yrev,gland2d)
1125 llon_org(:,:) =
real(gland2D(:,:), kind=RP) * D2R
1129 if ( .not. data_available(il_lon_sfc,2) ) cycle
1130 if ( trim(dtype) ==
"linear" )
then 1133 llon_org(i,j) =
real(swpoint+real(i-1)*dd, kind=RP) * D2R
1136 else if ( trim(dtype) ==
"map" )
then 1137 call read_grads_file_2d(io_fid_grads_data,gfile,ldims(2),ldims(3),1,1,item,startrec,totalrec,yrev,gland2d)
1138 llon_org(:,:) =
real(gland2D(:,:), kind=RP) * D2R
1141 if ( .not. data_available(il_lat_sfc,2) )
then 1142 if ( ldims(2).ne.outer_nx .or. ldims(3).ne.outer_ny )
then 1143 write(*,*)
'xxx namelist of "lat_sfc" is not found in grads namelist!' 1144 write(*,*)
'xxx dimension is different: outer_nx and outer_nx_sfc! ', outer_nx, ldims(2)
1145 write(*,*)
' : outer_ny and outer_ny_sfc! ', outer_nx, ldims(3)
1148 if ( trim(dtype) ==
"linear" )
then 1151 llat_org(i,j) =
real(swpoint+real(j-1)*dd, kind=RP) * D2R
1154 else if ( trim(dtype) ==
"map" )
then 1155 call read_grads_file_2d(io_fid_grads_data,gfile,ldims(2),ldims(3),1,1,item,startrec,totalrec,yrev,gland2d)
1156 llat_org(:,:) =
real(gland2D(:,:), kind=RP) * D2R
1160 if ( .not. data_available(il_lat_sfc,2) ) cycle
1161 if ( trim(dtype) ==
"linear" )
then 1164 llat_org(i,j) =
real(swpoint+real(j-1)*dd, kind=RP) * D2R
1167 else if ( trim(dtype) ==
"map" )
then 1168 call read_grads_file_2d(io_fid_grads_data,gfile,ldims(2),ldims(3),1,1,item,startrec,totalrec,yrev,gland2d)
1169 llat_org(:,:) =
real(gland2D(:,:), kind=RP) * D2R
1172 if(ldims(1)/=knum)
then 1173 write(*,*)
'xxx "knum" must be equal to outer_nl for llev. knum:',knum,
'> outer_nl:',ldims(1)
1176 if ( trim(dtype) ==
"levels" )
then 1177 if(ldims(1)/=lnum)
then 1178 write(*,*)
'xxx lnum must be same as the outer_nl for llev! ',ldims(1),lnum
1182 lz_org(k) =
real(lvars(k), kind=
rp)
1195 if(ldims(1)/=knum)
then 1196 write(*,*)
'xxx The number of levels for STEMP must be same as llevs! ',ldims(1),knum
1199 if ( trim(dtype) ==
"map" )
then 1200 call read_grads_file_3d(io_fid_grads_data,gfile,ldims(2),ldims(3),ldims(1),nt,item,startrec,totalrec,yrev,gland3d)
1204 if ( abs(gland3d(i,j,k)-missval) < eps )
then 1205 tg_org(k,i,j) = undef
1207 tg_org(k,i,j) =
real(gland3D(i,j,k), kind=
rp)
1214 if ( use_file_landwater )
then 1215 if(ldims(1)/=knum)
then 1216 write(*,*)
'xxx The number of levels for SMOISVC must be same as llevs! ',ldims(1),knum
1219 if ( trim(dtype) ==
"map" )
then 1220 call read_grads_file_3d(io_fid_grads_data,gfile,ldims(2),ldims(3),ldims(1),nt,item,startrec,totalrec,yrev,gland3d)
1224 if ( abs(gland3d(i,j,k)-missval) < eps )
then 1225 strg_org(k,i,j) = undef
1227 strg_org(k,i,j) =
real(gland3D(i,j,k), kind=
rp)
1235 if ( use_file_landwater )
then 1236 if(ldims(1)/=knum)
then 1237 write(*,*)
'xxx The number of levels for SMOISDS must be same as llevs! ',ldims(1),knum
1240 if ( trim(dtype) ==
"map" )
then 1241 call read_grads_file_3d(io_fid_grads_data,gfile,ldims(2),ldims(3),ldims(1),nt,item,startrec,totalrec,yrev,gland3d)
1245 if ( abs(gland3d(i,j,k)-missval) < eps )
then 1246 smds_org(k,i,j) = undef
1248 smds_org(k,i,j) =
real(gland3D(i,j,k), kind=
rp)
1256 if ( trim(dtype) ==
"map" )
then 1257 call read_grads_file_2d(io_fid_grads_data,gfile,ldims(2),ldims(3),1,nt,item,startrec,totalrec,yrev,gland2d)
1260 if ( abs(gland2d(i,j)-missval) < eps )
then 1261 lst_org(i,j) = undef
1263 lst_org(i,j) =
real(gland2D(i,j), kind=
rp)
1269 if ( data_available(il_topo,2) )
then 1270 if ( trim(dtype) ==
"map" )
then 1271 call read_grads_file_2d(io_fid_grads_data,gfile,ldims(2),ldims(3),1,nt,item,startrec,totalrec,yrev,gland2d)
1274 if ( abs(gland2d(i,j)-missval) < eps )
then 1275 topo_org(i,j) = undef
1277 topo_org(i,j) =
real(gland2D(i,j), kind=
rp)
1286 enddo loop_inputlandgrads
1311 integer,
intent(out) :: odims(2)
1312 integer,
intent(out) :: timelen
1313 character(len=*),
intent(in) :: basename
1315 character(len=H_LONG) :: grads_ctl
1322 if(
io_l )
write(
io_fid_log,*)
'+++ Real Case/Ocean Input File Type: GrADS format' 1326 if ( len_trim(basename) == 0 )
then 1327 grads_ctl =
"namelist.grads_boundary" 1329 grads_ctl = basename
1334 open( io_fid_grads_nml, &
1335 file = trim(grads_ctl), &
1336 form =
'formatted', &
1340 if ( ierr /= 0 )
then 1341 if(
io_l )
write(
io_fid_log,*)
'xxx Input file is not found! ', trim(grads_ctl)
1345 read(io_fid_grads_nml,nml=nml_grads_grid,iostat=ierr)
1346 if( ierr /= 0 )
then 1347 if(
io_l )
write(
io_fid_log,*)
'xxx Not appropriate names in nml_grads_grid in ', trim(grads_ctl),
'. Check!' 1355 if(outer_nx_sst > 0)
then 1356 odims(1) = outer_nx_sst
1357 else if (outer_nx_sfc > 0)
then 1358 odims(1) = outer_nx_sfc
1359 outer_nx_sst = outer_nx_sfc
1362 outer_nx_sst = outer_nx
1364 if(outer_ny_sst > 0)
then 1365 odims(2) = outer_ny_sst
1366 else if(outer_ny_sfc > 0)
then 1367 odims(2) = outer_ny_sfc
1368 outer_ny_sst = outer_ny_sfc
1371 outer_ny_sst = outer_ny
1374 allocate( gsst2d( odims(1), odims(2) ) )
1381 grads_swpoint(:,3), &
1384 grads_lvars(:,:,3), &
1385 grads_startrec(:,3), &
1386 grads_totalrec(:,3), &
1389 grads_fendian(:,3), &
1390 grads_missval(:,3), &
1391 data_available(:,3), &
1393 num_item_list_ocean, &
1397 do ielem = 1, num_item_list_ocean
1398 item = item_list_ocean(ielem)
1400 select case(trim(item))
1402 if ( .not. data_available(ielem,3) )
then 1403 if (
io_l)
write(
io_fid_log,*)
'warning: ',trim(item),
' is not found & not used.' 1406 case(
'lon',
'lat',
'lon_sfc',
'lat_sfc',
'lon_sst',
'lat_sst')
1409 if (.not. data_available(io_sst,3) .and. .not. data_available(io_skint,3) )
then 1410 if (
io_l)
write(
io_fid_log,*)
'xxx SST and SKINT are found in grads namelist!' 1413 if (.not. data_available(io_sst,3))
then 1414 if (
io_l)
write(
io_fid_log,*)
'warning: SST is found in grads namelist. SKINT is used in place of SST.' 1420 if ( .not. data_available(ielem,3) )
then 1421 if(
io_l )
write(
io_fid_log,*)
'xxx Not found in grads namelist! : ',trim(item_list_ocean(ielem))
1435 if(
io_l )
write(
io_fid_log,*)
'+++ ScaleLib/IO[realinput]/Categ[OceanOpenGrADS]' 1457 real(RP),
intent(out) :: tw_org (:,:)
1458 real(RP),
intent(out) :: sst_org (:,:)
1459 real(RP),
intent(out) :: omask_org(:,:)
1460 real(RP),
intent(out) :: olon_org (:,:)
1461 real(RP),
intent(out) :: olat_org (:,:)
1463 character(len=*),
intent(in) :: basename_num
1464 integer,
intent(in) :: odims(2)
1465 integer,
intent(in) :: nt
1469 character(len=H_LONG) :: gfile
1471 real(RP) :: qvsat, qm
1473 integer :: i, j, ielem, n
1478 if(
io_l )
write(
io_fid_log,*)
'+++ ScaleLib/IO[realinput]/Categ[OceanInputGrADS]' 1481 loop_inputoceangrads :
do ielem = 1, num_item_list_ocean
1483 item = item_list_ocean(ielem)
1485 dtype = grads_dtype(ielem,3)
1486 fname = grads_fname(ielem,3)
1487 lnum = grads_lnum(ielem,3)
1488 missval = grads_missval(ielem,3)
1490 select case (trim(dtype))
1492 swpoint = grads_swpoint(ielem,3)
1493 dd = grads_dd(ielem,3)
1494 if( (abs(swpoint-large_number_one)<eps).or.(abs(dd-large_number_one)<eps) )
then 1495 write(*,*)
'xxx "swpoint" is required in grads namelist! ',swpoint
1496 write(*,*)
'xxx "dd" is required in grads namelist! ',dd
1500 write(*,*)
'xxx "lnum" in grads namelist is invalid for ocean data' 1503 startrec = grads_startrec(ielem,3)
1504 totalrec = grads_totalrec(ielem,3)
1505 fendian = grads_fendian(ielem,3)
1506 yrev = grads_yrev(ielem,3)
1507 if( (startrec<0).or.(totalrec<0) )
then 1508 write(*,*)
'xxx "startrec" is required in grads namelist! ',startrec
1509 write(*,*)
'xxx "totalrec" is required in grads namelist! ',totalrec
1513 if(io_fid_grads_data < 0)
then 1516 gfile=trim(fname)//trim(basename_num)//
'.grd' 1517 if( len_trim(fname)==0 )
then 1518 write(*,*)
'xxx "fname" is required in grads namelist for map data! ',trim(fname)
1524 select case (trim(item))
1526 if ( data_available(io_lsmask,3) )
then 1527 if ( trim(dtype) ==
"map" )
then 1528 call read_grads_file_2d(io_fid_grads_data,gfile,odims(1),odims(2),1,1,item,startrec,totalrec,yrev,gsst2d)
1529 omask_org(:,:) =
real(gsst2D(:,:), kind=
rp)
1535 if ( .not. data_available(io_lon_sst,3) .and. .not. data_available(io_lon_sfc,3) )
then 1536 if ( odims(1).ne.outer_nx .or. odims(2).ne.outer_ny )
then 1537 write(*,*)
'xxx namelist of "lon_sst" is not found in grads namelist!' 1538 write(*,*)
'xxx dimension is different: outer_nx and outer_nx_sst! ', outer_nx, odims(1)
1539 write(*,*)
' : outer_ny and outer_ny_sst! ', outer_ny, odims(2)
1542 if ( trim(dtype) ==
"linear" )
then 1545 olon_org(i,j) =
real(swpoint+real(i-1)*dd, kind=RP) * D2R
1548 else if ( trim(dtype) ==
"map" )
then 1549 call read_grads_file_2d(io_fid_grads_data,gfile,odims(1),odims(2),1,1,item,startrec,totalrec,yrev,gsst2d)
1550 olon_org(:,:) =
real(gsst2D(:,:), kind=RP) * D2R
1554 if ( .not. data_available(io_lon_sst,3) .and. data_available(io_lon_sfc,3) )
then 1555 if ( odims(1).ne.outer_nx_sfc .or. odims(2).ne.outer_ny_sfc )
then 1556 write(*,*)
'xxx namelist of "lon_sst" is not found in grads namelist!' 1557 write(*,*)
'xxx dimension is different: outer_nx_sfc and outer_nx_sst! ', outer_nx_sfc, odims(1)
1558 write(*,*)
' : outer_ny_sfc and outer_ny_sst! ', outer_ny_sfc, odims(2)
1561 if ( trim(dtype) ==
"linear" )
then 1564 olon_org(i,j) =
real(swpoint+real(i-1)*dd, kind=RP) * D2R
1567 else if ( trim(dtype) ==
"map" )
then 1568 call read_grads_file_2d(io_fid_grads_data,gfile,odims(1),odims(2),1,1,item,startrec,totalrec,yrev,gsst2d)
1569 olon_org(:,:) =
real(gsst2D(:,:), kind=RP) * D2R
1573 if ( .not. data_available(io_lon_sst,3) ) cycle
1574 if ( trim(dtype) ==
"linear" )
then 1577 olon_org(i,j) =
real(swpoint+real(i-1)*dd, kind=RP) * D2R
1580 else if ( trim(dtype) ==
"map" )
then 1581 call read_grads_file_2d(io_fid_grads_data,gfile,odims(1),odims(2),1,1,item,startrec,totalrec,yrev,gsst2d)
1582 olon_org(:,:) =
real(gsst2D(:,:), kind=RP) * D2R
1585 if ( .not. data_available(io_lat_sfc,3) .and. .not. data_available(io_lat_sst,3) )
then 1586 if ( odims(1).ne.outer_nx .or. odims(2).ne.outer_ny )
then 1587 write(*,*)
'xxx namelist of "lat_sst" is not found in grads namelist!' 1588 write(*,*)
'xxx dimension is different: outer_nx and outer_nx_sst! ', outer_nx, odims(1)
1589 write(*,*)
' : outer_ny and outer_ny_sst! ', outer_ny, odims(2)
1592 if ( trim(dtype) ==
"linear" )
then 1595 olat_org(i,j) =
real(swpoint+real(j-1)*dd, kind=RP) * D2R
1598 else if ( trim(dtype) ==
"map" )
then 1599 call read_grads_file_2d(io_fid_grads_data,gfile,odims(1),odims(2),1,1,item,startrec,totalrec,yrev,gsst2d)
1600 olat_org(:,:) =
real(gsst2D(:,:), kind=RP) * D2R
1604 if ( .not. data_available(io_lat_sst,3) .and. data_available(io_lat_sfc,3) )
then 1605 if ( odims(1).ne.outer_nx .or. odims(1).ne.outer_ny )
then 1606 write(*,*)
'xxx namelist of "lat_sst" is not found in grads namelist!' 1607 write(*,*)
'xxx dimension is different: outer_nx_sfc and outer_nx_sst! ', outer_nx_sfc, odims(1)
1608 write(*,*)
' : outer_ny_sfc and outer_ny_sst! ', outer_ny_sfc, odims(2)
1611 if ( trim(dtype) ==
"linear" )
then 1614 olat_org(i,j) =
real(swpoint+real(j-1)*dd, kind=RP) * D2R
1617 else if ( trim(dtype) ==
"map" )
then 1618 call read_grads_file_2d(io_fid_grads_data,gfile,odims(1),odims(2),1,1,item,startrec,totalrec,yrev,gsst2d)
1619 olat_org(:,:) =
real(gsst2D(:,:), kind=RP) * D2R
1623 if ( .not. data_available(io_lat_sst,3) ) cycle
1624 if ( trim(dtype) ==
"linear" )
then 1627 olat_org(i,j) =
real(swpoint+real(j-1)*dd, kind=RP) * D2R
1630 else if ( trim(dtype) ==
"map" )
then 1631 call read_grads_file_2d(io_fid_grads_data,gfile,odims(1),odims(2),1,1,item,startrec,totalrec,yrev,gsst2d)
1632 olat_org(:,:) =
real(gsst2D(:,:), kind=RP) * D2R
1635 if ( .not. data_available(io_sst,3) )
then 1636 if ( odims(1).ne.outer_nx_sfc .or. odims(2).ne.outer_ny_sfc )
then 1637 write(*,*)
'xxx dimsntion is different: outer_nx_sst/outer_nx_sfc and outer_nx_sst! ', odims(1), outer_nx_sfc
1638 write(*,*)
' : outer_ny_sst/outer_ny_sfc and outer_ny_sst! ', odims(2), outer_ny_sfc
1641 if ( trim(dtype) ==
"map" )
then 1642 call read_grads_file_2d(io_fid_grads_data,gfile,odims(1),odims(2),1,nt,item,startrec,totalrec,yrev,gsst2d)
1645 if ( abs(gsst2d(i,j)-missval) < eps )
then 1646 sst_org(i,j) = undef
1648 sst_org(i,j) =
real(gsst2D(i,j), kind=
rp)
1655 if ( .not. data_available(io_sst,3) ) cycle
1656 if ( trim(dtype) ==
"map" )
then 1657 call read_grads_file_2d(io_fid_grads_data,gfile,odims(1),odims(2),1,nt,item,startrec,totalrec,yrev,gsst2d)
1660 if ( abs(gsst2d(i,j)-missval) < eps )
then 1661 sst_org(i,j) = undef
1663 sst_org(i,j) =
real(gsst2D(i,j), kind=
rp)
1669 enddo loop_inputoceangrads
1709 character(len=H_SHORT),
intent(out) :: grads_item (:)
1710 character(len=H_LONG),
intent(out) :: grads_fname (:)
1711 character(len=H_LONG),
intent(out) :: grads_dtype (:)
1712 real(RP),
intent(out) :: grads_swpoint (:)
1713 real(RP),
intent(out) :: grads_dd (:)
1714 integer,
intent(out) :: grads_lnum (:)
1715 real(RP),
intent(out) :: grads_lvars (:,:)
1716 integer,
intent(out) :: grads_startrec(:)
1717 integer,
intent(out) :: grads_totalrec(:)
1718 integer,
intent(out) :: grads_knum (:)
1719 character(len=H_SHORT),
intent(out) :: grads_yrev (:)
1720 character(len=H_SHORT),
intent(out) :: grads_fendian (:)
1721 real(SP),
intent(out) :: grads_missval (:)
1722 logical,
intent(out) :: data_available(:)
1723 character(len=H_SHORT),
intent(in) :: item_list (:)
1724 integer,
intent(in) :: num_item_list
1725 character(len=*),
intent(in) :: basename
1726 integer,
intent(in) :: io_fid_grads_nml
1728 integer :: grads_vars_nmax
1729 integer :: k, n, ielem, ierr
1747 if ( io_fid_grads_nml > 0 )
then 1748 rewind( io_fid_grads_nml )
1750 do n = 1, grads_vars_limit
1751 read(io_fid_grads_nml, nml=grdvar, iostat=ierr)
1753 if(
io_l )
write(
io_fid_log,*)
'xxx Not appropriate names in grdvar in ', trim(basename),
'. Check!' 1755 else if( ierr < 0 )
then 1758 grads_vars_nmax = grads_vars_nmax + 1
1761 if(
io_l )
write(
io_fid_log,*)
'xxx namelist file is not open! ', trim(basename)
1765 if ( grads_vars_nmax > grads_vars_limit )
then 1767 'xxx The number of grads vars exceeds grads_vars_limit! ',grads_vars_nmax,
' >', grads_vars_limit
1773 data_available(:) = .false.
1774 do ielem = 1, num_item_list
1775 if ( io_fid_grads_nml > 0 ) rewind( io_fid_grads_nml )
1776 do n = 1, grads_vars_nmax
1782 swpoint = large_number_one
1783 dd = large_number_one
1785 lvars = large_number_one
1791 missval = large_number_one
1794 if ( io_fid_grads_nml > 0 )
then 1795 read(io_fid_grads_nml, nml=grdvar, iostat=ierr)
1796 if( ierr /= 0 )
exit 1799 if(item == item_list(ielem))
then 1800 grads_item(ielem) = item
1801 grads_fname(ielem) = fname
1802 grads_dtype(ielem) = dtype
1803 grads_swpoint(ielem) = swpoint
1804 grads_dd(ielem) = dd
1805 grads_lnum(ielem) = lnum
1806 do k = 1, lvars_limit
1807 grads_lvars(k,ielem) = lvars(k)
1809 grads_startrec(ielem) = startrec
1810 grads_totalrec(ielem) = totalrec
1811 grads_knum(ielem) = knum
1812 grads_yrev(ielem) = yrev
1813 grads_fendian(ielem) = fendian
1814 grads_missval(ielem) = missval
1815 data_available(ielem) = .true.
1820 if(
io_l )
write(
io_fid_log,*)
'GrADS data availability ',trim(item_list(ielem)),data_available(ielem)
1826 subroutine open_grads_file(io_fid,filename,irecl)
1828 integer,
intent(in) :: io_fid
1829 character(*),
intent(in) :: filename
1830 integer,
intent(in) :: irecl
1834 file = trim(filename), &
1835 form =
'unformatted', &
1836 access =
'direct', &
1840 if ( ierr /= 0 )
then 1841 write(*,*)
'xxx grads file does not found! ', trim(filename)
1845 end subroutine open_grads_file
1848 subroutine read_grads_file_2d( &
1858 integer,
intent(in) :: io_fid
1859 character(*),
intent(in) :: gfile
1860 integer,
intent(in) :: nx,ny,nz,it
1861 character(*),
intent(in) :: item
1862 integer,
intent(in) :: startrec
1863 integer,
intent(in) :: totalrec
1864 character(*),
intent(in) :: yrev
1865 real(SP),
intent(out) :: gdata(nx,ny)
1867 real(SP) :: work(nx,ny)
1870 integer :: irec, irecl
1874 call open_grads_file(io_fid, gfile, irecl)
1875 irec = totalrec * (it-1) + startrec
1876 read(io_fid, rec=irec, iostat=ierr) gdata(:,:)
1877 if ( ierr /= 0 )
then 1878 write(*,*)
'xxx grads data is not found! ',trim(item),it
1879 write(*,*)
'xxx namelist or grads data might be wrong.' 1883 if( trim(yrev) ==
"on" )
then 1884 work(:,:)=gdata(:,:)
1887 gdata(i,j)=work(i,ny-j+1)
1892 call close_grads_file(io_fid,gfile)
1895 end subroutine read_grads_file_2d
1898 subroutine read_grads_file_3d( &
1908 integer,
intent(in) :: io_fid
1909 character(*),
intent(in) :: gfile
1910 integer,
intent(in) :: nx,ny,nz,it
1911 character(*),
intent(in) :: item
1912 integer,
intent(in) :: startrec
1913 integer,
intent(in) :: totalrec
1914 character(*),
intent(in) :: yrev
1915 real(SP),
intent(out) :: gdata(nx,ny,nz)
1917 real(SP) :: work(nx,ny,nz)
1920 integer :: irec,irecl
1924 call open_grads_file(io_fid, gfile, irecl)
1926 irec = totalrec * (it-1) + startrec + (k-1)
1927 read(io_fid, rec=irec, iostat=ierr) gdata(:,:,k)
1928 if ( ierr /= 0 )
then 1929 write(*,*)
'xxx grads data does not found! ',trim(item),
', k=',k,
', it=',it,
' in ', trim(gfile)
1934 if( trim(yrev) ==
"on" )
then 1935 work(:,:,:)=gdata(:,:,:)
1939 gdata(i,j,k)=work(i,ny-j+1,k)
1945 call close_grads_file(io_fid,gfile)
1948 end subroutine read_grads_file_3d
1951 subroutine close_grads_file(io_fid,filename)
1953 integer,
intent(in) :: io_fid
1954 character(*),
intent(in) :: filename
1957 close(io_fid, iostat=ierr)
1958 if ( ierr /= 0 )
then 1959 write(*,*)
'xxx grads file was not closed peacefully! ',trim(filename)
1964 end subroutine close_grads_file
real(rp), public const_cpdry
specific heat (dry air,constant pressure) [J/kg/K]
module ATMOSPHERE / Saturation adjustment
subroutine, public prc_mpistop
Abort MPI.
logical, public io_l
output log or not? (this process)
real(rp), parameter, public const_tem00
temperature reference (0C) [K]
real(rp), public const_d2r
degree to radian
real(rp), public const_laps
lapse rate of ISA [K/m]
real(rp), public const_rdry
specific gas constant (dry air) [J/kg/K]
real(rp), public const_undef
integer function, public io_get_available_fid()
search & get available file ID
real(rp), public const_pre00
pressure reference [Pa]
real(rp), public const_grav
standard acceleration of gravity [m/s2]
real(rp), public const_epsvap
Rdry / Rvap.
subroutine, public log(type, message)
integer, public prc_myrank
process num in local communicator
real(rp), public const_eps
small number
logical, public io_lnml
output log or not? (for namelist, this process)
integer, public io_fid_conf
Config file ID.
integer, public io_fid_log
Log file ID.
integer, parameter, public rp