package test;

import java.io.IOException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ucar.ma2.Array;
import ucar.ma2.DataType;
import ucar.ma2.InvalidRangeException;
import ucar.nc2.Dimension;
import ucar.nc2.NetcdfFileWriteable;

public class BigFile {

    private static Logger logger = LoggerFactory.getLogger(BigFile.class);
    
    public static void main(String[] args) throws IOException, InvalidRangeException {
	
	logger.info("Begin <=");
	
	String varName = "example";
	
	int timeSize = 8; 
	int latSize = 8022; 
	int lonSize = 10627; 
	
//	int timeSize = (int) Math.pow(2, 3);
//	int latSize = (int) Math.pow(2, 13);
//	int lonSize = (int) Math.pow(2, 13);
	
	logger.info("File size  (B)  = " + (long) timeSize * latSize * lonSize * 4);
	logger.info("File size~ (MB) = " + Math.round( (long) timeSize * latSize * lonSize * 4 / Math.pow(2, 20)));
	
	NetcdfFileWriteable ncFile = NetcdfFileWriteable.createNew("bigFile.nc");

	ncFile.setFill(false);

	String timeUnits = "hours since 2008-06-06 12:00:0.0";
	String coordUnits = "degrees";

	Dimension[] dim = new Dimension[3];

	dim[0] = setDimension(ncFile, "time", timeUnits, timeSize);
	dim[1] = setDimension(ncFile, "lat", coordUnits, latSize);
	dim[2] = setDimension(ncFile, "lon", coordUnits, lonSize);

	ncFile.addVariable(varName, DataType.FLOAT, dim);

	ncFile.addVariableAttribute(varName, "_FillValue", -9999);
	ncFile.addVariableAttribute(varName, "missing_value", -9999);

	logger.info("Creating netcdf <=");
	ncFile.create();

//	Array ar;
//
//	float[] baseArray = new float[latSize];
//	for (int i = 0; i < latSize; i++) {
//	    baseArray[i] = (float) (i);
//	}
//	ar = Array.factory(baseArray);
//	ncFile.write("lat", Array.factory(baseArray));
//	baseArray = new float[lonSize];
//	for (int i = 0; i < lonSize; i++) {
//	    baseArray[i] = (float) (i);
//	}
//	ar = Array.factory(baseArray);
//	ncFile.write("lon", Array.factory(baseArray));
//	
//	baseArray = new float[timeSize];
//	for (int i = 0; i < timeSize; i++) {
//	    baseArray[i] = (float) (i * 3);
//	}
//	ar = Array.factory(baseArray);
//	ncFile.write("time", ar);
	
	logger.info("Writing netcdf <=");

	int[] shape = new int[] { timeSize, 1, lonSize};
	float[] floatStorage = new float[timeSize * lonSize];
	Array floatArray = Array.factory(float.class, shape, floatStorage);
	for (int i = 0; i < latSize; i++) {
	    int[] origin = new int[] { 0, i, 0 };
	    ncFile.write(varName, origin, floatArray);
	}
	
	
//	int[] shape = new int[] { timeSize, latSize, 1};
//	float[] floatStorage = new float[timeSize * latSize];
//	Array floatArray = Array.factory(float.class, shape, floatStorage);
//	for (int i = 0; i < lonSize; i++) {
//	    int[] origin = new int[] { 0, 0, i };
//	    ncFile.write(varName, origin, floatArray);
//	}
	
	ncFile.close();

	logger.info("Done <=");
    }

    private static Dimension setDimension(NetcdfFileWriteable ncFile, String name, String units, int length) {

	Dimension dimension = ncFile.addDimension(name, length);
	ncFile.addVariable(name, DataType.FLOAT, new Dimension[] { dimension });
	ncFile.addVariableAttribute(name, "units", units);

	return dimension;
    }

}
