diff --git a/MPAS-Model/ocean/develop b/MPAS-Model/ocean/develop
index e4dbf57d23..b3d870d755 160000
--- a/MPAS-Model/ocean/develop
+++ b/MPAS-Model/ocean/develop
@@ -1 +1 @@
-Subproject commit e4dbf57d235e0a6bf6c568e2423cafe8091c5486
+Subproject commit b3d870d755f9c65d0ec2950d9b713fcdaa96e64b
diff --git a/ocean/convergence_global/QU120/cosine_bell/build_base_mesh.py b/ocean/convergence_global/QU120/cosine_bell/build_base_mesh.py
new file mode 100755
index 0000000000..b6bf2d79f0
--- /dev/null
+++ b/ocean/convergence_global/QU120/cosine_bell/build_base_mesh.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+import numpy as np
+from mpas_tools.ocean import build_spherical_mesh
+
+
+def cellWidthVsLatLon():
+ """
+ Create cell width array for this mesh on a regular latitude-longitude grid.
+
+ Returns
+ -------
+ cellWidth : numpy.array
+ m x n array, entries are desired cell width in km
+ lat : numpy.array
+ latitude, vector of length m, with entries between -90 and 90, degrees
+ lon : numpy.array
+ longitude, vector of length n, with entries between -180 and 180,
+ degrees
+ """
+
+ ddeg = 10
+ constantCellWidth = 120
+
+ lat = np.arange(-90, 90.01, ddeg)
+ lon = np.arange(-180, 180.01, ddeg)
+
+ cellWidth = constantCellWidth * np.ones((lat.size, lon.size))
+ return cellWidth, lon, lat
+
+
+def main():
+ cellWidth, lon, lat = cellWidthVsLatLon()
+ build_spherical_mesh(cellWidth, lon, lat, out_filename='base_mesh.nc')
+
+
+if __name__ == '__main__':
+ main()
diff --git a/ocean/convergence_global/QU120/cosine_bell/config_base_mesh.xml b/ocean/convergence_global/QU120/cosine_bell/config_base_mesh.xml
new file mode 120000
index 0000000000..9177b99813
--- /dev/null
+++ b/ocean/convergence_global/QU120/cosine_bell/config_base_mesh.xml
@@ -0,0 +1 @@
+../../config_files/config_base_mesh.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU120/cosine_bell/config_driver.xml b/ocean/convergence_global/QU120/cosine_bell/config_driver.xml
new file mode 120000
index 0000000000..541fb6e756
--- /dev/null
+++ b/ocean/convergence_global/QU120/cosine_bell/config_driver.xml
@@ -0,0 +1 @@
+../../config_files/config_driver.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU120/cosine_bell/config_forward.xml b/ocean/convergence_global/QU120/cosine_bell/config_forward.xml
new file mode 100644
index 0000000000..ea1eebdc0f
--- /dev/null
+++ b/ocean/convergence_global/QU120/cosine_bell/config_forward.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 144
+
+
+
+
diff --git a/ocean/convergence_global/QU120/cosine_bell/config_initial_state.xml b/ocean/convergence_global/QU120/cosine_bell/config_initial_state.xml
new file mode 120000
index 0000000000..bc0bec8eb1
--- /dev/null
+++ b/ocean/convergence_global/QU120/cosine_bell/config_initial_state.xml
@@ -0,0 +1 @@
+../../config_files/config_initial_state_cosine_bell.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU150/cosine_bell/build_base_mesh.py b/ocean/convergence_global/QU150/cosine_bell/build_base_mesh.py
new file mode 100755
index 0000000000..678142d966
--- /dev/null
+++ b/ocean/convergence_global/QU150/cosine_bell/build_base_mesh.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+import numpy as np
+from mpas_tools.ocean import build_spherical_mesh
+
+
+def cellWidthVsLatLon():
+ """
+ Create cell width array for this mesh on a regular latitude-longitude grid.
+
+ Returns
+ -------
+ cellWidth : numpy.array
+ m x n array, entries are desired cell width in km
+ lat : numpy.array
+ latitude, vector of length m, with entries between -90 and 90, degrees
+ lon : numpy.array
+ longitude, vector of length n, with entries between -180 and 180,
+ degrees
+ """
+
+ ddeg = 10
+ constantCellWidth = 150
+
+ lat = np.arange(-90, 90.01, ddeg)
+ lon = np.arange(-180, 180.01, ddeg)
+
+ cellWidth = constantCellWidth * np.ones((lat.size, lon.size))
+ return cellWidth, lon, lat
+
+
+def main():
+ cellWidth, lon, lat = cellWidthVsLatLon()
+ build_spherical_mesh(cellWidth, lon, lat, out_filename='base_mesh.nc')
+
+
+if __name__ == '__main__':
+ main()
diff --git a/ocean/convergence_global/QU150/cosine_bell/config_base_mesh.xml b/ocean/convergence_global/QU150/cosine_bell/config_base_mesh.xml
new file mode 120000
index 0000000000..9177b99813
--- /dev/null
+++ b/ocean/convergence_global/QU150/cosine_bell/config_base_mesh.xml
@@ -0,0 +1 @@
+../../config_files/config_base_mesh.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU150/cosine_bell/config_driver.xml b/ocean/convergence_global/QU150/cosine_bell/config_driver.xml
new file mode 120000
index 0000000000..541fb6e756
--- /dev/null
+++ b/ocean/convergence_global/QU150/cosine_bell/config_driver.xml
@@ -0,0 +1 @@
+../../config_files/config_driver.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU150/cosine_bell/config_forward.xml b/ocean/convergence_global/QU150/cosine_bell/config_forward.xml
new file mode 100644
index 0000000000..f0185306f0
--- /dev/null
+++ b/ocean/convergence_global/QU150/cosine_bell/config_forward.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 72
+
+
+
+
diff --git a/ocean/convergence_global/QU150/cosine_bell/config_initial_state.xml b/ocean/convergence_global/QU150/cosine_bell/config_initial_state.xml
new file mode 120000
index 0000000000..bc0bec8eb1
--- /dev/null
+++ b/ocean/convergence_global/QU150/cosine_bell/config_initial_state.xml
@@ -0,0 +1 @@
+../../config_files/config_initial_state_cosine_bell.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU180/cosine_bell/build_base_mesh.py b/ocean/convergence_global/QU180/cosine_bell/build_base_mesh.py
new file mode 100755
index 0000000000..c18e34f306
--- /dev/null
+++ b/ocean/convergence_global/QU180/cosine_bell/build_base_mesh.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+import numpy as np
+from mpas_tools.ocean import build_spherical_mesh
+
+
+def cellWidthVsLatLon():
+ """
+ Create cell width array for this mesh on a regular latitude-longitude grid.
+
+ Returns
+ -------
+ cellWidth : numpy.array
+ m x n array, entries are desired cell width in km
+ lat : numpy.array
+ latitude, vector of length m, with entries between -90 and 90, degrees
+ lon : numpy.array
+ longitude, vector of length n, with entries between -180 and 180,
+ degrees
+ """
+
+ ddeg = 10
+ constantCellWidth = 180
+
+ lat = np.arange(-90, 90.01, ddeg)
+ lon = np.arange(-180, 180.01, ddeg)
+
+ cellWidth = constantCellWidth * np.ones((lat.size, lon.size))
+ return cellWidth, lon, lat
+
+
+def main():
+ cellWidth, lon, lat = cellWidthVsLatLon()
+ build_spherical_mesh(cellWidth, lon, lat, out_filename='base_mesh.nc')
+
+
+if __name__ == '__main__':
+ main()
diff --git a/ocean/convergence_global/QU180/cosine_bell/config_base_mesh.xml b/ocean/convergence_global/QU180/cosine_bell/config_base_mesh.xml
new file mode 120000
index 0000000000..9177b99813
--- /dev/null
+++ b/ocean/convergence_global/QU180/cosine_bell/config_base_mesh.xml
@@ -0,0 +1 @@
+../../config_files/config_base_mesh.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU180/cosine_bell/config_driver.xml b/ocean/convergence_global/QU180/cosine_bell/config_driver.xml
new file mode 120000
index 0000000000..541fb6e756
--- /dev/null
+++ b/ocean/convergence_global/QU180/cosine_bell/config_driver.xml
@@ -0,0 +1 @@
+../../config_files/config_driver.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU180/cosine_bell/config_forward.xml b/ocean/convergence_global/QU180/cosine_bell/config_forward.xml
new file mode 100644
index 0000000000..4b895d1cb4
--- /dev/null
+++ b/ocean/convergence_global/QU180/cosine_bell/config_forward.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 72
+
+
+
+
diff --git a/ocean/convergence_global/QU180/cosine_bell/config_initial_state.xml b/ocean/convergence_global/QU180/cosine_bell/config_initial_state.xml
new file mode 120000
index 0000000000..bc0bec8eb1
--- /dev/null
+++ b/ocean/convergence_global/QU180/cosine_bell/config_initial_state.xml
@@ -0,0 +1 @@
+../../config_files/config_initial_state_cosine_bell.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU210/cosine_bell/build_base_mesh.py b/ocean/convergence_global/QU210/cosine_bell/build_base_mesh.py
new file mode 100755
index 0000000000..537c41b074
--- /dev/null
+++ b/ocean/convergence_global/QU210/cosine_bell/build_base_mesh.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+import numpy as np
+from mpas_tools.ocean import build_spherical_mesh
+
+
+def cellWidthVsLatLon():
+ """
+ Create cell width array for this mesh on a regular latitude-longitude grid.
+
+ Returns
+ -------
+ cellWidth : numpy.array
+ m x n array, entries are desired cell width in km
+ lat : numpy.array
+ latitude, vector of length m, with entries between -90 and 90, degrees
+ lon : numpy.array
+ longitude, vector of length n, with entries between -180 and 180,
+ degrees
+ """
+
+ ddeg = 10
+ constantCellWidth = 210
+
+ lat = np.arange(-90, 90.01, ddeg)
+ lon = np.arange(-180, 180.01, ddeg)
+
+ cellWidth = constantCellWidth * np.ones((lat.size, lon.size))
+ return cellWidth, lon, lat
+
+
+def main():
+ cellWidth, lon, lat = cellWidthVsLatLon()
+ build_spherical_mesh(cellWidth, lon, lat, out_filename='base_mesh.nc')
+
+
+if __name__ == '__main__':
+ main()
diff --git a/ocean/convergence_global/QU210/cosine_bell/config_base_mesh.xml b/ocean/convergence_global/QU210/cosine_bell/config_base_mesh.xml
new file mode 120000
index 0000000000..9177b99813
--- /dev/null
+++ b/ocean/convergence_global/QU210/cosine_bell/config_base_mesh.xml
@@ -0,0 +1 @@
+../../config_files/config_base_mesh.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU210/cosine_bell/config_driver.xml b/ocean/convergence_global/QU210/cosine_bell/config_driver.xml
new file mode 120000
index 0000000000..541fb6e756
--- /dev/null
+++ b/ocean/convergence_global/QU210/cosine_bell/config_driver.xml
@@ -0,0 +1 @@
+../../config_files/config_driver.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU210/cosine_bell/config_forward.xml b/ocean/convergence_global/QU210/cosine_bell/config_forward.xml
new file mode 100644
index 0000000000..78b17dc7d8
--- /dev/null
+++ b/ocean/convergence_global/QU210/cosine_bell/config_forward.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 36
+
+
+
+
diff --git a/ocean/convergence_global/QU210/cosine_bell/config_initial_state.xml b/ocean/convergence_global/QU210/cosine_bell/config_initial_state.xml
new file mode 120000
index 0000000000..bc0bec8eb1
--- /dev/null
+++ b/ocean/convergence_global/QU210/cosine_bell/config_initial_state.xml
@@ -0,0 +1 @@
+../../config_files/config_initial_state_cosine_bell.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU240/cosine_bell/build_base_mesh.py b/ocean/convergence_global/QU240/cosine_bell/build_base_mesh.py
new file mode 100755
index 0000000000..196f5fa0fc
--- /dev/null
+++ b/ocean/convergence_global/QU240/cosine_bell/build_base_mesh.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+import numpy as np
+from mpas_tools.ocean import build_spherical_mesh
+
+
+def cellWidthVsLatLon():
+ """
+ Create cell width array for this mesh on a regular latitude-longitude grid.
+
+ Returns
+ -------
+ cellWidth : numpy.array
+ m x n array, entries are desired cell width in km
+ lat : numpy.array
+ latitude, vector of length m, with entries between -90 and 90, degrees
+ lon : numpy.array
+ longitude, vector of length n, with entries between -180 and 180,
+ degrees
+ """
+
+ ddeg = 10
+ constantCellWidth = 240
+
+ lat = np.arange(-90, 90.01, ddeg)
+ lon = np.arange(-180, 180.01, ddeg)
+
+ cellWidth = constantCellWidth * np.ones((lat.size, lon.size))
+ return cellWidth, lon, lat
+
+
+def main():
+ cellWidth, lon, lat = cellWidthVsLatLon()
+ build_spherical_mesh(cellWidth, lon, lat, out_filename='base_mesh.nc')
+
+
+if __name__ == '__main__':
+ main()
diff --git a/ocean/convergence_global/QU240/cosine_bell/config_base_mesh.xml b/ocean/convergence_global/QU240/cosine_bell/config_base_mesh.xml
new file mode 120000
index 0000000000..9177b99813
--- /dev/null
+++ b/ocean/convergence_global/QU240/cosine_bell/config_base_mesh.xml
@@ -0,0 +1 @@
+../../config_files/config_base_mesh.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU240/cosine_bell/config_driver.xml b/ocean/convergence_global/QU240/cosine_bell/config_driver.xml
new file mode 120000
index 0000000000..541fb6e756
--- /dev/null
+++ b/ocean/convergence_global/QU240/cosine_bell/config_driver.xml
@@ -0,0 +1 @@
+../../config_files/config_driver.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU240/cosine_bell/config_forward.xml b/ocean/convergence_global/QU240/cosine_bell/config_forward.xml
new file mode 100644
index 0000000000..da11ed7fd9
--- /dev/null
+++ b/ocean/convergence_global/QU240/cosine_bell/config_forward.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 36
+
+
+
+
diff --git a/ocean/convergence_global/QU240/cosine_bell/config_initial_state.xml b/ocean/convergence_global/QU240/cosine_bell/config_initial_state.xml
new file mode 120000
index 0000000000..bc0bec8eb1
--- /dev/null
+++ b/ocean/convergence_global/QU240/cosine_bell/config_initial_state.xml
@@ -0,0 +1 @@
+../../config_files/config_initial_state_cosine_bell.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU60/cosine_bell/build_base_mesh.py b/ocean/convergence_global/QU60/cosine_bell/build_base_mesh.py
new file mode 100755
index 0000000000..3d4ade85b5
--- /dev/null
+++ b/ocean/convergence_global/QU60/cosine_bell/build_base_mesh.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+import numpy as np
+from mpas_tools.ocean import build_spherical_mesh
+
+
+def cellWidthVsLatLon():
+ """
+ Create cell width array for this mesh on a regular latitude-longitude grid.
+
+ Returns
+ -------
+ cellWidth : numpy.array
+ m x n array, entries are desired cell width in km
+ lat : numpy.array
+ latitude, vector of length m, with entries between -90 and 90, degrees
+ lon : numpy.array
+ longitude, vector of length n, with entries between -180 and 180,
+ degrees
+ """
+
+ ddeg = 10
+ constantCellWidth = 60
+
+ lat = np.arange(-90, 90.01, ddeg)
+ lon = np.arange(-180, 180.01, ddeg)
+
+ cellWidth = constantCellWidth * np.ones((lat.size, lon.size))
+ return cellWidth, lon, lat
+
+
+def main():
+ cellWidth, lon, lat = cellWidthVsLatLon()
+ build_spherical_mesh(cellWidth, lon, lat, out_filename='base_mesh.nc')
+
+
+if __name__ == '__main__':
+ main()
diff --git a/ocean/convergence_global/QU60/cosine_bell/config_base_mesh.xml b/ocean/convergence_global/QU60/cosine_bell/config_base_mesh.xml
new file mode 120000
index 0000000000..9177b99813
--- /dev/null
+++ b/ocean/convergence_global/QU60/cosine_bell/config_base_mesh.xml
@@ -0,0 +1 @@
+../../config_files/config_base_mesh.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU60/cosine_bell/config_driver.xml b/ocean/convergence_global/QU60/cosine_bell/config_driver.xml
new file mode 120000
index 0000000000..541fb6e756
--- /dev/null
+++ b/ocean/convergence_global/QU60/cosine_bell/config_driver.xml
@@ -0,0 +1 @@
+../../config_files/config_driver.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU60/cosine_bell/config_forward.xml b/ocean/convergence_global/QU60/cosine_bell/config_forward.xml
new file mode 100644
index 0000000000..09ba1703ec
--- /dev/null
+++ b/ocean/convergence_global/QU60/cosine_bell/config_forward.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 144
+
+
+
+
diff --git a/ocean/convergence_global/QU60/cosine_bell/config_initial_state.xml b/ocean/convergence_global/QU60/cosine_bell/config_initial_state.xml
new file mode 120000
index 0000000000..bc0bec8eb1
--- /dev/null
+++ b/ocean/convergence_global/QU60/cosine_bell/config_initial_state.xml
@@ -0,0 +1 @@
+../../config_files/config_initial_state_cosine_bell.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU90/cosine_bell/build_base_mesh.py b/ocean/convergence_global/QU90/cosine_bell/build_base_mesh.py
new file mode 100755
index 0000000000..0d80260a0a
--- /dev/null
+++ b/ocean/convergence_global/QU90/cosine_bell/build_base_mesh.py
@@ -0,0 +1,37 @@
+#!/usr/bin/env python
+import numpy as np
+from mpas_tools.ocean import build_spherical_mesh
+
+
+def cellWidthVsLatLon():
+ """
+ Create cell width array for this mesh on a regular latitude-longitude grid.
+
+ Returns
+ -------
+ cellWidth : numpy.array
+ m x n array, entries are desired cell width in km
+ lat : numpy.array
+ latitude, vector of length m, with entries between -90 and 90, degrees
+ lon : numpy.array
+ longitude, vector of length n, with entries between -180 and 180,
+ degrees
+ """
+
+ ddeg = 10
+ constantCellWidth = 90
+
+ lat = np.arange(-90, 90.01, ddeg)
+ lon = np.arange(-180, 180.01, ddeg)
+
+ cellWidth = constantCellWidth * np.ones((lat.size, lon.size))
+ return cellWidth, lon, lat
+
+
+def main():
+ cellWidth, lon, lat = cellWidthVsLatLon()
+ build_spherical_mesh(cellWidth, lon, lat, out_filename='base_mesh.nc')
+
+
+if __name__ == '__main__':
+ main()
diff --git a/ocean/convergence_global/QU90/cosine_bell/config_base_mesh.xml b/ocean/convergence_global/QU90/cosine_bell/config_base_mesh.xml
new file mode 120000
index 0000000000..9177b99813
--- /dev/null
+++ b/ocean/convergence_global/QU90/cosine_bell/config_base_mesh.xml
@@ -0,0 +1 @@
+../../config_files/config_base_mesh.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU90/cosine_bell/config_driver.xml b/ocean/convergence_global/QU90/cosine_bell/config_driver.xml
new file mode 120000
index 0000000000..541fb6e756
--- /dev/null
+++ b/ocean/convergence_global/QU90/cosine_bell/config_driver.xml
@@ -0,0 +1 @@
+../../config_files/config_driver.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/QU90/cosine_bell/config_forward.xml b/ocean/convergence_global/QU90/cosine_bell/config_forward.xml
new file mode 100644
index 0000000000..147e44c2e3
--- /dev/null
+++ b/ocean/convergence_global/QU90/cosine_bell/config_forward.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 144
+
+
+
+
diff --git a/ocean/convergence_global/QU90/cosine_bell/config_initial_state.xml b/ocean/convergence_global/QU90/cosine_bell/config_initial_state.xml
new file mode 120000
index 0000000000..bc0bec8eb1
--- /dev/null
+++ b/ocean/convergence_global/QU90/cosine_bell/config_initial_state.xml
@@ -0,0 +1 @@
+../../config_files/config_initial_state_cosine_bell.xml
\ No newline at end of file
diff --git a/ocean/convergence_global/analysis/cosine_bell/compute_rmse.py b/ocean/convergence_global/analysis/cosine_bell/compute_rmse.py
new file mode 100755
index 0000000000..bf28074954
--- /dev/null
+++ b/ocean/convergence_global/analysis/cosine_bell/compute_rmse.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python
+
+import numpy as np
+import xarray as xr
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+dpi = 200
+
+
+def rmse(resTag):
+ """
+ resTag is the resolution to compute RMSE
+ """
+
+ fid = open('../../../{}/cosine_bell/initial_state/'
+ 'namelist.ocean'.format(resTag), 'r')
+ temp = fid.readlines()
+
+ fid.close()
+ for i, line in enumerate(temp):
+ if "config_cosine_bell_lat_center" in line:
+ ii = line.find('=')+1
+ latCent = float(line[ii:])
+ if "config_cosine_bell_lon_center" in line:
+ ii = line.find('=')+1
+ lonCent = float(line[ii:])
+ if "config_cosine_bell_radius" in line:
+ ii = line.find('=')+1
+ radius = float(line[ii:])
+ if "config_cosine_bell_psi0" in line:
+ ii = line.find('=')+1
+ psi0 = float(line[ii:])
+ if "config_cosine_bell_vel_pd" in line:
+ ii = line.find('=')+1
+ pd = float(line[ii:])
+
+ init = xr.open_dataset('../../../{}/cosine_bell/initial_state/'
+ 'initial_state.nc'.format(resTag))
+ # find time since the beginning of run
+ ds = xr.open_dataset('../../../{}/cosine_bell/forward/output/'
+ 'output.0001-01-01_00.00.00.nc'.format(resTag))
+ for j in range(len(ds.xtime)):
+ tt = str(ds.xtime[j].values)
+ tt.rfind('_')
+ DY = float(tt[10:12])-1
+ if DY == pd:
+ sliceTime = j
+ break
+ HR = float(tt[13:15])
+ MN = float(tt[16:18])
+ t = 86400.0*DY+HR*3600.+MN
+ # find new location of blob center
+ # center is based on equatorial velocity
+ R = init.sphere_radius
+ distTrav = 2.0*3.14159265*R / (86400.0*pd)*t
+ # distance in radians is
+ distRad = distTrav / R
+ newLon = lonCent + distRad
+ if newLon > 2.0*np.pi:
+ newLon -= 2.0*np.pi
+
+ # construct analytic tracer
+ tracer = np.zeros_like(init.tracer1[0, :, 0].values)
+ latC = init.latCell.values
+ lonC = init.lonCell.values
+ temp = R*np.arccos(np.sin(latCent)*np.sin(latC) +
+ np.cos(latCent)*np.cos(latC)*np.cos(lonC - newLon))
+ mask = temp < radius
+ tracer[mask] = psi0 / 2.0 * (1.0 + np.cos(3.1415926*temp[mask]/radius))
+
+ # oad forward mode data
+ tracerF = ds.tracer1[sliceTime, :, 0].values
+ rmseValue = np.sqrt(np.mean((tracerF-tracer)**2))
+
+ init.close()
+ ds.close()
+ return rmseValue, init.dims['nCells']
+
+
+res = ['QU60', 'QU90', 'QU120', 'QU150', 'QU180', 'QU210', 'QU240']
+xtemp = []
+ytemp = []
+for i in range(len(res)):
+ exec('rmse'+res[i]+',nCells'+res[i]+' = rmse(res[i])')
+ exec('xtemp.append(nCells'+res[i]+')')
+ exec('ytemp.append(rmse'+res[i]+')')
+xdata = np.asarray(xtemp)
+ydata = np.asarray(ytemp)
+
+p = np.polyfit(np.log10(xdata), np.log10(ydata), 1)
+conv = abs(p[0])*2.0
+
+yfit = xdata**p[0]*10**p[1]
+
+plt.loglog(xdata, yfit, 'k')
+plt.loglog(xdata, ydata, 'or')
+plt.annotate('Order of Convergence = {}'.format(np.round(conv, 3)),
+ xycoords='axes fraction', xy=(0.3, 0.95), fontsize=14)
+plt.xlabel('Number of Grid Cells', fontsize=14)
+plt.ylabel('L2 Norm', fontsize=14)
+plt.savefig('convergence.png', bbox_inches='tight', pad_inches=0.1)
diff --git a/ocean/convergence_global/analysis/cosine_bell/config_driver.xml b/ocean/convergence_global/analysis/cosine_bell/config_driver.xml
new file mode 100644
index 0000000000..56ea06e54e
--- /dev/null
+++ b/ocean/convergence_global/analysis/cosine_bell/config_driver.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/ocean/convergence_global/analysis/cosine_bell/config_rmse.xml b/ocean/convergence_global/analysis/cosine_bell/config_rmse.xml
new file mode 100644
index 0000000000..1625beecff
--- /dev/null
+++ b/ocean/convergence_global/analysis/cosine_bell/config_rmse.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/ocean/convergence_global/config_files/config_base_mesh.xml b/ocean/convergence_global/config_files/config_base_mesh.xml
new file mode 100644
index 0000000000..a773ab4a8b
--- /dev/null
+++ b/ocean/convergence_global/config_files/config_base_mesh.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/ocean/convergence_global/config_files/config_driver.xml b/ocean/convergence_global/config_files/config_driver.xml
new file mode 100644
index 0000000000..1f923ad250
--- /dev/null
+++ b/ocean/convergence_global/config_files/config_driver.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ocean/convergence_global/config_files/config_initial_state_cosine_bell.xml b/ocean/convergence_global/config_files/config_initial_state_cosine_bell.xml
new file mode 100644
index 0000000000..b0f3043744
--- /dev/null
+++ b/ocean/convergence_global/config_files/config_initial_state_cosine_bell.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ mesh.nc
+
+
+ output
+ 0000_00:00:01
+ truncate
+ initial_state.nc
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 36
+
+
+
+
diff --git a/ocean/convergence_global/scripts/write_graph_info.py b/ocean/convergence_global/scripts/write_graph_info.py
new file mode 100755
index 0000000000..f66bacae44
--- /dev/null
+++ b/ocean/convergence_global/scripts/write_graph_info.py
@@ -0,0 +1,20 @@
+#!/usr/bin/env python
+"""
+This script writes a graph.info for base_mesh.nc from the build_mesh
+routine. This is needed for global cases that do not cull cells
+"""
+
+from __future__ import absolute_import, division, print_function, \
+ unicode_literals
+
+import xarray
+import os
+from mpas_tools.conversion import convert
+from mpas_tools.io import write_netcdf
+
+
+write_netcdf(convert(xarray.open_dataset('base_mesh.nc'),
+ graphInfoFileName='graph.info'),
+ 'base_mesh_final.nc')
+
+os.remove('base_mesh_final.nc')
diff --git a/ocean/convergence_global/templates/template_forward_cosine_bell.xml b/ocean/convergence_global/templates/template_forward_cosine_bell.xml
new file mode 100644
index 0000000000..a7c3ca0b4c
--- /dev/null
+++ b/ocean/convergence_global/templates/template_forward_cosine_bell.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ init.nc
+
+
+ init.nc
+
+
+ 0030_00:00:00
+
+
+ output
+ output/output.$Y-$M-$D_$h.$m.$s.nc
+ 0024_00:00:00
+ 01-00-00_00:00:00
+ truncate
+ 0001-01-01_00:00:00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ocean/regression_suites/cosine_bell.xml b/ocean/regression_suites/cosine_bell.xml
new file mode 100644
index 0000000000..e7727ab6d6
--- /dev/null
+++ b/ocean/regression_suites/cosine_bell.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+