631 logical,
intent(in) :: regional
632 integer :: fsize=65536
633 integer :: status, ncid, id_dim, id_var, ncid2, t
634 integer :: ni, nj, i, j, tw, te, ip
635 real :: g1(2), g2(2), g3(2), g4(2), g5(2)
637 real :: p_lL(2), p_uL(2), p_lR(2), p_uR(2)
638 character(len=512) :: tile_file
639 real,
allocatable,
dimension(:,:) :: tmpvar, geolon_c_nest, geolat_c_nest
640 real,
allocatable,
dimension(:,:,:) :: geolon_c, geolat_c
641 real,
allocatable,
dimension(:,:,:) :: geolon_t, geolat_t, cos_sg, grid3
642 integer :: start(4), nread(4)
644 print*,
"Read the grid from file "//trim(grid_file)
646 status=nf__open(trim(grid_file),nf_nowrite,fsize,ncid)
647 call handle_err(status,
'Open file '//trim(grid_file) )
649 status=nf_inq_dimid(ncid,
'ntiles', id_dim)
650 call handle_err(status,
'inquire dimension ntiles from file '//trim(grid_file) )
651 status=nf_inq_dimlen(ncid,id_dim,ntiles)
652 call handle_err(status,
'inquire dimension ntiles length from file '//trim(grid_file) )
654 if( ntiles == 6)
then
655 print*,
" read_grid_file: This is a global grid."
656 elseif( ntiles >= 6 )
then
657 print*,
" read_grid_file: This is a nested grid."
658 print*,
" filter only the globe."
660 elseif( ntiles == 1 )
then
661 print*,
" read_grid_file: This is a standalone regional grid."
670 start(2) = t; nread(1) = 255
671 status = nf_inq_varid(ncid,
'gridfiles', id_var)
672 call handle_err(status,
'inquire varid of gridfiles from file '//trim(grid_file) )
675 status = nf_get_vara_text(ncid, id_var, start, nread, tile_file )
676 call handle_err(status,
'get value of gridfiles from file '//trim(grid_file) )
678 status=nf__open(trim(tile_file),nf_nowrite,fsize,ncid2)
679 call handle_err(status,
'Open file '//trim(tile_file) )
681 status=nf_inq_dimid(ncid2,
'nx', id_dim)
682 call handle_err(status,
'inquire dimension nx from file '//trim(grid_file) )
683 status=nf_inq_dimlen(ncid2,id_dim,ni)
684 call handle_err(status,
'inquire dimension nx length from file '//trim(grid_file) )
685 status=nf_inq_dimid(ncid2,
'ny', id_dim)
686 call handle_err(status,
'inquire dimension ny from file '//trim(grid_file) )
687 status=nf_inq_dimlen(ncid2,id_dim,nj)
688 call handle_err(status,
'inquire dimension ny length '//
'from file '//trim(grid_file) )
691 if(mod(ni,2) .NE. 0 .or. mod(nj,2) .NE. 0) &
692 call handle_err(-1,
"read_grid_file: ni and nj must be even")
703 allocate(tmpvar(ni+1,nj+1))
704 allocate(geolon_c(isd:ied+1,jsd:jed+1,6))
705 allocate(geolat_c(isd:ied+1,jsd:jed+1,6))
706 else if ( t == 7 )
then
707 if(mod(ni,2) .NE. 0 .or. mod(nj,2) .NE. 0) &
708 call handle_err(-1,
"read_grid_file: ni and nj must be even")
712 npx_nest = nx_nest + 1
713 npy_nest = ny_nest + 1
714 is_nest = 1 ; ie_nest = nx
715 js_nest = 1 ; je_nest = ny
716 isd_nest=is_nest-ng; ied_nest=ie_nest+ng
717 jsd_nest=js_nest-ng; jed_nest=je_nest+ng
719 allocate(tmpvar(ni+1,nj+1))
720 allocate(geolon_c_nest(isd:ied+1,jsd:jed+1))
721 allocate(geolat_c_nest(isd:ied+1,jsd:jed+1))
724 if(ni .ne. nx*2 .OR. nj .ne. ny*2) &
725 call handle_err(-1,
"mismatch of grid size between tiles")
728 status=nf_inq_varid(ncid2,
'x', id_var)
729 call handle_err(status,
'inquire varid of x from file '//trim(grid_file) )
730 status=nf_get_var_double(ncid2, id_var, tmpvar)
731 call handle_err(status,
'inquire data of x from file '//trim(grid_file) )
733 geolon_c_nest(1:npx,1:npy) = tmpvar(1:ni+1:2,1:nj+1:2)*pi/180.
735 geolon_c(1:npx,1:npy,t) = tmpvar(1:ni+1:2,1:nj+1:2)*pi/180.
738 status=nf_inq_varid(ncid2,
'y', id_var)
739 call handle_err(status,
'inquire varid of y from file '//trim(grid_file) )
740 status=nf_get_var_double(ncid2, id_var, tmpvar)
741 call handle_err(status,
'inquire data of y from file '//trim(grid_file) )
743 geolat_c_nest(1:npx,1:npy) = tmpvar(1:ni+1:2,1:nj+1:2)*pi/180.
745 geolat_c(1:npx,1:npy,t) = tmpvar(1:ni+1:2,1:nj+1:2)*pi/180.
747 status = nf_close(ncid2)
748 call handle_err(status,
"close file "//trim(tile_file))
753 status = nf_close(ncid)
754 call handle_err(status,
"close file "//trim(grid_file))
761 if( .not. regional )
then
767 call fill_regional_halo(geolon_c, ng)
768 call fill_regional_halo(geolat_c, ng)
772 allocate(geolon_t(isd:ied,jsd:jed,ntiles), geolat_t(isd:ied,jsd:jed,ntiles))
774 geolon_t(:,:,:) = -1.e25
775 geolat_t(:,:,:) = -1.e25
779 do j=js,je ;
do i=is,ie
780 g1(1) = geolon_c(i,j,t); g1(2) = geolat_c(i,j,t)
781 g2(1) = geolon_c(i+1,j,t); g2(2) = geolat_c(i+1,j,t)
782 g3(1) = geolon_c(i,j+1,t); g3(2) = geolat_c(i,j+1,t)
783 g4(1) = geolon_c(i+1,j+1,t); g4(2) = geolat_c(i+1,j+1,t)
785 geolon_t(i,j,t) = g5(1)
786 geolat_t(i,j,t) = g5(2)
791 if( .not. regional )
then
799 allocate(dx(isd:ied,jsd:jed+1,ntiles))
800 allocate(dy(isd:ied+1,jsd:jed,ntiles))
803 do j = js, je+1 ;
do i = is, ie
804 g1(1) = geolon_c(i ,j,t)
805 g1(2) = geolat_c(i ,j,t)
806 g2(1) = geolon_c(i+1,j,t)
807 g2(2) = geolat_c(i+1,j,t)
816 g1(1) = geolon_c(i,j, t)
817 g1(2) = geolat_c(i,j, t)
818 g2(1) = geolon_c(i,j+1,t)
819 g2(2) = geolat_c(i,j+1,t)
826 if( .not. regional )
then
829 if(mod(t,2) ==0)
then
832 if(te > ntiles) te = te - ntiles
833 dy(is, js:je,t) = dy(ie+1,js:je,tw)
834 dy(ie+1, js:je, t) = dx(ie:is:-1,js, te)
837 if( tw <= 0) tw = tw + ntiles
839 dy(is, js:je, t) = dx(ie:is:-1, je+1, tw)
840 dy(ie+1, js:je,t) = dy(1,js:je,te)
851 allocate(dxa(isd:ied,jsd:jed,ntiles))
852 allocate(dya(isd:ied,jsd:jed,ntiles))
855 do j=js,je ;
do i=is,ie
856 g1(1) = geolon_c(i,j,t); g1(2) = geolat_c(i,j,t)
857 g2(1) = geolon_c(i,j+1,t); g2(2) = geolat_c(i,j+1,t)
859 g1(1) = geolon_c(i+1,j,t); g1(2) = geolat_c(i+1,j,t)
860 g2(1) = geolon_c(i+1,j+1,t); g2(2) = geolat_c(i+1,j+1,t)
863 g1(1) = geolon_c(i,j,t); g1(2) = geolat_c(i,j,t)
864 g2(1) = geolon_c(i+1,j,t); g2(2) = geolat_c(i+1,j,t)
866 g1(1) = geolon_c(i,j+1,t); g1(2) = geolat_c(i,j+1,t)
867 g2(1) = geolon_c(i+1,j+1,t); g2(2) = geolat_c(i+1,j+1,t)
874 if( .not.regional )
then
882 allocate(dxc(isd:ied+1,jsd:jed,ntiles))
883 allocate(dyc(isd:ied,jsd:jed+1,ntiles))
889 g1(1) = geolon_c(i,j,t); g1(2) = geolat_c(i,j,t)
890 g2(1) = geolon_c(i-1,j,t); g2(2) = geolat_c(i-1,j,t)
893 dxc(isd,j,t) = dxc(isd+1,j,t)
894 dxc(ied+1,j,t) = dxc(ied,j,t)
901 g1(1) = geolon_c(i,j,t); g1(2) = geolat_c(i,j,t)
902 g2(1) = geolon_c(i,j-1,t); g2(2) = geolat_c(i,j-1,t)
910 dyc(i,jsd,t) = dyc(i,jsd+1,t)
911 dyc(i,jed+1,t) = dyc(i,jed,t)
917 allocate(area(isd:ied,jsd:jed,ntiles))
922 p_ll(1) = geolon_c(i ,j ,t) ; p_ll(2) = geolat_c(i ,j ,t)
923 p_ul(1) = geolon_c(i ,j+1,t) ; p_ul(2) = geolat_c(i ,j+1,t)
924 p_lr(1) = geolon_c(i+1,j ,t) ; p_lr(2) = geolat_c(i+1,j ,t)
925 p_ur(1) = geolon_c(i+1,j+1,t) ; p_ur(2) = geolat_c(i+1,j+1,t)
928 area(i,j,t) =
get_area(p_ll, p_ul, p_lr, p_ur, radius)
934 if( .not.regional )
then
938 da_min = minval(area(is:ie,js:je,:))
941 allocate(sin_sg(4,isd:ied,jsd:jed,ntiles))
942 allocate(cos_sg(4,isd:ied,jsd:jed))
943 allocate(grid3(3, npx, npy))
944 cos_sg(:,:,:) = big_number
945 sin_sg(:,:,:,:) = tiny_number
957 g1(1) = geolon_c(i,j,t)
958 g1(2) = geolat_c(i,j,t)
967 g1(1) = geolon_t(i,j,t); g1(2) = geolat_t(i,j,t)
970 cos_sg(1,i,j) =
cos_angle( p1, p3, grid3(1,i,j+1) )
972 cos_sg(2,i,j) =
cos_angle( p1, grid3(1,i+1,j), p3 )
974 cos_sg(3,i,j) =
cos_angle( p1, p3, grid3(1,i+1,j) )
976 cos_sg(4,i,j) =
cos_angle( p1, grid3(1,i,j+1), p3 )
985 sin_sg(ip,i,j,t) = min(1.0, sqrt( max(0., 1.-cos_sg(ip,i,j)**2) ) )
992 if( .not.regional )
then
994 call fill_cubic_grid_halo(sin_sg(ip,:,:,:), sin_sg(ip,:,:,:), ng, 0, 0, 1, 1)
998 deallocate(cos_sg, grid3, geolon_c, geolat_c, geolon_t, geolat_t)
1224 subroutine fv3_zs_filter (is, ie, js, je, isd, ied, jsd, jed, npx, npy, npx_global, ntiles, &
1225 grid_type, stretch_fac, nested, area, dxa, dya, dx, dy, dxc, dyc, &
1226 sin_sg, phis, regional )
1227 integer,
intent(in) :: is, ie, js, je, ntiles
1228 integer,
intent(in) :: isd, ied, jsd, jed, npx, npy, npx_global, grid_type
1229 real,
intent(in),
dimension(isd:ied,jsd:jed, ntiles)::area, dxa, dya
1230 real,
intent(in),
dimension(isd:ied, jsd:jed+1, ntiles):: dx, dyc
1231 real,
intent(in),
dimension(isd:ied+1,jsd:jed, ntiles):: dy, dxc
1233 real,
intent(IN):: sin_sg(4,isd:ied,jsd:jed,ntiles)
1234 real,
intent(IN):: stretch_fac
1235 logical,
intent(IN) :: nested, regional
1236 real,
intent(inout):: phis(isd:ied,jsd:jed,ntiles)
1238 integer mdim, n_del2, n_del4
1240 mdim = nint( real(npx_global) * min(10., stretch_fac) )
1243 if ( npx_global<=97 )
then
1245 elseif ( npx_global<=193 )
then
1253 call two_delta_filter(is,ie,js,je,isd,ied,jsd,jed, npx, npy, ntiles, phis, area, &
1254 dx, dy, dxa, dya, dxc, dyc, sin_sg, cd2, zero_ocean, &
1255 .true.,0, grid_type, mask, nested, n_del2, regional)
1258 if ( mdim<=193 )
then
1260 elseif ( mdim<=1537 )
then
1265 call del4_cubed_sphere(is,ie,js,je,isd,ied,jsd,jed,npx, npy, ntiles, &
1266 phis, area, dx, dy, dxc, dyc, sin_sg, n_del4, zero_ocean, mask, nested, regional)
1269 call two_delta_filter(is,ie,js,je,isd,ied,jsd,jed,npx, npy, ntiles, &
1270 phis, area, dx, dy, dxa, dya, dxc, dyc, sin_sg, cd2, zero_ocean, &
1271 .true., 1, grid_type, mask, nested, n_del2_weak, regional)
1307 subroutine two_delta_filter(is, ie, js, je, isd, ied, jsd, jed, npx, npy, ntiles, &
1308 q, area, dx, dy, dxa, dya, dxc, dyc, sin_sg, cd, zero_ocean, &
1309 check_slope, filter_type, grid_type, mask, nested, ntmax, regional)
1310 integer,
intent(in) :: is, ie, js, je
1311 integer,
intent(in) :: isd, ied, jsd, jed
1312 integer,
intent(in) :: npx, npy, grid_type
1313 integer,
intent(in) :: ntmax, ntiles
1314 integer,
intent(in) :: filter_type
1315 real,
intent(in) :: cd
1317 real,
intent(in)::area(isd:ied, jsd:jed, ntiles)
1318 real,
intent(in):: dx(isd:ied, jsd:jed+1, ntiles)
1319 real,
intent(in):: dy(isd:ied+1,jsd:jed, ntiles)
1320 real,
intent(in):: dxa(isd:ied, jsd:jed, ntiles)
1321 real,
intent(in):: dya(isd:ied, jsd:jed, ntiles)
1322 real,
intent(in):: dxc(isd:ied+1,jsd:jed, ntiles)
1323 real,
intent(in):: dyc(isd:ied, jsd:jed+1, ntiles)
1324 real,
intent(in):: sin_sg(4,isd:ied,jsd:jed, ntiles)
1325 real,
intent(in):: mask(isd:ied, jsd:jed, ntiles)
1326 logical,
intent(in):: zero_ocean, check_slope
1327 logical,
intent(in):: nested, regional
1329 real,
intent(inout):: q(isd:ied, jsd:jed,ntiles)
1331 real,
parameter:: p1 = 7./12.
1332 real,
parameter:: p2 = -1./12.
1333 real,
parameter:: c1 = -2./14.
1334 real,
parameter:: c2 = 11./14.
1335 real,
parameter:: c3 = 5./14.
1337 real:: ddx(is:ie+1,js:je), ddy(is:ie,js:je+1)
1338 logical:: extm(is-1:ie+1)
1339 logical:: ext2(is:ie,js-1:je+1)
1340 real:: a1(is-1:ie+2)
1341 real:: a2(is:ie,js-1:je+2)
1342 real:: a3(is:ie,js:je,ntiles)
1343 real:: smax, m_slope, fac
1344 integer:: i,j, nt, t
1345 integer:: is1, ie2, js1, je2
1347 if ( .not. nested .and. grid_type<3 )
then
1348 is1 = max(3,is-1); ie2 = min(npx-2,ie+2)
1349 js1 = max(3,js-1); je2 = min(npy-2,je+2)
1351 is1 = is-1; ie2 = ie+2
1352 js1 = js-1; je2 = je+2
1355 if ( check_slope )
then
1363 if( .not.regional )
then
1368 if ( nt==1 .and. check_slope )
then
1372 ddx(i,j) = (q(i,j,t) - q(i-1,j,t))/dxc(i,j,t)
1373 ddx(i,j) = abs(ddx(i,j))
1378 ddy(i,j) = (q(i,j,t) - q(i,j-1,t))/dyc(i,j,t)
1379 ddy(i,j) = abs(ddy(i,j))
1384 a3(i,j,t) = max( ddx(i,j), ddx(i+1,j), ddy(i,j), ddy(i,j+1) )
1388 smax = maxval(a3(is:ie,js:je,:))
1389 write(*,*)
'Before filter: Max_slope=', smax
1394 if ( .not. nested .and. nt==1 )
then
1396 q(1,1,t) = (q(1,1,t)*area(1,1,t)+q(0,1,t)*area(0,1,t)+q(1,0,t)*area(1,0,t)) &
1397 / ( area(1,1,t)+ area(0,1,t)+ area(1,0,t) )
1401 q(ie, 1,t) = (q(ie,1,t)*area(ie,1,t)+q(npx,1,t)*area(npx,1,t)+q(ie,0,t)*area(ie,0,t)) &
1402 / ( area(ie,1,t)+ area(npx,1,t)+ area(ie,0,t))
1403 q(npx,1,t) = q(ie,1,t)
1404 q(ie, 0,t) = q(ie,1,t)
1406 q(1, je,t) = (q(1,je,t)*area(1,je,t)+q(0,je,t)*area(0,je,t)+q(1,npy,t)*area(1,npy,t)) &
1407 / ( area(1,je,t)+ area(0,je,t)+ area(1,npy,t))
1408 q(0, je,t) = q(1,je,t)
1409 q(1,npy,t) = q(1,je,t)
1411 q(ie, je,t) = (q(ie,je,t)*area(ie,je,t)+q(npx,je,t)*area(npx,je,t)+q(ie,npy,t)*area(ie,npy,t)) &
1412 / ( area(ie,je,t)+ area(npx,je,t)+ area(ie,npy,t))
1413 q(npx,je,t) = q(ie,je,t)
1414 q(ie,npy,t) = q(ie,je,t)
1416 if( .not.regional )
then
1426 a1(i) = p1*(q(i-1,j,t)+q(i,j,t)) + p2*(q(i-2,j,t)+q(i+1,j,t))
1429 if ( (.not. (nested .or. regional)) .and. grid_type<3 )
then
1430 a1(0) = c1*q(-2,j,t) + c2*q(-1,j,t) + c3*q(0,j,t)
1431 a1(1) = 0.5*(((2.*dxa(0,j,t)+dxa(-1,j,t))*q(0,j,t)-dxa(0,j,t)*q(-1,j,t))/(dxa(-1,j,t)+dxa(0,j,t)) &
1432 + ((2.*dxa(1,j,t)+dxa( 2,j,t))*q(1,j,t)-dxa(1,j,t)*q( 2,j,t))/(dxa(1, j,t)+dxa(2,j,t)))
1433 a1(2) = c3*q(1,j,t) + c2*q(2,j,t) +c1*q(3,j,t)
1435 a1(npx-1) = c1*q(npx-3,j,t) + c2*q(npx-2,j,t) + c3*q(npx-1,j,t)
1436 a1(npx) = 0.5*(((2.*dxa(npx-1,j,t)+dxa(npx-2,j,t))*q(npx-1,j,t)-dxa(npx-1,j,t)*q(npx-2,j,t)) &
1437 /(dxa(npx-2,j,t)+dxa(npx-1,j,t)) &
1438 + ((2.*dxa(npx, j,t)+dxa(npx+1,j,t))*q(npx, j,t)-dxa(npx, j,t)*q(npx+1,j,t))/ &
1439 (dxa(npx, j,t)+dxa(npx+1,j,t)))
1440 a1(npx+1) = c3*q(npx,j,t) + c2*q(npx+1,j,t) + c1*q(npx+2,j,t)
1443 if ( regional .and. grid_type<3 )
then
1444 a1(0) = c1*q(-1,j,t) + c2*q(-1,j,t) + c3*q(0,j,t)
1445 a1(2) = c3*q(1,j,t) + c2*q(2,j,t) + c1*q(3,j,t)
1446 a1(1) = 0.5*(a1(0) + a1(2))
1448 a1(npx-1) = c1*q(npx-3,j,t) + c2*q(npx-2,j,t) + c3*q(npx-1,j,t)
1449 a1(npx+1) = c3*q(npx,j,t) + c2*q(npx+1,j,t) + c1*q(npx+2,j,t)
1450 a1(npx) = 0.5*(a1(npx-1)+a1(npx+1))
1453 if ( filter_type == 0 )
then
1455 if( abs(3.*(a1(i)+a1(i+1)-2.*q(i,j,t))) > abs(a1(i)-a1(i+1)) )
then
1463 if ( (a1(i)-q(i,j,t))*(a1(i+1)-q(i,j,t)) > 0. )
then
1472 ddx(i,j) = (q(i-1,j,t)-q(i,j,t))/dxc(i,j,t)
1473 if ( extm(i-1).and.extm(i) )
then
1474 ddx(i,j) = 0.5*(sin_sg(3,i-1,j,t)+sin_sg(1,i,j,t))*dy(i,j,t)*ddx(i,j)
1475 elseif ( abs(ddx(i,j)) > m_slope )
then
1476 fac = min(1., max( 0.1, ( abs(ddx(i,j))-m_slope )/m_slope) )
1477 ddx(i,j) = fac*0.5*(sin_sg(3,i-1,j,t)+sin_sg(1,i,j,t))*dy(i,j,t)*ddx(i,j)
1487 a2(i,j) = p1*(q(i,j-1,t)+q(i,j,t)) + p2*(q(i,j-2,t)+q(i,j+1,t))
1490 if ( (.not. (nested .or. regional)) .and. grid_type<3 )
then
1492 a2(i,0) = c1*q(i,-2,t) + c2*q(i,-1,t) + c3*q(i,0,t)
1493 a2(i,1) = 0.5*(((2.*dya(i,0,t)+dya(i,-1,t))*q(i,0,t)-dya(i,0,t)*q(i,-1,t))/(dya(i,-1,t)+dya(i,0,t)) &
1494 + ((2.*dya(i,1,t)+dya(i, 2,t))*q(i,1,t)-dya(i,1,t)*q(i, 2,t))/(dya(i, 1,t)+dya(i,2,t)))
1495 a2(i,2) = c3*q(i,1,t) + c2*q(i,2,t) + c1*q(i,3,t)
1499 a2(i,npy-1) = c1*q(i,npy-3,t) + c2*q(i,npy-2,t) + c3*q(i,npy-1,t)
1500 a2(i,npy) = 0.5*(((2.*dya(i,npy-1,t)+dya(i,npy-2,t))*q(i,npy-1,t)-dya(i,npy-1,t)*q(i,npy-2,t))/ &
1501 (dya(i,npy-2,t)+dya(i,npy-1,t)) &
1502 + ((2.*dya(i,npy,t)+dya(i,npy+1,t))*q(i,npy,t)-dya(i,npy,t)*q(i,npy+1,t))/&
1503 (dya(i,npy,t)+dya(i,npy+1,t)))
1504 a2(i,npy+1) = c3*q(i,npy,t) + c2*q(i,npy+1,t) + c1*q(i,npy+2,t)
1508 if ( regional .and. grid_type<3 )
then
1510 a2(i,0) = c1*q(i,-2,t) + c2*q(i,-1,t) + c3*q(i,0,t)
1511 a2(i,2) = c3*q(i,1,t) + c2*q(i,2,t) + c1*q(i,3,t)
1512 a2(i,1) = 0.5*(a2(i,0) + a2(i,2))
1516 a2(i,npy-1) = c1*q(i,npy-3,t) + c2*q(i,npy-2,t) + c3*q(i,npy-1,t)
1517 a2(i,npy+1) = c3*q(i,npy,t) + c2*q(i,npy+1,t) + c1*q(i,npy+2,t)
1518 a2(i,npy) = 0.5*(a2(i,npy-1)+a2(i,npy+1))
1522 if ( filter_type == 0 )
then
1525 if( abs(3.*(a2(i,j)+a2(i,j+1)-2.*q(i,j,t))) > abs(a2(i,j)-a2(i,j+1)) )
then
1535 if ( (a2(i,j)-q(i,j,t))*(a2(i,j+1)-q(i,j,t)) > 0. )
then
1546 ddy(i,j) = (q(i,j-1,t)-q(i,j,t))/dyc(i,j,t)
1547 if ( ext2(i,j-1) .and. ext2(i,j) )
then
1548 ddy(i,j) = 0.5*(sin_sg(4,i,j-1,t)+sin_sg(2,i,j,t))*dx(i,j,t)*ddy(i,j)
1549 elseif ( abs(ddy(i,j))>m_slope )
then
1550 fac = min(1., max(0.1,(abs(ddy(i,j))-m_slope)/m_slope))
1551 ddy(i,j) = fac*0.5*(sin_sg(4,i,j-1,t)+sin_sg(2,i,j,t))*dx(i,j,t)*ddy(i,j)
1558 if ( zero_ocean )
then
1562 ddx(i,j) = max(0., min(mask(i-1,j,t), mask(i,j,t))) * ddx(i,j)
1567 ddy(i,j) = max(0., min(mask(i,j-1,t), mask(i,j,t))) * ddy(i,j)
1574 q(i,j,t) = q(i,j,t) + cd/area(i,j,t)*(ddx(i,j)-ddx(i+1,j)+ddy(i,j)-ddy(i,j+1))
1581 if ( check_slope )
then
1582 if( .not.regional )
then
1588 ddx(i,j) = (q(i,j,t) - q(i-1,j,t))/dxc(i,j,t)
1589 ddx(i,j) = abs(ddx(i,j))
1594 ddy(i,j) = (q(i,j,t) - q(i,j-1,t))/dyc(i,j,t)
1595 ddy(i,j) = abs(ddy(i,j))
1600 a3(i,j,t) = max( ddx(i,j), ddx(i+1,j), ddy(i,j), ddy(i,j+1) )
1604 smax = maxval(a3(is:ie,js:je,:))
1605 write(*,*)
'After filter: Max_slope=', smax
1637 subroutine del2_cubed_sphere(is, ie, js, je, isd, ied, jsd, jed, npx, npy, ntiles,&
1638 q, area, dx, dy, dxc, dyc, sin_sg, nmax, cd, zero_ocean, mask, nested, regional)
1639 integer,
intent(in) :: is, ie, js, je
1640 integer,
intent(in) :: isd, ied, jsd, jed
1641 integer,
intent(in):: npx, npy, ntiles
1642 integer,
intent(in):: nmax
1643 real,
intent(in):: cd
1644 logical,
intent(in):: zero_ocean
1646 real,
intent(in)::area(isd:ied, jsd:jed, ntiles)
1647 real,
intent(in):: dx(isd:ied, jsd:jed+1, ntiles)
1648 real,
intent(in):: dy(isd:ied+1,jsd:jed, ntiles)
1649 real,
intent(in):: dxc(isd:ied+1,jsd:jed, ntiles)
1650 real,
intent(in):: dyc(isd:ied, jsd:jed+1, ntiles)
1651 real,
intent(IN):: sin_sg(4,isd:ied,jsd:jed, ntiles)
1652 real,
intent(in):: mask(isd:ied, jsd:jed, ntiles)
1653 logical,
intent(IN) :: nested, regional
1656 real,
intent(inout):: q(is-ng:ie+ng, js-ng:je+ng, ntiles)
1658 real ddx(is:ie+1,js:je), ddy(is:ie,js:je+1)
1661 if( .not.regional )
then
1667 if ( .not. nested)
then
1668 q(1,1,t) = (q(1,1,t)*area(1,1,t)+q(0,1,t)*area(0,1,t)+q(1,0,t)*area(1,0,t)) &
1669 / ( area(1,1,t)+ area(0,1,t)+ area(1,0,t) )
1673 if ( .not. nested)
then
1674 q(ie, 1,t) = (q(ie,1,t)*area(ie,1,t)+q(npx,1,t)*area(npx,1,t)+q(ie,0,t)*area(ie,0,t)) &
1675 / ( area(ie,1,t)+ area(npx,1,t)+ area(ie,0,t))
1676 q(npx,1,t) = q(ie,1,t)
1677 q(ie, 0,t) = q(ie,1,t)
1679 if ( .not. nested )
then
1680 q(ie, je,t) = (q(ie,je,t)*area(ie,je,t)+q(npx,je,t)*area(npx,je,t)+q(ie,npy,t)*area(ie,npy,t)) &
1681 / ( area(ie,je,t)+ area(npx,je,t)+ area(ie,npy,t))
1682 q(npx,je,t) = q(ie,je,t)
1683 q(ie,npy,t) = q(ie,je,t)
1685 if ( .not. nested)
then
1686 q(1, je,t) = (q(1,je,t)*area(1,je,t)+q(0,je,t)*area(0,je,t)+q(1,npy,t)*area(1,npy,t)) &
1687 / ( area(1,je,t)+ area(0,je,t)+ area(1,npy,t))
1688 q(0, je,t) = q(1,je,t)
1689 q(1,npy,t) = q(1,je,t)
1694 if( .not.regional )
then
1700 ddx(i,j) = 0.5*(sin_sg(3,i-1,j,t)+sin_sg(1,i,j,t))*dy(i,j,t)*(q(i-1,j,t)-q(i,j,t))/dxc(i,j,t)
1705 ddy(i,j) = dx(i,j,t)*(q(i,j-1,t)-q(i,j,t))/dyc(i,j,t) &
1706 *0.5*(sin_sg(4,i,j-1,t)+sin_sg(2,i,j,t))
1710 if ( zero_ocean )
then
1714 ddx(i,j) = max(0., min(mask(i-1,j,t), mask(i,j,t))) * ddx(i,j)
1719 ddy(i,j) = max(0., min(mask(i,j-1,t), mask(i,j,t))) * ddy(i,j)
1726 q(i,j,t) = q(i,j,t) + cd/area(i,j,t)*(ddx(i,j)-ddx(i+1,j)+ddy(i,j)-ddy(i,j+1))
1760 subroutine del4_cubed_sphere(is, ie, js, je, isd, ied, jsd, jed, npx, npy, ntiles, &
1761 q, area, dx, dy, dxc, dyc, sin_sg, nmax, zero_ocean, mask, nested, regional)
1762 integer,
intent(in) :: is, ie, js, je
1763 integer,
intent(in) :: isd, ied, jsd, jed
1764 integer,
intent(in) :: npx, npy, nmax, ntiles
1765 logical,
intent(in) :: zero_ocean
1766 real,
intent(in):: mask(isd:ied, jsd:jed, ntiles)
1767 real,
intent(in)::area(isd:ied, jsd:jed, ntiles)
1768 real,
intent(in):: dx(isd:ied, jsd:jed+1, ntiles)
1769 real,
intent(in):: dy(isd:ied+1,jsd:jed, ntiles)
1770 real,
intent(in):: dxc(isd:ied+1,jsd:jed, ntiles)
1771 real,
intent(in):: dyc(isd:ied, jsd:jed+1, ntiles)
1772 real,
intent(IN):: sin_sg(4,isd:ied,jsd:jed, ntiles)
1773 real,
intent(inout):: q(isd:ied, jsd:jed, ntiles)
1774 logical,
intent(IN) :: nested, regional
1777 real :: diff(is-1:ie+1,js-1:je+1, ntiles)
1779 real :: fx1(is:ie+1,js:je), fy1(is:ie,js:je+1)
1780 real :: fx2(is:ie+1,js:je,ntiles), fy2(is:ie,js:je+1,ntiles)
1781 real :: fx4(is:ie+1,js:je,ntiles), fy4(is:ie,js:je+1,ntiles)
1782 real,
dimension(isd:ied,jsd:jed,ntiles):: d2, win, wou
1783 real,
dimension(is:ie,js:je, ntiles) :: qlow, qmin, qmax
1784 real,
parameter:: esl = 1.e-20
1793 do j=js-1,je+1 ;
do i=is-1,ie+1
1794 diff(i,j,t) = cd4*area(i,j,t)
1797 do j=js,je ;
do i=is,ie
1798 qmax(i,j,t) = q(i,j,t) * peak_fac
1799 qmin(i,j,t) = q(i,j,t) / peak_fac
1804 if( .not.regional )
then
1809 if ( .not. nested .and. n==1 )
then
1811 q(1,1,t) = (q(1,1,t)*area(1,1,t)+q(0,1,t)*area(0,1,t)+q(1,0,t)*area(1,0,t)) &
1812 / ( area(1,1,t)+ area(0,1,t)+ area(1,0,t) )
1817 q(ie, 1,t) = (q(ie,1,t)*area(ie,1,t)+q(npx,1,t)*area(npx,1,t)+q(ie,0,t)*area(ie,0,t)) &
1818 / ( area(ie,1,t)+ area(npx,1,t)+ area(ie,0,t))
1819 q(npx,1,t) = q(ie,1,t)
1820 q(ie, 0,t) = q(ie,1,t)
1821 q(npx,0,t) = q(ie,1,t)
1823 q(1, je,t) = (q(1,je,t)*area(1,je,t)+q(0,je,t)*area(0,je,t)+q(1,npy,t)*area(1,npy,t)) &
1824 / ( area(1,je,t)+ area(0,je,t)+ area(1,npy,t))
1825 q(0, je,t) = q(1,je,t)
1826 q(1,npy,t) = q(1,je,t)
1827 q(0,npy,t) = q(1,je,t)
1829 q(ie, je,t) = (q(ie,je,t)*area(ie,je,t)+q(npx,je,t)*area(npx,je,t)+q(ie,npy,t)*area(ie,npy,t)) &
1830 / ( area(ie,je,t)+ area(npx,je,t)+ area(ie,npy,t))
1831 q(npx, je,t) = q(ie,je,t)
1832 q(ie, npy,t) = q(ie,je,t)
1833 q(npx,npy,t) = q(ie,je,t)
1835 if( .not.regional )
then
1848 fx2(i,j,t) = 0.25*(diff(i-1,j,t)+diff(i,j,t))*dy(i,j,t)*(q(i-1,j,t)-q(i,j,t))/dxc(i,j,t) &
1849 *(sin_sg(1,i,j,t)+sin_sg(3,i-1,j,t))
1856 fy2(i,j,t) = 0.25*(diff(i,j-1,t)+diff(i,j,t))*dx(i,j,t)*(q(i,j-1,t)-q(i,j,t))/dyc(i,j,t) &
1857 *(sin_sg(2,i,j,t)+sin_sg(4,i,j-1,t))
1863 d2(i,j,t) = (fx2(i,j,t)-fx2(i+1,j,t)+fy2(i,j,t)-fy2(i,j+1,t)) / area(i,j,t)
1868 if ( zero_ocean )
then
1872 fx1(i,j) = max(0., min(mask(i-1,j,t), mask(i,j,t))) * fx2(i,j,t)
1877 fy1(i,j) = max(0., min(mask(i,j-1,t), mask(i,j,t))) * fy2(i,j,t)
1882 qlow(i,j,t) = q(i,j,t) + (fx1(i,j)-fx1(i+1,j)+fy1(i,j)-fy1(i,j+1)) / area(i,j,t)
1883 d2(i,j,t) = diff(i,j,t) * d2(i,j,t)
1889 qlow(i,j,t) = q(i,j,t) + d2(i,j,t)
1890 d2(i,j,t) = diff(i,j,t) * d2(i,j,t)
1895 if( .not.regional )
then
1906 fx4(i,j,t) = 0.5*(sin_sg(3,i-1,j,t)+sin_sg(1,i,j,t))*dy(i,j,t)*(d2(i,j,t)-d2(i-1,j,t))/dxc(i,j,t)-fx2(i,j,t)
1913 fy4(i,j,t) = dx(i,j,t)*(d2(i,j,t)-d2(i,j-1,t))/dyc(i,j,t) &
1914 *0.5*(sin_sg(2,i,j,t)+sin_sg(4,i,j-1,t))-fy2(i,j,t)
1920 qmin(i,j,t) = min(qmin(i,j,t), q(i-1,j-1,t), q(i,j-1,t), q(i+1,j-1,t), &
1921 q(i-1,j ,t), q(i,j ,t), q(i+1,j ,t), &
1922 q(i-1,j+1,t), q(i,j+1,t), q(i+1,j+1,t) )
1923 qmax(i,j,t) = max(qmax(i,j,t), q(i-1,j-1,t), q(i,j-1,t), q(i+1,j-1,t), &
1924 q(i-1,j ,t), q(i,j ,t), q(i+1,j ,t), &
1925 q(i-1,j+1,t), q(i,j+1,t), q(i+1,j+1,t) )
1934 win(i,j,t) = max(0.,fx4(i, j,t)) - min(0.,fx4(i+1,j,t)) + &
1935 max(0.,fy4(i, j,t)) - min(0.,fy4(i,j+1,t)) + esl
1936 wou(i,j,t) = max(0.,fx4(i+1,j,t)) - min(0.,fx4(i, j,t)) + &
1937 max(0.,fy4(i,j+1,t)) - min(0.,fy4(i, j,t)) + esl
1938 win(i,j,t) = max(0., qmax(i,j,t) - qlow(i,j,t)) / win(i,j,t)*area(i,j,t)
1939 wou(i,j,t) = max(0., qlow(i,j,t) - qmin(i,j,t)) / wou(i,j,t)*area(i,j,t)
1943 if( .not.regional )
then
1950 if ( fx4(i,j,t) > 0. )
then
1951 fx4(i,j,t) = min(1., wou(i-1,j,t), win(i,j,t)) * fx4(i,j,t)
1953 fx4(i,j,t) = min(1., win(i-1,j,t), wou(i,j,t)) * fx4(i,j,t)
1959 if ( fy4(i,j,t) > 0. )
then
1960 fy4(i,j,t) = min(1., wou(i,j-1,t), win(i,j,t)) * fy4(i,j,t)
1962 fy4(i,j,t) = min(1., win(i,j-1,t), wou(i,j,t)) * fy4(i,j,t)
1968 if ( zero_ocean )
then
1972 fx4(i,j,t) = max(0., min(mask(i-1,j,t), mask(i,j,t))) * fx4(i,j,t)
1977 fy4(i,j,t) = max(0., min(mask(i,j-1,t), mask(i,j,t))) * fy4(i,j,t)
1985 q(i,j,t) = qlow(i,j,t) + (fx4(i,j,t)-fx4(i+1,j,t)+fy4(i,j,t)-fy4(i,j+1,t))/area(i,j,t)