databases/netcdf.py
# ----------------------------------------------------------------------------
#  CLASSES: nightly
#
#  Test Case:  netcdf.py
#
#  Tests:      mesh      - 2D, 3D structured, single domain
#              plots     - Mesh, Pseudocolor, FilledBoundary
#              operators - Transform
#
#  Programmer: Brad Whitlock
#  Date:       Mon Aug 22 11:37:35 PDT 2005
#
#  Modifications:
#    Brad Whitlock, Wed Oct 10 11:20:44 PDT 2007
#    Added tests for CCSM data.
#
#    Jeremy Meredith, Fri Aug  8 11:23:29 EDT 2008
#    Updated streamline settings to match new attribute fields.
#
#    Brad Whitlock, Mon 16:37:34 PST 2009
#    I removed the Streamline plot and I fixed some other things to get it
#    working again.
#
#    Cyrus Harrison, Thu Mar 25 09:57:34 PDT 2010
#    Added call(s) to DrawPlots() b/c of changes to the default plot state
#    behavior when an operator is added.
#
#    Brad Whitlock, Thu Sep  9 11:03:30 PDT 2010
#    I added tests for time-varying curves, FVCOM.
#
#    Kathleen Biagas, Fri Sep 21 10:12:15 MST 2012
#    Removed pjoin so that tests can run on Windows.
#
#    Kathleen Biagas, Wed Aug 28 09:04:00 MST 2019
#    Turn off cycling of colors for all Curve plot tests.  Set the colors
#    individually to match current baseline results.
#
#    Kathleen Biagas, Mon Nov 28, 2022
#    Replace obsolete Label text attributes with new versions.
#
# ----------------------------------------------------------------------------
RequiredDatabasePlugin("NETCDF")

def test0():
    TestSection("ADAPT files")
    OpenDatabase(data_path("netcdf_test_data/narac/adapt_etex_metfld_from_obs_102312.nc"))
    AddPlot("Pseudocolor", "u")
    AddPlot("Mesh", "main")
    SetActivePlots((0,1))
    AddOperator("Transform")
    t = TransformAttributes()
    t.scaleZ = 200
    t.doScale = 1
    SetOperatorOptions(t)
    DrawPlots()

    # Set the view
    v = View3DAttributes()
    v.viewNormal = (-0.70982, -0.515727, 0.479773)
    v.focus = (0, 0, 753888)
    v.viewUp = (0.359948, 0.319901, 0.876414)
    v.viewAngle = 30
    v.parallelScale = 2.38503e+06
    v.nearPlane = -4.77005e+06
    v.farPlane = 4.77005e+06
    v.imagePan = (0.000886525, 0.00976909)
    v.imageZoom = 0.952092
    v.perspective = 1
    v.eyeAngle = 2
    v.centerOfRotationSet = 0
    v.centerOfRotation = (0, 0, 753888)
    SetView3D(v)
    Test("netcdf_0_00")

    # Set up another view.
    v1 = View3DAttributes()
    v1.viewNormal = (-0.434823, -0.389027, -0.812149)
    v1.focus = (0, 0, 753888)
    v1.viewUp = (-0.545125, -0.604143, 0.581249)
    v1.viewAngle = 30
    v1.parallelScale = 2.38503e+06
    v1.nearPlane = -4.77005e+06
    v1.farPlane = 4.77005e+06
    v1.imagePan = (0.00461106, -0.0368703)
    v1.imageZoom = 0.952092
    v1.perspective = 1
    v1.eyeAngle = 2
    v1.centerOfRotationSet = 0
    v1.centerOfRotation = (0, 0, 753888)
    SetView3D(v1)
    Test("netcdf_0_01")

    # Plot the terrain by stripping away most of the air.
    SetActivePlots(1)
    DeleteActivePlots()
    AddOperator("IndexSelect")
    idxsel = IndexSelectAttributes()
    idxsel.dim = idxsel.ThreeD
    idxsel.zMax = 1
    SetOperatorOptions(idxsel)

    v2 = View3DAttributes()
    v2.viewNormal = (-0.394106, -0.0944361, 0.9142)
    v2.focus = (0, 0, 508267)
    v2.viewUp = (0.867549, 0.290123, 0.403965)
    v2.viewAngle = 30
    v2.parallelScale = 2.31912e+06
    v2.nearPlane = -4.63825e+06
    v2.farPlane = 4.63825e+06
    v2.imagePan = (0.012587, 0.0291994)
    v2.imageZoom = 1.08833
    v2.perspective = 1
    v2.eyeAngle = 2
    v2.centerOfRotationSet = 0
    v2.centerOfRotation = (0, 0, 508267)
    SetView3D(v2)
    DrawPlots()
    Test("netcdf_0_02")

    # Plot something 2D
    DeleteAllPlots()
    AddPlot("Pseudocolor", "ustar")
    p = PseudocolorAttributes()
    p.skewFactor = 0.01
    p.scaling = p.Skew
    DrawPlots()
    Test("netcdf_0_03")
    DeleteAllPlots()

def test1():
    TestSection("LODI particle files")
    # First put in the terrain, though it is not a LODI particle file.
    OpenDatabase(data_path("netcdf_test_data/narac/adapt_etex_metfld_from_obs_102312.nc"))
    AddPlot("Pseudocolor", "u")
    AddOperator("Transform", 1)
    t = TransformAttributes()
    t.scaleZ = 200
    t.doScale = 1
    SetOperatorOptions(t)
    AddOperator("IndexSelect")
    idxsel = IndexSelectAttributes()
    idxsel.dim = idxsel.ThreeD
    idxsel.zMax = 1
    SetOperatorOptions(idxsel)
    DrawPlots()

    # Now add the LODI particle file.
    db = data_path("netcdf_test_data/narac/ppart.nc")
    OpenDatabase(db)
    AddPlot("FilledBoundary", "sourceid")
    AddOperator("Transform")
    SetOperatorOptions(t)
    DrawPlots()

    v = View3DAttributes()
    v.viewNormal = (-0.57737, -0.765477, 0.28406)
    v.focus = (0, 0, 265602)
    v.viewUp = (0.165375, 0.231057, 0.958782)
    v.viewAngle = 30
    v.parallelScale = 2.27828e+06
    v.nearPlane = -4.55655e+06
    v.farPlane = 4.55655e+06
    v.imagePan = (0, 0)
    v.imageZoom = 3.17577
    v.perspective = 1
    v.eyeAngle = 2
    v.centerOfRotationSet = 0
    v.centerOfRotation = (0, 0, 265602)
    SetView3D(v)
    Test("netcdf_1_00")

    # Do a Label plot
    AddPlot("Label", "sourceid")
    AddOperator("Transform")
    SetOperatorOptions(t)
    L = LabelAttributes()
    L.restrictNumberOfLabels = 0
    L.textFont1.scale = 6
    SetPlotOptions(L)
    DrawPlots()
    SetActivePlots(1)
    f = FilledBoundaryAttributes()
    f.pointSizePixels = 10
    SetPlotOptions(f)
    v2 = View3DAttributes()
    v2.viewNormal = (-0.57737, -0.765477, 0.28406)
    v2.focus = (0, 0, 265602)
    v2.viewUp = (0.165375, 0.231057, 0.958782)
    v2.viewAngle = 30
    v2.parallelScale = 2.27828e+06
    v2.nearPlane = -4.55655e+06
    v2.farPlane = 4.55655e+06
    v2.imagePan = (-0.0022605, 0.0057171)
    v2.imageZoom = 111.554
    v2.perspective = 1
    v2.eyeAngle = 2
    v2.centerOfRotationSet = 0
    v2.centerOfRotation = (0, 0, 265602)
    SetView3D(v2)
    Test("netcdf_1_01")

    # Delete the label plot and go forward in time
    SetActivePlots(2)
    DeleteActivePlots()
    SetView3D(v)
    SetActivePlots(1)
    f.pointSizePixels = 2
    SetPlotOptions(f)
    TimeSliderNextState()
    Test("netcdf_1_02")
    DeleteAllPlots()

def test2():
    TestSection("LODI files")
    # This test is reserved for LODI once it is assured to be right.
    return

def test3():
    TestSection("Basic NETCDF reader")
    OpenDatabase(data_path("netcdf_test_data/narac/etex_fill_lambertcc__4000_001.elev"))
    AddPlot("Pseudocolor", "elevations")
    DrawPlots()
    Test("netcdf_3_00")

    # Elevate the data
    ClearWindow()
    AddOperator("Elevate")
    e = ElevateAttributes()
    e.useXYLimits = e.Always
    SetOperatorOptions(e)
    AddOperator("Transform")
    t = TransformAttributes()
    t.doScale = 1
    t.scaleX = 100
    t.scaleY = 100
    t.scaleZ = 3
    SetOperatorOptions(t)
    th = ThresholdAttributes()
    th.listedVarNames = ("elevations")
    th.lowerBounds = (1.0)
    SetDefaultOperatorOptions(th)
    AddOperator("Threshold")
    DrawPlots()
    # Set up a light
    oldLight = GetLight(0)
    newLight = GetLight(0)
    newLight.enabledFlag = 1
    newLight.type = newLight.Camera  # Ambient, Object, Camera
    newLight.direction = (-0.626, -0.427, -0.653)
    newLight.color = (255, 255, 255, 255)
    newLight.brightness = 1
    SetLight(0, newLight)
    # Set up the view
    v = View3DAttributes()
    v.viewNormal = (0, -0.5, 0.866025)
    v.focus = (0, 0, 1646)
    v.viewUp = (0, 0.866025, 0.5)
    v.viewAngle = 30
    v.parallelScale = 282140
    v.nearPlane = -564281
    v.farPlane = 564281
    v.imagePan = (0, 0)
    v.imageZoom = 1.43024
    v.perspective = 1
    v.eyeAngle = 2
    v.centerOfRotationSet = 0
    v.centerOfRotation = (0, 0, 1646)
    SetView3D(v)
    InvertBackgroundColor()
    Test("netcdf_3_01")
    SetLight(0, oldLight)
    DeleteAllPlots()
    InvertBackgroundColor()

    # Try some curves
    OpenDatabase(data_path("netcdf_test_data/3252ATT-A1H.cdf"))
    AddPlot("Curve", "ATTN_55")
    curveAtts = CurveAttributes()
    curveAtts.curveColorSource = curveAtts.Custom
    curveAtts.curveColor = (255, 0, 0, 255)
    SetPlotOptions(curveAtts)
    DrawPlots()
    Test("netcdf_3_02")
    DeleteAllPlots()
    OpenDatabase(data_path("netcdf_test_data/AAtestCTD.nc"))
    AddPlot("Curve", "ST_70")
    curveAtts.curveColor = (0, 255, 0, 255)
    SetPlotOptions(curveAtts)
    DrawPlots()
    ResetView()
    Test("netcdf_3_03")
    DeleteAllPlots()

    # Try some files that I found on climate web sites.
    OpenDatabase(data_path("netcdf_test_data/pressure.cdf"))
    AddPlot("Pseudocolor", "pressure")
    DrawPlots()
    ResetView()
    ToggleFullFrameMode() # Did this get set somehow by the curve plots?
    Test("netcdf_3_04")
    DeleteAllPlots()

    OpenDatabase(data_path("netcdf_test_data/aou.cdf"))
    AddPlot("Pseudocolor", "aou")
    AddOperator("Slice")
    s = SliceAttributes()
    s.axisType = s.ZAxis
    SetOperatorOptions(s)
    DrawPlots()
    ResetView()
    Test("netcdf_3_05")
    DeleteAllPlots()

    OpenDatabase(data_path("netcdf_test_data/NASA_vegetation_lai.cdf"))
    AddPlot("Pseudocolor", "lai")
    DrawPlots()
    v2 = View2DAttributes()
    v2.windowCoords = (-139.883, -44.1452, -18.7702, 74.4037)
    v2.viewportCoords = (0.2, 0.95, 0.15, 0.95)
    v2.fullFrameActivationMode = v2.Off  # On, Off, Auto
    v2.fullFrameAutoThreshold = 100
    SetView2D(v2)
    Test("netcdf_3_06")
    DeleteAllPlots()

    # Try a file that used to crash on Windows
    db = "netcdf_test_data/Case5_2D-Q.nc"
    OpenDatabase(data_path(db))
    AddPlot("Pseudocolor", "Q")
    DrawPlots()
    ResetView()
    Test("netcdf_3_07")
    SetTimeSliderState(29)
    Test("netcdf_3_08")
    DeleteAllPlots()
    CloseDatabase(data_path(db))

    TestSection("Basic NETCDF reader with zone-centered data")
    swa = SaveWindowAttributes()
    swa.width = 1000
    swa.height = 1000
    swa.screenCapture = 0
    db = "netcdf_test_data/oase-mapdata.nc"
    OpenDatabase(data_path(db))
    AddPlot("Pseudocolor", "national_rivers_2D")
    DrawPlots()
    ResetView()
    Test("netcdf_3_09", swa)
    DeleteAllPlots()
    AddPlot("Pseudocolor", "as_zonal/national_rivers_2D")
    DrawPlots()
    ResetView()
    Test("netcdf_3_10", swa)
    DeleteAllPlots()
    CloseDatabase(data_path(db))

def test4():
    TestSection("CCSM reader")
    db = "netcdf_test_data/tas_mean_T63.nc"
    OpenDatabase(data_path(db))
    AddPlot("Pseudocolor", "tas")
    DrawPlots()
    ResetView()
    Test("netcdf_4_00")

    # Change to the last time state
    SetTimeSliderState(1187)
    Test("netcdf_4_01")

    # Change to the global representation of the data
    ChangeActivePlotsVar("global/tas")
    ResetView()
    Test("netcdf_4_02")
    DeleteAllPlots()
    CloseDatabase(data_path(db))

def test5():
    TestSection("Time-varying curves")
    db = "netcdf_test_data/timecurve.nc"
    OpenDatabase(data_path(db))
    AddPlot("Curve", "theta_1_1")
    c = CurveAttributes()
    c.showLabels = 0
    c.curveColor = (255,0,0,255)
    c.curveColorSource = c.Custom
    SetPlotOptions(c)
    cv = GetViewCurve()
    cv.domainCoords = (0, 9)
    cv.rangeCoords = (0.40657, 5)
    cv.viewportCoords = (0.2, 0.95, 0.15, 0.95)
    cv.domainScale = cv.LINEAR  # LINEAR, LOG
    cv.rangeScale = cv.LINEAR  # LINEAR, LOG
    SetViewCurve(cv)
    DrawPlots()
    Test("netcdf_5_00")
    SetTimeSliderState(4)
    Test("netcdf_5_01")
    DeleteAllPlots()
    CloseDatabase(data_path(db))

def test6():
    TestSection("FVCOM reader ")
    db = "netcdf_test_data/chn_0001.nc"
    OpenDatabase(data_path(db))
    AddPlot("Pseudocolor", "Dens3{S,Theta,P}")
    DrawPlots()
    ResetView()
    Test("netcdf_6_00")
    SetTimeSliderState(47)
    Test("netcdf_6_01")
    DeleteAllPlots()
    CloseDatabase(data_path(db))

def main():
    test0()
    test1()
    test2()
    test3()
    test4()
    test5()
    test6()

main()
Exit()