<p><b>mpetersen@lanl.gov</b> 2010-05-24 12:41:08 -0600 (Mon, 24 May 2010)</p><p>Added varying vertical viscosity and diffusivity using a tanh profile to the zlevel branch. See mpas/namelist.input.ocean for example namelist.<br>
</p><hr noshade><pre><font color="gray">Modified: branches/ocean_projects/z_level_mrp/mpas/namelist.input.ocean
===================================================================
--- branches/ocean_projects/z_level_mrp/mpas/namelist.input.ocean        2010-05-24 16:03:23 UTC (rev 302)
+++ branches/ocean_projects/z_level_mrp/mpas/namelist.input.ocean        2010-05-24 18:41:08 UTC (rev 303)
@@ -1,21 +1,45 @@
&sw_model
config_test_case = 0
config_time_integration = 'RK4'
- config_dt = 120.0
- config_ntimesteps = 30
- config_output_interval = 30
- config_stats_interval = 10
- config_visc = 100.0
+ config_dt = 60.0
+ config_ntimesteps = 1440000
+ config_output_interval = 14400
+ config_stats_interval = 1440
+ config_visc = 1.0e5
/
&io
- config_input_name = 'grid.quad.20km.nc'
- config_output_name = 'output.quad.20km.nc'
- config_restart_name = 'restart.nc'
+ config_input_name = grid.nc
+ config_output_name = output.nc
+ config_restart_name = restart.nc
/
&restart
- config_restart_interval = 3000
+ config_restart_interval = 115200
config_do_restart = .false.
config_restart_time = 1036800.0
/
+
+&grid
+ config_vert_grid_type = 'zlevel'
+ config_rho0 = 1028
+/
+&hmix
+ config_hor_diffusion = 1.0e4
+/
+&vmix
+ config_vert_visc_type = 'tanh'
+ config_vert_diff_type = 'tanh'
+ config_vmixTanhViscMax = 2.5e-1
+ config_vmixTanhViscMin = 1.0e-4
+ config_vmixTanhDiffMax = 2.5e-2
+ config_vmixTanhDiffMin = 1.0e-5
+ config_vmixTanhZMid = -100
+ config_vmixTanhZWidth = 100
+ config_vert_viscosity = 2.5e-4
+ config_vert_diffusion = 2.5e-5
+/
+&advection
+ config_hor_tracer_adv = 'upwind'
+ config_vert_tracer_adv = 'upwind'
+/
Modified: branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/Registry
===================================================================
--- branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/Registry        2010-05-24 16:03:23 UTC (rev 302)
+++ branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/Registry        2010-05-24 18:41:08 UTC (rev 303)
@@ -17,8 +17,16 @@
namelist character grid config_vert_grid_type isopycnal
namelist real grid config_rho0 1028
namelist real hmix config_hor_diffusion 2000.0
+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 advection config_hor_tracer_adv 'centered'
namelist character advection config_vert_tracer_adv 'centered'
Modified: branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_time_integration.F
===================================================================
--- branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_time_integration.F        2010-05-24 16:03:23 UTC (rev 302)
+++ branches/ocean_projects/z_level_mrp/mpas/src/core_ocean/module_time_integration.F        2010-05-24 18:41:08 UTC (rev 303)
@@ -266,19 +266,18 @@
weightsOnEdge, kiteAreasOnVertex, h_edge, h, u, v, wTop, &
tend_h, tend_u, circulation, vorticity, ke, pv_edge, &
divergence, MontPot, pZLevel, zMidEdge, zTopEdge
+ type (dm_info) :: dminfo
integer, dimension(:), pointer :: nEdgesOnCell, nEdgesOnEdge
integer, dimension(:,:), pointer :: &
cellsOnEdge, cellsOnVertex, verticesOnEdge, edgesOnCell, &
edgesOnEdge, edgesOnVertex
- real (kind=RKIND) :: u_diffusion, visc
- real (kind=RKIND), dimension(:), allocatable:: fluxVertTop,w_dudzTopEdge
+ real (kind=RKIND) :: u_diffusion
+ real (kind=RKIND), dimension(:), allocatable:: fluxVertTop,w_dudzTopEdge, vertVisc
real (kind=RKIND), dimension(:,:), pointer :: u_src
real (kind=RKIND), parameter :: rho_ref = 1000.0
- visc = config_visc
-
h => s % h % array
u => s % u % array
v => s % v % array
@@ -443,7 +442,7 @@
u_diffusion = ( divergence(k,cell2) - divergence(k,cell1) ) / dcEdge(iEdge) &
-(vorticity(k,vertex2) - vorticity(k,vertex1) ) / dvEdge(iEdge)
- u_diffusion = visc * u_diffusion
+ u_diffusion = config_visc * u_diffusion
q = 0.0
do j = 1,nEdgesOnEdge(iEdge)
@@ -477,12 +476,33 @@
!
! velocity tendency: vertical mixing d/dz( nu_v du/dz))
!
+ allocate(vertVisc(nVertLevels))
+ if (config_vert_visc_type.eq.'const') then
+ vertVisc = config_vert_viscosity
+ elseif (config_vert_visc_type.eq.'tanh') then
+ if (config_vert_grid_type.ne.'zlevel') then
+ write(0,*) 'Abort: config_vert_visc_type.eq.tanh may only', &
+ ' use config_vert_grid_type of zlevel at this time'
+ call dmpar_abort(dminfo)
+ endif
+
+ do k=1,nVertLevels
+ vertVisc(k) = -(config_vmixTanhViscMax-config_vmixTanhViscMin)/2.0 &
+ *tanh(-(zMidZLevel(k)-config_vmixTanhZMid) &
+ /config_vmixTanhZWidth) &
+ + (config_vmixTanhViscMax+config_vmixTanhViscMin)/2
+ enddo
+ else
+ write(0,*) 'Abort: unrecognized config_vert_visc_type'
+ call dmpar_abort(dminfo)
+ endif
+
allocate(fluxVertTop(1:nVertLevels+1))
fluxVertTop(1) = 0.0
fluxVertTop(nVertLevels+1) = 0.0
do iEdge=1,grid % nEdgesSolve
do k=2,nVertLevels
- fluxVertTop(k) = config_vert_viscosity &
+ fluxVertTop(k) = vertVisc(k) &
* ( u(k-1,iEdge) - u(k,iEdge) ) &
/ (zMidEdge(k-1,iEdge) - zMidEdge(k,iEdge))
enddo
@@ -492,7 +512,7 @@
/(zTopEdge(k,iEdge) - zTopEdge(k+1,iEdge))
enddo
end do
- deallocate(fluxVertTop)
+ deallocate(fluxVertTop, vertVisc)
! do k=1,nVertLevels
! print '(i5,10es10.2)', &
@@ -534,11 +554,17 @@
u,h,wTop, h_edge, zMid, zTop
real (kind=RKIND), dimension(:,:,:), pointer :: &
tracers, tend_tr
+ type (dm_info) :: dminfo
+
integer, dimension(:), pointer :: nEdgesOnCell, nEdgesOnEdge
integer, dimension(:,:), pointer :: cellsOnEdge
+ real (kind=RKIND), dimension(:), pointer :: &
+ zMidZLevel
real (kind=RKIND), dimension(:,:), allocatable:: fluxVertTop, tracerTop
real (kind=RKIND), dimension(:,:,:), allocatable::tr_flux, tr_div
+ real (kind=RKIND), dimension(:), allocatable:: vertDiff
+
u => s % u % array
h => s % h % array
wTop => s % wTop % array
@@ -556,6 +582,7 @@
nEdges = grid % nEdges
nCells = grid % nCells
nVertLevels = grid % nVertLevels
+ zMidZLevel => grid % zMidZLevel % array
!
! tracer tendency: horizontal advection term -div( h \phi u)
@@ -711,13 +738,34 @@
!
! tracer tendency: vertical mixing d/dz( \kappa_v d\phi/dz))
!
+ allocate(vertDiff(nVertLevels))
+ if (config_vert_diff_type.eq.'const') then
+ vertDiff = config_vert_diffusion
+ elseif (config_vert_diff_type.eq.'tanh') then
+ if (config_vert_grid_type.ne.'zlevel') then
+ write(0,*) 'Abort: config_vert_diff_type.eq.tanh may only', &
+ ' use config_vert_grid_type of zlevel at this time'
+ call dmpar_abort(dminfo)
+ endif
+
+ do k=1,nVertLevels
+ vertDiff(k) = -(config_vmixTanhDiffMax-config_vmixTanhDiffMin)/2.0 &
+ *tanh(-(zMidZLevel(k)-config_vmixTanhZMid) &
+ /config_vmixTanhZWidth) &
+ + (config_vmixTanhDiffMax+config_vmixTanhDiffMin)/2
+ enddo
+ else
+ write(0,*) 'Abort: unrecognized config_vert_diff_type'
+ call dmpar_abort(dminfo)
+ endif
+
allocate(fluxVertTop(num_tracers,nVertLevels+1))
fluxVertTop(:,1) = 0.0
fluxVertTop(:,nVertLevels+1) = 0.0
do iCell=1,grid % nCellsSolve
do k=2,nVertLevels
do iTracer=1,num_tracers
- fluxVertTop(iTracer,k) = config_vert_diffusion &
+ fluxVertTop(iTracer,k) = vertDiff(k) &
* (tracers(iTracer,k-1,iCell) - tracers(iTracer,k,iCell) )&
/ (zMid(k-1,iCell) -zMid(k,iCell))
enddo
@@ -732,7 +780,7 @@
enddo
enddo ! iCell loop
- deallocate(fluxVertTop)
+ deallocate(fluxVertTop, vertDiff)
! print some diagnostics - for debugging
</font>
</pre>