61 character(SCRIP_charLength),
private ::
67 character(8),
private ::
70 integer (SCRIP_i4),
dimension(:),
allocatable,
private ::
80 integer (SCRIP_i4),
private ::
93 &, nc_srcgrdcntrlat_id
94 &, nc_dstgrdcntrlat_id
95 &, nc_srcgrdcntrlon_id
96 &, nc_dstgrdcntrlon_id
99 &, nc_srcgrdcrnrlat_id
100 &, nc_srcgrdcrnrlon_id
101 &, nc_dstgrdcrnrlat_id
102 &, nc_dstgrdcrnrlon_id
111 integer (SCRIP_i4),
dimension(2),
private ::
120 subroutine write_remap(map1_name, map2_name, interp_file1,
121 & interp_file2, output_opt, l_master, errorCode)
135 character(SCRIP_charLength),
intent(in) ::
142 logical,
intent(in) ::
151 integer (SCRIP_i4),
intent(out) ::
160 character (11),
parameter :: rtnName =
'write_remap'
172 normalize_opt =
'none'
174 normalize_opt =
'fracarea'
176 normalize_opt =
'destarea'
181 map_method =
'Conservative remapping'
183 map_method =
'Bilinear remapping'
185 map_method =
'Distance weighted avg of nearest neighbors'
187 map_method =
'Bicubic remapping'
189 map_method =
'Particle remapping'
195 call date_and_time(date=cdate)
196 write (history,1000) cdate(5:6),cdate(7:8),cdate(1:4)
197 1000
format(
'Created: ',a2,
'-',a2,
'-',a4)
219 select case(output_opt)
224 &
'error in write_remap_scrip'))
return
228 &
'error in write_remap_csm'))
return
231 &
'unknown output file convention')
242 select case(output_opt)
247 &
'error in write_remap_scrip'))
return
251 &
'error in write_remap_csm'))
return
254 &
'unknown output file convention')
280 character(SCRIP_charLength),
intent(in) ::
284 integer (SCRIP_i4),
intent(in) ::
294 integer (SCRIP_i4),
intent(out) ::
303 character(SCRIP_charLength) ::
307 integer (SCRIP_i4) ::
313 character (17),
parameter :: rtnName =
'write_remap_scrip'
323 ncstat = nf90_create(interp_file, nf90_clobber, nc_file_id)
325 &
'error creating remap file'))
return
330 ncstat = nf90_put_att(nc_file_id, nf90_global,
'title', map_name)
332 &
'error writing remap name'))
return
337 ncstat = nf90_put_att(nc_file_id, nf90_global,
'normalization',
340 &
'error writing normalize option'))
return
345 ncstat = nf90_put_att(nc_file_id, nf90_global,
'map_method',
348 &
'error writing remap method'))
return
353 ncstat = nf90_put_att(nc_file_id, nf90_global,
'history',
356 &
'error writing history'))
return
362 ncstat = nf90_put_att(nc_file_id, nf90_global,
'conventions',
365 &
'error writing output convention'))
return
371 if (direction == 1)
then
372 grid1_ctmp =
'source_grid'
373 grid2_ctmp =
'dest_grid'
375 grid1_ctmp =
'dest_grid'
376 grid2_ctmp =
'source_grid'
379 ncstat = nf90_put_att(nc_file_id, nf90_global, trim(grid1_ctmp),
382 &
'error writing source grid name'))
return
384 ncstat = nf90_put_att(nc_file_id, nf90_global, trim(grid2_ctmp),
387 &
'error writing destination grid name'))
return
399 if (direction == 1)
then
407 ncstat = nf90_def_dim(nc_file_id,
'src_grid_size', itmp1,
410 &
'error defining source grid size'))
return
412 ncstat = nf90_def_dim(nc_file_id,
'dst_grid_size', itmp2,
415 &
'error defining destination grid size'))
return
421 if (direction == 1)
then
429 ncstat = nf90_def_dim(nc_file_id,
'src_grid_corners',
430 & itmp1, nc_srcgrdcorn_id)
432 &
'error defining num corners on source grid'))
return
434 ncstat = nf90_def_dim(nc_file_id,
'dst_grid_corners',
435 & itmp2, nc_dstgrdcorn_id)
437 &
'error defining num corners on destination grid'))
return
443 if (direction == 1)
then
451 ncstat = nf90_def_dim(nc_file_id,
'src_grid_rank',
452 & itmp1, nc_srcgrdrank_id)
454 &
'error defining source grid rank'))
return
456 ncstat = nf90_def_dim(nc_file_id,
'dst_grid_rank',
457 & itmp2, nc_dstgrdrank_id)
459 &
'error defining destination grid rank'))
return
465 if (direction == 1)
then
471 ncstat = nf90_def_dim(nc_file_id,
'num_links',
472 & itmp1, nc_numlinks_id)
474 &
'error defining remap size'))
return
476 ncstat = nf90_def_dim(nc_file_id,
'num_wgts',
479 &
'error defining number of weights'))
return
485 ncstat = nf90_def_var(nc_file_id,
'src_grid_dims', nf90_int,
486 & nc_srcgrdrank_id, nc_srcgrddims_id)
488 &
'error defining source grid dims'))
return
490 ncstat = nf90_def_var(nc_file_id,
'dst_grid_dims', nf90_int,
491 & nc_dstgrdrank_id, nc_dstgrddims_id)
493 &
'error defining destination grid dims'))
return
505 ncstat = nf90_def_var(nc_file_id,
'src_grid_center_lat',
506 & nf90_double, nc_srcgrdsize_id,
507 & nc_srcgrdcntrlat_id)
509 &
'error defining source grid center lat'))
return
511 ncstat = nf90_def_var(nc_file_id,
'dst_grid_center_lat',
512 & nf90_double, nc_dstgrdsize_id,
513 & nc_dstgrdcntrlat_id)
515 &
'error defining destination grid center lat'))
return
521 ncstat = nf90_def_var(nc_file_id,
'src_grid_center_lon',
522 & nf90_double, nc_srcgrdsize_id,
523 & nc_srcgrdcntrlon_id)
525 &
'error defining source grid center lon'))
return
527 ncstat = nf90_def_var(nc_file_id,
'dst_grid_center_lon',
528 & nf90_double, nc_dstgrdsize_id,
529 & nc_dstgrdcntrlon_id)
531 &
'error defining destination grid center lon'))
return
537 nc_dims2_id(1) = nc_srcgrdcorn_id
538 nc_dims2_id(2) = nc_srcgrdsize_id
540 ncstat = nf90_def_var(nc_file_id,
'src_grid_corner_lat',
541 & nf90_double, nc_dims2_id,
542 & nc_srcgrdcrnrlat_id)
544 &
'error defining source grid corner lats'))
return
546 ncstat = nf90_def_var(nc_file_id,
'src_grid_corner_lon',
547 & nf90_double, nc_dims2_id,
548 & nc_srcgrdcrnrlon_id)
550 &
'error defining source grid corner lons'))
return
552 nc_dims2_id(1) = nc_dstgrdcorn_id
553 nc_dims2_id(2) = nc_dstgrdsize_id
555 ncstat = nf90_def_var(nc_file_id,
'dst_grid_corner_lat',
556 & nf90_double, nc_dims2_id,
557 & nc_dstgrdcrnrlat_id)
559 &
'error defining destination grid corner lats'))
return
561 ncstat = nf90_def_var(nc_file_id,
'dst_grid_corner_lon',
562 & nf90_double, nc_dims2_id,
563 & nc_dstgrdcrnrlon_id)
565 &
'error defining destination grid corner lons'))
return
571 if (direction == 1)
then
579 ncstat = nf90_put_att(nc_file_id, nc_srcgrdcntrlat_id,
580 &
'units', grid1_ctmp)
582 &
'error writing source grid units'))
return
584 ncstat = nf90_put_att(nc_file_id, nc_dstgrdcntrlat_id,
585 &
'units', grid2_ctmp)
587 &
'error writing destination grid units'))
return
589 ncstat = nf90_put_att(nc_file_id, nc_srcgrdcntrlon_id,
590 &
'units', grid1_ctmp)
592 &
'error writing source grid units'))
return
594 ncstat = nf90_put_att(nc_file_id, nc_dstgrdcntrlon_id,
595 &
'units', grid2_ctmp)
597 &
'error writing destination grid units'))
return
599 ncstat = nf90_put_att(nc_file_id, nc_srcgrdcrnrlat_id,
600 &
'units', grid1_ctmp)
602 &
'error writing source grid units'))
return
604 ncstat = nf90_put_att(nc_file_id, nc_srcgrdcrnrlon_id,
605 &
'units', grid1_ctmp)
607 &
'error writing source grid units'))
return
609 ncstat = nf90_put_att(nc_file_id, nc_dstgrdcrnrlat_id,
610 &
'units', grid2_ctmp)
612 &
'error writing destination grid units'))
return
614 ncstat = nf90_put_att(nc_file_id, nc_dstgrdcrnrlon_id,
615 &
'units', grid2_ctmp)
617 &
'error writing destination grid units'))
return
623 ncstat = nf90_def_var(nc_file_id,
'src_grid_imask', nf90_int,
624 & nc_srcgrdsize_id, nc_srcgrdimask_id)
626 &
'error defining source grid mask'))
return
628 ncstat = nf90_put_att(nc_file_id, nc_srcgrdimask_id,
629 &
'units',
'unitless')
631 &
'error writing source grid mask units'))
return
633 ncstat = nf90_def_var(nc_file_id,
'dst_grid_imask', nf90_int,
634 & nc_dstgrdsize_id, nc_dstgrdimask_id)
636 &
'error defining destination grid mask'))
return
638 ncstat = nf90_put_att(nc_file_id, nc_dstgrdimask_id,
639 &
'units',
'unitless')
641 &
'error writing destination grid mask units'))
return
647 ncstat = nf90_def_var(nc_file_id,
'src_grid_area',
648 & nf90_double, nc_srcgrdsize_id,
651 &
'error defining source grid area'))
return
653 ncstat = nf90_put_att(nc_file_id, nc_srcgrdarea_id,
654 &
'units',
'square radians')
656 &
'error writing source area units'))
return
658 ncstat = nf90_def_var(nc_file_id,
'dst_grid_area',
659 & nf90_double, nc_dstgrdsize_id,
662 &
'error defining destination grid area'))
return
664 ncstat = nf90_put_att(nc_file_id, nc_dstgrdarea_id,
665 &
'units',
'square radians')
667 &
'error writing destination area units'))
return
673 ncstat = nf90_def_var(nc_file_id,
'src_grid_frac',
674 & nf90_double, nc_srcgrdsize_id,
677 &
'error defining source grid fraction'))
return
679 ncstat = nf90_put_att(nc_file_id, nc_srcgrdfrac_id,
680 &
'units',
'unitless')
682 &
'error writing source fraction units'))
return
684 ncstat = nf90_def_var(nc_file_id,
'dst_grid_frac',
685 & nf90_double, nc_dstgrdsize_id,
688 &
'error defining destination fraction'))
return
690 ncstat = nf90_put_att(nc_file_id, nc_dstgrdfrac_id,
691 &
'units',
'unitless')
693 &
'error writing destination frac units'))
return
699 ncstat = nf90_def_var(nc_file_id,
'src_address',
700 & nf90_int, nc_numlinks_id,
703 &
'error defining source addresses'))
return
705 ncstat = nf90_def_var(nc_file_id,
'dst_address',
706 & nf90_int, nc_numlinks_id,
709 &
'error defining destination addresses'))
return
711 nc_dims2_id(1) = nc_numwgts_id
712 nc_dims2_id(2) = nc_numlinks_id
714 ncstat = nf90_def_var(nc_file_id,
'remap_matrix',
715 & nf90_double, nc_dims2_id,
718 &
'error defining remapping weights'))
return
724 ncstat = nf90_enddef(nc_file_id)
726 &
'error ending definition phase'))
return
734 if (direction == 1)
then
773 if (
grid1_units(1:7) ==
'degrees' .and. direction == 1)
then
780 if (
grid2_units(1:7) ==
'degrees' .and. direction == 1)
then
793 if (direction == 1)
then
794 itmp1 = nc_srcgrddims_id
795 itmp2 = nc_dstgrddims_id
797 itmp2 = nc_srcgrddims_id
798 itmp1 = nc_dstgrddims_id
801 ncstat = nf90_put_var(nc_file_id, itmp1,
grid1_dims)
803 &
'error writing source grid dims'))
return
805 ncstat = nf90_put_var(nc_file_id, itmp2,
grid2_dims)
807 &
'error writing destination grid dims'))
return
809 ncstat = nf90_put_var(nc_file_id, nc_srcgrdimask_id, src_mask_int)
811 &
'error writing source grid mask'))
return
813 ncstat = nf90_put_var(nc_file_id, nc_dstgrdimask_id, dst_mask_int)
815 &
'error writing destination grid mask'))
return
817 deallocate(src_mask_int, dst_mask_int)
819 if (direction == 1)
then
820 itmp1 = nc_srcgrdcntrlat_id
821 itmp2 = nc_srcgrdcntrlon_id
822 itmp3 = nc_srcgrdcrnrlat_id
823 itmp4 = nc_srcgrdcrnrlon_id
825 itmp1 = nc_dstgrdcntrlat_id
826 itmp2 = nc_dstgrdcntrlon_id
827 itmp3 = nc_dstgrdcrnrlat_id
828 itmp4 = nc_dstgrdcrnrlon_id
833 &
'error writing source grid center lats'))
return
837 &
'error writing source grid center lons'))
return
841 &
'error writing source grid corner lats'))
return
845 &
'error writing source grid corner lons'))
return
847 if (direction == 1)
then
848 itmp1 = nc_dstgrdcntrlat_id
849 itmp2 = nc_dstgrdcntrlon_id
850 itmp3 = nc_dstgrdcrnrlat_id
851 itmp4 = nc_dstgrdcrnrlon_id
853 itmp1 = nc_srcgrdcntrlat_id
854 itmp2 = nc_srcgrdcntrlon_id
855 itmp3 = nc_srcgrdcrnrlat_id
856 itmp4 = nc_srcgrdcrnrlon_id
861 &
'error writing destination grid center lats'))
return
865 &
'error writing destination grid center lons'))
return
869 &
'error writing destination grid corner lats'))
return
873 &
'error writing destination grid corner lons'))
return
875 if (direction == 1)
then
876 itmp1 = nc_srcgrdarea_id
877 itmp2 = nc_srcgrdfrac_id
878 itmp3 = nc_dstgrdarea_id
879 itmp4 = nc_dstgrdfrac_id
881 itmp1 = nc_dstgrdarea_id
882 itmp2 = nc_dstgrdfrac_id
883 itmp3 = nc_srcgrdarea_id
884 itmp4 = nc_srcgrdfrac_id
890 ncstat = nf90_put_var(nc_file_id, itmp1,
grid1_area)
893 &
'error writing grid1 area'))
return
895 ncstat = nf90_put_var(nc_file_id, itmp2,
grid1_frac)
897 &
'error writing grid1 frac'))
return
902 ncstat = nf90_put_var(nc_file_id, itmp3,
grid2_area)
905 &
'error writing grid2 area'))
return
907 ncstat = nf90_put_var(nc_file_id, itmp4,
grid2_frac)
909 &
'error writing grid2 frac'))
return
911 if (direction == 1)
then
912 ncstat = nf90_put_var(nc_file_id, nc_srcadd_id,
915 &
'error writing source addresses'))
return
917 ncstat = nf90_put_var(nc_file_id, nc_dstadd_id,
920 &
'error writing destination addresses'))
return
922 ncstat = nf90_put_var(nc_file_id, nc_rmpmatrix_id,
wts_map1)
924 &
'error writing weights'))
return
926 ncstat = nf90_put_var(nc_file_id, nc_srcadd_id,
929 &
'error writing source addresses'))
return
931 ncstat = nf90_put_var(nc_file_id, nc_dstadd_id,
934 &
'error writing destination addresses'))
return
936 ncstat = nf90_put_var(nc_file_id, nc_rmpmatrix_id,
wts_map2)
938 &
'error writing weights'))
return
941 ncstat = nf90_close(nc_file_id)
943 &
'error closing file'))
return
952 & output_opt, l_master, errorCode)
969 character(SCRIP_charLength),
intent(in) ::
973 logical,
intent(in) ::
982 integer (SCRIP_i4),
intent(out) ::
991 character (15),
parameter :: rtnName =
'write_remap_ww3'
1003 map1_name_pass = map1_name
1004 interp_file1_pass = interp_file1
1008 normalize_opt =
'none'
1010 normalize_opt =
'fracarea'
1012 normalize_opt =
'destarea'
1017 map_method =
'Conservative remapping'
1019 map_method =
'Bilinear remapping'
1021 map_method =
'Distance weighted avg of nearest neighbors'
1023 map_method =
'Bicubic remapping'
1025 map_method =
'Particle remapping'
1031 call date_and_time(date=cdate)
1032 write (history,1000) cdate(5:6),cdate(7:8),cdate(1:4)
1033 1000
format(
'Created: ',a2,
'-',a2,
'-',a4)
1052 select case(output_opt)
1056 & interp_file1_pass, errorcode)
1059 &
'error in write_remap_scrip'))
return
1062 &
'unknown output file convention')
1087 character(SCRIP_charLength),
intent(in) ::
1097 integer (SCRIP_i4),
intent(out) ::
1106 character(SCRIP_charLength) ::
1112 integer (SCRIP_i4) ::
1119 character (21),
parameter :: rtnName =
'write_remap_scrip_ww3'
1128 map_name_ctmp = map_name
1129 interp_file_ctmp = trim(interp_file)
1131 itmp1 = len(interp_file_ctmp)
1132 itmp2 = len_trim(interp_file_ctmp)
1133 ncstat = nf90_create(interp_file_ctmp, nf90_clobber, nc_file_id)
1135 &
'error creating remap file'))
return
1140 ncstat = nf90_put_att(nc_file_id, nf90_global,
'title', map_name)
1142 &
'error writing remap name'))
return
1147 ncstat = nf90_put_att(nc_file_id, nf90_global,
'normalization',
1150 &
'error writing normalize option'))
return
1155 ncstat = nf90_put_att(nc_file_id, nf90_global,
'map_method',
1158 &
'error writing remap method'))
return
1163 ncstat = nf90_put_att(nc_file_id, nf90_global,
'history',
1166 &
'error writing history'))
return
1171 convention =
'SCRIP'
1172 ncstat = nf90_put_att(nc_file_id, nf90_global,
'conventions',
1175 &
'error writing output convention'))
return
1181 grid1_ctmp =
'source_grid'
1182 grid2_ctmp =
'dest_grid'
1184 ncstat = nf90_put_att(nc_file_id, nf90_global, trim(grid1_ctmp),
1187 &
'error writing source grid name'))
return
1189 ncstat = nf90_put_att(nc_file_id, nf90_global, trim(grid2_ctmp),
1192 &
'error writing destination grid name'))
return
1206 ncstat = nf90_def_dim(nc_file_id,
'dst_grid_size', itmp2,
1209 &
'error defining destination grid size'))
return
1217 ncstat = nf90_def_dim(nc_file_id,
'num_links',
1218 & itmp1, nc_numlinks_id)
1220 &
'error defining remap size'))
return
1222 ncstat = nf90_def_dim(nc_file_id,
'num_wgts',
1225 &
'error defining number of weights'))
return
1239 ncstat = nf90_def_var(nc_file_id,
'dst_grid_frac',
1240 & nf90_double, nc_dstgrdsize_id,
1243 &
'error defining destination fraction'))
return
1245 ncstat = nf90_put_att(nc_file_id, nc_dstgrdfrac_id,
1246 &
'units',
'unitless')
1248 &
'error writing destination frac units'))
return
1254 ncstat = nf90_def_var(nc_file_id,
'src_address',
1255 & nf90_int, nc_numlinks_id,
1258 &
'error defining source addresses'))
return
1260 ncstat = nf90_def_var(nc_file_id,
'dst_address',
1261 & nf90_int, nc_numlinks_id,
1264 &
'error defining destination addresses'))
return
1266 nc_dims2_id(1) = nc_numwgts_id
1267 nc_dims2_id(2) = nc_numlinks_id
1269 ncstat = nf90_def_var(nc_file_id,
'remap_matrix',
1270 & nf90_double, nc_dims2_id,
1273 &
'error defining remapping weights'))
return
1279 ncstat = nf90_enddef(nc_file_id)
1281 &
'error ending definition phase'))
return
1288 itmp4 = nc_dstgrdfrac_id
1290 ncstat = nf90_put_var(nc_file_id, itmp4,
grid2_frac)
1292 &
'error writing grid2 frac'))
return
1294 ncstat = nf90_put_var(nc_file_id, nc_srcadd_id,
1297 &
'error writing source addresses'))
return
1299 ncstat = nf90_put_var(nc_file_id, nc_dstadd_id,
1302 &
'error writing destination addresses'))
return
1304 ncstat = nf90_put_var(nc_file_id, nc_rmpmatrix_id,
wts_map1)
1306 &
'error writing weights'))
return
1309 ncstat = nf90_close(nc_file_id)
1311 &
'error closing file'))
return
1335 character(SCRIP_charLength),
intent(in) ::
1339 integer (SCRIP_i4),
intent(in) ::
1349 integer (SCRIP_i4),
intent(out) ::
1358 character(SCRIP_charLength) ::
1362 integer (SCRIP_i4) ::
1374 real (SCRIP_r8),
dimension(:),
allocatable ::
1377 real (SCRIP_r8),
dimension(:,:),
allocatable ::
1380 character (15),
parameter :: rtnName =
'write_remap_csm'
1390 ncstat = nf90_create(interp_file, nf90_clobber, nc_file_id)
1392 &
'error opening file'))
return
1397 ncstat = nf90_put_att(nc_file_id, nf90_global,
'title', map_name)
1399 &
'error writing remap name'))
return
1404 ncstat = nf90_put_att(nc_file_id, nf90_global,
'normalization',
1407 &
'error writing normalization option'))
return
1412 ncstat = nf90_put_att(nc_file_id, nf90_global,
'map_method',
1415 &
'error writing remap method'))
return
1420 ncstat = nf90_put_att(nc_file_id, nf90_global,
'history',
1423 &
'error writing history'))
return
1428 convention =
'NCAR-CSM'
1429 ncstat = nf90_put_att(nc_file_id, nf90_global,
'conventions',
1432 &
'error writing output convention'))
return
1438 if (direction == 1)
then
1439 grid1_ctmp =
'domain_a'
1440 grid2_ctmp =
'domain_b'
1442 grid1_ctmp =
'domain_b'
1443 grid2_ctmp =
'domain_a'
1446 ncstat = nf90_put_att(nc_file_id, nf90_global, trim(grid1_ctmp),
1449 &
'error writing grid1 name'))
return
1451 ncstat = nf90_put_att(nc_file_id, nf90_global, trim(grid2_ctmp),
1454 &
'error writing grid2 name'))
return
1466 if (direction == 1)
then
1474 ncstat = nf90_def_dim(nc_file_id,
'n_a', itmp1, nc_srcgrdsize_id)
1476 &
'error defining source grid size'))
return
1478 ncstat = nf90_def_dim(nc_file_id,
'n_b', itmp2, nc_dstgrdsize_id)
1480 &
'error defining destination grid size'))
return
1486 if (direction == 1)
then
1494 ncstat = nf90_def_dim(nc_file_id,
'nv_a', itmp1, nc_srcgrdcorn_id)
1496 &
'error defining number of corners on source grid'))
return
1498 ncstat = nf90_def_dim(nc_file_id,
'nv_b', itmp2, nc_dstgrdcorn_id)
1500 &
'error defining number of corners on destination grid'))
return
1506 if (direction == 1)
then
1514 ncstat = nf90_def_dim(nc_file_id,
'src_grid_rank',
1515 & itmp1, nc_srcgrdrank_id)
1517 &
'error defining source grid rank'))
return
1519 ncstat = nf90_def_dim(nc_file_id,
'dst_grid_rank',
1520 & itmp2, nc_dstgrdrank_id)
1522 &
'error defining destination grid rank'))
return
1528 if (direction == 1)
then
1556 ncstat = nf90_def_dim(nc_file_id,
'ni_a', itmp1, nc_src_isize_id)
1558 &
'error defining source isize'))
return
1560 ncstat = nf90_def_dim(nc_file_id,
'nj_a', itmp2, nc_src_jsize_id)
1562 &
'error defining source jsize'))
return
1564 ncstat = nf90_def_dim(nc_file_id,
'ni_b', itmp3, nc_dst_isize_id)
1566 &
'error defining destination isize'))
return
1568 ncstat = nf90_def_dim(nc_file_id,
'nj_b', itmp4, nc_dst_jsize_id)
1570 &
'error defining destination jsize'))
return
1576 if (direction == 1)
then
1582 ncstat = nf90_def_dim(nc_file_id,
'n_s', itmp1, nc_numlinks_id)
1584 &
'error defining remap size'))
return
1586 ncstat = nf90_def_dim(nc_file_id,
'num_wgts',
1589 &
'error defining number of weights'))
return
1592 ncstat = nf90_def_dim(nc_file_id,
'num_wgts1',
1595 &
'error defining number of weights1'))
return
1602 ncstat = nf90_def_var(nc_file_id,
'src_grid_dims', nf90_int,
1603 & nc_srcgrdrank_id, nc_srcgrddims_id)
1605 &
'error defining source grid dims'))
return
1607 ncstat = nf90_def_var(nc_file_id,
'dst_grid_dims', nf90_int,
1608 & nc_dstgrdrank_id, nc_dstgrddims_id)
1610 &
'error defining destination grid dims'))
return
1622 ncstat = nf90_def_var(nc_file_id,
'yc_a',
1623 & nf90_double, nc_srcgrdsize_id,
1624 & nc_srcgrdcntrlat_id)
1626 &
'error defining source grid center lats'))
return
1628 ncstat = nf90_def_var(nc_file_id,
'yc_b',
1629 & nf90_double, nc_dstgrdsize_id,
1630 & nc_dstgrdcntrlat_id)
1632 &
'error defining destination grid center lats'))
return
1638 ncstat = nf90_def_var(nc_file_id,
'xc_a',
1639 & nf90_double, nc_srcgrdsize_id,
1640 & nc_srcgrdcntrlon_id)
1642 &
'error defining source grid center lons'))
return
1644 ncstat = nf90_def_var(nc_file_id,
'xc_b',
1645 & nf90_double, nc_dstgrdsize_id,
1646 & nc_dstgrdcntrlon_id)
1648 &
'error defining destination grid center lons'))
return
1654 nc_dims2_id(1) = nc_srcgrdcorn_id
1655 nc_dims2_id(2) = nc_srcgrdsize_id
1657 ncstat = nf90_def_var(nc_file_id,
'yv_a',
1658 & nf90_double, nc_dims2_id,
1659 & nc_srcgrdcrnrlat_id)
1661 &
'error defining source grid corner lats'))
return
1663 ncstat = nf90_def_var(nc_file_id,
'xv_a',
1664 & nf90_double, nc_dims2_id,
1665 & nc_srcgrdcrnrlon_id)
1667 &
'error defining source grid corner lons'))
return
1669 nc_dims2_id(1) = nc_dstgrdcorn_id
1670 nc_dims2_id(2) = nc_dstgrdsize_id
1672 ncstat = nf90_def_var(nc_file_id,
'yv_b',
1673 & nf90_double, nc_dims2_id,
1674 & nc_dstgrdcrnrlat_id)
1676 &
'error defining destination grid corner lats'))
return
1678 ncstat = nf90_def_var(nc_file_id,
'xv_b',
1679 & nf90_double, nc_dims2_id,
1680 & nc_dstgrdcrnrlon_id)
1682 &
'error defining destination grid corner lons'))
return
1691 if (direction == 1)
then
1699 ncstat = nf90_put_att(nc_file_id, nc_srcgrdcntrlat_id,
1700 &
'units', grid1_ctmp)
1702 &
'error writing grid units'))
return
1704 ncstat = nf90_put_att(nc_file_id, nc_dstgrdcntrlat_id,
1705 &
'units', grid2_ctmp)
1707 &
'error writing grid units'))
return
1709 ncstat = nf90_put_att(nc_file_id, nc_srcgrdcntrlon_id,
1710 &
'units', grid1_ctmp)
1712 &
'error writing grid units'))
return
1714 ncstat = nf90_put_att(nc_file_id, nc_dstgrdcntrlon_id,
1715 &
'units', grid2_ctmp)
1717 &
'error writing grid units'))
return
1719 ncstat = nf90_put_att(nc_file_id, nc_srcgrdcrnrlat_id,
1720 &
'units', grid1_ctmp)
1722 &
'error writing grid units'))
return
1724 ncstat = nf90_put_att(nc_file_id, nc_srcgrdcrnrlon_id,
1725 &
'units', grid1_ctmp)
1727 &
'error writing grid units'))
return
1729 ncstat = nf90_put_att(nc_file_id, nc_dstgrdcrnrlat_id,
1730 &
'units', grid2_ctmp)
1732 &
'error writing grid units'))
return
1734 ncstat = nf90_put_att(nc_file_id, nc_dstgrdcrnrlon_id,
1735 &
'units', grid2_ctmp)
1737 &
'error writing grid units'))
return
1743 ncstat = nf90_def_var(nc_file_id,
'mask_a', nf90_int,
1744 & nc_srcgrdsize_id, nc_srcgrdimask_id)
1746 &
'error defining source grid mask'))
return
1748 ncstat = nf90_put_att(nc_file_id, nc_srcgrdimask_id,
1749 &
'units',
'unitless')
1751 &
'error writing source mask units'))
return
1753 ncstat = nf90_def_var(nc_file_id,
'mask_b', nf90_int,
1754 & nc_dstgrdsize_id, nc_dstgrdimask_id)
1756 &
'error defining destination grid mask'))
return
1758 ncstat = nf90_put_att(nc_file_id, nc_dstgrdimask_id,
1759 &
'units',
'unitless')
1761 &
'error writing destination mask units'))
return
1767 ncstat = nf90_def_var(nc_file_id,
'area_a',
1768 & nf90_double, nc_srcgrdsize_id,
1771 &
'error defining source grid area'))
return
1773 ncstat = nf90_put_att(nc_file_id, nc_srcgrdarea_id,
1774 &
'units',
'square radians')
1776 &
'error defining source area units'))
return
1778 ncstat = nf90_def_var(nc_file_id,
'area_b',
1779 & nf90_double, nc_dstgrdsize_id,
1782 &
'error defining destination grid area'))
return
1784 ncstat = nf90_put_att(nc_file_id, nc_dstgrdarea_id,
1785 &
'units',
'square radians')
1787 &
'error defining destination area units'))
return
1793 ncstat = nf90_def_var(nc_file_id,
'frac_a',
1794 & nf90_double, nc_srcgrdsize_id,
1797 &
'error defining source grid frac'))
return
1799 ncstat = nf90_put_att(nc_file_id, nc_srcgrdfrac_id,
1800 &
'units',
'unitless')
1802 &
'error defining source frac units'))
return
1804 ncstat = nf90_def_var(nc_file_id,
'frac_b',
1805 & nf90_double, nc_dstgrdsize_id,
1808 &
'error defining destination grid frac'))
return
1810 ncstat = nf90_put_att(nc_file_id, nc_dstgrdfrac_id,
1811 &
'units',
'unitless')
1813 &
'error defining destination frac units'))
return
1819 ncstat = nf90_def_var(nc_file_id,
'col',
1820 & nf90_int, nc_numlinks_id,
1823 &
'error defining source addresses'))
return
1825 ncstat = nf90_def_var(nc_file_id,
'row',
1826 & nf90_int, nc_numlinks_id,
1829 &
'error defining destination addresses'))
return
1831 ncstat = nf90_def_var(nc_file_id,
'S',
1832 & nf90_double, nc_numlinks_id,
1835 &
'error defining weights'))
return
1838 nc_dims2_id(1) = nc_numwgts1_id
1839 nc_dims2_id(2) = nc_numlinks_id
1841 ncstat = nf90_def_var(nc_file_id,
'S2',
1842 & nf90_double, nc_dims2_id,
1845 &
'error defining weights2'))
return
1852 ncstat = nf90_enddef(nc_file_id)
1854 &
'error ending definition phase'))
return
1862 if (direction == 1)
then
1902 if (
grid1_units(1:7) ==
'degrees' .and. direction == 1)
then
1909 if (
grid2_units(1:7) ==
'degrees' .and. direction == 1)
then
1922 if (direction == 1)
then
1923 itmp1 = nc_srcgrddims_id
1924 itmp2 = nc_dstgrddims_id
1926 itmp2 = nc_srcgrddims_id
1927 itmp1 = nc_dstgrddims_id
1930 ncstat = nf90_put_var(nc_file_id, itmp1,
grid1_dims)
1932 &
'error writing grid1 dims'))
return
1934 ncstat = nf90_put_var(nc_file_id, itmp2,
grid2_dims)
1936 &
'error writing grid2 dims'))
return
1938 ncstat = nf90_put_var(nc_file_id, nc_srcgrdimask_id,
1941 &
'error writing source grid mask'))
return
1943 ncstat = nf90_put_var(nc_file_id, nc_dstgrdimask_id,
1946 &
'error writing destination grid mask'))
return
1948 deallocate(src_mask_int, dst_mask_int)
1950 if (direction == 1)
then
1951 itmp1 = nc_srcgrdcntrlat_id
1952 itmp2 = nc_srcgrdcntrlon_id
1953 itmp3 = nc_srcgrdcrnrlat_id
1954 itmp4 = nc_srcgrdcrnrlon_id
1956 itmp1 = nc_dstgrdcntrlat_id
1957 itmp2 = nc_dstgrdcntrlon_id
1958 itmp3 = nc_dstgrdcrnrlat_id
1959 itmp4 = nc_dstgrdcrnrlon_id
1964 &
'error writing grid1 center lats'))
return
1968 &
'error writing grid1 center lons'))
return
1972 &
'error writing grid1 corner lats'))
return
1976 &
'error writing grid1 corner lons'))
return
1978 if (direction == 1)
then
1979 itmp1 = nc_dstgrdcntrlat_id
1980 itmp2 = nc_dstgrdcntrlon_id
1981 itmp3 = nc_dstgrdcrnrlat_id
1982 itmp4 = nc_dstgrdcrnrlon_id
1984 itmp1 = nc_srcgrdcntrlat_id
1985 itmp2 = nc_srcgrdcntrlon_id
1986 itmp3 = nc_srcgrdcrnrlat_id
1987 itmp4 = nc_srcgrdcrnrlon_id
1992 &
'error writing grid2 center lats'))
return
1996 &
'error writing grid2 center lons'))
return
2000 &
'error writing grid2 corner lats'))
return
2004 &
'error writing grid2 corner lons'))
return
2006 if (direction == 1)
then
2007 itmp1 = nc_srcgrdarea_id
2008 itmp2 = nc_srcgrdfrac_id
2009 itmp3 = nc_dstgrdarea_id
2010 itmp4 = nc_dstgrdfrac_id
2012 itmp1 = nc_dstgrdarea_id
2013 itmp2 = nc_dstgrdfrac_id
2014 itmp3 = nc_srcgrdarea_id
2015 itmp4 = nc_srcgrdfrac_id
2021 ncstat = nf90_put_var(nc_file_id, itmp1,
grid1_area)
2024 &
'error writing grid1 area'))
return
2026 ncstat = nf90_put_var(nc_file_id, itmp2,
grid1_frac)
2028 &
'error writing grid1 frac'))
return
2031 ncstat = nf90_put_var(nc_file_id, itmp3,
grid2_area)
2033 ncstat = nf90_put_var(nc_file_id, itmp3,
grid2_area)
2036 &
'error writing grid2 area'))
return
2038 ncstat = nf90_put_var(nc_file_id, itmp4,
grid2_frac)
2040 &
'error writing grid2 frac'))
return
2042 if (direction == 1)
then
2043 ncstat = nf90_put_var(nc_file_id, nc_srcadd_id,
2046 &
'error writing source addresses'))
return
2048 ncstat = nf90_put_var(nc_file_id, nc_dstadd_id,
2051 &
'error writing destination addresses'))
return
2054 ncstat = nf90_put_var(nc_file_id, nc_rmpmatrix_id,
2057 &
'error writing weights'))
return
2064 ncstat = nf90_put_var(nc_file_id, nc_rmpmatrix_id, wts1)
2066 &
'error writing weights1'))
return
2067 ncstat = nf90_put_var(nc_file_id, nc_rmpmatrix2_id, wts2)
2069 &
'error writing weights2'))
return
2070 deallocate(wts1,wts2)
2073 ncstat = nf90_put_var(nc_file_id, nc_srcadd_id,
2076 &
'error writing source addresses'))
return
2078 ncstat = nf90_put_var(nc_file_id, nc_dstadd_id,
2081 &
'error writing destination addresses'))
return
2084 ncstat = nf90_put_var(nc_file_id, nc_rmpmatrix_id,
2087 &
'error writing weights'))
return
2094 ncstat = nf90_put_var(nc_file_id, nc_rmpmatrix_id, wts1)
2096 &
'error writing weights1'))
return
2097 ncstat = nf90_put_var(nc_file_id, nc_rmpmatrix2_id, wts2)
2099 &
'error writing weights2'))
return
2100 deallocate(wts1,wts2)
2104 ncstat = nf90_close(nc_file_id)
2106 &
'error closing file'))
return
2114 subroutine sort_add(add1, add2, weights)
2132 integer (SCRIP_i4),
intent(inout),
dimension(:) ::
2136 real (SCRIP_r8),
intent(inout),
dimension(:,:) ::
2145 integer (SCRIP_i4) ::
2148 & add1_tmp, add2_tmp,
2150 & chk_lvl1, chk_lvl2, max_lvl
2152 real (SCRIP_r8),
dimension(SIZE(weights,DIM=1)) ::
2161 num_links =
SIZE(add1)
2162 num_wts =
SIZE(weights, dim=1)
2171 do lvl=num_links/2,1,-1
2174 add1_tmp = add1(lvl)
2175 add2_tmp = add2(lvl)
2176 wgttmp(:) = weights(:,lvl)
2189 chk_lvl1 = 2*final_lvl
2190 chk_lvl2 = 2*final_lvl+1
2191 if (chk_lvl1 .EQ. num_links) chk_lvl2 = chk_lvl1
2193 if ((add1(chk_lvl1) > add1(chk_lvl2)) .OR.
2194 & ((add1(chk_lvl1) == add1(chk_lvl2)) .AND.
2195 & (add2(chk_lvl1) > add2(chk_lvl2))))
then
2206 if ((add1_tmp .GT. add1(max_lvl)) .OR.
2207 & ((add1_tmp .EQ. add1(max_lvl)) .AND.
2208 & (add2_tmp .GT. add2(max_lvl))))
then
2209 add1(final_lvl) = add1_tmp
2210 add2(final_lvl) = add2_tmp
2211 weights(:,final_lvl) = wgttmp(:)
2222 add1(final_lvl) = add1(max_lvl)
2223 add2(final_lvl) = add2(max_lvl)
2224 weights(:,final_lvl) = weights(:,max_lvl)
2227 if (2*final_lvl > num_links)
then
2228 add1(final_lvl) = add1_tmp
2229 add2(final_lvl) = add2_tmp
2230 weights(:,final_lvl) = wgttmp(:)
2244 do lvl=num_links,3,-1
2250 add1_tmp = add1(lvl)
2253 add2_tmp = add2(lvl)
2256 wgttmp(:) = weights(:,lvl)
2257 weights(:,lvl) = weights(:,1)
2272 chk_lvl1 = 2*final_lvl
2273 chk_lvl2 = 2*final_lvl+1
2274 if (chk_lvl2 >= lvl) chk_lvl2 = chk_lvl1
2276 if ((add1(chk_lvl1) > add1(chk_lvl2)) .OR.
2277 & ((add1(chk_lvl1) == add1(chk_lvl2)) .AND.
2278 & (add2(chk_lvl1) > add2(chk_lvl2))))
then
2289 if ((add1_tmp > add1(max_lvl)) .OR.
2290 & ((add1_tmp == add1(max_lvl)) .AND.
2291 & (add2_tmp > add2(max_lvl))))
then
2292 add1(final_lvl) = add1_tmp
2293 add2(final_lvl) = add2_tmp
2294 weights(:,final_lvl) = wgttmp(:)
2305 add1(final_lvl) = add1(max_lvl)
2306 add2(final_lvl) = add2(max_lvl)
2307 weights(:,final_lvl) = weights(:,max_lvl)
2310 if (2*final_lvl >= lvl)
then
2311 add1(final_lvl) = add1_tmp
2312 add2(final_lvl) = add2_tmp
2313 weights(:,final_lvl) = wgttmp(:)
2333 wgttmp(:) = weights(:,2)
2334 weights(:,2) = weights(:,1)
2335 weights(:,1) = wgttmp(:)