78 logical fexist, opened
79 integer fsize, ncid, error, id_dim, nx, ny
80 character(len=256) :: outgrid =
"none"
81 character(len=256) :: inputorog =
"none"
82 character(len=256) :: merge_file =
"none"
83 logical :: mask_only = .false.
84 integer :: mtnres,im,jm,nm,nr,nf0,nf1,efac,blat,nw
86 READ(5,*) mtnres,im,jm,nm,nr,nf0,nf1,efac,blat
102 print*,
"INPUTOROG=", trim(inputorog)
103 print*,
"IM,JM=", im, jm
104 print*,
"MASK_ONLY", mask_only
105 print*,
"MERGE_FILE", trim(merge_file)
113 print*, mtnres,im,jm,nm,nr,nf0,nf1,efac,blat
114 nw=(nm+1)*((nr+1)*nm+2)
117 print *,
' Starting terr12 mtnlm7_slm30.f IMN,JMN:',imn,jmn
120 if( trim(outgrid) .NE.
"none" )
then
121 inquire(file=trim(outgrid), exist=fexist)
122 if(.not. fexist)
then
123 print*,
"file "//trim(outgrid)//
" does not exist"
127 inquire( ncid,opened=opened )
128 if( .NOT.opened )
exit
131 print*,
"outgrid=", trim(outgrid)
132 error=nf__open(trim(outgrid),nf_nowrite,fsize,ncid)
133 call
netcdf_err(error,
'Open file '//trim(outgrid) )
134 error=nf_inq_dimid(ncid,
'nx', id_dim)
135 call
netcdf_err(error,
'inquire dimension nx from file '//
137 error=nf_inq_dimlen(ncid,id_dim,nx)
138 call
netcdf_err(error,
'inquire dimension nx length '//
139 &
'from file '//trim(outgrid) )
141 error=nf_inq_dimid(ncid,
'ny', id_dim)
142 call
netcdf_err(error,
'inquire dimension ny from file '//
144 error=nf_inq_dimlen(ncid,id_dim,ny)
145 call
netcdf_err(error,
'inquire dimension ny length '//
146 &
'from file '//trim(outgrid) )
148 if(im .ne. nx/2)
then
149 print*,
"IM=",im,
" /= grid file nx/2=",nx/2
150 print*,
"Set IM = ", nx/2
153 if(jm .ne. ny/2)
then
154 print*,
"JM=",jm,
" /= grid file ny/2=",ny/2
155 print*,
"Set JM = ", ny/2
159 call
netcdf_err(error,
'close file '//trim(outgrid) )
163 CALL
tersub(imn,jmn,im,jm,nm,nr,nf0,nf1,nw,efac,blat,
164 & outgrid,inputorog,mask_only,merge_file)
190 SUBROUTINE tersub(IMN,JMN,IM,JM,NM,NR,NF0,NF1,NW,EFAC,BLAT,
191 & outgrid,inputorog,mask_only,merge_file)
195 integer :: imn,jmn,im,jm,nm,nr,nf0,nf1,nw
196 character(len=*),
intent(in) :: outgrid
197 character(len=*),
intent(in) :: inputorog
198 character(len=*),
intent(in) :: merge_file
200 logical,
intent(in) :: mask_only
202 real,
parameter :: missing_value=-9999.
203 real,
PARAMETER :: pi=3.1415926535897931
204 integer,
PARAMETER :: nmt=14
206 integer :: efac,blat,zsave1,zsave2,itopo,kount
207 integer :: kount2,islmx,jslmx,oldslm,msksrc,mskocn,notocn
208 integer :: i,j,nx,ny,ncid,js,jn,iw,ie,k,it,jt,i1,error,id_dim
209 integer :: id_var,nx_in,ny_in,fsize,wgta,in,inw,ine,is,isw,ise
210 integer :: m,n,imt,iret,ios,iosg,latg2,istat,itest,jtest
211 integer :: i_south_pole,j_south_pole,i_north_pole,j_north_pole
212 integer :: maxc3,maxc4,maxc5,maxc6,maxc7,maxc8
216 integer,
allocatable :: jst(:),jen(:),kpds(:),kgds(:),numi(:)
217 integer,
allocatable :: lonsperlat(:)
219 integer,
allocatable :: ist(:,:),ien(:,:),zslmx(:,:)
220 integer,
allocatable :: zavg(:,:),zslm(:,:)
221 integer(1),
allocatable :: umd(:,:)
222 integer(2),
allocatable :: glob(:,:)
224 integer,
allocatable :: iwork(:,:,:)
226 real :: degrad,maxlat, minlat,
timef,tbeg,tend,tbeg1
227 real :: phi,delxn,rs,rn,slma,oroa,vara,var4a,xn,xs,fff,www
228 real :: sumdif,avedif
230 real,
allocatable :: cosclt(:),wgtclt(:),rclt(:),xlat(:),diffx(:)
231 real,
allocatable :: xlon(:),ors(:),oaa(:),ola(:),glat(:)
233 real,
allocatable :: geolon(:,:),geolon_c(:,:),dx(:,:)
234 real,
allocatable :: geolat(:,:),geolat_c(:,:),dy(:,:)
235 real,
allocatable :: slm(:,:),oro(:,:),var(:,:),orf(:,:)
236 real,
allocatable :: land_frac(:,:),
lake_frac(:,:)
237 real,
allocatable :: theta(:,:),gamma(:,:),sigma(:,:),elvmax(:,:)
238 real,
allocatable :: var4(:,:),slmi(:,:)
239 real,
allocatable :: work1(:,:),work2(:,:),work3(:,:),work4(:,:)
240 real,
allocatable :: work5(:,:),work6(:,:)
241 real,
allocatable :: tmpvar(:,:)
242 real,
allocatable :: slm_in(:,:), lon_in(:,:), lat_in(:,:)
243 real(4),
allocatable:: gice(:,:),oclsm(:,:)
245 real,
allocatable :: oa(:,:,:),ol(:,:,:),hprime(:,:,:)
246 real,
allocatable :: oa_in(:,:,:), ol_in(:,:,:)
249 complex :: ffj(im/2+1)
251 logical :: grid_from_file,output_binary,fexist,opened
252 logical :: spectr, revlat, filter
254 logical :: is_south_pole(im,jm), is_north_pole(im,jm)
257 output_binary = .false.
262 allocate (jst(jm),jen(jm),kpds(200),kgds(200),numi(jm))
263 allocate (lonsperlat(jm/2))
264 allocate (ist(im,jm),ien(im,jm),zslmx(2700,1350))
265 allocate (glob(imn,jmn))
268 allocate (cosclt(jm),wgtclt(jm),rclt(jm),xlat(jm),diffx(jm/2))
269 allocate (xlon(im),ors(nw),oaa(4),ola(4),glat(jmn))
271 allocate (zavg(imn,jmn))
272 allocate (zslm(imn,jmn))
273 allocate (umd(imn,jmn))
291 print *,
' In TERSUB, ITOPO=',itopo
292 if (mskocn .eq. 1)
then
293 print *,
' Ocean Model LSM Present and '
294 print *,
' Overrides OCEAN POINTS in LSM: mskocn=',mskocn
295 if (notocn .eq. 1)
then
296 print *,
' Ocean LSM Reversed: NOTOCN=',notocn
314 IF (msksrc .eq. 0 )
then
315 READ(14,12,iostat=ios) zslmx
319 print *,
' navy10 lake mask rd fail -- ios,MSKSRC:',ios,msksrc
322 print *,
' Attempt to open/read UMD 30" slmsk MSKSRC=',msksrc
328 open(10,file=
"landcover30.fixed",
329 & recl=43200*21600, access=
'direct',iostat=istat)
333 print *,
' UMD lake mask open failed -- ios,MSKSRC:',istat,msksrc
336 read(10, rec=1,iostat=istat) umd
337 print *,
' UMD lake mask opened OK -- ios,MSKSRC:',istat,msksrc
343 print *,
' UMD lake mask rd err -- trying navy 10',istat
345 print *,
' ***** MSKSRC set to 0 MSKSRC=',msksrc
346 if (msksrc .eq. 0 )
then
347 READ(14,12,iostat=ios) zslmx
350 print *,
' navy10 lake mask rd fail - ios,MSKSRC:',ios,msksrc
354 print *,
' UMD lake, UMD(50,50)=',umd(50,50),msksrc
362 print *,
' About to call read_g, ITOPO=',itopo
363 if ( itopo .ne. 0 ) call
read_g(glob,itopo)
382 print *,
' After read_g, glob(500,500)=',glob(500,500)
386 print*,
' IM, JM, NM, NR, NF0, NF1, EFAC, BLAT'
387 print*, im,jm,nm,nr,nf0,nf1,efac,blat
388 print *,
' imn,jmn,glob(imn,jmn)=',imn,jmn,glob(imn,jmn)
389 print *,
' UBOUND ZAVG=',ubound(zavg)
390 print *,
' UBOUND glob=',ubound(glob)
391 print *,
' UBOUND ZSLM=',ubound(zslm)
392 print *,
' UBOUND GICE=',imn+1,3601
393 print *,
' UBOUND OCLSM=',im,jm
427 if ( umd(i,j) .eq. 0 ) zslm(i,j) = 0
435 print *,
' NAVY 10 (8) slmsk for lakes, MSKSRC=',msksrc
443 if ( glob(i,j) .eq. -9999 )
then
449 if ( zslmx(islmx,jslmx) .eq. 0 )
then
450 if ( j .gt. 8 .and. j .lt. jmn-8 )
then
451 if (i1 .gt. imn ) i1 = i1 - imn
453 if(zslm(i,j).eq.1 .and. oldslm .eq. 1 .and. zslm(i1,j).eq.1)
then
454 if (i .ne. 1) oldslm = zslm(i,j)
465 print *,
' ***** set slm from 30" glob, MSKSRC=',msksrc
472 if ( glob(i,j) .eq. -9999 )
then
480 deallocate (zslmx,umd,glob)
495 read(20,*,iostat=ios) latg2,lonsperlat
496 if(ios.ne.0.or.2*latg2.ne.jm)
then
500 print *,ios,latg2,
'COMPUTE TERRAIN ON A FULL GAUSSIAN GRID'
503 numi(j)=lonsperlat(j)
506 numi(j)=lonsperlat(jm+1-j)
508 print *,ios,latg2,
'COMPUTE TERRAIN ON A REDUCED GAUSSIAN GRID',
518 print *,
' SPECTR=',spectr,
' REVLAT=',revlat,
' ** with GICE-07 **'
520 CALL splat(4,jm,cosclt,wgtclt)
522 rclt(j) = acos(cosclt(j))
525 phi = rclt(j) * degrad
527 xlat(jm-j+1) = phi - 90.
530 CALL splat(0,jm,cosclt,wgtclt)
532 rclt(j) = acos(cosclt(j))
533 xlat(j) = 90.0 - rclt(j) * degrad
537 allocate (gice(imn+1,3601))
541 diffx(j) = xlat(j) - xlat(j-1)
542 sumdif = sumdif + diffx(j)
544 avedif=sumdif/(float(jm/2))
548 write (6,106) (xlat(j),j=jm,1,-1)
549 106
format( 10(f7.3,1x))
550 107
format( 10(f9.5,1x))
555 glat(j) = -90. + (j-1) * delxn + delxn * 0.5
558 &
' Before GICE ZAVG(1,2)=',zavg(1,2),zslm(1,2)
560 &
' Before GICE ZAVG(1,12)=',zavg(1,12),zslm(1,12)
562 &
' Before GICE ZAVG(1,52)=',zavg(1,52),zslm(1,52)
564 &
' Before GICE ZAVG(1,112)=',zavg(1,jmn-112),zslm(1,112)
568 READ(15,iostat=iosg) gice
569 if(iosg .ne. 0 )
then
570 print *,
' *** Err on reading GICE record, iosg=',iosg
571 print *,
' exec continues but NO GICE correction done '
574 print *,
' GICE 30" Antarctica RAMP orog 43200x3616 read OK'
575 print *,
' Processing! '
576 print *,
' Processing! '
577 print *,
' Processing! '
582 if( gice(i,j) .ne. -99. .and. gice(i,j) .ne. -1.0 )
then
583 if ( gice(i,j) .gt. 0.)
then
584 zavg(i,j) = int( gice(i,j) + 0.5 )
590 152
format(1x,
' ZAVG(i=',i4,
' j=',i4,
')=',i5,i3,
591 &
' orig:',i5,i4,
' Lat=',f7.3,f8.2,
'E',
' GICE=',f8.1)
598 allocate (oclsm(im,jm),slmi(im,jm))
605 if (mskocn .eq. 1)
then
609 open(25,form=
'formatted',iostat=istat)
612 print *,
' Ocean lsm file Open failure: mskocn,istat=',mskocn,istat
615 print *,
' Ocean lsm file Opened OK: mskocn,istat=',mskocn,istat
621 read(25,*,iostat=ios)oclsm
626 print *,
' Rd fail: Ocean lsm - continue, mskocn,ios=',mskocn,ios
629 print *,
' Rd OK: ocean lsm: mskocn,ios=',mskocn,ios
633 if ( mskocn .eq. 1 )
then
636 if ( notocn .eq. 0 )
then
637 slmi(i,j) = float(nint(oclsm(i,j)))
639 if ( nint(oclsm(i,j)) .eq. 0)
then
647 print *,
' OCLSM',oclsm(1,1),oclsm(50,50),oclsm(75,75),oclsm(im,jm)
648 print *,
' SLMI:',slmi(1,1),slmi(50,50),slmi(75,75),slmi(im,jm)
656 print *,
' Not using Ocean model land sea mask'
659 if (mskocn .eq. 1)
then
660 print *,
' LSM:',oclsm(1,1),oclsm(50,50),oclsm(75,75),oclsm(im,jm)
663 allocate (geolon(im,jm),geolon_c(im+1,jm+1),dx(im,jm))
664 allocate (geolat(im,jm),geolat_c(im+1,jm+1),dy(im,jm))
665 allocate (slm(im,jm),oro(im,jm),var(im,jm),var4(im,jm))
666 allocate (land_frac(im,jm),
lake_frac(im,jm))
669 grid_from_file = .false.
670 is_south_pole = .false.
671 is_north_pole = .false.
676 if( trim(outgrid) .NE.
"none" )
then
677 grid_from_file = .true.
678 inquire(file=trim(outgrid), exist=fexist)
679 if(.not. fexist)
then
680 print*,
"file "//trim(outgrid)//
" does not exist"
684 inquire( ncid,opened=opened )
685 if( .NOT.opened )
exit
688 print*,
"outgrid=", trim(outgrid)
689 error=nf__open(trim(outgrid),nf_nowrite,fsize,ncid)
690 call
netcdf_err(error,
'Open file '//trim(outgrid) )
691 error=nf_inq_dimid(ncid,
'nx', id_dim)
692 call
netcdf_err(error,
'inquire dimension nx from file '//
715 print*,
"Read the grid from file "//trim(outgrid)
717 allocate(tmpvar(nx+1,ny+1))
719 error=nf_inq_varid(ncid,
'x', id_var)
720 call
netcdf_err(error,
'inquire varid of x from file '
722 error=nf_get_var_double(ncid, id_var, tmpvar)
723 call
netcdf_err(error,
'inquire data of x from file '
726 do j = 1,ny+1;
do i = 1,nx+1
727 if(tmpvar(i,j) .NE. missing_value)
then
728 if(tmpvar(i,j) .GT. 360) tmpvar(i,j) = tmpvar(i,j) - 360
729 if(tmpvar(i,j) .LT. 0) tmpvar(i,j) = tmpvar(i,j) + 360
733 geolon(1:im,1:jm) = tmpvar(2:nx:2,2:ny:2)
734 geolon_c(1:im+1,1:jm+1) = tmpvar(1:nx+1:2,1:ny+1:2)
736 error=nf_inq_varid(ncid,
'y', id_var)
737 call
netcdf_err(error,
'inquire varid of y from file '
739 error=nf_get_var_double(ncid, id_var, tmpvar)
740 call
netcdf_err(error,
'inquire data of y from file '
742 geolat(1:im,1:jm) = tmpvar(2:nx:2,2:ny:2)
743 geolat_c(1:im+1,1:jm+1) = tmpvar(1:nx+1:2,1:ny+1:2)
752 do j = 1, ny+1;
do i = 1, nx+1
753 if( tmpvar(i,j) > maxlat )
then
758 if( tmpvar(i,j) < minlat )
then
765 if(maxlat < 89.9 )
then
769 if(minlat > -89.9 )
then
773 print*,
"minlat=", minlat,
"maxlat=", maxlat
774 print*,
"north pole supergrid index is ",
775 & i_north_pole, j_north_pole
776 print*,
"south pole supergrid index is ",
777 & i_south_pole, j_south_pole
780 if(i_south_pole >0 .and. j_south_pole > 0)
then
781 if(mod(i_south_pole,2)==0)
then
782 do j = 1, jm;
do i = 1, im
783 if(i==i_south_pole/2 .and. (j==j_south_pole/2
784 & .or. j==j_south_pole/2+1) )
then
785 is_south_pole(i,j) = .true.
786 print*,
"south pole at i,j=", i, j
790 do j = 1, jm;
do i = 1, im
791 if((i==i_south_pole/2 .or. i==i_south_pole/2+1)
792 & .and. (j==j_south_pole/2 .or.
793 & j==j_south_pole/2+1) )
then
794 is_south_pole(i,j) = .true.
795 print*,
"south pole at i,j=", i, j
800 if(i_north_pole >0 .and. j_north_pole > 0)
then
801 if(mod(i_north_pole,2)==0)
then
802 do j = 1, jm;
do i = 1, im
803 if(i==i_north_pole/2 .and. (j==j_north_pole/2 .or.
804 & j==j_north_pole/2+1) )
then
805 is_north_pole(i,j) = .true.
806 print*,
"north pole at i,j=", i, j
810 do j = 1, jm;
do i = 1, im
811 if((i==i_north_pole/2 .or. i==i_north_pole/2+1)
812 & .and. (j==j_north_pole/2 .or.
813 & j==j_north_pole/2+1) )
then
814 is_north_pole(i,j) = .true.
815 print*,
"north pole at i,j=", i, j
822 allocate(tmpvar(nx,ny))
823 error=nf_inq_varid(ncid,
'area', id_var)
824 call
netcdf_err(error,
'inquire varid of area from file '
826 error=nf_get_var_double(ncid, id_var, tmpvar)
827 call
netcdf_err(error,
'inquire data of area from file '
832 dx(i,j) = sqrt(tmpvar(2*i-1,2*j-1)+tmpvar(2*i,2*j-1)
833 & +tmpvar(2*i-1,2*j )+tmpvar(2*i,2*j ))
859 write(6,*)
' Timer 1 time= ',tend-tbeg
861 if(grid_from_file)
then
864 IF (merge_file ==
'none')
then
866 & im,jm,imn,jmn,geolon_c,geolat_c)
869 print*,
'got here - read in external mask ',merge_file
874 print*,
'got here computing mask only.'
882 CALL
makemt2(zavg,zslm,oro,slm,var,var4,glat,
883 & im,jm,imn,jmn,geolon_c,geolat_c,
lake_frac,land_frac)
886 write(6,*)
' MAKEMT2 time= ',tend-tbeg
888 CALL
makemt(zavg,zslm,oro,slm,var,var4,glat,
889 & ist,ien,jst,jen,im,jm,imn,jmn,xlat,numi)
892 call
minmxj(im,jm,oro,
' ORO')
893 call
minmxj(im,jm,slm,
' SLM')
894 call
minmxj(im,jm,var,
' VAR')
895 call
minmxj(im,jm,var4,
' VAR4')
916 allocate (theta(im,jm),gamma(im,jm),sigma(im,jm),elvmax(im,jm))
917 if(grid_from_file)
then
919 CALL
makepc2(zavg,zslm,theta,gamma,sigma,glat,
920 1 im,jm,imn,jmn,geolon_c,geolat_c,slm)
922 write(6,*)
' MAKEPC2 time= ',tend-tbeg
924 CALL
makepc(zavg,zslm,theta,gamma,sigma,glat,
925 1 ist,ien,jst,jen,im,jm,imn,jmn,xlat,numi)
928 call
minmxj(im,jm,theta,
' THETA')
929 call
minmxj(im,jm,gamma,
' GAMMA')
930 call
minmxj(im,jm,sigma,
' SIGMA')
939 allocate (iwork(im,jm,4))
940 allocate (oa(im,jm,4),ol(im,jm,4),hprime(im,jm,14))
941 allocate (work1(im,jm),work2(im,jm),work3(im,jm),work4(im,jm))
942 allocate (work5(im,jm),work6(im,jm))
944 call
minmxj(im,jm,oro,
' ORO')
945 print*,
"inputorog=", trim(inputorog)
946 if(grid_from_file)
then
947 if(trim(inputorog) ==
"none")
then
948 print*,
"calling MAKEOA2 to compute OA, OL"
950 CALL
makeoa2(zavg,zslm,var,glat,oa,ol,iwork,elvmax,oro,
951 1 work1,work2,work3,work4,work5,work6,
952 2 im,jm,imn,jmn,geolon_c,geolat_c,
953 3 geolon,geolat,dx,dy,is_south_pole,is_north_pole)
955 write(6,*)
' MAKEOA2 time= ',tend-tbeg
958 error=nf__open(trim(inputorog),nf_nowrite,fsize,ncid)
959 call
netcdf_err(error,
'Open file '//trim(inputorog) )
960 error=nf_inq_dimid(ncid,
'lon', id_dim)
961 call
netcdf_err(error,
'inquire dimension lon from file '//
963 error=nf_inq_dimlen(ncid,id_dim,nx_in)
964 call
netcdf_err(error,
'inquire dimension lon length '//
965 &
'from file '//trim(inputorog) )
966 error=nf_inq_dimid(ncid,
'lat', id_dim)
967 call
netcdf_err(error,
'inquire dimension lat from file '//
969 error=nf_inq_dimlen(ncid,id_dim,ny_in)
970 call
netcdf_err(error,
'inquire dimension lat length '//
971 &
'from file '//trim(inputorog) )
973 print*,
"extrapolate OA, OL from Gaussian grid with nx=",
974 & nx_in,
", ny=", ny_in
975 allocate(oa_in(nx_in,ny_in,4), ol_in(nx_in,ny_in,4))
976 allocate(slm_in(nx_in,ny_in) )
977 allocate(lon_in(nx_in,ny_in), lat_in(nx_in,ny_in) )
979 error=nf_inq_varid(ncid,
'oa1', id_var)
980 call
netcdf_err(error,
'inquire varid of oa1 from file '
981 & //trim(inputorog) )
982 error=nf_get_var_double(ncid, id_var, oa_in(:,:,1))
983 call
netcdf_err(error,
'inquire data of oa1 from file '
984 & //trim(inputorog) )
985 error=nf_inq_varid(ncid,
'oa2', id_var)
986 call
netcdf_err(error,
'inquire varid of oa2 from file '
987 & //trim(inputorog) )
988 error=nf_get_var_double(ncid, id_var, oa_in(:,:,2))
989 call
netcdf_err(error,
'inquire data of oa2 from file '
990 & //trim(inputorog) )
991 error=nf_inq_varid(ncid,
'oa3', id_var)
992 call
netcdf_err(error,
'inquire varid of oa3 from file '
993 & //trim(inputorog) )
994 error=nf_get_var_double(ncid, id_var, oa_in(:,:,3))
995 call
netcdf_err(error,
'inquire data of oa3 from file '
996 & //trim(inputorog) )
997 error=nf_inq_varid(ncid,
'oa4', id_var)
998 call
netcdf_err(error,
'inquire varid of oa4 from file '
999 & //trim(inputorog) )
1000 error=nf_get_var_double(ncid, id_var, oa_in(:,:,4))
1001 call
netcdf_err(error,
'inquire data of oa4 from file '
1002 & //trim(inputorog) )
1004 error=nf_inq_varid(ncid,
'ol1', id_var)
1005 call
netcdf_err(error,
'inquire varid of ol1 from file '
1006 & //trim(inputorog) )
1007 error=nf_get_var_double(ncid, id_var, ol_in(:,:,1))
1008 call
netcdf_err(error,
'inquire data of ol1 from file '
1009 & //trim(inputorog) )
1010 error=nf_inq_varid(ncid,
'ol2', id_var)
1011 call
netcdf_err(error,
'inquire varid of ol2 from file '
1012 & //trim(inputorog) )
1013 error=nf_get_var_double(ncid, id_var, ol_in(:,:,2))
1014 call
netcdf_err(error,
'inquire data of ol2 from file '
1015 & //trim(inputorog) )
1016 error=nf_inq_varid(ncid,
'ol3', id_var)
1017 call
netcdf_err(error,
'inquire varid of ol3 from file '
1018 & //trim(inputorog) )
1019 error=nf_get_var_double(ncid, id_var, ol_in(:,:,3))
1020 call
netcdf_err(error,
'inquire data of ol3 from file '
1021 & //trim(inputorog) )
1022 error=nf_inq_varid(ncid,
'ol4', id_var)
1023 call
netcdf_err(error,
'inquire varid of ol4 from file '
1024 & //trim(inputorog) )
1025 error=nf_get_var_double(ncid, id_var, ol_in(:,:,4))
1026 call
netcdf_err(error,
'inquire data of ol4 from file '
1027 & //trim(inputorog) )
1029 error=nf_inq_varid(ncid,
'slmsk', id_var)
1030 call
netcdf_err(error,
'inquire varid of slmsk from file '
1031 & //trim(inputorog) )
1032 error=nf_get_var_double(ncid, id_var, slm_in)
1033 call
netcdf_err(error,
'inquire data of slmsk from file '
1034 & //trim(inputorog) )
1036 error=nf_inq_varid(ncid,
'geolon', id_var)
1037 call
netcdf_err(error,
'inquire varid of geolon from file '
1038 & //trim(inputorog) )
1039 error=nf_get_var_double(ncid, id_var, lon_in)
1040 call
netcdf_err(error,
'inquire data of geolon from file '
1041 & //trim(inputorog) )
1043 error=nf_inq_varid(ncid,
'geolat', id_var)
1044 call
netcdf_err(error,
'inquire varid of geolat from file '
1045 & //trim(inputorog) )
1046 error=nf_get_var_double(ncid, id_var, lat_in)
1047 call
netcdf_err(error,
'inquire data of geolat from file '
1048 & //trim(inputorog) )
1051 do j=1,ny_in;
do i=1,nx_in
1052 if(slm_in(i,j) == 2) slm_in(i,j) = 0
1055 error=nf_close(ncid)
1057 & //trim(inputorog) )
1059 print*,
"calling MAKEOA3 to compute OA, OL"
1060 CALL
makeoa3(zavg,zslm,var,glat,oa,ol,iwork,elvmax,oro,slm,
1061 1 work1,work2,work3,work4,work5,work6,
1062 2 im,jm,imn,jmn,geolon_c,geolat_c,
1063 3 geolon,geolat,is_south_pole,is_north_pole,nx_in,ny_in,
1064 4 oa_in,ol_in,slm_in,lon_in,lat_in)
1066 deallocate(oa_in,ol_in,slm_in,lon_in,lat_in)
1070 CALL
makeoa(zavg,var,glat,oa,ol,iwork,elvmax,oro,
1071 1 work1,work2,work3,work4,
1073 3 ist,ien,jst,jen,im,jm,imn,jmn,xlat,numi)
1078 deallocate (zslm,zavg)
1080 deallocate (work2,work3,work4,work5,work6)
1086 call
minmxj(im,jm,oa,
' OA')
1087 call
minmxj(im,jm,ol,
' OL')
1088 call
minmxj(im,jm,elvmax,
' ELVMAX')
1089 call
minmxj(im,jm,oro,
' ORO')
1109 if (elvmax(i,j) .gt. 3000.) maxc3 = maxc3 +1
1110 if (elvmax(i,j) .gt. 4000.) maxc4 = maxc4 +1
1111 if (elvmax(i,j) .gt. 5000.) maxc5 = maxc5 +1
1112 if (elvmax(i,j) .gt. 6000.) maxc6 = maxc6 +1
1113 if (elvmax(i,j) .gt. 7000.) maxc7 = maxc7 +1
1114 if (elvmax(i,j) .gt. 8000.) maxc8 = maxc8 +1
1117 print *,
' MAXC3:',maxc3,maxc4,maxc5,maxc6,maxc7,maxc8
1122 print *,
' ===> Replacing ELVMAX with ELVMAX-ORO <=== '
1123 print *,
' ===> if ELVMAX<=ORO replace with proxy <=== '
1124 print *,
' ===> the sum of mean orog (ORO) and std dev <=== '
1127 if (elvmax(i,j) .lt. oro(i,j) )
then
1129 elvmax(i,j) = max( 3. * var(i,j),0.)
1131 elvmax(i,j) = max( elvmax(i,j) - oro(i,j),0.)
1143 if (elvmax(i,j) .gt. 3000.) maxc3 = maxc3 +1
1144 if (elvmax(i,j) .gt. 4000.) maxc4 = maxc4 +1
1145 if (elvmax(i,j) .gt. 5000.) maxc5 = maxc5 +1
1146 if (elvmax(i,j) .gt. 6000.) maxc6 = maxc6 +1
1147 if (elvmax(i,j) .gt. 7000.) maxc7 = maxc7 +1
1148 if (elvmax(i,j) .gt. 8000.) maxc8 = maxc8 +1
1151 print *,
' after MAXC 3-6 km:',maxc3,maxc4,maxc5,maxc6
1153 call
mnmxja(im,jm,elvmax,itest,jtest,
' ELVMAX')
1158 print *,
' Testing at point (itest,jtest)=',itest,jtest
1159 print *,
' SLM(itest,jtest)=',slm(itest,jtest),itest,jtest
1160 print *,
' ORO(itest,jtest)=',oro(itest,jtest),itest,jtest
1163 IF(slm(i,j).EQ.0.)
THEN
1193 IF (merge_file ==
'none')
then
1195 msk_ocn :
if ( mskocn .eq. 1 )
then
1199 if (abs(oro(i,j)) .lt. 1. )
then
1200 slm(i,j) = slmi(i,j)
1202 if ( slmi(i,j) .eq. 1. .and. slm(i,j) .eq. 1) slm(i,j) = 1
1203 if ( slmi(i,j) .eq. 0. .and. slm(i,j) .eq. 0) slm(i,j) = 0
1204 if ( slmi(i,j) .eq. 0. .and. slm(i,j) .eq. 1) slm(i,j) = 0
1205 if ( slmi(i,j) .eq. 0. .and. slm(i,j) .eq. 0) slm(i,j) = 0
1211 print *,
' SLM(itest,jtest)=',slm(itest,jtest),itest,jtest
1212 print *,
' ORO(itest,jtest)=',oro(itest,jtest),itest,jtest
1216 IF (merge_file ==
'none')
then
1219 iso_loop :
DO j=2,jm-1
1222 rn=
REAL(numi(jn))/
REAL(numi(j))
1223 rs=
REAL(numi(js))/
REAL(numi(j))
1227 slma=slm(iw,j)+slm(ie,j)
1228 oroa=oro(iw,j)+oro(ie,j)
1229 vara=var(iw,j)+var(ie,j)
1230 var4a=var4(iw,j)+var4(ie,j)
1232 oaa(k)=oa(iw,j,k)+oa(ie,j,k)
1234 ola(k)=ol(iw,j,k)+ol(ie,j,k)
1238 IF(abs(xn-nint(xn)).LT.1.e-2)
THEN
1239 in=mod(nint(xn)-1,numi(jn))+1
1240 inw=mod(in+numi(jn)-2,numi(jn))+1
1241 ine=mod(in,numi(jn))+1
1242 slma=slma+slm(inw,jn)+slm(in,jn)+slm(ine,jn)
1243 oroa=oroa+oro(inw,jn)+oro(in,jn)+oro(ine,jn)
1244 vara=vara+var(inw,jn)+var(in,jn)+var(ine,jn)
1245 var4a=var4a+var4(inw,jn)+var4(in,jn)+var4(ine,jn)
1247 oaa(k)=oaa(k)+oa(inw,jn,k)+oa(in,jn,k)+oa(ine,jn,k)
1248 ola(k)=ola(k)+ol(inw,jn,k)+ol(in,jn,k)+ol(ine,jn,k)
1253 ine=mod(inw,numi(jn))+1
1254 slma=slma+slm(inw,jn)+slm(ine,jn)
1255 oroa=oroa+oro(inw,jn)+oro(ine,jn)
1256 vara=vara+var(inw,jn)+var(ine,jn)
1257 var4a=var4a+var4(inw,jn)+var4(ine,jn)
1259 oaa(k)=oaa(k)+oa(inw,jn,k)+oa(ine,jn,k)
1260 ola(k)=ola(k)+ol(inw,jn,k)+ol(ine,jn,k)
1265 IF(abs(xs-nint(xs)).LT.1.e-2)
THEN
1266 is=mod(nint(xs)-1,numi(js))+1
1267 isw=mod(is+numi(js)-2,numi(js))+1
1268 ise=mod(is,numi(js))+1
1269 slma=slma+slm(isw,js)+slm(is,js)+slm(ise,js)
1270 oroa=oroa+oro(isw,js)+oro(is,js)+oro(ise,js)
1271 vara=vara+var(isw,js)+var(is,js)+var(ise,js)
1272 var4a=var4a+var4(isw,js)+var4(is,js)+var4(ise,js)
1274 oaa(k)=oaa(k)+oa(isw,js,k)+oa(is,js,k)+oa(ise,js,k)
1275 ola(k)=ola(k)+ol(isw,js,k)+ol(is,js,k)+ol(ise,js,k)
1280 ise=mod(isw,numi(js))+1
1281 slma=slma+slm(isw,js)+slm(ise,js)
1282 oroa=oroa+oro(isw,js)+oro(ise,js)
1283 vara=vara+var(isw,js)+var(ise,js)
1284 var4a=var4a+var4(isw,js)+var4(ise,js)
1286 oaa(k)=oaa(k)+oa(isw,js,k)+oa(ise,js,k)
1287 ola(k)=ola(k)+ol(isw,js,k)+ol(ise,js,k)
1298 IF(slm(i,j).EQ.0..AND.slma.EQ.wgta)
THEN
1299 print
'("SEA ",2F8.0," MODIFIED TO LAND",2F8.0," AT ",2I8)',
1300 & oro(i,j),var(i,j),oroa,vara,i,j
1309 ELSEIF(slm(i,j).EQ.1..AND.slma.EQ.0.)
THEN
1310 print
'("LAND",2F8.0," MODIFIED TO SEA ",2F8.0," AT ",2I8)',
1311 & oro(i,j),var(i,j),oroa,vara,i,j
1324 print *,
' after isolated points removed'
1325 call
minmxj(im,jm,oro,
' ORO')
1327 print *,
' ORO(itest,jtest)=',oro(itest,jtest)
1328 print *,
' VAR(itest,jtest)=',var(itest,jtest)
1329 print *,
' VAR4(itest,jtest)=',var4(itest,jtest)
1330 print *,
' OA(itest,jtest,1)=',oa(itest,jtest,1)
1331 print *,
' OA(itest,jtest,2)=',oa(itest,jtest,2)
1332 print *,
' OA(itest,jtest,3)=',oa(itest,jtest,3)
1333 print *,
' OA(itest,jtest,4)=',oa(itest,jtest,4)
1334 print *,
' OL(itest,jtest,1)=',ol(itest,jtest,1)
1335 print *,
' OL(itest,jtest,2)=',ol(itest,jtest,2)
1336 print *,
' OL(itest,jtest,3)=',ol(itest,jtest,3)
1337 print *,
' OL(itest,jtest,4)=',ol(itest,jtest,4)
1338 print *,
' Testing at point (itest,jtest)=',itest,jtest
1339 print *,
' THETA(itest,jtest)=',theta(itest,jtest)
1340 print *,
' GAMMA(itest,jtest)=',gamma(itest,jtest)
1341 print *,
' SIGMA(itest,jtest)=',sigma(itest,jtest)
1342 print *,
' ELVMAX(itest,jtest)=',elvmax(itest,jtest)
1343 print *,
' EFAC=',efac
1350 oro(i,j) = oro(i,j) + efac*var(i,j)
1351 hprime(i,j,1) = var(i,j)
1352 hprime(i,j,2) = var4(i,j)
1353 hprime(i,j,3) = oa(i,j,1)
1354 hprime(i,j,4) = oa(i,j,2)
1355 hprime(i,j,5) = oa(i,j,3)
1356 hprime(i,j,6) = oa(i,j,4)
1357 hprime(i,j,7) = ol(i,j,1)
1358 hprime(i,j,8) = ol(i,j,2)
1359 hprime(i,j,9) = ol(i,j,3)
1360 hprime(i,j,10)= ol(i,j,4)
1361 hprime(i,j,11)= theta(i,j)
1362 hprime(i,j,12)= gamma(i,j)
1363 hprime(i,j,13)= sigma(i,j)
1364 hprime(i,j,14)= elvmax(i,j)
1368 call
mnmxja(im,jm,elvmax,itest,jtest,
' ELVMAX')
1377 allocate (orf(im,jm))
1378 IF ( nf1 - nf0 .eq. 0 ) filter=.false.
1379 print *,
' NF1, NF0, FILTER=',nf1,nf0,filter
1383 if(numi(j).lt.im)
then
1385 call
spfft1(numi(j),im/2+1,numi(j),1,ffj,oro(1,j),-1)
1386 call
spfft1(im,im/2+1,im,1,ffj,oro(1,j),+1)
1389 CALL sptez(nr,nm,4,im,jm,ors,oro,-1)
1391 print *,
' about to apply spectral filter '
1397 www=max(1.-fff*(n-nf0)**2,0.)
1398 ors(i+1)=ors(i+1)*www
1399 ors(i+2)=ors(i+2)*www
1405 CALL sptez(nr,nm,4,im,jm,ors,orf,+1)
1407 if(numi(j).lt.im)
then
1408 call
spfft1(im,im/2+1,im,1,ffj,orf(1,j),-1)
1409 call
spfft1(numi(j),im/2+1,numi(j),1,ffj,orf(1,j),+1)
1415 CALL
revers(im, jm, numi, slm, work1)
1416 CALL
revers(im, jm, numi, oro, work1)
1418 CALL
revers(im, jm, numi, hprime(1,1,imt), work1)
1427 call
mnmxja(im,jm,elvmax,itest,jtest,
' ELVMAX')
1428 print *,
' ELVMAX(',itest,jtest,
')=',elvmax(itest,jtest)
1429 print *,
' after spectral filter is applied'
1430 call
minmxj(im,jm,oro,
' ORO')
1431 call
minmxj(im,jm,orf,
' ORF')
1434 call
rg2gg(im,jm,numi,slm)
1435 call
rg2gg(im,jm,numi,oro)
1436 call
rg2gg(im,jm,numi,orf)
1439 call
rg2gg(im,jm,numi,hprime(1,1,imt))
1442 print *,
' after nearest neighbor interpolation applied '
1443 call
minmxj(im,jm,oro,
' ORO')
1444 call
minmxj(im,jm,orf,
' ORF')
1445 call
mnmxja(im,jm,elvmax,itest,jtest,
' ELVMAX')
1446 print *,
' ORO,ORF(itest,jtest),itest,jtest:',
1447 & oro(itest,jtest),orf(itest,jtest),itest,jtest
1448 print *,
' ELVMAX(',itest,jtest,
')=',elvmax(itest,jtest)
1454 if ( i .le. 21 .and. i .ge. 1 )
then
1455 if (j .eq. jm )
write(6,153)i,j,oro(i,j),elvmax(i,j),slm(i,j)
1456 153
format(1x,
' ORO,ELVMAX(i=',i4,
' j=',i4,
')=',2e14.5,f5.1)
1461 write(6,*)
' Timer 5 time= ',tend-tbeg
1462 if (output_binary)
then
1465 print *,
' OUTPUT BINARY FIELDS'
1466 WRITE(51)
REAL(slm,4)
1467 WRITE(52)
REAL(orf,4)
1468 WRITE(53)
REAL(hprime,4)
1469 WRITE(54)
REAL(ors,4)
1470 WRITE(55)
REAL(oro,4)
1471 WRITE(66)
REAL(theta,4)
1472 WRITE(67)
REAL(gamma,4)
1473 WRITE(68)
REAL(sigma,4)
1475 if ( mskocn .eq. 1 )
then
1477 WRITE(27,iostat=ios) oclsm
1478 print *,
' write OCLSM input:',ios
1482 call
minmxj(im,jm,oro,
' ORO')
1483 print *,
' IM=',im,
' JM=',jm,
' SPECTR=',spectr
1485 WRITE(71)
REAL(slm,4)
1487 WRITE(71)
REAL(HPRIME(:,:,IMT),4)
1488 print *,
' HPRIME(',itest,jtest,imt,
')=',hprime(itest,jtest,imt)
1490 WRITE(71)
REAL(oro,4)
1492 WRITE(71)
REAL(ORF,4)
1517 kgds(4)=90000-180000/pi*rclt(1)
1519 kgds(7)=180000/pi*rclt(1)-90000
1520 kgds(8)=-nint(360000./im)
1521 kgds(9)=nint(360000./im)
1525 CALL baopen(56,
'fort.56',iret)
1526 if (iret .ne. 0) print *,
' BAOPEN ERROR UNIT 56: IRET=',iret
1527 CALL putgb(56,im*jm,kpds,kgds,lb,slm,iret)
1528 print *,
' SLM: putgb-KPDS(22,5),iret:',kpds(22),kpds(5),iret
1529 if (iret .ne. 0) print *,
' SLM PUTGB ERROR: UNIT 56: IRET=',iret
1530 print *,
' SLM: putgb-KPDS(22,5),iret:',kpds(22),kpds(5),iret
1542 CALL baopen(57,
'fort.57',iret)
1543 CALL putgb(57,im*jm,kpds,kgds,lb,orf,iret)
1544 print *,
' ORF (ORO): putgb-KPDS(22,5),iret:',kpds(22),kpds(5),iret
1551 CALL baopen(58,
'fort.58',iret)
1552 CALL putgb(58,im*jm,kpds,kgds,lb,theta,iret)
1553 print *,
' THETA: putgb-KPDS(22,5),iret:',kpds(22),kpds(5),iret
1560 CALL baopen(60,
'fort.60',iret)
1561 CALL putgb(60,im*jm,kpds,kgds,lb,sigma,iret)
1562 print *,
' SIGMA: putgb-KPDS(22,5),iret:',kpds(22),kpds(5),iret
1569 CALL baopen(59,
'fort.59',iret)
1570 CALL putgb(59,im*jm,kpds,kgds,lb,gamma,iret)
1571 print *,
' GAMMA: putgb-KPDS(22,5),iret:',kpds(22),kpds(5),iret
1575 CALL baopen(61,
'fort.61',iret)
1576 CALL putgb(61,im*jm,kpds,kgds,lb,hprime,iret)
1577 print *,
' HPRIME: putgb-KPDS(22,5),iret:',kpds(22),kpds(5),iret
1582 CALL baopen(62,
'fort.62',iret)
1583 CALL putgb(62,im*jm,kpds,kgds,lb,elvmax,iret)
1584 print *,
' ELVMAX: putgb-KPDS(22,5),iret:',kpds(22),kpds(5),iret
1589 xlon(i) = delxn*(i-1)
1591 IF(trim(outgrid) ==
"none")
THEN
1594 geolon(i,j) = xlon(i)
1595 geolat(i,j) = xlat(j)
1600 xlat(j) = geolat(1,j)
1603 xlon(i) = geolon(i,1)
1607 write(6,*)
' Binary output time= ',tend-tbeg
1609 CALL
write_netcdf(im,jm,slm,land_frac,oro,orf,hprime,1,1,
1610 1 geolon(1:im,1:jm),geolat(1:im,1:jm), xlon,xlat)
1612 write(6,*)
' WRITE_NETCDF time= ',tend-tbeg
1613 print *,
' wrote netcdf file out.oro.tile?.nc'
1615 print *,
' ===== Deallocate Arrays and ENDING MTN VAR OROG program'
1618 deallocate(jst,jen,kpds,kgds,numi,lonsperlat)
1619 deallocate(cosclt,wgtclt,rclt,xlat,diffx,xlon,ors,oaa,ola,glat)
1623 deallocate (geolon,geolon_c,geolat,geolat_c)
1624 deallocate (slm,oro,var,orf,land_frac)
1625 deallocate (theta,gamma,sigma,elvmax)
1629 write(6,*)
' Total runtime time= ',tend-tbeg1
1662 SUBROUTINE makemt(ZAVG,ZSLM,ORO,SLM,VAR,VAR4,
1663 1 glat,ist,ien,jst,jen,im,jm,imn,jmn,xlat,numi)
1664 dimension glat(jmn),xlat(jm)
1666 INTEGER zavg(imn,jmn),zslm(imn,jmn)
1667 dimension oro(im,jm),slm(im,jm),var(im,jm),var4(im,jm)
1668 dimension ist(im,jm),ien(im,jm),jst(jm),jen(jm),numi(jm)
1669 INTEGER mskocn,isave
1677 print *,
' _____ SUBROUTINE MAKEMT '
1684 glat(j) = -90. + (j-1) * delxn + delxn * 0.5
1694 faclon = delx / delxn
1695 ist(i,j) = faclon * float(i-1) - faclon * 0.5 + 1
1696 ien(i,j) = faclon * float(i) - faclon * 0.5 + 1
1700 IF (ist(i,j) .LE. 0) ist(i,j) = ist(i,j) + imn
1701 IF (ien(i,j) .LT. ist(i,j)) ien(i,j) = ien(i,j) + imn
1710 print *,
' DELX=',delx,
' DELXN=',delxn
1714 xxlat = (xlat(j)+xlat(j+1))/2.
1715 IF(flag.AND.glat(j1).GT.xxlat)
THEN
1723 jst(jm) = max(jst(jm-1) - (jen(jm-1)-jst(jm-1)),1)
1724 jen(1) = min(jen(2) + (jen(2)-jst(2)),jmn)
1742 DO ii1 = 1, ien(i,j) - ist(i,j) + 1
1743 i1 = ist(i,j) + ii1 - 1
1744 IF(i1.LE.0.) i1 = i1 + imn
1745 IF(i1.GT.imn) i1 = i1 - imn
1752 xland = xland + float(zslm(i1,j1))
1753 xwatr = xwatr + float(1-zslm(i1,j1))
1755 height = float(zavg(i1,j1))
1757 IF(height.LT.-990.) height = 0.0
1758 xl1 = xl1 + height * float(zslm(i1,j1))
1759 xs1 = xs1 + height * float(1-zslm(i1,j1))
1761 xw2 = xw2 + height ** 2
1772 IF(xnsum.GT.1.)
THEN
1777 slm(i,j) = float(nint(xland/xnsum))
1778 IF(slm(i,j).NE.0.)
THEN
1779 oro(i,j)= xl1 / xland
1781 oro(i,j)= xs1 / xwatr
1783 var(i,j)=sqrt(max(xw2/xnsum-(xw1/xnsum)**2,0.))
1784 DO ii1 = 1, ien(i,j) - ist(i,j) + 1
1785 i1 = ist(i,j) + ii1 - 1
1786 IF(i1.LE.0.) i1 = i1 + imn
1787 IF(i1.GT.imn) i1 = i1 - imn
1789 height = float(zavg(i1,j1))
1790 IF(height.LT.-990.) height = 0.0
1791 xw4 = xw4 + (height-oro(i,j)) ** 4
1794 IF(var(i,j).GT.1.)
THEN
1798 var4(i,j) = min(xw4/xnsum/var(i,j) **4,10.)
1803 WRITE(6,*)
"! MAKEMT ORO SLM VAR VAR4 DONE"
1829 & jst,jen,ilist,numx)
1831 integer,
intent(in) :: imn,jmn
1833 real,
intent(in) :: lono(npts), lato(npts)
1834 real,
intent(in) :: delxn
1835 integer,
intent(out) :: jst,jen
1836 integer,
intent(out) :: ilist(imn)
1837 integer,
intent(out) :: numx
1838 real minlat,maxlat,minlon,maxlon
1839 integer i2, ii, ist, ien
1841 minlat = minval(lato)
1842 maxlat = maxval(lato)
1843 minlon = minval(lono)
1844 maxlon = maxval(lono)
1845 ist = minlon/delxn+1
1846 ien = maxlon/delxn+1
1847 jst = (minlat+90)/delxn+1
1848 jen = (maxlat+90)/delxn
1853 if(jen>jmn) jen = jmn
1856 if((jst == 1 .OR. jen == jmn) .and.
1857 & (ien-ist+1 > imn/2) )
then
1862 else if( ien-ist+1 > imn/2 )
then
1868 ii = lono(i2)/delxn+1
1869 if(ii <0 .or. ii>imn) print*,
"ii=",ii,imn,lono(i2),delxn
1870 if( ii < imn/2 )
then
1872 else if( ii > imn/2 )
then
1876 if(ist<1 .OR. ist>imn)
then
1877 print*, .or.
"ist<1 ist>IMN"
1880 if(ien<1 .OR. ien>imn)
then
1881 print*, .or.
"iend<1 iend>IMN"
1885 numx = imn - ien + 1
1887 ilist(i2) = ien + (i2-1)
1896 ilist(i2) = ist + (i2-1)
1918 1 glat,im,jm,imn,jmn,lon_c,lat_c)
1920 real,
parameter :: d2r = 3.14159265358979/180.
1921 integer,
parameter :: maxsum=20000000
1922 integer im, jm, imn, jmn, jst, jen
1923 real glat(jmn), glon(imn)
1924 INTEGER zslm(imn,jmn)
1925 real land_frac(im,jm)
1927 real lon_c(im+1,jm+1), lat_c(im+1,jm+1)
1928 real lono(4),lato(4),loni,lati
1929 integer jm1,i,j,nsum,nsum_all,ii,jj,numx,i2
1931 real delxn,xnsum,xland,xwatr,xl1,xs1,xw1
1932 real xnsum_all,xland_all,xwatr_all
1936 print *,
' _____ SUBROUTINE MAKE_MASK '
1943 glat(j) = -90. + (j-1) * delxn + delxn * 0.5
1946 glon(i) = 0. + (i-1) * delxn + delxn * 0.5
1949 land_frac(:,:) = 0.0
1971 lono(1) = lon_c(i,j)
1972 lono(2) = lon_c(i+1,j)
1973 lono(3) = lon_c(i+1,j+1)
1974 lono(4) = lon_c(i,j+1)
1975 lato(1) = lat_c(i,j)
1976 lato(2) = lat_c(i+1,j)
1977 lato(3) = lat_c(i+1,j+1)
1978 lato(4) = lat_c(i,j+1)
1979 call
get_index(imn,jmn,4,lono,lato,delxn,jst,jen,ilist,numx)
1980 do jj = jst, jen;
do i2 = 1, numx
1983 lati = -90 + jj*delxn
1985 xland_all = xland_all + float(zslm(ii,jj))
1986 xwatr_all = xwatr_all + float(1-zslm(ii,jj))
1987 xnsum_all = xnsum_all + 1.
1988 nsum_all = nsum_all+1
1989 if(nsum_all > maxsum)
then
1990 print*,
"nsum_all is greater than MAXSUM, increase MAXSUM"
1995 & lono*d2r,lato*d2r))
then
1997 xland = xland + float(zslm(ii,jj))
1998 xwatr = xwatr + float(1-zslm(ii,jj))
2001 if(nsum > maxsum)
then
2002 print*,
"nsum is greater than MAXSUM, increase MAXSUM"
2009 IF(xnsum.GT.1.)
THEN
2013 land_frac(i,j) = xland/xnsum
2014 slm(i,j) = float(nint(xland/xnsum))
2015 ELSEIF(xnsum_all.GT.1.)
THEN
2016 land_frac(i,j) = xland_all/xnsum _all
2017 slm(i,j) = float(nint(xland_all/xnsum_all))
2019 print*,
"no source points in MAKE_MASK"
2025 WRITE(6,*)
"! MAKE_MASK DONE"
2051 1 glat,im,jm,imn,jmn,lon_c,lat_c,
lake_frac,land_frac)
2053 real,
parameter :: d2r = 3.14159265358979/180.
2054 integer,
parameter :: maxsum=20000000
2055 real,
dimension(:),
allocatable :: hgt_1d, hgt_1d_all
2056 integer im, jm, imn, jmn
2057 real glat(jmn), glon(imn)
2058 INTEGER zavg(imn,jmn),zslm(imn,jmn)
2059 real oro(im,jm),var(im,jm),var4(im,jm)
2060 real,
intent(in) :: slm(im,jm),
lake_frac(im,jm),land_frac(im,jm)
2062 real lon_c(im+1,jm+1), lat_c(im+1,jm+1)
2063 real lono(4),lato(4),loni,lati
2065 integer jm1,i,j,nsum,nsum_all,ii,jj,i1,numx,i2
2067 real delxn,xnsum,xland,xwatr,xl1,xs1,xw1,xw2,xw4
2068 real xnsum_all,xland_all,xwatr_all,height_all
2069 real xl1_all,xs1_all,xw1_all,xw2_all,xw4_all
2075 print *,
' _____ SUBROUTINE MAKEMT2 '
2076 allocate(hgt_1d(maxsum))
2077 allocate(hgt_1d_all(maxsum))
2084 glat(j) = -90. + (j-1) * delxn + delxn * 0.5
2087 glon(i) = 0. + (i-1) * delxn + delxn * 0.5
2127 lono(1) = lon_c(i,j)
2128 lono(2) = lon_c(i+1,j)
2129 lono(3) = lon_c(i+1,j+1)
2130 lono(4) = lon_c(i,j+1)
2131 lato(1) = lat_c(i,j)
2132 lato(2) = lat_c(i+1,j)
2133 lato(3) = lat_c(i+1,j+1)
2134 lato(4) = lat_c(i,j+1)
2135 call
get_index(imn,jmn,4,lono,lato,delxn,jst,jen,ilist,numx)
2136 do jj = jst, jen;
do i2 = 1, numx
2139 lati = -90 + jj*delxn
2141 xland_all = xland_all + float(zslm(ii,jj))
2142 xwatr_all = xwatr_all + float(1-zslm(ii,jj))
2143 xnsum_all = xnsum_all + 1.
2144 height_all = float(zavg(ii,jj))
2145 nsum_all = nsum_all+1
2146 if(nsum_all > maxsum)
then
2147 print*,
"nsum_all is greater than MAXSUM, increase MAXSUM"
2150 hgt_1d_all(nsum_all) = height_all
2151 IF(height_all.LT.-990.) height_all = 0.0
2152 xl1_all = xl1_all + height_all * float(zslm(ii,jj))
2153 xs1_all = xs1_all + height_all * float(1-zslm(ii,jj))
2154 xw1_all = xw1_all + height_all
2155 xw2_all = xw2_all + height_all ** 2
2158 & lono*d2r,lato*d2r))
then
2160 xland = xland + float(zslm(ii,jj))
2161 xwatr = xwatr + float(1-zslm(ii,jj))
2163 height = float(zavg(ii,jj))
2165 if(nsum > maxsum)
then
2166 print*,
"nsum is greater than MAXSUM, increase MAXSUM"
2169 hgt_1d(nsum) = height
2170 IF(height.LT.-990.) height = 0.0
2171 xl1 = xl1 + height * float(zslm(ii,jj))
2172 xs1 = xs1 + height * float(1-zslm(ii,jj))
2174 xw2 = xw2 + height ** 2
2178 IF(xnsum.GT.1.)
THEN
2184 IF(slm(i,j) .NE. 0. .OR. land_frac(i,j) > 0.)
THEN
2186 oro(i,j)= xl1 / xland
2188 oro(i,j)= xs1 / xwatr
2192 oro(i,j)= xs1 / xwatr
2194 oro(i,j)= xl1 / xland
2198 var(i,j)=sqrt(max(xw2/xnsum-(xw1/xnsum)**2,0.))
2200 xw4 = xw4 + (hgt_1d(i1) - oro(i,j)) ** 4
2203 IF(var(i,j).GT.1.)
THEN
2204 var4(i,j) = min(xw4/xnsum/var(i,j) **4,10.)
2207 ELSEIF(xnsum_all.GT.1.)
THEN
2210 IF(slm(i,j) .NE. 0. .OR. land_frac(i,j) > 0.)
THEN
2211 IF (xland_all > 0)
THEN
2212 oro(i,j)= xl1_all / xland_all
2214 oro(i,j)= xs1_all / xwatr_all
2217 IF (xwatr_all > 0)
THEN
2218 oro(i,j)= xs1_all / xwatr_all
2220 oro(i,j)= xl1_all / xland_all
2224 var(i,j)=sqrt(max(xw2_all/xnsum_all-
2225 & (xw1_all/xnsum_all)**2,0.))
2228 & (hgt_1d_all(i1) - oro(i,j)) ** 4
2231 IF(var(i,j).GT.1.)
THEN
2232 var4(i,j) = min(xw4_all/xnsum_all/var(i,j) **4,10.)
2235 print*,
"no source points in MAKEMT2"
2241 IF (
lake_frac(i,j) .EQ. 0. .AND. land_frac(i,j) .EQ. 0.)
THEN
2248 WRITE(6,*)
"! MAKEMT2 ORO SLM VAR VAR4 DONE"
2251 deallocate(hgt_1d_all)
2283 SUBROUTINE makepc(ZAVG,ZSLM,THETA,GAMMA,SIGMA,
2284 1 glat,ist,ien,jst,jen,im,jm,imn,jmn,xlat,numi)
2288 parameter(rearth=6.3712e+6)
2289 dimension glat(jmn),xlat(jm),deltax(jmn)
2290 INTEGER zavg(imn,jmn),zslm(imn,jmn)
2291 dimension oro(im,jm),slm(im,jm),hl(im,jm),hk(im,jm)
2292 dimension hx2(im,jm),hy2(im,jm),hxy(im,jm),hlprim(im,jm)
2293 dimension theta(im,jm),gamma(im,jm),sigma2(im,jm),sigma(im,jm)
2294 dimension ist(im,jm),ien(im,jm),jst(jm),jen(jm),numi(jm)
2299 pi = 4.0 * atan(1.0)
2305 deltay = certh / float(jmn)
2306 print *,
'MAKEPC: DELTAY=',deltay
2309 glat(j) = -90. + (j-1) * delxn + delxn * 0.5
2310 deltax(j) = deltay * cos(glat(j)*pi/180.0)
2319 faclon = delx / delxn
2320 ist(i,j) = faclon * float(i-1) - faclon * 0.5
2321 ist(i,j) = ist(i,j) + 1
2322 ien(i,j) = faclon * float(i) - faclon * 0.5
2329 IF (ist(i,j) .LE. 0) ist(i,j) = ist(i,j) + imn
2330 IF (ien(i,j) .LT. ist(i,j)) ien(i,j) = ien(i,j) + imn
2332 if ( i .lt. 10 .and. j .lt. 10 )
2333 1 print*,
' I j IST IEN ',i,j,ist(i,j),ien(i,j)
2335 IF (ien(i,j) .LT. ist(i,j))
2336 1 print *,
' MAKEPC: IEN < IST: I,J,IST(I,J),IEN(I,J)',
2337 2 i,j,ist(i,j),ien(i,j)
2343 xxlat = (xlat(j)+xlat(j+1))/2.
2344 IF(flag.AND.glat(j1).GT.xxlat)
THEN
2351 jst(jm) = max(jst(jm-1) - (jen(jm-1)-jst(jm-1)),1)
2352 jen(1) = min(jen(2) + (jen(2)-jst(2)),jmn)
2354 print*,
' IST,IEN(1,1-numi(1,JM))',ist(1,1),ien(1,1),
2355 1 ist(numi(jm),jm),ien(numi(jm),jm), numi(jm)
2356 print*,
' JST,JEN(1,JM) ',jst(1),jen(1),jst(jm),jen(jm)
2385 DO ii1 = 1, ien(i,j) - ist(i,j) + 1
2386 i1 = ist(i,j) + ii1 - 1
2387 IF(i1.LE.0.) i1 = i1 + imn
2388 IF(i1.GT.imn) i1 = i1 - imn
2393 if (i1 - 1 .le. 0 ) i0 = i0 + imn
2394 if (i1 - 1 .gt. imn) i0 = i0 - imn
2397 if (i1 + 1 .le. 0 ) ip1 = ip1 + imn
2398 if (i1 + 1 .gt. imn) ip1 = ip1 - imn
2402 if ( i1 .eq. ist(i,j) .and. j1 .eq. jst(j) )
2403 1 print*,
' J, J1,IST,JST,DELTAX,GLAT ',
2404 2 j,j1,ist(i,j),jst(j),deltax(j1),glat(j1)
2405 if ( i1 .eq. ien(i,j) .and. j1 .eq. jen(j) )
2406 1 print*,
' J, J1,IEN,JEN,DELTAX,GLAT ',
2407 2 j,j1,ien(i,j),jen(j),deltax(j1),glat(j1)
2409 xland = xland + float(zslm(i1,j1))
2410 xwatr = xwatr + float(1-zslm(i1,j1))
2413 height = float(zavg(i1,j1))
2414 hi0 = float(zavg(i0,j1))
2415 hip1 = float(zavg(ip1,j1))
2417 IF(height.LT.-990.) height = 0.0
2418 if(hi0 .lt. -990.) hi0 = 0.0
2419 if(hip1 .lt. -990.) hip1 = 0.0
2421 xfp = 0.5 * ( hip1 - hi0 ) / deltax(j1)
2422 xfp2 = xfp2 + 0.25 * ( ( hip1 - hi0 )/deltax(j1) )** 2
2426 if ( j1 .ne. jst(jm) .and. j1 .ne. jen(1) )
then
2427 hj0 = float(zavg(i1,j1-1))
2428 hjp1 = float(zavg(i1,j1+1))
2429 if(hj0 .lt. -990.) hj0 = 0.0
2430 if(hjp1 .lt. -990.) hjp1 = 0.0
2432 yfp = 0.5 * ( hjp1 - hj0 ) / deltay
2433 yfp2 = yfp2 + 0.25 * ( ( hjp1 - hj0 )/deltay )**2
2439 elseif ( j1 .eq. jst(jm) )
then
2441 if (ijax .le. 0 ) ijax = ijax + imn
2442 if (ijax .gt. imn) ijax = ijax - imn
2444 hijax = float(zavg(ijax,j1))
2445 hi1j1 = float(zavg(i1,j1))
2446 if(hijax .lt. -990.) hijax = 0.0
2447 if(hi1j1 .lt. -990.) hi1j1 = 0.0
2449 yfp = 0.5 * ( ( 0.5 * ( hijax - hi1j1 ) ) )/deltay
2450 yfp2 = yfp2 + 0.25 * ( ( 0.5 * ( hijax - hi1j1) )
2456 elseif ( j1 .eq. jen(1) )
then
2458 if (ijax .le. 0 ) ijax = ijax + imn
2459 if (ijax .gt. imn) ijax = ijax - imn
2460 hijax = float(zavg(ijax,j1))
2461 hi1j1 = float(zavg(i1,j1))
2462 if(hijax .lt. -990.) hijax = 0.0
2463 if(hi1j1 .lt. -990.) hi1j1 = 0.0
2464 if ( i1 .lt. 5 )print *,
' S.Pole i1,j1 :',i1,j1,hijax,hi1j1
2466 yfp = 0.5 * (0.5 * ( hijax - hi1j1) )/deltay
2467 yfp2 = yfp2 + 0.25 * ( (0.5 * (hijax - hi1j1) )
2474 xfpyfp = xfpyfp + xfp * yfp
2475 xl1 = xl1 + height * float(zslm(i1,j1))
2476 xs1 = xs1 + height * float(1-zslm(i1,j1))
2486 IF(xnsum.GT.1.)
THEN
2487 slm(i,j) = float(nint(xland/xnsum))
2488 IF(slm(i,j).NE.0.)
THEN
2489 oro(i,j)= xl1 / xland
2490 hx2(i,j) = xfp2 / xland
2491 hy2(i,j) = yfp2 / xland
2492 hxy(i,j) = xfpyfp / xland
2494 oro(i,j)= xs1 / xwatr
2498 print *,
" I,J,i1,j1,HEIGHT:", i,j,i1,j1,height,
2500 print *,
" xfpyfp,xfp2,yfp2:",xfpyfp,xfp2,yfp2
2501 print *,
" HX2,HY2,HXY:",hx2(i,j),hy2(i,j),hxy(i,j)
2507 hk(i,j) = 0.5 * ( hx2(i,j) + hy2(i,j) )
2508 hl(i,j) = 0.5 * ( hx2(i,j) - hy2(i,j) )
2509 hlprim(i,j) = sqrt(hl(i,j)*hl(i,j) + hxy(i,j)*hxy(i,j))
2510 IF( hl(i,j).NE. 0. .AND. slm(i,j) .NE. 0. )
THEN
2512 theta(i,j) = 0.5 * atan2(hxy(i,j),hl(i,j)) * 180.0 / pi
2516 sigma2(i,j) = ( hk(i,j) + hlprim(i,j) )
2517 if ( sigma2(i,j) .GE. 0. )
then
2518 sigma(i,j) = sqrt(sigma2(i,j) )
2519 if (sigma2(i,j) .ne. 0. .and.
2520 & hk(i,j) .GE. hlprim(i,j) )
2521 1 gamma(i,j) = sqrt( (hk(i,j) - hlprim(i,j)) / sigma2(i,j) )
2527 print *,
" I,J,THETA,SIGMA,GAMMA,",i,j,theta(i,j),
2528 1 sigma(i,j),gamma(i,j)
2529 print *,
" HK,HL,HLPRIM:",hk(i,j),hl(i,j),hlprim(i,j)
2533 WRITE(6,*)
"! MAKE Principal Coord DONE"
2559 1 glat,im,jm,imn,jmn,lon_c,lat_c,slm)
2564 real,
parameter :: rearth=6.3712e+6
2565 real,
parameter :: d2r = 3.14159265358979/180.
2566 integer :: im,jm,imn,jmn
2567 real :: glat(jmn),deltax(jmn)
2568 INTEGER zavg(imn,jmn),zslm(imn,jmn)
2569 real lon_c(im+1,jm+1), lat_c(im+1,jm+1)
2570 real,
intent(in) :: slm(im,jm)
2571 real hl(im,jm),hk(im,jm)
2572 real hx2(im,jm),hy2(im,jm),hxy(im,jm),hlprim(im,jm)
2573 real theta(im,jm),gamma(im,jm),sigma2(im,jm),sigma(im,jm)
2574 real pi,certh,delxn,deltay,xnsum,xland
2575 real xfp,yfp,xfpyfp,xfp2,yfp2
2576 real hi0,hip1,hj0,hjp1,hijax,hi1j1
2577 real lono(4),lato(4),loni,lati
2578 integer i,j,i1,j1,i2,jst,jen,numx,i0,ip1,ijax
2585 pi = 4.0 * atan(1.0)
2590 deltay = certh / float(jmn)
2591 print *,
'MAKEPC2: DELTAY=',deltay
2594 glat(j) = -90. + (j-1) * delxn + delxn * 0.5
2595 deltax(j) = deltay * cos(glat(j)*d2r)
2629 lono(1) = lon_c(i,j)
2630 lono(2) = lon_c(i+1,j)
2631 lono(3) = lon_c(i+1,j+1)
2632 lono(4) = lon_c(i,j+1)
2633 lato(1) = lat_c(i,j)
2634 lato(2) = lat_c(i+1,j)
2635 lato(3) = lat_c(i+1,j+1)
2636 lato(4) = lat_c(i,j+1)
2637 call
get_index(imn,jmn,4,lono,lato,delxn,jst,jen,ilist,numx)
2639 do j1 = jst, jen;
do i2 = 1, numx
2642 lati = -90 + j1*delxn
2644 & lono*d2r,lato*d2r))
then
2649 if (i1 - 1 .le. 0 ) i0 = i0 + imn
2650 if (i1 - 1 .gt. imn) i0 = i0 - imn
2653 if (i1 + 1 .le. 0 ) ip1 = ip1 + imn
2654 if (i1 + 1 .gt. imn) ip1 = ip1 - imn
2656 xland = xland + float(zslm(i1,j1))
2659 hi0 = float(zavg(i0,j1))
2660 hip1 = float(zavg(ip1,j1))
2662 if(hi0 .lt. -990.) hi0 = 0.0
2663 if(hip1 .lt. -990.) hip1 = 0.0
2665 xfp = 0.5 * ( hip1 - hi0 ) / deltax(j1)
2666 xfp2 = xfp2 + 0.25 * ( ( hip1 - hi0 )/deltax(j1) )** 2
2670 if ( j1 .ne. 1 .and. j1 .ne. jmn )
then
2671 hj0 = float(zavg(i1,j1-1))
2672 hjp1 = float(zavg(i1,j1+1))
2673 if(hj0 .lt. -990.) hj0 = 0.0
2674 if(hjp1 .lt. -990.) hjp1 = 0.0
2676 yfp = 0.5 * ( hjp1 - hj0 ) / deltay
2677 yfp2 = yfp2 + 0.25 * ( ( hjp1 - hj0 )/deltay )**2
2683 elseif ( j1 .eq. 1 )
then
2685 if (ijax .le. 0 ) ijax = ijax + imn
2686 if (ijax .gt. imn) ijax = ijax - imn
2688 hijax = float(zavg(ijax,j1))
2689 hi1j1 = float(zavg(i1,j1))
2690 if(hijax .lt. -990.) hijax = 0.0
2691 if(hi1j1 .lt. -990.) hi1j1 = 0.0
2693 yfp = 0.5 * ( ( 0.5 * ( hijax - hi1j1 ) ) )/deltay
2694 yfp2 = yfp2 + 0.25 * ( ( 0.5 * ( hijax - hi1j1) )
2700 elseif ( j1 .eq. jmn )
then
2702 if (ijax .le. 0 ) ijax = ijax + imn
2703 if (ijax .gt. imn) ijax = ijax - imn
2704 hijax = float(zavg(ijax,j1))
2705 hi1j1 = float(zavg(i1,j1))
2706 if(hijax .lt. -990.) hijax = 0.0
2707 if(hi1j1 .lt. -990.) hi1j1 = 0.0
2708 if ( i1 .lt. 5 )print *,
' S.Pole i1,j1 :',i1,j1,
2711 yfp = 0.5 * (0.5 * ( hijax - hi1j1) )/deltay
2712 yfp2 = yfp2 + 0.25 * ( (0.5 * (hijax - hi1j1) )
2719 xfpyfp = xfpyfp + xfp * yfp
2730 xnsum_gt_1 :
IF(xnsum.GT.1.)
THEN
2731 IF(slm(i,j).NE.0.)
THEN
2733 hx2(i,j) = xfp2 / xland
2734 hy2(i,j) = yfp2 / xland
2735 hxy(i,j) = xfpyfp / xland
2737 hx2(i,j) = xfp2 / xnsum
2738 hy2(i,j) = yfp2 / xnsum
2739 hxy(i,j) = xfpyfp / xnsum
2744 print *,
" I,J,i1,j1:", i,j,i1,j1,
2746 print *,
" xfpyfp,xfp2,yfp2:",xfpyfp,xfp2,yfp2
2747 print *,
" HX2,HY2,HXY:",hx2(i,j),hy2(i,j),hxy(i,j)
2753 hk(i,j) = 0.5 * ( hx2(i,j) + hy2(i,j) )
2754 hl(i,j) = 0.5 * ( hx2(i,j) - hy2(i,j) )
2755 hlprim(i,j) = sqrt(hl(i,j)*hl(i,j) + hxy(i,j)*hxy(i,j))
2756 IF( hl(i,j).NE. 0. .AND. slm(i,j) .NE. 0. )
THEN
2758 theta(i,j) = 0.5 * atan2(hxy(i,j),hl(i,j)) / d2r
2762 sigma2(i,j) = ( hk(i,j) + hlprim(i,j) )
2763 if ( sigma2(i,j) .GE. 0. )
then
2764 sigma(i,j) = sqrt(sigma2(i,j) )
2765 if (sigma2(i,j) .ne. 0. .and.
2766 & hk(i,j) .GE. hlprim(i,j) )
2767 1 gamma(i,j) = sqrt( (hk(i,j) - hlprim(i,j)) / sigma2(i,j) )
2773 print *,
" I,J,THETA,SIGMA,GAMMA,",i,j,theta(i,j),
2774 1 sigma(i,j),gamma(i,j)
2775 print *,
" HK,HL,HLPRIM:",hk(i,j),hl(i,j),hlprim(i,j)
2780 WRITE(6,*)
"! MAKE Principal Coord DONE"
2826 SUBROUTINE makeoa(ZAVG,VAR,GLAT,OA4,OL,IOA4,ELVMAX,
2827 1 oro,oro1,xnsum,xnsum1,xnsum2,xnsum3,xnsum4,
2828 2 ist,ien,jst,jen,im,jm,imn,jmn,xlat,numi)
2829 dimension glat(jmn),xlat(jm)
2830 INTEGER zavg(imn,jmn)
2831 dimension oro(im,jm),oro1(im,jm),elvmax(im,jm),zmax(im,jm)
2832 dimension oa4(im,jm,4),ioa4(im,jm,4)
2833 dimension ist(im,jm),ien(im,jm),jst(jm),jen(jm)
2834 dimension xnsum(im,jm),xnsum1(im,jm),xnsum2(im,jm)
2835 dimension xnsum3(im,jm),xnsum4(im,jm)
2836 dimension var(im,jm),ol(im,jm,4),numi(jm)
2846 glat(j) = -90. + (j-1) * delxn + delxn * 0.5
2848 print *,
' IM=',im,
' JM=',jm,
' IMN=',imn,
' JMN=',jmn
2855 faclon = delx / delxn
2857 ist(i,j) = faclon * float(i-1) - faclon * 0.5
2858 ist(i,j) = ist(i,j) + 1
2859 ien(i,j) = faclon * float(i) - faclon * 0.5
2862 IF (ist(i,j) .LE. 0) ist(i,j) = ist(i,j) + imn
2863 IF (ien(i,j) .LT. ist(i,j)) ien(i,j) = ien(i,j) + imn
2865 if ( i .lt. 3 .and. j .lt. 3 )
2866 1print*,
' MAKEOA: I j IST IEN ',i,j,ist(i,j),ien(i,j)
2867 if ( i .lt. 3 .and. j .ge. jm-1 )
2868 1print*,
' MAKEOA: I j IST IEN ',i,j,ist(i,j),ien(i,j)
2871 print *,
'MAKEOA: DELXN,DELX,FACLON',delxn,delx,faclon
2872 print *,
' ***** ready to start JST JEN section '
2877 xxlat = (xlat(j)+xlat(j+1))/2.
2878 IF(flag.AND.glat(j1).GT.xxlat)
THEN
2883 1print*,
' MAKEOA: XX j JST JEN ',j,jst(j),jen(j)
2887 1print*,
' MAKEOA: j JST JEN ',j,jst(j),jen(j)
2889 1print*,
' MAKEOA: j JST JEN ',j,jst(j),jen(j)
2898 jst(jm) = max(jst(jm-1) - (jen(jm-1)-jst(jm-1)),1)
2899 jen(1) = min(jen(2) + (jen(2)-jst(2)),jmn)
2900 print *,
' ***** JST(1) JEN(1) ',jst(1),jen(1)
2901 print *,
' ***** JST(JM) JEN(JM) ',jst(jm),jen(jm)
2906 elvmax(i,j) = oro(i,j)
2915 DO ii1 = 1, ien(i,j) - ist(i,j) + 1
2916 i1 = ist(i,j) + ii1 - 1
2918 IF(i1.LE.0.) i1 = i1 + imn
2919 IF (i1 .GT. imn) i1 = i1 - imn
2921 height = float(zavg(i1,j1))
2922 IF(height.LT.-990.) height = 0.0
2923 IF ( height .gt. oro(i,j) )
then
2924 if ( height .gt. zmax(i,j) )zmax(i,j) = height
2925 xnsum(i,j) = xnsum(i,j) + 1
2929 if ( i .lt. 5 .and. j .ge. jm-5 )
then
2930 print *,
' I,J,ORO(I,J),XNSUM(I,J),ZMAX(I,J):',
2931 1 i,j,oro(i,j),xnsum(i,j),zmax(i,j)
2942 oro1(i,j) = oro(i,j)
2943 elvmax(i,j) = zmax(i,j)
2976 hc = 1116.2 - 0.878 * var(i,j)
2978 DO ii1 = 1, ien(i,j) - ist(i,j) + 1
2979 i1 = ist(i,j) + ii1 - 1
2984 IF(i1.GT.imn) i1 = i1 - imn
2986 IF(float(zavg(i1,j1)) .GT. hc)
2987 1 xnsum1(i,j) = xnsum1(i,j) + 1
2988 xnsum2(i,j) = xnsum2(i,j) + 1
2992 inci = nint((ien(i,j)-ist(i,j)) * 0.5)
2993 isttt = min(max(ist(i,j)-inci,1),imn)
2994 ieddd = min(max(ien(i,j)-inci,1),imn)
2996 incj = nint((jen(j)-jst(j)) * 0.5)
2997 jsttt = min(max(jst(j)-incj,1),jmn)
2998 jeddd = min(max(jen(j)-incj,1),jmn)
3008 IF(float(zavg(i1,j1)) .GT. hc)
3009 1 xnsum3(i,j) = xnsum3(i,j) + 1
3010 xnsum4(i,j) = xnsum4(i,j) + 1
3036 IF (ii .GT. numi(j)) ii = ii - numi(j)
3037 xnpu = xnsum(i,j) + xnsum(i,j+1)
3038 xnpd = xnsum(ii,j) + xnsum(ii,j+1)
3039 IF (xnpd .NE. xnpu) oa4(ii,j+1,1) = 1. - xnpd / max(xnpu , 1.)
3040 ol(ii,j+1,1) = (xnsum3(i,j+1)+xnsum3(ii,j+1))/
3041 1 (xnsum4(i,j+1)+xnsum4(ii,j+1))
3056 IF (ii .GT. numi(j)) ii = ii - numi(j)
3057 xnpu = xnsum(i,j+1) + xnsum(ii,j+1)
3058 xnpd = xnsum(i,j) + xnsum(ii,j)
3059 IF (xnpd .NE. xnpu) oa4(ii,j+1,2) = 1. - xnpd / max(xnpu , 1.)
3060 ol(ii,j+1,2) = (xnsum3(ii,j)+xnsum3(ii,j+1))/
3061 1 (xnsum4(ii,j)+xnsum4(ii,j+1))
3067 IF (ii .GT. numi(j)) ii = ii - numi(j)
3068 xnpu = xnsum(i,j+1) + ( xnsum(i,j) + xnsum(ii,j+1) )*0.5
3069 xnpd = xnsum(ii,j) + ( xnsum(i,j) + xnsum(ii,j+1) )*0.5
3070 IF (xnpd .NE. xnpu) oa4(ii,j+1,3) = 1. - xnpd / max(xnpu , 1.)
3071 ol(ii,j+1,3) = (xnsum1(ii,j)+xnsum1(i,j+1))/
3072 1 (xnsum2(ii,j)+xnsum2(i,j+1))
3078 IF (ii .GT. numi(j)) ii = ii - numi(j)
3079 xnpu = xnsum(i,j) + ( xnsum(ii,j) + xnsum(i,j+1) )*0.5
3080 xnpd = xnsum(ii,j+1) + ( xnsum(ii,j) + xnsum(i,j+1) )*0.5
3081 IF (xnpd .NE. xnpu) oa4(ii,j+1,4) = 1. - xnpd / max(xnpu , 1.)
3082 ol(ii,j+1,4) = (xnsum1(i,j)+xnsum1(ii,j+1))/
3083 1 (xnsum2(i,j)+xnsum2(ii,j+1))
3089 ol(i,1,kwd) = ol(i,2,kwd)
3090 ol(i,jm,kwd) = ol(i,jm-1,kwd)
3098 oa4(i,j,kwd) = sign( min( abs(t), 1. ), t )
3113 t = abs( oa4(i,j,kwd) )
3117 ELSE IF(t .GT. 0. .AND. t .LE. 1.)
THEN
3120 ELSE IF(t .GT. 1. .AND. t .LE. 10.)
THEN
3123 ELSE IF(t .GT. 10. .AND. t .LE. 100.)
THEN
3126 ELSE IF(t .GT. 100. .AND. t .LE. 1000.)
THEN
3129 ELSE IF(t .GT. 1000. .AND. t .LE. 10000.)
THEN
3132 ELSE IF(t .GT. 10000.)
THEN
3140 WRITE(6,*)
"! MAKEOA EXIT"
3156 real dx, lat, degrad
3159 real,
parameter :: radius = 6371200
3161 get_lon_angle = 2*asin( sin(dx/radius*0.5)/cos(lat) )*degrad
3178 real,
parameter :: radius = 6371200
3220 SUBROUTINE makeoa2(ZAVG,zslm,VAR,GLAT,OA4,OL,IOA4,ELVMAX,
3221 1 oro,oro1,xnsum,xnsum1,xnsum2,xnsum3,xnsum4,
3222 2 im,jm,imn,jmn,lon_c,lat_c,lon_t,lat_t,dx,dy,
3223 3 is_south_pole,is_north_pole )
3225 real,
parameter :: missing_value = -9999.
3226 real,
parameter :: d2r = 3.14159265358979/180.
3227 real,
PARAMETER :: r2d=180./3.14159265358979
3228 integer im,jm,imn,jmn
3230 INTEGER zavg(imn,jmn),zslm(imn,jmn)
3231 real oro(im,jm),oro1(im,jm),elvmax(im,jm),zmax(im,jm)
3233 integer ioa4(im,jm,4)
3234 real lon_c(im+1,jm+1), lat_c(im+1,jm+1)
3235 real lon_t(im,jm), lat_t(im,jm)
3236 real dx(im,jm), dy(im,jm)
3237 logical is_south_pole(im,jm), is_north_pole(im,jm)
3238 real xnsum(im,jm),xnsum1(im,jm),xnsum2(im,jm)
3239 real xnsum3(im,jm),xnsum4(im,jm)
3240 real var(im,jm),ol(im,jm,4)
3242 integer i,j,ilist(imn),numx,i1,j1,ii1
3244 real lono(4),lato(4),loni,lati
3245 real delxn,hc,height,xnpu,xnpd,t
3246 integer ns0,ns1,ns2,ns3,ns4,ns5,ns6
3248 real lon,lat,dlon,dlat,dlat_old
3249 real lon1,lat1,lon2,lat2
3250 real xnsum11,xnsum12,xnsum21,xnsum22,xnsumx
3251 real hc_11, hc_12, hc_21, hc_22
3252 real xnsum1_11,xnsum1_12,xnsum1_21,xnsum1_22
3253 real xnsum2_11,xnsum2_12,xnsum2_21,xnsum2_22
3255 integer ist, ien, jst, jen
3256 real xland,xwatr,xl1,xs1,oroavg,slm
3263 glat(j) = -90. + (j-1) * delxn + delxn * 0.5
3265 print *,
' IM=',im,
' JM=',jm,
' IMN=',imn,
' JMN=',jmn
3273 elvmax(i,j) = oro(i,j)
3281 oro1(i,j) = oro(i,j)
3282 elvmax(i,j) = zmax(i,j)
3294 hc = 1116.2 - 0.878 * var(i,j)
3295 lono(1) = lon_c(i,j)
3296 lono(2) = lon_c(i+1,j)
3297 lono(3) = lon_c(i+1,j+1)
3298 lono(4) = lon_c(i,j+1)
3299 lato(1) = lat_c(i,j)
3300 lato(2) = lat_c(i+1,j)
3301 lato(3) = lat_c(i+1,j+1)
3302 lato(4) = lat_c(i,j+1)
3303 call
get_index(imn,jmn,4,lono,lato,delxn,jst,jen,ilist,numx)
3304 do j1 = jst, jen;
do ii1 = 1, numx
3307 lati = -90 + j1*delxn
3309 & lono*d2r,lato*d2r))
then
3311 height = float(zavg(i1,j1))
3312 IF(height.LT.-990.) height = 0.0
3313 IF ( height .gt. oro(i,j) )
then
3314 if ( height .gt. zmax(i,j) )zmax(i,j) = height
3327 oro1(i,j) = oro(i,j)
3328 elvmax(i,j) = zmax(i,j)
3362 if(is_north_pole(i,j))
then
3363 print*,
"set oa1 = 0 and ol=0 at i,j=", i,j
3368 else if(is_south_pole(i,j))
then
3369 print*,
"set oa1 = 0 and ol=1 at i,j=", i,j
3380 if( lat-dlat*0.5<-90.)
then
3381 print*,
"at i,j =", i,j, lat, dlat, lat-dlat*0.5
3382 print*,
"ERROR: lat-dlat*0.5<-90."
3385 if( lat+dlat*2 > 90.)
then
3388 print*,
"at i,j=",i,j,
" adjust dlat from ",
3389 & dlat_old,
" to ", dlat
3397 if(lat1<-90 .or. lat2>90)
then
3398 print*,
"at upper left i=,j=", i, j, lat, dlat,lat1,lat2
3400 xnsum11 =
get_xnsum(lon1,lat1,lon2,lat2,imn,jmn,glat,
3408 if(lat1<-90 .or. lat2>90)
then
3409 print*,
"at lower left i=,j=", i, j, lat, dlat,lat1,lat2
3411 xnsum12 =
get_xnsum(lon1,lat1,lon2,lat2,imn,jmn,glat,
3419 if(lat1<-90 .or. lat2>90)
then
3420 print*,
"at upper right i=,j=", i, j, lat, dlat,lat1,lat2
3422 xnsum21 =
get_xnsum(lon1,lat1,lon2,lat2,imn,jmn,glat,
3430 if(lat1<-90 .or. lat2>90)
then
3431 print*,
"at lower right i=,j=", i, j, lat, dlat,lat1,lat2
3434 xnsum22 =
get_xnsum(lon1,lat1,lon2,lat2,imn,jmn,glat,
3437 xnpu = xnsum11 + xnsum12
3438 xnpd = xnsum21 + xnsum22
3439 IF (xnpd .NE. xnpu) oa4(i,j,1) = 1. - xnpd / max(xnpu , 1.)
3441 xnpu = xnsum11 + xnsum21
3442 xnpd = xnsum12 + xnsum22
3443 IF (xnpd .NE. xnpu) oa4(i,j,2) = 1. - xnpd / max(xnpu , 1.)
3445 xnpu = xnsum11 + (xnsum12+xnsum21)*0.5
3446 xnpd = xnsum22 + (xnsum12+xnsum21)*0.5
3447 IF (xnpd .NE. xnpu) oa4(i,j,3) = 1. - xnpd / max(xnpu , 1.)
3449 xnpu = xnsum12 + (xnsum11+xnsum22)*0.5
3450 xnpd = xnsum21 + (xnsum11+xnsum22)*0.5
3451 IF (xnpd .NE. xnpu) oa4(i,j,4) = 1. - xnpd / max(xnpu , 1.)
3460 if(lat1<-90 .or. lat2>90)
then
3461 print*,
"at upper left i=,j=", i, j, lat, dlat,lat1,lat2
3463 call
get_xnsum2(lon1,lat1,lon2,lat2,imn,jmn,glat,
3464 & zavg,delxn, xnsum1_11, xnsum2_11, hc_11)
3471 if(lat1<-90 .or. lat2>90)
then
3472 print*,
"at lower left i=,j=", i, j, lat, dlat,lat1,lat2
3474 call
get_xnsum2(lon1,lat1,lon2,lat2,imn,jmn,glat,
3475 & zavg,delxn, xnsum1_12, xnsum2_12, hc_12)
3482 if(lat1<-90 .or. lat2>90)
then
3483 print*,
"at upper right i=,j=", i, j, lat, dlat,lat1,lat2
3485 call
get_xnsum2(lon1,lat1,lon2,lat2,imn,jmn,glat,
3486 & zavg,delxn, xnsum1_21, xnsum2_21, hc_21)
3493 if(lat1<-90 .or. lat2>90)
then
3494 print*,
"at lower right i=,j=", i, j, lat, dlat,lat1,lat2
3496 call
get_xnsum2(lon1,lat1,lon2,lat2,imn,jmn,glat,
3497 & zavg,delxn, xnsum1_22, xnsum2_22, hc_22)
3499 ol(i,j,3) = (xnsum1_22+xnsum1_11)/(xnsum2_22+xnsum2_11)
3500 ol(i,j,4) = (xnsum1_12+xnsum1_21)/(xnsum2_12+xnsum2_21)
3508 if(lat1<-90 .or. lat2>90)
then
3509 print*,
"at upper left i=,j=", i, j, lat, dlat,lat1,lat2
3511 call
get_xnsum3(lon1,lat1,lon2,lat2,imn,jmn,glat,
3512 & zavg,delxn, xnsum1_11, xnsum2_11, hc_11)
3519 if(lat1<-90 .or. lat2>90)
then
3520 print*,
"at lower left i=,j=", i, j, lat, dlat,lat1,lat2
3523 call
get_xnsum3(lon1,lat1,lon2,lat2,imn,jmn,glat,
3524 & zavg,delxn, xnsum1_12, xnsum2_12, hc_12)
3531 if(lat1<-90 .or. lat2>90)
then
3532 print*,
"at upper right i=,j=", i, j, lat, dlat,lat1,lat2
3534 call
get_xnsum3(lon1,lat1,lon2,lat2,imn,jmn,glat,
3535 & zavg,delxn, xnsum1_21, xnsum2_21, hc_21)
3542 if(lat1<-90 .or. lat2>90)
then
3543 print*,
"at lower right i=,j=", i, j, lat, dlat,lat1,lat2
3546 call
get_xnsum3(lon1,lat1,lon2,lat2,imn,jmn,glat,
3547 & zavg,delxn, xnsum1_22, xnsum2_22, hc_22)
3549 ol(i,j,1) = (xnsum1_11+xnsum1_21)/(xnsum2_11+xnsum2_21)
3550 ol(i,j,2) = (xnsum1_21+xnsum1_22)/(xnsum2_21+xnsum2_22)
3559 oa4(i,j,kwd) = sign( min( abs(t), 1. ), t )
3574 t = abs( oa4(i,j,kwd) )
3578 ELSE IF(t .GT. 0. .AND. t .LE. 1.)
THEN
3581 ELSE IF(t .GT. 1. .AND. t .LE. 10.)
THEN
3584 ELSE IF(t .GT. 10. .AND. t .LE. 100.)
THEN
3587 ELSE IF(t .GT. 100. .AND. t .LE. 1000.)
THEN
3590 ELSE IF(t .GT. 1000. .AND. t .LE. 10000.)
THEN
3593 ELSE IF(t .GT. 10000.)
THEN
3601 WRITE(6,*)
"! MAKEOA2 EXIT"
3617 real,
intent(in) :: theta1, phi1, theta2, phi2
3620 if(theta1 == theta2 .and. phi1 == phi2)
then
3625 dot = cos(phi1)*cos(phi2)*cos(theta1-theta2) + sin(phi1)*sin(phi2)
3626 if(dot > 1. ) dot = 1.
3627 if(dot < -1.) dot = -1.
3651 & bitmap_in,num_out, lon_out,lat_out, iindx, jindx )
3652 integer,
intent(in) :: im_in, jm_in, num_out
3653 real,
intent(in) :: geolon_in(im_in,jm_in)
3654 real,
intent(in) :: geolat_in(im_in,jm_in)
3655 logical*1,
intent(in) :: bitmap_in(im_in,jm_in)
3656 real,
intent(in) :: lon_out(num_out), lat_out(num_out)
3657 integer,
intent(out):: iindx(num_out), jindx(num_out)
3658 real,
parameter :: max_dist = 1.e+20
3659 integer,
parameter :: numnbr = 20
3660 integer :: i_c,j_c,jstart,jend
3663 print*,
"im_in,jm_in = ", im_in, jm_in
3664 print*,
"num_out = ", num_out
3665 print*,
"max and min of lon_in is", minval(geolon_in),
3667 print*,
"max and min of lat_in is", minval(geolat_in),
3669 print*,
"max and min of lon_out is", minval(lon_out),
3671 print*,
"max and min of lat_out is", minval(lat_out),
3673 print*,
"count(bitmap_in)= ", count(bitmap_in), max_dist
3682 if(lat .LE. geolat_in(1,j) .and.
3683 & lat .GE. geolat_in(1,j+1))
then
3687 if(lat > geolat_in(1,1)) j_c = 1
3688 if(lat < geolat_in(1,jm_in)) j_c = jm_in
3691 jstart = max(j_c-numnbr,1)
3692 jend = min(j_c+numnbr,jm_in)
3697 do j = jstart, jend;
do i = 1,im_in
3698 if(bitmap_in(i,j) )
then
3701 & geolon_in(i,j), geolat_in(i,j))
3703 iindx(n) = i; jindx(n) = j
3708 if(iindx(n) ==0)
then
3709 print*,
"lon,lat=", lon,lat
3710 print*,
"jstart, jend=", jstart, jend, dist
3711 print*,
"ERROR in get mismatch_index: not find nearest points"
3732 & num_out, data_out, iindx, jindx)
3733 integer,
intent(in) :: im_in, jm_in, num_out
3734 real,
intent(in) :: data_in(im_in,jm_in)
3735 real,
intent(out):: data_out(num_out)
3736 integer,
intent(in) :: iindx(num_out), jindx(num_out)
3739 data_out(n) = data_in(iindx(n),jindx(n))
3788 SUBROUTINE makeoa3(ZAVG,zslm,VAR,GLAT,OA4,OL,IOA4,ELVMAX,
3789 1 oro,slm,oro1,xnsum,xnsum1,xnsum2,xnsum3,xnsum4,
3790 2 im,jm,imn,jmn,lon_c,lat_c,lon_t,lat_t,
3791 3 is_south_pole,is_north_pole,imi,jmi,oa_in,ol_in,
3792 4 slm_in,lon_in,lat_in)
3800 real,
parameter :: missing_value = -9999.
3801 real,
parameter :: d2r = 3.14159265358979/180.
3802 real,
PARAMETER :: r2d=180./3.14159265358979
3803 integer im,jm,imn,jmn,imi,jmi
3805 INTEGER zavg(imn,jmn),zslm(imn,jmn)
3807 real oro(im,jm),oro1(im,jm),elvmax(im,jm),zmax(im,jm)
3809 integer ioa4(im,jm,4)
3810 real oa_in(imi,jmi,4), ol_in(imi,jmi,4)
3811 real slm_in(imi,jmi)
3812 real lon_in(imi,jmi), lat_in(imi,jmi)
3813 real lon_c(im+1,jm+1), lat_c(im+1,jm+1)
3814 real lon_t(im,jm), lat_t(im,jm)
3815 logical is_south_pole(im,jm), is_north_pole(im,jm)
3816 real xnsum(im,jm),xnsum1(im,jm),xnsum2(im,jm)
3817 real xnsum3(im,jm),xnsum4(im,jm)
3818 real var(im,jm),ol(im,jm,4)
3820 integer i,j,ilist(imn),numx,i1,j1,ii1
3822 real lono(4),lato(4),loni,lati
3823 real delxn,hc,height,xnpu,xnpd,t
3824 integer ns0,ns1,ns2,ns3,ns4,ns5,ns6
3826 real lon,lat,dlon,dlat,dlat_old
3827 real lon1,lat1,lon2,lat2
3828 real xnsum11,xnsum12,xnsum21,xnsum22,xnsumx
3829 real hc_11, hc_12, hc_21, hc_22
3830 real xnsum1_11,xnsum1_12,xnsum1_21,xnsum1_22
3831 real xnsum2_11,xnsum2_12,xnsum2_21,xnsum2_22
3833 integer ist, ien, jst, jen
3834 real xland,xwatr,xl1,xs1,oroavg
3835 integer int_opt, ipopt(20), kgds_input(200), kgds_output(200)
3836 integer count_land_output
3837 integer ij, ijmdl_output, iret, num_mismatch_land, num
3838 integer ibo(1), ibi(1)
3839 logical*1,
allocatable :: bitmap_input(:,:)
3840 logical*1,
allocatable :: bitmap_output(:,:)
3841 integer,
allocatable :: ijsav_land_output(:)
3842 real,
allocatable :: lats_land_output(:)
3843 real,
allocatable :: lons_land_output(:)
3844 real,
allocatable :: output_data_land(:,:)
3845 real,
allocatable :: lons_mismatch_output(:)
3846 real,
allocatable :: lats_mismatch_output(:)
3847 real,
allocatable :: data_mismatch_output(:)
3848 integer,
allocatable :: iindx(:), jindx(:)
3854 ijmdl_output = im*jm
3857 glat(j) = -90. + (j-1) * delxn + delxn * 0.5
3859 print *,
' IM=',im,
' JM=',jm,
' IMN=',imn,
' JMN=',jmn
3867 elvmax(i,j) = oro(i,j)
3875 oro1(i,j) = oro(i,j)
3876 elvmax(i,j) = zmax(i,j)
3885 hc = 1116.2 - 0.878 * var(i,j)
3886 lono(1) = lon_c(i,j)
3887 lono(2) = lon_c(i+1,j)
3888 lono(3) = lon_c(i+1,j+1)
3889 lono(4) = lon_c(i,j+1)
3890 lato(1) = lat_c(i,j)
3891 lato(2) = lat_c(i+1,j)
3892 lato(3) = lat_c(i+1,j+1)
3893 lato(4) = lat_c(i,j+1)
3894 call
get_index(imn,jmn,4,lono,lato,delxn,jst,jen,ilist,numx)
3895 do j1 = jst, jen;
do ii1 = 1, numx
3898 lati = -90 + j1*delxn
3900 & lono*d2r,lato*d2r))
then
3902 height = float(zavg(i1,j1))
3903 IF(height.LT.-990.) height = 0.0
3904 IF ( height .gt. oro(i,j) )
then
3905 if ( height .gt. zmax(i,j) )zmax(i,j) = height
3918 oro1(i,j) = oro(i,j)
3919 elvmax(i,j) = zmax(i,j)
3939 kgds_input(4) = 90000
3942 kgds_input(7) = -90000
3943 kgds_input(8) = nint(-360000./imi)
3944 kgds_input(9) = nint((360.0 / float(imi))*1000.0)
3946 kgds_input(10) = jmi /2
3947 kgds_input(12) = 255
3948 kgds_input(20) = 255
3955 kgds_output(4) = 90000
3957 kgds_output(6) = 128
3958 kgds_output(7) = -90000
3959 kgds_output(8) = nint(-360000./im)
3960 kgds_output(9) = nint((360.0 / float(im))*1000.0)
3962 kgds_output(10) = jm /2
3963 kgds_output(12) = 255
3964 kgds_output(20) = 255
3967 print*,
"sum(slm) = ", sum(slm)
3968 do ij = 1, ijmdl_output
3970 i = mod(ij-1,im) + 1
3971 if (slm(i,j) > 0.0)
then
3972 count_land_output=count_land_output+1
3975 allocate(bitmap_input(imi,jmi))
3976 bitmap_input=.false.
3977 print*,
"number of land input=", sum(slm_in)
3978 where(slm_in > 0.0) bitmap_input=.true.
3979 print*,
"count(bitmap_input)", count(bitmap_input)
3981 allocate(bitmap_output(count_land_output,1))
3982 allocate(output_data_land(count_land_output,1))
3983 allocate(ijsav_land_output(count_land_output))
3984 allocate(lats_land_output(count_land_output))
3985 allocate(lons_land_output(count_land_output))
3990 do ij = 1, ijmdl_output
3992 i = mod(ij-1,im) + 1
3993 if (slm(i,j) > 0.0)
then
3994 count_land_output=count_land_output+1
3995 ijsav_land_output(count_land_output)=ij
3996 lats_land_output(count_land_output)=lat_t(i,j)
3997 lons_land_output(count_land_output)=lon_t(i,j)
4006 bitmap_output = .false.
4007 output_data_land = 0.0
4008 call ipolates(int_opt, ipopt, kgds_input, kgds_output,
4009 & (imi*jmi), count_land_output,
4010 & 1, ibi, bitmap_input, oa_in(:,:,kwd),
4011 & count_land_output, lats_land_output,
4012 & lons_land_output, ibo,
4013 & bitmap_output, output_data_land, iret)
4015 print*,
'- ERROR IN IPOLATES ',iret
4019 num_mismatch_land = 0
4020 do ij = 1, count_land_output
4021 if (bitmap_output(ij,1))
then
4022 j = (ijsav_land_output(ij)-1)/im + 1
4023 i = mod(ijsav_land_output(ij)-1,im) + 1
4024 oa4(i,j,kwd)=output_data_land(ij,1)
4026 num_mismatch_land = num_mismatch_land + 1
4029 print*,
"num_mismatch_land = ", num_mismatch_land
4031 if(.not.
allocated(data_mismatch_output))
then
4032 allocate(lons_mismatch_output(num_mismatch_land))
4033 allocate(lats_mismatch_output(num_mismatch_land))
4034 allocate(data_mismatch_output(num_mismatch_land))
4035 allocate(iindx(num_mismatch_land))
4036 allocate(jindx(num_mismatch_land))
4039 do ij = 1, count_land_output
4040 if (.not. bitmap_output(ij,1))
then
4042 lons_mismatch_output(num) = lons_land_output(ij)
4043 lats_mismatch_output(num) = lats_land_output(ij)
4049 print*,
"before get_mismatch_index", count(bitmap_input)
4051 & lat_in*d2r,bitmap_input,num_mismatch_land,
4052 & lons_mismatch_output*d2r,lats_mismatch_output*d2r,
4056 data_mismatch_output = 0
4058 & num_mismatch_land,data_mismatch_output,iindx,jindx)
4061 do ij = 1, count_land_output
4062 if (.not. bitmap_output(ij,1))
then
4064 j = (ijsav_land_output(ij)-1)/im + 1
4065 i = mod(ijsav_land_output(ij)-1,im) + 1
4066 oa4(i,j,kwd) = data_mismatch_output(num)
4067 if(i==372 .and. j== 611)
then
4068 print*,
"ij=",ij, num, oa4(i,j,kwd),iindx(num),jindx(num)
4078 bitmap_output = .false.
4079 output_data_land = 0.0
4080 call ipolates(int_opt, ipopt, kgds_input, kgds_output,
4081 & (imi*jmi), count_land_output,
4082 & 1, ibi, bitmap_input, ol_in(:,:,kwd),
4083 & count_land_output, lats_land_output,
4084 & lons_land_output, ibo,
4085 & bitmap_output, output_data_land, iret)
4087 print*,
'- ERROR IN IPOLATES ',iret
4091 num_mismatch_land = 0
4092 do ij = 1, count_land_output
4093 if (bitmap_output(ij,1))
then
4094 j = (ijsav_land_output(ij)-1)/im + 1
4095 i = mod(ijsav_land_output(ij)-1,im) + 1
4096 ol(i,j,kwd)=output_data_land(ij,1)
4098 num_mismatch_land = num_mismatch_land + 1
4101 print*,
"num_mismatch_land = ", num_mismatch_land
4103 data_mismatch_output = 0
4105 & num_mismatch_land,data_mismatch_output,iindx,jindx)
4108 do ij = 1, count_land_output
4109 if (.not. bitmap_output(ij,1))
then
4111 j = (ijsav_land_output(ij)-1)/im + 1
4112 i = mod(ijsav_land_output(ij)-1,im) + 1
4113 ol(i,j,kwd) = data_mismatch_output(num)
4114 if(i==372 .and. j== 611)
then
4115 print*,
"ij=",ij, num, ol(i,j,kwd),iindx(num),jindx(num)
4123 deallocate(lons_mismatch_output,lats_mismatch_output)
4124 deallocate(data_mismatch_output,iindx,jindx)
4125 deallocate(bitmap_output,output_data_land)
4126 deallocate(ijsav_land_output,lats_land_output)
4127 deallocate(lons_land_output)
4133 oa4(i,j,kwd) = sign( min( abs(t), 1. ), t )
4148 t = abs( oa4(i,j,kwd) )
4152 ELSE IF(t .GT. 0. .AND. t .LE. 1.)
THEN
4155 ELSE IF(t .GT. 1. .AND. t .LE. 10.)
THEN
4158 ELSE IF(t .GT. 10. .AND. t .LE. 100.)
THEN
4161 ELSE IF(t .GT. 100. .AND. t .LE. 1000.)
THEN
4164 ELSE IF(t .GT. 1000. .AND. t .LE. 10000.)
THEN
4167 ELSE IF(t .GT. 10000.)
THEN
4175 WRITE(6,*)
"! MAKEOA3 EXIT"
4192 REAL f(im,jm), wrk(im,jm)
4202 if (ir .gt. im) ir = ir - im
4229 integer,
intent(in):: im,jm,numi(jm)
4230 real,
intent(inout):: a(im,jm)
4234 r=
real(numi(j))/
real(im)
4236 ir=mod(nint((ig-1)*r),numi(j))+1
4255 integer,
intent(in):: im,jm,numi(jm)
4256 real,
intent(inout):: a(im,jm)
4260 r=
real(numi(j))/
real(im)
4282 real a(im,jm),rmin,rmax
4293 if(a(i,j).ge.rmax)rmax=a(i,j)
4294 if(a(i,j).le.rmin)rmin=a(i,j)
4297 write(6,150)rmin,rmax,title
4298 150
format(
'rmin=',e13.4,2x,
'rmax=',e13.4,2x,a8,
' ')
4317 real a(im,jm),rmin,rmax
4318 integer i,j,im,jm,imax,jmax
4328 if(a(i,j).ge.rmax)
then
4333 if(a(i,j).le.rmin)rmin=a(i,j)
4336 write(6,150)rmin,rmax,title
4337 150
format(
'rmin=',e13.4,2x,
'rmax=',e13.4,2x,a8,
' ')
4376 SUBROUTINE spfft1(IMAX,INCW,INCG,KMAX,W,G,IDIR)
4378 INTEGER,
INTENT(IN):: imax,incw,incg,kmax,idir
4379 COMPLEX,
INTENT(INOUT):: w(incw,kmax)
4380 REAL,
INTENT(INOUT):: g(incg,kmax)
4381 REAL:: aux1(25000+int(0.82*imax))
4382 REAL:: aux2(20000+int(0.57*imax))
4383 INTEGER:: naux1,naux2
4385 naux1=25000+int(0.82*imax)
4386 naux2=20000+int(0.57*imax)
4391 SELECT CASE(digits(1.))
4393 CALL scrft(1,w,incw,g,incg,imax,kmax,-1,1.,
4394 & aux1,naux1,aux2,naux2,0.,0)
4395 CALL scrft(0,w,incw,g,incg,imax,kmax,-1,1.,
4396 & aux1,naux1,aux2,naux2,0.,0)
4398 CALL dcrft(1,w,incw,g,incg,imax,kmax,-1,1.,
4399 & aux1,naux1,aux2,naux2,0.,0)
4400 CALL dcrft(0,w,incw,g,incg,imax,kmax,-1,1.,
4401 & aux1,naux1,aux2,naux2,0.,0)
4406 SELECT CASE(digits(1.))
4408 CALL srcft(1,g,incg,w,incw,imax,kmax,+1,1./imax,
4409 & aux1,naux1,aux2,naux2,0.,0)
4410 CALL srcft(0,g,incg,w,incw,imax,kmax,+1,1./imax,
4411 & aux1,naux1,aux2,naux2,0.,0)
4413 CALL drcft(1,g,incg,w,incw,imax,kmax,+1,1./imax,
4414 & aux1,naux1,aux2,naux2,0.,0)
4415 CALL drcft(0,g,incg,w,incw,imax,kmax,+1,1./imax,
4416 & aux1,naux1,aux2,naux2,0.,0)
4429 integer*2 glob(360*120,180*120)
4434 parameter(ix=40*120,jx=50*120)
4435 parameter(ia=60*120,ja=30*120)
4437 integer*2 idat(ix,jx)
4442 real(kind=8) dloin,dlain,rlon,rlat
4444 open(235, file=
"./fort.235", access=
'direct', recl=43200*21600*2)
4449 call
maxmin(glob,360*120*180*120,
'global0')
4455 rlon= -179.995833333333333333333333d0
4456 rlat= 89.995833333333333333333333d0
4483 integer iaamax, iaamin, len, j, m, ja, kount
4484 integer(8) sum2,std,mean,isum
4485 integer i_count_notset,kount_9
4500 if ( ja .eq. -9999 )
then
4504 if ( ja .eq. -12345 ) i_count_notset=i_count_notset+1
4506 iaamax = max0( iaamax, ja )
4507 iaamin = min0( iaamin, ja )
4518 std = ifix(sqrt(float((sum2/(kount))-mean**2)))
4519 print*,tile,
' max=',iaamax,
' min=',iaamin,
' sum=',isum,
4520 &
' i_count_notset=',i_count_notset
4521 print*,tile,
' mean=',mean,
' std.dev=',std,
4522 &
' ko9s=',kount,kount_9,kount+kount_9
4538 real(kind=4) a(im,jm),rmin,rmax,undef
4539 integer i,j,im,jm,imax,jmax,imin,jmin,iundef
4540 character*8 title,chara
4556 if(a(i,j).ge.rmax)
then
4561 if(a(i,j).le.rmin)
then
4562 if ( a(i,j) .eq. undef )
then
4572 write(6,150)chara,rmin,imin,jmin,rmax,imax,jmax,iundef
4573 150
format(1x,a8,2x,
'rmin=',e13.4,2i6,2x,
'rmax=',e13.4,3i6)
4589 integer,
intent(in) :: siz
4590 real,
intent(in) :: lon(siz), lat(siz)
4591 real,
intent(out) :: x(siz), y(siz), z(siz)
4596 x(n) = cos(lat(n))*cos(lon(n))
4597 y(n) = cos(lat(n))*sin(lon(n))
4611 real,
parameter :: epsln30 = 1.e-30
4612 real,
parameter :: pi=3.1415926535897931
4613 real v1(3), v2(3), v3(3)
4616 real px, py, pz, qx, qy, qz, ddd;
4619 px = v1(2)*v2(3) - v1(3)*v2(2)
4620 py = v1(3)*v2(1) - v1(1)*v2(3)
4621 pz = v1(1)*v2(2) - v1(2)*v2(1)
4623 qx = v1(2)*v3(3) - v1(3)*v3(2);
4624 qy = v1(3)*v3(1) - v1(1)*v3(3);
4625 qz = v1(1)*v3(2) - v1(2)*v3(1);
4627 ddd = (px*px+py*py+pz*pz)*(qx*qx+qy*qy+qz*qz);
4628 if ( ddd <= 0.0 )
then
4631 ddd = (px*qx+py*qy+pz*qz) / sqrt(ddd);
4632 if( abs(ddd-1) < epsln30 ) ddd = 1;
4633 if( abs(ddd+1) < epsln30 ) ddd = -1;
4634 if ( ddd>1. .or. ddd<-1. )
then
4661 real,
parameter :: epsln10 = 1.e-10
4662 real,
parameter :: epsln8 = 1.e-8
4663 real,
parameter :: pi=3.1415926535897931
4664 real,
parameter :: range_check_criteria=0.05
4669 real lon2(npts), lat2(npts)
4670 real x2(npts), y2(npts), z2(npts)
4671 real lon1_1d(1), lat1_1d(1)
4672 real x1(1), y1(1), z1(1)
4673 real pnt0(3),pnt1(3),pnt2(3)
4675 real max_x2,min_x2,max_y2,min_y2,max_z2,min_z2
4677 call
latlon2xyz(npts,lon2, lat2, x2, y2, z2);
4680 call
latlon2xyz(1,lon1_1d, lat1_1d, x1, y1, z1);
4683 if( x1(1) > max_x2+range_check_criteria )
return
4685 if( x1(1)+range_check_criteria < min_x2 )
return
4687 if( y1(1) > max_y2+range_check_criteria )
return
4689 if( y1(1)+range_check_criteria < min_y2 )
return
4691 if( z1(1) > max_z2+range_check_criteria )
return
4693 if( z1(1)+range_check_criteria < min_z2 )
return
4701 if(abs(x1(1)-x2(i)) < epsln10 .and.
4702 & abs(y1(1)-y2(i)) < epsln10 .and.
4703 & abs(z1(1)-z2(i)) < epsln10 )
then
4708 if(ip1>npts) ip1 = 1
4718 anglesum = anglesum + angle
4721 if(abs(anglesum-2*pi) < epsln8)
then
4755 & glat,zavg,zslm,delxn)
4760 real,
intent(in) :: lon1,lat1,lon2,lat2,delxn
4761 integer,
intent(in) :: imn,jmn
4762 real,
intent(in) :: glat(jmn)
4763 integer,
intent(in) :: zavg(imn,jmn),zslm(imn,jmn)
4764 integer i, j, ist, ien, jst, jen, i1
4766 real xland,xwatr,xl1,xs1,slm,xnsum
4769 if( glat(j) .GT. lat1 )
then
4775 if( glat(j) .GT. lat2 )
then
4782 ist = lon1/delxn + 1
4784 if(ist .le.0) ist = ist + imn
4785 if(ien < ist) ien = ien + imn
4796 do i1 = 1, ien - ist + 1
4798 if( i .LE. 0) i = i + imn
4799 if( i .GT. imn) i = i - imn
4800 xland = xland + float(zslm(i,j))
4801 xwatr = xwatr + float(1-zslm(i,j))
4803 height = float(zavg(i,j))
4804 IF(height.LT.-990.) height = 0.0
4805 xl1 = xl1 + height * float(zslm(i,j))
4806 xs1 = xs1 + height * float(1-zslm(i,j))
4809 if( xnsum > 1.)
THEN
4810 slm = float(nint(xland/xnsum))
4822 if( i .LE. 0) i = i + imn
4823 if( i .GT. imn) i = i - imn
4824 height = float(zavg(i,j))
4825 IF(height.LT.-990.) height = 0.0
4861 & glat,zavg,delxn,xnsum1,xnsum2,hc)
4864 real,
intent(out) :: xnsum1,xnsum2,hc
4866 real lon1,lat1,lon2,lat2,oro,delxn
4869 integer zavg(imn,jmn)
4870 integer i, j, ist, ien, jst, jen, i1
4872 real xw1,xw2,slm,xnsum
4875 if( glat(j) .GT. lat1 )
then
4881 if( glat(j) .GT. lat2 )
then
4888 ist = lon1/delxn + 1
4890 if(ist .le.0) ist = ist + imn
4891 if(ien < ist) ien = ien + imn
4899 do i1 = 1, ien - ist + 1
4901 if( i .LE. 0) i = i + imn
4902 if( i .GT. imn) i = i - imn
4904 height = float(zavg(i,j))
4905 IF(height.LT.-990.) height = 0.0
4907 xw2 = xw2 + height ** 2
4910 var = sqrt(max(xw2/xnsum-(xw1/xnsum)**2,0.))
4911 hc = 1116.2 - 0.878 * var
4917 if( i .LE. 0) i = i + imn
4918 if( i .GT. imn) i = i - imn
4919 height = float(zavg(i,j))
4920 IF ( height .gt. hc ) xnsum1 = xnsum1 + 1
4956 & glat,zavg,delxn,xnsum1,xnsum2,hc)
4959 real,
intent(out) :: xnsum1,xnsum2
4960 real lon1,lat1,lon2,lat2,oro,delxn
4963 integer zavg(imn,jmn)
4964 integer i, j, ist, ien, jst, jen, i1
4966 real xw1,xw2,slm,xnsum
4972 if( glat(j) .GT. lat1 )
then
4978 if( glat(j) .GT. lat2 )
then
4985 ist = lon1/delxn + 1
4987 if(ist .le.0) ist = ist + imn
4988 if(ien < ist) ien = ien + imn
4996 if( i .LE. 0) i = i + imn
4997 if( i .GT. imn) i = i - imn
4998 height = float(zavg(i,j))
4999 IF ( height .gt. hc ) xnsum1 = xnsum1 + 1
5020 integer inan1,inan2,inan3,inan4,inaq1,inaq2,inaq3,inaq4
5023 equivalence(itest,word)
5026 data inan1/x
'7F800001'/
5027 data inan2/x
'7FBFFFFF'/
5028 data inan3/x
'FF800001'/
5029 data inan4/x
'FFBFFFFF'/
5033 data inaq1/x
'7FC00000'/
5034 data inaq2/x
'7FFFFFFF'/
5035 data inaq3/x
'FFC00000'/
5036 data inaq4/x
'FFFFFFFF'/
5038 real(kind=8)a(l),rtc,t1,t2
5045 if( (itest .GE. inan1 .AND. itest .LE. inan2) .OR.
5046 * (itest .GE. inan3 .AND. itest .LE. inan4) )
then
5047 print *,
' NaNs detected at word',k,
' ',c
5050 if( (itest .GE. inaq1 .AND. itest .LE. inaq2) .OR.
5051 * (itest .GE. inaq3 .AND. itest .LE. inaq4) )
then
5052 print *,
' NaNq detected at word',k,
' ',c
5060 102
format(
' time to check ',i9,
' words is ',f10.4,
' ',a24)
5069 character(8) :: date
5070 character(10) :: time
5071 character(5) :: zone
5072 integer,
dimension(8) :: values
5075 call date_and_time(date,time,zone,values)
5076 total=(3600*values(5))+(60*values(6))
5078 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...
subroutine read_g(glob, ITOPO)
Read input global 30-arc second orography data.
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 ...