|
606 | 606 | ), |
607 | 607 | }, |
608 | 608 | ), |
| 609 | + "ds_ecco4": xr.Dataset( |
| 610 | + # ECCO V4r4 model dataset (from https://podaac.jpl.nasa.gov/dataset/ECCO_L4_OCEAN_VEL_LLC0090GRID_DAILY_V4R4#capability-modal-download) |
| 611 | + { |
| 612 | + "UVEL": ( |
| 613 | + ["time", "k", "tile", "j", "i_g"], |
| 614 | + np.random.rand(T, Z, 13, Y, X, dtype="float32"), |
| 615 | + { |
| 616 | + "long_name": "Horizontal velocity in the model +x direction", |
| 617 | + "units": "m s-1", |
| 618 | + "mate": "VVEL", |
| 619 | + "coverage_content_type": "modelResult", |
| 620 | + "direction": ">0 increases volume", |
| 621 | + "standard_name": "sea_water_x_velocity", |
| 622 | + "comment": "Horizontal velocity in the +x direction at the 'u' face of the tracer cell on the native model grid. Note: in the Arakawa-C grid, horizontal velocities are staggered relative to the tracer cells with indexing such that +UVEL(i_g,j,k) corresponds to +x fluxes through the 'u' face of the tracer cell at (i,j,k). Do NOT use UVEL for volume flux calculations because the model's grid cell thicknesses vary with time (z* coordinates); use UVELMASS instead. Also, the model +x direction does not necessarily correspond to the geographical east-west direction because the x and y axes of the model's curvilinear lat-lon-cap (llc) grid have arbitrary orientations which vary within and across tiles. See EVEL and NVEL for zonal and meridional velocity.", |
| 623 | + "valid_min": -2.139253616333008, |
| 624 | + "valid_max": 2.038635015487671, |
| 625 | + }, |
| 626 | + ), |
| 627 | + "VVEL": ( |
| 628 | + ["time", "k", "tile", "j_g", "i"], |
| 629 | + np.random.rand(T, Z, 13, Y, X, dtype="float32"), |
| 630 | + { |
| 631 | + "long_name": "Horizontal velocity in the model +y direction", |
| 632 | + "units": "m s-1", |
| 633 | + "mate": "UVEL", |
| 634 | + "coverage_content_type": "modelResult", |
| 635 | + "direction": ">0 increases volume", |
| 636 | + "standard_name": "sea_water_y_velocity", |
| 637 | + "comment": "Horizontal velocity in the +y direction at the 'v' face of the tracer cell on the native model grid. Note: in the Arakawa-C grid, horizontal velocities are staggered relative to the tracer cells with indexing such that +VVEL(i,j_g,k) corresponds to +y fluxes through the 'v' face of the tracer cell at (i,j,k). Do NOT use VVEL for volume flux calculations because the model's grid cell thicknesses vary with time (z* coordinates); use VVELMASS instead. Also, the model +y direction does not necessarily correspond to the geographical north-south direction because the x and y axes of the model's curvilinear lat-lon-cap (llc) grid have arbitrary orientations which vary within and across tiles. See EVEL and NVEL for zonal and meridional velocity.", |
| 638 | + "valid_min": -1.7877743244171143, |
| 639 | + "valid_max": 1.9089667797088623, |
| 640 | + }, |
| 641 | + ), |
| 642 | + "WVEL": ( |
| 643 | + ["time", "k_l", "tile", "j", "i"], |
| 644 | + np.random.rand(T, Z, 13, Y, X, dtype="float32"), |
| 645 | + { |
| 646 | + "long_name": "Vertical velocity", |
| 647 | + "units": "m s-1", |
| 648 | + "coverage_content_type": "modelResult", |
| 649 | + "direction": ">0 decreases volume", |
| 650 | + "standard_name": "upward_sea_water_velocity", |
| 651 | + "comment": "Vertical velocity in the +z direction at the top 'w' face of the tracer cell on the native model grid. Note: in the Arakawa-C grid, vertical velocities are staggered relative to the tracer cells with indexing such that +WVEL(i,j,k_l) corresponds to upward +z motion through the top 'w' face of the tracer cell at (i,j,k). WVEL is identical to WVELMASS.", |
| 652 | + "valid_min": -0.0023150660563260317, |
| 653 | + "valid_max": 0.0016380994347855449, |
| 654 | + }, |
| 655 | + ), |
| 656 | + }, |
| 657 | + coords={ |
| 658 | + "time": ( |
| 659 | + ["time"], |
| 660 | + TIME, |
| 661 | + { |
| 662 | + "long_name": "center time of averaging period", |
| 663 | + "standard_name": "time", |
| 664 | + "axis": "T", |
| 665 | + "bounds": "time_bnds", |
| 666 | + "coverage_content_type": "coordinate", |
| 667 | + }, |
| 668 | + ), |
| 669 | + "tile": ( |
| 670 | + ["tile"], |
| 671 | + np.arange(13, dtype="int32"), |
| 672 | + { |
| 673 | + "long_name": "lat-lon-cap tile index", |
| 674 | + "coverage_content_type": "coordinate", |
| 675 | + "comment": "The ECCO V4 horizontal model grid is divided into 13 tiles of 90x90 cells for convenience.", |
| 676 | + }, |
| 677 | + ), |
| 678 | + "k": ( |
| 679 | + ["k"], |
| 680 | + np.arange(Z, dtype="int32"), |
| 681 | + { |
| 682 | + "long_name": "grid index in z for tracer variables", |
| 683 | + "axis": "Z", |
| 684 | + "swap_dim": "Z", |
| 685 | + "coverage_content_type": "coordinate", |
| 686 | + }, |
| 687 | + ), |
| 688 | + "k_l": ( |
| 689 | + ["k_l"], |
| 690 | + np.arange(Z, dtype="int32"), |
| 691 | + { |
| 692 | + "long_name": "grid index in z corresponding to the top face of tracer grid cells ('w' locations)", |
| 693 | + "axis": "Z", |
| 694 | + "swap_dim": "Zl", |
| 695 | + "coverage_content_type": "coordinate", |
| 696 | + "c_grid_axis_shift": -0.5, |
| 697 | + "comment": "First index corresponds to the top surface of the uppermost tracer grid cell. The use of 'l' in the variable name follows the MITgcm convention for ocean variables in which the lower (l) face of a tracer grid cell on the logical grid corresponds to the top face of the grid cell on the physical grid.", |
| 698 | + }, |
| 699 | + ), |
| 700 | + "j": ( |
| 701 | + ["j"], |
| 702 | + np.arange(Y, dtype="int32"), |
| 703 | + { |
| 704 | + "long_name": "grid index in y for variables at tracer and 'u' locations", |
| 705 | + "axis": "Y", |
| 706 | + "swap_dim": "YC", |
| 707 | + "coverage_content_type": "coordinate", |
| 708 | + "comment": "In the Arakawa C-grid system, tracer (e.g., THETA) and 'u' variables (e.g., UVEL) have the same y coordinate on the model grid.", |
| 709 | + }, |
| 710 | + ), |
| 711 | + "j_g": ( |
| 712 | + ["j_g"], |
| 713 | + np.arange(Y, dtype="int32"), |
| 714 | + { |
| 715 | + "long_name": "grid index in y for variables at 'v' and 'g' locations", |
| 716 | + "axis": "Y", |
| 717 | + "swap_dim": "YG", |
| 718 | + "c_grid_axis_shift": -0.5, |
| 719 | + "coverage_content_type": "coordinate", |
| 720 | + "comment": "In the Arakawa C-grid system, 'v' (e.g., VVEL) and 'g' variables (e.g., XG) have the same y coordinate.", |
| 721 | + }, |
| 722 | + ), |
| 723 | + "i": ( |
| 724 | + ["i"], |
| 725 | + np.arange(X, dtype="int32"), |
| 726 | + { |
| 727 | + "long_name": "grid index in x for variables at tracer and 'v' locations", |
| 728 | + "axis": "X", |
| 729 | + "swap_dim": "XC", |
| 730 | + "coverage_content_type": "coordinate", |
| 731 | + "comment": "In the Arakawa C-grid system, tracer (e.g., THETA) and 'v' variables (e.g., VVEL) have the same x coordinate on the model grid.", |
| 732 | + }, |
| 733 | + ), |
| 734 | + "i_g": ( |
| 735 | + ["i_g"], |
| 736 | + np.arange(X, dtype="int32"), |
| 737 | + { |
| 738 | + "long_name": "grid index in x for variables at 'u' and 'g' locations", |
| 739 | + "axis": "X", |
| 740 | + "swap_dim": "XG", |
| 741 | + "c_grid_axis_shift": -0.5, |
| 742 | + "coverage_content_type": "coordinate", |
| 743 | + "comment": "In the Arakawa C-grid system, 'u' (e.g., UVEL) and 'g' variables (e.g., XG) have the same x coordinate on the model grid.", |
| 744 | + }, |
| 745 | + ), |
| 746 | + "Z": ( |
| 747 | + ["k"], |
| 748 | + np.linspace(-5, -5900, Z, dtype="float32"), |
| 749 | + { |
| 750 | + "long_name": "depth of tracer grid cell center", |
| 751 | + "standard_name": "depth", |
| 752 | + "units": "m", |
| 753 | + "positive": "up", |
| 754 | + "bounds": "Z_bnds", |
| 755 | + "coverage_content_type": "coordinate", |
| 756 | + "comment": "Non-uniform vertical spacing.", |
| 757 | + }, |
| 758 | + ), |
| 759 | + "Zl": ( |
| 760 | + ["k_l"], |
| 761 | + np.linspace(0, -5678, Z, dtype="float32"), |
| 762 | + { |
| 763 | + "long_name": "depth of the top face of tracer grid cells", |
| 764 | + "standard_name": "depth", |
| 765 | + "units": "m", |
| 766 | + "positive": "up", |
| 767 | + "coverage_content_type": "coordinate", |
| 768 | + "comment": "First element is 0m, the depth of the top face of the first tracer grid cell (ocean surface). Last element is the depth of the top face of the deepest grid cell. The use of 'l' in the variable name follows the MITgcm convention for ocean variables in which the lower (l) face of a tracer grid cell on the logical grid corresponds to the top face of the grid cell on the physical grid. In other words, the logical vertical grid of MITgcm ocean variables is inverted relative to the physical vertical grid.", |
| 769 | + }, |
| 770 | + ), |
| 771 | + "YC": ( |
| 772 | + ["tile", "j", "i"], |
| 773 | + np.tile( |
| 774 | + np.tile(np.linspace(-89, 89, Y), (X, 1)).T, (13, 1, 1) |
| 775 | + ), # NOTE this grid is not correct, as duplicates for each tile |
| 776 | + { |
| 777 | + "long_name": "latitude of tracer grid cell center", |
| 778 | + "standard_name": "latitude", |
| 779 | + "units": "degrees_north", |
| 780 | + "coordinate": "YC XC", |
| 781 | + "bounds": "YC_bnds", |
| 782 | + "coverage_content_type": "coordinate", |
| 783 | + "comment": "nonuniform grid spacing", |
| 784 | + }, |
| 785 | + ), |
| 786 | + "YG": ( |
| 787 | + ["tile", "j_g", "i_g"], |
| 788 | + np.tile( |
| 789 | + np.tile(np.linspace(-89, 89, Y), (X, 1)).T, (13, 1, 1) |
| 790 | + ), # NOTE this grid is not correct, as duplicates for each tile |
| 791 | + { |
| 792 | + "long_name": "latitude of 'southwest' corner of tracer grid cell", |
| 793 | + "standard_name": "latitude", |
| 794 | + "units": "degrees_north", |
| 795 | + "coordinate": "YG XG", |
| 796 | + "coverage_content_type": "coordinate", |
| 797 | + "comment": "Nonuniform grid spacing. Note: 'southwest' does not correspond to geographic orientation but is used for convenience to describe the computational grid. See MITgcm documentation for details.", |
| 798 | + }, |
| 799 | + ), |
| 800 | + "XC": ( |
| 801 | + ["tile", "j", "i"], |
| 802 | + np.tile(np.linspace(-179, 179, X, endpoint=False), (Y, 1)).reshape( |
| 803 | + 13, Y, X |
| 804 | + ), # NOTE this grid is not correct, as duplicates for each tile |
| 805 | + { |
| 806 | + "long_name": "longitude of tracer grid cell center", |
| 807 | + "standard_name": "longitude", |
| 808 | + "units": "degrees_east", |
| 809 | + "coordinate": "YC XC", |
| 810 | + "bounds": "XC_bnds", |
| 811 | + "coverage_content_type": "coordinate", |
| 812 | + "comment": "nonuniform grid spacing", |
| 813 | + }, |
| 814 | + ), |
| 815 | + "XG": ( |
| 816 | + ["tile", "j_g", "i_g"], |
| 817 | + np.tile(np.linspace(-179, 179, X, endpoint=False), (Y, 1)).reshape( |
| 818 | + 13, Y, X |
| 819 | + ), # NOTE this grid is not correct, as duplicates for each tile |
| 820 | + { |
| 821 | + "long_name": "longitude of 'southwest' corner of tracer grid cell", |
| 822 | + "standard_name": "longitude", |
| 823 | + "units": "degrees_east", |
| 824 | + "coordinate": "YG XG", |
| 825 | + "coverage_content_type": "coordinate", |
| 826 | + "comment": "Nonuniform grid spacing. Note: 'southwest' does not correspond to geographic orientation but is used for convenience to describe the computational grid. See MITgcm documentation for details.", |
| 827 | + }, |
| 828 | + ), |
| 829 | + }, |
| 830 | + ), |
609 | 831 | "ds_CROCO_idealized": xr.Dataset( |
610 | 832 | # CROCO idealized model dataset |
611 | 833 | { |
|
0 commit comments