/*
 * This is part of the netCDF package.
 * Copyright 2006 University Corporation for Atmospheric Research/Unidata.
 * See COPYRIGHT file for conditions of use.
 * 
 * This is a very simple example which writes a 2D array of
 * sample data. To handle this in netCDF we create two shared
 * dimensions, "x" and "y", and a netCDF variable, called "data".
 * 
 * This example demonstrates the netCDF Java API.
 * 
 * Full documentation of the netCDF Java API can be found at:
 * https://www.unidata.ucar.edu/software/thredds/current/netcdf-java/documentation.htm
 */

package examples;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ucar.ma2.ArrayInt;
import ucar.ma2.DataType;
import ucar.ma2.InvalidRangeException;
import ucar.nc2.Dimension;
import ucar.nc2.NetcdfFileWriter;
import ucar.nc2.Variable;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.util.ArrayList;
import java.util.List;

public class Simple_xy_wr {
  private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

  public static void main(String args[]) {
    // We are writing 2D data, a 6 x 12 grid.
    final int NX = 6;
    final int NY = 12;

    String filename = "simple_xy.nc";
    NetcdfFileWriter dataFile = null;

    try {
      dataFile = NetcdfFileWriter.createNew(NetcdfFileWriter.Version.netcdf3, filename);

      // Create netCDF dimensions,
      Dimension xDim = dataFile.addDimension(null, "x", NX);
      Dimension yDim = dataFile.addDimension(null, "y", NY);

      // define dimensions
      List<Dimension> dims = new ArrayList<>();
      dims.add(xDim);
      dims.add(yDim);

      // Define a netCDF variable. The type of the variable in this case
      // is ncInt (32-bit integer).
      Variable dataVariable = dataFile.addVariable(null, "data", DataType.INT, dims);

      // create the file
      dataFile.create();

      // This is the data array we will write. It will just be filled
      // with a progression of numbers for this example.
      ArrayInt.D2 dataOut = new ArrayInt.D2(xDim.getLength(), yDim.getLength(), false);

      // Create some pretend data. If this wasn't an example program, we
      // would have some real data to write, for example, model output.
      int i, j;

      for (i = 0; i < xDim.getLength(); i++) {
        for (j = 0; j < yDim.getLength(); j++) {
          dataOut.set(i, j, i * NY + j);
        }
      }

      // Write the pretend data to the file. Although netCDF supports
      // reading and writing subsets of data, in this case we write all
      // the data in one operation.
      dataFile.write(dataVariable, dataOut);

    } catch (IOException e) {
      e.printStackTrace();

    } catch (InvalidRangeException e) {
      e.printStackTrace();

    } finally {
      if (null != dataFile)
        try {
          dataFile.close();
        } catch (IOException ioe) {
          ioe.printStackTrace();
        }
    }

    System.out.println("*** SUCCESS writing example file simple_xy.nc!");
  }

}
