Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
225 changes: 225 additions & 0 deletions testcases/idealized_single_cell/create_forcing.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,225 @@
from netCDF4 import Dataset
import numpy as np
import netCDF4

#-------------------------------------------------------------------------------

def create_output_times(inputTimesPerYear, year):

daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31]

xtimes = []

if (inputTimesPerYear == 1460):

minute = 0
second = 0

for iMonth in range(0,12):
for iDay in range(0,daysInMonth[iMonth]):
for iSixHours in range(0,4):

month = iMonth + 1
day = iDay + 1
hour = (iSixHours + 1) * 6

timeStr = "%4.4i-%2.2i-%2.2i_%2.2i:%2.2i:%2.2i" %(year,month,day,hour,minute,second)
xtimes.append(timeStr)

elif (inputTimesPerYear == 12):

day = 15
hour = 0
minute = 0
second = 0

for iMonth in range(0,12):

month = iMonth + 1

timeStr = "%4.4i-%2.2i-%2.2i_%2.2i:%2.2i:%2.2i" %(year,month,day,hour,minute,second)
xtimes.append(timeStr)

return xtimes

#-------------------------------------------------------------------------------

def create_forcing_subtest(
forcingName,
airTemperature,
airSpecificHumidity,
uAirVelocity,
vAirVelocity,
cloudFraction,
rainfallRate,
seaSurfaceSalinity,
seaSurfaceTemperature,
uOceanVelocity,
vOceanVelocity,
seaSurfaceTiltU,
seaSurfaceTiltV,
oceanMixedLayerDepth,
oceanHeatFluxConvergence):

# six hourly atmos forcing
fileOut = Dataset("atmosphere_forcing_six_hourly.%s.2000.nc" %(forcingName),"w",format="NETCDF3_CLASSIC")

fileOut.createDimension("nCells",1)
fileOut.createDimension("StrLen",64)
fileOut.createDimension("Time",None)

# time
xtimes = create_output_times(1460, 2000)
varXtime = fileOut.createVariable("xtime","c",dimensions=["Time","StrLen"])
for iTime in range(0,1460):
varXtime[iTime,0:19] = netCDF4.stringtochar(np.array(xtimes[iTime], 'S19'))
varXtime[iTime,19:] = " "*45

airTemperatureVar = fileOut.createVariable("airTemperature","d",dimensions=["Time", "nCells"])
airSpecificHumidityVar = fileOut.createVariable("airSpecificHumidity","d",dimensions=["Time", "nCells"])
uAirVelocityVar = fileOut.createVariable("uAirVelocity","d",dimensions=["Time", "nCells"])
vAirVelocityVar = fileOut.createVariable("vAirVelocity","d",dimensions=["Time", "nCells"])

airTemperatureVar[:] = airTemperature
airSpecificHumidityVar[:] = airSpecificHumidity
uAirVelocityVar[:] = uAirVelocity
vAirVelocityVar[:] = vAirVelocity

fileOut.close()

# monthly atmos forcing
fileOut = Dataset("atmosphere_forcing_monthly.%s.nc" %(forcingName),"w",format="NETCDF3_CLASSIC")

fileOut.createDimension("nCells",1)
fileOut.createDimension("StrLen",64)
fileOut.createDimension("Time",None)

# time
xtimes = create_output_times(12, 0)
varXtime = fileOut.createVariable("xtime","c",dimensions=["Time","StrLen"])
for iTime in range(0,12):
varXtime[iTime,0:19] = netCDF4.stringtochar(np.array(xtimes[iTime], 'S19'))
varXtime[iTime,19:] = " "*45

cloudFractionVar = fileOut.createVariable("cloudFraction","d",dimensions=["Time", "nCells"])
rainfallRateVar = fileOut.createVariable("rainfallRate","d",dimensions=["Time", "nCells"])

cloudFractionVar[:] = cloudFraction
rainfallRateVar[:] = rainfallRate

fileOut.close()

# monthly ocean forcing
fileOut = Dataset("ocean_forcing_monthly.%s.nc" %(forcingName),"w",format="NETCDF3_CLASSIC")

fileOut.createDimension("nCells",1)
fileOut.createDimension("StrLen",64)
fileOut.createDimension("Time",None)

# time
xtimes = create_output_times(12, 0)
varXtime = fileOut.createVariable("xtime","c",dimensions=["Time","StrLen"])
for iTime in range(0,12):
varXtime[iTime,0:19] = netCDF4.stringtochar(np.array(xtimes[iTime], 'S19'))
varXtime[iTime,19:] = " "*45

cloudFractionVar = fileOut.createVariable("cloudFraction","d",dimensions=["Time", "nCells"])
rainfallRateVar = fileOut.createVariable("rainfallRate","d",dimensions=["Time", "nCells"])

seaSurfaceSalinityVar = fileOut.createVariable("seaSurfaceSalinity","d",dimensions=["Time", "nCells"])
seaSurfaceTemperatureVar = fileOut.createVariable("seaSurfaceTemperature","d",dimensions=["Time", "nCells"])
uOceanVelocityVar = fileOut.createVariable("uOceanVelocity","d",dimensions=["Time", "nCells"])
vOceanVelocityVar = fileOut.createVariable("vOceanVelocity","d",dimensions=["Time", "nCells"])
seaSurfaceTiltUVar = fileOut.createVariable("seaSurfaceTiltU","d",dimensions=["Time", "nCells"])
seaSurfaceTiltVVar = fileOut.createVariable("seaSurfaceTiltV","d",dimensions=["Time", "nCells"])
oceanMixedLayerDepthVar = fileOut.createVariable("oceanMixedLayerDepth","d",dimensions=["Time", "nCells"])
oceanHeatFluxConvergenceVar = fileOut.createVariable("oceanHeatFluxConvergence","d",dimensions=["Time", "nCells"])

seaSurfaceSalinityVar[:] = seaSurfaceSalinity
seaSurfaceTemperatureVar[:] = seaSurfaceTemperature
uOceanVelocityVar[:] = uOceanVelocity
vOceanVelocityVar[:] = vOceanVelocity
seaSurfaceTiltUVar[:] = seaSurfaceTiltU
seaSurfaceTiltVVar[:] = seaSurfaceTiltV
oceanMixedLayerDepthVar[:] = oceanMixedLayerDepth
oceanHeatFluxConvergenceVar[:] = oceanHeatFluxConvergence

fileOut.close()

#-------------------------------------------------------------------------------

def create_forcing():

processes = ["congelation",
"surface_ice_melt",
"frazil"]

args = {"congelation":
{"airTemperature":273.15 - 30.0, # Kelvin
"airSpecificHumidity":0.0001,
"uAirVelocity":0.0,
"vAirVelocity":0.0,
"cloudFraction":1.0,
"rainfallRate":0.0,
"seaSurfaceSalinity":34.0,
"seaSurfaceTemperature":-1.8,
"uOceanVelocity":0.0,
"vOceanVelocity":0.0,
"seaSurfaceTiltU":0.0,
"seaSurfaceTiltV":0.0,
"oceanMixedLayerDepth":50.0,
"oceanHeatFluxConvergence":0.0},
"surface_ice_melt":
{"airTemperature":273.15 + 30.0, # Kelvin
"airSpecificHumidity":0.0001,
"uAirVelocity":0.0,
"vAirVelocity":0.0,
"cloudFraction":1.0,
"rainfallRate":0.0,
"seaSurfaceSalinity":34.0,
"seaSurfaceTemperature":-1.8,
"uOceanVelocity":0.0,
"vOceanVelocity":0.0,
"seaSurfaceTiltU":0.0,
"seaSurfaceTiltV":0.0,
"oceanMixedLayerDepth":50.0,
"oceanHeatFluxConvergence":0.0},
"frazil":
{"airTemperature":273.15 - 30.0, # Kelvin
"airSpecificHumidity":0.0001,
"uAirVelocity":0.0,
"vAirVelocity":0.0,
"cloudFraction":1.0,
"rainfallRate":0.0,
"seaSurfaceSalinity":34.0,
"seaSurfaceTemperature":-1.8,
"uOceanVelocity":0.0,
"vOceanVelocity":0.0,
"seaSurfaceTiltU":0.0,
"seaSurfaceTiltV":0.0,
"oceanMixedLayerDepth":50.0,
"oceanHeatFluxConvergence":0.0}}

for process in processes:
create_forcing_subtest(
process,
args[process]["airTemperature"],
args[process]["airSpecificHumidity"],
args[process]["uAirVelocity"],
args[process]["vAirVelocity"],
args[process]["cloudFraction"],
args[process]["rainfallRate"],
args[process]["seaSurfaceSalinity"],
args[process]["seaSurfaceTemperature"],
args[process]["uOceanVelocity"],
args[process]["vOceanVelocity"],
args[process]["seaSurfaceTiltU"],
args[process]["seaSurfaceTiltV"],
args[process]["oceanMixedLayerDepth"],
args[process]["oceanHeatFluxConvergence"])

#-------------------------------------------------------------------------------

if __name__ == "__main__":

create_forcing()
85 changes: 85 additions & 0 deletions testcases/idealized_single_cell/create_mesh.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
from netCDF4 import Dataset
import math
import os
import matplotlib.pyplot as plt
import numpy as np

#-------------------------------------------------------------------------------

def create_mesh():

mpas_tools_dir = os.environ['MPAS_TOOLS_DIR']

fileGrid = Dataset("grid_in.nc","w",format="NETCDF3_CLASSIC")

fileGrid.on_a_sphere = "NO"

nCells = 1
nVertices = 4
vertexDegree = 4

fileGrid.createDimension("nCells", nCells)
fileGrid.createDimension("nVertices", nVertices)
fileGrid.createDimension("vertexDegree", vertexDegree)

xCell = np.zeros(nCells)
yCell = np.zeros(nCells)
zCell = np.zeros(nCells)

xVertex = np.zeros(nVertices)
yVertex = np.zeros(nVertices)
zVertex = np.zeros(nVertices)
cellsOnVertex = np.zeros((nVertices,vertexDegree),dtype="i")
cellsOnVertex[:] = -1

xVertex[0] = -0.5
yVertex[0] = -0.5
cellsOnVertex[0,0] = 0

xVertex[1] = 0.5
yVertex[1] = -0.5
cellsOnVertex[1,0] = 0

xVertex[2] = 0.5
yVertex[2] = 0.5
cellsOnVertex[2,0] = 0

xVertex[3] = -0.5
yVertex[3] = 0.5
cellsOnVertex[3,0] = 0

var = fileGrid.createVariable("xCell","d",dimensions=["nCells"])
var[:] = xCell[:]
var = fileGrid.createVariable("yCell","d",dimensions=["nCells"])
var[:] = yCell[:]
var = fileGrid.createVariable("zCell","d",dimensions=["nCells"])
var[:] = zCell[:]

var = fileGrid.createVariable("xVertex","d",dimensions=["nVertices"])
var[:] = xVertex[:]
var = fileGrid.createVariable("yVertex","d",dimensions=["nVertices"])
var[:] = yVertex[:]
var = fileGrid.createVariable("zVertex","d",dimensions=["nVertices"])
var[:] = zVertex[:]

cellsOnVertex[:] += 1
var = fileGrid.createVariable("cellsOnVertex","i",dimensions=["nVertices","vertexDegree"])
var[:] = cellsOnVertex[:]

fileGrid.close()

os.system("%s/mesh_tools/mesh_conversion_tools/MpasMeshConverter.x grid_in.nc grid.nc" %(mpas_tools_dir))

fileGrid = Dataset("grid.nc","a")

fileGrid.variables["latCell"][:] = math.radians(80.0)
fileGrid.variables["latVertex"][:] = math.radians(80.0)
fileGrid.variables["latEdge"][:] = math.radians(80.0)

fileGrid.close()

#-------------------------------------------------------------------------------

if __name__ == "__main__":

create_mesh()
Loading