74 logical fexist, opened
75 integer fsize, ncid, error, id_dim, nx, ny
76 character(len=256) :: outgrid =
"none"
77 character(len=256) :: inputorog =
"none"
78 character(len=256) :: merge_file =
"none"
79 logical :: mask_only = .false.
80 integer :: mtnres,im,jm,nm,nr,nf0,nf1,efac,blat,nw
82 READ(5,*) mtnres,im,jm,nm,nr,nf0,nf1,efac,blat
98 print*,
"INPUTOROG=", trim(inputorog)
99 print*,
"IM,JM=", im, jm
100 print*,
"MASK_ONLY", mask_only
101 print*,
"MERGE_FILE", trim(merge_file)
109 print*, mtnres,im,jm,nm,nr,nf0,nf1,efac,blat
110 nw=(nm+1)*((nr+1)*nm+2)
113 print *,
' Starting terr12 mtnlm7_slm30.f IMN,JMN:',imn,jmn
116 if( trim(outgrid) .NE.
"none" )
then
117 inquire(file=trim(outgrid), exist=fexist)
118 if(.not. fexist)
then
119 print*,
"file "//trim(outgrid)//
" does not exist"
123 inquire( ncid,opened=opened )
124 if( .NOT.opened )
exit
127 print*,
"outgrid=", trim(outgrid)
128 error=nf__open(trim(outgrid),nf_nowrite,fsize,ncid)
129 call
netcdf_err(error,
'Open file '//trim(outgrid) )
130 error=nf_inq_dimid(ncid,
'nx', id_dim)
131 call
netcdf_err(error,
'inquire dimension nx from file '//
133 error=nf_inq_dimlen(ncid,id_dim,nx)
134 call
netcdf_err(error,
'inquire dimension nx length '//
135 &
'from file '//trim(outgrid) )
137 error=nf_inq_dimid(ncid,
'ny', id_dim)
138 call
netcdf_err(error,
'inquire dimension ny from file '//
140 error=nf_inq_dimlen(ncid,id_dim,ny)
141 call
netcdf_err(error,
'inquire dimension ny length '//
142 &
'from file '//trim(outgrid) )
144 if(im .ne. nx/2)
then
145 print*,
"IM=",im,
" /= grid file nx/2=",nx/2
146 print*,
"Set IM = ", nx/2
149 if(jm .ne. ny/2)
then
150 print*,
"JM=",jm,
" /= grid file ny/2=",ny/2
151 print*,
"Set JM = ", ny/2
155 call
netcdf_err(error,
'close file '//trim(outgrid) )
159 CALL
tersub(imn,jmn,im,jm,nm,nr,nf0,nf1,nw,efac,blat,
160 & outgrid,inputorog,mask_only,merge_file)
186 SUBROUTINE tersub(IMN,JMN,IM,JM,NM,NR,NF0,NF1,NW,EFAC,BLAT,
187 & outgrid,inputorog,mask_only,merge_file)
191 integer :: imn,jmn,im,jm,nm,nr,nf0,nf1,nw
192 character(len=*),
intent(in) :: outgrid
193 character(len=*),
intent(in) :: inputorog
194 character(len=*),
intent(in) :: merge_file
196 logical,
intent(in) :: mask_only
198 real,
parameter :: missing_value=-9999.
199 real,
PARAMETER :: pi=3.1415926535897931
200 integer,
PARAMETER :: nmt=14
202 integer :: efac,blat,zsave1,zsave2
203 integer :: mskocn,notocn
204 integer :: i,j,nx,ny,ncid,js,jn,iw,ie,k,it,jt,error,id_dim
205 integer :: id_var,nx_in,ny_in,fsize,wgta,in,inw,ine,is,isw,ise
206 integer :: m,n,imt,iret,ios,iosg,latg2,istat,itest,jtest
207 integer :: i_south_pole,j_south_pole,i_north_pole,j_north_pole
208 integer :: maxc3,maxc4,maxc5,maxc6,maxc7,maxc8
212 integer,
allocatable :: jst(:),jen(:),kpds(:),kgds(:),numi(:)
213 integer,
allocatable :: lonsperlat(:)
215 integer,
allocatable :: ist(:,:),ien(:,:),zslmx(:,:)
216 integer,
allocatable :: zavg(:,:),zslm(:,:)
217 integer(1),
allocatable :: umd(:,:)
218 integer(2),
allocatable :: glob(:,:)
220 integer,
allocatable :: iwork(:,:,:)
222 real :: degrad,maxlat, minlat,
timef,tbeg,tend,tbeg1
223 real :: phi,delxn,rs,rn,slma,oroa,vara,var4a,xn,xs,fff,www
224 real :: sumdif,avedif
226 real,
allocatable :: cosclt(:),wgtclt(:),rclt(:),xlat(:),diffx(:)
227 real,
allocatable :: xlon(:),ors(:),oaa(:),ola(:),glat(:)
229 real,
allocatable :: geolon(:,:),geolon_c(:,:),dx(:,:)
230 real,
allocatable :: geolat(:,:),geolat_c(:,:),dy(:,:)
231 real,
allocatable :: slm(:,:),oro(:,:),var(:,:),orf(:,:)
232 real,
allocatable :: land_frac(:,:),
lake_frac(:,:)
233 real,
allocatable :: theta(:,:),gamma(:,:),sigma(:,:),elvmax(:,:)
234 real,
allocatable :: var4(:,:),slmi(:,:)
235 real,
allocatable :: work1(:,:),work2(:,:),work3(:,:),work4(:,:)
236 real,
allocatable :: work5(:,:),work6(:,:)
237 real,
allocatable :: tmpvar(:,:)
238 real,
allocatable :: slm_in(:,:), lon_in(:,:), lat_in(:,:)
239 real(4),
allocatable:: gice(:,:),oclsm(:,:)
241 real,
allocatable :: oa(:,:,:),ol(:,:,:),hprime(:,:,:)
242 real,
allocatable :: oa_in(:,:,:), ol_in(:,:,:)
245 complex :: ffj(im/2+1)
247 logical :: grid_from_file,output_binary,fexist,opened
248 logical :: spectr, revlat, filter
250 logical :: is_south_pole(im,jm), is_north_pole(im,jm)
253 output_binary = .false.
258 allocate (jst(jm),jen(jm),kpds(200),kgds(200),numi(jm))
259 allocate (lonsperlat(jm/2))
260 allocate (ist(im,jm),ien(im,jm),zslmx(2700,1350))
261 allocate (glob(imn,jmn))
264 allocate (cosclt(jm),wgtclt(jm),rclt(jm),xlat(jm),diffx(jm/2))
265 allocate (xlon(im),ors(nw),oaa(4),ola(4),glat(jmn))
267 allocate (zavg(imn,jmn))
268 allocate (zslm(imn,jmn))
269 allocate (umd(imn,jmn))
285 if (mskocn .eq. 1)
then
286 print *,
' Ocean Model LSM Present and '
287 print *,
' Overrides OCEAN POINTS in LSM: mskocn=',mskocn
288 if (notocn .eq. 1)
then
289 print *,
' Ocean LSM Reversed: NOTOCN=',notocn
293 print *,
' Attempt to open/read UMD 30sec slmsk.'
295 error=nf__open(
"./landcover.umd.30s.nc",nf_nowrite,fsize,ncid)
296 call
netcdf_err(error,
'Open file landcover.umd.30s.nc' )
297 error=nf_inq_varid(ncid,
'land_mask', id_var)
298 call
netcdf_err(error,
'Inquire varid of land_mask')
299 error=nf_get_var_int1(ncid, id_var, umd)
300 call
netcdf_err(error,
'Inquire data of land_mask')
301 error = nf_close(ncid)
303 print *,
' UMD lake, UMD(50,50)=',umd(50,50)
307 print *,
' Call read_g to read global topography'
327 print *,
' After read_g, glob(500,500)=',glob(500,500)
331 print*,
' IM, JM, NM, NR, NF0, NF1, EFAC, BLAT'
332 print*, im,jm,nm,nr,nf0,nf1,efac,blat
333 print *,
' imn,jmn,glob(imn,jmn)=',imn,jmn,glob(imn,jmn)
334 print *,
' UBOUND ZAVG=',ubound(zavg)
335 print *,
' UBOUND glob=',ubound(glob)
336 print *,
' UBOUND ZSLM=',ubound(zslm)
337 print *,
' UBOUND GICE=',imn+1,3601
338 print *,
' UBOUND OCLSM=',im,jm
369 if ( umd(i,j) .eq. 0 ) zslm(i,j) = 0
373 deallocate (zslmx,umd,glob)
388 read(20,*,iostat=ios) latg2,lonsperlat
389 if(ios.ne.0.or.2*latg2.ne.jm)
then
393 print *,ios,latg2,
'COMPUTE TERRAIN ON A FULL GAUSSIAN GRID'
396 numi(j)=lonsperlat(j)
399 numi(j)=lonsperlat(jm+1-j)
401 print *,ios,latg2,
'COMPUTE TERRAIN ON A REDUCED GAUSSIAN GRID',
411 print *,
' SPECTR=',spectr,
' REVLAT=',revlat,
' ** with GICE-07 **'
413 CALL splat(4,jm,cosclt,wgtclt)
415 rclt(j) = acos(cosclt(j))
418 phi = rclt(j) * degrad
420 xlat(jm-j+1) = phi - 90.
423 CALL splat(0,jm,cosclt,wgtclt)
425 rclt(j) = acos(cosclt(j))
426 xlat(j) = 90.0 - rclt(j) * degrad
430 allocate (gice(imn+1,3601))
434 diffx(j) = xlat(j) - xlat(j-1)
435 sumdif = sumdif + diffx(j)
437 avedif=sumdif/(float(jm/2))
441 write (6,106) (xlat(j),j=jm,1,-1)
442 106
format( 10(f7.3,1x))
443 107
format( 10(f9.5,1x))
448 glat(j) = -90. + (j-1) * delxn + delxn * 0.5
451 &
' Before GICE ZAVG(1,2)=',zavg(1,2),zslm(1,2)
453 &
' Before GICE ZAVG(1,12)=',zavg(1,12),zslm(1,12)
455 &
' Before GICE ZAVG(1,52)=',zavg(1,52),zslm(1,52)
457 &
' Before GICE ZAVG(1,112)=',zavg(1,jmn-112),zslm(1,112)
464 error=nf__open(
"./topography.antarctica.ramp.30s.nc",
465 & nf_nowrite,fsize,ncid)
466 call
netcdf_err(error,
'Opening RAMP topo file' )
467 error=nf_inq_varid(ncid,
'topo', id_var)
468 call
netcdf_err(error,
'Inquire varid of RAMP topo')
469 error=nf_get_var_real(ncid, id_var, gice)
471 call
netcdf_err(error,
'Inquire data of RAMP topo')
472 error = nf_close(ncid)
474 if(iosg .ne. 0 )
then
475 print *,
' *** Err on reading GICE record, iosg=',iosg
476 print *,
' exec continues but NO GICE correction done '
478 print *,
' GICE 30" Antarctica RAMP orog 43201x3601 read OK'
479 print *,
' Processing! '
480 print *,
' Processing! '
481 print *,
' Processing! '
486 if( gice(i,j) .ne. -99. .and. gice(i,j) .ne. -1.0 )
then
487 if ( gice(i,j) .gt. 0.)
then
488 zavg(i,j) = int( gice(i,j) + 0.5 )
494 152
format(1x,
' ZAVG(i=',i4,
' j=',i4,
')=',i5,i3,
495 &
' orig:',i5,i4,
' Lat=',f7.3,f8.2,
'E',
' GICE=',f8.1)
502 allocate (oclsm(im,jm),slmi(im,jm))
509 if (mskocn .eq. 1)
then
513 open(25,form=
'formatted',iostat=istat)
516 print *,
' Ocean lsm file Open failure: mskocn,istat=',mskocn,istat
519 print *,
' Ocean lsm file Opened OK: mskocn,istat=',mskocn,istat
525 read(25,*,iostat=ios)oclsm
530 print *,
' Rd fail: Ocean lsm - continue, mskocn,ios=',mskocn,ios
533 print *,
' Rd OK: ocean lsm: mskocn,ios=',mskocn,ios
537 if ( mskocn .eq. 1 )
then
540 if ( notocn .eq. 0 )
then
541 slmi(i,j) = float(nint(oclsm(i,j)))
543 if ( nint(oclsm(i,j)) .eq. 0)
then
551 print *,
' OCLSM',oclsm(1,1),oclsm(50,50),oclsm(75,75),oclsm(im,jm)
552 print *,
' SLMI:',slmi(1,1),slmi(50,50),slmi(75,75),slmi(im,jm)
560 print *,
' Not using Ocean model land sea mask'
563 if (mskocn .eq. 1)
then
564 print *,
' LSM:',oclsm(1,1),oclsm(50,50),oclsm(75,75),oclsm(im,jm)
567 allocate (geolon(im,jm),geolon_c(im+1,jm+1),dx(im,jm))
568 allocate (geolat(im,jm),geolat_c(im+1,jm+1),dy(im,jm))
569 allocate (slm(im,jm),oro(im,jm),var(im,jm),var4(im,jm))
570 allocate (land_frac(im,jm),
lake_frac(im,jm))
573 grid_from_file = .false.
574 is_south_pole = .false.
575 is_north_pole = .false.
580 if( trim(outgrid) .NE.
"none" )
then
581 grid_from_file = .true.
582 inquire(file=trim(outgrid), exist=fexist)
583 if(.not. fexist)
then
584 print*,
"file "//trim(outgrid)//
" does not exist"
588 inquire( ncid,opened=opened )
589 if( .NOT.opened )
exit
592 print*,
"outgrid=", trim(outgrid)
593 error=nf__open(trim(outgrid),nf_nowrite,fsize,ncid)
594 call
netcdf_err(error,
'Open file '//trim(outgrid) )
595 error=nf_inq_dimid(ncid,
'nx', id_dim)
596 call
netcdf_err(error,
'inquire dimension nx from file '//
619 print*,
"Read the grid from file "//trim(outgrid)
621 allocate(tmpvar(nx+1,ny+1))
623 error=nf_inq_varid(ncid,
'x', id_var)
624 call
netcdf_err(error,
'inquire varid of x from file '
626 error=nf_get_var_double(ncid, id_var, tmpvar)
627 call
netcdf_err(error,
'inquire data of x from file '
630 do j = 1,ny+1;
do i = 1,nx+1
631 if(tmpvar(i,j) .NE. missing_value)
then
632 if(tmpvar(i,j) .GT. 360) tmpvar(i,j) = tmpvar(i,j) - 360
633 if(tmpvar(i,j) .LT. 0) tmpvar(i,j) = tmpvar(i,j) + 360
637 geolon(1:im,1:jm) = tmpvar(2:nx:2,2:ny:2)
638 geolon_c(1:im+1,1:jm+1) = tmpvar(1:nx+1:2,1:ny+1:2)
640 error=nf_inq_varid(ncid,
'y', id_var)
641 call
netcdf_err(error,
'inquire varid of y from file '
643 error=nf_get_var_double(ncid, id_var, tmpvar)
644 call
netcdf_err(error,
'inquire data of y from file '
646 geolat(1:im,1:jm) = tmpvar(2:nx:2,2:ny:2)
647 geolat_c(1:im+1,1:jm+1) = tmpvar(1:nx+1:2,1:ny+1:2)
656 do j = 1, ny+1;
do i = 1, nx+1
657 if( tmpvar(i,j) > maxlat )
then
662 if( tmpvar(i,j) < minlat )
then
669 if(maxlat < 89.9 )
then
673 if(minlat > -89.9 )
then
677 print*,
"minlat=", minlat,
"maxlat=", maxlat
678 print*,
"north pole supergrid index is ",
679 & i_north_pole, j_north_pole
680 print*,
"south pole supergrid index is ",
681 & i_south_pole, j_south_pole
684 if(i_south_pole >0 .and. j_south_pole > 0)
then
685 if(mod(i_south_pole,2)==0)
then
686 do j = 1, jm;
do i = 1, im
687 if(i==i_south_pole/2 .and. (j==j_south_pole/2
688 & .or. j==j_south_pole/2+1) )
then
689 is_south_pole(i,j) = .true.
690 print*,
"south pole at i,j=", i, j
694 do j = 1, jm;
do i = 1, im
695 if((i==i_south_pole/2 .or. i==i_south_pole/2+1)
696 & .and. (j==j_south_pole/2 .or.
697 & j==j_south_pole/2+1) )
then
698 is_south_pole(i,j) = .true.
699 print*,
"south pole at i,j=", i, j
704 if(i_north_pole >0 .and. j_north_pole > 0)
then
705 if(mod(i_north_pole,2)==0)
then
706 do j = 1, jm;
do i = 1, im
707 if(i==i_north_pole/2 .and. (j==j_north_pole/2 .or.
708 & j==j_north_pole/2+1) )
then
709 is_north_pole(i,j) = .true.
710 print*,
"north pole at i,j=", i, j
714 do j = 1, jm;
do i = 1, im
715 if((i==i_north_pole/2 .or. i==i_north_pole/2+1)
716 & .and. (j==j_north_pole/2 .or.
717 & j==j_north_pole/2+1) )
then
718 is_north_pole(i,j) = .true.
719 print*,
"north pole at i,j=", i, j
726 allocate(tmpvar(nx,ny))
727 error=nf_inq_varid(ncid,
'area', id_var)
728 call
netcdf_err(error,
'inquire varid of area from file '
730 error=nf_get_var_double(ncid, id_var, tmpvar)
731 call
netcdf_err(error,
'inquire data of area from file '
736 dx(i,j) = sqrt(tmpvar(2*i-1,2*j-1)+tmpvar(2*i,2*j-1)
737 & +tmpvar(2*i-1,2*j )+tmpvar(2*i,2*j ))
763 write(6,*)
' Timer 1 time= ',tend-tbeg
765 if(grid_from_file)
then
768 IF (merge_file ==
'none')
then
770 & im,jm,imn,jmn,geolon_c,geolat_c)
773 print*,
'got here - read in external mask ',merge_file
778 print*,
'got here computing mask only.'
786 CALL
makemt2(zavg,zslm,oro,slm,var,var4,glat,
787 & im,jm,imn,jmn,geolon_c,geolat_c,
lake_frac,land_frac)
790 write(6,*)
' MAKEMT2 time= ',tend-tbeg
792 CALL
makemt(zavg,zslm,oro,slm,var,var4,glat,
793 & ist,ien,jst,jen,im,jm,imn,jmn,xlat,numi)
796 call
minmxj(im,jm,oro,
' ORO')
797 call
minmxj(im,jm,slm,
' SLM')
798 call
minmxj(im,jm,var,
' VAR')
799 call
minmxj(im,jm,var4,
' VAR4')
820 allocate (theta(im,jm),gamma(im,jm),sigma(im,jm),elvmax(im,jm))
821 if(grid_from_file)
then
823 CALL
makepc2(zavg,zslm,theta,gamma,sigma,glat,
824 1 im,jm,imn,jmn,geolon_c,geolat_c,slm)
826 write(6,*)
' MAKEPC2 time= ',tend-tbeg
828 CALL
makepc(zavg,zslm,theta,gamma,sigma,glat,
829 1 ist,ien,jst,jen,im,jm,imn,jmn,xlat,numi)
832 call
minmxj(im,jm,theta,
' THETA')
833 call
minmxj(im,jm,gamma,
' GAMMA')
834 call
minmxj(im,jm,sigma,
' SIGMA')
843 allocate (iwork(im,jm,4))
844 allocate (oa(im,jm,4),ol(im,jm,4),hprime(im,jm,14))
845 allocate (work1(im,jm),work2(im,jm),work3(im,jm),work4(im,jm))
846 allocate (work5(im,jm),work6(im,jm))
848 call
minmxj(im,jm,oro,
' ORO')
849 print*,
"inputorog=", trim(inputorog)
850 if(grid_from_file)
then
851 if(trim(inputorog) ==
"none")
then
852 print*,
"calling MAKEOA2 to compute OA, OL"
854 CALL
makeoa2(zavg,zslm,var,glat,oa,ol,iwork,elvmax,oro,
855 1 work1,work2,work3,work4,work5,work6,
856 2 im,jm,imn,jmn,geolon_c,geolat_c,
857 3 geolon,geolat,dx,dy,is_south_pole,is_north_pole)
859 write(6,*)
' MAKEOA2 time= ',tend-tbeg
862 error=nf__open(trim(inputorog),nf_nowrite,fsize,ncid)
863 call
netcdf_err(error,
'Open file '//trim(inputorog) )
864 error=nf_inq_dimid(ncid,
'lon', id_dim)
865 call
netcdf_err(error,
'inquire dimension lon from file '//
867 error=nf_inq_dimlen(ncid,id_dim,nx_in)
868 call
netcdf_err(error,
'inquire dimension lon length '//
869 &
'from file '//trim(inputorog) )
870 error=nf_inq_dimid(ncid,
'lat', id_dim)
871 call
netcdf_err(error,
'inquire dimension lat from file '//
873 error=nf_inq_dimlen(ncid,id_dim,ny_in)
874 call
netcdf_err(error,
'inquire dimension lat length '//
875 &
'from file '//trim(inputorog) )
877 print*,
"extrapolate OA, OL from Gaussian grid with nx=",
878 & nx_in,
", ny=", ny_in
879 allocate(oa_in(nx_in,ny_in,4), ol_in(nx_in,ny_in,4))
880 allocate(slm_in(nx_in,ny_in) )
881 allocate(lon_in(nx_in,ny_in), lat_in(nx_in,ny_in) )
883 error=nf_inq_varid(ncid,
'oa1', id_var)
884 call
netcdf_err(error,
'inquire varid of oa1 from file '
885 & //trim(inputorog) )
886 error=nf_get_var_double(ncid, id_var, oa_in(:,:,1))
887 call
netcdf_err(error,
'inquire data of oa1 from file '
888 & //trim(inputorog) )
889 error=nf_inq_varid(ncid,
'oa2', id_var)
890 call
netcdf_err(error,
'inquire varid of oa2 from file '
891 & //trim(inputorog) )
892 error=nf_get_var_double(ncid, id_var, oa_in(:,:,2))
893 call
netcdf_err(error,
'inquire data of oa2 from file '
894 & //trim(inputorog) )
895 error=nf_inq_varid(ncid,
'oa3', id_var)
896 call
netcdf_err(error,
'inquire varid of oa3 from file '
897 & //trim(inputorog) )
898 error=nf_get_var_double(ncid, id_var, oa_in(:,:,3))
899 call
netcdf_err(error,
'inquire data of oa3 from file '
900 & //trim(inputorog) )
901 error=nf_inq_varid(ncid,
'oa4', id_var)
902 call
netcdf_err(error,
'inquire varid of oa4 from file '
903 & //trim(inputorog) )
904 error=nf_get_var_double(ncid, id_var, oa_in(:,:,4))
905 call
netcdf_err(error,
'inquire data of oa4 from file '
906 & //trim(inputorog) )
908 error=nf_inq_varid(ncid,
'ol1', id_var)
909 call
netcdf_err(error,
'inquire varid of ol1 from file '
910 & //trim(inputorog) )
911 error=nf_get_var_double(ncid, id_var, ol_in(:,:,1))
912 call
netcdf_err(error,
'inquire data of ol1 from file '
913 & //trim(inputorog) )
914 error=nf_inq_varid(ncid,
'ol2', id_var)
915 call
netcdf_err(error,
'inquire varid of ol2 from file '
916 & //trim(inputorog) )
917 error=nf_get_var_double(ncid, id_var, ol_in(:,:,2))
918 call
netcdf_err(error,
'inquire data of ol2 from file '
919 & //trim(inputorog) )
920 error=nf_inq_varid(ncid,
'ol3', id_var)
921 call
netcdf_err(error,
'inquire varid of ol3 from file '
922 & //trim(inputorog) )
923 error=nf_get_var_double(ncid, id_var, ol_in(:,:,3))
924 call
netcdf_err(error,
'inquire data of ol3 from file '
925 & //trim(inputorog) )
926 error=nf_inq_varid(ncid,
'ol4', id_var)
927 call
netcdf_err(error,
'inquire varid of ol4 from file '
928 & //trim(inputorog) )
929 error=nf_get_var_double(ncid, id_var, ol_in(:,:,4))
930 call
netcdf_err(error,
'inquire data of ol4 from file '
931 & //trim(inputorog) )
933 error=nf_inq_varid(ncid,
'slmsk', id_var)
934 call
netcdf_err(error,
'inquire varid of slmsk from file '
935 & //trim(inputorog) )
936 error=nf_get_var_double(ncid, id_var, slm_in)
937 call
netcdf_err(error,
'inquire data of slmsk from file '
938 & //trim(inputorog) )
940 error=nf_inq_varid(ncid,
'geolon', id_var)
941 call
netcdf_err(error,
'inquire varid of geolon from file '
942 & //trim(inputorog) )
943 error=nf_get_var_double(ncid, id_var, lon_in)
944 call
netcdf_err(error,
'inquire data of geolon from file '
945 & //trim(inputorog) )
947 error=nf_inq_varid(ncid,
'geolat', id_var)
948 call
netcdf_err(error,
'inquire varid of geolat from file '
949 & //trim(inputorog) )
950 error=nf_get_var_double(ncid, id_var, lat_in)
951 call
netcdf_err(error,
'inquire data of geolat from file '
952 & //trim(inputorog) )
955 do j=1,ny_in;
do i=1,nx_in
956 if(slm_in(i,j) == 2) slm_in(i,j) = 0
961 & //trim(inputorog) )
963 print*,
"calling MAKEOA3 to compute OA, OL"
964 CALL
makeoa3(zavg,zslm,var,glat,oa,ol,iwork,elvmax,oro,slm,
965 1 work1,work2,work3,work4,work5,work6,
966 2 im,jm,imn,jmn,geolon_c,geolat_c,
967 3 geolon,geolat,is_south_pole,is_north_pole,nx_in,ny_in,
968 4 oa_in,ol_in,slm_in,lon_in,lat_in)
970 deallocate(oa_in,ol_in,slm_in,lon_in,lat_in)
974 CALL
makeoa(zavg,var,glat,oa,ol,iwork,elvmax,oro,
975 1 work1,work2,work3,work4,
977 3 ist,ien,jst,jen,im,jm,imn,jmn,xlat,numi)
982 deallocate (zslm,zavg)
984 deallocate (work2,work3,work4,work5,work6)
990 call
minmxj(im,jm,oa,
' OA')
991 call
minmxj(im,jm,ol,
' OL')
992 call
minmxj(im,jm,elvmax,
' ELVMAX')
993 call
minmxj(im,jm,oro,
' ORO')
1013 if (elvmax(i,j) .gt. 3000.) maxc3 = maxc3 +1
1014 if (elvmax(i,j) .gt. 4000.) maxc4 = maxc4 +1
1015 if (elvmax(i,j) .gt. 5000.) maxc5 = maxc5 +1
1016 if (elvmax(i,j) .gt. 6000.) maxc6 = maxc6 +1
1017 if (elvmax(i,j) .gt. 7000.) maxc7 = maxc7 +1
1018 if (elvmax(i,j) .gt. 8000.) maxc8 = maxc8 +1
1021 print *,
' MAXC3:',maxc3,maxc4,maxc5,maxc6,maxc7,maxc8
1026 print *,
' ===> Replacing ELVMAX with ELVMAX-ORO <=== '
1027 print *,
' ===> if ELVMAX<=ORO replace with proxy <=== '
1028 print *,
' ===> the sum of mean orog (ORO) and std dev <=== '
1031 if (elvmax(i,j) .lt. oro(i,j) )
then
1033 elvmax(i,j) = max( 3. * var(i,j),0.)
1035 elvmax(i,j) = max( elvmax(i,j) - oro(i,j),0.)
1047 if (elvmax(i,j) .gt. 3000.) maxc3 = maxc3 +1
1048 if (elvmax(i,j) .gt. 4000.) maxc4 = maxc4 +1
1049 if (elvmax(i,j) .gt. 5000.) maxc5 = maxc5 +1
1050 if (elvmax(i,j) .gt. 6000.) maxc6 = maxc6 +1
1051 if (elvmax(i,j) .gt. 7000.) maxc7 = maxc7 +1
1052 if (elvmax(i,j) .gt. 8000.) maxc8 = maxc8 +1
1055 print *,
' after MAXC 3-6 km:',maxc3,maxc4,maxc5,maxc6
1057 call
mnmxja(im,jm,elvmax,itest,jtest,
' ELVMAX')
1062 print *,
' Testing at point (itest,jtest)=',itest,jtest
1063 print *,
' SLM(itest,jtest)=',slm(itest,jtest),itest,jtest
1064 print *,
' ORO(itest,jtest)=',oro(itest,jtest),itest,jtest
1067 IF(slm(i,j).EQ.0.)
THEN
1097 IF (merge_file ==
'none')
then
1099 msk_ocn :
if ( mskocn .eq. 1 )
then
1103 if (abs(oro(i,j)) .lt. 1. )
then
1104 slm(i,j) = slmi(i,j)
1106 if ( slmi(i,j) .eq. 1. .and. slm(i,j) .eq. 1) slm(i,j) = 1
1107 if ( slmi(i,j) .eq. 0. .and. slm(i,j) .eq. 0) slm(i,j) = 0
1108 if ( slmi(i,j) .eq. 0. .and. slm(i,j) .eq. 1) slm(i,j) = 0
1109 if ( slmi(i,j) .eq. 0. .and. slm(i,j) .eq. 0) slm(i,j) = 0
1115 print *,
' SLM(itest,jtest)=',slm(itest,jtest),itest,jtest
1116 print *,
' ORO(itest,jtest)=',oro(itest,jtest),itest,jtest
1120 IF (merge_file ==
'none')
then
1123 iso_loop :
DO j=2,jm-1
1126 rn=
REAL(numi(jn))/
REAL(numi(j))
1127 rs=
REAL(numi(js))/
REAL(numi(j))
1131 slma=slm(iw,j)+slm(ie,j)
1132 oroa=oro(iw,j)+oro(ie,j)
1133 vara=var(iw,j)+var(ie,j)
1134 var4a=var4(iw,j)+var4(ie,j)
1136 oaa(k)=oa(iw,j,k)+oa(ie,j,k)
1138 ola(k)=ol(iw,j,k)+ol(ie,j,k)
1142 IF(abs(xn-nint(xn)).LT.1.e-2)
THEN
1143 in=mod(nint(xn)-1,numi(jn))+1
1144 inw=mod(in+numi(jn)-2,numi(jn))+1
1145 ine=mod(in,numi(jn))+1
1146 slma=slma+slm(inw,jn)+slm(in,jn)+slm(ine,jn)
1147 oroa=oroa+oro(inw,jn)+oro(in,jn)+oro(ine,jn)
1148 vara=vara+var(inw,jn)+var(in,jn)+var(ine,jn)
1149 var4a=var4a+var4(inw,jn)+var4(in,jn)+var4(ine,jn)
1151 oaa(k)=oaa(k)+oa(inw,jn,k)+oa(in,jn,k)+oa(ine,jn,k)
1152 ola(k)=ola(k)+ol(inw,jn,k)+ol(in,jn,k)+ol(ine,jn,k)
1157 ine=mod(inw,numi(jn))+1
1158 slma=slma+slm(inw,jn)+slm(ine,jn)
1159 oroa=oroa+oro(inw,jn)+oro(ine,jn)
1160 vara=vara+var(inw,jn)+var(ine,jn)
1161 var4a=var4a+var4(inw,jn)+var4(ine,jn)
1163 oaa(k)=oaa(k)+oa(inw,jn,k)+oa(ine,jn,k)
1164 ola(k)=ola(k)+ol(inw,jn,k)+ol(ine,jn,k)
1169 IF(abs(xs-nint(xs)).LT.1.e-2)
THEN
1170 is=mod(nint(xs)-1,numi(js))+1
1171 isw=mod(is+numi(js)-2,numi(js))+1
1172 ise=mod(is,numi(js))+1
1173 slma=slma+slm(isw,js)+slm(is,js)+slm(ise,js)
1174 oroa=oroa+oro(isw,js)+oro(is,js)+oro(ise,js)
1175 vara=vara+var(isw,js)+var(is,js)+var(ise,js)
1176 var4a=var4a+var4(isw,js)+var4(is,js)+var4(ise,js)
1178 oaa(k)=oaa(k)+oa(isw,js,k)+oa(is,js,k)+oa(ise,js,k)
1179 ola(k)=ola(k)+ol(isw,js,k)+ol(is,js,k)+ol(ise,js,k)
1184 ise=mod(isw,numi(js))+1
1185 slma=slma+slm(isw,js)+slm(ise,js)
1186 oroa=oroa+oro(isw,js)+oro(ise,js)
1187 vara=vara+var(isw,js)+var(ise,js)
1188 var4a=var4a+var4(isw,js)+var4(ise,js)
1190 oaa(k)=oaa(k)+oa(isw,js,k)+oa(ise,js,k)
1191 ola(k)=ola(k)+ol(isw,js,k)+ol(ise,js,k)
1202 IF(slm(i,j).EQ.0..AND.slma.EQ.wgta)
THEN
1203 print
'("SEA ",2F8.0," MODIFIED TO LAND",2F8.0," AT ",2I8)',
1204 & oro(i,j),var(i,j),oroa,vara,i,j
1213 ELSEIF(slm(i,j).EQ.1..AND.slma.EQ.0.)
THEN
1214 print
'("LAND",2F8.0," MODIFIED TO SEA ",2F8.0," AT ",2I8)',
1215 & oro(i,j),var(i,j),oroa,vara,i,j
1228 print *,
' after isolated points removed'
1229 call
minmxj(im,jm,oro,
' ORO')
1231 print *,
' ORO(itest,jtest)=',oro(itest,jtest)
1232 print *,
' VAR(itest,jtest)=',var(itest,jtest)
1233 print *,
' VAR4(itest,jtest)=',var4(itest,jtest)
1234 print *,
' OA(itest,jtest,1)=',oa(itest,jtest,1)
1235 print *,
' OA(itest,jtest,2)=',oa(itest,jtest,2)
1236 print *,
' OA(itest,jtest,3)=',oa(itest,jtest,3)
1237 print *,
' OA(itest,jtest,4)=',oa(itest,jtest,4)
1238 print *,
' OL(itest,jtest,1)=',ol(itest,jtest,1)
1239 print *,
' OL(itest,jtest,2)=',ol(itest,jtest,2)
1240 print *,
' OL(itest,jtest,3)=',ol(itest,jtest,3)
1241 print *,
' OL(itest,jtest,4)=',ol(itest,jtest,4)
1242 print *,
' Testing at point (itest,jtest)=',itest,jtest
1243 print *,
' THETA(itest,jtest)=',theta(itest,jtest)
1244 print *,
' GAMMA(itest,jtest)=',gamma(itest,jtest)
1245 print *,
' SIGMA(itest,jtest)=',sigma(itest,jtest)
1246 print *,
' ELVMAX(itest,jtest)=',elvmax(itest,jtest)
1247 print *,
' EFAC=',efac
1254 oro(i,j) = oro(i,j) + efac*var(i,j)
1255 hprime(i,j,1) = var(i,j)
1256 hprime(i,j,2) = var4(i,j)
1257 hprime(i,j,3) = oa(i,j,1)
1258 hprime(i,j,4) = oa(i,j,2)
1259 hprime(i,j,5) = oa(i,j,3)
1260 hprime(i,j,6) = oa(i,j,4)
1261 hprime(i,j,7) = ol(i,j,1)
1262 hprime(i,j,8) = ol(i,j,2)
1263 hprime(i,j,9) = ol(i,j,3)
1264 hprime(i,j,10)= ol(i,j,4)
1265 hprime(i,j,11)= theta(i,j)
1266 hprime(i,j,12)= gamma(i,j)
1267 hprime(i,j,13)= sigma(i,j)
1268 hprime(i,j,14)= elvmax(i,j)
1272 call
mnmxja(im,jm,elvmax,itest,jtest,
' ELVMAX')
1281 allocate (orf(im,jm))
1282 IF ( nf1 - nf0 .eq. 0 ) filter=.false.
1283 print *,
' NF1, NF0, FILTER=',nf1,nf0,filter
1287 if(numi(j).lt.im)
then
1289 call
spfft1(numi(j),im/2+1,numi(j),1,ffj,oro(1,j),-1)
1290 call
spfft1(im,im/2+1,im,1,ffj,oro(1,j),+1)
1293 CALL sptez(nr,nm,4,im,jm,ors,oro,-1)
1295 print *,
' about to apply spectral filter '
1301 www=max(1.-fff*(n-nf0)**2,0.)
1302 ors(i+1)=ors(i+1)*www
1303 ors(i+2)=ors(i+2)*www
1309 CALL sptez(nr,nm,4,im,jm,ors,orf,+1)
1311 if(numi(j).lt.im)
then
1312 call
spfft1(im,im/2+1,im,1,ffj,orf(1,j),-1)
1313 call
spfft1(numi(j),im/2+1,numi(j),1,ffj,orf(1,j),+1)
1319 CALL
revers(im, jm, numi, slm, work1)
1320 CALL
revers(im, jm, numi, oro, work1)
1322 CALL
revers(im, jm, numi, hprime(1,1,imt), work1)
1331 call
mnmxja(im,jm,elvmax,itest,jtest,
' ELVMAX')
1332 print *,
' ELVMAX(',itest,jtest,
')=',elvmax(itest,jtest)
1333 print *,
' after spectral filter is applied'
1334 call
minmxj(im,jm,oro,
' ORO')
1335 call
minmxj(im,jm,orf,
' ORF')
1338 call
rg2gg(im,jm,numi,slm)
1339 call
rg2gg(im,jm,numi,oro)
1340 call
rg2gg(im,jm,numi,orf)
1343 call
rg2gg(im,jm,numi,hprime(1,1,imt))
1346 print *,
' after nearest neighbor interpolation applied '
1347 call
minmxj(im,jm,oro,
' ORO')
1348 call
minmxj(im,jm,orf,
' ORF')
1349 call
mnmxja(im,jm,elvmax,itest,jtest,
' ELVMAX')
1350 print *,
' ORO,ORF(itest,jtest),itest,jtest:',
1351 & oro(itest,jtest),orf(itest,jtest),itest,jtest
1352 print *,
' ELVMAX(',itest,jtest,
')=',elvmax(itest,jtest)
1358 if ( i .le. 21 .and. i .ge. 1 )
then
1359 if (j .eq. jm )
write(6,153)i,j,oro(i,j),elvmax(i,j),slm(i,j)
1360 153
format(1x,
' ORO,ELVMAX(i=',i4,
' j=',i4,
')=',2e14.5,f5.1)
1365 write(6,*)
' Timer 5 time= ',tend-tbeg
1366 if (output_binary)
then
1369 print *,
' OUTPUT BINARY FIELDS'
1370 WRITE(51)
REAL(slm,4)
1371 WRITE(52)
REAL(orf,4)
1372 WRITE(53)
REAL(hprime,4)
1373 WRITE(54)
REAL(ors,4)
1374 WRITE(55)
REAL(oro,4)
1375 WRITE(66)
REAL(theta,4)
1376 WRITE(67)
REAL(gamma,4)
1377 WRITE(68)
REAL(sigma,4)
1379 if ( mskocn .eq. 1 )
then
1381 WRITE(27,iostat=ios) oclsm
1382 print *,
' write OCLSM input:',ios
1386 call
minmxj(im,jm,oro,
' ORO')
1387 print *,
' IM=',im,
' JM=',jm,
' SPECTR=',spectr
1389 WRITE(71)
REAL(slm,4)
1391 WRITE(71)
REAL(HPRIME(:,:,IMT),4)
1392 print *,
' HPRIME(',itest,jtest,imt,
')=',hprime(itest,jtest,imt)
1394 WRITE(71)
REAL(oro,4)
1396 WRITE(71)
REAL(ORF,4)
1421 kgds(4)=90000-180000/pi*rclt(1)
1423 kgds(7)=180000/pi*rclt(1)-90000
1424 kgds(8)=-nint(360000./im)
1425 kgds(9)=nint(360000./im)
1429 CALL baopen(56,
'fort.56',iret)
1430 if (iret .ne. 0) print *,
' BAOPEN ERROR UNIT 56: IRET=',iret
1431 CALL putgb(56,im*jm,kpds,kgds,lb,slm,iret)
1432 print *,
' SLM: putgb-KPDS(22,5),iret:',kpds(22),kpds(5),iret
1433 if (iret .ne. 0) print *,
' SLM PUTGB ERROR: UNIT 56: IRET=',iret
1434 print *,
' SLM: putgb-KPDS(22,5),iret:',kpds(22),kpds(5),iret
1446 CALL baopen(57,
'fort.57',iret)
1447 CALL putgb(57,im*jm,kpds,kgds,lb,orf,iret)
1448 print *,
' ORF (ORO): putgb-KPDS(22,5),iret:',kpds(22),kpds(5),iret
1455 CALL baopen(58,
'fort.58',iret)
1456 CALL putgb(58,im*jm,kpds,kgds,lb,theta,iret)
1457 print *,
' THETA: putgb-KPDS(22,5),iret:',kpds(22),kpds(5),iret
1464 CALL baopen(60,
'fort.60',iret)
1465 CALL putgb(60,im*jm,kpds,kgds,lb,sigma,iret)
1466 print *,
' SIGMA: putgb-KPDS(22,5),iret:',kpds(22),kpds(5),iret
1473 CALL baopen(59,
'fort.59',iret)
1474 CALL putgb(59,im*jm,kpds,kgds,lb,gamma,iret)
1475 print *,
' GAMMA: putgb-KPDS(22,5),iret:',kpds(22),kpds(5),iret
1479 CALL baopen(61,
'fort.61',iret)
1480 CALL putgb(61,im*jm,kpds,kgds,lb,hprime,iret)
1481 print *,
' HPRIME: putgb-KPDS(22,5),iret:',kpds(22),kpds(5),iret
1486 CALL baopen(62,
'fort.62',iret)
1487 CALL putgb(62,im*jm,kpds,kgds,lb,elvmax,iret)
1488 print *,
' ELVMAX: putgb-KPDS(22,5),iret:',kpds(22),kpds(5),iret
1493 xlon(i) = delxn*(i-1)
1495 IF(trim(outgrid) ==
"none")
THEN
1498 geolon(i,j) = xlon(i)
1499 geolat(i,j) = xlat(j)
1504 xlat(j) = geolat(1,j)
1507 xlon(i) = geolon(i,1)
1511 write(6,*)
' Binary output time= ',tend-tbeg
1513 CALL
write_netcdf(im,jm,slm,land_frac,oro,orf,hprime,1,1,
1514 1 geolon(1:im,1:jm),geolat(1:im,1:jm), xlon,xlat)
1516 write(6,*)
' WRITE_NETCDF time= ',tend-tbeg
1517 print *,
' wrote netcdf file out.oro.tile?.nc'
1519 print *,
' ===== Deallocate Arrays and ENDING MTN VAR OROG program'
1522 deallocate(jst,jen,kpds,kgds,numi,lonsperlat)
1523 deallocate(cosclt,wgtclt,rclt,xlat,diffx,xlon,ors,oaa,ola,glat)
1527 deallocate (geolon,geolon_c,geolat,geolat_c)
1528 deallocate (slm,oro,var,orf,land_frac)
1529 deallocate (theta,gamma,sigma,elvmax)
1533 write(6,*)
' Total runtime time= ',tend-tbeg1
1566 SUBROUTINE makemt(ZAVG,ZSLM,ORO,SLM,VAR,VAR4,
1567 1 glat,ist,ien,jst,jen,im,jm,imn,jmn,xlat,numi)
1568 dimension glat(jmn),xlat(jm)
1570 INTEGER zavg(imn,jmn),zslm(imn,jmn)
1571 dimension oro(im,jm),slm(im,jm),var(im,jm),var4(im,jm)
1572 dimension ist(im,jm),ien(im,jm),jst(jm),jen(jm),numi(jm)
1578 print *,
' _____ SUBROUTINE MAKEMT '
1585 glat(j) = -90. + (j-1) * delxn + delxn * 0.5
1595 faclon = delx / delxn
1596 ist(i,j) = faclon * float(i-1) - faclon * 0.5 + 1
1597 ien(i,j) = faclon * float(i) - faclon * 0.5 + 1
1601 IF (ist(i,j) .LE. 0) ist(i,j) = ist(i,j) + imn
1602 IF (ien(i,j) .LT. ist(i,j)) ien(i,j) = ien(i,j) + imn
1611 print *,
' DELX=',delx,
' DELXN=',delxn
1615 xxlat = (xlat(j)+xlat(j+1))/2.
1616 IF(flag.AND.glat(j1).GT.xxlat)
THEN
1624 jst(jm) = max(jst(jm-1) - (jen(jm-1)-jst(jm-1)),1)
1625 jen(1) = min(jen(2) + (jen(2)-jst(2)),jmn)
1643 DO ii1 = 1, ien(i,j) - ist(i,j) + 1
1644 i1 = ist(i,j) + ii1 - 1
1645 IF(i1.LE.0.) i1 = i1 + imn
1646 IF(i1.GT.imn) i1 = i1 - imn
1653 xland = xland + float(zslm(i1,j1))
1654 xwatr = xwatr + float(1-zslm(i1,j1))
1656 height = float(zavg(i1,j1))
1658 IF(height.LT.-990.) height = 0.0
1659 xl1 = xl1 + height * float(zslm(i1,j1))
1660 xs1 = xs1 + height * float(1-zslm(i1,j1))
1662 xw2 = xw2 + height ** 2
1673 IF(xnsum.GT.1.)
THEN
1678 slm(i,j) = float(nint(xland/xnsum))
1679 IF(slm(i,j).NE.0.)
THEN
1680 oro(i,j)= xl1 / xland
1682 oro(i,j)= xs1 / xwatr
1684 var(i,j)=sqrt(max(xw2/xnsum-(xw1/xnsum)**2,0.))
1685 DO ii1 = 1, ien(i,j) - ist(i,j) + 1
1686 i1 = ist(i,j) + ii1 - 1
1687 IF(i1.LE.0.) i1 = i1 + imn
1688 IF(i1.GT.imn) i1 = i1 - imn
1690 height = float(zavg(i1,j1))
1691 IF(height.LT.-990.) height = 0.0
1692 xw4 = xw4 + (height-oro(i,j)) ** 4
1695 IF(var(i,j).GT.1.)
THEN
1699 var4(i,j) = min(xw4/xnsum/var(i,j) **4,10.)
1704 WRITE(6,*)
"! MAKEMT ORO SLM VAR VAR4 DONE"
1730 & jst,jen,ilist,numx)
1732 integer,
intent(in) :: imn,jmn
1734 real,
intent(in) :: lono(npts), lato(npts)
1735 real,
intent(in) :: delxn
1736 integer,
intent(out) :: jst,jen
1737 integer,
intent(out) :: ilist(imn)
1738 integer,
intent(out) :: numx
1739 real minlat,maxlat,minlon,maxlon
1740 integer i2, ii, ist, ien
1742 minlat = minval(lato)
1743 maxlat = maxval(lato)
1744 minlon = minval(lono)
1745 maxlon = maxval(lono)
1746 ist = minlon/delxn+1
1747 ien = maxlon/delxn+1
1748 jst = (minlat+90)/delxn+1
1749 jen = (maxlat+90)/delxn
1754 if(jen>jmn) jen = jmn
1757 if((jst == 1 .OR. jen == jmn) .and.
1758 & (ien-ist+1 > imn/2) )
then
1763 else if( ien-ist+1 > imn/2 )
then
1769 ii = lono(i2)/delxn+1
1770 if(ii <0 .or. ii>imn) print*,
"ii=",ii,imn,lono(i2),delxn
1771 if( ii < imn/2 )
then
1773 else if( ii > imn/2 )
then
1777 if(ist<1 .OR. ist>imn)
then
1778 print*, .or.
"ist<1 ist>IMN"
1781 if(ien<1 .OR. ien>imn)
then
1782 print*, .or.
"iend<1 iend>IMN"
1786 numx = imn - ien + 1
1788 ilist(i2) = ien + (i2-1)
1797 ilist(i2) = ist + (i2-1)
1819 1 glat,im,jm,imn,jmn,lon_c,lat_c)
1821 real,
parameter :: d2r = 3.14159265358979/180.
1822 integer,
parameter :: maxsum=20000000
1823 integer im, jm, imn, jmn, jst, jen
1824 real glat(jmn), glon(imn)
1825 INTEGER zslm(imn,jmn)
1826 real land_frac(im,jm)
1828 real lon_c(im+1,jm+1), lat_c(im+1,jm+1)
1829 real lono(4),lato(4),loni,lati
1830 integer jm1,i,j,nsum,nsum_all,ii,jj,numx,i2
1832 real delxn,xnsum,xland,xwatr,xl1,xs1,xw1
1833 real xnsum_all,xland_all,xwatr_all
1837 print *,
' _____ SUBROUTINE MAKE_MASK '
1844 glat(j) = -90. + (j-1) * delxn + delxn * 0.5
1847 glon(i) = 0. + (i-1) * delxn + delxn * 0.5
1850 land_frac(:,:) = 0.0
1872 lono(1) = lon_c(i,j)
1873 lono(2) = lon_c(i+1,j)
1874 lono(3) = lon_c(i+1,j+1)
1875 lono(4) = lon_c(i,j+1)
1876 lato(1) = lat_c(i,j)
1877 lato(2) = lat_c(i+1,j)
1878 lato(3) = lat_c(i+1,j+1)
1879 lato(4) = lat_c(i,j+1)
1880 call
get_index(imn,jmn,4,lono,lato,delxn,jst,jen,ilist,numx)
1881 do jj = jst, jen;
do i2 = 1, numx
1884 lati = -90 + jj*delxn
1886 xland_all = xland_all + float(zslm(ii,jj))
1887 xwatr_all = xwatr_all + float(1-zslm(ii,jj))
1888 xnsum_all = xnsum_all + 1.
1889 nsum_all = nsum_all+1
1890 if(nsum_all > maxsum)
then
1891 print*,
"nsum_all is greater than MAXSUM, increase MAXSUM"
1896 & lono*d2r,lato*d2r))
then
1898 xland = xland + float(zslm(ii,jj))
1899 xwatr = xwatr + float(1-zslm(ii,jj))
1902 if(nsum > maxsum)
then
1903 print*,
"nsum is greater than MAXSUM, increase MAXSUM"
1910 IF(xnsum.GT.1.)
THEN
1914 land_frac(i,j) = xland/xnsum
1915 slm(i,j) = float(nint(xland/xnsum))
1916 ELSEIF(xnsum_all.GT.1.)
THEN
1917 land_frac(i,j) = xland_all/xnsum _all
1918 slm(i,j) = float(nint(xland_all/xnsum_all))
1920 print*,
"no source points in MAKE_MASK"
1926 WRITE(6,*)
"! MAKE_MASK DONE"
1952 1 glat,im,jm,imn,jmn,lon_c,lat_c,
lake_frac,land_frac)
1954 real,
parameter :: d2r = 3.14159265358979/180.
1955 integer,
parameter :: maxsum=20000000
1956 real,
dimension(:),
allocatable :: hgt_1d, hgt_1d_all
1957 integer im, jm, imn, jmn
1958 real glat(jmn), glon(imn)
1959 INTEGER zavg(imn,jmn),zslm(imn,jmn)
1960 real oro(im,jm),var(im,jm),var4(im,jm)
1961 real,
intent(in) :: slm(im,jm),
lake_frac(im,jm),land_frac(im,jm)
1963 real lon_c(im+1,jm+1), lat_c(im+1,jm+1)
1964 real lono(4),lato(4),loni,lati
1966 integer jm1,i,j,nsum,nsum_all,ii,jj,i1,numx,i2
1968 real delxn,xnsum,xland,xwatr,xl1,xs1,xw1,xw2,xw4
1969 real xnsum_all,xland_all,xwatr_all,height_all
1970 real xl1_all,xs1_all,xw1_all,xw2_all,xw4_all
1976 print *,
' _____ SUBROUTINE MAKEMT2 '
1977 allocate(hgt_1d(maxsum))
1978 allocate(hgt_1d_all(maxsum))
1985 glat(j) = -90. + (j-1) * delxn + delxn * 0.5
1988 glon(i) = 0. + (i-1) * delxn + delxn * 0.5
2028 lono(1) = lon_c(i,j)
2029 lono(2) = lon_c(i+1,j)
2030 lono(3) = lon_c(i+1,j+1)
2031 lono(4) = lon_c(i,j+1)
2032 lato(1) = lat_c(i,j)
2033 lato(2) = lat_c(i+1,j)
2034 lato(3) = lat_c(i+1,j+1)
2035 lato(4) = lat_c(i,j+1)
2036 call
get_index(imn,jmn,4,lono,lato,delxn,jst,jen,ilist,numx)
2037 do jj = jst, jen;
do i2 = 1, numx
2040 lati = -90 + jj*delxn
2042 xland_all = xland_all + float(zslm(ii,jj))
2043 xwatr_all = xwatr_all + float(1-zslm(ii,jj))
2044 xnsum_all = xnsum_all + 1.
2045 height_all = float(zavg(ii,jj))
2046 nsum_all = nsum_all+1
2047 if(nsum_all > maxsum)
then
2048 print*,
"nsum_all is greater than MAXSUM, increase MAXSUM"
2051 hgt_1d_all(nsum_all) = height_all
2052 IF(height_all.LT.-990.) height_all = 0.0
2053 xl1_all = xl1_all + height_all * float(zslm(ii,jj))
2054 xs1_all = xs1_all + height_all * float(1-zslm(ii,jj))
2055 xw1_all = xw1_all + height_all
2056 xw2_all = xw2_all + height_all ** 2
2059 & lono*d2r,lato*d2r))
then
2061 xland = xland + float(zslm(ii,jj))
2062 xwatr = xwatr + float(1-zslm(ii,jj))
2064 height = float(zavg(ii,jj))
2066 if(nsum > maxsum)
then
2067 print*,
"nsum is greater than MAXSUM, increase MAXSUM"
2070 hgt_1d(nsum) = height
2071 IF(height.LT.-990.) height = 0.0
2072 xl1 = xl1 + height * float(zslm(ii,jj))
2073 xs1 = xs1 + height * float(1-zslm(ii,jj))
2075 xw2 = xw2 + height ** 2
2079 IF(xnsum.GT.1.)
THEN
2085 IF(slm(i,j) .NE. 0. .OR. land_frac(i,j) > 0.)
THEN
2087 oro(i,j)= xl1 / xland
2089 oro(i,j)= xs1 / xwatr
2093 oro(i,j)= xs1 / xwatr
2095 oro(i,j)= xl1 / xland
2099 var(i,j)=sqrt(max(xw2/xnsum-(xw1/xnsum)**2,0.))
2101 xw4 = xw4 + (hgt_1d(i1) - oro(i,j)) ** 4
2104 IF(var(i,j).GT.1.)
THEN
2105 var4(i,j) = min(xw4/xnsum/var(i,j) **4,10.)
2108 ELSEIF(xnsum_all.GT.1.)
THEN
2111 IF(slm(i,j) .NE. 0. .OR. land_frac(i,j) > 0.)
THEN
2112 IF (xland_all > 0)
THEN
2113 oro(i,j)= xl1_all / xland_all
2115 oro(i,j)= xs1_all / xwatr_all
2118 IF (xwatr_all > 0)
THEN
2119 oro(i,j)= xs1_all / xwatr_all
2121 oro(i,j)= xl1_all / xland_all
2125 var(i,j)=sqrt(max(xw2_all/xnsum_all-
2126 & (xw1_all/xnsum_all)**2,0.))
2129 & (hgt_1d_all(i1) - oro(i,j)) ** 4
2132 IF(var(i,j).GT.1.)
THEN
2133 var4(i,j) = min(xw4_all/xnsum_all/var(i,j) **4,10.)
2136 print*,
"no source points in MAKEMT2"
2142 IF (
lake_frac(i,j) .EQ. 0. .AND. land_frac(i,j) .EQ. 0.)
THEN
2149 WRITE(6,*)
"! MAKEMT2 ORO SLM VAR VAR4 DONE"
2152 deallocate(hgt_1d_all)
2184 SUBROUTINE makepc(ZAVG,ZSLM,THETA,GAMMA,SIGMA,
2185 1 glat,ist,ien,jst,jen,im,jm,imn,jmn,xlat,numi)
2189 parameter(rearth=6.3712e+6)
2190 dimension glat(jmn),xlat(jm),deltax(jmn)
2191 INTEGER zavg(imn,jmn),zslm(imn,jmn)
2192 dimension oro(im,jm),slm(im,jm),hl(im,jm),hk(im,jm)
2193 dimension hx2(im,jm),hy2(im,jm),hxy(im,jm),hlprim(im,jm)
2194 dimension theta(im,jm),gamma(im,jm),sigma2(im,jm),sigma(im,jm)
2195 dimension ist(im,jm),ien(im,jm),jst(jm),jen(jm),numi(jm)
2200 pi = 4.0 * atan(1.0)
2206 deltay = certh / float(jmn)
2207 print *,
'MAKEPC: DELTAY=',deltay
2210 glat(j) = -90. + (j-1) * delxn + delxn * 0.5
2211 deltax(j) = deltay * cos(glat(j)*pi/180.0)
2220 faclon = delx / delxn
2221 ist(i,j) = faclon * float(i-1) - faclon * 0.5
2222 ist(i,j) = ist(i,j) + 1
2223 ien(i,j) = faclon * float(i) - faclon * 0.5
2230 IF (ist(i,j) .LE. 0) ist(i,j) = ist(i,j) + imn
2231 IF (ien(i,j) .LT. ist(i,j)) ien(i,j) = ien(i,j) + imn
2233 if ( i .lt. 10 .and. j .lt. 10 )
2234 1 print*,
' I j IST IEN ',i,j,ist(i,j),ien(i,j)
2236 IF (ien(i,j) .LT. ist(i,j))
2237 1 print *,
' MAKEPC: IEN < IST: I,J,IST(I,J),IEN(I,J)',
2238 2 i,j,ist(i,j),ien(i,j)
2244 xxlat = (xlat(j)+xlat(j+1))/2.
2245 IF(flag.AND.glat(j1).GT.xxlat)
THEN
2252 jst(jm) = max(jst(jm-1) - (jen(jm-1)-jst(jm-1)),1)
2253 jen(1) = min(jen(2) + (jen(2)-jst(2)),jmn)
2255 print*,
' IST,IEN(1,1-numi(1,JM))',ist(1,1),ien(1,1),
2256 1 ist(numi(jm),jm),ien(numi(jm),jm), numi(jm)
2257 print*,
' JST,JEN(1,JM) ',jst(1),jen(1),jst(jm),jen(jm)
2286 DO ii1 = 1, ien(i,j) - ist(i,j) + 1
2287 i1 = ist(i,j) + ii1 - 1
2288 IF(i1.LE.0.) i1 = i1 + imn
2289 IF(i1.GT.imn) i1 = i1 - imn
2294 if (i1 - 1 .le. 0 ) i0 = i0 + imn
2295 if (i1 - 1 .gt. imn) i0 = i0 - imn
2298 if (i1 + 1 .le. 0 ) ip1 = ip1 + imn
2299 if (i1 + 1 .gt. imn) ip1 = ip1 - imn
2303 if ( i1 .eq. ist(i,j) .and. j1 .eq. jst(j) )
2304 1 print*,
' J, J1,IST,JST,DELTAX,GLAT ',
2305 2 j,j1,ist(i,j),jst(j),deltax(j1),glat(j1)
2306 if ( i1 .eq. ien(i,j) .and. j1 .eq. jen(j) )
2307 1 print*,
' J, J1,IEN,JEN,DELTAX,GLAT ',
2308 2 j,j1,ien(i,j),jen(j),deltax(j1),glat(j1)
2310 xland = xland + float(zslm(i1,j1))
2311 xwatr = xwatr + float(1-zslm(i1,j1))
2314 height = float(zavg(i1,j1))
2315 hi0 = float(zavg(i0,j1))
2316 hip1 = float(zavg(ip1,j1))
2318 IF(height.LT.-990.) height = 0.0
2319 if(hi0 .lt. -990.) hi0 = 0.0
2320 if(hip1 .lt. -990.) hip1 = 0.0
2322 xfp = 0.5 * ( hip1 - hi0 ) / deltax(j1)
2323 xfp2 = xfp2 + 0.25 * ( ( hip1 - hi0 )/deltax(j1) )** 2
2327 if ( j1 .ne. jst(jm) .and. j1 .ne. jen(1) )
then
2328 hj0 = float(zavg(i1,j1-1))
2329 hjp1 = float(zavg(i1,j1+1))
2330 if(hj0 .lt. -990.) hj0 = 0.0
2331 if(hjp1 .lt. -990.) hjp1 = 0.0
2333 yfp = 0.5 * ( hjp1 - hj0 ) / deltay
2334 yfp2 = yfp2 + 0.25 * ( ( hjp1 - hj0 )/deltay )**2
2340 elseif ( j1 .eq. jst(jm) )
then
2342 if (ijax .le. 0 ) ijax = ijax + imn
2343 if (ijax .gt. imn) ijax = ijax - imn
2345 hijax = float(zavg(ijax,j1))
2346 hi1j1 = float(zavg(i1,j1))
2347 if(hijax .lt. -990.) hijax = 0.0
2348 if(hi1j1 .lt. -990.) hi1j1 = 0.0
2350 yfp = 0.5 * ( ( 0.5 * ( hijax - hi1j1 ) ) )/deltay
2351 yfp2 = yfp2 + 0.25 * ( ( 0.5 * ( hijax - hi1j1) )
2357 elseif ( j1 .eq. jen(1) )
then
2359 if (ijax .le. 0 ) ijax = ijax + imn
2360 if (ijax .gt. imn) ijax = ijax - imn
2361 hijax = float(zavg(ijax,j1))
2362 hi1j1 = float(zavg(i1,j1))
2363 if(hijax .lt. -990.) hijax = 0.0
2364 if(hi1j1 .lt. -990.) hi1j1 = 0.0
2365 if ( i1 .lt. 5 )print *,
' S.Pole i1,j1 :',i1,j1,hijax,hi1j1
2367 yfp = 0.5 * (0.5 * ( hijax - hi1j1) )/deltay
2368 yfp2 = yfp2 + 0.25 * ( (0.5 * (hijax - hi1j1) )
2375 xfpyfp = xfpyfp + xfp * yfp
2376 xl1 = xl1 + height * float(zslm(i1,j1))
2377 xs1 = xs1 + height * float(1-zslm(i1,j1))
2387 IF(xnsum.GT.1.)
THEN
2388 slm(i,j) = float(nint(xland/xnsum))
2389 IF(slm(i,j).NE.0.)
THEN
2390 oro(i,j)= xl1 / xland
2391 hx2(i,j) = xfp2 / xland
2392 hy2(i,j) = yfp2 / xland
2393 hxy(i,j) = xfpyfp / xland
2395 oro(i,j)= xs1 / xwatr
2399 print *,
" I,J,i1,j1,HEIGHT:", i,j,i1,j1,height,
2401 print *,
" xfpyfp,xfp2,yfp2:",xfpyfp,xfp2,yfp2
2402 print *,
" HX2,HY2,HXY:",hx2(i,j),hy2(i,j),hxy(i,j)
2408 hk(i,j) = 0.5 * ( hx2(i,j) + hy2(i,j) )
2409 hl(i,j) = 0.5 * ( hx2(i,j) - hy2(i,j) )
2410 hlprim(i,j) = sqrt(hl(i,j)*hl(i,j) + hxy(i,j)*hxy(i,j))
2411 IF( hl(i,j).NE. 0. .AND. slm(i,j) .NE. 0. )
THEN
2413 theta(i,j) = 0.5 * atan2(hxy(i,j),hl(i,j)) * 180.0 / pi
2417 sigma2(i,j) = ( hk(i,j) + hlprim(i,j) )
2418 if ( sigma2(i,j) .GE. 0. )
then
2419 sigma(i,j) = sqrt(sigma2(i,j) )
2420 if (sigma2(i,j) .ne. 0. .and.
2421 & hk(i,j) .GE. hlprim(i,j) )
2422 1 gamma(i,j) = sqrt( (hk(i,j) - hlprim(i,j)) / sigma2(i,j) )
2428 print *,
" I,J,THETA,SIGMA,GAMMA,",i,j,theta(i,j),
2429 1 sigma(i,j),gamma(i,j)
2430 print *,
" HK,HL,HLPRIM:",hk(i,j),hl(i,j),hlprim(i,j)
2434 WRITE(6,*)
"! MAKE Principal Coord DONE"
2460 1 glat,im,jm,imn,jmn,lon_c,lat_c,slm)
2465 real,
parameter :: rearth=6.3712e+6
2466 real,
parameter :: d2r = 3.14159265358979/180.
2467 integer :: im,jm,imn,jmn
2468 real :: glat(jmn),deltax(jmn)
2469 INTEGER zavg(imn,jmn),zslm(imn,jmn)
2470 real lon_c(im+1,jm+1), lat_c(im+1,jm+1)
2471 real,
intent(in) :: slm(im,jm)
2472 real hl(im,jm),hk(im,jm)
2473 real hx2(im,jm),hy2(im,jm),hxy(im,jm),hlprim(im,jm)
2474 real theta(im,jm),gamma(im,jm),sigma2(im,jm),sigma(im,jm)
2475 real pi,certh,delxn,deltay,xnsum,xland
2476 real xfp,yfp,xfpyfp,xfp2,yfp2
2477 real hi0,hip1,hj0,hjp1,hijax,hi1j1
2478 real lono(4),lato(4),loni,lati
2479 integer i,j,i1,j1,i2,jst,jen,numx,i0,ip1,ijax
2486 pi = 4.0 * atan(1.0)
2491 deltay = certh / float(jmn)
2492 print *,
'MAKEPC2: DELTAY=',deltay
2495 glat(j) = -90. + (j-1) * delxn + delxn * 0.5
2496 deltax(j) = deltay * cos(glat(j)*d2r)
2530 lono(1) = lon_c(i,j)
2531 lono(2) = lon_c(i+1,j)
2532 lono(3) = lon_c(i+1,j+1)
2533 lono(4) = lon_c(i,j+1)
2534 lato(1) = lat_c(i,j)
2535 lato(2) = lat_c(i+1,j)
2536 lato(3) = lat_c(i+1,j+1)
2537 lato(4) = lat_c(i,j+1)
2538 call
get_index(imn,jmn,4,lono,lato,delxn,jst,jen,ilist,numx)
2540 do j1 = jst, jen;
do i2 = 1, numx
2543 lati = -90 + j1*delxn
2545 & lono*d2r,lato*d2r))
then
2550 if (i1 - 1 .le. 0 ) i0 = i0 + imn
2551 if (i1 - 1 .gt. imn) i0 = i0 - imn
2554 if (i1 + 1 .le. 0 ) ip1 = ip1 + imn
2555 if (i1 + 1 .gt. imn) ip1 = ip1 - imn
2557 xland = xland + float(zslm(i1,j1))
2560 hi0 = float(zavg(i0,j1))
2561 hip1 = float(zavg(ip1,j1))
2563 if(hi0 .lt. -990.) hi0 = 0.0
2564 if(hip1 .lt. -990.) hip1 = 0.0
2566 xfp = 0.5 * ( hip1 - hi0 ) / deltax(j1)
2567 xfp2 = xfp2 + 0.25 * ( ( hip1 - hi0 )/deltax(j1) )** 2
2571 if ( j1 .ne. 1 .and. j1 .ne. jmn )
then
2572 hj0 = float(zavg(i1,j1-1))
2573 hjp1 = float(zavg(i1,j1+1))
2574 if(hj0 .lt. -990.) hj0 = 0.0
2575 if(hjp1 .lt. -990.) hjp1 = 0.0
2577 yfp = 0.5 * ( hjp1 - hj0 ) / deltay
2578 yfp2 = yfp2 + 0.25 * ( ( hjp1 - hj0 )/deltay )**2
2584 elseif ( j1 .eq. 1 )
then
2586 if (ijax .le. 0 ) ijax = ijax + imn
2587 if (ijax .gt. imn) ijax = ijax - imn
2589 hijax = float(zavg(ijax,j1))
2590 hi1j1 = float(zavg(i1,j1))
2591 if(hijax .lt. -990.) hijax = 0.0
2592 if(hi1j1 .lt. -990.) hi1j1 = 0.0
2594 yfp = 0.5 * ( ( 0.5 * ( hijax - hi1j1 ) ) )/deltay
2595 yfp2 = yfp2 + 0.25 * ( ( 0.5 * ( hijax - hi1j1) )
2601 elseif ( j1 .eq. jmn )
then
2603 if (ijax .le. 0 ) ijax = ijax + imn
2604 if (ijax .gt. imn) ijax = ijax - imn
2605 hijax = float(zavg(ijax,j1))
2606 hi1j1 = float(zavg(i1,j1))
2607 if(hijax .lt. -990.) hijax = 0.0
2608 if(hi1j1 .lt. -990.) hi1j1 = 0.0
2609 if ( i1 .lt. 5 )print *,
' S.Pole i1,j1 :',i1,j1,
2612 yfp = 0.5 * (0.5 * ( hijax - hi1j1) )/deltay
2613 yfp2 = yfp2 + 0.25 * ( (0.5 * (hijax - hi1j1) )
2620 xfpyfp = xfpyfp + xfp * yfp
2631 xnsum_gt_1 :
IF(xnsum.GT.1.)
THEN
2632 IF(slm(i,j).NE.0.)
THEN
2634 hx2(i,j) = xfp2 / xland
2635 hy2(i,j) = yfp2 / xland
2636 hxy(i,j) = xfpyfp / xland
2638 hx2(i,j) = xfp2 / xnsum
2639 hy2(i,j) = yfp2 / xnsum
2640 hxy(i,j) = xfpyfp / xnsum
2645 print *,
" I,J,i1,j1:", i,j,i1,j1,
2647 print *,
" xfpyfp,xfp2,yfp2:",xfpyfp,xfp2,yfp2
2648 print *,
" HX2,HY2,HXY:",hx2(i,j),hy2(i,j),hxy(i,j)
2654 hk(i,j) = 0.5 * ( hx2(i,j) + hy2(i,j) )
2655 hl(i,j) = 0.5 * ( hx2(i,j) - hy2(i,j) )
2656 hlprim(i,j) = sqrt(hl(i,j)*hl(i,j) + hxy(i,j)*hxy(i,j))
2657 IF( hl(i,j).NE. 0. .AND. slm(i,j) .NE. 0. )
THEN
2659 theta(i,j) = 0.5 * atan2(hxy(i,j),hl(i,j)) / d2r
2663 sigma2(i,j) = ( hk(i,j) + hlprim(i,j) )
2664 if ( sigma2(i,j) .GE. 0. )
then
2665 sigma(i,j) = sqrt(sigma2(i,j) )
2666 if (sigma2(i,j) .ne. 0. .and.
2667 & hk(i,j) .GE. hlprim(i,j) )
2668 1 gamma(i,j) = sqrt( (hk(i,j) - hlprim(i,j)) / sigma2(i,j) )
2674 print *,
" I,J,THETA,SIGMA,GAMMA,",i,j,theta(i,j),
2675 1 sigma(i,j),gamma(i,j)
2676 print *,
" HK,HL,HLPRIM:",hk(i,j),hl(i,j),hlprim(i,j)
2681 WRITE(6,*)
"! MAKE Principal Coord DONE"
2727 SUBROUTINE makeoa(ZAVG,VAR,GLAT,OA4,OL,IOA4,ELVMAX,
2728 1 oro,oro1,xnsum,xnsum1,xnsum2,xnsum3,xnsum4,
2729 2 ist,ien,jst,jen,im,jm,imn,jmn,xlat,numi)
2730 dimension glat(jmn),xlat(jm)
2731 INTEGER zavg(imn,jmn)
2732 dimension oro(im,jm),oro1(im,jm),elvmax(im,jm),zmax(im,jm)
2733 dimension oa4(im,jm,4),ioa4(im,jm,4)
2734 dimension ist(im,jm),ien(im,jm),jst(jm),jen(jm)
2735 dimension xnsum(im,jm),xnsum1(im,jm),xnsum2(im,jm)
2736 dimension xnsum3(im,jm),xnsum4(im,jm)
2737 dimension var(im,jm),ol(im,jm,4),numi(jm)
2747 glat(j) = -90. + (j-1) * delxn + delxn * 0.5
2749 print *,
' IM=',im,
' JM=',jm,
' IMN=',imn,
' JMN=',jmn
2756 faclon = delx / delxn
2758 ist(i,j) = faclon * float(i-1) - faclon * 0.5
2759 ist(i,j) = ist(i,j) + 1
2760 ien(i,j) = faclon * float(i) - faclon * 0.5
2763 IF (ist(i,j) .LE. 0) ist(i,j) = ist(i,j) + imn
2764 IF (ien(i,j) .LT. ist(i,j)) ien(i,j) = ien(i,j) + imn
2766 if ( i .lt. 3 .and. j .lt. 3 )
2767 1print*,
' MAKEOA: I j IST IEN ',i,j,ist(i,j),ien(i,j)
2768 if ( i .lt. 3 .and. j .ge. jm-1 )
2769 1print*,
' MAKEOA: I j IST IEN ',i,j,ist(i,j),ien(i,j)
2772 print *,
'MAKEOA: DELXN,DELX,FACLON',delxn,delx,faclon
2773 print *,
' ***** ready to start JST JEN section '
2778 xxlat = (xlat(j)+xlat(j+1))/2.
2779 IF(flag.AND.glat(j1).GT.xxlat)
THEN
2784 1print*,
' MAKEOA: XX j JST JEN ',j,jst(j),jen(j)
2788 1print*,
' MAKEOA: j JST JEN ',j,jst(j),jen(j)
2790 1print*,
' MAKEOA: j JST JEN ',j,jst(j),jen(j)
2799 jst(jm) = max(jst(jm-1) - (jen(jm-1)-jst(jm-1)),1)
2800 jen(1) = min(jen(2) + (jen(2)-jst(2)),jmn)
2801 print *,
' ***** JST(1) JEN(1) ',jst(1),jen(1)
2802 print *,
' ***** JST(JM) JEN(JM) ',jst(jm),jen(jm)
2807 elvmax(i,j) = oro(i,j)
2816 DO ii1 = 1, ien(i,j) - ist(i,j) + 1
2817 i1 = ist(i,j) + ii1 - 1
2819 IF(i1.LE.0.) i1 = i1 + imn
2820 IF (i1 .GT. imn) i1 = i1 - imn
2822 height = float(zavg(i1,j1))
2823 IF(height.LT.-990.) height = 0.0
2824 IF ( height .gt. oro(i,j) )
then
2825 if ( height .gt. zmax(i,j) )zmax(i,j) = height
2826 xnsum(i,j) = xnsum(i,j) + 1
2830 if ( i .lt. 5 .and. j .ge. jm-5 )
then
2831 print *,
' I,J,ORO(I,J),XNSUM(I,J),ZMAX(I,J):',
2832 1 i,j,oro(i,j),xnsum(i,j),zmax(i,j)
2843 oro1(i,j) = oro(i,j)
2844 elvmax(i,j) = zmax(i,j)
2877 hc = 1116.2 - 0.878 * var(i,j)
2879 DO ii1 = 1, ien(i,j) - ist(i,j) + 1
2880 i1 = ist(i,j) + ii1 - 1
2885 IF(i1.GT.imn) i1 = i1 - imn
2887 IF(float(zavg(i1,j1)) .GT. hc)
2888 1 xnsum1(i,j) = xnsum1(i,j) + 1
2889 xnsum2(i,j) = xnsum2(i,j) + 1
2893 inci = nint((ien(i,j)-ist(i,j)) * 0.5)
2894 isttt = min(max(ist(i,j)-inci,1),imn)
2895 ieddd = min(max(ien(i,j)-inci,1),imn)
2897 incj = nint((jen(j)-jst(j)) * 0.5)
2898 jsttt = min(max(jst(j)-incj,1),jmn)
2899 jeddd = min(max(jen(j)-incj,1),jmn)
2909 IF(float(zavg(i1,j1)) .GT. hc)
2910 1 xnsum3(i,j) = xnsum3(i,j) + 1
2911 xnsum4(i,j) = xnsum4(i,j) + 1
2937 IF (ii .GT. numi(j)) ii = ii - numi(j)
2938 xnpu = xnsum(i,j) + xnsum(i,j+1)
2939 xnpd = xnsum(ii,j) + xnsum(ii,j+1)
2940 IF (xnpd .NE. xnpu) oa4(ii,j+1,1) = 1. - xnpd / max(xnpu , 1.)
2941 ol(ii,j+1,1) = (xnsum3(i,j+1)+xnsum3(ii,j+1))/
2942 1 (xnsum4(i,j+1)+xnsum4(ii,j+1))
2957 IF (ii .GT. numi(j)) ii = ii - numi(j)
2958 xnpu = xnsum(i,j+1) + xnsum(ii,j+1)
2959 xnpd = xnsum(i,j) + xnsum(ii,j)
2960 IF (xnpd .NE. xnpu) oa4(ii,j+1,2) = 1. - xnpd / max(xnpu , 1.)
2961 ol(ii,j+1,2) = (xnsum3(ii,j)+xnsum3(ii,j+1))/
2962 1 (xnsum4(ii,j)+xnsum4(ii,j+1))
2968 IF (ii .GT. numi(j)) ii = ii - numi(j)
2969 xnpu = xnsum(i,j+1) + ( xnsum(i,j) + xnsum(ii,j+1) )*0.5
2970 xnpd = xnsum(ii,j) + ( xnsum(i,j) + xnsum(ii,j+1) )*0.5
2971 IF (xnpd .NE. xnpu) oa4(ii,j+1,3) = 1. - xnpd / max(xnpu , 1.)
2972 ol(ii,j+1,3) = (xnsum1(ii,j)+xnsum1(i,j+1))/
2973 1 (xnsum2(ii,j)+xnsum2(i,j+1))
2979 IF (ii .GT. numi(j)) ii = ii - numi(j)
2980 xnpu = xnsum(i,j) + ( xnsum(ii,j) + xnsum(i,j+1) )*0.5
2981 xnpd = xnsum(ii,j+1) + ( xnsum(ii,j) + xnsum(i,j+1) )*0.5
2982 IF (xnpd .NE. xnpu) oa4(ii,j+1,4) = 1. - xnpd / max(xnpu , 1.)
2983 ol(ii,j+1,4) = (xnsum1(i,j)+xnsum1(ii,j+1))/
2984 1 (xnsum2(i,j)+xnsum2(ii,j+1))
2990 ol(i,1,kwd) = ol(i,2,kwd)
2991 ol(i,jm,kwd) = ol(i,jm-1,kwd)
2999 oa4(i,j,kwd) = sign( min( abs(t), 1. ), t )
3014 t = abs( oa4(i,j,kwd) )
3018 ELSE IF(t .GT. 0. .AND. t .LE. 1.)
THEN
3021 ELSE IF(t .GT. 1. .AND. t .LE. 10.)
THEN
3024 ELSE IF(t .GT. 10. .AND. t .LE. 100.)
THEN
3027 ELSE IF(t .GT. 100. .AND. t .LE. 1000.)
THEN
3030 ELSE IF(t .GT. 1000. .AND. t .LE. 10000.)
THEN
3033 ELSE IF(t .GT. 10000.)
THEN
3041 WRITE(6,*)
"! MAKEOA EXIT"
3057 real dx, lat, degrad
3060 real,
parameter :: radius = 6371200
3062 get_lon_angle = 2*asin( sin(dx/radius*0.5)/cos(lat) )*degrad
3079 real,
parameter :: radius = 6371200
3121 SUBROUTINE makeoa2(ZAVG,zslm,VAR,GLAT,OA4,OL,IOA4,ELVMAX,
3122 1 oro,oro1,xnsum,xnsum1,xnsum2,xnsum3,xnsum4,
3123 2 im,jm,imn,jmn,lon_c,lat_c,lon_t,lat_t,dx,dy,
3124 3 is_south_pole,is_north_pole )
3126 real,
parameter :: missing_value = -9999.
3127 real,
parameter :: d2r = 3.14159265358979/180.
3128 real,
PARAMETER :: r2d=180./3.14159265358979
3129 integer im,jm,imn,jmn
3131 INTEGER zavg(imn,jmn),zslm(imn,jmn)
3132 real oro(im,jm),oro1(im,jm),elvmax(im,jm),zmax(im,jm)
3134 integer ioa4(im,jm,4)
3135 real lon_c(im+1,jm+1), lat_c(im+1,jm+1)
3136 real lon_t(im,jm), lat_t(im,jm)
3137 real dx(im,jm), dy(im,jm)
3138 logical is_south_pole(im,jm), is_north_pole(im,jm)
3139 real xnsum(im,jm),xnsum1(im,jm),xnsum2(im,jm)
3140 real xnsum3(im,jm),xnsum4(im,jm)
3141 real var(im,jm),ol(im,jm,4)
3142 integer i,j,ilist(imn),numx,i1,j1,ii1
3144 real lono(4),lato(4),loni,lati
3145 real delxn,hc,height,xnpu,xnpd,t
3146 integer ns0,ns1,ns2,ns3,ns4,ns5,ns6
3148 real lon,lat,dlon,dlat,dlat_old
3149 real lon1,lat1,lon2,lat2
3150 real xnsum11,xnsum12,xnsum21,xnsum22
3151 real hc_11, hc_12, hc_21, hc_22
3152 real xnsum1_11,xnsum1_12,xnsum1_21,xnsum1_22
3153 real xnsum2_11,xnsum2_12,xnsum2_21,xnsum2_22
3162 glat(j) = -90. + (j-1) * delxn + delxn * 0.5
3164 print *,
' IM=',im,
' JM=',jm,
' IMN=',imn,
' JMN=',jmn
3172 elvmax(i,j) = oro(i,j)
3180 oro1(i,j) = oro(i,j)
3181 elvmax(i,j) = zmax(i,j)
3193 hc = 1116.2 - 0.878 * var(i,j)
3194 lono(1) = lon_c(i,j)
3195 lono(2) = lon_c(i+1,j)
3196 lono(3) = lon_c(i+1,j+1)
3197 lono(4) = lon_c(i,j+1)
3198 lato(1) = lat_c(i,j)
3199 lato(2) = lat_c(i+1,j)
3200 lato(3) = lat_c(i+1,j+1)
3201 lato(4) = lat_c(i,j+1)
3202 call
get_index(imn,jmn,4,lono,lato,delxn,jst,jen,ilist,numx)
3203 do j1 = jst, jen;
do ii1 = 1, numx
3206 lati = -90 + j1*delxn
3208 & lono*d2r,lato*d2r))
then
3210 height = float(zavg(i1,j1))
3211 IF(height.LT.-990.) height = 0.0
3212 IF ( height .gt. oro(i,j) )
then
3213 if ( height .gt. zmax(i,j) )zmax(i,j) = height
3226 oro1(i,j) = oro(i,j)
3227 elvmax(i,j) = zmax(i,j)
3261 if(is_north_pole(i,j))
then
3262 print*,
"set oa1 = 0 and ol=0 at i,j=", i,j
3267 else if(is_south_pole(i,j))
then
3268 print*,
"set oa1 = 0 and ol=1 at i,j=", i,j
3279 if( lat-dlat*0.5<-90.)
then
3280 print*,
"at i,j =", i,j, lat, dlat, lat-dlat*0.5
3281 print*,
"ERROR: lat-dlat*0.5<-90."
3284 if( lat+dlat*2 > 90.)
then
3287 print*,
"at i,j=",i,j,
" adjust dlat from ",
3288 & dlat_old,
" to ", dlat
3296 if(lat1<-90 .or. lat2>90)
then
3297 print*,
"at upper left i=,j=", i, j, lat, dlat,lat1,lat2
3299 xnsum11 =
get_xnsum(lon1,lat1,lon2,lat2,imn,jmn,glat,
3307 if(lat1<-90 .or. lat2>90)
then
3308 print*,
"at lower left i=,j=", i, j, lat, dlat,lat1,lat2
3310 xnsum12 =
get_xnsum(lon1,lat1,lon2,lat2,imn,jmn,glat,
3318 if(lat1<-90 .or. lat2>90)
then
3319 print*,
"at upper right i=,j=", i, j, lat, dlat,lat1,lat2
3321 xnsum21 =
get_xnsum(lon1,lat1,lon2,lat2,imn,jmn,glat,
3329 if(lat1<-90 .or. lat2>90)
then
3330 print*,
"at lower right i=,j=", i, j, lat, dlat,lat1,lat2
3333 xnsum22 =
get_xnsum(lon1,lat1,lon2,lat2,imn,jmn,glat,
3336 xnpu = xnsum11 + xnsum12
3337 xnpd = xnsum21 + xnsum22
3338 IF (xnpd .NE. xnpu) oa4(i,j,1) = 1. - xnpd / max(xnpu , 1.)
3340 xnpu = xnsum11 + xnsum21
3341 xnpd = xnsum12 + xnsum22
3342 IF (xnpd .NE. xnpu) oa4(i,j,2) = 1. - xnpd / max(xnpu , 1.)
3344 xnpu = xnsum11 + (xnsum12+xnsum21)*0.5
3345 xnpd = xnsum22 + (xnsum12+xnsum21)*0.5
3346 IF (xnpd .NE. xnpu) oa4(i,j,3) = 1. - xnpd / max(xnpu , 1.)
3348 xnpu = xnsum12 + (xnsum11+xnsum22)*0.5
3349 xnpd = xnsum21 + (xnsum11+xnsum22)*0.5
3350 IF (xnpd .NE. xnpu) oa4(i,j,4) = 1. - xnpd / max(xnpu , 1.)
3359 if(lat1<-90 .or. lat2>90)
then
3360 print*,
"at upper left i=,j=", i, j, lat, dlat,lat1,lat2
3362 call
get_xnsum2(lon1,lat1,lon2,lat2,imn,jmn,glat,
3363 & zavg,delxn, xnsum1_11, xnsum2_11, hc_11)
3370 if(lat1<-90 .or. lat2>90)
then
3371 print*,
"at lower left i=,j=", i, j, lat, dlat,lat1,lat2
3373 call
get_xnsum2(lon1,lat1,lon2,lat2,imn,jmn,glat,
3374 & zavg,delxn, xnsum1_12, xnsum2_12, hc_12)
3381 if(lat1<-90 .or. lat2>90)
then
3382 print*,
"at upper right i=,j=", i, j, lat, dlat,lat1,lat2
3384 call
get_xnsum2(lon1,lat1,lon2,lat2,imn,jmn,glat,
3385 & zavg,delxn, xnsum1_21, xnsum2_21, hc_21)
3392 if(lat1<-90 .or. lat2>90)
then
3393 print*,
"at lower right i=,j=", i, j, lat, dlat,lat1,lat2
3395 call
get_xnsum2(lon1,lat1,lon2,lat2,imn,jmn,glat,
3396 & zavg,delxn, xnsum1_22, xnsum2_22, hc_22)
3398 ol(i,j,3) = (xnsum1_22+xnsum1_11)/(xnsum2_22+xnsum2_11)
3399 ol(i,j,4) = (xnsum1_12+xnsum1_21)/(xnsum2_12+xnsum2_21)
3407 if(lat1<-90 .or. lat2>90)
then
3408 print*,
"at upper left i=,j=", i, j, lat, dlat,lat1,lat2
3410 call
get_xnsum3(lon1,lat1,lon2,lat2,imn,jmn,glat,
3411 & zavg,delxn, xnsum1_11, xnsum2_11, hc_11)
3418 if(lat1<-90 .or. lat2>90)
then
3419 print*,
"at lower left i=,j=", i, j, lat, dlat,lat1,lat2
3422 call
get_xnsum3(lon1,lat1,lon2,lat2,imn,jmn,glat,
3423 & zavg,delxn, xnsum1_12, xnsum2_12, hc_12)
3430 if(lat1<-90 .or. lat2>90)
then
3431 print*,
"at upper right i=,j=", i, j, lat, dlat,lat1,lat2
3433 call
get_xnsum3(lon1,lat1,lon2,lat2,imn,jmn,glat,
3434 & zavg,delxn, xnsum1_21, xnsum2_21, hc_21)
3441 if(lat1<-90 .or. lat2>90)
then
3442 print*,
"at lower right i=,j=", i, j, lat, dlat,lat1,lat2
3445 call
get_xnsum3(lon1,lat1,lon2,lat2,imn,jmn,glat,
3446 & zavg,delxn, xnsum1_22, xnsum2_22, hc_22)
3448 ol(i,j,1) = (xnsum1_11+xnsum1_21)/(xnsum2_11+xnsum2_21)
3449 ol(i,j,2) = (xnsum1_21+xnsum1_22)/(xnsum2_21+xnsum2_22)
3458 oa4(i,j,kwd) = sign( min( abs(t), 1. ), t )
3473 t = abs( oa4(i,j,kwd) )
3477 ELSE IF(t .GT. 0. .AND. t .LE. 1.)
THEN
3480 ELSE IF(t .GT. 1. .AND. t .LE. 10.)
THEN
3483 ELSE IF(t .GT. 10. .AND. t .LE. 100.)
THEN
3486 ELSE IF(t .GT. 100. .AND. t .LE. 1000.)
THEN
3489 ELSE IF(t .GT. 1000. .AND. t .LE. 10000.)
THEN
3492 ELSE IF(t .GT. 10000.)
THEN
3500 WRITE(6,*)
"! MAKEOA2 EXIT"
3516 real,
intent(in) :: theta1, phi1, theta2, phi2
3519 if(theta1 == theta2 .and. phi1 == phi2)
then
3524 dot = cos(phi1)*cos(phi2)*cos(theta1-theta2) + sin(phi1)*sin(phi2)
3525 if(dot > 1. ) dot = 1.
3526 if(dot < -1.) dot = -1.
3550 & bitmap_in,num_out, lon_out,lat_out, iindx, jindx )
3551 integer,
intent(in) :: im_in, jm_in, num_out
3552 real,
intent(in) :: geolon_in(im_in,jm_in)
3553 real,
intent(in) :: geolat_in(im_in,jm_in)
3554 logical*1,
intent(in) :: bitmap_in(im_in,jm_in)
3555 real,
intent(in) :: lon_out(num_out), lat_out(num_out)
3556 integer,
intent(out):: iindx(num_out), jindx(num_out)
3557 real,
parameter :: max_dist = 1.e+20
3558 integer,
parameter :: numnbr = 20
3559 integer :: i_c,j_c,jstart,jend
3562 print*,
"im_in,jm_in = ", im_in, jm_in
3563 print*,
"num_out = ", num_out
3564 print*,
"max and min of lon_in is", minval(geolon_in),
3566 print*,
"max and min of lat_in is", minval(geolat_in),
3568 print*,
"max and min of lon_out is", minval(lon_out),
3570 print*,
"max and min of lat_out is", minval(lat_out),
3572 print*,
"count(bitmap_in)= ", count(bitmap_in), max_dist
3581 if(lat .LE. geolat_in(1,j) .and.
3582 & lat .GE. geolat_in(1,j+1))
then
3586 if(lat > geolat_in(1,1)) j_c = 1
3587 if(lat < geolat_in(1,jm_in)) j_c = jm_in
3590 jstart = max(j_c-numnbr,1)
3591 jend = min(j_c+numnbr,jm_in)
3596 do j = jstart, jend;
do i = 1,im_in
3597 if(bitmap_in(i,j) )
then
3600 & geolon_in(i,j), geolat_in(i,j))
3602 iindx(n) = i; jindx(n) = j
3607 if(iindx(n) ==0)
then
3608 print*,
"lon,lat=", lon,lat
3609 print*,
"jstart, jend=", jstart, jend, dist
3610 print*,
"ERROR in get mismatch_index: not find nearest points"
3631 & num_out, data_out, iindx, jindx)
3632 integer,
intent(in) :: im_in, jm_in, num_out
3633 real,
intent(in) :: data_in(im_in,jm_in)
3634 real,
intent(out):: data_out(num_out)
3635 integer,
intent(in) :: iindx(num_out), jindx(num_out)
3638 data_out(n) = data_in(iindx(n),jindx(n))
3687 SUBROUTINE makeoa3(ZAVG,zslm,VAR,GLAT,OA4,OL,IOA4,ELVMAX,
3688 1 oro,slm,oro1,xnsum,xnsum1,xnsum2,xnsum3,xnsum4,
3689 2 im,jm,imn,jmn,lon_c,lat_c,lon_t,lat_t,
3690 3 is_south_pole,is_north_pole,imi,jmi,oa_in,ol_in,
3691 4 slm_in,lon_in,lat_in)
3699 real,
parameter :: missing_value = -9999.
3700 real,
parameter :: d2r = 3.14159265358979/180.
3701 real,
PARAMETER :: r2d=180./3.14159265358979
3702 integer im,jm,imn,jmn,imi,jmi
3704 INTEGER zavg(imn,jmn),zslm(imn,jmn)
3706 real oro(im,jm),oro1(im,jm),elvmax(im,jm),zmax(im,jm)
3708 integer ioa4(im,jm,4)
3709 real oa_in(imi,jmi,4), ol_in(imi,jmi,4)
3710 real slm_in(imi,jmi)
3711 real lon_in(imi,jmi), lat_in(imi,jmi)
3712 real lon_c(im+1,jm+1), lat_c(im+1,jm+1)
3713 real lon_t(im,jm), lat_t(im,jm)
3714 logical is_south_pole(im,jm), is_north_pole(im,jm)
3715 real xnsum(im,jm),xnsum1(im,jm),xnsum2(im,jm)
3716 real xnsum3(im,jm),xnsum4(im,jm)
3717 real var(im,jm),ol(im,jm,4)
3719 integer i,j,ilist(imn),numx,i1,j1,ii1
3721 real lono(4),lato(4),loni,lati
3722 real delxn,hc,height,xnpu,xnpd,t
3723 integer ns0,ns1,ns2,ns3,ns4,ns5,ns6
3725 real lon,lat,dlon,dlat,dlat_old
3726 real lon1,lat1,lon2,lat2
3727 real xnsum11,xnsum12,xnsum21,xnsum22,xnsumx
3728 real hc_11, hc_12, hc_21, hc_22
3729 real xnsum1_11,xnsum1_12,xnsum1_21,xnsum1_22
3730 real xnsum2_11,xnsum2_12,xnsum2_21,xnsum2_22
3732 integer ist, ien, jst, jen
3733 real xland,xwatr,xl1,xs1,oroavg
3734 integer int_opt, ipopt(20), kgds_input(200), kgds_output(200)
3735 integer count_land_output
3736 integer ij, ijmdl_output, iret, num_mismatch_land, num
3737 integer ibo(1), ibi(1)
3738 logical*1,
allocatable :: bitmap_input(:,:)
3739 logical*1,
allocatable :: bitmap_output(:,:)
3740 integer,
allocatable :: ijsav_land_output(:)
3741 real,
allocatable :: lats_land_output(:)
3742 real,
allocatable :: lons_land_output(:)
3743 real,
allocatable :: output_data_land(:,:)
3744 real,
allocatable :: lons_mismatch_output(:)
3745 real,
allocatable :: lats_mismatch_output(:)
3746 real,
allocatable :: data_mismatch_output(:)
3747 integer,
allocatable :: iindx(:), jindx(:)
3753 ijmdl_output = im*jm
3756 glat(j) = -90. + (j-1) * delxn + delxn * 0.5
3758 print *,
' IM=',im,
' JM=',jm,
' IMN=',imn,
' JMN=',jmn
3766 elvmax(i,j) = oro(i,j)
3774 oro1(i,j) = oro(i,j)
3775 elvmax(i,j) = zmax(i,j)
3784 hc = 1116.2 - 0.878 * var(i,j)
3785 lono(1) = lon_c(i,j)
3786 lono(2) = lon_c(i+1,j)
3787 lono(3) = lon_c(i+1,j+1)
3788 lono(4) = lon_c(i,j+1)
3789 lato(1) = lat_c(i,j)
3790 lato(2) = lat_c(i+1,j)
3791 lato(3) = lat_c(i+1,j+1)
3792 lato(4) = lat_c(i,j+1)
3793 call
get_index(imn,jmn,4,lono,lato,delxn,jst,jen,ilist,numx)
3794 do j1 = jst, jen;
do ii1 = 1, numx
3797 lati = -90 + j1*delxn
3799 & lono*d2r,lato*d2r))
then
3801 height = float(zavg(i1,j1))
3802 IF(height.LT.-990.) height = 0.0
3803 IF ( height .gt. oro(i,j) )
then
3804 if ( height .gt. zmax(i,j) )zmax(i,j) = height
3817 oro1(i,j) = oro(i,j)
3818 elvmax(i,j) = zmax(i,j)
3838 kgds_input(4) = 90000
3841 kgds_input(7) = -90000
3842 kgds_input(8) = nint(-360000./imi)
3843 kgds_input(9) = nint((360.0 / float(imi))*1000.0)
3845 kgds_input(10) = jmi /2
3846 kgds_input(12) = 255
3847 kgds_input(20) = 255
3854 kgds_output(4) = 90000
3856 kgds_output(6) = 128
3857 kgds_output(7) = -90000
3858 kgds_output(8) = nint(-360000./im)
3859 kgds_output(9) = nint((360.0 / float(im))*1000.0)
3861 kgds_output(10) = jm /2
3862 kgds_output(12) = 255
3863 kgds_output(20) = 255
3866 print*,
"sum(slm) = ", sum(slm)
3867 do ij = 1, ijmdl_output
3869 i = mod(ij-1,im) + 1
3870 if (slm(i,j) > 0.0)
then
3871 count_land_output=count_land_output+1
3874 allocate(bitmap_input(imi,jmi))
3875 bitmap_input=.false.
3876 print*,
"number of land input=", sum(slm_in)
3877 where(slm_in > 0.0) bitmap_input=.true.
3878 print*,
"count(bitmap_input)", count(bitmap_input)
3880 allocate(bitmap_output(count_land_output,1))
3881 allocate(output_data_land(count_land_output,1))
3882 allocate(ijsav_land_output(count_land_output))
3883 allocate(lats_land_output(count_land_output))
3884 allocate(lons_land_output(count_land_output))
3889 do ij = 1, ijmdl_output
3891 i = mod(ij-1,im) + 1
3892 if (slm(i,j) > 0.0)
then
3893 count_land_output=count_land_output+1
3894 ijsav_land_output(count_land_output)=ij
3895 lats_land_output(count_land_output)=lat_t(i,j)
3896 lons_land_output(count_land_output)=lon_t(i,j)
3905 bitmap_output = .false.
3906 output_data_land = 0.0
3907 call ipolates(int_opt, ipopt, kgds_input, kgds_output,
3908 & (imi*jmi), count_land_output,
3909 & 1, ibi, bitmap_input, oa_in(:,:,kwd),
3910 & count_land_output, lats_land_output,
3911 & lons_land_output, ibo,
3912 & bitmap_output, output_data_land, iret)
3914 print*,
'- ERROR IN IPOLATES ',iret
3918 num_mismatch_land = 0
3919 do ij = 1, count_land_output
3920 if (bitmap_output(ij,1))
then
3921 j = (ijsav_land_output(ij)-1)/im + 1
3922 i = mod(ijsav_land_output(ij)-1,im) + 1
3923 oa4(i,j,kwd)=output_data_land(ij,1)
3925 num_mismatch_land = num_mismatch_land + 1
3928 print*,
"num_mismatch_land = ", num_mismatch_land
3930 if(.not.
allocated(data_mismatch_output))
then
3931 allocate(lons_mismatch_output(num_mismatch_land))
3932 allocate(lats_mismatch_output(num_mismatch_land))
3933 allocate(data_mismatch_output(num_mismatch_land))
3934 allocate(iindx(num_mismatch_land))
3935 allocate(jindx(num_mismatch_land))
3938 do ij = 1, count_land_output
3939 if (.not. bitmap_output(ij,1))
then
3941 lons_mismatch_output(num) = lons_land_output(ij)
3942 lats_mismatch_output(num) = lats_land_output(ij)
3948 print*,
"before get_mismatch_index", count(bitmap_input)
3950 & lat_in*d2r,bitmap_input,num_mismatch_land,
3951 & lons_mismatch_output*d2r,lats_mismatch_output*d2r,
3955 data_mismatch_output = 0
3957 & num_mismatch_land,data_mismatch_output,iindx,jindx)
3960 do ij = 1, count_land_output
3961 if (.not. bitmap_output(ij,1))
then
3963 j = (ijsav_land_output(ij)-1)/im + 1
3964 i = mod(ijsav_land_output(ij)-1,im) + 1
3965 oa4(i,j,kwd) = data_mismatch_output(num)
3966 if(i==372 .and. j== 611)
then
3967 print*,
"ij=",ij, num, oa4(i,j,kwd),iindx(num),jindx(num)
3977 bitmap_output = .false.
3978 output_data_land = 0.0
3979 call ipolates(int_opt, ipopt, kgds_input, kgds_output,
3980 & (imi*jmi), count_land_output,
3981 & 1, ibi, bitmap_input, ol_in(:,:,kwd),
3982 & count_land_output, lats_land_output,
3983 & lons_land_output, ibo,
3984 & bitmap_output, output_data_land, iret)
3986 print*,
'- ERROR IN IPOLATES ',iret
3990 num_mismatch_land = 0
3991 do ij = 1, count_land_output
3992 if (bitmap_output(ij,1))
then
3993 j = (ijsav_land_output(ij)-1)/im + 1
3994 i = mod(ijsav_land_output(ij)-1,im) + 1
3995 ol(i,j,kwd)=output_data_land(ij,1)
3997 num_mismatch_land = num_mismatch_land + 1
4000 print*,
"num_mismatch_land = ", num_mismatch_land
4002 data_mismatch_output = 0
4004 & num_mismatch_land,data_mismatch_output,iindx,jindx)
4007 do ij = 1, count_land_output
4008 if (.not. bitmap_output(ij,1))
then
4010 j = (ijsav_land_output(ij)-1)/im + 1
4011 i = mod(ijsav_land_output(ij)-1,im) + 1
4012 ol(i,j,kwd) = data_mismatch_output(num)
4013 if(i==372 .and. j== 611)
then
4014 print*,
"ij=",ij, num, ol(i,j,kwd),iindx(num),jindx(num)
4022 deallocate(lons_mismatch_output,lats_mismatch_output)
4023 deallocate(data_mismatch_output,iindx,jindx)
4024 deallocate(bitmap_output,output_data_land)
4025 deallocate(ijsav_land_output,lats_land_output)
4026 deallocate(lons_land_output)
4032 oa4(i,j,kwd) = sign( min( abs(t), 1. ), t )
4047 t = abs( oa4(i,j,kwd) )
4051 ELSE IF(t .GT. 0. .AND. t .LE. 1.)
THEN
4054 ELSE IF(t .GT. 1. .AND. t .LE. 10.)
THEN
4057 ELSE IF(t .GT. 10. .AND. t .LE. 100.)
THEN
4060 ELSE IF(t .GT. 100. .AND. t .LE. 1000.)
THEN
4063 ELSE IF(t .GT. 1000. .AND. t .LE. 10000.)
THEN
4066 ELSE IF(t .GT. 10000.)
THEN
4074 WRITE(6,*)
"! MAKEOA3 EXIT"
4091 REAL f(im,jm), wrk(im,jm)
4101 if (ir .gt. im) ir = ir - im
4128 integer,
intent(in):: im,jm,numi(jm)
4129 real,
intent(inout):: a(im,jm)
4133 r=
real(numi(j))/
real(im)
4135 ir=mod(nint((ig-1)*r),numi(j))+1
4154 integer,
intent(in):: im,jm,numi(jm)
4155 real,
intent(inout):: a(im,jm)
4159 r=
real(numi(j))/
real(im)
4181 real a(im,jm),rmin,rmax
4192 if(a(i,j).ge.rmax)rmax=a(i,j)
4193 if(a(i,j).le.rmin)rmin=a(i,j)
4196 write(6,150)rmin,rmax,title
4197 150
format(
'rmin=',e13.4,2x,
'rmax=',e13.4,2x,a8,
' ')
4216 real a(im,jm),rmin,rmax
4217 integer i,j,im,jm,imax,jmax
4227 if(a(i,j).ge.rmax)
then
4232 if(a(i,j).le.rmin)rmin=a(i,j)
4235 write(6,150)rmin,rmax,title
4236 150
format(
'rmin=',e13.4,2x,
'rmax=',e13.4,2x,a8,
' ')
4275 SUBROUTINE spfft1(IMAX,INCW,INCG,KMAX,W,G,IDIR)
4277 INTEGER,
INTENT(IN):: imax,incw,incg,kmax,idir
4278 COMPLEX,
INTENT(INOUT):: w(incw,kmax)
4279 REAL,
INTENT(INOUT):: g(incg,kmax)
4280 REAL:: aux1(25000+int(0.82*imax))
4281 REAL:: aux2(20000+int(0.57*imax))
4282 INTEGER:: naux1,naux2
4284 naux1=25000+int(0.82*imax)
4285 naux2=20000+int(0.57*imax)
4290 SELECT CASE(digits(1.))
4292 CALL scrft(1,w,incw,g,incg,imax,kmax,-1,1.,
4293 & aux1,naux1,aux2,naux2,0.,0)
4294 CALL scrft(0,w,incw,g,incg,imax,kmax,-1,1.,
4295 & aux1,naux1,aux2,naux2,0.,0)
4297 CALL dcrft(1,w,incw,g,incg,imax,kmax,-1,1.,
4298 & aux1,naux1,aux2,naux2,0.,0)
4299 CALL dcrft(0,w,incw,g,incg,imax,kmax,-1,1.,
4300 & aux1,naux1,aux2,naux2,0.,0)
4305 SELECT CASE(digits(1.))
4307 CALL srcft(1,g,incg,w,incw,imax,kmax,+1,1./imax,
4308 & aux1,naux1,aux2,naux2,0.,0)
4309 CALL srcft(0,g,incg,w,incw,imax,kmax,+1,1./imax,
4310 & aux1,naux1,aux2,naux2,0.,0)
4312 CALL drcft(1,g,incg,w,incw,imax,kmax,+1,1./imax,
4313 & aux1,naux1,aux2,naux2,0.,0)
4314 CALL drcft(0,g,incg,w,incw,imax,kmax,+1,1./imax,
4315 & aux1,naux1,aux2,naux2,0.,0)
4327 include
'netcdf.inc'
4329 integer*2,
intent(out) :: glob(360*120,180*120)
4331 integer :: ncid, error, id_var, fsize
4335 error=nf__open(
"./topography.gmted2010.30s.nc",
4336 & nf_nowrite,fsize,ncid)
4337 call
netcdf_err(error,
'Open file topography.gmted2010.30s.nc' )
4338 error=nf_inq_varid(ncid,
'topo', id_var)
4339 call
netcdf_err(error,
'Inquire varid of topo')
4340 error=nf_get_var_int2(ncid, id_var, glob)
4342 error = nf_close(ncid)
4345 call
maxmin(glob,360*120*180*120,
'global0')
4363 integer iaamax, iaamin, len, j, m, ja, kount
4364 integer(8) sum2,std,mean,isum
4365 integer i_count_notset,kount_9
4380 if ( ja .eq. -9999 )
then
4384 if ( ja .eq. -12345 ) i_count_notset=i_count_notset+1
4386 iaamax = max0( iaamax, ja )
4387 iaamin = min0( iaamin, ja )
4398 std = ifix(sqrt(float((sum2/(kount))-mean**2)))
4399 print*,tile,
' max=',iaamax,
' min=',iaamin,
' sum=',isum,
4400 &
' i_count_notset=',i_count_notset
4401 print*,tile,
' mean=',mean,
' std.dev=',std,
4402 &
' ko9s=',kount,kount_9,kount+kount_9
4418 real(kind=4) a(im,jm),rmin,rmax,undef
4419 integer i,j,im,jm,imax,jmax,imin,jmin,iundef
4420 character*8 title,chara
4436 if(a(i,j).ge.rmax)
then
4441 if(a(i,j).le.rmin)
then
4442 if ( a(i,j) .eq. undef )
then
4452 write(6,150)chara,rmin,imin,jmin,rmax,imax,jmax,iundef
4453 150
format(1x,a8,2x,
'rmin=',e13.4,2i6,2x,
'rmax=',e13.4,3i6)
4469 integer,
intent(in) :: siz
4470 real,
intent(in) :: lon(siz), lat(siz)
4471 real,
intent(out) :: x(siz), y(siz), z(siz)
4476 x(n) = cos(lat(n))*cos(lon(n))
4477 y(n) = cos(lat(n))*sin(lon(n))
4491 real,
parameter :: epsln30 = 1.e-30
4492 real,
parameter :: pi=3.1415926535897931
4493 real v1(3), v2(3), v3(3)
4496 real px, py, pz, qx, qy, qz, ddd;
4499 px = v1(2)*v2(3) - v1(3)*v2(2)
4500 py = v1(3)*v2(1) - v1(1)*v2(3)
4501 pz = v1(1)*v2(2) - v1(2)*v2(1)
4503 qx = v1(2)*v3(3) - v1(3)*v3(2);
4504 qy = v1(3)*v3(1) - v1(1)*v3(3);
4505 qz = v1(1)*v3(2) - v1(2)*v3(1);
4507 ddd = (px*px+py*py+pz*pz)*(qx*qx+qy*qy+qz*qz);
4508 if ( ddd <= 0.0 )
then
4511 ddd = (px*qx+py*qy+pz*qz) / sqrt(ddd);
4512 if( abs(ddd-1) < epsln30 ) ddd = 1;
4513 if( abs(ddd+1) < epsln30 ) ddd = -1;
4514 if ( ddd>1. .or. ddd<-1. )
then
4541 real,
parameter :: epsln10 = 1.e-10
4542 real,
parameter :: epsln8 = 1.e-8
4543 real,
parameter :: pi=3.1415926535897931
4544 real,
parameter :: range_check_criteria=0.05
4549 real lon2(npts), lat2(npts)
4550 real x2(npts), y2(npts), z2(npts)
4551 real lon1_1d(1), lat1_1d(1)
4552 real x1(1), y1(1), z1(1)
4553 real pnt0(3),pnt1(3),pnt2(3)
4555 real max_x2,min_x2,max_y2,min_y2,max_z2,min_z2
4557 call
latlon2xyz(npts,lon2, lat2, x2, y2, z2);
4560 call
latlon2xyz(1,lon1_1d, lat1_1d, x1, y1, z1);
4563 if( x1(1) > max_x2+range_check_criteria )
return
4565 if( x1(1)+range_check_criteria < min_x2 )
return
4567 if( y1(1) > max_y2+range_check_criteria )
return
4569 if( y1(1)+range_check_criteria < min_y2 )
return
4571 if( z1(1) > max_z2+range_check_criteria )
return
4573 if( z1(1)+range_check_criteria < min_z2 )
return
4581 if(abs(x1(1)-x2(i)) < epsln10 .and.
4582 & abs(y1(1)-y2(i)) < epsln10 .and.
4583 & abs(z1(1)-z2(i)) < epsln10 )
then
4588 if(ip1>npts) ip1 = 1
4598 anglesum = anglesum + angle
4601 if(abs(anglesum-2*pi) < epsln8)
then
4635 & glat,zavg,zslm,delxn)
4640 real,
intent(in) :: lon1,lat1,lon2,lat2,delxn
4641 integer,
intent(in) :: imn,jmn
4642 real,
intent(in) :: glat(jmn)
4643 integer,
intent(in) :: zavg(imn,jmn),zslm(imn,jmn)
4644 integer i, j, ist, ien, jst, jen, i1
4646 real xland,xwatr,xl1,xs1,slm,xnsum
4649 if( glat(j) .GT. lat1 )
then
4655 if( glat(j) .GT. lat2 )
then
4662 ist = lon1/delxn + 1
4664 if(ist .le.0) ist = ist + imn
4665 if(ien < ist) ien = ien + imn
4676 do i1 = 1, ien - ist + 1
4678 if( i .LE. 0) i = i + imn
4679 if( i .GT. imn) i = i - imn
4680 xland = xland + float(zslm(i,j))
4681 xwatr = xwatr + float(1-zslm(i,j))
4683 height = float(zavg(i,j))
4684 IF(height.LT.-990.) height = 0.0
4685 xl1 = xl1 + height * float(zslm(i,j))
4686 xs1 = xs1 + height * float(1-zslm(i,j))
4689 if( xnsum > 1.)
THEN
4690 slm = float(nint(xland/xnsum))
4702 if( i .LE. 0) i = i + imn
4703 if( i .GT. imn) i = i - imn
4704 height = float(zavg(i,j))
4705 IF(height.LT.-990.) height = 0.0
4741 & glat,zavg,delxn,xnsum1,xnsum2,hc)
4744 real,
intent(out) :: xnsum1,xnsum2,hc
4746 real lon1,lat1,lon2,lat2,oro,delxn
4749 integer zavg(imn,jmn)
4750 integer i, j, ist, ien, jst, jen, i1
4752 real xw1,xw2,slm,xnsum
4755 if( glat(j) .GT. lat1 )
then
4761 if( glat(j) .GT. lat2 )
then
4768 ist = lon1/delxn + 1
4770 if(ist .le.0) ist = ist + imn
4771 if(ien < ist) ien = ien + imn
4779 do i1 = 1, ien - ist + 1
4781 if( i .LE. 0) i = i + imn
4782 if( i .GT. imn) i = i - imn
4784 height = float(zavg(i,j))
4785 IF(height.LT.-990.) height = 0.0
4787 xw2 = xw2 + height ** 2
4790 var = sqrt(max(xw2/xnsum-(xw1/xnsum)**2,0.))
4791 hc = 1116.2 - 0.878 * var
4797 if( i .LE. 0) i = i + imn
4798 if( i .GT. imn) i = i - imn
4799 height = float(zavg(i,j))
4800 IF ( height .gt. hc ) xnsum1 = xnsum1 + 1
4836 & glat,zavg,delxn,xnsum1,xnsum2,hc)
4839 real,
intent(out) :: xnsum1,xnsum2
4840 real lon1,lat1,lon2,lat2,oro,delxn
4843 integer zavg(imn,jmn)
4844 integer i, j, ist, ien, jst, jen, i1
4846 real xw1,xw2,slm,xnsum
4852 if( glat(j) .GT. lat1 )
then
4858 if( glat(j) .GT. lat2 )
then
4865 ist = lon1/delxn + 1
4867 if(ist .le.0) ist = ist + imn
4868 if(ien < ist) ien = ien + imn
4876 if( i .LE. 0) i = i + imn
4877 if( i .GT. imn) i = i - imn
4878 height = float(zavg(i,j))
4879 IF ( height .gt. hc ) xnsum1 = xnsum1 + 1
4900 integer inan1,inan2,inan3,inan4,inaq1,inaq2,inaq3,inaq4
4903 equivalence(itest,word)
4906 data inan1/x
'7F800001'/
4907 data inan2/x
'7FBFFFFF'/
4908 data inan3/x
'FF800001'/
4909 data inan4/x
'FFBFFFFF'/
4913 data inaq1/x
'7FC00000'/
4914 data inaq2/x
'7FFFFFFF'/
4915 data inaq3/x
'FFC00000'/
4916 data inaq4/x
'FFFFFFFF'/
4918 real(kind=8)a(l),rtc,t1,t2
4924 if( (itest .GE. inan1 .AND. itest .LE. inan2) .OR.
4925 * (itest .GE. inan3 .AND. itest .LE. inan4) )
then
4926 print *,
' NaNs detected at word',k,
' ',c
4929 if( (itest .GE. inaq1 .AND. itest .LE. inaq2) .OR.
4930 * (itest .GE. inaq3 .AND. itest .LE. inaq4) )
then
4931 print *,
' NaNq detected at word',k,
' ',c
4939 102
format(
' time to check ',i9,
' words is ',f10.4,
' ',a24)
4948 character(8) :: date
4949 character(10) :: time
4950 character(5) :: zone
4951 integer,
dimension(8) :: values
4954 call date_and_time(date,time,zone,values)
4955 total=(3600*values(5))+(60*values(6))
4957 elapsed=float(total) + (1.0e-3*float(values(8)))
subroutine write_mask_netcdf(im, jm, slm, land_frac, ntiles, tile, geolon, geolat)
Write the land mask file.
subroutine read_mask(merge_file, slm, land_frac, lake_frac, im, jm)
Read the land mask file.
subroutine makemt(ZAVG, ZSLM, ORO, SLM, VAR, VAR4, GLAT, IST, IEN, JST, JEN, IM, JM, IMN, JMN, XLAT, numi)
Create the orography, land-mask, standard deviation of orography and the convexity on a model gaussia...
subroutine get_index(IMN, JMN, npts, lonO, latO, DELXN, jst, jen, ilist, numx)
Determine the location of a cubed-sphere point within the high-resolution orography data...
real function timef()
Get the date/time for the system clock.
subroutine netcdf_err(err, string)
Check NetCDF error code and output the error message.
real function get_lat_angle(dy, DEGRAD)
Convert the 'y' direction distance of a cubed-sphere grid point to the corresponding distance in lati...
subroutine mnmxja(IM, JM, A, imax, jmax, title)
Print out the maximum and minimum values of an array.
subroutine makepc2(ZAVG, ZSLM, THETA, GAMMA, SIGMA, GLAT, IM, JM, IMN, JMN, lon_c, lat_c, SLM)
Make the principle coordinates - slope of orography, anisotropy, angle of mountain range with respect...
real function spherical_angle(v1, v2, v3)
Compute spherical angle.
subroutine minmaxj(IM, JM, A, title)
Print out the maximum and minimum values of an array and their i/j location.
subroutine spfft1(IMAX, INCW, INCG, KMAX, W, G, IDIR)
Perform multiple fast fourier transforms.
program lake_frac
This program computes lake fraction and depth numbers for FV3 cubed sphere grid cells, from a high resolution lat/lon data set.
subroutine rg2gg(im, jm, numi, a)
Convert from a reduced grid to a full grid.
subroutine write_netcdf(im, jm, slm, land_frac, oro, orf, hprime, ntiles, tile, geolon, geolat, lon, lat)
Write out orography file in netcdf format.
subroutine makepc(ZAVG, ZSLM, THETA, GAMMA, SIGMA, GLAT, IST, IEN, JST, JEN, IM, JM, IMN, JMN, XLAT, numi)
Make the principle coordinates - slope of orography, anisotropy, angle of mountain range with respect...
subroutine gg2rg(im, jm, numi, a)
Convert from a full grid to a reduced grid.
subroutine get_xnsum3(lon1, lat1, lon2, lat2, IMN, JMN, glat, zavg, delxn, xnsum1, xnsum2, HC)
Count the number of high-resolution orography points that are higher than a critical value inside a m...
logical function inside_a_polygon(lon1, lat1, npts, lon2, lat2)
Check if a point is inside a polygon.
real function spherical_distance(theta1, phi1, theta2, phi2)
Compute a great circle distance between two points.
subroutine nanc(a, l, c)
Report NaNS and NaNQ within an address range for 8-byte real words.
subroutine makeoa3(ZAVG, zslm, VAR, GLAT, OA4, OL, IOA4, ELVMAX, ORO, SLM, oro1, XNSUM, XNSUM1, XNSUM2, XNSUM3, XNSUM4, IM, JM, IMN, JMN, lon_c, lat_c, lon_t, lat_t, is_south_pole, is_north_pole, IMI, JMI, OA_IN, OL_IN, slm_in, lon_in, lat_in)
Create orographic asymmetry and orographic length scale on the model grid.
subroutine get_mismatch_index(im_in, jm_in, geolon_in, geolat_in, bitmap_in, num_out, lon_out, lat_out, iindx, jindx)
For unmapped land points, find the nearest land point on the input data and pass back its i/j index...
subroutine make_mask(zslm, SLM, land_frac, GLAT, IM, JM, IMN, JMN, lon_c, lat_c)
Create the land-mask, land fraction.
subroutine maxmin(ia, len, tile)
Print the maximum, mininum, mean and standard deviation of an array.
subroutine makemt2(ZAVG, ZSLM, ORO, SLM, VAR, VAR4, GLAT, IM, JM, IMN, JMN, lon_c, lat_c, lake_frac, land_frac)
Create the orography, land-mask, land fraction, standard deviation of orography and the convexity on ...
subroutine interpolate_mismatch(im_in, jm_in, data_in, num_out, data_out, iindx, jindx)
Replace unmapped model land points with the nearest land point on the input grid. ...
real function get_lon_angle(dx, lat, DEGRAD)
Convert the 'x' direction distance of a cubed-sphere grid point to the corresponding distance in long...
subroutine get_xnsum2(lon1, lat1, lon2, lat2, IMN, JMN, glat, zavg, delxn, xnsum1, xnsum2, HC)
Count the number of high-resolution orography points that are higher than a critical value inside a m...
subroutine revers(IM, JM, numi, F, WRK)
Reverse the east-west and north-south axes in a two-dimensional array.
subroutine makeoa2(ZAVG, zslm, VAR, GLAT, OA4, OL, IOA4, ELVMAX, ORO, oro1, XNSUM, XNSUM1, XNSUM2, XNSUM3, XNSUM4, IM, JM, IMN, JMN, lon_c, lat_c, lon_t, lat_t, dx, dy, is_south_pole, is_north_pole)
Create orographic asymmetry and orographic length scale on the model grid.
subroutine latlon2xyz(siz, lon, lat, x, y, z)
Convert from latitude and longitude to x,y,z coordinates.
subroutine minmxj(IM, JM, A, title)
Print out the maximum and minimum values of an array.
subroutine makeoa(ZAVG, VAR, GLAT, OA4, OL, IOA4, ELVMAX, ORO, oro1, XNSUM, XNSUM1, XNSUM2, XNSUM3, XNSUM4, IST, IEN, JST, JEN, IM, JM, IMN, JMN, XLAT, numi)
Create orographic asymmetry and orographic length scale on the model grid.
subroutine tersub(IMN, JMN, IM, JM, NM, NR, NF0, NF1, NW, EFAC, BLAT, OUTGRID, INPUTOROG, MASK_ONLY, MERGE_FILE)
Driver routine to compute terrain.
real function get_xnsum(lon1, lat1, lon2, lat2, IMN, JMN, glat, zavg, zslm, delxn)
Count the number of high-resolution orography points that are higher than the model grid box average ...
subroutine read_g(glob)
Read input global 30-arc second orography data.