#
# namelist  type  namelist_record  name  default_value
#
namelist integer   sw_model config_test_case         5
namelist character sw_model config_time_integration  RK4
namelist real      sw_model config_dt                172.8
namelist integer   sw_model config_ntimesteps        7500
namelist integer   sw_model config_output_interval   500
namelist integer   sw_model config_stats_interval    100
namelist character io       config_input_name          grid.nc
namelist character io       config_output_name         output.nc
namelist character io       config_restart_name        restart.nc
namelist character io       config_decomp_file_prefix  graph.info.part.
namelist integer   restart  config_restart_interval  0
namelist logical   restart  config_do_restart        false
namelist real      restart  config_restart_time      172800.0
namelist character grid     config_vert_grid_type    isopycnal
namelist real      grid     config_rho0              1028
namelist real      hmix     config_h_mom_eddy_visc2     0.0
namelist real      hmix     config_h_mom_eddy_visc4     0.0
namelist real      hmix     config_h_tracer_eddy_diff2  0.0
namelist real      hmix     config_h_tracer_eddy_diff4  0.0
namelist real      hmix     config_apvm_upwinding       0.5
namelist character vmix     config_vert_visc_type    const
namelist character vmix     config_vert_diff_type    const
namelist real      vmix     config_vert_viscosity    2.5e-4
namelist real      vmix     config_vert_diffusion    2.5e-5
namelist real      vmix     config_vmixTanhViscMax   2.5e-1
namelist real      vmix     config_vmixTanhViscMin   1.0e-4
namelist real      vmix     config_vmixTanhDiffMax   2.5e-2
namelist real      vmix     config_vmixTanhDiffMin   1.0e-5
namelist real      vmix     config_vmixTanhZMid      -100
namelist real      vmix     config_vmixTanhZWidth    100
namelist character eos       config_eos_type         linear
namelist character advection config_vert_tracer_adv 'centered'
namelist integer   advection config_tracer_adv_order     2
namelist integer   advection config_thickness_adv_order  2
namelist logical   advection config_positive_definite    false
namelist logical   advection config_monotonic            false

#
# dim  type  name_in_file  name_in_code
#
dim nCells nCells
dim nEdges nEdges
dim maxEdges maxEdges
dim maxEdges2 maxEdges2
dim nVertices nVertices
dim TWO 2
dim R3 3
dim FIFTEEN 15
dim TWENTYONE 21
dim vertexDegree vertexDegree
dim nVertLevels nVertLevels
dim nVertLevelsP1 nVertLevels+1

#
# var persistence type  name_in_file  ( dims )  time_levs iro-  name_in_code struct super-array array_class
#
var persistent real    xtime ( Time ) 2 ro xtime state - -

var persistent real    latCell ( nCells ) 0 iro latCell mesh - -
var persistent real    lonCell ( nCells ) 0 iro lonCell mesh - -
var persistent real    xCell ( nCells ) 0 iro xCell mesh - -
var persistent real    yCell ( nCells ) 0 iro yCell mesh - -
var persistent real    zCell ( nCells ) 0 iro zCell mesh - -
var persistent integer indexToCellID ( nCells ) 0 iro indexToCellID mesh - -

var persistent real    latEdge ( nEdges ) 0 iro latEdge mesh - -
var persistent real    lonEdge ( nEdges ) 0 iro lonEdge mesh - -
var persistent real    xEdge ( nEdges ) 0 iro xEdge mesh - -
var persistent real    yEdge ( nEdges ) 0 iro yEdge mesh - -
var persistent real    zEdge ( nEdges ) 0 iro zEdge mesh - -
var persistent integer indexToEdgeID ( nEdges ) 0 iro indexToEdgeID mesh - -

var persistent real    latVertex ( nVertices ) 0 iro latVertex mesh - -
var persistent real    lonVertex ( nVertices ) 0 iro lonVertex mesh - -
var persistent real    xVertex ( nVertices ) 0 iro xVertex mesh - -
var persistent real    yVertex ( nVertices ) 0 iro yVertex mesh - -
var persistent real    zVertex ( nVertices ) 0 iro zVertex mesh - -
var persistent integer indexToVertexID ( nVertices ) 0 iro indexToVertexID mesh - -

var persistent integer cellsOnEdge ( TWO nEdges ) 0 iro cellsOnEdge mesh - -
var persistent integer nEdgesOnCell ( nCells ) 0 iro nEdgesOnCell mesh - -
var persistent integer nEdgesOnEdge ( nEdges ) 0 iro nEdgesOnEdge mesh - -
var persistent integer edgesOnCell ( maxEdges nCells ) 0 iro edgesOnCell mesh - -
var persistent integer edgesOnEdge ( maxEdges2 nEdges ) 0 iro edgesOnEdge mesh - -

var persistent real    weightsOnEdge ( maxEdges2 nEdges ) 0 iro weightsOnEdge mesh - -
var persistent real    dvEdge ( nEdges ) 0 iro dvEdge mesh - -
var persistent real    dcEdge ( nEdges ) 0 iro dcEdge mesh - -
var persistent real    angleEdge ( nEdges ) 0 iro angleEdge mesh - -
var persistent real    areaCell ( nCells ) 0 iro areaCell mesh - -
var persistent real    areaTriangle ( nVertices ) 0 iro areaTriangle mesh - -

var persistent real    edgeNormalVectors ( R3 nEdges ) 0 o edgeNormalVectors mesh - -
var persistent real    localVerticalUnitVectors ( R3 nCells ) 0 o localVerticalUnitVectors mesh - -
var persistent real    cellTangentPlane ( R3 TWO nEdges ) 0 o cellTangentPlane mesh - -

var persistent integer cellsOnCell ( maxEdges nCells ) 0 iro cellsOnCell mesh - -
var persistent integer verticesOnCell ( maxEdges nCells ) 0 iro verticesOnCell mesh - -
var persistent integer verticesOnEdge ( TWO nEdges ) 0 iro verticesOnEdge mesh - -
var persistent integer edgesOnVertex ( vertexDegree nVertices ) 0 iro edgesOnVertex mesh - -
var persistent integer cellsOnVertex ( vertexDegree nVertices ) 0 iro cellsOnVertex mesh - -
var persistent real    kiteAreasOnVertex ( vertexDegree nVertices ) 0 iro kiteAreasOnVertex mesh - -
var persistent real    fEdge ( nEdges ) 0 iro fEdge mesh - -
var persistent real    fVertex ( nVertices ) 0 iro fVertex mesh - -
var persistent real    h_s ( nCells ) 0 iro h_s mesh - -

# Space needed for advection
var persistent real    deriv_two ( FIFTEEN TWO nEdges ) 0 - deriv_two mesh - -
var persistent integer advCells ( TWENTYONE nCells ) 0 - advCells mesh - -

# !! NOTE: the following arrays are needed to allow the use
# !! of the module_advection.F w/o alteration
# Space needed for deformation calculation weights
var persistent real    defc_a ( maxEdges nCells ) 0 - defc_a mesh - -
var persistent real    defc_b ( maxEdges nCells ) 0 - defc_b mesh - -
var persistent real    kdiff ( nVertLevels nCells Time ) 0 - kdiff mesh - -

# Arrays required for reconstruction of velocity field
var persistent real    coeffs_reconstruct ( R3 maxEdges nCells ) 0 - coeffs_reconstruct mesh - -

# Arrays for z-level version of mpas-ocean
var persistent integer maxLevelCell ( nCells ) 0 iro maxLevelCell mesh - -
var persistent integer maxLevelEdgeTop ( nEdges ) 0 - maxLevelEdgeTop mesh - -
var persistent integer maxLevelEdgeBot ( nEdges ) 0 - maxLevelEdgeBot mesh - -
var persistent integer maxLevelVertexTop ( nVertices ) 0 - maxLevelVertexTop mesh - -
var persistent integer maxLevelVertexBot ( nVertices ) 0 - maxLevelVertexBot mesh - -
var persistent real hZLevel ( nVertLevels ) 0 iro hZLevel mesh - -
var persistent real zMidZLevel ( nVertLevels ) 0 - zMidZLevel mesh - -
var persistent real zTopZLevel ( nVertLevelsP1 ) 0 - zTopZLevel mesh - -

# Boundary conditions: read from input, saved in restart and written to output
var persistent integer boundaryEdge ( nVertLevels nEdges ) 0 iro boundaryEdge mesh - -
var persistent integer boundaryVertex ( nVertLevels nVertices ) 0 iro boundaryVertex mesh - -
var persistent integer boundaryCell ( nVertLevels nCells ) 0 iro boundaryCell mesh - -
var persistent real    u_src ( nVertLevels nEdges ) 0 iro u_src mesh - -

# Prognostic variables: read from input, saved in restart, and written to output
var persistent real    u ( nVertLevels nEdges Time ) 2 iro u state - -
var persistent real    h ( nVertLevels nCells Time ) 2 iro h state - -
var persistent real    rho ( nVertLevels nCells Time ) 2 iro rho state - -
var persistent real    temperature ( nVertLevels nCells Time ) 2 iro temperature state tracers dynamics
var persistent real    salinity ( nVertLevels nCells Time ) 2 iro salinity state tracers dynamics
var persistent real    tracer1 ( nVertLevels nCells Time ) 2 iro tracer1 state tracers testing
var persistent real    tracer2 ( nVertLevels nCells Time ) 2 iro tracer2 state tracers testing

# Tendency variables: neither read nor written to any files
var persistent real    tend_u ( nVertLevels nEdges Time ) 1 - u tend - -
var persistent real    tend_h ( nVertLevels nCells Time ) 1 - h tend - -
var persistent real    tend_temperature ( nVertLevels nCells Time ) 1 - temperature tend tracers dynamics
var persistent real    tend_salinity ( nVertLevels nCells Time ) 1 - salinity tend tracers dynamics
var persistent real    tend_tracer1 ( nVertLevels nCells Time ) 1 - tracer1 tend tracers testing
var persistent real    tend_tracer2 ( nVertLevels nCells Time ) 1 - tracer2 tend tracers testing

# Diagnostic fields: only written to output
var persistent real    v ( nVertLevels nEdges Time ) 2 - v state - -
var persistent real    divergence ( nVertLevels nCells Time ) 2 o divergence state - -
var persistent real    vorticity ( nVertLevels nVertices Time ) 2 - vorticity state - -
var persistent real    pv_edge ( nVertLevels nEdges Time ) 2 - pv_edge state - -
var persistent real    h_edge ( nVertLevels nEdges Time ) 2 - h_edge state - -
var persistent real    h_vertex ( nVertLevels nVertices Time ) 2 - h_vertex state - -
var persistent real    ke ( nVertLevels nCells Time ) 2 o ke state - -
var persistent real    ke_edge ( nVertLevels nEdges Time ) 2 - ke_edge state - -
var persistent real    pv_vertex ( nVertLevels nVertices Time ) 2 - pv_vertex state - -
var persistent real    pv_cell ( nVertLevels nCells Time ) 2 o pv_cell state - -
var persistent real    uReconstructX ( nVertLevels nCells Time ) 2 o uReconstructX state - -
var persistent real    uReconstructY ( nVertLevels nCells Time ) 2 o uReconstructY state - -
var persistent real    uReconstructZ ( nVertLevels nCells Time ) 2 o uReconstructZ state - -
var persistent real    uReconstructZonal ( nVertLevels nCells Time ) 2 o uReconstructZonal state - -
var persistent real    uReconstructMeridional ( nVertLevels nCells Time ) 2 o uReconstructMeridional state - -
var persistent real    MontPot ( nVertLevels nCells Time ) 2 o MontPot state - -
var persistent real    pressure ( nVertLevels nCells Time ) 2 o pressure state - -
var persistent real    wTop ( nVertLevelsP1 nCells Time ) 2 o wTop state - -

# Other diagnostic variables: neither read nor written to any files
var persistent real    vh ( nVertLevels nEdges Time ) 2 - vh state - -
var persistent real    circulation ( nVertLevels nVertices Time ) 2 - circulation state - -
var persistent real    gradPVt ( nVertLevels nEdges Time ) 2 - gradPVt state - -
var persistent real    gradPVn ( nVertLevels nEdges Time ) 2 - gradPVn state - -

# Globally reduced diagnostic variables: only written to output
var persistent real    areaCellGlobal ( Time ) 2 o areaCellGlobal state - -
var persistent real    areaEdgeGlobal ( Time ) 2 o areaEdgeGlobal state - -
var persistent real    areaTriangleGlobal ( Time ) 2 o areaTriangleGlobal state - -

var persistent real    volumeCellGlobal ( Time ) 2 o volumeCellGlobal state - -
var persistent real    volumeEdgeGlobal ( Time ) 2 o volumeEdgeGlobal state - -
var persistent real    CFLNumberGlobal ( Time ) 2 o CFLNumberGlobal state - -

